Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторн_робот_Ч2.doc
Скачиваний:
19
Добавлен:
03.11.2018
Размер:
2.12 Mб
Скачать
    1. Розробка тексту програми Текст програми починаємо з підключення файлу stdio.H.

     Оскільки нам потрібно буде проводити порівняння  (блок 15) поля name в елементах масиву, а це поле - символьна стрічка, то підключаємо також файл string.h, де описані функції роботи з символьними стрічками. На самому початку програми вводимо також опис структури mon і одночасно - об’явлення масиву mm. Масив буде розміщений в статичній пам’яті.

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

float sqx;

     Відкривається простий цикл з лічильником n.

В кожній ітерації циклу виводиться запрошення і вводяться значення полів наступного елемента масиву. Порівняння поля name з константою "***" виконується за допомогою функції strcmp(). Якщо введена ознака кінця, відбувається передчасний вихід з циклу оператором break.

Потрібно, одначе, зупинитися на вводі значення для поля sq. Тут ми зіткнулися (не вперше в нашій практиці) з явищем, яке не можемо пояснити інакше, як помилкою в системі програмування: функція scanf() працює ненадійно при вводі значень типу float і double, якщо це значення полів елементів масиву структур. Тому ми об’явили робочу змінну sqx типу float і значення поля sq спочатку вводиться в цю змінну, а потім присвоюється полю структури.

 Вивід масиву складається з виводу заголовка як декількох стрічок-констант і виводу в циклі стрічок з фактичними даними.

Наступні оператори програми детально реалізовують блоки 12 - 17 схеми алгоритму (для порівняння символьних стрічок застосовується функція strcmp()). Детального перегляду потребує тільки реалізація блоку 18 - перестановка елементів. По-перше, при перестановці використовується робоча структура x: спочатку складове i-го елемента пересилається в x, потім складове m-го елемента пересилається в i-ий елемент, а потім складове x пересилається в m-ий елемент. По-друге, операція присвоєння, яка звичайно використовується для пересилання значень, не може застосовуватися до структури в цілому, так що присвоєння відбувається для кожного поля окремо. До того ж, поле name являється символьною стічокою, а стрічки теж не можуть присвоюватися прямо, а тільки через функцію strcpy(). (Між іншим, для присвоєння структур можна застосовувати функцію розподілу в пам’яті - memcpy().)

Вивід таблиці-результату - такий же, як і початкової таблиці.

     Повний текст програми наведений нижче.

#include <stdio.h>

#include <string.h>

/* Опис структури, яка представляє монастир */

struct mon {

char name[15]; /* назва */

char sc; /* школа */

int cnt; /* кількість монахів */

float sq; /* площа */

} mm[10]; /* визначення масиву монастирів */

Int main(void) {

struct mmm x; /* робоча змінна */

int n; /* кількість елементів в масиві */

int i, j; /* поточні індекси в масиві */

int m; /* індекс мінімального елемента */

float sqx;/* робоча змінна */

/* Ввід даних */

for (n=0; n<10; n++){

printf("%d. Введіть: назву, школу, кількість, площу >",

n+1);

scanf("%s",mm[n].name);