Попытка заставить функцию DisplayStats выполнять итерацию по каждому элементу массивов людей - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь заставить функцию DisplayStats перебирать каждый массив людей и отображать информацию, но она продолжает возвращать некоторые ошибки, которые я не могу понять. У меня есть массив для каждого человека, а затем я кормлю DisplayStats "people [i]" и у меня есть для l oop внутри DisplayStats для итерации каждого человека, но он постоянно говорит мне, что я не объявлен в вызове функции и формальном параметр 1 является неполным, что я не понимаю. Вот мой код:

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

    void DisplayStats(struct person Input[i])
{
    int i;
    for(i=0; i<7; i++)
        printf("%s, %s: %lf PPG in %d\n", Input[i].last, Input[i].first, Input[i].ppg, Input[i].year);
}

struct person
{
    char  first[32];
    char  last[32];
    int   year;
    double ppg;
};

int main(void) 
{
    int i;
    struct person people[6];

    people[0].year=2004;
    people[0].ppg=5.2;
    strcpy(people[0].first,"Jane");
    strcpy(people[0].last,"Doe");

    people[1].year = 2007;
    people[1].ppg = 5.9;
    strcpy(people[1].first,"Brian");
    strcpy(people[1].last,"Smith");

    people[2].year = 2020;
    people[2].ppg = 15.3;
    strcpy(people[2].first,"Kevin");
    strcpy(people[2].last,"McAllister");

    people[3].year = 2019;
    people[3].ppg = 24.8;
    strcpy(people[3].first,"Kobe");
    strcpy(people[3].last,"Bryant");

    people[4].year = 2845;
    people[4].ppg = 93.1;
    strcpy(people[4].first,"Offensive");
    strcpy(people[4].last,"Bias");

    people[5].year = 2371;
    people[5].ppg = 7.9;
    strcpy(people[5].first,"Ronald");
    strcpy(people[5].last,"McDonald");

    people[6].year = 1960;
    people[6].ppg = 28.5;
    strcpy(people[6].first,"Weyland");
    strcpy(people[6].last,"Yutani");

    DisplayStats(people[0]);

    return (0);
}

Вот ошибки:

main.c:14:39: error: ‘i’ undeclared here (not in a function)
 void DisplayStats(struct person Input[i])
                                       ^
main.c:14:26: warning: ‘struct person’ declared inside parameter list will not be visible outside of this definition or declaration
 void DisplayStats(struct person Input[i])
                          ^~~~~~
main.c: In function ‘main’:
main.c:69:15: error: type of formal parameter 1 is incomplete
  DisplayStats(people[0]);

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Следующий предложенный код:

  1. безупречная компиляция
  2. выполняет желаемую функциональность
  3. устраняет «грязную» манипуляцию данными, перемещая все данные в простая таблица
  4. значительно сокращает объем кода
  5. Правильно определяет структуру перед любыми ссылками на эту структуру
  6. Использует соответствующий горизонтальный и вертикальный интервал для удобства чтения
  7. исключает включение ненужных заголовочных файлов
  8. позволяет компилятору определить количество необходимых экземпляров 'struct person'
  9. сворачивает оператор printf для соблюдения правильного поля принтера

А теперь предложенный код:

#include <stdio.h>


struct person
{
    char  first[32];
    char  last[32];
    int   year;
    double ppg;
};


struct person people[] =
{
    { "Jane",       "Doe",        2004, 5.2  },
    { "Brian",      "Smith",      2007, 5.9  },
    { "Kevin",      "McAllister", 2020, 15.3 },
    { "Kobe",       "Bryant",     2019, 24.8 },
    { "Offensive",  "Bias",       2845, 93.1 },
    { "Ronald",     "McDonald",   2371, 9.5  },
    { "Weyland",    "Yutani",     1960, 28.5 }
};


void DisplayStats( struct person Input[] )
{
    for( int i=0; i<7; i++)
    {
        printf( "%s, %s: %lf PPG in %d\n", 
            Input[i].last, 
            Input[i].first, 
            Input[i].ppg, 
            Input[i].year);
    }
}


int main( void ) 
{
    DisplayStats( people );

    return (0);
}

Вывод предложенного кода:

Doe, Jane: 5.200000 PPG in 2004
Smith, Brian: 5.900000 PPG in 2007
McAllister, Kevin: 15.300000 PPG in 2020
Bryant, Kobe: 24.800000 PPG in 2019
Bias, Offensive: 93.100000 PPG in 2845
McDonald, Ronald: 9.500000 PPG in 2371
Yutani, Weyland: 28.500000 PPG in 1960

Предложить ограничение числа цифр после десятичной точки до 1 или 2 с помощью спецификатора «преобразования выходного формата», аналогичного %.2lf

Предложить форматирование выходных строк, чтобы они все занимали одинаковое количество горизонтальных спа се. Аналогично %12.12s для лучшего форматирования вывода

0 голосов
/ 29 февраля 2020

@ user12982636, привет, это даст желаемый результат:

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

      struct person
     {
       char  first[32];
       char  last[32];
       int   year;
       double ppg;
     };

     void DisplayStats(struct person *input)
     {
      struct person * i;
      for(i=input; i-input<7; i++)
      printf("%s, %s: %lf PPG in %d\n", i->last, i->first, i->ppg, i->year);
     }

     int main() 
     {
        struct person people[6];
        people[0].year=2004;
        people[0].ppg=5.2;
        strcpy(people[0].first,"Jane");
        strcpy(people[0].last,"Doe");

        people[1].year = 2007;
        people[1].ppg = 5.9;
       strcpy(people[1].first,"Brian");
       strcpy(people[1].last,"Smith");

       people[2].year = 2020;
       people[2].ppg = 15.3;
       strcpy(people[2].first,"Kevin");
       strcpy(people[2].last,"McAllister");

      people[3].year = 2019;
      people[3].ppg = 24.8;
      strcpy(people[3].first,"Kobe");
      strcpy(people[3].last,"Bryant");

      people[4].year = 2845;
      people[4].ppg = 93.1;
      strcpy(people[4].first,"Offensive");
      strcpy(people[4].last,"Bias");

      people[5].year = 2371;
      people[5].ppg = 7.9;
      strcpy(people[5].first,"Ronald");
      strcpy(people[5].last,"McDonald");

      people[6].year = 1960;
      people[6].ppg = 28.5;
      strcpy(people[6].first,"Weyland");
      strcpy(people[6].last,"Yutani");

      DisplayStats(people);

      return (0);
     }
...