
Лабораторная работа №3 Вариант №6
.1.doc
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №3
по дисциплине
«Программирование на языке высокого уровня»
на тему:
«Обработка базовых списковых структур данных»
|
Студент |
|
|
|
|
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
|
|
||||||||
|
|
|
|
|
Фарафонов А.С. |
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2010
-
Задание
Написать программу, реализующую ввод данных из текстового, двоичного файлов и с клавиатуры и вывод данных в текстовый, двоичный файл и на экран. Для хранения данных использовать заданную списковую структуру данных.
Данные представляют собой структуру из 2-х элементов. Ввод-вывод в двоичный файл осуществлять чтением-записью области памяти, занимаемой структурой. Порядок ввода-вывода определяется спецификой списковой структуры.
Количество элементов не должно быть ограничено (обязательно использовать динамическое выделение памяти).
Программа должна быть реализована в виде меню, имеющего, приблизительно, следующую структуру:
-
Ввод
-
Из текстового файла
-
Из двоичного файла
-
С клавиатуры
-
-
Очистить
-
Вывод
-
В текстовый файл
-
В двоичный файл
-
На экран
-
-
Выход
Вариант 6.1.
Данные |
Структура |
|||
1 |
Название группы, кол-во студентов |
1 |
Односвязный список |
Выбор, куда добавлять/откуда читать |
2 |
Фамилия студента, рейтинг |
2 |
Стек |
|
3 |
Название предмета, кол-во занятий |
3 |
Очередь |
|
4 |
Название товара, стоимость |
4 |
Дек |
Выбор, куда добавлять/откуда читать |
5 |
Название книги, кол-во страниц |
5 |
Двусвязный список |
Выбор, куда добавлять/откуда читать |
6 |
Модель автомобиля, мощность двигателя |
|
|
|
-
Блок-схема
-
Листинг программы
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
struct dann
{
char model[30];
int horsepower;
struct dann *next;
};
struct dann* add_to_begin(struct dann *root,char *model, int horsepower)
{
struct dann *vsp;
vsp=(struct dann *)malloc(sizeof(dann));
vsp->horsepower=horsepower;
for(int i=0;i<30;i++)
vsp->model[i]=model[i];
vsp->next=root;
return vsp;
}
struct dann* add_to_end(struct dann *root,char *model, int horsepower)
{
if(root==NULL)
{
root=(struct dann*)malloc(sizeof(struct dann));
root->horsepower=horsepower;
for(int i=0;i<30;i++)
root->model[i]=model[i];
root->next=NULL;
}
else
root->next = add_to_end(root->next,model,horsepower);
return root;
}
struct dann* add_to_middle(struct dann *root,char *model, int horsepower,char *mod)
{
struct dann *vsp;
if(strcmp(root->model,mod)==0)
{
vsp=(struct dann*)malloc(sizeof(struct dann));
vsp->horsepower=horsepower;
for(int i=0;i<30;i++)
vsp->model[i]=model[i];
vsp->next=root->next;
root->next=vsp;
}
else if(root->next!=NULL)
root->next=add_to_middle(root->next,model,horsepower,mod);
else
return NULL;
return root;
}
struct dann* del_from_begin(struct dann *root)
{
struct dann *vsp;
vsp=root->next;
free(root);
return vsp;
}
struct dann* del_from_end(struct dann *root)
{
if(root->next==NULL)
{
free(root);
return NULL;
}
else
root->next=del_from_end(root->next);
return root;
}
struct dann* del_from_middle(struct dann *root,char *mod)
{
struct dann *vsp;
if(strcmp(root->model,mod)==0)
{
vsp=root->next;
free(root);
return vsp;
}
else
root->next=del_from_middle(root->next,mod);
return root;
}
void vyvod_screen(struct dann *root)
{
if(root!=NULL)
{
printf("\n\nМодель автомобиля:\t%s\nМощность(ЛС):\t\t%d",root->model,root->horsepower);
if(root->next!=NULL)
vyvod_screen(root->next);
}
}
void vyvod_txt(struct dann *root,FILE *fp)
{
if(root!=NULL)
{
fprintf(fp,"%s %d\n",root->model,root->horsepower);
if(root->next!=NULL)
vyvod_txt(root->next,fp);
}
}
void vyvod_bin(struct dann *root,FILE *fp)
{
if(root!=NULL)
{
fwrite(&root->model,sizeof(root->model),1,fp);
fwrite(&root->horsepower,sizeof(root->horsepower),1,fp);
if(root->next!=NULL)
vyvod_bin(root->next,fp);
}
}
struct dann* make_null(struct dann *root)
{
if(root->next!=NULL)
root->next=make_null(root->next);
else
free(root);
return NULL;
}
void menu()
{
struct dann *root=NULL,*usel=NULL;
int p=0,t,horsepower,q;
char model[30],mod[30],in[]="I:/in.txt",out[]="I:/out.txt",bin[]="I:/in.bin",bout[]="I:/out.bin";
FILE *fp;
while(p!=10)
{
printf("\nЧто вы хотите сделать?\n1. Ввести данные\n2. Очистить\n3. Вывести данные\n4.Удалить элемент\n10.Выход\n");
scanf("%d",&p);
switch(p)
{
case 1:
l1: printf("\n1.Из текстового файла\n2.Из двоичного файла\n3.С клавиатуры\n");
scanf("%d",&t);
switch(t)
{
case 1:
fp=fopen(in,"r+");
while(!feof(fp))
{
fscanf(fp,"%s %d",&model,&horsepower);
root=add_to_end(root,model,horsepower);
}
fclose(fp);
break;
case 2:
fp=fopen(bin,"rb+");
while(!feof(fp))
{
char mod[30]="";
int horse=0;
fread(&(mod),sizeof(mod),1,fp);
fread(&(horse),sizeof(horse),1,fp);
if(strcmp(mod,"")!=0)
root=add_to_end(root,mod,horse);
}
fclose(fp);
break;
case 3:
printf("\n1.В начало\n2.В конец\n3.В середину\n");
scanf("%d",&q);
printf("Введите модель автомобиля: ");
scanf("%s",&model);
printf("Введите мощность автомобиля(ЛС): ");
scanf("%d",&horsepower);
switch(q)
{
case 1:
root=add_to_begin(root,model,horsepower);
break;
case 2:
root=add_to_end(root,model,horsepower);
break;
case 3:
printf("Введите модель, после которой хотите вставить элемент: ");
scanf("%s",&mod);
root=add_to_middle(root,model,horsepower,mod);
break;
}
break;
default:
printf("\nНеправильный ввод, попробуйте снова");
goto l1;
break;
}
break;
case 2:
root=make_null(root);
break;
case 3:
l2: printf("\n1.В текстовый файл\n2.В двоичный файл\n3.На монитор\n");
scanf("%d",&t);
switch(t)
{
case 1:
remove(out);
fp=fopen(out,"a+");
vyvod_txt(root,fp);
fclose(fp);
break;
case 2:
remove(bin);
fp=fopen(bin,"ab+");
vyvod_bin(root,fp);
fclose(fp);
break;
case 3:
vyvod_screen(root);
break;
default:
printf("Неправильный ввод, попробуйте снова");
goto l2;
break;
}
break;
case 4:
printf("\n1.Из начала\n2.Из конца\n3.Из середины\n");
scanf("%d",&q);
switch(q)
{
case 1:
root=del_from_begin(root);
break;
case 2:
root=del_from_end(root);
break;
case 3:
printf("Введите модель, которую хотите удалить: ");
scanf("%s",&mod);
root=del_from_middle(root,mod);
break;
}
break;
default:
break;
}
}
}
void main()
{
setlocale(LC_ALL,"Rus");
menu();
}
-
Контрольный пример
-
Выводы о проделанной работе
При выполнении данной лабораторной работы я научился работать с основными видами списковых структур данных.
-
Список использованной литературы
-
Шилдт Г. Искусство программирования на C++. БХВ.2005
-
Шилдт Г. C++ Руководство для начинающих. Вильямс.2005
-
Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004