Головна |
Групу операторів розгалуження складають оператори if, switch. Форма оператора if має вигляд if (<вираз 1>) <оператор 1> else <оператор 2>. Зміст оператора: якщо вираз 1 істина, виконується оператор 1, інакше - оператор 2. Ключове слово else і наступний оператор 2 можуть бути відсутні. При виконанні такого оператора, якщо вираз 1 - хибність, ніякі операції не виконуються і відбувається перехід до наступного оператора програми.
Приклад. Написати програму для обчислення наступної функції у для значення будь-якого х: .
Текст програми:
#include <stdio.h>
#include<math.h>
main()
{ float x,y;
printf("Vvedit znachennja x:");
scanf("%f", &x);
if (x<0) y=pow(2,x);
else y=sinh(x)+cosh(x);
printf("\nDlja znachennja x=%f znachenna y=%f\n",x,y);
scanf("%u"); }
У ролі операторів 1 та 2 можуть виступати оператори if, і у цьому випадку кажуть про вкладені оператори. При застосуванні вкладених операторів if виникає проблема визначення відповідності слів else словам if у зв'язку з тим, що деякі оператори можуть не мати частини else. Для розв'язування цієї проблеми домовилися зв'язувати слово else з найближчим передуючим словом if, з яким ще не зв'язане інше слово else. Наприклад, наведена нижче програма друкує рядок "оператор 2".
#include <stdio.h>
main()
{
int i = 4, j = 6, k = 8;
if (i < k)
if (i > j) printf("оператор 1\n");
else printf("оператор 2\n");
}
Приклад. Написати програму для обчислення наступної функції z для значення будь-якого х:
#include <stdio.h>
#include<math.h>
main()
{ float x,y,z;
int d;
printf("Vvedit znachennja x:");
scanf("%f", &x);
y=25*sin(x);
d=(y<-1)||(y==2)||(y>=99);
if (d==1) printf("\nDlja znachennja x=%f znachenna y=%f FNV\n",x,y);
else
if (y<=0.95) z=acos(y)-0.2;
else z=sqrt(y*y+log10(y+1.8));
if (!d) printf("\nDlja znachennja x=%f znachenna y=%f znachenna z=%f\n",x,y,z);
scanf("%u");
}
Оператор множинного розгалуження має таку форму
switch (<вираз цілого типу>)
{
case <значення_1>: <послідовність операторів_1>
break;
case <значення_2> : <послідовність операторів_2>
break;
case <значення_n> : <послідовність операторів_ n>
break;
default : <послідовність операторів_ n+1>
}
Зміст оператора: якщо значення виразу цілого типу дорівнює деякому значенню i, то виконується відповідна послідовність операторів i; інакше виконується послідовність операторів n+1. Частина default може бути відсутньою, і тоді, якщо значення виразу, вказаного у дужках, не дорівнює жодному значенню i (i = 1, n), ніякі операції не виконуються, і відбувається перехід до наступного оператора програми.
Приклад. Написати програму для обчислення наступної функції z для значення будь-якого х:
#include <stdio.h>
#include<math.h>
main()
{
float x,y,z; int p;
printf("Vvedit znachennja x:");
scanf("%f", &x);
y=25*sin(x);
if (y<-1||y==2||y>=99) p=1;
else if (y<=0.95) p=2;
else p=3;
switch(p)
{
case 1: printf("\nDlja znachennja x=%f znachenna y=%f FNV\n",x,y); break; case 2: z=acos(y)-0.2;
printf("\nDlja znachennja x=%f znachenna y=%f znachenna z=%f\n",x,y,z);break; case 3: z=sqrt(y*y+log10(y+1.8));
printf("\nDlja znachennja x=%f znachenna y=%f znachenna z=%f\n",x,y,z); break;
}
scanf("%u");
}
#include <stdio.h>
main()
{
int a=32767;
printf("\nZnachennja a=%d. Znachenna a+1=%d\n",a,a+1);
scanf("%u");
}
#include <stdio.h>
main()
{ float weight, //Vaga
height; //Zrist
printf("Vvedit vashu vagu:");
scanf("%f", &weight);
printf("Vvedit Vash zrist:");
scanf("%f", &height);
printf("\n\tRiznitsa miz vashim zristom ta vashou vagou-%f\n\a",height-weight);
printf("Riznitsa miz vashim zristom ta vashou vagou-%f\n\n\a",height-weight);
int b;
b=52;
printf("\x52=%u ",b);
printf("\152=%u ",b);
scanf("%u");}
#include <stdio.h>
main()
{ float weight, //Vaga
height; //Zrist
printf("Vvedit vashu vagu:");
scanf("%f", &weight);
printf("Vvedit Vash zrist:");
scanf("%f", &height);
printf("\n\tRiznitsa miz vashim zristom ta vashou vagou-%f\n\a",height-weight);
printf("Riznitsa miz vashim zristom ta vashou vagou-%f\n\n\a",height-weight);
int b;
b=52;
printf("\x52=%u ",b);
printf("\152=%u ",b);
scanf("%u");
}
Лекція 3
Цикли
Цикл являє собою сполучення умови і групи дій, які треба виконувати, доки виконується умова. Група дій утворює тіло циклу. Якщо умова перевіряється перед можливим виконанням тіла, цикл називають циклом з передумовою. В тому разі коли умова перевіряється після виконання операторів тіла, кажуть про цикл з післяумовою.
У мові C++ визначений один цикл з післяумовою - do while. Форма запису цього циклу має такий вигляд do <оператор> while(<вираз>);. Виконання оператора повторюється доки вираз є істина. При нормальній роботі програми вихід з циклу відбувається у трьох випадках:
1) вираз прийняв значення хибність;
2) у тілі циклу (оператор може бути складовий) виконався оператор break;
3) у тілі циклу виконався оператор return.
У другому випадку відбувається перехід до оператора, прямуючого після поданого оператора циклу. У третьому випадку відбувається вихід з підпрограми, що містить поданий цикл.
Оператор do while часто застосовують для перевірки відповідей користувача на питання програми, як показано у наступному прикладі.
do {
printf("\n Відповідайте так чи ні (т/н):");
scanf("%c", &ch);
}
while (ch != 'т' && ch != 'н');
Цикл з передумовою while має форму запису: while (<вираз>)<оператор>. Оператор виконується доки вираз - істина. Умови виходу з циклу співпадають з умовами для циклу do while.
Найбільш загальною формою циклу з передумовою є цикл for. Форма запису цього циклу має вигляд
for (<вираз 1>;< вираз 2>; <вираз 3>) <оператор>
Усі вирази необов'язкові і можуть бути відсутні. Звичайно перший вираз застосовують для ініціалізації параметрів циклу, другий - для перевірки умови виходу з циклу, третій - для зміни параметрів циклу.
Логіка роботи оператора for така.
1. Якщо вираз 1 присутній, він обчислюється.
2. Якщо вираз 2 присутній він обчислюється, і при отриманні значення "хибність" відбувається вихід з циклу.
3. Виконується тіло циклу (оператор).
4. Якщо вираз 3 присутній, він обчислюється.
5. Перехід до кроку 2.
Виконання оператора continue у будь-якому місці тіла циклу призводить до переходу до кроку 4. Оператори break та return призводять до виходу з циклу, як і у інших типах циклу.
Цикл for можна завжди звести до циклу while. А саме, запис
for (< вираз 1>; <вираз 2>; <вираз 3>) <оператор>
еквівалентний за означенням запису
<вираз 1>;
while (<вираз 2>)
{ <оператор> <вираз3>;}
Цикл вигляду for (; ;) ; являє собою нескінчений цикл.
Розглянемо як приклади застосування циклів на наступних задачах
Скласти програму для обчислення наступної суми
#include <stdio.h>
main()
{
int i,n,m,d,d1,d2,d3;
float suma;
do
{
printf("Vvedit n ta m: ");
scanf("%d%d",&n,&m);
d1=m<-8&&n<-8;
d2=m>-8&&n>-8&&m<13&&n<13;
d3=m>13&&n>13;
d=(n<=m)&&d1||d2||d3;
if (d) break;
printf(" PPV ");
}
while (d==0);
printf("n=%d\n",n);
printf("m iz %d\n",m);
printf(" d iz %d\n",d);
suma=0.0;
for (i=n; i<=m; i++)
suma=suma+float(i+5)/float((i+8)*(i-13));
printf(" suma iz %6.2f\n",suma);
printf("\n suma-%f\n\a",suma);
printf("suma-%6.2f\n\n\a",suma);
scanf("%f",suma);
}
Скласти програму для обчислення суми степного ряду з точністю ε використавши наступну рекурентну формулу
#include <stdio.h>
#include <math.h>
main()
{
int n,d;
float suma,u1,u2,eps,x;
do
{
printf("Vvedit x: ");
scanf("%f",&x);
d=fabs(x)<1;
if (d) break;
printf(" PPV!\n ");
}
while (!d);
do
{
printf("Vvedit eps: ");
scanf("%f",&eps);
d=eps>0&&eps<0.5;
if (d) break;
printf(" PPV!\n ");
}
while (!d);
n=1;
u1=x*x*x;
suma=u1;
do {
u2=u1*x*x/(2*n)/(2*n-1);
suma=suma+u2;
d=n>2&&fabs(u2-u1)<eps;
if (d) break;
n=n+1;
u1=u2; }
while (!d);
printf("dlja x= %6.2f dlja eps= %0.8f n=%d suma=%12.8f\n",x,eps,n,suma);
/* printf("\n suma-%f\n\a",suma);
printf("suma-%6.2f\n\n\a",suma); */
scanf("%f",suma);
}