Массив внутри структуры;Как я могу сделать мой код более лаконичным? - PullRequest
0 голосов
/ 16 апреля 2019

Я новичок в программировании и борюсь с краткостью кодирования.

Практическая задача дала таблицу значений (имя, ID и четыре опроса для каждого учащегося), которую нам было предложено ввести struct, затем распечатать информацию и среднее значение для каждого учащегося.

Хотя я смог сделать это, мой код для него не элегантен.Мне нужна помощь, чтобы сделать его более лаконичным, чтобы я мог сейчас выработать хорошие навыки кодирования.

Вот практическая проблема:

  • Создание структуры данных для хранения информациина студентов в class.Для каждого студента профессор хочет сохранить (на данный момент это будет расширено позже):

    • имя (строка)
    • идентификационный номер университета (целое число)
    • тестов (массив из 4-х тестов с плавающей точкой)
  • Напишите программу, которая инициализирует переменную в объявлении, а затем вычислит и напечатает среднее значение для каждого студента.

Мне удалось выяснить, как поместить в структуру float с четырьмя значениями, но я не могу понять, как сжать массив внутри структуры, чтобы уменьшить длину моегокод.

Кроме того, я закодировал значения для каждого студента отдельно, но изо всех сил пытался заставить одно печатное заявление работать для всех студентов, и вместо этого мне пришлось включать отдельные печатные заявления для каждого студента.Я подозреваю, что есть лучший способ сделать это с помощью цикла, но я не могу заставить его работать.

#include <stdio.h>
#include <stdlib.h>

struct student{
    char name[30];
    int id_no;
    float quiz[4];
};

int main()
{
    int i;
    float avg;

    struct student student1;
    strcpy(student1.name,"C,Joe");
    student1.id_no = 999;
    student1.quiz[0] = 10.0;
    student1.quiz[1] = 9.5;
    student1.quiz[2] = 0.0;
    student1.quiz[3] = 10.0;

    struct student student2;
    strcpy(student2.name,"Hernandez, Pete");
    student2.id_no = 784;
    student2.quiz[0] = 10.0;
    student2.quiz[1] = 10.0;
    student2.quiz[2] = 9.0;
    student2.quiz[3] = 10.0;

    struct student student3;
    strcpy(student3.name,"Brownnose, Violet");
    student3.id_no = 999;
    student3.quiz[0] = 7.5;
    student3.quiz[1] = 6.0;
    student3.quiz[2] = 8.5;
    student3.quiz[3] = 7.5;

    {
      printf("Name: %s ",student1.name);
      printf("ID: %d ",student1.id_no);
      avg = 0;
      for(i=0;i<3;i++)
      {
        printf(" Quiz %d: %.1f ",i,student1.quiz[i]);
        avg = avg + student1.quiz[i];
      }
      avg = avg/4;
      printf("\nAverage quiz score: %.1f\n",avg);
    }
printf("\n");
    {
      printf("Name: %s ",student2.name);
      printf("ID: %d ",student2.id_no);
      avg = 0;
      for(i=0;i<3;i++)
      {
        printf(" Quiz %d: %.1f ",i,student2.quiz[i]);
        avg = avg + student2.quiz[i];
      }
      avg = avg/4;
      printf("\nAverage quiz score: %.1f\n",avg);
    }
printf("\n");
    {
      printf("Name: %s ",student3.name);
      printf("ID: %d ",student3.id_no);
      avg = 0;
      for(i=0;i<3;i++)
      {
        printf(" Quiz %d: %.1f ",i,student3.quiz[i]);
        avg = avg + student3.quiz[i];
      }
      avg = avg/4;
      printf("\nAverage quiz score: %.1f\n",avg);
    }
    return 0;
}

Выходные результаты выглядят нормально.Однако метод, который я использовал для этого, отсутствует (обратите внимание, что в конце мне пришлось использовать три утверждения для печати - по одному для каждого учащегося).

Заранее благодарен за любую помощь!

Ответы [ 2 ]

3 голосов
/ 16 апреля 2019

Ваша программа не полностью отвечает на приглашение, в котором написано

[...] Напишите программу, которая инициализирует переменную в объявлении [...]

.Выполнение в соответствии с инструкциями несколько упростит ваш код, как вы и хотите.Например:

struct student student1 = { .name = "C,Joe", .id_no = 999, .quiz = { 10.0, 9.5, 0.0, 10.0 }};

Пока вы предоставляете инициализаторы в порядке объявления членов, не пропуская, вы можете сокращать это далее, опуская указатели членов и предоставляя только значения инициализации.Я предпочитаю использовать обозначения, хотя, как мне кажется, более понятным.

Далее я кодировал значения для каждого учащегося отдельно, но изо всех сил пытался заставить одно печатное заявление работать для всех ученикови вместо этого должен был включать отдельные заявления для печати для каждого студента.Я подозреваю, что есть лучший способ сделать это с помощью цикла, но я не могу заставить его работать.

Если вы хотите выполнить цикл, то вам нужна какая-то структура данных, которая поддерживает итерацию.Массивы - очевидный вид, но связанный список может также работать.Выбрав маршрут массива, вы можете избежать отдельных переменных для студентов, например:

struct student students[] = {
    { .name = "Alice", .id_no = 42, .quiz = { 1.0, 2.5, 3.0, 0.0 }},
    { .name = "Bob", .id_no = 99, .quiz = { 10.0, 9.5, 8.0, 7.0 }},
    // ...
};

Затем вы можете циклически перемещаться по массиву, работая на каждой итерации с students[i], для i в диапазонедействительных показателей students.

0 голосов
/ 16 апреля 2019

Если кто-нибудь натолкнется на этот вопрос после аналогичной борьбы, вот мое решение после интеграции невероятно полезного ответа Джона Боллинджера:

#include <stdio.h>
#include <stdlib.h>

struct students{
    char name[30];
    int id_no;
    float quiz[4];
};

int main()
{
    int i,j;
    float runsum;

    struct students student[] = {{ .name = "C,Joe", .id_no = 999, .quiz = { 10.0, 9.5, 0.0, 10.0 }},
    { .name = "Hernandez, Pete", .id_no = 784, .quiz = { 10.0, 10.0, 9.0, 10.0 }},
    { .name = "Brownnose, Violet", .id_no = 332, .quiz = { 7.5, 6.0, 8.5, 7.5 }}
    };

    for(i=0;i<3;i++)
    {
        printf("Name: %s ",student[i].name);
        printf("ID: %d ",student[i].id_no);
        runsum = 0;
        for(j=0;j<4;j++)
        {
            runsum = runsum + student[i].quiz[j];
        }
        printf(" Quiz average: %.2f\n",runsum/4);
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...