3.99M
Category: programmingprogramming

Вкладені цикли. Покрокове введення та виведення даних. Лекція №8

1.

Вкладені цикли.
Покрокове введення та
виведення даних
Лекція №8

2.

Вкладені цикли
Оскільки “тіло” циклу може містити будьякий оператор, будь-яку послідовність дій, то
у якості такого оператору може бути
використаний оператор циклу.
Таким чином можна конструювати цикли в
циклах або ж вкладені цикли.

3.

Цикл, який міститься у тілі іншого циклу,
називається вкладеним циклом.
Вкладений цикл щодо циклу, в тіло якого
він вкладений, називається внутрішнім
циклом.
Цикл, в тілі якого існує вкладений цикл,
називається зовнішнім щодо вкладеного.
Усередині вкладеного циклу може бути
наступний вкладений цикл, утворюючи
наступний рівень вкладеності і так далі.
Кількість рівнів вкладеності, як правило, не
обмежується.

4.

Приклад 1.1. Сформулювати умову!
int i,j,n,m;
printf("zadajte n, m: ");
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
printf("%d %d\n",i,j);
Результат: ?????? Для n=2, m=2:
11
12
21
22
Чому у вкладених циклах
параметри-змінні різні: і та j?

5.

Як змінити програму, щоб виведення було у
форматі:
1: 1 2
2: 1 2 ?????
Приклад 1.2.
int i,j,n,m;
рrintf ("zadajte n, m: ");
scanf ("%d%d",&n,&m);
Чому для зовнішнього циклу
for (i=1;i<=n;i++)
використані фігурні дужки {}?
{
printf ("%d:˽",i);
for (j=1;j<=m;j++) printf("%d˽",j);
printf("\n");
}

6.

Приклад 2.1. “Таблиця множення n*m”.
int i,j,n,m;
printf("zadajte n, m:˽");
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++) printf("%d˽",i*j);
123
printf("\n");
246
369
}
4 8 12
5 10 15
Результат для n=5, m=3????

7.

Приклад 2.2. “Таблиця множення n*m”
int i,j,n,m;
printf("zadajte n, m:˽");
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
printf("%d\t",i*j);
printf("\n");
}
Результат для n=5, m=3????
1
2
3
4
5
2
4
6
8
10
3
6
9
12
15

8.

n
m
Приклад 3. Обчислити значення виразу (i j).
i 1 j 1
[(1+1)+(1+2)+(1+3)+…(1+m)]+[(2+1)+(2+2)+…(2+m)]+…+[(n+1)+(n+2)+…(n+m)]
int i,j,n,m,sum=0;
printf("zadajte n, m:˽");
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++) sum+=i+j;
printf("%d“,sum);
Результат для n=2, m=2 ????

9.

n
m
(i j ).
Приклад 4. Обчислити значення виразу
i 1 j 1
[(1+1)*(1+2)*(1+3)*…*(1+m)]+[(2+1)*(2+2)*…*(2+m)]+…+[(n+1)*…*(n+m)]
int i,j,n,m,sum=0,mult;
printf("zadajte n, m:˽");
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
mult=1;
// чому ініціалізація добутку тут?
for (j=1;j<=m;j++) mult*=i+j;
sum+=mult;
}
printf("%d“,sum);

10.

Приклад 5. Дано натуральне число n.
Визначити, чи можна представити це число у
вигляді n = x2 + y2 + z2, де x, y, z - натуральні числа.
flag=0;
for (x=1; x<=sqrt(n); x++)
for (y=1; y<=sqrt(n)-x*x; y++)
for (z=1; z<=sqrt(n)-x*x-y*y; z++)
if (n==x*x+y*y+z*z)
{
printf(“%d˽%d˽%d”,x,y,z);
flag=1;
Яке призначення змінної flag?
}
Чи потрібно умову flag==1
if (flag==0) printf(“No”);
перевіряти у циклах?

11.

Покрокове введення та
виведення даних
Існує цілий клас задач, які обробляють
деяку послідовність уведених значень. Однак
при цьому немає необхідності одночасно
зберігати у пам’яті комп’ютера усі ці
значення.
Такі алгоритми відносять до алгоритмів
покрокового введення вхідних даних.

12.

Приклад 6. Дано натуральне число n і дійсні числа a1,a2,…,an.
Обчислити значення sin(a1 + a2 + … + an) cos (a1 a2 …an).
#include <stdio.h>
#include <stdlib. h>
#include <math.h>
int main(int argc, char *argv[])
{
int n,i; float a,sum=0,mult=1;
printf(“n=”); scanf(“%d”,&n);
for (i=1; i<=n;i++)
{
scanf(“%f”,&a);
sum+=a; mult*=a;
}
printf(“%.3f\n”,sin(sum)*cos(mult));
system("PAUSE");
return 0;
}

13.

Приклад 7. Дано натуральне число n і дійсні числа a1,a2,…,an. Обчислити
max(a1, (a1+a2), (a1+a2+a3), …, (a1+a2+…+an)).
#include <stdio.h>
#include <stdlib. h>
int main(int argc, char *argv[])
{
int n,i; float a,sum,max;
printf(“n=”); scanf(“%d”,&n);
printf(“a=”); scanf(“%f”,&max); // чому max???
sum=max;
for (i=1; i<n;i++)
{
printf(“a=”); scanf(“%f”,&a);
sum+=a;
if (max<sum) max=sum;
}
printf(“%.3f\n”,max);
system("PAUSE");
return 0;
}

14.

Приклад 8. Дано натуральне число n і дійсні числа a1,a2,…,an. Обчислити
max(a1,a2,…,an)+min(a1,a2,…,an).
#include <stdio.h>
#include <stdlib. h>
int main(int argc, char *argv[])
{
int n,i; float a,max, min;
printf(“n=”); scanf(“%d”,&n);
printf(“a=”); scanf(“%f”,&max);
min=max;
for (i=1; i<n;i++)
{
printf(“a=”); scanf(“%f”,&a);
if (max<a) max=a;
if (min>a) min=a;
}
printf(“%.3f \n”,max+min);
system("PAUSE");
return 0;
}

15.

Якщо за умовою задачі є необхідність
отримувати
результати
на
кожному
поточному кроці виконання циклу, то такі
задачі відносять до задач покрокового
виведення даних.

16.

Приклад 9. Дано натуральне число n. Отримати послідовність
значень bi при i=1,2,…,n, якщо відомо, що bi 1
int main(int argc, char *argv[])
{
int n,i; float b;
printf(“n=”); scanf(“%d”,&n);
b=0;
for (i=1; i<=n; i++)
{
b+=(float)1/i;
printf(“%.3f˽”,b);
}
system("PAUSE");
return 0;
}
1
2
1
1
... .
3
i

17.

Приклад 10. Дано натуральне число n і дійсні числа a1,a2,…,an.
Обчислити a1, a1+a2, …, a1+a2+…+an.
#include <stdio.h>
#include <stdlib. h>
int main(int argc, char *argv[])
{
int n,i; float a,sum=0;
printf(“n=”); scanf(“%d”,&n);
for (i=1; i<=n; i++)
{
scanf(“%f”,&a);
sum+=a;
printf(“%.3f˽”,sum);
}
printf(“\n”);
system("PAUSE");
return 0;
}

18.

Приклад 11. Дано натуральне число n і дійсні числа a1,a2,…,an.
Обчислити a1, a1*a2, …, a1 * a2*…*an.
#include <stdio.h>
#include <stdlib. h>
int main(int argc, char *argv[])
{
int n,i; float a,mult=1;
printf(“n=”); scanf(“%d”,&n);
for (i=1; i<=n;i++)
{
scanf(“%f”,&a);
mult*=a;
printf(“%.3f˽”,mult);
}
printf(“\n”);
system("PAUSE");
return 0;
}

19.

Подекуди
при
складанні
циклічних
алгоритмів зручно використовувати так звані
„перемикачі”.
1. k = k.
При початковому значенні k=1
отримуватимемо послідовність –1, 1, 1, 1, …
При початковому значенні k = 1 ця
послідовність матиме вигляд 1, 1, 1, 1, …

20.

Приклад 12. Дано натуральне число n. Отримати послідовність
значень bi при i=1,2,…,n, якщо відомо, що bi = i (1 2 + 3 … + ( 1)i+1i).
#include <stdio.h>
#include <stdlib. h>
int main(int argc, char *argv[])
{
int n,i,b,k=1,sum=0;
printf(“n=”); scanf(“%d”,&n);
for (i=1; i<=n;i++)
{
sum+=k*i;
k=-k;
b=i*sum;
// printf(“%d\n”, i*sum);
printf(“%d\n”,b);
}
system("PAUSE");
return 0;
}

21.

2. k = 1 k.
При початковому значенні k=1
отримуватимемо послідовність 0, 1, 0, 1, …
При початковому значенні k = 0 ця
послідовність матиме вигляд 1, 0, 1, 0, …

22.

Приклад 13. Дано натуральне число n. Отримати послідовність
значень bi при i=1,2,…,n, якщо відомо, що bi =5 (1 + 3 + … + (2i 1)).
#include <stdio.h>
#include <stdlib. h>
int main(int argc, char *argv[])
Альтернативний варіант:
{
for (i=1; i<=2*n-1;i+=2)
{
int n,i,b,k=1,sum=0;
sum+=i;
printf(“n=”); scanf(“%d”,&n);
printf(“%d\n”, 5*sum);
for (i=1; i<=2*n; i++)
}
{
sum+=k*i;
k=1-k;
b=5*sum;
// printf(“%d\n”, 5*sum);
printf(“%d\n”,b);
}
system("PAUSE");
return 0;
}

23.

Рекурентні послідовності
У математиці серед “золотих” чисел почесне місце
посіли числа Фібоначчі (Леонардо Пізанський, XIIIст.).
Кажуть, що свого часу відомий вчений в послідовності цих
чисел відобразив закон розмноження кроликів. Ці числа
мають такий вигляд:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... .
Можна помітити, що починаючи з третього числа, кожне
наступне дорівнює сумі двох попередніх. Тобто,
починаючи з третього члена цієї послідовності існує така
залежність:
Fnew=Fold1+Fold2 .
Залежність нового значення елемента послідовності від
певної кількості попередніх називається рекурентною, а
програми, які використовують рекурентні формули,
називаються відповідно рекурентними.

24.

Схематичне зображення
рекурентності
1 крок
f_old1
2 крок
f_old2
f_new

25.

Приклад 14. За даними співвідношенням визначити n-ий
елемент числової послідовності (n>2):
xn = xn-1+xn-2+xn-3; x0 = x1 = 1, x2 = 6.
int n, i, x_0=1, x_1=1, x_2=6, x_new;
printf(“n=”); scanf(“%d”,&n);
if ((n==1)||(n==2)) printf(“1”);
else if (n==3) printf(“6”);
else
{
for (i=4; i<=n; i++)
{
x_new=x_0+x_1+x_2;
x_0=x_1; x_1=x_2; x_2=x_new;
}
printf(“%d˽”,x_new);
}
printf(“\n”);

26.

Приклад 15. За даними співвідношенням визначити n-ий елемент
числової послідовності (n>2):
xn=xn-1+4xn-3; x0 = x1 = x2 = 2.
int n, i, x_0, x_1, x_2, x_new;
printf(“n=”); scanf(“%d”,&n);
x_0=x_1=x_2=2;
if ((n==1)||(n==2)||(n==3)) printf(“2”);
else
{
for (i=4; i<=n;i++)
{
x_new=4*x_0+x_2;
x_0=x_1; x_1=x_2; x_2=x_new;
}
printf(“%d\n”,x_new);
}
English     Русский Rules