Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Здесь производится попытка прочитать 5 записей о рабочих в переменную buf из файла, связанного с переменной fw. Реально прочитанное число записей сохраняется в х. Функцию можно использовать и без оператора присваивания:

fread(&buf, sizeof(buf), 5, fw);

fwrite – записывает блок данных в поток.

Формат вызова функции:

fwrite (АдресБуфера, РазмерЗаписи, ЧислоЗаписей, ФайловаяПеременная);

Пример:

unsigned x;

worker buf;

x = fwrite(&buf, sizeof(buf), 5, fw);

Здесь производится попытка записать 5 записей о рабочих в переменную buf из файла, связанного с переменной fw. Реально записанное число записей сохраняется в х. Функцию можно использовать и без оператора присваивания:

fwrite(&buf, sizeof(buf), 5, fw);

fseek – изменяет указатель позиции файла на указанное место.

Чтение и запись в файл необязательно делать последовательно, можно это делать непосредственно доступом к нужному элементу файла посредством функции fseek(), которая устанавливает указатель позиции файла в нужное место. Прототип этой функции:

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

fseek (Файловая_переменная, Смещение_в_байтах, точка_отсчета);

Точка отсчета задается одной из 3 констант:

начало файла SEEK_SET 0;

текущая позиция SEEK_CUR 1;

конец файла SEEK_END 2;

Смещение в байтах может быть положительным или отрицательным. При вычислении размера смещения все части выражения должны быть приведены к типу long int. Например, сместиться на 2 записи назад от текущей позиции:

fseek(fw, - long(2*sizeof(buf), SEEK_CUR);

НЕ нашли? Не то? Что вы ищете?

fseek возвращает 0 если указатель успешно перемещен, и ненулевое значение при ошибке, поэтому функцию можно использовать в проверке условия или присваивании.

ftell – возвращает текущую позицию в файле (номер байта).

Использование:

long pos = ftell(fw);

feof – определяет, достигнут ли конец файла.

При считывании двоичного файла определить наличие конца файла не удается. Для определения конца файла служит функция feof() с прототипом:

int feof (FILE * tptr);

Следующая конструкция читает двоичный файл до конца файла (по байтам):

while (!feof (fptr)) { ch=getc(fptr); }

Следующий фрагмент считывает из файла все записи выводит на экран фамилии рабочих:

while (!feof (fw)) {

fread(&buf, sizeof(buf), 1, fw);

printf(”%s\n”,buf. name);

}

Общие принципы работы с файлами записей:

Сначала нужно создать файл с помощью программы. В ней должна быть предусмотрена функция добавления записи. Ввод записи с клавиатуры целиком невозможен, поэтому каждое поле (если оно не структурное), нужно вводить отдельно по запросу или заполняя экранную форму. Сформированная структура записывается в файл целиком.

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

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

Ниже приводится пример коррекции существующего файла о результатах Олимпиады. Запись содержит строковое поле для названия страны и массив из 3 чисел для медалей разного достоинства. Сначала определяется количество записей в файле с помощью оригинальной функции и выводятся результаты в виде таблицы. Затем пользователь может ввести название страны и откорректировать данные. Если такая страна в файле не будет найдена, она добавляется в конец файла. Если пользователь введет минус вместо названия страны, процесс коррекции заканчивается.

#include <stdio. h>

#include <conio. h>

#include <stdlib. h>

#include <string. h>

char* medal[]={"Gold","Silver","Bronse"};

typedef struct {

char name[16];

int res[3];

} sport;

long frecount(char* fn, int n) { // Определение числа записей

FILE *f;

long x;

if ((f=fopen(fn,"rb"))==NULL) {

puts("Не могу открыть файл!"); exit(1); }

fseek(f,0L,2);

x=ftell(f)/n;

fclose(f);

return x;

}

void main() {

clrscr();

sport s;

char mdf, country[16];

int p, x,k, mf;

FILE *f1;

long r, nr=frecount("ol. dat",sizeof(sport));

printf("Число записей в файле - %lu\n",nr);

// Вывод записей в виде таблицы

printf("Страна Золото Серебро Бронза\n");

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

if ((f1=fopen("ol. dat","rb"))==NULL) {

puts("Не могу открыть файл!"); exit(1); }

if (!feof(f1)) fread(&s, sizeof(s),1,f1);

while (!feof(f1)) {

printf("%-15s",s. name);

for (k=0; k<3; k++) {

printf("%10d",s. res[k]); }

printf("\n");

fread(&s, sizeof(s),1,f1);

}

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

fclose(f1);

// Коррекция и добавление записей

if ((f1=fopen("ol. dat","r+b"))==NULL) {

puts("Не могу открыть файл!"); exit(1); }

do { // бесконечный цикл коррекции

p=0;

printf("Страна: ");

scanf("%15s",country);

if (country[0]=='-') break; // выход из цикла коррекции

rewind(f1);

if (!feof(f1)) fread(&s, sizeof(s),1,f1);

while (!feof(f1)) { // цикл поиска страны в файле

if (strcmp(s. name, country)==0) {

p=1;

printf("%-15s",s. name);

for (k=0; k<3; k++) {

printf("%10d",s. res[k]); }

printf("\n");

printf("Новые данные:\n");

for (k=0; k<3; k++) {

printf("%s: ",medal[k]);

scanf("%d",&x);

s. res[k]=x;

}

fflush(f1);

r=ftell(f1);

rewind(f1);

fseek(f1,r-long(sizeof(s)),1);

fwrite(&s, sizeof(s),1,f1);

break;

}

fread(&s, sizeof(s),1,f1);

} // while

if (!p) { // Новая страна - добавление

printf("Страна: ");

printf("%-15s",country);

strcpy(s. name, country);

printf("Медали:\n");

for (k=0; k<3; k++) {

printf("%s: ",medal[k]);

scanf("%d",&x);

s. res[k]=x;

}

fseek(f1,0L,2);

fwrite(&s, sizeof(s),1,f1);

}

} while (1); // конец бесконечного цикла

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

fclose(f1);

getch();

}

Следующая программа организует запись блоком в файле строки (символьного массива), а также чтение и вывод на экран записанной информации.

#include <string. h>

#include <stdio. h>

void main (){

FILE*stream;

char msg [] =’this is a test’;

char buf [20];

if ((stream = fopen(‘DUMMY. FIL’, “w+”)) ==NULL) {

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

return;

}

// запись строки в файл

fwrite (msg, strlen(msg)+1, 1, stream);

// установка указателя на начало файла

fseek (stream, 0, SEEK SET);

// чтение строки из файла

fread (buf, strlen (msg)+1, 1, stream);

printf (‘%s\n’, buf);

fclose (stream);

В этой программе поток открывается в режиме “w+” (создание для записи с последовательным чтением). Поэтому закрывать файл во время записи не потребовалось.

Задания для подготовки к работе

1.  Изучите основную терминологию, связанную с файлами, потоками и структурами.

2.  Изучите режимы открытия файлов, способы доступа к данным, возможности языка программирования по обработке файлов с прямым доступом.

3.  Разработайте алгоритм и программу в соответствии с заданием.

Задания к работе

Создать программу для работы с файлом записей согласно варианта. Работа с файлом должна осуществляться через меню, в котором должны быть следующие пункты:

-  Показать все записи; (в виде таблицы)

-  Добавить запись;

-  Удалить запись;

-  Изменить запись;

-  Поиск записи (по каким-то критериям);

-  Сортировка записей (по какому-то одному полю).

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

В программе можно использовать вспомогательный массив записей (как буфер) только в том случае, если количество записей в файле будет больше.

Для испытаний заполнить файл 15-20 записями.

Варианты заданий.

1.  Создать файл, содержащий сведения о месячной заработной плате рабочих завода. Каждая запись содержит поля – фамилии рабочего, наименование цеха, размер заработной платы за месяц.

2.  Создать файл, содержащий сведения о количестве изделий, собранных сборщиками цеха за неделю. Каждая запись содержит поля: фамилия сборщика, количество изделий, собранных им ежедневно в течение шестидневной недели, т. е. раздельно - в понедельник, вторник и т. д.

3.  Создать файл, содержащий сведения о количестве изделий категорий А, В, С, собранных рабочим за месяц. Количество записей - произвольное.

4.  Создать файл, содержащий сведения о телефонах абонентов. Каждая запись имеет поля: фамилия абонентов, год установки телефона, номер телефона.

5.  Создать файл, содержащий сведения об ассортименте игрушек в магазине. Структура записи: название игрушки, цена, количество, возрастные границы, например 2-5, т. е. от 2 до 5 лет.

6.  Создать файл, содержащий сведения о сдаче студентами 1 курса кафедры КиПР сессии. Структура записи: индекс группы, фамилия студента, оценки по пяти экзаменам, признак участия в общественной работе: «1»- активное участие, «0»- неучастие.

7.  Создать файл, содержащий сведения о сдаче студентами сессии. Структура записи: индекс группы, фамилия студента, оценки по пяти экзаменам и пяти зачетам («з» означает зачет, «н» - незачет).

8.  Создать файл, содержащий сведения о личной коллекции книголюба. Структура записи: шифр книги, автор, название, год издания, местоположение (номер стеллажа, шкафа и т. п.).

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

10.  Создать файл, содержащий сведения об ассортименте обуви в магазине фирмы. Структура записи: артикул, наименование, количество, стоимость одной пары. Количество записей - произвольное. Артикул начинается с буквы Д для дамской обуви, М для мужской, П для детской.

11.  Создать файл, содержащий сведения о десяти нападающих хоккейных команд «Динамо» и «ЦСКА» соответственно: имена нападающих, число заброшенных ими шайб, сделанных голевых передач, заработанное штрафное время.

12.  Создать файл, содержащий сведения о том, какие из пяти предлагаемых дисциплин по выбору желает слушать студент. Структура записи: фамилия студента, индекс группы, 5 дисциплин, средний балл успеваемости. Выбираемая дисциплина отмечается символом 1, иначе – пробел.

13.  Создать файл, содержащий сведения об отправлении поездов дальнего следования с Казанского вокзала. Структура записи: номер поезда, станция назначения, время отправления, время в пути, наличие билетов.

14.  Создать файл, содержащий сведения о сотрудниках института. Структура записи: фамилия работающего, название отдела, год рождения, стаж работы, должность, оклад.

15.  Создать файл, содержащий сведения о пациентах глазной клиники. Структура записи: фамилия пациента, пол, возраст, место проживания (город), диагноз.

Содержание отчета

Отчет должен содержать:

Тексты заданий (по вариантам);

Тексты программ с комментариями;

Протоколы работы программ;

Выводы по работе.

Контрольные вопросы.

1.  Объяснить, что означают следующие термины: файл, запись, метод доступа, структура записи?

2.  Каково назначение операторов открытия и закрытия файлов?

3.  Допустимы ли различные типы данных для элементов одной записи?

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

5.  Как распознать конец файла данных?

6.  Как работать с файлом, который кроме записей имеет заголовок, описывающий структуру записи?

Литература

1.  . С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2002. – 464с.

2.  , . С/С++. Структурное программирование: практикум. – СПб.: Питер, 2002. – 240с.

3.  Митницкий теории алгоритмов и язык программирования С. Учебное пособие. –М.: МФТИ, 2001. – 180с.

4.  Могилев А. В. и др. Информатика. М.: Изд. центр “Академия”, 2000. – 816 с.

5.  Подбельский С++: Учебное пособие. – М.: Финансы и статистика, 2002 – 560с.

6.  , Фомин на языке Си. – М.: Финансы и статистика, 2002 – 600с.

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

Обработка текстовых файлов

Цели работы:

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

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

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

Файл в языке Си – это понятие, которое может быть приложено ко всему от файла на диске до устройства ввода-вывода. Стандарт ANSI языка Си связывает каждое из устройств с логическим устройством, называемым потоком. Так как потоки не зависят от физических устройств, одна и та же функция может записывать информацию на диск, магнитную ленту или выводить ее на экран, принтер.

В языке Си существует два типа потоков: текстовый (text) и двоичный (binary).

Текстовый поток – это последовательность символов. Для него нет взаимооднозначного соответствия между символами, которые передаются в потоке и выводятся на экран. Буква соответствует букве, но пара символов может соответствовать возврату каретки.

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

Текстовый файл можно рассматривать и как текстовый, и как двоичный, а двоичный как текстовый – нельзя.

Под текстовым файлом здесь и далее будем понимать устройство, связанное с текстовым потоком (клавиатуру, экран, принтер) или файл, не содержащий вместе с текстом рисунков и других внедренных объектов. Такие файлы создаются в большинстве редакторов, работающих в среде MS DOS, или в редакторе Блокнот из стандартного набора программ Windows. В DOS и Windows отличается кодировка русских букв.

Текстовый файл является файлом последовательного доступа. Его можно рассматривать, как совокупность строк разной длины. Поэтому нельзя одной командой переместить указатель в файле на 5-ю строку или 326 слово. Можно сделать это, последовательно считывая информацию от начала файла до нужного места. Хотя в Си и можно переместить указатель на определенное количество байт функцией fseek, делать это рекомендуется только если файл открыт для чтения и нужно быть осторожным, так как некоторые символы могут занимать больше одного байта.

Текст в файле может иметь какую угодно структуру: обычный текст (несколько абзацев), текст программы (в том числе на языке Си), таблица записей. Фрагменты текстового файла могут иметь разную структуру.

Если есть четкие соглашения о формате файла (расположении данных), всегда можно написать программу для его чтения или коррекции.

Из текстового потока можно считывать любые числа, символы и строки. Записывать можно любые числа, символы, строки и логические значения (TRUE и FALSE, если они поддерживаются версией языка программирования).

Если текстовый файл, начиная с определенной строки, содержит однотипные записи, можно объявить в программе переменную типа struct, и считывать данные из файла в поля записи.

Запись – это структура данных, которая может содержать несколько полей. У каждого поля может быть свой тип данных (числовой, строка, массив, другая запись, ...). Каждое поле занимает фиксированный размер, а в памяти они хранятся последовательно друг за другом. Группа таких записей может храниться в двоичном файле или массиве. Зная общий размер записи, можно перемещаться по файлу к нужной записи.

Описание в программе указанной выше структуры о рабочем лучше выполнить следующим образом:

typedef struct {

char name[15]; // фамилия

unsigned int tab; // табельный номер

unsigned char q; // разряд

char prof[20]; // профессия

} worker;

Размер этой записи можно определить с помощью операции sizeof(worker).

Работа с файлом состоит из нескольких этапов:

-  Открытие файла в определенном режиме (чтение, запись, чтение и запись, создание...) и связывание его с именем дискового файла или устройства;

-  Операции чтения-записи;

-  Закрытие файла. (при этом происходит сохранение изменений на диске).

Рассмотрим основные функции для работы с файлами.

fopen - открытие файла. Данная функция выполняет два действия:

1) Открывает поток и связывает файл на диске с этим потоком.

2) Возвращает указатель, ассоциируемый с этим файлом.

Прототип функции: FILE* fopen (char*filename, char*mode);

где

filename - это строка, содержащая имя открываемого файла;

mode - это строка, содержащая режим открываемого файла.

Возможные режимы открытия текстовых файлов:

“rt” – открыть текстовый файл только для чтения.

“wt” – создать новый текстовый файл для записи.

“at” - открыть текстовый файл для добавления в конец файла.

“r+t” – открыть текстовый файл для чтения и записи.

“w+t” – создать новый текстовый файл для чтения и записи.

“a+t” – открыть текстовый файл для добавления или создать для чтения и записи.

Если файл открыт для записи, то существующий файл уничтожается и создается новый. При открытии файла для чтения требуется чтобы он существовал. В случае открытия для чтения и записи существующий файл не уничтожается, однако создается, если он не

существует.

Чтобы объявить указатель на файл используется оператор FILE* ИмяПеременной.

Пример:

FILE* fw; // объявление файловой переменной

fw=fopen(”work. dat”, ”w”); // создание нового файла для записи

Наиболее часто используются режимы «rt», «wt», «at». Здесь все просто: файл открывается либо только для чтения, либо только для записи, либо только для добавления в конец файла.

В режиме "r+t" можно записывать данные поверх старых, но операции чтения лучше не производить

Вообще, если нужно преобразовать текстовый файл, следует использовать 2 файла: входной и выходной, а иногда и временный промежуточный.

fclose – закрытие файла.

Пример: fclose(fw);

fscanf – форматное чтение из текстового файла.

Формат вызова функции:

fscanf(Файловая_переменная, строка_формата, список_адресов_переменных);

Функция fscanf аналогична функции scanf за тем исключением, что в начале указывают имя файловой переменной.

fprintf – форматная запись в текстовый файл.

Формат вызова функции:

fprintf(Файловая_переменная, строка_формата, список_выражений);

Функция fprintf аналогична функции pirntf за тем исключением, что в начале указывают имя файловой переменной.

fgets – чтение строки текстового файла.

Формат вызова функции:

fgets(строковая_переменная, число_символов, Файловая_переменная);

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

При чтении строки целиком символ перевода строки заносится в конец строковой переменной. Поэтому при ее выводе не нужно специально переводить строку.

fputs – запись строки в текстовый файл.

Формат вызова функции:

fgets(строковое_выражение, Файловая_переменная);

Функция fputs записывает строку в текстовый файл вместе с символом перевода строки.

Функция fputs аналогична функции puts за тем исключением, что 2-м параметром указывают имя файловой переменной.

feof – определяет, достигнут ли конец файла.

При посимвольном считывании текстового файла нужно сначала прочитать символ, а затем проверить, не достигнут ли конец файла с помощью функции feof().

Для определения конца строки нет специальной функции, но его можно обнаружить с помощью проверки символа. Символ «Конец строки» на диске состоит из 2 байтов с кодами 13 («Возврат каретки») и 10 («Перевод строки»), но при чтении из файла в символьной переменной сохраняется только последний байт.

Следующая программа читает текстовый файл 1.txt до конца файла (по символам) и выводит его на экран. После каждой строки выводится разделитель в виде линии. Затем производится чтение файла по строкам.

#include <stdio. h>

#include <conio. h>

main() {

clrscr();

FILE *f2;

char t, *str;

if ((f2=fopen("1.txt","rt"))==NULL) {

puts("Не могу открыть файл!"); exit(1); }

clrscr();

// чтение из файла по символам

for (;;) {

fscanf(f2,"%c",&t); // читать символ

printf("%c",t); // вывести его на экран

if (t==10) // Проверка на символ ”Перевод строки”

puts("----");

if feof(f2) break; // проверка конца файла

}

printf(”\n=====================================\n”);

rewind(f2); // вернуть указатель в начало файла

// чтение из файла по строкам

for (;;) {

fputs(str,100, f2); // читать строку

printf("%s",t); // вывести ее на экран

if feof(f2) break; // проверка конца файла

}

fclose(f2);

getch();

}

fseek – изменяет указатель позиции файла на указанное место.

Чтение и запись в текстовый файл желательно делать последовательно, однако можно переместить указатель к нужному байту файла посредством функции fseek. Делать это нужно очень осторожно, так как некоторые символы (например, переход на следующую строку), состоят из нескольких байт и указатель может сместиться неправильно. Кроме того, в некоторых режимах открытия текстового файла вызов функции fseek может игнорироваться.

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

fseek (Файловая_переменная, Смещение_в_байтах, точка_отсчета);

Точка отсчета задается одной из 3 констант:

начало файла SEEK_SET 0;

текущая позиция SEEK_CUR 1;

конец файла SEEK_END 2;

Смещение в байтах может быть положительным или отрицательным. При вычислении размера смещения все части выражения должны быть приведены к типу long int. Например, сместиться на 2 записи назад от текущей позиции:

fseek(fw, - long(2*sizeof(buf), SEEK_CUR);

rewind – установить указатель на начало файла.

Формат вызова: rewind(Файловая_переменная);

Общие принципы работы с текстовыми файлами, имеющими вид таблиц:

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

-  Если в таблице следует текстовое поле, следует визуально определить его длину, а в программе использовать чтение строки функцией fscanf с ограничением количества символов.

-  Если в таблице следует числовое поле, в программе использовать чтение числа функцией fscanf с указанием формата числа.

-  Когда все поля строки прочитаны, следует прочитать остаток строки (с символом конца строки) функцией fgets.

-  Для чтения текстовых полей, содержащих пробелы, можно использовать спецификацию формата %[\x20-\xFF]s для функции fscanf или функцию fgets с указанием ширины поля.

Задания для подготовки к работе

1.  Изучите основную терминологию, связанную с файлами, потоками и структурами.

2.  Изучите режимы открытия файлов, способы доступа к данным, возможности языка программирования по обработке текстовых файлов.

3.  Разработайте алгоритм и программу в соответствии с заданием.

Задания к работе

Создать программу для работы с текстовым файлом, содержащим таблицу записей согласно варианта. У таблицы должен быть заголовок. Работа с файлом должна осуществляться через меню, в котором должны быть следующие пункты:

-  Показать все записи; (в виде таблицы)

-  Добавить запись;

-  Удалить запись;

-  Изменить запись;

-  Поиск записей (по каким-то критериям);

-  Сортировка записей (по какому-то одному полю).

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

Записи нужно сортировать в файле, а при выводе на экран.

Можно использовать временные файлы.

В программе можно использовать вспомогательный массив записей (как буфер) только в том случае, если количество записей в файле будет больше.

Для испытаний заполнить файл 15-20 записями.

Варианты заданий.

1.  Создать файл, содержащий сведения о месячной заработной плате рабочих завода. Каждая запись содержит поля – фамилии рабочего, наименование цеха, размер заработной платы за месяц.

2.  Создать файл, содержащий сведения о количестве изделий, собранных сборщиками цеха за неделю. Каждая запись содержит поля: фамилия сборщика, количество изделий, собранных им ежедневно в течение шестидневной недели, т. е. раздельно - в понедельник, вторник и т. д.

3.  Создать файл, содержащий сведения о количестве изделий категорий А, В, С, собранных рабочим за месяц. Количество записей - произвольное.

4.  Создать файл, содержащий сведения о телефонах абонентов. Каждая запись имеет поля: фамилия абонентов, год установки телефона, номер телефона.

5.  Создать файл, содержащий сведения об ассортименте игрушек в магазине. Структура записи: название игрушки, цена, количество, возрастные границы, например 2-5, т. е. от 2 до 5 лет.

6.  Создать файл, содержащий сведения о сдаче студентами 1 курса кафедры КиПР сессии. Структура записи: индекс группы, фамилия студента, оценки по пяти экзаменам, признак участия в общественной работе: «1»- активное участие, «0»- неучастие.

7.  Создать файл, содержащий сведения о сдаче студентами сессии. Структура записи: индекс группы, фамилия студента, оценки по пяти экзаменам и пяти зачетам («з» означает зачет, «н» - незачет).

8.  Создать файл, содержащий сведения о личной коллекции книголюба. Структура записи: шифр книги, автор, название, год издания, местоположение (номер стеллажа, шкафа и т. п.).

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

10.  Создать файл, содержащий сведения об ассортименте обуви в магазине фирмы. Структура записи: артикул, наименование, количество, стоимость одной пары. Количество записей - произвольное. Артикул начинается с буквы Д для дамской обуви, М для мужской, П для детской.

11.  Создать файл, содержащий сведения о десяти нападающих хоккейных команд «Динамо» и «ЦСКА» соответственно: имена нападающих, число заброшенных ими шайб, сделанных голевых передач, заработанное штрафное время.

12.  Создать файл, содержащий сведения о том, какие из пяти предлагаемых дисциплин по выбору желает слушать студент. Структура записи: фамилия студента, индекс группы, 5 дисциплин, средний балл успеваемости. Выбираемая дисциплина отмечается символом 1, иначе – пробел.

13.  Создать файл, содержащий сведения об отправлении поездов дальнего следования с Казанского вокзала. Структура записи: номер поезда, станция назначения, время отправления, время в пути, наличие билетов.

14.  Создать файл, содержащий сведения о сотрудниках института. Структура записи: фамилия работающего, название отдела, год рождения, стаж работы, должность, оклад.

15.  Создать файл, содержащий сведения о пациентах глазной клиники. Структура записи: фамилия пациента, пол, возраст, место проживания (город), диагноз.

Содержание отчета

Отчет должен содержать:

Тексты заданий (по вариантам);

Тексты программ с комментариями;

Протоколы работы программ;

Выводы по работе.

Контрольные вопросы.

7.  В чем отличие текстовых файлов от двоичных?

8.  Какие файлы удобнее для обработки записей?

9.  Каково назначение операторов открытия и закрытия файлов?

10.  Указать с помощью каких операторов выполняется запись данных в текстовый файл, чтение из файла?

11.  Как распознать конец файла, конец строки?

12.  Можно ли использовать прямой доступ к элементам текстового файла: строке, слову, записи?

Литература

39.  . С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2002. – 464с.

40.  , . С/С++. Структурное программирование: практикум. – СПб.: Питер, 2002. – 240с.

41.  Митницкий теории алгоритмов и язык программирования С. Учебное пособие. –М.: МФТИ, 2001. – 180с.

42.  и др. Информатика. М.: Изд. центр “Академия”, 2000. – 816 с.

43.  Подбельский С++: Учебное пособие. – М.: Финансы и статистика, 2002 – 560с.

44.  , Фомин на языке Си. – М.: Финансы и статистика, 2002 – 600с.

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

Динамические структуры данных

Цели работы:

Научиться управлять выделением и освобождением динамической памяти;

Научиться выполнять основные операции для списков: добавление, удаление и поиск элементов, вывод списка.

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

Методы организации и хранения линейных списков

Линейный список - это конечная последовательность однотипных элементов (узлов), возможно, с повторениями. Количество элементов в последовательности называется длиной списка, причем длина в процессе работы программы может изменяться.

Линейный список F, состоящий из элементов D1,D2,...,Dn, записывают в виде последовательности значений заключенной в угловые скобки F=<D1,D2,...,Dn>, или представляют графически (см. рис.1).

D1

à

D2

à

D3

à

...

à

Dn

Рис. 1. Изображение линейного списка.

Например, F1=<2,3,1>,F2=<7,7,7,2,1,12>, F3=<>. Длина списков F1, F2, F3 равна соответственно 3,6,0.

При работе со списками на практике чаще всего приходится выполнять следующие операции:

- найти элемент с заданным свойством;

- определить первый элемент в линейном списке;

- вставить дополнительный элемент до или после указанного узла;

- исключить определенный элемент из списка;

- упорядочить узлы линейного списка в определенном порядке.

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

Методы хранения линейных списков разделяются на методы последовательного и связанного хранения. Рассмотрим простейшие варианты этих методов для списка с целыми значениями F=<7,10>.

При последовательном хранении элементы линейного списка размещаются в массиве d фиксированных размеров, например, 100, и длина списка указывается в переменной l, т. е. в программе необходимо иметь объявления вида

float d[100]; int l;

Размер массива 100 ограничивает максимальные размеры линейного списка. Список F в массиве d формируется так:

d[0]=7; d[1]=10; l=2;

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

l:

2

 

d:

7

10

...

[0]

[1]

[2]

[3]

[98]

[99]

Рис.13. Последовательное хранение линейного списка.

При связанном хранении в качестве элементов хранения используются структуры, связанные по одной из компонент в цепочку, на начало которой (первую структуру) указывает указатель dl. Структура образующая элемент хранения, должна кроме соответствующего элемента списка содержать и указатель на соседний элемент хранения.

Описание структуры и указателя в этом случае может имееть вид:

typedef struct snd /* структура элемента хранения */

{ float val; /* элемент списка */

struct snd *n ; /* указатель на элемент хранения */

} DL;

DL *p; /* указатель текущего элемента */

DL *dl; /* указатель на начало списка */

Для выделения памяти под элементы хранения необходимо пользоваться функцией malloc(sizeof(DL)) или calloc(l, sizeof(DL)). Формирование списка в связанном хранении может осуществляется операторами:

p=malloc(sizeof(DL));

p->val=10; p->n=NULL;

dl=malloc(sizeof(DL));

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10