Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Дополнительное задание №6. Обработка структур с использованием файлов




 

     Цель работы: изучить правила создания и обработки данных структурного типа с использованеием файлов. Написать и отладить программу по созданию файлов.

 

Теоретические сведения

Структура объединяет логически связанные данные разных типов. Структурный тип данных определяется описанием шаблона:

              struct Рerson {

        char Fio[30];

     double sball;

          };

Объявление переменных созданного структурного типа:

Person Stud, *p_Stud;       

     Обращение к элементам структур производится посредством:

1) операции принадлежности ( .) в виде:

     ID_структуры . ID_поля или (*указатель) .ID_поля

2) операции косвенной адресации (–>) в виде:

              указатель –> ID_поля или &(ID_структуры) . ID_поля

Для приведенного выше примера

     1) Stud.Fio = “Иванов А.И.”;          //Инициализация данных

              Stud.sball = 5.75;

     2) р_Stud –> Fio = “Иванов А.И.”;   

              р_Stud –> sball =5.75;

В языке C/С++ файл рассматривается как поток (stream), представляющий собой последовательность считываемых или записываемых байт. При этом последовательность записи определяется самой программой.

Работа с файлами

Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки и пересылке как единое целое. Прототипы большинства функций по обработке файлов описаны в библиотеках stdio.h и io.h.

Прежде чем работать с файлом, его нужно открыть для доступа, т.е. создать и инициализировать область данных, которая содержит информацию о файле: имя, путь и т.д. В языке С/С++ это выполняет функция fopen(), которая связывает физический файл на носителе с логическим именем в программе. Логическое имя – это указатель на файл, т.е. на область памяти, где хранится информация о файле. Указатели на файлы необходимо декларировать:

                        FILE  *указатель на файл;

Формат функции

                        fopen( “строка 1” , “строка 2” );

в строке 1 указывается место, в которое мы собираемся поместить файл, например: “d:\\work\\sved.txt” – файл с именем sved.txt, который будет находиться на диске d, в папке work; если путь к файлу не указывать, то он будет размещен в рабочей папке проекта.

В строке 2 указывается код открытия файла:

w – для записи, если файла с заданным именем нет, то он будет создан, если же такой файл существует, то перед открытием прежняя информация уничтожается;

r – для чтения; если файла нет, то возникает ошибка;

a – для добавления новой информации в конец;

r+, w+ – возможны чтение и запись информации;

a+ – то же, что и для a, только запись можно выполнять в любое место файла, доступно и чтение файла.

По умолчанию файл открывается в текстовом режиме (t), указав b – файл открывается в двоичном режиме.

Если при открытии файла произошла ошибка, функция fopen возвращает значение NULL.

После работы доступ к файлу необходимо закрыть с помощью функции fclose(указа­тель файла), например, fclose ( f );

Для закрытия нескольких файлов введена функция: void fcloseall(void);

Приведем пример минимального набора операторов, необходимых для корректной работы с файлом:

#include <stdio.h>

              . . .

     FILE *f_my;

              if( ! ( f_my = fopen(“rez.txt”, “r+t” ) ) ) {

                        puts(“\n Ошибка открытия файла!”);

                   return;

              }

              . . .                   //   Работа с файлом

     fclose(f_my);

              . . .

Для работы с текстовыми файлами в консольном приложении удобнее всего пользоваться функциями fprintf() и fscanf(), параметры и выполняемые действия аналогичны функциям printf() и scanf(), (см. лаб.раб.№1), только первым параметром добавлен указатель файла, к которому применяется данная функция.

     Функции работы с текстовыми файлами удобны при создании результирующих файлов для отчетов по лабораторным и курсовым работам.

Для создания баз данных удобнее пользоваться функциями работы с бинарными файлами. Рассмотрим некоторые из них, обозначив указатель файла – fp (FILE *fp;):

1) int fread(void *ptv, int size, int n, fp) – считывает n блоков по size байт каждый из файла fp в область памяти, на которую указывает ptv (необходимо заранее отвести память под считываемый блок);

2) int fwrite(void *ptv, int size, int n, fp) – записывает n блоков по size байт каждый из области памяти, на которую указывает ptv в файл fp;

3) int fileno(fp) – возвращает значение дескриптора файла fp (дескриптор –число, определяющее номер файла);

4) long filelength(int дескриптор) – возвращает длину файла в байтах;

5) int chsize(int дескриптор, long pos) – выполняет изменение размера файла fp, признак конца файла устанавливается после байта с номером pos;  

6) intfseek(fp, long size, int kod) – выполняет смещение указателя на size байт в направлении признака kod: 0 – от начала файла; 1 – от текущей позиции; 2 – от конца файла;

7) long ftell(fp) – возвращает значение указателя на текущую позицию файла fp (-1 – ошибка);

8) intfeof(указатель файла) – возвращает ненулевое значение при правильной записи признака конца файла;

9) intfgetpos(указатель файла, long *pos) – определяет значение текущей позиции pos файла; при успешном завершении возвращает значение 0.

 

Пример выполнения задания

         

Написать программу обработки файла, содержащего информацию о рейтинге студентов. Каждая запись должна содержать Ф.И.О. и полученный балл рейтинга. Вывести информацию, отсортированную в порядке увеличения рейтинга. Результаты выполнения программы сохранить в текстовом файле. При работе с файлом должны быть выполнены следующие действия: создание, просмотр, добавление новой записи, сортировка, сохранение результатов.

Для создания текстового файла в консольном приложении используем функцию fprintf(). Текст программы может иметь следующий вид:

. . .

#include <stdio.h>

#include <io.h>

. . .

struct TZap{

char FIO[30];

double s_b;

} Zap;

int size = sizeof(TZap);

FILE *Fz, *Ft;

char File_Zap[] = "zapisi.dat";

char File_Rez[] = "rezult.txt";

void Out(TZap);

 

void main()

{

     int kod, D_f, i=0, j, kol;

     long len;

     TZap st, *mas_Z;

Ft = fopen(File_Rez, "w");

     while(true) {

   puts("\n Create – 1\n Add – 2\n View – 3\n Sort – 4\n EXIT – 0");

   scanf("%d", &kod);

   switch(kod) {

         case 1:

                   if ((Fz=fopen(File_Zap,"wb"))==NULL) {

                            puts("\n Create ERROR!");

                            return;

                   }

                   fclose(Fz);

                   printf("\n Create New File %s !\n",File_Zap);

         break;

         case 2:

                   Fz = fopen(File_Zap,"ab");

                   printf("\n F.I.O. – ");

                   fflush(stdin);                 

                                 gets(Zap.FIO);

                   printf(" Ball – ");       

                                 scanf("%lf", &Zap.s_b);

                   fwrite(&Zap, size, 1, Fz);

                   fclose(Fz);

         break;

         case 3:

                   if ((Fz=fopen(File_Zap,"rb"))==NULL) {

                            puts("\n Open ERROR!");

                            return;

                   }

// Вывод на экран

                     printf("\n\t--------- Informations ---------");

// Запись такой же информации в текстовый файл Ft

                   fprintf(Ft,"\n\t--------- Informations ---------");

                   while(1) {

                          if(!fread(&Zap,size,1,Fz)) break;

                           Out(Zap);

                   }

                   fclose(Fz);

         break;

         case 4:

                   Fz = fopen(File_Zap,"rb");

                   D_f = fileno(Fz);

                                 len = filelength(D_f);

                                 kol = len/size;

                                 mas_Z = new TZap[kol];

// Считываем записи из файла в динамический массив

                   for (i=0; i < kol; i++)                        

                            fread((mas_Z+i), size, 1, Fz);

                   fclose(Fz);

                            printf("\n\t----- S O R T -----\n");

                           fprintf(Ft,"\n\t----- S O R T -----\n");

                            for (i=0; i < kol-1; i++)

                                      for (j=i+1; j < kol; j++)

                                                         if (mas_Z[i].s_b > mas_Z[j].s_b) {

                                                    st = mas_Z[i];

                                                              mas_Z[i] = mas_Z[j];

                                                              mas_Z[j] = st;

                                                         }

                                    for (i=0; i<kol; i++) 

                                                     Out(mas_Z[i]);

                           delete []mas_Z;

                   break;

         case 0:

                   fclose(Ft);

                   return;

       }

}

}

//----------------- Функция вывода одной записи на экран и в файл --------------------

void Out(TZap z)

{

printf("\n %20s , %6.3lf .", z.FIO,z.s_b);

fprintf(Ft, "\n %20s , %6.3lf .", z.FIO, z.s_b);

}

 

Первоначально выбав пункт «1», создаем файл с именем zapisi.dat, который будет располагаться в текущем каталоге (созданной папке). Затем, выбирая пункт «2», последовательно вводим 4 записи. Выбрав пункт «3», просматриваем содержимое файла, а сортированные записи выведем на экран (запишем в файл), выбрав пункт «4». Результаты выполнения программы могут иметь вид:

Индивидуальные задания

Написать программу обработки файла типа запись, содержащую следующие пункты меню: «Создание», «Просмотр», «Коррекция» (добавление новых данных или редактирование старых), «Решение индивидуального задания».

Каждая запись должна содержать следующую информацию о студентах:

– фамилия и инициалы;

– год рождения;

– номер группы;

– оценки за семестр: по физике, математике, информатике, химии;

– средний балл.

Организовать ввод исходных данных, средний балл рассчитать по введенным оценкам.

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

 

1. Распечатать анкетные данные студентов, сдавших сессию на 8, 9 и 10.

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

3. Распечатать анкетные данные студентов-отличников из интересующей вас группы.

4. Распечатать анкетные данные студентов, фамилии которых начинаются с буквы А, и сдавших математику на 8 или 9.

5. Распечатать анкетные данные студентов, имеющих оценки 4 или 5 по физике и оценку больше 8 по остальным предметам.

6. Распечатать анкетные данные студентов интересующей вас группы. Фамилии студентов начинаются с букв В, Г и Д.

7. Распечатать анкетные данные студентов, не имеющих оценок меньше 4 по информатике и математике.

8. Вычислить общий средний балл всех студентов и распечатать список студентов со средним баллом выше общего среднего балла.

9. Вычислить общий средний балл всех студентов и распечатать список студентов интересующей вас группы, имеющих средний балл выше общего среднего балла.

10. Распечатать анкетные данные студентов интересующей вас группы, имеющих неудовлетворительную оценку (меньше 4).

11. Распечатать анкетные данные студентов интересующей вас группы, имеющих оценку 9 или 10 по информатике.

12. Распечатать анкетные данные студентов, имеющих оценки 7 или 8 по физике и оценки 9 или 10 по высшей математике.

13. Вычислить общий средний балл студентов интересующей вас группы и распечатать список студентов этой группы, имеющих средний балл выше общего.

14. Распечатать анкетные данные студентов-отличников интересующей вас группы.

15. Распечатать анкетные данные студентов интересующей вас группы, имеющих средний балл выше введенного с клавиатуры.

16. Распечатать анкетные данные студентов интересующей вас группы, имеющих оценку 8 по физике и оценку 9 по высшей математике.


 

Приложение. Операции языка С/С++

 

1. Операции приведены в порядке убывания приоритета, операции с разными приоритетами разделены чертой.

Опера­ция Краткое описание Использование Выполне-ние

Первичные (унарные) операции

. Доступ к члену объект . член

Слева

направо

-> Доступ по указателю указатель -> член
[ ] Индексирование переменная [выражение]
( ) Вызов функции ID(список)

Унарные операции

++ Постфиксный инкремент lvalue++

Справа

налево

-- Постфиксный декремент lvalue--
sizeof Размер объекта (типа) sizeof(ID или тип)
++ Префиксный инкремент ++lvalue
-- Префиксный декремент --lvalue
~ Побитовое НЕ ~выражение
! Логическое НЕ !выражение
- (+) Унарный минус (плюс) - (+)выражение
* Разадресация указателя *выражение
& Адрес &выражение
() Приведение типа (тип)выражение

Бинарные и тернарная операции

* Умножение выражение * выражение

Слева

направо

/ Деление выражение / выражение
% Получение остатка выражение % выражение
+ ( - ) Сложение (вычитание) выражение + (-) выражение
<< Сдвиг влево выражение << выражение
>> Сдвиг вправо выражение >> выражение
< Меньше выражение < выражение
<= Меньше или равно выражение <= выражение
> Больше выражение > выражение
>= Больше или равно выражение >= выражение
== Равно выражение == выражение
!= Не равно выражение != выражение
& Побитовое И выражение & выражение
^ Побитовое исключ. ИЛИ выражение ^ выражение
| Побитовое ИЛИ выражение | выражение
&& Логическое И выражение && выражение
|| Логическое ИЛИ выражение || выражение

 

 

Опера­ция Краткое описание Использование Выполне-ние
?: Условная операция (тернарная) выражение ? выражение : выражение

 

 

Справа

налево

 

= Присваивание lvalue = выражение
*= Умножение с присваиванием lvalue *= выражение
/= Деление с присваиванием lvalue /= выражение
%= Остаток от деления с присв-м lvalue %= выражение
+= Сложение с присваиванием lvalue += выражение
- = Вычитание с присваиванием lvalue -= выражение
<<= Сдвиг влево с присваиванием lvalue <<= выражение
>>= Сдвиг вправо с присваиванием lvalue >>= выражение
&= Поразрядное И с присваив-м lvalue &= выражение
|= Поразрядное ИЛИ с присв-м lvalue |= выражение
^= Поразрядное ИСКЛЮЧАЮ­ЩЕЕ ИЛИ с присваиванием lvalue ^= выражение
, Последовательное вычисление выражение, выражение Слева направо

 





Основная литература

 

1. Батура М.П., Бусько В.Л., Корбит А.Г., Кривоносова Т.М. Основы алгоритмизации и программирования. Язык Си : учеб. пособие. – Минск : БГУИР, 2007.  

2. Бусько В.Л., Корбит А.Г., Кривоносова Т.М. Конспект лекций по курсу «Основы алгоритмизации и программирования» для студентов всех специальностей и всех форм обучения. - Мн.: БГУИР, 2004.

3. Бусько В.Л., Карцев В.Т., Кривоносова Т.М., Навроцкий А.А. Основы программирования в среде С++ Builder: лаб.практикум по курсу «Основы алгоритмизации и программирования» для студ. 1 – 2-го курсов БГУИР. В 2 ч. Ч.1 . – Минск: БГУИР, 2007.

Дополнительная литература

 

     1. Керниган, Б. Язык программирования СИ / Б. Керниган, Д. Ритчи. – М.: Финансы и статистика, 1992.

     2. Страуструп, Б. Язык программирования C++ / Б. Страуструп: 2-е изд.: В 2 т. – Киев: ДиаСофт, 1993.

3. Демидович, Е. М. Основы алгоритмизации и программирования. Язык СИ / Е. М. Демидович. – Минск : Бест­принт, 2001.

4. Шилд, Г. Программирование на Borland С++ / Г. Шилд. – Минск : ПОПУРРИ, 1999.

 


* Синус гиперболический, а в следующей строке – косинус гиперболический.

* Значение Т вводится с клавиатуры.










Последнее изменение этой страницы: 2018-04-12; просмотров: 445.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...