Ввести массив структур и вывести его на экран - 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() происходит вывод данных каждого элемента массива в формате таблицы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д