75*. A va B butun turdagi o‘zgaruvchilar qiymatini almashtirib ekranga chiqaring, ya’ni: A=3, B=4 bo‘lsa, A=4, B=3 bo‘lsin.
Yechim:
Bu kabi masala yechimini algoritmik tafakkur sari qo‘yilgan asosiy qadam deb hisoblash mumkin, chunki masalani yechishda matematik va mantiqiy bilimning o‘zi yetarli emasligi ko‘rinadi. Masalani A=3, B=4 holda ko‘raylik.
Ko‘pincha “sodda” dasturchi masala shartidagi “o‘zgaruvchilar qiymatini almashtirib” qismiga e’tibor bermay quyidagicha yechim taklif etadi:
Var A, B: integer;
Begin A:=3; B:=4;
Writeln(‘Marhamat: A= ’, B, ‘; B= ‘, A); End. Holbuki, “o‘zgaruvchilar qiymatini almashtirib” deganda kompyuter xotirasidagi qiymatini almashtirish ko‘zda tutilgan bo‘ladi, yuqoridagi kabi chiqarish protsedurasidagi “aldov” emas.
O‘ylab qaralsa masala yechimi baribir soddadek ko‘rinadi:
Var A, B: integer;
Begin A:=3; B:=4;
A:=B; B:=A; Writeln(‘Marhamat: A= ’, A, ‘; B= ‘, B); End.
|
tamom-vassalom. Dastur ishlatib ko‘rilganda quyidagicha natija beradi:
Marhamat: A= 4; B= 4
Natija xatoku, 3 qayerga ketdi?! Xatolikni aniqlash uchun dasturni tahlil qilamiz:
A:=3; B:=4; bu o‘zlashtirish operatorlari bajarilgach xotirada A o‘zgaruvchi uchun ajratilgan joyga 3, B o‘zgaruvchi uchun ajratilgan joyga 4 yoziladi. A:=B; o‘zlashtirish operatori bajarilgach A o‘zgaruvchi uchun ajratilgan xotiradagi joy tozalanib B o‘zgaruvchining qiymati 4 yoziladi. Demak, xotirada A=4 va B=4 hosil bo‘ladi, ya’ni 3 qiymat xech qayerda yo‘q, o‘chib ketdi. B:=A; o‘zlashtirish operatori bajarilgach B o‘zgaruvchi uchun ajratilgan xotiradagi joy tozalanib A o‘zgaruvchining qiymati 4 yoziladi. Demak, dastur xato tuzilgan!
Masalani hayotiy bir masalaga qiyoslaylik: ikkita bola (3 va 4) ikkita (A va B) stulda o‘tirishibdi. Bitta stulda faqat bitta bola o‘tirishi mumkin. Bolalar stullarini almashtirishlari kerak. Lekin, bir vaqtda ikkita bola o‘rnidan turishi mumkin emas. O‘ylab ko‘rib, shunday fikr bildirishingiz tabiiy: bolalardan biri (masalan, A stuldagi 3) biror bo‘sh stulga (masalan, D ga) o‘tadi, keyin “bo‘shagan” stulga (ya’ni, A ga) ikkinchi bola (endi bu B stuldagi 4 bo‘ladi) o‘tadi, oxirida “bo‘shagan” stulga (ya’ni, B ga) birinchi bola (endi bu D stuldagi 3) o‘tadi.
Demak, masalaga mos dasturda qo‘shimcha D o‘zgaruvchi kiritish kerak ekan.
|
Dasturi:
Var
A, B, D: integer;
Begin
Write(‘A ni qiymatini kiriting: ’); ReadLn(A); Write(‘B ni qiymatini kiriting: ’);
ReadLn(B);
D:=A; A:=B; B:=D; Writeln(‘Marhamat: A= ’, A, ‘; B= ‘, B); End.
|
76. A va B haqiqiy turdagi o‘zgaruvchilar qiymatini almashtirib ekranga chiqaring, ya’ni: A=3.5, B= –4.2 bo‘lsa, A= –4.2, B=3.5 bo‘lsin (yo‘llanma: avvalgi masala yechimida o‘zgaruvchilar turi Real tanlanadi).
77*. A va B satrli turdagi o‘zgaruvchilar qiymatini almashtirib ekranga chiqaring, ya’ni: A=‘403‘, B=‘34‘ bo‘lsa, A=‘34‘, B=‘403‘ bo‘lsin (yo‘llanma: avvalgi masala yechimida o‘zgaruvchilar turi String tanlanadi).
78*. Elementlari satrli va soni 4 ta bo‘lgan A va B massivlar qiymatini almashtirib ekranga chiqaring.
Yechim:
Bu masalada ham qo‘shimcha massiv turidagi o‘zgaruvchidan foydalanamiz. Massivlar qiymatlarini almashtirish uchun D:=A; A:=B; B:=D; (bu xossani eslab qoling!) ko‘rinishdagi o‘zlashtirish operatorlaridan foydalanamiz.
|
Dasturi:
Var A, B, D: array [1..4] of string;
|
Begin
Write(‘A[‘,1,’]=’); ReadLn(A[1]); Write(‘A[‘,2,’]=’); ReadLn(A[2]);
Write(‘A[‘,3,’]=’); ReadLn(A[3]); Write(‘A[‘,4,’]=’); ReadLn(A[4]);
Write(‘B[‘,1,’]=’); ReadLn(B[1]); Write(‘B[‘,2,’]=’); ReadLn(B[2]);
Write(‘B[‘,3,’]=’); ReadLn(B[3]); Write(‘B[‘,4,’]=’); ReadLn(B[4]);
D:=A; A:=B; B:=D; Writeln(‘Marhamat:’);
Write(‘A[‘,1,’]=’, A[1]); Writeln(‘ A[‘,2,’]=’, A[2]);
Write(‘A[‘,3,’]=’, A[3]); Writeln(‘ A[‘,4,’]=’, A[4]);
Write(‘B[‘,1,’]=’, B[1]); Writeln(‘ B[‘,2,’]=’, B[2]);
Write(‘B[‘,3,’]=’, B[3]); Writeln(‘ B[‘,4,’]=’, B[4]); End.
|
79*. A=21 va B=7 bo‘lsa, A va B o‘zgaruvchilar qiymatini almashtirib ekranga chiqaring.
Yechim:
Avval ko‘rilgan masaladan farqli A va B o‘zgaruvchilar qiymati aniq va butun son bo‘lgani uchun quyidagi ko‘rsatmalarni hisoblab olishimiz mumkin:
A=(21+7)–A=28–A=28–21=7 va B=(21+7)–B=28–B=28–7=21.
Demak, bu holda qo‘shimcha o‘zgaruvchisiz ham masalani hal etish mumkin ekan.
|
Dasturi: Var A, B: integer;
Begin
A:=21; B:=7; Writeln(‘Berilgan: A= ’, A, ‘; B= ‘, B);
A:=28–A; B:=28–B; Writeln(‘Marhamat: A= ’, A, ‘; B= ‘, B); End.
|
80*. Qo‘shimcha o‘zgaruvchidan foydalanmay A va B butun turdagi o‘zgaruvchilar qiymatini almashtirib ekranga chiqaring.
Yechim:
1-usul. Avvalgi masalada A+B qiymatni hosil qilinishi yechimga olib kelgan edi. Lekin bu masalada A+B avvaldan ma’lum emas. Shunga qaramay quyidagicha ish bajaramiz. Deylik, A=3, B=4 bo‘lsin. Agar A=A+B=3+4=7 deb olsak, u holda B=A–B=7–4=3 va A=A–B=7–3=4 qiymatlar hosil bo‘ladi.
O‘zgaruvchilarga qiymat berayotgan bu ko‘rsatmalarni tahlil etaylik:
A=A+B ko‘rsatma A o‘zgaruvchida A va B ning qiymatlarini saqlab turibdi;
B=A–B ko‘rsatma A da saqlab turilgan B ni qiymatini ayirib B da A ni qiymatini qoldirdi;
A=A–B ko‘rsatma A o‘zgaruvchida saqlab turilgan “yangi” B ni, ya’ni “eski” A ni, qiymatini ayirib A da B ni “eski” qiymatini qoldirdi.
Ko‘rsatmalarni yozish ketma-ketligining buzilishi xato natijaga olib keladi.
Masalan, A=A+B (=3+4=7); A=A–B (=7–4=3); B=A–B (=3–4=–1).
|
Dasturi (1-usul):
|
Var A, B: integer;
Begin
Write(‘A ni qiymatini kiriting: ’); ReadLn(A);
Write(‘B ni qiymatini kiriting: ’); ReadLn(B);
A:=A+B; B:=A–B; A:=A–B; Writeln(‘Marhamat: A= ’, A, ‘; B= ‘, B); End.
|
2-usul. Deylik, A=3, B=4 bo‘lsin. Endi A=A∙B=3∙4=12 deb olsak, u holda B=A/B=12/4=3 va A=A/B=12/3=4 qiymatlar hosil bo‘ladi. Faqatgina Paskalda bo‘lish amali natijasi haqiqiy turdagi sonni hosil qilishini nazarda tutib B=trunc(A/B) va A=trunc(A/B) kabi yozish shart.
|
Dasturi (2-usul):
Var A, B: integer;
Begin
Write(‘A ni qiymatini kiriting: ’); ReadLn(A);
Write(‘B ni qiymatini kiriting: ’); ReadLn(B);
A:=A*B; B:=TRUNC(A/B); A:=TRUNC(A/B);
Writeln(‘Marhamat: A= ’, A, ‘; B= ‘, B); End.
|
3-usul. Deylik, A=32767, B=10 bo‘lsin. Bu qiymatlarda 1- va 2-usullar xato natijaga olib keladi, chunki A+B=32777>32767 va A∙B=327670>32767, ya’ni oraliq qiymatlar Integer turdagi miqdor chegarasidan chiqib ketdi. Shuning uchun mantiqiy XOR amalidan foydalanish haqida o‘ylab ko‘rsa arziydi. Mantiqiy XOR amali butun turdagi ixtiyoriy sonlarda o‘rinli.
|
Dasturi (3-usul):
Var A, B: integer;
Begin
Write(‘A ni qiymatini kiriting: ’); ReadLn(A);
Write(‘B ni qiymatini kiriting: ’); ReadLn(B);
A:=A XOR B; B:=A XOR B; A:=A XOR B; Writeln(‘Marhamat: A= ’, A, ‘; B= ‘, B); End.
|
81. Qo‘shimcha o‘zgaruvchidan foydalanmay A va B haqiqiy turdagi o‘zgaruvchilar qiymatini almashtirib ekranga chiqaring (yo‘llanma: avvalgi masala yechimlaridan 1-usulda o‘zgaruvchilar turini Real, chiqarish formatini A:0:11 va B:0:11 kabi tanlanadi).
82*. Qo‘shimcha o‘zgaruvchidan foydalanmay A va B satrli turdagi o‘zgaruvchilar qiymatini almashtirib ekranga chiqaring.
Yechim:
Satrli miqdorlar uchun A+B ifoda ma’noga ega. Deylik, A=‘oyi‘, B=‘dada‘ bo‘lsin. Agar A=A+B=‘oyi‘+‘dada‘=‘oyidada‘ deb olsak, u holda Copy funksiyasi yordamida B=Copy(A,1,Length(A)–Length(B))=
=Copy(‘oyidada‘,1,7–4)=Copy(‘oyidada‘,1,3)=‘oyi‘
va Delete protsedurasi yordamida
|
Delete(A,1,Length(B))=Delete(‘oyidada‘,1,3)=‘dada‘
qiymatlar hosil bo‘ladi. O‘zgaruvchilarga qiymatini o‘zgartirayotgan bu ko‘rsatmalarni tahlil etaylik:
A=A+B ko‘rsatma A o‘zgaruvchida A va B ning qiymatlarini saqlab turibdi;
B=Copy(A,1,Length(A)–Length(B)) ko‘rsatma A da saqlab turilgan A ni qiymatini nusxasini B ga o‘tkazdi;
Delete(A,1,Length(B)) ko‘rsatma A o‘zgaruvchida saqlab turilgan “yangi” B ni, ya’ni “eski” A ni, qiymatini o‘chirib A ga B ni “eski” qiymatini qoldirdi.
|
Do'stlaringiz bilan baham: |