Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sd_lab_1.doc
Скачиваний:
23
Добавлен:
17.11.2018
Размер:
3.44 Mб
Скачать

Программа на языке с

#include<stdio.h>

#include<conio.h>

#include<fcntl.h>

#include<malloc.h>

#define Nmax 100

typedef

struct{

char Name[15]; /*Название государства*/

int Area; /*Территория, тыс. кв. км */

} rec;

typedef rec table[Nmax];

void InFileTab(table* T,int* n)

/* чтение записей таблицы из файла */

{ int f;

char fname[12];

char ch;

clrscr();

while (1)

{ printf("\nВведите имя файла:");

scanf("%s",&fname);

f=open(fname,O_BINARY|O_RDONLY);

if (f<=0)

{ printf("\nФайл с указанным именем не найден");

printf("\nБудете вводить новое имя (y/n)?");

ch=getchar();

if (ch=='y' || ch=='Y' || ch=='н' || ch=='Н') continue;

}

break;

}

*n=0;

while( read(f,T[(*n)+1],sizeof(rec))>=sizeof(rec) ) (*n)++;

close(f);

printf("\nТаблица загружена из файла %s",fname);

printf("\nНажмите любую клавишу...");

getch();

}

void InTab(table* T,int* n)

{ /* ввод записей таблицы с клавиатуры*/

char ch;

char fname[12];

int i;

int f;

clrscr();

*n=0;

while ( 1 )

{ (*n)++;

printf("\n Введите %d-ю запись таблицы",*n);

printf("\nГосударство: ");

scanf("%s",T[*n]->Name);

printf("\nПлощадь территории: ");

scanf("%d",&T[*n]->Area);

printf("\nПродолжить ввод (y/n)?");

fflush(stdin);

ch=getchar();

if (ch=='y' || ch=='Y' || ch=='н' || ch=='Н') continue;

break;

}

printf("\n Введите имя файла: ");

scanf("%s",&fname);

f=open(fname,O_BINARY|O_CREAT);

for (i=1; i<=*n; i++) write(f, T[i],sizeof(rec));

close (f);

}

void ShowTab (table* T,int *n)

{ /* печать всех записей таблицы*/

int i;

clrscr();

printf("\nЗаписи таблицы:");

printf("\n+--------------+------------+");

printf("\n| Государство | Территория |");

printf("\n|--------------+------------|");

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

printf("\n| %12s | %9d |",T[i]->Name,T[i]->Area);

printf("\n+--------------+------------+");

printf("\nНажмите любую клавишу для продолжения...");

getch();

}

void PrintTab(table* T, int n, int i, int imin)

{ /* Промежуточная печать ключей для демонстрации алгоритма*/

int k;

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

{ if (k==i) /* позиция переставляемой записи */

textattr(RED*16+WHITE); /* белые символы на красном фоне */

else

if ( k==imin ) /*позиция записи с наименьшим ключом*/

textattr(BLUE*16+WHITE);/*белые символы на синем фоне*/

else textattr(BLACK*16+WHITE);

cprintf("%5d",T[k]->Area);

textattr(BLACK*16+WHITE);

printf(" ");

}

printf("\n");

}

void SortTab(table* T, int n)

{ /*Процедура сортировки*/

int i,imin,j,k;

rec tmp;

clrscr();

printf("\nШаги сортировки (выделяются ключи переставляемых записей)");

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

{ imin=i;

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

if (T[j]->Area < T[imin]->Area) imin=j;

if (imin!=i)

{ /* Промежуточная печать до перестановки*/

printf("\nШаг %3d",i);

printf("\nДо перестановки ");

PrintTab(T,n,i,imin);

/*Обмен записей*/

strcpy(tmp.Name,T[i]->Name);

tmp.Area=T[i]->Area;

strcpy(T[i]->Name,T[imin]->Name);

T[i]->Area=T[imin]->Area;

strcpy(T[imin]->Name,tmp.Name);

T[imin]->Area=tmp.Area;

/* Промежуточная печать после перестановки*/

printf("После перестановки");

PrintTab(T,n,i,imin);

printf("\nНажмите любую клавишу...");

getch();

}

}

}

main()

{ char ch;

int n; /* количество записей */

table* T; /* основная таблица */

while(1)

{ clrscr();

printf("\n1. Ввести данные с клавиатуры");

printf("\n2. Загрузить таблицу из файла");

printf("\n3. Показать таблицу");

printf("\n4. Сортировка таблицы");

printf("\n-----------------------------");

printf("\n0. Выход\n");

printf("\nВаш выбор: ");

ch=getchar();

switch (ch)

{ case '1': InTab(T,&n);

break;

case '2': InFileTab(T,&n);

break;

case '3': ShowTab(T,&n);

break;

case '4': SortTab(T,n);

break;

}

if (ch=='0') break;

}

return(0);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]