Лабораторная работа №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
Индивидуальные задания:
Выполнить задания из разделов «Двумерные массивы» используя динамическое выделение памяти.