Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Розробка тексту програмиТекст програми починаємо з включення файлу 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 "stdafx.h" /********************************************************/ /* Лабораторна робота №3 */ /* Структури */ /* Приклад виконання. */ /********************************************************/ #include <stdio.h> #include <string.h> /* Опис структури, яка представляє монастир */ struct mon { char name[15]; /* назва */ char sc; /* школа */ int cnt; /* кількість ченців */ float sq; /* площа */ } mm[10]; /* визначення масиву */
int _tmain(int argc, _TCHAR* argv[]) { struct mon 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); if (!strcmp(mm[n].name,"***")) break; scanf("%s",&mm[n].sc); scanf("%d",&mm[n].cnt); /* Увага! Ми обходимо помилку в системі програмування */ scanf("%f",&sqx); mm[n].sq=sqx; } /* Виведення таблиці */ printf("+--------------------------------------------+\n"); printf("|Буддиські монастирі Японії перiода Нару |\n"); printf("|--------------------------------------------|\n"); printf("| Назва | Школа |Кількість | Площа |\n"); printf("| | | ченців | земель(га) |\n"); printf("|-----------|-------|----------|-------------|\n"); /* виведення рядків фактичних даних */ for (i=0; i<n; i++) printf("| %9s | %c | %3d | %-5.1f |\n", mm[i].name,mm[i].sc,mm[i].cnt,mm[i].sq); printf("---------------------------------------------\n"); /* сортування масиву */ for (i=0; i<n-1; i++) { m=i; /* мінімальний елемент - перший */ for (j=i+1; j<n; j++) /* якщо поточний елемент > мінімального, він стає мінімальним */ if (strcmp(mm[m].name,mm[j].name)>0) m=j; if (m>i) { /* перестановка першого і мінімального елементів */ strcpy(x.name,mm[i].name); x.sc=mm[i].sc; x.cnt=mm[i].cnt; x.sq=mm[i].sq; strcpy(mm[i].name,mm[m].name); mm[i].sc=mm[m].sc; mm[i].cnt=mm[m].cnt; mm[i].sq=mm[m].sq; strcpy(mm[m].name,x.name); mm[m].sc=x.sc; mm[m].cnt=x.cnt; mm[m].sq=x.sq; } } /* Виведення таблиці */ printf("*-------------------------------------------*\n"); printf("|Буддиські монастирі Японії перiода Нара |\n"); printf("|-------------------------------------------|\n"); printf("| Назва | Школа |Кількість | Площа |\n"); printf("| | | ченців | земель(га) |\n"); printf("|-----------|-------|----------|------------|\n"); for (i=0; i<n; i++) printf("| %9s | %c | %3d | %-5.1f |\n", mm[i].name,mm[i].sc,mm[i].cnt,mm[i].sq); printf("---------------------------------------------\n"); return 0; } 4. Відлагодження програми При відлагодженні програми можна використовувати покроковий режим з відстежуванням значень змінних - тих, які вводяться. Якщо виникають проблеми з введенням змінних, доцільно вводити кожну змінну окремим оператором. Найскладнішою може бути відладка тієї частини програми, яка виконує сортування масиву. Перегляд всього масиву структур засобами відладчика системи програмування хоча і можливий, але може бути достатньо громіздким. Тому краще при помилках в цій частині програми вставити проміжні виведення - наприклад, виводити всю таблицю після кожного циклу сортування. У покроковому режимі можна спостерігати значення знайденого мінімуму в кожному циклі.
|