Similar presentations:
Лекція №9
1. Одновимірні масиви
Лекція №92.
Масивомназивається
скінчена
послідовність змінних одного типу, які
мають однакове ім’я та розрізняються
порядковими номерами.
Порядковий номер елемента масиву
називається його індексом.
Масиви поділяються на:
• статичні;
• динамічні.
3.
Стандартний вигляд оголошення статичногоодновимірного масиву:
тип <ім’я_змінної> [<розмір>];
В С статичні масиви визначаються однозначно
для того, щоб компілятор міг виділити для них
місце в пам’яті.
В одновимірному масиві повний розмір
масива у байтах обчислюється наступним чином:
<загальна кількість байтів>=
sizeof (<базовий тип>)*<кількість елементів масиву>
4.
У всіх масивах перший елемент має індекс 0.Якщо описати масив
char р [10]; ,
то буде оголошено масив символів з 10
елементів, які адресуватимуться індексами
від 0 до 9:
p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9].
5.
В С відсуній контроль меж визначенихмасивів.
Можна вийти за один кінець масиву і
записати туди значення у будь-яку змінну, що
не відноситься до описаного масиву.
Захист меж покладається на самого
програміста.
Наприклад, слід переконатися, що масив,
куди здійснюється введення інформації, має
достатню довжину для прийняття самої
довгої передбаченої наперед послідовності
елементів.
6.
Приклад1. Ввести цілочисловий масив,
елементами якого є числа від 0 до 9 і вивести їх.
#include <stdio.h>
int main()
{
int x[10]; // резерв місця для 10 цілочислових елементів
int t;
for (i=0; i<10; ++i) x[i] = i;
for (i=0; i<10; i++) printf("%d˽", x[i]);
printf(“\n “);
system(“PAUSE”);
Вхідні дані
Вихідні дані
return 0;
0 1 2 3 4 5 6 7 8 9
}
7.
Приклад 2.1. Дано одновимірний масив цілих чисел A[i], деi=1,2,…,n (n 100). Вивести значення елементів масиву у
зворотному порядку.
#include <stdio.h>
int main()
{
int n, i, a[100];
printf(“Input n: ‘’); scanf(“%d”,&n);
for (i=0; i<n; i++) scanf(“%d”,&a[i]);
for (i=n-1; i>=0; i--) printf("%d ˽",a[i]);
printf(“\n “);
system(“PAUSE”);
Вхідні дані
return 0;
5
}
4 -5 10 0 -2
Вихідні дані
-2 0 10 -5 4
8.
Приклад 2.2. Дано одновимірний масив цілих чисел A[i], деi=1,2,…,n (n 100). Вивести значення елементів масиву з парними
індексами.
#include <stdio.h>
int main()
{
int n, i, a[100];
printf(“Input n: ‘’); scanf(“%d”,&n);
for (i=0; i<n; i++) scanf(“%d”,&a[i]);
for (i=0; i<n; i+=2) printf("%d ˽",a[i]);
printf(“\n “);
system(“PAUSE”);
Вхідні дані
return 0;
5
}
4 -5 10 0 -2
Вихідні дані
4 10 -2
9.
Приклад 2.3. Дано одновимірний масив цілих чисел A[i], деi=1,2,…,n (n 100). Вивести значення елементів масиву, що є
недодатними числами.
#include <stdio.h>
int main()
{
int n, i, a[100];
printf(“Input n: ‘’); scanf(“%d”,&n);
for (i=0; i<n; i++) scanf(“%d”,&a[i]);
for (i=0; i<n; i++)
if (a[i]<=0) printf("%d ˽",a[i]);
printf(“\n “);
system(“PAUSE”);
return 0;
Вхідні дані
}
5
4 -5 10 0 -2
Вихідні дані
-5 0 -2
10.
Приклад 2.4. Дано одновимірний масив цілих чисел A[i], деi=1,2,…,n (n 100). Вивести значення елементів масиву, що є
непарними числами.
#include <stdio.h>
Чи можна у розглянутих
int main()
програмах не використовувати
{
масиви?
int n, i, a[100];
printf(“Input n: ‘’); scanf(“%d”,&n);
for (i=0; i<n; i++) scanf(“%d”,&a[i]);
for (i=0; i<n; i++)
if (a[i]%2==1) printf("%d ˽",a[i]); // (a[i]%2=1) ???
printf(“\n “);
system(“PAUSE”);
Вхідні дані
Вихідні дані
return 0;
5
-5
4 -5 10 0 -2
}
11.
Приклад 3.1. Дано дійсні числа a1, a2, …, a20. Отримати числа b1, b2, …,b20, де bi— середнє арифметичне чисел a1, a2, …, aі (i=1,2,…,20).
#include <stdio.h>
int main()
{
Чи отримано коректний
int i; float a[20], b[20], s=0;
результат?
Як пояснити отриманий
for (i=0; i<5; i++) scanf(“%f”,&a[i]);
результат?
for (i=0; i<5; i++)
Чи можна у розглянутій
{
програмі не використовувати
s+=a[i];
масиви?
b[i]=s/(i+1);
}
for (i=0; i<5; i++) printf("%.2f˽",b[i]);
printf(“\n “);
Вхідні дані
Вихідні дані
system(“PAUSE”);
1 1 1 1 1
1.00 1.00 1.00 1.00 1.00
return 0;
}
12.
Приклад 3.2. Дано дійсні числа a1, a2, …, a20. Отримати числа b1, b2, …, b20, деbi— середнє арифметичне чисел a1, a2, …, aі (i=1,2,…,20).
#include <stdio.h>
int main()
{
Чи отримано коректний
int i; float a[20],b[20];
результат?
for (i=0; i<5; i++) scanf(“%f”,&a[i]);
Як пояснити отриманий
b[0]=a[0];
результат?
for (i=1; i<5; i++)
Чи коректний наведений код
{
програми?
b[i]+=a[i];
b[i]/=(i+1);
}
for (i=0; i<5; i++) printf("%d.2f˽",b[i]);
printf(“\n “);
system(“PAUSE”);
Вхідні дані
Вихідні дані
return 0;
1 1 1 1 1
1.00 0.50 0.33 0.25 0.20
}
13.
Приклад 3.3. Дано дійсні числа a1, a2, …, a20. Отримати числа b1, b2, …,b20, де bi— середнє арифметичне чисел a1, a2, …, aі (i=1,2,…,20).
#include <stdio.h>
int main()
{
А чи можна код програми
int i; float a[20],b[20],s=0;
зробити оптимальнішим?
for (i=0; i<5; i++)
{
scanf(“%f”,&a[i]);
s+=a[i];
b[i]=s/(i+1);
}
for (i=0; i<5; i++) printf("%.2f˽",b[i]);
printf(“\n “);
Вхідні дані
Вихідні дані
system(“PAUSE”);
return 0;
1 1 1 1 1
1.00 1.00
0.50 1.00
0.33 1.00
0.25 1.00
0.20
}
14.
Приклад 3.3. Дано дійсні числа a1, a2, …, a20. Отримати числа b1, b2, …,b20, де bi— середнє арифметичне чисел a1, a2, …, aі (i=1,2,…,20).
#include <stdio.h>
int main()
{
int i; float a[20],b[20],s=0;
for (i=0; i<5; i++)
{
scanf(“%f”,&a[i]);
s+=a[i];
b[i]=s/(i+1);
printf("%.2f˽",b[i]);
}
printf(“\n “);
system(“PAUSE”);
return 0;
}
А що зміниться, коли вводити і
виводити дані в одному циклі ?
А чи обов’язкове використання
масивів у даному коді?
1
1.00 1
1.00 1
1.00 1
1.00 1
1.00
15.
Приклад 4. Дано дійсні числа a1, a2, …, a30, b1, b2, …, b30. Обчислитизначення: a1b30 a2b29 ... a30b1
b1b2 ...b30
#include <stdio.h>
.
Чи можливе НЕ використання
масивів?
int main()
Чи можливе використання
{
меншої кількості циклів?
int i; float a[30], b[30], s=0, p=1;
for (i=0; i<5; i++) scanf("%f",&a[i]);
for (i=0; i<5; i++) scanf("%f",&b[i]);
for (i=0; i<5; i++)
{
s+=a[i]*b[4-i]; // b[n-1-i]
p*=b[i];
}
Вхідні дані
Вихідні дані
printf("%.2f \n",s/p);
1 1 1 1 1
5.00
system("PAUSE");
1 1 1 1 1
}
16.
Приклад 5. Дано одновимірний масив завдовжки n (n 1000). Розділити йогона два нових масиви таким чином, щоб в першому опинились додатні елементи,
а в другому – від’ємні.
#include <stdio.h>
Чи коректне використання
однієї і тїєї ж змінної і у двох
останніх циклах?
int main()
{
int i,n,k=0,l=0; float a[1000],b[1000],c[1000]; Чому під час виведення
значень отриманих масивів
printf("Input n: "); scanf("%d",&n);
використано порівняння “<“, а
for (i=0; i<n; i++) scanf("%f",&a[i]);
не “<=”?
for (i=0; i<n; i++)
Чи можливе використання
if (a[i]>0) { b[k]=a[i]; k++; } //b[k++]
меншої кількості циклів?
else if (a[i]<0) { c[l]=a[i]; l++; } //c[l++]
for (i=0; i<k; i++) printf("%.2f ˽",b[i]);
Вхідні дані
Вихідні дані
printf("\n ");
5
1.00 10.00
for (i=0; i<l; i++) printf("%.2f ˽",c[i]); 1 0 -1 0 10
-1.00
printf("\n ");
system("PAUSE");
}
17.
Приклад 6. Дано два одновимірних масиви завдовжки n та m(1 n,m 1000). Утворити новий масив, в якому спочатку будуть
розташовані всі елементи першого масиву в їх первісній
послідовності, а потім елементи другого масиву в зворотній
послідовності.
#include <stdio.h>
Чи можливе використання
меншої кількості циклів?
int main()
{
int i,n,m; float a[1000],b[1000],c[2000];
printf("Input n,m: "); scanf("%d%d",&n,&m);
for (i=0; i<n; i++) scanf("%f",&a[i]);
for (i=0; i<m; i++) scanf("%f",&b[i]);
for (i=0; i<n; i++) c[i]=a[i];
for (i=n; i<n+m; i++) c[i]=b[m-1-i+n];
for (i=0; i<n+m; i++) printf("%.2f ˽",c[i]);
printf("\n ");
Вхідні дані
Вихідні дані
system("PAUSE");
}
3 4
1.00 2.00 3.00 7.00 6.00 5.00 4.00
1 2 3 4 5 6 7
18.
Приклад 7.1. Дано одновимірний масив завдовжки n (1 n 1000).Поміняти місцями пари сусідніх елементів, починаючи з першого
заданого елемента.
#include <stdio.h>
Чи можливе НЕ
int main()
використання масивів?
{
int i,n,m; float a[1000],c;
printf("Input n: "); scanf("%d",&n);
for (i=0; i<n; i++) scanf("%f",&a[i]);
m=n;
Вхідні дані
Вихідні дані
if (n%2==1) m=n-1;
5
2.00 1.00 4.00 3.00 5.00
for (i=0; i<m-1; i+=2)
1 2 3 4 5
{
6
2.00 1.00 4.00 3.00 6.00 5.00
c=a[i]; a[i]=a[i+1]; a[i+1]=c; 1 2 3 4 5 6
}
for (i=0; i<n; i++) printf("%.2f˽",a[i]);
printf("\n ");
system("PAUSE");
}
19.
Приклад 7.2. Дано одновимірний масив завдовжки n (n 1000).Поміняти місцями пари сусідніх елементів, починаючи з останнього
заданого елемента.
#include <stdio.h>
int main()
{
int i,n,m; float a[1000],c;
printf("Input n: "); scanf("%d",&n);
for (i=0; i<n; i++) scanf("%f",&a[i]);
m=n%2==0? n:n-1;
for (i=m; i>0; i-=2)
{
c=a[i]; a[i]=a[i-1]; a[i-1]=c; }
for (i=0; i<n; i++) printf("%.2f ",a[i]);
printf("\n ");
system("PAUSE");
}
// чи коректно c=a[i]; a[i]=a[i--]; a[i--]=c;
Вхідні дані
Вихідні дані
5
1.00 3.00 2.00
5.00 4.00
6
2.00 1.00 4.00
3.00 6.00 5.00
20.
Приклад 8.1. Дано одновимірний масив цілих чисел A[i], де i=1,2,…,n та0<A[i]≤n. Надрукувати елементи масиву за таким правилом:
– першим елементом завжди є A[1];
– значення поточного виведеного елемента масиву є порядковим номером наступного
елемента цього масиву.
Процес завершується тоді, коли буде надруковано останній елемент масиву,
або ж порядковий номер виведеного елемента дорівнюватиме його значенню.
#include <stdio.h>
int main()
{
int i,n,a[1000];
printf("Input n: "); scanf("%d",&n);
for (i=1; i<=n; i++) scanf("%d",&a[i]);
i=a[1];
while (i!=a[i])
{
printf("%d˽",a[i]);
Вхідні дані
Вихідні дані
i=a[i];
5
3 4 5 // де 2?
}
2 3 4 5 5
printf("\n ");
system("PAUSE");
}
21.
Приклад 8.2. Дано одновимірний масив цілих чисел A[i], де i=1,2,…,n та0<A[i]≤n. Надрукувати елементи масиву за таким правилом:
– першим елементом завжди є A[1];
– значення поточного виведеного елемента масиву є порядковим номером наступного
елемента цього масиву.
Процес завершується тоді, коли буде надруковано останній елемент масиву,
або ж порядковий номер виведеного елемента дорівнюватиме його значенню.
#include <stdio.h>
Чи умови завдання
int main()
враховані у даному коді?
{
int i,n,a[1000];
printf("Input n: "); scanf("%d",&n);
А як спрацює код у разі
for (i=1; i<=n; i++) scanf("%d",&a[i]);
таких вхідних даних:
i=1;
while (i!=a[i])
{
printf("%d ",a[i]);
i=a[i];
}
printf("\n ");
system("PAUSE");
}
2 3 4 5 4?
// що змінилося?
Вхідні дані
5
2 3 4 5 5
Вихідні дані
2 3 4 5
22.
Приклад 8.3. Дано одновимірний масив цілих чисел A[i], де i=1,2,…,n та0<A[i]≤n. Надрукувати елементи масиву за таким правилом:
– першим елементом завжди є A[1];
– значення поточного виведеного елемента масиву є порядковим номером наступного
елемента цього масиву.
Процес завершується тоді, коли буде надруковано останній елемент масиву,
або ж порядковий номер виведеного елемента дорівнюватиме його значенню.
#include <stdio.h>
int main()
Самий коректний код задачі!!!!
{
int i,n,a[1000];
printf("Input n: "); scanf("%d",&n);
for (i=1; i<=n; i++) scanf("%d",&a[i]);
i=1;
// що змінилося?
do
{
printf("%d ",a[i]);
i=a[i];
}
while (i!=a[i] && i!=n);
printf("\n ");
system("PAUSE");
}
Вхідні дані
5
2 3 4 5 4
Вихідні дані
2 3 4 5
programming