- •Лабораторные работы. Сборник задач.
- •Оглавление
- •Часть 1. Лаборатоные работы
- •Работа со структурами и объединениями …………………………………….91
- •3 Задача
- •4 Задача
- •5 Задача
- •6 Задача
- •Дополнительное условие:использование цикла с предусловием.
- •1 Задача
- •2 Задача
- •Дополнительное условие: программа написана без использования функции.
- •Дополнительное условие: программа написана с использованием функций.
- •3 Задача
- •Дополнительное условие: программа написана без использования функции.
- •Дополнительное условие: программа написана с использованием функции.
- •4 Задача
- •Дополнительное условие: программа написана без использования функции
- •Дополнительное условие: программа написана с использованием функции.
- •Самостоятельная работа
- •Лабораторная работа №3
- •Самостоятельная работа
- •1 Задача
- •2 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •Лабораторная работа №6
- •1 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •4 Задача
- •Синтаксический анализатор
- •Самостоятельная работа
- •1 Задача
- •2 Задача
- •3 Задача
- •Работа с каталогами
- •Самостоятельная работа
- •1 Задача
- •2 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •2 Задача
- •1 Задача Реализовать очередь, состоящую из целых чисел
- •Комментарий:
- •2 Задача
- •1 Задача
- •Идеально-сбалансированные деревья
- •1 Задача
- •2 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •1 Задача
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности.
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности
- •Работа с несколькими массивами
- •Преобразование массива
- •Изменение элементов массива
- •2 Уровень сложности Формирование массива и вывод его элементов
- •Анализ элементов массива
- •Преобразование массива
- •Изменение элементов массива
- •Удаление и вставка элементов
- •Серии целых чисел
- •3 Уровень сложности Множества точек на плоскости
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •Not простое_логическое
- •(Простое_логическое знак_операции простое_логическое)
- •Построить синтаксический анализатор для понятия предложение.
- •1 Уровень сложности
- •2 Уровень сложности
- •1 Уровень сложности
- •Примеры:
- •Двусвязные списки
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
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);
}
Самостоятельная работа
Добавить в предыдущие примеры функции проверки вводимых данных (даты, возраста и т.д.)
Разработать программу «Склад». Складом называется массив товаров. Товар характеризует: название, оптовая цена, количество.
Лабораторная работа №16
Работа с абстрактными типами данных. Стек.
Цель: закрепление на практике знаний работы со стеком.
Методические рекомендации: лабораторная работа рассчитана на 2 часа и состоит из анализа двух заданий и выполнения самостоятельной работы.
Обязательное зачетное задание.
Необходимый уровень знаний:
работа с указателями;
работа с массивами;
работа со структурами.