Проверка того, сколько раз было введено число

#c #arrays #loops

Вопрос:

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

Он продолжал отображаться 100000 в выводе после того, как я ввел значения. Откуда это 1 берется?

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

Вопрос в том (и я цитирую),:

Напишите программу, которая:

 Asks the user to enter 10 numbers between 1 and 5 into an array and displays the array on screen.
Creates a second array of size 5 and fills it with zeros.
Counts how many 1s, 2s, , … 5s have been entered into the first array and stores this number in the second array.
Displays the second array as shown in the example below.
 

Код:

 int A1[10];
int A2[5] = { 0,0,0,0,0 };
int count = 10;
for (int i = 0; i < count; i  )
{
here:
    cout << endl << i   1 << "- enter a number between 1 and 5 for value : ";
    cin >> A1[i];
    if (A1[i] < 1 || A1[i]>5)
    {
        cout << "eror! enter a number between 1 and 5!";
        goto here;
    }
    
}


for (int i = 0; i < 10; i  )
{
    for (int j = 1; j < 6; j  )
    {
        if (A1[i] = j)
        {
            A2[j - 1]  ;
            break;
        }
    }

}


for (int i = 0; i < 5; i  )
    cout << A2[i];
 

Комментарии:

1. У вас должна быть очень веская причина для использования goto . Я не уверен, что такая причина существует. В вашем случае нет веской причины для использования кода спагетти; Его следует изменить на что-то вроде cin >> A1[i]; while(A1[i] < 1 || A1[i] > 5) { cout << "error! enter a number between 1 and 5!n"; cin >> A1[i];}

2. Предложение: Повысьте уровни предупреждений вашего компилятора и обратите на них внимание, даже если код все равно компилируется. MSVC в /W4, или Clang, или GCC со стеной, предупредили бы вас об ошибке здесь.

3. Несвязанное: вы будете волновать меньше людей, если будете контролировать, когда вы i немного увеличитесь и goto выпишете результат. goto исправить это сложнее, чем кажется, и даже когда вы все делаете правильно, еще труднее доказать людям, что вы все сделали правильно. Я обнаружил, что почти всегда требуется меньше времени, чтобы переписать код без goto этого, чем для объяснения и защиты goto . В этом случае do while цикл/, который повторяется до тех пор, пока внутри цикла не будет обеспечен хороший ввод for , должен заставить всех замолчать.

Ответ №1:

Ошибка находится в строке 21 или 22, вы используете один = , который является знаком присвоения, внутри оператора if , поэтому вы переписываете значение A[i] на значение j , но хотите проверить A[i] , равен ли элемент j … Поэтому вам нужно добавить a = в оператор if.

Комментарии:

1. Весь внутренний for цикл и if оба являются ненужными и могут быть заменены A2[A1[i] - 1] ; .

Ответ №2:

Я не рекомендую вам использовать goto: , это создает код спагетти. вы можете вставить i-- в свое предложение об ошибке, например, так:

 int temp;
for (int i = 0; i < count; i  ){
    cout << i   1 << "- enter a number between 1 and 5 for value : " << endl;
    cin >> temp;
    if (temp >= 1 amp;amp; temp <=5)
        A1[i] = temp; 
    else
        i--;  
}
 

Кроме того, если вы хотите сравнить 2 значения, вам следует использовать == оператор. вот что вызывает проблему во втором цикле

вот так:

 for(int i = 0; i < count; i  ){
  for(int j = 1; j < 6; j  )
    if(A1[i] == j)
      A2[j-1]  ;
}
 

Это должно сработать.