- •Лабораторные работы. Сборник задач.
- •Оглавление
- •Часть 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 Уровень сложности
1 Задача
Цель: первичное знакомство со структурами, инициализация структуры, обращение к полям структуры, вложенные структуры.
Даны две структуры, каждая из которых состоит из двух полей. Определить, не запуская программу на выполнение, что выведет данная программа.
#include <stdio.h>
#include <conio.h>
int main()
{
// описание первой структуры
struct S1
{
char c[4],
char *str;
}
// инициализация первой структуры
s1 = { "abc", "def" };
// описание второй структуры
struct S2
{
char *cp;
struct S1 msg;
}
// инициализация второй структуры
s2 = { "ghi", { "jkl", "mno" } };
// печать значений полей первой структуры
printf("ex1: %c %c\n", s1.c[0], *s1.str);
printf("ex2: %s %s\n", s1.c, s1.str);
// печать значений полей второй структуры
printf("ex3: %s %s\n", s2.cp, s2.msg.str);
printf("ex4: %s %s\n", ++s1.str, ++s2.msg.str);
// ожидание нажатия клавиши
getchar();
return 0;
}
Дополнительное условие: запишем эту же программу несколько иначе.
Выделим описание типов структур в отдельный файл, например, «struct.h»
typedef struct S1
{
char c[4];
char* str;
}my_s1;
typedef struct S2
{
char *cp;
my_s1 msg;
}my_s2;
// основная программа
#include <stdio.h>
#include <conio.h>
#include "struct.h"
int main()
{
my_s1 s1 = {"abc", "def"};
my_s2 s2 = { "ghi", { "jkl", "mno" } };
printf("ex1: %c %c\n", s1.c[0], *s1.str);
printf("ex2: %s %s\n", s1.c, s1.str);
printf("ex3: %s %s\n", s2.cp, s2.msg.str);
printf("ex4: %s %s\n", ++s1.str, ++s2.msg.str);
getchar();
return 0;
}
Комментарий:
typedef служит для создания синонимических типов данных.
2 Задача
Цель: работа с массивом структур.
Реализовать программу обработки паспортных данных. Использовать массив структур. Каждая структура представляет собой паспортные данные на одного человека. Необходимо предусмотреть ввод, вывод данных в структуры и поиск данных о человеке по фамилии.
В файле «struct.h» описаны типы структур, максимальное количество структур и прототипы функций.
// заголовочный файл
«struct.h»
// задание максимального количества структур
const int MAX_SIZE = 10;
// объявление типа структуры для хранение адреса
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;
void print(Pasp* passport);
В файле «struct.cpp» будет находиться функция main()
// заголовочный файл
«struct.cpp»
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "struct.h"
int main()
{
// задание переменной для хранения фактического количества структур
int counter = 0;
// задание переменной для выбора из меню
int choice;
int i;
char *tmp = (char*) malloc (10 * sizeof(char));
// выделение памяти под MAX_SIZE структур
Pasp *passports = (Pasp*) malloc (MAX_SIZE * sizeof(Pasp));
// выделение памяти для переменной для хранения фамилии
char* surname = (char*) malloc (50*sizeof(char));
// описание массива структур
Pasp *pasp;
while(true)
{
// функция для вывода меню на экран
printMenu();
// чтение переменной для выбора из пунктов меню и перевод в тип int
choice = atoi(gets(tmp));
switch(choice)
{
case 1:
// создание данных одного паспорта
passports[counter] = *createPasp();
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: ");
// ввод фамилии, данные по которой хотим найти
gets(surname);
// поиск по фамилии
pasp = search(passports, counter, surname);
if (pasp!=NULL) print(pasp);
else puts(" surname doesn't found");
break;
case 4:
free(passports);
return 0;
}
}
return 0;
}
В файле «struct_fun.cpp» будут находиться коды функций
// заголовочный файл
«struct_fun.cpp»
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "struct.h"
// функция вывода на экран меню
void printMenu()
{
puts("\n\n-------- Menu --------");
puts("1. Input new passport");
puts("2. Print passports");
puts("3. Search passport by FIO");
puts("4. Exit");
puts("");
printf("Your choise: ");
}
// функция ввода адресных данных
Addr* createAddr()
{
// заполнение структуры адрес
Addr* str = (Addr*) malloc (sizeof(Addr));
// заполнение полей структуры адрес
puts("\nInput Address data...");
printf("Country: ");
gets(str->country = (char*) malloc (50*sizeof(char)));
printf("State: ");
gets(str->state = (char*) malloc (50*sizeof(char)));
printf("Town: ");
gets(str->town = (char*) malloc (50*sizeof(char)));
printf("Street: ");
gets(str->street = (char*) malloc (50*sizeof(char)));
printf("House: ");
gets(str->house = (char*) malloc (50*sizeof(char)));
return str;
}
// функция ввода фамилии и имени
FIO* createFIO()
{
// заполнение структуры фамилии и имени
FIO* str = (FIO*) malloc (sizeof(FIO)); //
// заполнение полей структуры фамилии и имени
puts("\nInput Personal data...");
printf("Surname: ");
gets(str->surname = (char*) malloc (50*sizeof(char)));
printf("Name: ");
gets(str->name = (char*) malloc (50*sizeof(char)));
return str;
}
// функция ввода данных одного паспорта
Pasp* createPasp()
{
// заполнение структуры паспорт
Pasp* str = (Pasp*) malloc (sizeof(Pasp));
// заполнение полей структуры паспорт
puts("\nInput Passport data...");
printf("Series: ");
gets(str->series = (char*) malloc (50*sizeof(char)));
printf("Number: ");
gets(str->number = (char*) malloc (50*sizeof(char)));
printf("Date: ");
gets(str->date = (char*) malloc (50*sizeof(char)));
str->my_fio = createFIO();
str->my_addr = createAddr();
return str;
}
// функция поиска данных по фамилии
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];
}
}
return NULL;
}
// функция вывода на экран данных одного паспорта
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);
}