#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] ;
}
Это должно сработать.