Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АиП -Лабораторная_работа_1_2семестр.doc
Скачиваний:
6
Добавлен:
13.09.2019
Размер:
211 Кб
Скачать
☆

Разработка листинга программы

Текст программы начинаем с включения файла iostream.h.

Поскольку нам придется проводить сравнение (блок 15) поля name в элементах массива, а это поле - символьная строка, включаем также файл string.h, где описаны функции работы с символьными строками. В самом начале программы вводим также описание структуры mon и одновременно - объявление массива min. Массив будет размещен в статической памяти.

      Потом открывается главная функция программы, и в ней объявляются остальные переменные.

     Открывается простой цикл со счетчиком n, в каждой итерации цикла выводится приглашение и вводятся значения полей очередного элемента массива. Сравнение поля name с константой "***" - признаком конца ввода выполняется с помощью функции strcmp(). Если введен признак конца, происходит досрочный выход из цикла за оператором break.

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

      Следующие операторы программы подробно реализуют блоки 12 - 17 схемы алгоритма (для сравнения символьных строк применяется функция strcmp()). Детального рассмотрения требует только реализация блока 18 - перестановка элементов. Во-первых, при перестановке используется рабочая структура x: сначала содержимое i-го элемента пересылается в x, потом содержимое m-го элемента пересылается в i-ый элемент, а потом содержимое x пересылается в m-ый элемент. Во-вторых, операция присваивания, которая обычно применяется для пересылки значений, не может применяться к структуре в целом, так что присваивания происходит для каждого поля отдельно. К тому же, поле name является символьной строкой, а строки тоже не могут присваиваться прямо, а только - через функцию strcpy(). (Впрочем, для присваивания структур можно использовать функцию пересылки в памяти - memcpy().)

Вывод таблицы-результата - такой же, как и начальной таблицы.

    

Полный текст листинга программы.

#include <iostream.h>

#include <string.h>

#include <windows.h>

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

struct mon

{

char name[15]; /* название школы*/

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

int cnt; /* количество монахов */

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

} mm[10]; /* определение массива монастырей */

int main()

{

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

mon x; /* рабочая переменная структуры mon */

int n,k; /* количество элементов в массиве */

int i, j; /* текущие индексы в массиве */

int min; /* индекс минимального элемента */

cout<< "k=\n";

cin>> k;

/* Ввод данных */

for (n=0; n<k; n++)

{

cout<< "Введите: название школы\n";

cin>>mm[n].name;

if (!strcmp(mm[n].name,"***")) break;

cout<< "Введите школу\n";

cin>>mm[n].sc;

cout<< "Введите количество монахов\n";

cin>>mm[n].cnt;

cout<< "Введите площадь помещения\n";

cin>>mm[n].sq;

}

cout<<" ---------------------------------------------\n";

cout<<"|Буддийские монастыри Японии периода Нара |\n";

cout<<"|--------------------------------------------|\n";

cout<<"| Название |"<< "Школа |" << "Количество |" << "Площадь |\n";

cout<<"| |"<< " |" << "монахов |" << "земель(га) |\n";

cout<<"|-----------|-------|----------|-------------|\n";

/* вывод строк фактических данных */

for (i=0; i<n; i++)

{

cout<<"| "<< mm[i].name<<" | "<< mm[i].sc <<" | "<< mm[i].cnt<<" | "<< mm[i].sq<<" |\n";

}

/* сортировка массива */

for (i=0; i<n-1; i++)

{

min=i; /* минимальный элемент - первый */

for (j=i+1; j<n; j++)

/* если текущий элемент < минимального, он становится минимальным */

if (strcmp(mm[min].name,mm[j].name)>0) min=j;

if (min>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[min].name); mm[i].sc=mm[min].sc;

mm[i].cnt=mm[min].cnt; mm[i].sq=mm[min].sq;

strcpy(mm[min].name,x.name); mm[min].sc=x.sc;

mm[min].cnt=x.cnt; mm[min].sq=x.sq;

}

}

cout<<" ---------------------------------------------\n";

cout<<"|Буддийське монастыри Японии перiода Нара |\n";

cout<<"|--------------------------------------------|\n";

cout<<"| Название |"<< "Школа |" << "Количество|" << "Площадь |\n";

cout<<"| |"<< " |" << "монахов |" << "земель(га) |\n";

cout<<"|-----------|-------|----------|-------------|\n";

/* Вывод таблицы */

for (i=0; i<n; i++)

{

cout<<"| "<< mm[i].name<<" | "<< mm[i].sc <<" | "<< mm[i].cnt<<" | "<< mm[i].sq<<" |\n";

}

return 0;

}