270 likes | 635 Views
Базови управляващи структури. Верига Веригата е линейна последователност от действия. Описва се чрез съставен оператор (блок) . Съставният оператор представлява група оператори, които се изпълняват последователно и се разглеждат като един оператор . { оператор1; оператор2; …
E N D
Базови управляващи структури Верига • Веригата е линейна последователност от действия. Описва се чрез съставен оператор (блок). Съставният оператор представлява група оператори, които се изпълняват последователно и се разглеждат като един оператор. { оператор1; оператор2; … операторn; }
Разклонение • Разклонение (алтернатива) е управляваща структура, при която изчислителният процес се разклонява, в зависимост от стойността на определено условие израз. • Оператор if(с една алтернатива) if(израз) оператор;
Оператор if-else(с две алтернативи) if (израз) оператор1 else оператор2 • Оператор if-else-if (вложен оператор if) • Нивата на влагане са с неограничен брой. • Защо се предпочита пред програма с последователниif оператори?
if (израз1) оператор1 else if (израз2) оператор2 elseif (израз3) оператор3 else оператор4 • Изпълнява се един от много оператори. • Изразите се изчисляват последователно. • Ако даден израз има стойност 0, съответният оператор се изпълнява и операторът завършва. • Ако нито един израз не е 0, изпълнява се последният оператор след else.
Оператор switch-case(многозначно разклонение) switch (израз) { caseконстанта1: оператор1 break; caseконстанта2: оператор2 break; . . . caseконстантаn: break; default: операторn+1 break; }
Първо се изчислява изразът. Ако неговата стойност съвпадне с някоя константаi, съответният операторi се изпълнява, докато се срещне оператор break. • Ако стойността на израза не съвпада с нито една константа, изпълнява се вариантът default. • Константите са от целочислен или символен тип и са уникални. • Ако не се използва break след дадена константа, преминава се към следващия фрагмент, докато се срещне оператор breakили се достигне края на оператора switch.
ЦИКЪЛ • Цикълът е последователност от инструкции, която се повтаря многократно. Оператор за цикъл с пост - условие do-while do оператор while (израз); • Приложение на оператора за цикъл • Проверка при въвеждане на данни • Програма тип меню
Оператор за цикъл с предусловие while while (израз) оператор; Пример: Програмата въвежда поток (последователност) от цели числа. Въвеждането се преустановява чрез въвеждане на ограничителното число -999. Изчислява се сумата на въведените числа (ограничителното число не участва в сумата).
Алгоритъм: • Нулиране на сумата. • Извеждане на съобщение за действие. • Докато въвежданото число е различно от 999 повтаряй: • Натрупване на числото към сумата. • Печат на сумата. #include <stdio.h> int main() { int number, s; s=0; printf("Въведи последователност от цели числа (-999 за край): "); while(scanf("%d", &number), number != -999) s += number; printf("Сума = %d\n", s); return 0; }
Оператор за цикъл for модификация for(изразинициализация ; израз ; израз модификация) оператор;
Първо се извършва инициализация • На второ място се изчислява изразът (най-често за отношение), който определя условието за край на цикъла. • Ако стойността му е 0 (истина), се изпълнява операторът и след това – модификацията. • Изчислява се изразът. • Когато стойността на израза стане =0 (лъжа), изпълнението на цикъла се преустановява. • Пример: Да се състави програма, която намира сумата на n реални числа, където 1n10. Алгоритъм: • Нулиране на сумата. • Въвеждане на цяло число n в диапазона [1, 10]. • За начална стойност на брояча = 1 до крайна стойност nи всеки път увеличаване с 1 повтаряй: • Въвеждане на реално число. • Натрупване на числото към сумата. • Печат на сумата.
#include <stdio.h> int main() { int n, i; float number, s; do { printf("Въведете n в интервала [1, 10]: "); scanf("%d", &n); } while(n<1 || n>10); printf("Въведете %d реални числа:\n", n); for(s=0.0, i=1; i<=n && scanf("%f", &number) == 1; i++) s += number; printf("Сума = %.3f\n", s); return 0; } • При описанието на оператор forинициализация, израз или модификация могат да се пропуснат, но тогава се заменят с ;. Например: for(;;)
Операторът breakпрекъсва изпълнението на цикъла и предизвиква принудително излизане от цикъл. • Пример: Програмата намира сумата на поток от цели числа като ограничителното число е 999. #include <stdio.h> int main() { int number, s; s=0; printf("Въведи последователност от цели числа (999 за край): "); for(;;) { scanf("%d", &number); if(number == 999) //Числото 999 прекъсва //изпълнението на цикъла break; s += number; } printf("Сума = %d\n", s); return 0; }
Операторът continueпрекъсва изпълнението на текущата итерация на цикъла, като запазва стойностите на променливите. • За цикли whileи do-while се преминава към проверка на условието за край (израз), а за for- към изчисление на модификацията. инициализация while(израз1) { оператор1; if(израз2) continue; оператор2; } for(инициализация; израз1; модификация) { оператор1; if(израз2) continue; оператор2; }
Пример: да се състави програма, която въвежда n символа (n<=10)и преобразува малките букви в главни. #include <stdio.h> int main() { inti,n; char c; do { printf("Въведете n в интервала [1, 10]: "); scanf("%d", &n); } while(n<1 || n>10); printf("Въведете %d символа:\n", n); for(i=1; i<=n; i++) { c = getche(); if(c < ‘a’ || c > ‘z’) /* Символ различен от малка буква прекъсва итерацията */ continue; c -= 32; printf("Главна буква = %с\n", с); } return 0; }
ПРИМЕРИ 1. Изрази #include<stdio.h>Резултат void main()-1 0 1 { int x=1,y=1,z=0; x*= y/2 + z; y*= ++z * x--; printf("%2d%2d%2d\n",x,y,z); } #include<stdio.h>Резултат void main()-1 1 1 { int x=1,y=1,z=0; x = y/2 + z; y = ++z && x-- || y; printf("%2d%2d%2d\n",x,y,z); }
ПРИМЕРИ 1. Изрази #include<stdio.h> Резултат void main() 2 1 1 { int x=1,y=1,z=0; x = y%2 + z; y = ++z && ++x || --y; printf("%2d%2d%2d\n",x,y,z); } #include <stdio.h> Резултат void main()r=1 x=0 y=1 z=-3 { int x=0,y=1,z=-1,r; r = x++ || ++y && --z; x* = y--/--z; printf("r=%d x=%d y=%d " "z=%d\n",r,x,y,z); }
ПРИМЕРИ • Оператор if • Последователни оператори if #include <stdio.h> #define A 180 #define B 250 #define C 600 void main() { double s,d; printf("s="); scanf("%lf",&s); if(s<=A) d=0; if(s>A && s<=B) d=(s-A)*10/100; if(s>B && s<=C) d=(B-A)*10/100 + (s-B)*20/100; if(s>C) d=(B-A)*10/100 + (C-B)*20/100 - (s-C)*30/100; printf("s=%.2lf lv -> d=%.2lf lv\n",s,d); }
ПРИМЕРИ • Оператор if • Вложен оператор if #include <stdio.h> #define A 180 #define B 250 #define C 600 void main() { double s,d; printf("s="); scanf("%lf",&s); if(s<=A) d=0; else if(s<=B) d=(s-A)*10/100; else if(s<=C) d=(B-A)*10/100 + (s-B)*20/100; else d=(B-A)*10/100 + (C-B)*20/100 - (s-C)*30/100; printf("s=%.2lf lv -> d=%.2lf lv\n",s,d); }
ПРИМЕРИ • Оператор за цикъл do • Коректно въвеждане на входни данни • Въвеждане на цяло число в интервал [1,10] #include <stdio.h> void main() { int nbr, r; do { printf("nbr="); r=scanf("%d",&nbr); } while( r!=1 || nbr<1 || nbr >10 ); printf("nbr=%d\n",nbr); }
ПРИМЕРИ • Оператор за цикъл do • Програма тип меню #include <stdio.h> 1/2 #include <conio.h> void main() { int izbor,a=5,b=10; do { clrscr(); printf("1. Action1\n"); printf("2. Action2\n"); printf("3. Action3\n"); printf("4. Action4\n"); printf("5. END\n"); printf("izbor="); scanf("%d",&izbor);
ПРИМЕРИ • Оператор за цикъл do • Програма тип меню switch(izbor) 2/2 { case 1:printf("a+b=%d\n)",a+b);break; case 2:printf("a-b=%d\n)",a-b);break; case 3:printf("a*b=%d\n)",a*b);break; case 4:printf("a/b=%d\n)",a/b);break; case 5:break; } printf("Press any key\n"); getch(); } while(izbor!=5); }
ПРИМЕРИ • Оператор за цикъл while • Известен брой на повторение на цикъла (определен) #include <stdio.h> void main() { double r,r_ser,r_par; int n,i; i=0; r_ser=0; r_par=0; printf(“broi n:"); scanf("%d",&n); while(i++<n) { printf(“r %d:",i); scanf("%lf",&r); r_ser+= r; r_par+= 1/r; } printf("r_ser = %.4lf, r_par = %.4lf\n",r_ser,1/r_par); }
ПРИМЕРИ • Оператор за цикъл while • Неизвестен брой на повторение на цикъла (неопределен): край с EOF #include <stdio.h> void main() { double r,r_ser,r_par; int i; i=1; r_ser=0; r_par=0; printf(“vavedi r ili CTRL+Z za krai:"); while(printf("\nE. r%d:",i++),scanf("%lf",&r) != EOF) { r_ser+= r; r_par+= 1/r; } printf("\nr_ser = %.4lf, r_par = %.4lf\n",r_ser,1/r_par); }
ПРИМЕРИ • Оператор за цикъл for #include <stdio.h> void main() { double r,r_ser,r_par; int n,i; r_ser=0; r_par=0; printf(“broi n:"); scanf("%d",&n); for(i=1;i<=n;i++) { printf(“r %d:",i); scanf("%lf",&r); r_ser+= r; r_par+= 1/r; } printf("r_ser = %.4lf, r_par = %.4lf\n",r_ser,1/r_par); }