Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №3 Вариант №6

.1.doc
Скачиваний:
11
Добавлен:
20.06.2014
Размер:
510.98 Кб
Скачать

2

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ

Лабораторная работа №3

по дисциплине

«Программирование на языке высокого уровня»

на тему:

«Обработка базовых списковых структур данных»

Студент

подпись, дата

фамилия, инициалы

Группа

Принял

Фарафонов А.С.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2010

  1. Задание

Написать программу, реализующую ввод данных из текстового, двоичного файлов и с клавиатуры и вывод данных в текстовый, двоичный файл и на экран. Для хранения данных использовать заданную списковую структуру данных.

Данные представляют собой структуру из 2-х элементов. Ввод-вывод в двоичный файл осуществлять чтением-записью области памяти, занимаемой структурой. Порядок ввода-вывода определяется спецификой списковой структуры.

Количество элементов не должно быть ограничено (обязательно использовать динамическое выделение памяти).

Программа должна быть реализована в виде меню, имеющего, приблизительно, следующую структуру:

  1. Ввод

    1. Из текстового файла

    2. Из двоичного файла

    3. С клавиатуры

  2. Очистить

  3. Вывод

    1. В текстовый файл

    2. В двоичный файл

    3. На экран

  4. Выход

Вариант 6.1.

Данные

Структура

1

Название группы, кол-во студентов

1

Односвязный список

Выбор, куда добавлять/откуда читать

2

Фамилия студента, рейтинг

2

Стек

3

Название предмета, кол-во занятий

3

Очередь

4

Название товара, стоимость

4

Дек

Выбор, куда добавлять/откуда читать

5

Название книги,

кол-во страниц

5

Двусвязный список

Выбор, куда добавлять/откуда читать

6

Модель автомобиля, мощность двигателя

  1. Блок-схема

  1. Листинг программы

#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();

}

  1. Контрольный пример

  2. Выводы о проделанной работе

При выполнении данной лабораторной работы я научился работать с основными видами списковых структур данных.

  1. Список использованной литературы

  1. Шилдт Г. Искусство программирования на C++. БХВ.2005

  2. Шилдт Г. C++ Руководство для начинающих. Вильямс.2005

  3. Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004