Ввести массив структур и вывести его на экран - C (СИ)
Формулировка задачи:
Доброй ночи! Обращаюсь к вам с такой проблеммой. По заданию необходимо ввести массив структур и вывести его на экран. С этим проблемм не возникло. Проблемма в ещё одной функции, которую нужно написать. На экран необходимо выводить только заданные пользователем поля. Мыслей совсем ни каких нет, как это реализовать. Я так понимаю необходимо передать в функцию, исходный массив структур и массив чисел, в котором будут номера полей для вывода. А вот дальше идей никаких нет. Посоветуйте, пожалуйста как лучше всего это реализовать. Вот кусок кода (первые две функции), которые я написал.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct ekzamen {
int data;
char prepod[20];
float ball;
int nomera[3];};
void main()
{
int a,kol=0,n,i;
struct ekzamen A[200];
void Vvod (struct ekzamen A[200], int kol);
void Vivod (struct ekzamen A[200], int n);
clrscr();
printf("enter amount elements: ");
scanf("%d",&n);
for(i=0;i<n;i++)
{ printf("enter %d element massiva struktur\n",i+1);
Vvod(A,kol);
kol++;}
printf("vivod massiva struktur:\n");
printf("---------------------------------------------------------------------\n");
printf("| number | gruppa | prepod | sr. ball | zachetki |\n");
Vivod(A,n);
getch();
}
void Vvod(struct ekzamen A[200], int kol)
{
int i;
struct ekzamen b;
printf("nomer gruppi: ");
scanf("%i",&b.data);
printf("familija prepodovatelja: ");
scanf("%s",&b.prepod);
printf("sr. ball gruppi: ");
scanf("%f",&b.ball);
printf("nomera_zachetok:\n");
for(i=0;i<3;i++)
{
scanf("%i",&b.nomera[i]);
}
A[kol]=b;
}
void Vivod (struct ekzamen A[20], int n)
{
int i;
for(i=0; i<n; i++)
{
printf("---------------------------------------------------------------------\n");
printf("| %i | %i | %s | %f | %i %i %i |\n", i+1, A[i].data, A[i].prepod, A[i].ball, A[i].nomera[0], A[i].nomera[1], A[i].nomera[2]);
}
printf("---------------------------------------------------------------------\n");
}Решение задачи: «Ввести массив структур и вывести его на экран»
textual
Листинг программы
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct ekzamen
{
int data;
char prepod[20];
float ball;
int nomera[3];
};
enum EFieldsTable
{
NONE = 0x00,
GROUP = 0x01,
LECTURER = 0x02,
GPA = 0x04,
NUMBERS = 0x08
};
int main()
{
int kol = 0, n, i;
struct ekzamen A[200];
void Vvod(struct ekzamen A[200], int kol);
void Vivod(struct ekzamen A[200], int n);
int AskAndGetFielsTable();
void PrintTable(struct ekzamen*, int, int);
printf("enter amount elements: ");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("enter %d element massiva struktur\n", i + 1);
Vvod(A, kol);
kol++;
}
printf("vivod massiva struktur:\n");
printf("-----------------------------------------------------------------------\n");
printf("| number | gruppa | prepod | sr. ball | zachetki |\n");
Vivod(A, n);
PrintTable(A, kol, AskAndGetFielsTable());
system("pause");
return 0;
}
int AskAndGetFielsTable()
{
int CField[] = {NONE, GROUP, LECTURER, GPA, NUMBERS};
size_t count = sizeof(CField) / sizeof(*CField);
printf("Input list numbers fields (set dot in the end):\n"
" 1 - group\n"
" 2 - lecturer\n"
" 3 - GPA\n"
" 4 - number of student's record book\n: ");
int fields = NONE;
size_t number;
while (scanf("%u", &number))
{
if (number < count)
{
fields |= CField[number];
}
}
return fields;
}
void PrintTable(struct ekzamen* array, int size, int fields)
{
int i;
for (i = 0; i < size; ++i)
{
printf("| %3d ", i+1);
if (fields & GROUP)
{
printf("| %6d ", array[i].data);
}
if (fields & LECTURER)
{
printf("| %20s ", array[i].prepod);
}
if (fields & GPA)
{
printf("| %5.2f ", array[i].ball);
}
if (fields & NUMBERS)
{
printf("| %2d %2d %2d ", array[i].nomera[0],
array[i].nomera[1], array[i].nomera[2]);
}
printf("|\n");
}
}
void Vvod(struct ekzamen A[200], int kol)
{
int i;
struct ekzamen b;
printf("nomer gruppi: ");
scanf("%i", &b.data);
printf("familija prepodovatelja: ");
scanf("%s", b.prepod);
printf("sr. ball gruppi: ");
scanf("%f", &b.ball);
printf("nomera_zachetok:\n");
for (i = 0; i < 3; i++)
{
scanf("%i", &b.nomera[i]);
}
A[kol] = b;
}
void Vivod(struct ekzamen A[20], int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("---------------------------------------------------------------------\n");
printf("| %i | %i | %s | %f | %i %i %i |\n",
i + 1, A[i].data, A[i].prepod, A[i].ball, A[i].nomera[0], A[i].nomera[1], A[i].nomera[2]);
}
printf("---------------------------------------------------------------------\n");
}
Объяснение кода листинга программы
- Объявлен массив структур ekzamen[200] и две функции: Vvod(ekzamen A[200], int kol) и Vivod(ekzamen A[20], int n).
- В функции main() объявлены следующие переменные:
- kol - количество введенных элементов;
- n - количество элементов, которые нужно ввести;
- i - счетчик элементов;
- A - массив структур ekzamen[200].
- В функции main() выполняется ввод количества элементов и их структуры с помощью функции Vvod(), после чего выводится структура массива на экран с помощью функции Vivod().
- В функции AskAndGetFielsTable() пользователю предлагается ввести номера полей для вывода в таблице.
- В функции PrintTable() происходит вывод таблицы с заданными полями.
- В функции Vvod() происходит ввод данных для каждого элемента массива: номер группы, фамилия преподавателя, средний балл, номера зачетных книжек.
- В функции Vivod() происходит вывод данных каждого элемента массива в формате таблицы.