Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ_ПРОГР.doc
Скачиваний:
33
Добавлен:
29.02.2016
Размер:
1.66 Mб
Скачать

6.1.2 Присваивание структур

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

#include <stdio.h>

int main(void)

{

struct {

int a;

int b;

} x, y;

x . a = 10;

x . b = 20;

y = x;

printf(“Содержание y: %d %d.”, y.a, y.b);

return0;

}

После присваивания y.aиy.bбудут содержать значения 10 и 20 соответственно.

    1. Массивы структур

Наиболее часто структуры используются в виде массивов структур. Для объявления массива структур следует сначала определить структуру, а затем объявить массив переменных данного типа. Например, для объявления 100-элементного массива структур типаaddr, которая была объявлена ранее, следует написать:

struct addr ainfo[100];

В результате получаем набор из 100 переменных, устроенных, как объявлено в типе структуры addr.

Для доступа к отдельным структурам массива ainfoследует проиндексировать имя массива. Например, для вывода содержимого поляzipтретьей структуры, следует написать:

printf(“%d”, ainfo[2].zip);

Как и массивы переменных массивы структур индексируются с нуля.

    1. Передача структур в функции

      1. Передача членов структур в функции

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

struct fred {

char x;

int y;

float z;

char s[10];

} mike;

Ниже приведены примеры передачи каждого элемента в функцию:

func(mike.x); /* Передача символьного значениях*/

func(mike.y); /* Передача целочисленного значенияу*/

func(mike.z); /* Передача вещественного значенияz*/

func(mike.s); /* Передача адреса строкиs*/

func(mike.s[2]); /* Передача символьного значенияs[2] */

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

func(&mike.x); /* Передача адреса символах*/

func(&mike.y); /* Передача адреса целогоу*/

func(&mike.z); /* Передача адреса вещественногоz*/

func(mike.s); /* Передача адреса строкиs*/

func(&mike.s[2]); /* Передача адреса символаs[2] */

Обратим внимание, что оператор &стоит перед именем структуры, а не перед именем элемента.

      1. Передача всей структуры в функцию

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

Когда структура используется как параметр, самое важное – это запомнить, что тип аргумента должен соответствовать типу параметра. Лучший способ сделать это – определить структуру глобально, а затем использовать ее ярлык для объявления необходимых структурных переменных и параметров. Например:

#include <stdio.h>

struct struct_type {

int a, b;

char ch;

};

void f1(struct struct_type parm);

int main(void)

{

struct struct_type arg;

arg .a = 1000;

f1(arg);

return 0;

}

void f1(struct struct_type parm)

{

printf(“%d”, parm .a);

}

    1. Указатели на структуры

      1. Объявление указателя на структуру

Указатели на структуру объявляются путем помещения оператора * перед именем структурной переменной. Например, предполагая, что ранее была определена структура addr, следующая строка объявляетaddr_ptrкак указатель на данные этого типа:

struct addr *addr_ptr ;

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

Для получения адреса структурной переменной следует поместить оператор & перед именем структуры. Пусть имеется следующий фрагмент:

struct bal {

float balance;

char name[80];

} person;

structbalp; /* объявление указателя на структуру */

тогда

p = &person;

помещает адрес структуры person в указательр.

Для доступа к элементам структуры с помощью указателя на структуру следует использовать оператор «стрелка». Оператор «стрелка» (->) образован из знака «минус» и символа «больше». Например, для доступа к элементуbalanceс помощью указателя р следует написать

p>balance.

    1. Массивы и структуры в структурах

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

Рассмотрим следующую структуру:

structx{

inta[10][10]; /* массив целых 10 на 10 */

float b;

} y;

Для обращения к числу с индексами 3, 7 массива аструктурыуследует написать:

y.a[3][7];

Когда структура является элементом другой структуры, то она называется вложенной структурой. Например, ниже структура addrвложена в структуруemp:

struct emp {

struct addr address;

float wage;

} worker;

Здесь структура empимеет два элемента. Первый – это структура типаaddr, содержащая адреса служащих. Другой – этоwage, содержащий заработную плату служащих. Следующий фрагмент кода присваивает значение 25000 элементуwageструктурыworkerи значение 97675 полюzipструктурыaddress:

worker.wage = 25000.00;

worker.address.zip = 97675;

В этом примере обращение к элементам каждой структуры происходит снаружи вовнутрь (слева направо).

    1. Функции fread () и fwrite ()

Файловая система языка С предоставляет две функции, позволяющие читать и писать блоки данных – fread() иfwrite(). Они имеют следующие прототипы:

size_t fread (void *буфер, size_t число_байт, size_t размер, FILE *fp);

size_t fwrite (const void *буфер, size_t число_байт, size_t размер, FILE *fp);

В случае fread()буфер– это указатель на область памяти, которая получает данные из файла. В случаеfwrite()буфер– это указатель на информацию, записываемую в файл. Буфер может быть ( а чаще всего это так и есть) простой переменной. Длина каждого элемента в байтах определяется вчисло_байт. Аргумент объем определяет, сколько элементов (каждый длинойчисло_байт) будет прочитано или записано. Наконец,fp – это указатель на ранее открытый файл.

Функция fread() возвращает число прочитанных элементов. Данное значение может быть меньше чем объем, если был достигнут конец файла или произошла ошибка. Функцияfwrite() возвращает число записанных элементов. Данное значение равно объем, если не произошла ошибка.

Если файл был открыт для двоичных данных, то fread() иfwrite() могут читать и писать любой тип данных. Одно из самых наиболее полезных примененийfread() иfwrite() – это чтение и запись блоков данных типа массивов и структур. Например, следующий программа записывает содержимое структурыbookв файлbooks.dat, используя один операторfwrite(). Далее она читает эту структуру, используя один операторfread(), и выводит значения элементов структуры.

#include <stdio.h>

struct books_type {

char avtor[20];

char nazv[40];

char izd[20];

char year[4];

int num_str;

};

int main (void)

{

register int i;

struct books_type book;

FILE*fp;

/* открытие файла на запись */

if ((fp = fopen(“books.dat”, “wb”)) = = NULL) {

printf(“Не могу открыть файл!”);

return 1;

}

book.avtor = “Шилдт Г.”;

book.nazv= “Программирование наBorlandC++”;

book.izd= “ООО «Попурри»”;

book.year = 1998;

book.num_str = 800;

/* запись структуры в файл */

fwrite(book, sizeof book, 1, fp);

fclose(fp);

/* открытие файла для чтения */

if ((fp = fopen(“books.dat”, “rb”)) = = NULL) {

printf(“Не могу открыть файл!”);

return1;

}

/* чтение структуры из файла */

fread(book, sizeof book, 1, fp);

/* вывод содержимого структуры на экран */

printf(“ Автор книги: %s\n”, book.avtor);

printf(“Название книги: %s\n”, book.nazv);

printf(“ Издательство: %s\n”, book.izd);

printf(“ Год издания: %s\n”, book.year);

printf(“ Число страниц: %s\n”, book.num_str);

fclose(fp);

return 0;

}

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

1) Дана совокупность сведений, каждое из которых состоит из следующих реквизитов: фамилия и инициалы автора – 25 знаков; название книги – 40 знаков; издательство – 20 знаков; год издания – 4 знака.

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

 ввод совокупности данных (B) и создания файлаFW(минимум 10 записей). Данные вводить с клавиатуры;

 вывод записей файла FWс заданной фамилией и инициалами;

 вывод записей файла FWс заданной первой буквой фамилии;

 вывод записей файла FWо книгах, изданных до 1985 года;

 вывод записей файла FWо книгах, изданных конкретным автором до 1984 года.

3) Дана совокупность сведений, каждое из которых состоит из следующих реквизитов: фамилия и инициалы автора – 25 знаков; название книги – 40 знаков; издательство – 20 знаков; год издания – 4 знака.

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

 ввод совокупности данных (B) и создания файлаFW(минимум 10 записей). Данные вводить с клавиатуры;

 сортировка записей файла FWв порядке возрастания по фамилии автора;

 удаление из файла FWзаписей, у которых значение реквизита «год издания» меньше 1980.

4)* Дана последовательность записей, состоящая из реквизитов: шифр цеха (Ц), шифр рабочего (Р), дата (ДТ), шифр детали (Д), количество изготовленных деталей (К).

Написать программу ввода записей и создания файла FZ. Предусмотреть в программе контроль реквизитов записей по следующей схеме: реквизитЦдолжен лежать в диапазоне 10 – 20, реквизитР– в диапазоне 1000 – 1999, реквизитДТ– в диапазоне 1 – 31, реквизитДдолжен состоять из 6 символов, а реквизитКбыть целым числом в диапазоне от 1 до 999.

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

5) Дана последовательность записей, состоящая из реквизитов: шифр цеха (Ц), шифр рабочего (Р), дата (ДТ), шифр детали (Д), количество изготовленных деталей (К).

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

 ввод записей и создание файла FZ;

 добавление записей в файл FZ;

 сортировка записей файла FZв порядке возрастания реквизитаР.

6)* Дана последовательность записей, состоящая из реквизитов: шифр цеха (Ц), шифр рабочего (Р), дата (ДТ), шифр детали (Д), количество изготовленных деталей (К).

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

 ввод записей и создание файла FZ;

 сортировка записей файла FZв порядке возрастания реквизитовРиД.

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

7)* Дана последовательность записей, состоящая из реквизитов: шифр цеха (Ц), шифр рабочего (Р), дата (ДТ), шифр детали (Д), количество изготовленных деталей (К).

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

 ввод записей и создание файла FZ;

 создание файла NS, каждая запись которого включает реквизиты – шифр детали (Д) и расценку одной детали (РД);

 создание на базе файлов FZиNSфайлаFP. Реквизиты записей файлаFPвключают в себя реквизиты:С,Р,ДТ,Д(передаются из файлаFZ) и реквизитС(сумма, начисленная за изготовление деталей данного шифра), вычисляемая умножением реквизитаК(количество изготовленных деталей) записей файлаFZ на реквизитРДзаписей файлаNS. Поиск записей в файлеNSпроводится по реквизиту – шифр детали (Д) текущей записи файлаFZ. Если в файлеNSотсутствует запись с заданным шифром детали, то выдать сообщение: «В файлеNSнет расценки детали с шифром <шифр детали>».

8)* Дана последовательность записей с информацией о сотрудниках предприятия. Каждая запись включает реквизиты: ФИО(фамилия, имя, отчество );ДР(дата рождения – год, месяц, число);МР(место рождения – название города);ДТ(дата начала трудового стажа работы – год, месяц, число);П(пол – муж., жен.);СП(семейное положение – женат, холост, число детей);ОБР(образование – высшее, среднее). При программировании реквизитыФИО,ДР,СПиДТобъявлять как структуры.

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

 ввод записей и создание файла SV;

 используя файл SV, выдать на экран таблицы:

Возраст

Количество мужчин

% к итогу

До 20 лет

20 –30 лет

30 – 40 лет

40 – 50 лет

50 – 60 лет

Свыше 60 лет

Итого

Стаж работы

Число работающих

% к итогу

До 2 лет

2 –5 лет

5 – 10 лет

10 – 15 лет

Свыше 15 лет

Итого

9) Дана последовательность записей, состоящая из реквизитов: шифр поставщика (SP), наименование поставщика (SN), шифр поставляемого изделия (SI), место проживания (город) поставщика (TWN).

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

 ввод записей и создание файла POST;

 вывод на экран списка всех поставщиков из данного города;

 вывод на экран списка поставщиков с данным шифром изделия;

 вывод на экран списка городов, из которых поставляется данный шифр изделия.

10)* Дана последовательность записей, состоящая из реквизитов: Ф.И.О. студента (20 символов); номер зачетной книжки (6 символов); оценки за последнюю сессию (массив из 5 целых чисел); размер стипендии (целое число). При вводе предусмотреть проверку данных на корректность (в качестве оценок использовать числа 5, 4, 3, 2; стипендия не может выйти за пределы диапазона [0, 10000]).

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

 ввод записей и создание файла STUD;

 корректировка записей файла STUD. При перезаписи предусмотреть контроль данных;

 сортировка записей файла STUDв алфавитном порядке по фамилиям студентов;

 вывод на экран таблицы:

Ф.И.О.

Номер зач. книжки

Средний балл

Стипендия

11) Дана последовательность записей, состоящая из реквизитов: код предприятия (4 символа); код цеха (4 символа); Ф.И.О. работника (25 символов); заработная плата (целое число).

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

 ввод записей и создание файла RAB, состоящего из указанных выше записей;

 создание справочника предприятий (файл, состоящий из записей с реквизитами: код предприятия (4 символа) и наименование (20 символов);

 создание справочника цехов (файл, состоящий из записей с реквизитами: код цеха (4 символа) и наименование (20 символов);

 вывод итог заработной платы по данному цеху.

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

 наличие кода предприятия в справочнике предприятий;

 наличие кода цеха в справочнике цехов.

12) Дана последовательность записей, состоящая из реквизитов: Ф.И.О. студента (20 символов); номер зачетной книжки (6 символов); оценки за последнюю сессию (массив из 5 целых чисел); размер стипендии (целое число). При вводе предусмотреть проверку данных на корректность (в качестве оценок использовать числа 5, 4, 3, 2; стипендия не может выйти за пределы диапазона [0, 10000]).

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

 ввод записей и создание файла STUD;

 сортировка записей файла STUDв алфавитном порядке по фамилиям студентов;

 вывод списка студентов, имеющих неудовлетворительные оценки;

 вывод списка студентов, которые получают стипендию более 5000 руб;

 вывод списка студентов, которые поступили в институт в 1999 году (по номеру зачетной книжки).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]