Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по СИ.doc
Скачиваний:
12
Добавлен:
23.08.2019
Размер:
433.15 Кб
Скачать

Лабораторная работа №6 Указатели

Задание: Выполнить задание из раздела «Двумерные массивы», используя динамическое выделение памяти.

Пример задания: Анкета для опроса населения содержит две группы вопросов.

Первая группа содержит сведения о респонденте:

  • возраст;

  • пол;

  • образование (начальное, среднее, высшее);

Вторая группа содержит собственно вопрос анкеты, ответ на который либо ДА, либо НЕТ

Составить программу, которая:

  • обеспечивает начальный ввод анкет;

  • на основе анализа анкет выдает ответы на следующие вопросы: а) сколько мужчин старше 40 лет, имеющих высшее образование, ответили ДА на вопрос анкеты; б) сколько женщин моложе 30 лет, имеющих среднее образование, ответили НЕТ на вопрос анкеты; в) сколько мужчин моложе 25 лет, имеющих начальное образование, ответили ДА на вопрос анкеты;

  • производит вывод всех анкет и ответов на вопросы.

Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.

Пример решения задачи:

#include <stdio.h>

#include <stdlib.h>

struct Form

{

int Age;

int Sex; /* 0 - мужчина; 1 – женщина */

int Education; /* 0 - начальное; 1 - среднее; 2 – высшее */

int Question; /* 0 - НЕТ; 1 – ДА */

};

int main(int argc, char* argv[])

{

int Selection, i;

Form *pForm = NULL;

int RecCount = 0;

int k1, k2, k3;

char *str;

printf("М Е Н Ю\n-------------------\n");

printf("1. Добавить запись\n");

printf("2. Анализ анкет\n");

printf("3. Вывод всех анкет\n");

printf("4. Выход");

while (true)

{

printf("\n\nВаш выбор: ");

scanf("%d ", &Selection);

switch (Selection)

{

case 1: /* Добавить запись */

pForm = (Form*)realloc(pForm, (RecCount + 1) * sizeof(Form));

printf("\nВведите данные:\n");

printf("\tВозраст: "); scanf("%d", &pForm[RecCount].Age);

printf("\tПол (0 - М; 1 - Ж): "); scanf("%d", &pForm[RecCount].Sex);

printf("\tОбразование (0 – нач.; 1 – ср.; 2 - высшее): ");

scanf("%d", &pForm[RecCount].Education);

printf("\tВы курите? (0 - НЕТ; 1 - ДА): ");

scanf("%d", &pForm[RecCount].Question);

RecCount++;

break;

case 2: /* Анализ анкет */

k1 = k2 = k3 = 0;

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

{

if (pForm[i].Sex == 0 && /* мужчина.*/

pForm[i].Age > 40 && /* старше 40 лет.*/

pForm[i].Education == 2 && /* имеющий высшее образование...*/

pForm[i].Question == 1) /* ответивший ДА.*/

k1++;

if (pForm[i].Sex == 1 && /* женщина.*/

pForm[i].Age < 30 && /* моложе 30 лет...*/

pForm[i].Education == 1 && /* имеющая среднее образование... */

pForm[i].Question == 0) /* ответившая НЕТ. */

k2++;

if (pForm[i].Sex == 0 && /* мужчина... */

pForm[i].Age < 25 && /* моложе 25 лет.*/

pForm[i].Education == 0 && /* имеющий начальное образование... */

pForm[i].Question == 1) /* ответивший ДА... */

k3++;

}

printf("\nСтатистика #1: %d\n", k1);

printf("Статистика #2: %d\n", k2);

printf("Статистика #3: %d\n", k3);

break;

case 3: /* Вывод всех анкет */

printf("\nВсе анкеты:\n");

printf("====================================================\n");

printf("Возраст Пол Образование Ответ\n");

printf("====================================================\n");

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

{

if (pForm[i].Education == 0)

str = "Начальное";

else if (pForm[i].Education == 1)

str = "Среднее ";

else

str = "Высшее ";

printf("%d %s %s %s\n", pForm[i].Age,

((pForm[i].Sex) ? "Ж" : "M"),

str,

((pForm[i].Question) ? "ДА" : "НЕТ"));

printf("____________________________________________________\n");

}

break;

case 4: // Выход

free(pForm);

exit(0);

break;

}

}

free(pForm);

return 0;

}

Результат выполнения программы:

М Е Н Ю

-------------------

1. Добавить запись

2. Анализ анкет

3. Вывод всех анкет

4. Выход

Ваш выбор: 1

Введите данные:

Возраст: 48

Пол (0 - М; 1 - Ж): 0

Образование (0 – нач.; 1 – ср.; 2 - высшее): 2

Вы курите? (0 - НЕТ; 1 - ДА): 1

Ваш выбор: 1

Введите данные:

Возраст: 41

Пол (0 - М; 1 - Ж): 0

Образование (0 – нач.; 1 – ср.; 2 - высшее): 2

Вы курите? (0 - НЕТ; 1 - ДА): 1

Ваш выбор: 1

Введите данные:

Возраст: 25

Пол (0 - М; 1 - Ж): 1

Образование (0 – нач.; 1 – ср.; 2 - высшее): 1

Вы курите? (0 - НЕТ; 1 - ДА): 0

Ваш выбор: 1

Введите данные:

Возраст: 18

Пол (0 - М; 1 - Ж): 0

Образование (0 – нач.; 1 – ср.; 2 - высшее): 0

Вы курите? (0 - НЕТ; 1 - ДА): 1

Ваш выбор: 1

Введите данные:

Возраст: 16

Пол (0 - М; 1 - Ж): 0

Образование (0 – нач.; 1 – ср.; 2 - высшее): 0

Вы курите? (0 - НЕТ; 1 - ДА): 1

Ваш выбор: 1

Введите данные:

Возраст: 27

Пол (0 - М; 1 - Ж): 1

Образование (0 – нач.; 1 – ср.; 2 - высшее): 1

Вы курите? (0 - НЕТ; 1 - ДА): 0

Ваш выбор: 1

Введите данные:

Возраст: 17

Пол (0 - М; 1 - Ж): 1

Образование (0 – нач.; 1 – ср.; 2 - высшее): 1

Вы курите? (0 - НЕТ; 1 - ДА): 0

Ваш выбор: 2

Статистика #1: 2

Статистика #2: 3

Статистика #3: 2

Ваш выбор: 3

Все анкеты:

====================================================

Возраст Пол Образование Ответ

====================================================

48 M Высшее ДА

____________________________________________________

41 M Высшее ДА

____________________________________________________

25 Ж Среднее НЕТ

____________________________________________________

18 M Начальное ДА

____________________________________________________

16 M Начальное ДА

____________________________________________________

27 Ж Среднее НЕТ

____________________________________________________

17 Ж Среднее НЕТ

____________________________________________________

Ваш выбор: 4

Индивидуальные задания:

Выполнить задания из разделов «Двумерные массивы» используя динамическое выделение памяти.