Проблема при инициализации массива - PullRequest
0 голосов
/ 02 августа 2020

Я столкнулся с проблемой при инициализации массива в C. Я пытаюсь ввести переменную 'n' и объявить массив mark [n] с нулевым значением. Для этого я написал следующую часть программы.

int n,k,e,m,x;
scanf("%d %d %d %d", &n,&k,&e,&m);
int marks[n]={0};

, но выполнение программы генерирует следующие предупреждения и ошибки:

prog.c: In function ‘main’:

prog.c:10:6: error: variable-sized object may not be initialized
      int marks[n]={0};
      ^~~

prog.c:10:20: warning: excess elements in array initializer
      int marks[n]={0};
                    ^

prog.c:10:20: note: (near initialization for ‘marks’)

Это вся программа:

#include <stdio.h>
int main(int argc, char const *argv[])
{
int t;
scanf("%d",&t);
for (int z = 0; z < t; ++z)
{
    int n,k,e,m,x;
    scanf("%d %d %d %d", &n,&k,&e,&m);
    int marks[n]={0};
  /*gets the total marks of each students. mark of the last exam of the n-th student is not taken*/
    for (int i = 0; i < n; ++i)
    {
        for(int j=0;j<e;j++)
        {
            if (i==n-1 && j==e-1)
            {
                break;
            }
            scanf("%d",&x);
            marks[i]=marks[i]+x;
        }
    }
             /*sorting*/
    for (int i = 0; i < n-2; i++)
    {
        for(int j=i; j<n-2; j++)
        {
            if (marks[j]<marks[j+1])
            {
                int temp = marks[j];
                marks[j]= marks[j+1];
                marks[j+1]=temp;
            }
        }
    }
        /*prints the needed marks*/
    x=marks[k-1]-marks[n-1];
    printf("%d\n",x+1 );
}


return 0;
}

Моя цель - набрать n = количество кандидатов, k = количество мест в школе, e = количество экзаменов, m = максимально достижимые оценки за один экзамен. Я хочу знать, сколько баллов потребуется n-му студенту на его выпускном экзамене, чтобы быть допущенным к зачислению. Его оценка на последнем экзамене не используется в качестве входных данных в программе, и я хочу выяснить, сколько баллов ему потребуется на последнем экзамене. выпускной экзамен.

Как я могу его решить?

1 Ответ

1 голос
/ 03 августа 2020

Из C Стандарт (6.7.9 Инициализация)

3 Тип инициализируемого объекта должен быть массивом неизвестного размера или полным типом объекта, который не тип массива переменной длины.

Поэтому вместо этого объявления с инициализатором

int marks[n]={0};

используйте

int marks[n];
memset( marks, 0, n * sizeof( int ) );

Обратите внимание на это n не может быть равно нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...