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

Лабораторная работа №3 (Вариант 3.2, стек)

.docx
Скачиваний:
21
Добавлен:
20.06.2014
Размер:
213.94 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

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

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

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

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

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

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

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

на тему:

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

Студент

Ключанских А.С

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

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

Группа

АС-10

Принял

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

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

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

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

Липецк 2011

  1. Задание

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

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

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

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

  1. Ввод

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

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

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

  2. Очистить

  3. Вывод

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

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

    3. На экран

  4. Выход

Вариант 3.2

Данные

Структура

1

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

1

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

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

2

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

2

Стек

3

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

3

Очередь

4

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

4

Дек

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

5

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

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

5

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

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

6

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

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

#include <stdio.h>

#include <locale.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

struct stack {

char lesson[20];

int number;

struct stack *prev;

}*head=NULL; // изначально стек пустой!

FILE *fp;

void Push(struct stack **head,char *str,int x){

struct stack *temp=*head;

*head=(struct stack *)malloc(sizeof(struct stack));

strcpy((*head)->lesson,str);

(*head)->number=x;

(*head)->prev=temp;

}

struct stack *Pop(struct stack **head)

{

if(*head==NULL)

{

printf("\nСтек исчерпан!\n");

return NULL;

}

struct stack *ptr=*head;

*head=(*head)->prev;

//free(ptr);

return ptr;

}

void Clear(struct stack **head){

if(!*head){

printf("\nСтек итак пуст!\n");

return;

}

while(*head) Pop(head);

printf("\nСтек успешно очищен!\n");

}

int main(void){

setlocale(LC_ALL,"Russian");

char ch,string[]="";

int n,i=0,j=0;

struct stack *p;

printf("Что вы хотите делать?\n1. Ввод из текстового файла.\n2. Ввод из двоичного файла.\n3. Ввод с клавиатуры.\n4. Очистить стек.\n5. Вывод в текстовый файл.\n6. Вывод в двоичный файл.\n7. Вывод на экран.\n8. Выход из программы.\n");

do{

ch=getche();

switch(ch){

case '1'://ввод из текстового файла

fp=fopen("text.txt","r");

if(!fp){

printf("\nНевозможно открыть текстовый файл!\n");

break;

}

while(!feof(fp))

{

fscanf(fp,"%s%d\n",string,&n);

Push(&head,string,n);

}

printf("\nВсе записи успешно добавлены в стек!\n");

fclose(fp);

break;

case '2'://ввод из двоичного файла

fp=fopen("binary.txt","rb");

if(!fp){

printf("\nНевозможно открыть бинарный файл!\n");

break;

}

struct stack *x;

x=(struct stack *)malloc(sizeof(struct stack));

while(!feof(fp))

{

fread(x,sizeof(struct stack),1,fp);

Push(&head,x->lesson,x->number);

}

printf("\nВсе записи успешно добавлены в стек!\n");

fclose(fp);

break;

case '3'://ввод с клавиатуры

printf("\nВведите название предмета: ");

scanf("%s",string);

printf("Введите количество занятий: ");

scanf("%d",&n);

Push(&head,string,n);

printf("Новая запись успешно добавлена в стек!\n");

break;

case '4'://очистить стек

Clear(&head);

break;

case '5'://вывод в текстовый файл

fp=fopen("text.txt","a+");

do{

p=Pop(&head);

if(p){

fprintf(fp,"%s %d\n",p->lesson,p->number);

i++;

}

}while(p);

printf("%d Записей добавлено в текстовый файл.\n",i);

fclose(fp);

break;

case '6'://вывод в двоичный файл

fp=fopen("binary.txt","a+b");

do{

p=Pop(&head);

if(p){

fwrite(p,sizeof(struct stack),1,fp);

j++;

}

}while(p);

printf("%d Записей добавлено в бинарный файл.\n",j);

fclose(fp);

break;

case '7'://вывод на экран

do{

p=Pop(&head);

if(p)printf("\nНазвание предмета: %s\nКоличество занятий: %d",p->lesson,p->number);

}while(p);

break;

case '8': //выход

printf("\nЖелаю удачи!\n");

exit(0);

default: printf("\nВведите число от 1 до 8!\n");

}

}while(ch!='8');

return 0;

}

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

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

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

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

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

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

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