
- •Лабораторна робота №1. Тема: Побудова блок-схем алгоритмів засобами програми Word 2010.
- •Хід роботи
- •Лабораторна робота № 2. Тема: Робота та знайомство в середовищі програмування. Запуск програм на виконання. Редагування тексту.
- •Теоретичні відомості
- •Хід роботи
- •Лабораторна робота №3. Тема: Побудова алгоритмів за допомогою DiagramDesigner.
- •Теоретичні відомості
- •Хід роботи
- •Лабораторна робота №4. Тема:Створення лінійних програм. Процедури вводу та виводу в машинному коді. Описати кожний рядок програми в звіті рукописом!!!!!!!!!!!!!!!!!
- •Теоретичні положення
- •Лабораторна робота №5. Тема: Написання програм використовуючі математичні функції. Освоєння арифметичних операторів. Описати кожний рядок програми від руки.
- •Лабораторна робота №6. Тема: Написання програм використовуючи логічні значення Boolean.
- •Теоретичні відомості
- •Булеві значення.
- •Детальний розпис програми:
- •Лабораторна робота №7. Тема: Типи в програмах.
- •Теоретичні положення
- •Хід роботи
- •Лабораторна робота №8. Тема: Оператор вибору в циклах середовища пргограмування.
- •Хід роботи
- •Оператор вибору варiанту.
- •Циклiчнi алгоритми.
- •Циклiчнi алгоритми
- •Лабораторна робота №9. Тема: Використання процедур та функцiй. Звукові можливості Паскаля.
- •Теоретичні відомості
- •Хід роботи
- •Лабораторна робота №10. Тема: Використання перелiчуваного та обмеженого типу даних.
- •Теоретичні відомості
- •Хід роботи
- •Лабораторна робота №11. Тема: Одновимiрнi масиви.
- •Теоретичні відомості
- •1. Одновимірні масиви (рядки, вектори):
- •Можна і так:
- •Хід роботи
- •Двовимiрнi масиви.
- •Лабораторна робота №12. Тема: Використання множин.
- •Теоретичні відомості
- •Хід роботи
- •Лабораторна робота №13. Стандартн і модулі Crt, Dos, System, Graph, Printer. Робота з клавiатурою
- •Теоретичні відомості
- •Іі семестр. Мова програмування с Лабораторна робота №13. Тема: Проста програма на с: друк рядка тексту
- •Лабораторна робота №14. Тема: Арифметика в с. Використання операцій рівності і відношення
- •Лабораторна робота №15 . Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while
- •Операції інкремента і декремента
- •Лабораторна робота №16. Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while
- •Основи структур повторення while
- •Структура повторення for
- •8. Напишіть і запустіть програму на виконання що написана нижче. Потім напишіть програму що кінцевим числом виведе на екран ваш номер варіанту по списку.
- •Лабораторна робота №17. Тема: Програмні модулі в с. Функції математичної бібліотеки
- •Генерація випадкових чисел
- •Рекурсія
- •Обчислення факторіалів рекурсивною функцією
- •Лабораторна робота №18. Тема: Приклади роботи з масивами
- •Передача масивів у функції
- •Лабораторна робота №19. Тема: Сортування масивів
- •Пошук в масивах
- •Двійковий пошук в сортованому масиві
- •Ініціалізація багатовимірних масивів
- •Лабораторна робота №20. Тема: Покажчики
- •Лабораторна робота №21. Тема: Покажчики
- •Лабораторна робота №22. Тема: Форматоване введення/вивід
- •Лабораторна робота №23. Тема: Використання прапорів в рядку управління форматом printf
- •Лабораторна робота №24. Тема: Використання прапорів в рядку управління форматом printf
- •Лабораторна робота №25. Тема: Структури, об′єднання, операції з бітами і перечисленнями
- •10.18. Використання перечислення Лабораторна робота №26. Тема: Створення файлу послідовного доступу
Обчислення факторіалів рекурсивною функцією
9. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи.
/* Рекурсивна функція fibonacci */
#include <stdio.h>
long fibonacci(long);
main ( )
{
long result, number;
printf("Enter an integer: ");
scanf("%1d", &number);
result = fibonacci(number);
printf("Fibonacci(%ld) = %ld\n", number
return 0;
}
10. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи.
/* Рекурсивне визначення функції fibonacci*/
long fibonacci(long n)
{
if (n = = 0 || n = = 1) return n;
else
return fibonacci (n - 1) + fibonacci (n – 2);
}
Enter an integer: 0
Fibonacci (0) = 0
Enter an integer: 1
Fibonacci(1) = 1
Enter an integer: 2
Fibonacci (2) = 1
Enter an integer: 3
Fibonacci (3) = 2
Enter an integer: 4
Fibonacci(4) = 3
Enter an integer: 5
Fibonacci (5) =5
Enter an integer: 6
Fibonacci(6) = 8
Enter an integer: 10
Fibonacci(10) = 55
Enter an integer: 20
Fibonacci(20) = 6765
Enter an integer: 30
Fibonacci(30) = 832040
Enter an integer: 35
Fibonacci(35) = 9227465
Рекрусивна генерація чисел Фобіначчі
Лабораторна робота №18. Тема: Приклади роботи з масивами
Мета: Освоїти роботу з масивами.
Програма, представлена нижче, використовує структуру повторення for для ініціалізації нулями елементів цілочисельного масиву n з десяти елементів і виводить його в табличній формі.
1. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи. Кількість елементів змініть на кількість вашого номеру за списком
/* ініціалізація масиву */ #incluide <stdio.h> main ( ) { int n [10], i; for (i = 0; i <= 9; i++) n [i] = 0; /* ініціалізація масиву*/ printf("%s%13s\n", "Element", "Value"); for (i = 0; i <= 9; i++) /* виведення елементів масиву */ printf("%7d% 13d\n", i, n[i]); return 0; } Element Value 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 |
Зверніть увагу, що ми вирішили не поміщати порожній рядок між першим оператором printf і структурою for на лістингу 6.3, оскільки ці оператори тісно пов'язані. В даному випадку оператор printf відображує заголовки для двох стовпців, що виводяться в структурі for. Програмісти часто опускають порожній рядок між структурою for і тісно пов'язаним з нею оператором printf. Елементи масиву також можуть ініціалізуватися при оголошенні масиву шляхом приміщення услід за його оголошенням знаку рівності і списку (ув'язненого у фігурні дужки) значень, що ініціалізували, розділених комами. |
Лістингу 6.3. Ініціалізація елементів масива нулями
2. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи. Замініть 10 з рядка int i, n [ 10 ] на ваш номер за списком.
/* Ініціалізація масиву при оголошенні * / #include <stdio.h> main () { int i, n [ 10 ] = {32, 27, 64, 18, 95, 14, 90, 70, 60, 37}; printf("%s%13s\n", "Element", "Value"); for (i = 0; i <= 9; 1++) printf("%7d% 13d\n", i, n[i]); return 0; }
Element Value 0 32 1 27 2 64 3 18 4 95 5 14 6 90 7 70 8 60 9 37
Лістингу 6.4. Ініціалізація елементів масиву при оголошенні |
Програма, представлена на лістингу 6.4, ініціалізувала цілочисельний масив десятьма значеннями і виводить його в табличній формі. Якщо значень, що ініціалізували, менше, ніж елементів масиву, елементи, що залишаються, автоматично ініціалізувалися нулями. Наприклад, елементи масиву n на попередній програмі можна було б ініціалізувати нулями за допомогою оголошення int n [10] = {0}; яке явно ініціалізувало нулем перший елемент і автоматично ініціалізував нулями дев'ять елементів, що залишилися, оскільки значень, що ініціалізували, менше, ніж елементів в масиві. Важливо пам'ятати, що масиви не ініціалізувалися нулями автоматично. Програміст повинен ініціалізувати принаймні перший елемент, щоб елементи, що залишилися, були автоматично заповнені нулями. Цей метод ініціалізації елементів масиву нулями реалізується під час компіляції. Метод, використовуваний на попередній програмі, може застосовуватися багаторазово в процесі виконання програми.
Якщо попередня директива препроцесора #define закінчуватиметься крапкою з комою, то усі входження символічної константи SIZE в програмі будуть замінені препроцесором на текст "10;". Це може привести до синтаксичних помилок часу компіляції або логічних помилок під час виконання. Не забувайте, що препроцесор не є компілятором C, це усього лише текстовий маніпулятор. |
3. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи. Напишіть програму додавши до 20 свій номер варіанту за списком і округливши результат до парного числа. (Наприклад 17 =18, 19=20 і т.д.)
/* Ініціалізував елементи масиву s парними цілими числами від 2 до 20 */
#include <stdio.h>
#define SIZE 10
main ( )
{
int s[SIZE], j ;
for (j = 0; j <= SIZE - 1; j++) / * встановлює значення */
s[j] = 2 + 2 * j;
printf("%s%13s\n", "Element", "Value");
for (j = 0; j <= SIZE - 1; j++) /* виводить значення */
printf("%7d% 13d\n", j, s[j]);
return 0;
}
Лабораторна робота №1. Тема: Побудова блок-схем алгоритмів засобами програми Word 2010. 3
Лабораторна робота № 2. Тема: Робота та знайомство в середовищі програмування. Запуск програм на виконання. Редагування тексту. 5
Лабораторна робота №3. Тема: Побудова алгоритмів за допомогою DiagramDesigner. 6
Лабораторна робота №4. Тема:Створення лінійних програм. Процедури вводу та виводу в машинному коді. 8
Лабораторна робота №5. Тема: Написання програм використовуючі математичні функції. Освоєння арифметичних операторів. 10
Лабораторна робота №6. Тема: Написання програм використовуючи логічні значення Boolean. 12
Лабораторна робота №7. Тема: Типи в програмах. 15
Лабораторна робота №8. Тема: Оператор вибору в циклах середовища пргограмування. 17
Лабораторна робота №9. Тема: Використання процедур та функцiй. Звукові можливості Паскаля. 21
Лабораторна робота №10. Тема: Використання перелiчуваного та обмеженого типу даних. 25
Лабораторна робота №11. Тема: Одновимiрнi масиви. 27
Лабораторна робота №12. Тема: Використання множин. 30
ІІ семестр. Мова програмування С 34
Лабораторна робота №13. Тема: Проста програма на С: друк рядка тексту 34
Лабораторна робота №14. Тема: Арифметика в С. Використання операцій рівності і відношення 35
Лабораторна робота №15 . Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while 38
Лабораторна робота №16. Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while 41
Лабораторна робота №17. Тема: Програмні модулі в С. Функції математичної бібліотеки 47
Лабораторна робота №18. Тема: Приклади роботи з масивами 57
Лабораторна робота №19. Тема: Сортування масивів 67
Лабораторна робота №20. Тема: Покажчики 80
Лабораторна робота №21. Тема: Покажчики 97
Лабораторна робота №22. Тема: Форматоване введення/вивід 116
Лабораторна робота №23. Тема: Використання прапорів в рядку управління форматом printf 122
Лабораторна робота №24. Тема: Використання прапорів в рядку управління форматом printf 125
Лабораторна робота №25. Тема: Структури, об′єднання, операції з бітами і перечисленнями 128
Лабораторна робота №26. Тема: Створення файлу послідовного доступу 138
Лістингу 6.5. Генерація значень для розміщення в елементах масиву
4. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи. Напишіть власну програму змінивши значення SIZE 12 на SIZE свій номер за списком.
Програма що, представлена нижче підсумовує значення, що містяться в цілочисельному масиві а з дванадцяти елементів. Оператор в тілі циклу for обчислює підсумкову суму.
/* Обчислює суму елементів масиву * /
#include <stdio.h>
#define SIZE 12
main ( )
{
int a [ SIZE ] = { 1, 3, 5, 4, 7, 2, 99, 16, 45, 67, 89, 45},
i, total = 0;
for (i = 0; 1 <= SIZE - 1; i++)
total += a [ i];
printf ("Total of array element values is %d\n", total);
return 0;
}
Total of array element values is 383
Обчислення суми елементів масиву
5. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи. Напишіть власну програму змінівши RES PONSE_SIZE40 на свій номер за списком.
/* Програма опитування студентів * / #include <stdio.h> #define RES PONSE_SIZE 40 #define FREQUENCY_SIZE 11 main ( ) { int answer, rating; int responses [RESPONSE_SI2E] = {1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7, 5, 6, 6, 5, 6, 7, 5, 6, 4, 8, 6, 8, 10}; int frequency[FREQUENCY_SIZE] = {0}; for (answer = 0; answer <= RESPONSE_SIZE - 1; answer++) + +frequency[responses[answer]] ; printf("%s%17s\n", "Rating", "Frequency"); for (rating = 1; rating <= FREQUENCY_SIZE - 1; rating++) printf("%6d% 17d\n", rating, frequency[rating]); return 0; }
Rating Frequency 1 2 2 2 3 2 4 2 5 5 6 11 7 5 8 7 9 1 10 3 Лістингу 6.7. Проста програма аналізу опитування студентів |
У цьому прикладі масиви використовуються для підведення підсумків опитування. Розглянемо постановку завдання. Сорок студентів попросили оцінити якість готування в студентській їдальні за шкалою від 1 до 10 (1 означає жахлива якість, а 10 означає чудове). Помістите сорок відповідей в цілочисельний масив і визначите підсумковий результат опитування. Це типове застосування масиву (див. ліворуч). Ми хочемо підсумувати кількість відповідей кожного типу (тобто від 1 до 10). Масив responses є 40-елементним масивом відповідей студентів. Ми використовуємо масив з одинадцяти елементів frequency для підрахунку числа появ кожної відповіді. Ми ігноруємо перший елемент frequency[0], оскільки логічніше, щоб відповідь 1 збільшував frequency[1], а не frequency[0]. Це дозволяє нам використовувати кожен тип відповіді безпосередньо як індекс в масиві frequency. Ключовим оператором циклу є ++frequency[responses[answer]]; Цей оператор збільшує відповідний лічильник frequency залежно від значення responses[answer]. Наприклад, коли змінна-лічильник answer рівна 0, responses[answer] рівне 1, так що ++frequency[responses[answer]]; насправді інтерпретується як + + frequency [ 1 ] ; що збільшує елемент масиву номер один. |
Коли змінна answer дорівнює 1, responses[answer] рівне 2, так що ++frequency[responses[answer]]; інтерпретується як
++frequency[2];
що збільшує елемент масиву номер два. Коли змінна answer дорівнює 2, responses[answer] рівне 6, так що ++frequency[responses[answer]]; інтерпретується як
++frequency[6];
що збільшує елемент масиву номер шість, і так далі. Зверніть увагу, що незалежно від числа відповідей, оброблених під час обстеження, для підсумовування результатів потрібно масив, що містить тільки одинадцять елементів (ми ігноруємо елемент з номером нуль). Якби дані містили неприпустимі значення, як, наприклад 13, програма спробувала б додати 1 до frequency[13]. Це було б виходом за межі масиву.
У мові C відсутня перевірка на вихід за межі масиву, що запобігає посиланню на неіснуючий елемент. Таким чином, програма, що виконується, може вийти за межі масиву без попередження. Програміст повинен гарантувати, що усі посилання на масив не виходять за його межі.
6. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи. Напишіть таку ж програмі змінівши значення SIZE10 на власний номер варіанту.
/* Програма друку гістограми */ #include <stdio.h> #define SIZE 10 main () { int n[SIZE] = {19, 3, 15, 7, 11, 9, 13, 5, 17, 1}; int i, j; printf("%s%13s% 17s\n", "Element", "Value", "Histogram"); for (i = 0; i <= SIZE - 1; i++){ printf("%7d% 13d ", i, n[i] ); for (j = 1; j < n [ i]; j++) /* виводить окремий стовпець */ printf ("%c", '*'); printf("\n"); } return 0; }
Element Value Histogram 0 19 ********************* 1 3 *** 2 15 ***************** 3 7 ********* 4 11 ************* 5 9 *********** 6 13 ******************* 7 5 ***** 8 17 ******************** 9 1 *
Лістингу 6.8. Програма виведення гістограм |
У цьому прикладі відбувається прочитування чисел з масиву і графічне відображення інформації у вигляді столбцовой діаграми, або гістограми; виводиться кожне число і, крім того, поряд з ним виводиться смуга, що складається з такої ж кількості зірочок. Смуги виводяться вкладеним циклом for. Зверніть увагу на використання printf("\n") для завершення смуги гістограми. В минулій лабораторній ми обіцяли, що покажемо витонченіший метод написання програми для кидання кістки. Завдання полягало в киданні 6000 разів шестигранної кістки для перевірки того, чи дійсно генератор випадкових чисел виробляє випадкові числа. Варіант цієї програми з масивом показаний наступній програмі. Досі ми обговорювали тільки цілочисельні масиви. Проте в масивах можуть міститися дані будь-якого типу. Тепер ми обговоримо зберігання рядків в символьних масивах. Поки єдиною можливістю обробки рядків, яку ми маємо в розпорядженні, є виведення рядка за допомогою функції printf. У мові С рядок типу "hello" насправді є масивом окремих символів.
|
Символьні масиви мають декілька унікальних особливостей. Символьний масив може ініціалізувати строковим літералом. Наприклад, оголошення
char stringl[] = "first";
ініціалізував елементи масиву string1 окремими символами строкового літерала "first". Розмір масиву string1 в попередньому оголошенні визначається компілятором виходячи з довжини рядка.
Важливо звернути увагу на те, що рядок "first" містить п'ять символів і спеціальний символ закінчення рядка, званий нульовим символом. Таким чином, масив string1 фактично містить шість елементів. Представленням нульового символу у вигляді символьної константи є '\0'. Усіх рядків в мові С закінчуються цим символом. Символьний масив, що представляє рядок, завжди слід оголошувати досить великим для зберігання в нім усіх символів рядка і завершуючого нульового символу.
Символьні масиви можуть також ініціалізуватися окремими символьними константами в списку, що ініціалізував. Попереднє оголошення еквівалентне
char string1 = {'f ', 'i ', 'r ', 's ', 't ', '\0'};
7. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи. Напишіть таку ж програмі змінівши значення SIZE7 на власний номер варіанту.
/ * Моделює кидання шестигранної кістки 6000 разів */ #include <stdio.h> #include <stdlib.h> #include <time.h> #define SIZE 7 main () { int face, roll, frequency[SIZE] = {0}; srand(time(NULL)); for (roll = 1; roll <= 6000; roll++){ face = rand() % 6 + 1; ++frequency[face]; /* замінює 20-рядковий switch */ } /* на лістингу 5.8 */ printf("%s%17s\n", "Face", "Freduency"); for (face = 1; face <= SIZE - 1; face++) printf ("%4d% 17d\n", face, frequency [ face ] ); return 0; }
Face Frequency 1 Лабораторна робота №1. Тема: Побудова блок-схем алгоритмів засобами програми Word 2010. 3 Лабораторна робота № 2. Тема: Робота та знайомство в середовищі програмування. Запуск програм на виконання. Редагування тексту. 5 Лабораторна робота №3. Тема: Побудова алгоритмів за допомогою DiagramDesigner. 6 Лабораторна робота №4. Тема:Створення лінійних програм. Процедури вводу та виводу в машинному коді. 8 Лабораторна робота №5. Тема: Написання програм використовуючі математичні функції. Освоєння арифметичних операторів. 10 Лабораторна робота №6. Тема: Написання програм використовуючи логічні значення Boolean. 12 Лабораторна робота №7. Тема: Типи в програмах. 15 Лабораторна робота №8. Тема: Оператор вибору в циклах середовища пргограмування. 17 Лабораторна робота №9. Тема: Використання процедур та функцiй. Звукові можливості Паскаля. 21 Лабораторна робота №10. Тема: Використання перелiчуваного та обмеженого типу даних. 25 Лабораторна робота №11. Тема: Одновимiрнi масиви. 27 Лабораторна робота №12. Тема: Використання множин. 30 ІІ семестр. Мова програмування С 34 Лабораторна робота №13. Тема: Проста програма на С: друк рядка тексту 34 Лабораторна робота №14. Тема: Арифметика в С. Використання операцій рівності і відношення 35 Лабораторна робота №15 . Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while 38 Лабораторна робота №16. Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while 41 Лабораторна робота №17. Тема: Програмні модулі в С. Функції математичної бібліотеки 47 Лабораторна робота №18. Тема: Приклади роботи з масивами 57 Лабораторна робота №19. Тема: Сортування масивів 67 Лабораторна робота №20. Тема: Покажчики 80 Лабораторна робота №21. Тема: Покажчики 97 Лабораторна робота №22. Тема: Форматоване введення/вивід 116 Лабораторна робота №23. Тема: Використання прапорів в рядку управління форматом printf 122 Лабораторна робота №24. Тема: Використання прапорів в рядку управління форматом printf 125 Лабораторна робота №25. Тема: Структури, об′єднання, операції з бітами і перечисленнями 128 Лабораторна робота №26. Тема: Створення файлу послідовного доступу 138
Лістингу 6.9. Програма кидання кістки, що використовує масиви замість оператора switch
|
Оскільки рядок насправді є символьним масивом, ми можемо безпосередньо звертатися до окремих символів рядка, користуючись індексною нотацією. Наприклад, stringl[0] є символ 'f', a stringl[3] - 's'. Ми також можемо вводити рядок в символьний масив безпосередньо з клавіатури, користуючись для цього функцією scanf і специфікацією перетворення %s. Наприклад, оголошення char string2 [20]; створює символьний масив, в якому можуть зберігатися рядок з 19 символів і завершуючий нульовий символ. Оператор scanf ("%s", string2); прочитує рядок з клавіатури в string2. Зверніть увагу, що ім'я масиву передається у функцію scanf без передування &, необхідного з іншими змінними. Символ & зазвичай використовується для того, щоб забезпечити scanf інформацією про місце розташування змінної в пам'яті, з тим щоб там можна було зберегти в ній значення. Ми побачимо, що ім'я масиву є адресою його початку; тому символ & не є необхідним. Відповідальність за те, щоб в масиві, куди прочитуються символи, міг бути збережений будь-який рядок, що вводився користувачем, лежить на програмістові. Приведений вище виклик функції scanf прочитує символи з клавіатури до тих пір, поки не буде зустрінутий перший пробільний символ - розмір масиву її не цікавить. Таким чином, функція scanf може записувати інформацію за межі масиву. Символьний масив, що представляє рядок, може бути виведений за допомогою функції printf і специфікатора перетворення %s. Масив string2 виводиться за допомогою оператора printf("%s\n", string2); Зверніть увагу, що printf, як і scanf, не піклується про розміри символьного масиву. Символи рядка виводяться до тих пір, поки не буде зустрінутий завершуючий нульовий символ. |
8. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи. Напишіть таку ж програмі змінівши значення string1 [20] на власний номер варіанту.
/* Інтерпретація символьних масивів у вигляді рядків * / #include <stdio.h> main () { char string1 [20], string2[] = "string literal"; int i; printf("Enter a string: "); scanf ("%s", string1); printf("stringl is: %s\nstring2: is %s\n" "string1 with spaces between characters is :\n", string1, string2); for (i = 0; string1 [i] != ' \0' ; i + +) printf ("%c ", string1 [i]); printf("\n"); return 0; }
Enter a string: Hello there string1 is: Hello string2 is: String literal string1 with spaces between characters is: Hello
Лістингу 6.10. Інтерпретація символьних масивів як рядків |
Ця програма демонструє ініціалізацію символьного масиву строковим літералом, читання рядка в символьний масив, виведення символьного масиву у вигляді рядка і доступ до окремих символів рядка. Структура for використовується для проходу в циклі по масиву string1 і виведення окремих символів, розділених пропусками, при допомозі специфікації перетворення %с. Умова в структурі for, string1[i] != '\0 ', залишається істинним, поки в рядку не буде зустрінутий завершуючий нульовий символ. Статична локальна змінна у визначенні функції існує на всьому протязі виконання програми, але видима тільки в тілі функції. Ми можемо застосовувати static до оголошення локального масиву, при цьому під час роботи програми масив не створюватиметься і не ініціалізується всякий раз при виклику функції і знищуватися при виході з неї. Це зменшує час виконання програм, особливо програм з частим викликом функцій, що містять великі масиви. Масиви, оголошені статичними, автоматично ініціалізувалися один раз під час компіляції. Якщо статичний масив явно не ініціалізував програмістом, компілятор ініціалізував його нулями. |
9. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи. Напишіть таку ж програмі змінівши значення string1 [20] на власний номер варіанту.
/ * Статичні масиви ініціалізувалися нулями * / #include <stdio.h> void staticArraylnit(void); void automaticArraylnit(void); main () { printf("First call to each function:\n"); staticArraylnit(); automaticArraylnit(); printf(\n\nSecond call to each function:\n"); staticArraylnit (); automaticArraylnit(); return 0; }
|
В цій програмі показані функція staticArraylnit з локальним масивом, оголошеним static, і функція automaticArraylnit з автоматичним локальним масивом. Функція staticArraylnit викликається двічі. Статичний локальний масив, що міститься у функції, ініціалізувався компілятором нулями. Функція виводить масив, додає 5 до кожного його елементу і знову виводить масив. При другому виклику функції статичний масив містить значення, що збереглися з часу її першого виклику. Функція automaticArraylnit також викликається двічі. Елементи автоматичного локального масиву, що міститься у функції, ініціалізувалися значеннями 1, 2 і 3. Функція виводить масив, додає 5 до кожного його елементу і знову виводить цей масив. При другому виклику функції елементи масиву знову ініціалізувалися як 1, 2 і 3, оскільки масив має автоматичний період зберігання. |
/* функція, що ілюструє статичний локальний масив */
void staticArraylnit(void)
{
static int a [3];
nt i;
printf("\nValues on entering staticArraylnit:\n");
for (i = 0; i <= 2; i++)
printf ("array 1 [%d] = %d ", i, a [i]);
printf ["\nValues on exiting staticArraylnit:\n");
for (i = 0; i <= 2; I++)
printf("arrayl[%d] = %d ", i, a[i] += 5);
}
/* функція, що ілюструє автоматичний локальний масив */
void automaticArraylnit(void)
{
int a[3] = {1, 2, 3};
int i;
printf("\n\nValues on entering automaticArraylnit:\n");
for (i = 0; i <= 2; i++)
printf("array 1 [% d] = %d ", i, a[i]);
printf("\nValues on exiting automaticArraylnit:\n");
for (i = 0; i <= 2; i++)
printf("array 1 [%d] = %d ", i, a[i] += 5);
}
First call to each function:
Values on entering staticArraylnit:
array1[0] = 0 array1[1] = 0 array1[2] = 0
Values on exiting staticArraylnit:
array1[0] = 5 array1[1] = 5 array1[2] = 5
Values on entering automaticArraylnit:
array1[0] = 1 array1 [1] = 2 array1 [2] = 3
Values on exiting automaticArraylnit:
array1[0] = 6 array1[1] = 7 array1[2] = 8
Second call to each function
Values on entering staticArraylnit:
array1[0] = 5 array1[1] = 5 array1[2] = 5
Values on exiting staticArraylnit:
array1[0] = 10 array1[1] = 10 array1[2] = 10
Values on entering automaticArraylnit:
array1[0] = 1 array1[1] = 2 array1[2] = 3
Values on exiting automaticArraylnit:
array1 [0] = 6 array1 [1] = 7 array1 [2] = 8
Статистичні масиви автоматично ініціалізуються нулями, якщо вони не ініціалізовані програмістом