- •( Для студентов, обучающихся по направлению подготовки 6.050101 ”Компьютерные науки”)
- •( Для студентов, обучающихся по направлению подготовки 6.050101 ”Компьютерные науки”)
- •Введение
- •Классификация структур данных
- •Структура оперативной памяти
- •Лабораторная работа 1 методы сортировки постоянных таблиц и поиска в таблицах
- •Методические указания к выполнению работы
- •Определение операции сортировки
- •Линейный выбор (сортировка выбором)
- •Линейный выбор с подсчетом
- •Метод "пузырька"
- •{Описание типов}
- •Шейкер – сортировка
- •Метод вставки с прямым включением
- •Метод вставки с бинарным включением
- •Метод двухпутевой вставки
- •Метод Шелла
- •"Быстрая" сортировка (обменная сортировка с разделением)
- •Метод простого двухпутевого слияния (сортировка слиянием)
- •Метод естественного слияния (сортировка слиянием)
- •Дихотомический поиск по совпадению
- •Дихотомический поиск нескольких записей
- •Дихотомический поиск по близости
- •Дихотомический поиск по интервалу
- •Задание к лабораторной работе
- •Варианты заданий
- •Требования к выполнению лабораторной работы
- •Контрольные вопросы
- •Литература
- •Приложение а Примеры программ, выполняющих сортировку таблицы методом линейного выбора
- •Программа на языке с
- •Приложение в краткое описание системы turbo pascal
- •1. Структура pascal-программы
- •2. Простые типы
- •3. Составные типы
- •4. Операторы
- •5. Процедуры и функции
- •6. Файлы
- •7. Управление консолью
- •Содержание
- •Методические указания и задания
- •К лабораторным работам по курсу
- •«Алгоритмы и структуры данных»
- •(Для студентов обучающихся по направлению подготовки 6.050101 ”Компьютерные науки”)
Программа на языке с
#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);
}