Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metodichka_SI.doc
Скачиваний:
30
Добавлен:
23.02.2015
Размер:
2.05 Mб
Скачать

3 Задача

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

«Pasp.h»

typedef struct addr

{

char *country;

char *state;

char *town;

char *street;

char *house;

} Addr;

typedef struct fio

{

char *surname;

char *name;

} FIO;

typedef struct pasp

{

char *series;

char *number;

fio* my_fio;

char* date;

addr* my_addr;

} Pasp;

// ввод данных одного паспорта

Pasp*newPasp();

// поиск по фамилии

Pasp* search(Pasp* passports, int counter, char* surname);

// чтение данных из файла

int read(char* file_name, Pasp* passports);

// запись данных в файл

void save(char* file_name, Pasp* passports, int counter);

// печать данных одного паспорта

void print(Pasp* passport);

pasp.cpp”.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "pasp.h"

void printMenu()

{

puts("\n\n-------- Menu --------");

puts("1. Input new passport");

puts("2. Print passports");

puts("3. Search passport by FIO");

puts("4. Read data from file");

puts("5. Save to file");

puts("6. Exit");

puts("");

printf("Your choise: ");

}

int main()

{

int counter = 0, choice = 0;

char *tmp = (char*) malloc (10 * sizeof(char));

Pasp *passports = (Pasp*) malloc (MAX_SIZE * sizeof(Pasp));

char *surname, *file_name;

Pasp *pasp;

while(true)

{

printMenu();

int i;

choice = atoi(gets(tmp));

switch(choice)

{

case 1:

passports[counter] = *newPasp();

counter++;

break;

case 2:

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

{

printf("\n\n--- [%d] ---\n", i+1);

print(&passports[i]);

}

break;

case 3:

printf("\nInput surname for search: ");

surname = (char*) malloc (255*sizeof(char));

gets(surname);

pasp = search(passports, counter, surname);

if (pasp!=NULL) print(pasp);

else puts(" surname doesn't found");

break;

case 4:

printf("\nInput file name to read: ");

file_name = (char*) malloc (55*sizeof(char));

gets(file_name);

counter = read(file_name, passports);

break;

case 5:

printf("\nInput file name to save: ");

file_name = (char*) malloc (55*sizeof(char));

gets(file_name);

save(file_name, passports, counter);

break;

case 6:

free(passports);

return 0;

}

}

}

pasp_fun.cpp”

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "pasp.h"

// функция выделения памяти под строку

char* newStr()

{

return (char*) malloc (50*sizeof(char));

}

//функция записи адресных данных

Addr* newAddr()

{

Addr* str = (Addr*) malloc (sizeof(Addr));

puts("\nInput Address data...");

printf("Country: ");

gets(str->country = newStr());

printf("State: ");

gets(str->state = newStr());

printf("Town: ");

gets(str->town = newStr());

printf("Street: ");

gets(str->street = newStr());

printf("House: ");

gets(str->house = newStr());

returnstr;

}

//функция записи данных о фамилии

FIO* newFIO()

{

FIO* str = (FIO*) malloc (sizeof(FIO));

puts("\nInput Personal data...");

printf("Surname: ");

gets(str->surname = newStr());

printf("Name: ");

gets(str->name = newStr());

returnstr;

}

// функция записи данных одного паспорта

Pasp* newPasp()

{

Pasp* str = (Pasp*) malloc (sizeof(Pasp));

puts("\nInput Passport data...");

printf("Series: ");

gets(str->series = newStr());

printf("Number: ");

gets(str->number = newStr());

printf("Date: ");

gets(str->date = newStr());

str->my_fio = newFIO();

str->my_addr = newAddr();

returnstr;

}

// функция поиска данных по фамилии

Pasp* search(Pasp* passports, int counter, char* surname)

{

for(int i = 0; i < counter; i++)

{

if (strcmp(passports[i].my_fio->surname, surname) == 0)

{

return &passports[i];

}

}

returnNULL;

}

// функция чтения данных из файла

char* readString(FILE* file)

{

int l = fgetc(file);

char* str = (char*) malloc ((l + 1) * sizeof(char));

fread(str, sizeof(char) * l, 1, file);

str[l] = '\0';

return str;

}

// функция чтения данных из файла в структуру Addr

Addr* readAddress(FILE* file)

{

Addr* addr = (Addr*) malloc (sizeof(Addr));

addr->country = readString(file);

addr->state = readString(file);

addr->town = readString(file);

addr->street = readString(file);

addr->house = readString(file);

returnaddr;

}

// функция чтения данных из файла в структуру FIO

FIO* readFIO(FILE* file)

{

FIO* fio = (FIO*) malloc (sizeof(FIO));

fio->surname = readString(file);

fio->name = readString(file);

returnfio;

}

// функция чтения данных из файла в структуру Pasp

Pasp* readPasp(FILE* file)

{

Pasp* pasp = (Pasp*) malloc (sizeof(Pasp));

pasp->series = readString(file);

pasp->number = readString(file);

pasp->date = readString(file);

pasp->my_fio = readFIO(file);

pasp->my_addr = readAddress(file);

return pasp;

}

// функция чтения данных из файла

int read(char* file_name, Pasp* passports)

{

FILE *file = fopen(file_name, "rb");

if (file == NULL)

{

printf("Unable to open file %s ...", file_name);

return -1;

}

int counter = 0;

while(!feof(file))

{

passports[counter] = *readPasp(file);

counter++;

}

counter--;

if (fclose(file) != 0)

printf("Unable to close file successfully...");

returncounter;

}

// функция записи строки в выходной файл

void saveString(char* str, FILE* file)

{

fputc(strlen(str), file);

fwrite(str, sizeof(char), strlen(str), file);

}

// функция записи структуры Addrв выходной файл

void saveAddress(Addr* addr, FILE* file)

{

saveString(addr->country, file);

saveString(addr->state, file);

saveString(addr->town, file);

saveString(addr->street, file);

saveString(addr->house, file);

}

// функция записи структуры FIOв выходной файл

void saveFIO(FIO* fio, FILE* file)

{

saveString(fio->surname, file);

saveString(fio->name, file);

}

// функция записи структуры Paspв выходной файл

void savePasp(Pasp* pasp, FILE* file)

{

saveString(pasp->series, file);

saveString(pasp->number, file);

saveString(pasp->date, file);

saveFIO(pasp->my_fio, file);

saveAddress(pasp->my_addr, file);

}

// функция записи данных в выходной файл

void save(char* file_name, Pasp* passports, int counter)

{

FILE *file = fopen(file_name, "wb");

if (file == NULL)

{

printf("Unable to open file %s ...\n", file_name);

return;

}

for (int i = 0; i < counter; i++)

{

savePasp(&passports[i], file);

}

if (fclose(file) != 0)

printf("Unable to close file successfully...");

printf("File %s successfully saved.\n", file);

}

// функция печати данных одного паспорта

void print(Pasp* passport)

{

puts("\nPassport data:");

printf("Series: %s\n", passport->series);

printf("Number: %s\n", passport->number);

printf("Date: %s\n", passport->date);

printf("\nPersonal data:\n");

printf("Surname: %s\n", passport->my_fio->surname);

printf("Name: %s\n", passport->my_fio->name);

printf("\nAddress data:\n");

printf("Country: %s\n", passport->my_addr->country);

printf("State: %s\n", passport->my_addr->state);

printf("Town: %s\n", passport->my_addr->town);

printf("Street: %s\n", passport->my_addr->street);

printf("House: %s\n", passport->my_addr->house);

}

Самостоятельная работа

  1. Добавить в предыдущие примеры функции проверки вводимых данных (даты, возраста и т.д.)

  2. Разработать программу «Склад». Складом называется массив товаров. Товар характеризует: название, оптовая цена, количество.

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

Работа с абстрактными типами данных. Стек.

Цель: закрепление на практике знаний работы со стеком.

Методические рекомендации: лабораторная работа рассчитана на 2 часа и состоит из анализа двух заданий и выполнения самостоятельной работы.

Обязательное зачетное задание.

Необходимый уровень знаний:

  • работа с указателями;

  • работа с массивами;

  • работа со структурами.

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