Разработка листинга программы
Текст программы начинаем с включения файла 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;
}
