Ввести массив структур и вывести его на экран - 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");
}

Объяснение кода листинга программы

  1. Объявлен массив структур ekzamen[200] и две функции: Vvod(ekzamen A[200], int kol) и Vivod(ekzamen A[20], int n).
  2. В функции main() объявлены следующие переменные:
    • kol - количество введенных элементов;
    • n - количество элементов, которые нужно ввести;
    • i - счетчик элементов;
    • A - массив структур ekzamen[200].
  3. В функции main() выполняется ввод количества элементов и их структуры с помощью функции Vvod(), после чего выводится структура массива на экран с помощью функции Vivod().
  4. В функции AskAndGetFielsTable() пользователю предлагается ввести номера полей для вывода в таблице.
  5. В функции PrintTable() происходит вывод таблицы с заданными полями.
  6. В функции Vvod() происходит ввод данных для каждого элемента массива: номер группы, фамилия преподавателя, средний балл, номера зачетных книжек.
  7. В функции Vivod() происходит вывод данных каждого элемента массива в формате таблицы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы