Лабораторная работа №3 (Вариант 3.2, стек)
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №3
по дисциплине
«Программирование на языке высокого уровня»
на тему:
«Обработка базовых списковых структур данных»
|
Студент |
|
|
|
Ключанских А.С |
|
|||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
|||||||||
|
Группа |
|
АС-10 |
|
|
|
|||||||||
|
|
|
|
|
|
|
|||||||||
|
Принял |
|
|
|
|
|
|||||||||
|
|
|
|
|
Фарафонов А.С. |
|
|||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2011
-
Задание
Написать программу, реализующую ввод данных из текстового, двоичного файлов и с клавиатуры и вывод данных в текстовый, двоичный файл и на экран. Для хранения данных использовать заданную списковую структуру данных.
Данные представляют собой структуру из 2-х элементов. Ввод-вывод в двоичный файл осуществлять чтением-записью области памяти, занимаемой структурой. Порядок ввода-вывода определяется спецификой списковой структуры.
Количество элементов не должно быть ограничено (обязательно использовать динамическое выделение памяти).
Программа должна быть реализована в виде меню, имеющего, приблизительно, следующую структуру:
-
Ввод
-
Из текстового файла
-
Из двоичного файла
-
С клавиатуры
-
-
Очистить
-
Вывод
-
В текстовый файл
-
В двоичный файл
-
На экран
-
-
Выход
Вариант 3.2
Данные |
Структура |
||||
1 |
Название группы, кол-во студентов |
1 |
Односвязный список |
Выбор, куда добавлять/откуда читать |
|
2 |
Фамилия студента, рейтинг |
2 |
Стек |
|
|
3 |
Название предмета, кол-во занятий |
3 |
Очередь |
|
|
4 |
Название товара, стоимость |
4 |
Дек |
Выбор, куда добавлять/откуда читать |
|
5 |
Название книги, кол-во страниц |
5 |
Двусвязный список |
Выбор, куда добавлять/откуда читать |
|
6 |
Модель автомобиля, мощность двигателя |
|
|
|
-
Листинг программы
#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;
}
-
Контрольный пример
-
Выводы о проделанной работе
При выполнении данной лабораторной работы я научился работать с основными видами списковых структур данных, а также улучшил навыки работы с файловой системой языка Си.
-
Список использованной литературы
-
Шилдт Г. Искусство программирования на C++. БХВ.2005
-
Шилдт Г. C++ Руководство для начинающих. Вильямс.2005
-
Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004