Пожалуйста, помогите мне пересмотреть или улучшить программу, потому что в ней есть логическая ошибка.
Напишите программу, которая будет искать номер элемента в массиве num [20] = {23,45,1,23,5,78,6,13,1,4,78,18,3,5,26 , 4,5,10,3,45}. Если элемент поиска находится в массиве, подсчитайте количество вхождений этого числа в массив и определите их соответствующие местоположения в массиве. Если элемент поиска отсутствует в массиве, алгоритм должен определить самый большой и самый маленький элемент в данном массиве.
Вот мой код, который должен быть пересмотрен, пожалуйста, помогите мне …
#include<iostream>
using namespace std;
int main()
{
int num[20]={23,45,1,23,5,78,6,13,1,4,78,18,3,5,26,4,5,10,3,45};
int search,c,n,big,small;
float m,oc;
//search the item in the array
cout<<"Enter the number to search\n";
cin>>search;
while(search>0)
{
m=search%10;
if(m==c)
oc++;
search=search/10;
}//show the occurrence
cout<<"Digit occurred "<<oc<<" times";
//show respective array locations
for(c=0; c<20; c++)
{
if(num[c]==search)
{
cout<<search<<" is present at location"<<c+1;
break;
}
}
//show the largest and the smallest element
if(c==num[20])
{
big=num[0];
for(c=1; c<num[20]; c++)
{
if(big<num[c])
{
big=num[c];
}
}
}
cout<<"Largest element : "<<big;
small=num[0];
for(c=1; c<num[20]; c++)
{
if(small>num[c])
small=num[c];
}
cout<<"Smallest element : "<<small;
}
return 0;
}
Это должен быть выход
Enter the number to search : 23 Digit occurred : 1 23 is present at location 1 if the searched Item is not in the array Largest element : 78 Smallest element : 3
Но вывод моей программы неправильный, пожалуйста, помогите мне, ребята.
Ваш предложенный код имеет ряд логических проблем, которые я сначала укажу, затем мой код, который реализует эти примечания, и, наконец, результат, который я получил с этим исправленным кодом:
1) оо не должен быть числом с плавающей запятой, и m не требуется, вместо этого определите oc как int и используйте его для хранения числа вхождений.
2) Я бы настоятельно рекомендовал дезинфицировать ваш ввод, чтобы убедиться, что только int принимается как допустимый ввод, прежде чем возобновится выполнение приложения. Код ниже адаптирован из Как заставить cin брать только цифры за исключением того, что оператор break исключен и вместо него используется логическая переменная. Это важная лучшая практика программирования, поскольку небезопасно предполагать, что пользователь или вызывающее приложение предоставит действительный ввод.
3) Хотя это не всегда необходимо, хорошей практикой является инициализация всех ваших переменных с начальным значением. Это является; однако необходимо определить значения инициализации для переменных, которые используются до определения значения (в противном случае могут возникнуть другие ошибки приложения). Я исправил это, и это приводит к 0 предупреждениям кода.
4) Первый цикл while совершенно не нужен, кроме того, что он неверен для того, что запрашивается, и, возможно, был предназначен для выполнения.
5) Логика в первом цикле for, за исключением неправильного оператора break (особенно потому, что есть интерес к числу вхождений, а не только к первому), и следует за циклом while, может использоваться и комбинироваться после оператора break удаляется, чтобы подсчитать количество вхождений, а также сообщить, в каких местах был найден номер для поиска.
6) Я оставил ссылку на местоположение почти в точности так, как она была у вас; однако, обратите внимание, что местоположение 1, как вы упоминаете в своем вопросе, на самом деле является 0-м элементом массива num. Возможно, будет лучше, если код не добавляет 1 к местоположению, если это не то, что требуется. Я предполагаю, что именно так это и требуется, поэтому я оставил эту часть без изменений.
7) Исходя из указанных выше требований, количество вхождений поискового номера должно быть 0, прежде чем большие и маленькие числа будут определены и отображены, в противном случае их вывод не нужно указывать в выходных данных программы.
8) Наконец, логика для определения больших и малых чисел использует число [20]. Обратите внимание, что num [20] не существует в массиве и, следовательно, значение num [20] не определено и может привести к нарушению доступа или непредвиденным последствиям для приложения, хотя я не нашел ни в этом случае. Вместо этого следует использовать счетчик 20 для количества значений, хранящихся в массиве num.
Вот код, который я использовал, который исправлен согласно вышеупомянутому:
#include <iostream>
#include <limits>
#include <string>
#include <sstream>
using namespace std;
int main(int argc, char ** argv)
{
int num[20]={23,45,1,23,5,78,6,13,1,4,78,18,3,5,26,4,5,10,3,45};
int search = 0, c = 0, n = 0, big = 0, small = 0;
int oc = 0;
bool isint = false;
string line = "";
//search the item in the array
cout << "Enter the number to search: ";
while (!isint)
{
getline(std::cin, line);
stringstream ss(line);
if (ss >> search)
{
if (ss.eof())
{ // Success
isint = true;
}
}
if(!isint)
{
cout << "Please enter a valid number to search: ";
}
}
//show respective array locations
for(c = 0; c < 20; c++)
{
if(num[c] == search)
{
cout << search << " is present at location " << c + 1 << endl;
oc++;
}
}
cout << "Digit occurred " << oc << " times" << endl;
//show the largest and the smallest element
if(oc == 0)
{
big=num[0];
for(c = 1; c < 20; c++)
{
if(big < num[c])
{
big = num[c];
}
}
cout << "Largest element : " << big << endl;
small = num[0];
for(c = 1; c < 20; c++)
{
if(small > num[c])
small = num[c];
}
cout << "Smallest element : " << small << endl;
}
return 0;
}
Выход за номер 23:
Enter the number to search: 23
23 is present at location 1
23 is present at location 4
Digit occurred 2 time(s)
Выход за номер 25:
Enter the number to search: 25
Digit occurred 0 time(s)
Largest element : 78
Smallest element : 1