Ошибка в инициализации массива указателей на функции - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Как правильно инициализировать массив указателей на функции? Компилятор указывает ошибку в этой строчке после знака равно
void (*processGrades[4]) (int(*)[4], int, int) = (f0, f1, f2, f3);
#include <stdio.h>
#define STUDENTS 3
#define EXAMS 4
 
void f0 (const int [][EXAMS], int, int);
void f1 (const int [][EXAMS], int, int);
void f2 (const int [][EXAMS], int, int);
void f3 (const int [][EXAMS], int, int);
 
int main ()
{ 
    int a;
    void (*processGrades[4]) (int(*)[4], int, int) = (f0, f1, f2, f3);
    int studentsGrades [STUDENTS] [EXAMS] = {{77, 68, 86, 73},
                                             {96, 87, 89, 78},
                                             {70, 90, 86, 81}};
 
    printf ("\n0 - massiv ocenok\n1 - min ocenka\n2 - max ocenka\n3 - sredny ocenka po vsem testam dly kagdogo studenta\n4 - viti iz programmi\n");
    scanf ("%d", &a);
 
    while (a >= 0 && a < 4)
    {
        (*processGrades[a])(studentsGrades, STUDENTS, EXAMS);
         printf ("\n0 - massiv ocenok\n1 - min ocenka\n2 - max ocenka\n3 - sredny ocenka po vsem testam dly kagdogo studenta\n4 - viti iz programmi\n");
         scanf ("%d", &a);
    }
    printf ("You entered 4 to end\n");
    return 0;
}
 
/* Выводит массив оценок */
void f0 (const int grades [][EXAMS], int peoplse, int tests)
{
 int i, j;
 printf ("                [0]  [1]  [2]  [3]");
 
 for (i = 0; i <= peoplse - 1; i++)
 {
    printf ("\nstudentGrades[%d] ", i);
 
    for (j = 0; j <= tests - 1; j++)
        printf("%-5d", grades[i][j]);
 }
}
/* Выводит минимальную оценку */
void f1 (const int grades [][EXAMS], int peoplse, int tests)
{
    int i, j, lowGrade = 100;
    for (i = 0; i <= peoplse - 1; i++)
        for (j = 0; j <= tests -1; j++)
            if (grades[i][j] < lowGrade)
                lowGrade = grades[i][j];
            printf("Lowest grade: %d\n", lowGrade);
}
/* Выводит максимальную оценку */
void f2 (const int grades [][EXAMS], int peoplse, int tests)
{
    int i, j, highGrade = 0;
    for (i = 0; i <= peoplse - 1; i++)
        for (j = 0; j <= tests -1; j++)
            if (grades[i][j] < highGrade)
                highGrade = grades[i][j];
            printf("Highest grade: %d\n", highGrade);
}
/* Выводит среднюю оценку для каждого студента */
void f3 (const int grades [][EXAMS], int peoplse, int tests)
{
    int j, i, total = 0;
    for (j = 0; j <= peoplse - 1; j++)
    {
        for (i = 0; i <= tests - 1; i++)
            total += grades [j][i];
        printf ("The average grade for students %d is %d\n", i, total);
        total = 0;
    }
}

Решение задачи: «Ошибка в инициализации массива указателей на функции»

textual
Листинг программы
    void (*processGrades[]) (const int[][EXAMS], int, int) = {f0, f1, f2, f3};
    const int studentsGrades [STUDENTS] [EXAMS] = {{77, 68, 86, 73},
                                             {96, 87, 89, 78},
                                             {70, 90, 86, 81}};

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

  1. Объявляется массив указателей на функции с именем processGrades.
  2. В качестве инициализации для этого массива перечисляются функции f0, f1, f2, f3.
  3. Объявляется массив с именем studentsGrades, который состоит из STUDENTS строк, каждая из которых, в свою очередь, состоит из EXAMS элементов.
  4. Каждая строка массива studentsGrades инициализируется значениями, представляющими оценки студентов.
  5. Первая строка массива studentsGrades инициализируется значениями {77, 68, 86, 73}.
  6. Вторая строка массива studentsGrades инициализируется значениями {96, 87, 89, 78}.
  7. Третья строка массива studentsGrades инициализируется значениями {70, 90, 86, 81}.
  8. Массив studentsGrades содержит оценки студентов по четырем экзаменам.
  9. Массив processGrades содержит указатели на функции, которые будут использоваться для обработки оценок студентов.
  10. Функции f0, f1, f2, f3 предназначены для обработки оценок студентов в соответствии с определенными правилами или алгоритмами.
  11. Значения переменных STUDENTS и EXAMS определяют размер массива studentsGrades и количество экзаменов соответственно.
  12. Значения переменных f0, f1, f2, f3 являются адресами функций, которые будут вызываться для обработки оценок студентов.
  13. Значения переменных 77, 68, 86, 73, 96, 87, 89, 78, 70, 90, 86, 81 являются оценками студентов по различным экзаменам.
  14. Каждая оценка представляет собой результат, полученный студентом по соответствующему экзамену.
  15. Массив processGrades используется для вызова функций, которые будут обрабатывать оценки студентов в соответствии с определенными правилами или алгоритмами.
  16. Каждый элемент массива processGrades содержит указатель на функцию, которая будет вызываться для обработки оценок студентов.
  17. Функции, на которые указывают элементы массива processGrades, могут выполнять различные операции, такие как расчет среднего значения, определение максимальной или минимальной оценки и т. д.
  18. Значения переменных 77, 68, 86, 73, 96, 87, 89, 78, 70, 90, 86, 81 являются входными данными для функций, на которые указывают элементы массива processGrades.
  19. Результатом работы функций, на которые указывают элементы массива processGrades, могут быть измененные значения оценок студентов или другие результаты, в зависимости от правил или алгоритмов, определенных для каждой функции.
  20. Значения переменных STUDENTS и EXAMS могут быть изменены в процессе работы программы, что может привести к изменению размера массива studentsGrades и количества экзаменов.

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


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

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

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