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

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);

}

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