Описание логической структуры
Московский Авиационный Институт
(государственный технический университет)
Факультет прикладной математики
Кафедра вычислительной математики и программирования
Курсовой проект
По теме
«Обработка последовательной файловой структуры»
Семестр
Задание VI
Студентка: Смирнова С.И.
Группа: 08-105, 12 вар.
Руководитель: Титов В.К.
Оценка
Дата
Москва
2012 год
Постановка задачи
Разработать последовательную структуру данных для представления простейшей базы данных на файлах СП Си в соответствие с заданным вариантом.
Составить программу генерацию нетекстового файла заданной структуры, содержащего представительный набор записей (15-20).
Распечатать содержимое генерируемого файла в виде таблицы и выполнить над ним заданное действие для 2-3 значений параметров запроса p и распечатать результат.
Действие по выборе данных из файла оформить с параметрами запроса, вводимыми из стандартного входного текстового файла, или получаемых из стандартной строки ввода UNIX. Получение параметров из командной строки производится с помощью стандартных библиотечных функций argc и argv.
Число наборов текстов должно быть не менее трех.
Задание(34 вариант):
Найти пассажиров, имеющих более p вещей.
Общий метод решения
1) Создаем тестовые файлы. Содержимое и структура файла включает:
а) фамилию, инициалы пассажира
б) количество вещей
в) общий вес вещей
г) пункт назначения
д)время вылета
е)наличие пересадки
ж)сведения о детях
Используем команды обработки текстовых файлов OC UNIX и переадресацию ввода-вывода.
2) Составляем программу генерацию внешнего нетекстового файла.
Перенапрявляем всё содержимое нетекстового представления в файл out.dat. Туда происходит постоянная дозапись. Следовательно, необходимо при повторной работе с ним в дальнейшем удалять его.
3) Распечатываем содержимое файла в виде таблицы.
4) При помощи функций printf(…) и scanf(…) задаем значение параметра p.
5) Сравниваем при помощи условия if{…} значение параметра p и число вещей каждого из пассажиров. Если число вещей данного пассажира больше p, то выводим всю информацию об этом пассажире (имя, кол-во вещей, вес вещей и т.д.)
Общие сведения о программе
Операционная система: Ubuntu 10.04 LTS Lucid Lynx
Язык программирования: C++
Полное имя программы: /home/ kp6
Компиляция и запуск программы:
g++ 6kp.cpp –o 6kp.exe
./ 6kp.exe list1
Функциональное назначение
Данная программа, преобразующая текстовой файл в нетекстовой, генерирующая внешний нетекстовой файл, распечатывающая таблицу, доказывает, что представление в нетекстовом виде очень удобна. Во-первых, в памяти компьютера хранить бинарные коды намного проще, памяти меньше занимается. Во-вторых, всевозможные операции производить с файлом в нетекстовом представлении быстрее и удобнее. К тому же нетекстовой файл хранится в оперативной памяти в таком же изначальном виде, в каком был создан файл. Таким образом, нетекстовое представление обладает большими преимуществами.
Описание логической структуры
1. Структура struct {….}; в которую мы помещаем информацию о студенте:
Имя | Тип | Назначение |
name | char | Массив для хранения имени |
numberofthings | int | Кол-во вещей |
weightofthing | float | Нецелое значение веса вещей |
destination | char | Массив для хранения пункта назначения |
time | float | Время вылета(час.мин) |
transplantation | char | Массив для хранения наличия пересадки |
children | char | Массив для хранения сведений о детях |
1)файл generation.c:
Прочитывает файл value.h и работает на основе этих данных:
Используемые функции:
void write_student(FILE* out, student s) – функция, преобразующая данные из файла (08-105, 08-106, 08-108) в нетекстовое представление текстового файла. Направляет запись в файл out.
int information_about_student(FILE* list, student* s) – функция, возвращающая указатели на фамилию, имя, отчество, пол, номер группы, оценки по предмету.
int main() – функция, печатающая содержимое файла в виде таблицы.
2)файл rabota.c:
int TR(student s) – функция, подсчитающая количество студентов, имеющих больше двух трое. Создаем счетчик q, увеличиваем его на 1, если находим студента, имеющего больше двух троек.
int read_student(FILE* list, student* s) - функция, читающая данные, записанные в нетекстовом представлении.
int main(int a, char b*[c]) -функция, печатающая таблицу. Если мы направили туда все группы, то они сольются в одну для удобной сортировки. Также тут выполняется печать второй таблицы, где представлены студенты, имеющие больше двух троек.
Входные данные
List 1:
Петров_Н.К. 6 220 Санкт-Петербург 12.50 есть нет
Березина_С.Т. 5 200 Мурманск 16.30 нет нет
Красавина_Е.И. 3 185 Киев 14.27 есть нет
Кириенко_К.В. 7 278 Саратов 15.40 есть есть
Самсонов_К.М. 5 200 Владимир 13.40 нет есть
Морозенко_Р.П. 4 190 Ростов 19.50 нет нет
Кузнецов_Г.Д. 7 270 Ворнеж 20.40 есть нет
Голубев_Н.В 3 9 250 Иваново 20.08 нет нет
Виноградова_С.М. 1 90 Иркутск 12.30 есть нет
Богданов_В.И. 2 135 Тула 05.30 нет есть
List 2:
Воробьев_Н.Д. 3 145 Калуга 09.48 нет нет
Федорова_С.Р. 4 170 Смоленск 10.45 есть нет
Михайлов_М.И. 5 167 Белгоград 07.26 нет есть
Беляев_П.Р. 1 89 Ставрополь 08.40 есть есть
Тарасова_И.Т. 2 78 Липецк 13.50 нет есть
Белов_П.Н. 4 146 Ярославль 15.40 есть нет
Комарова_Н.Р. 6 127 Брянск 17.35 нет нет
Орлова_П.Л. 5 176 Тамбов 18.35 есть есть
Киселев_Н.В. 8 198 Рязань 17.29 нет есть
Макаров_Г.Д. 9 200 Омск 19.40 есть есть
List 3:
Андреев_П.Д. 3 156 Краснодар 17.38 есть нет
Марков_Р.Т. 4 163 Москва 21.48 нет нет
Большаков_В.С. 5 153 Архангельск 22.58 есть есть
Суханова_М.Т. 2 143 Екатеринбург 17.36 нет есть
Миронов_В.Г. 6 148 Самара 14.38 есть нет
Александров_С.М. 9 207 Уфа 22.44 нет нет
Коновалов_Г.Р. 10 237 Волгоград 23.56 есть есть
Шестаков_Г.Л. 7 145 Казань 14.48 нет есть
Казаков_К.Т. 6 164 Владивосток 23.45 нет нет
Ефимов_Л.Г. 5 193 Казань 14.37 есть есть
Текст программы
#include<stdio.h>
#include<string.h>
int main(int argc, char*argv[])
{
FILE *f,*g;
struct
{ char name[30];
int numberofthings;
float weightofthing;
char destination[30];
float time;
char transplantation[10];
char children[10];
} s;
int l,i,j=0,k=0; int p;
if((f=fopen(argv[1],"r"))==NULL)
printf("Can't open input file\n");
if((g=fopen("out.dat","w+"))==NULL)
printf("Can't open output file\n");
l=sizeof(s); // printf("\nl=%d\n",l);
printf(" Список всех пассажиров \n");
printf("______________________________________________\n");
printf("| Имя инициалы | Кол-во вещей | Вес вещей | Пункт наз-ия |Время вылета|Наличие пересадки |Наличие детей|\n");
printf("|_______________|_______________|_______________|_______________|____________|__________________|_____________|\n");
while (!feof(f))
{
fscanf(f,"%s", s.name);
fscanf(f,"%d", &s.numberofthings);
fscanf(f,"%f", &s.weightofthing);
fscanf(f,"%s", s.destination);
fscanf(f,"%f", &s.time);
fscanf(f,"%s", s.transplantation);
fscanf(f,"%s", s.children);
if(feof(f)) break;
printf("|%-15s\t",s.name);
printf("|\t %d \t",s.numberofthings);
printf("| %.1f кг \t",s.weightofthing);
printf("|%-15s \t",s.destination);
printf("| %.2f\t ",s.time);
printf("| %-5s\t",s.transplantation);
printf("| %-6s\t |\n",s.children);
printf("|_______________|_______________|_______________|_______________|____________|__________________|_____________|\n");
fwrite(&s,l,1,g);
k++;
}
printf("k=%d\n",k);
rewind(g);
printf("Введите значение p:\n");
scanf("%d",&p);
printf("\n Список пассажиров, которые имеют больше,чем %d вещей\n",p);
printf("______________________________________________\n");
printf("| Имя инициалы | Кол-во вещей | Вес вещей | Пункт наз-ия |Время вылета|Наличие пересадки |Наличие детей|\n");
printf("|_______________|_______________|_______________|_______________|____________|__________________|_____________|\n");
for(i=0; i<k; i++)
{
fread(&s,l,1,g);
//printf("%s",s.name); printf("%d",s.numberofthings);
if(s.numberofthings > p)
{
printf("|%-15s\t",s.name);
printf("|\t %d \t",s.numberofthings);
printf("| %.1f кг \t",s.weightofthing);
printf("|%-15s \t",s.destination);
printf("| %.2f\t ",s.time);
printf("| %-5s\t",s.transplantation);
printf("| %-6s\t |\n",s.children);
printf("|_______________|_______________|_______________|_______________|____________|__________________|_____________|\n");
}
}
if(i==0){
printf("Нет пассажиров, которые имеют больше %d вещей\n",p);}
fclose(f);
fclose(g);
}
Дневник отладки
№ | Лаб | Дата | Вре-мя | Событие | Действие по исправлению | Примечание |
1. | лаб. | 29.04 | 16.00 | Сведения о пассажирах выдавались в виде списка, а не в виде таблицы. | ||
дом | 02.05 | 18.30 | Про if(i=0) |
Выводы по задаче
В данной курсовой работе я научилась составлять программу на языке Си , преобразцющую файл в нетекстовой. Осущиствила работу с этим нетекстовым файлом, нашла количество, студентов, получивших больше двух троек. Фактически была осуществлена небольшая сортировка таблицы. Оказалось очень удобным представлять файл в нетекстовом виде. Нетекстовой файл хранится в оперативной памяти в таком же изначальном виде, в каком был создан файл. Таким образом, нетекстовое представление обладает большими преимуществами.