#c
#c
Вопрос:
Привет, ребята, я новичок в c , я просто написал этот код, чтобы найти минимальное / максимальное значение массива чисел.
Я просто хочу знать, как я могу сделать количество записей гибким (я имею в виду, что пользователь должен иметь возможность вводить как можно больше записей, не указывая, сколько в начале)
Вот код, но он не работает, может кто-нибудь, пожалуйста, помочь? Код благодарности:
#include <iostream>
using namespace std;
int main(){
cout<<"Program to calculate max/min/second maxn";
int *A;
A=new int[5];
bool flag=false;
int x=0,i=0;
cout<<"Enter the numbersn";
do{
cin>>x;
if(x==''){
flag=true;
}
*(A i)=x;
i ;
}
while(!flag);
for(int j=0;j<i;j ){
cout<<*(A j)<<"n";
}
return 0;
}
Комментарии:
1. Я бы тоже был разочарован, если бы в моем коде не было такого отступа. Пожалуйста, научитесь правильно расставлять отступы в коде даже для самых маленьких программ. [Этот комментарий относится к более ранней правке, до того, как кто-то исправил ваш код за вас.]
Ответ №1:
Вас смущает, что нажатие enter просто выдаст вам нулевой ограничитель. Этого не произойдет. В зависимости от вашей платформы это даст вам возврат каретки / перевод строки ( rn
в Win, n
в * ix). Лучший способ сделать это — просто попросить их использовать букву типа ‘q’ для выхода или число типа -1, а затем сравнить по этому.
Комментарии:
1. Вам нужно изменить прямые косые черты на обратные 🙂
Ответ №2:
Динамическое распределение памяти — немного сложная тема для начинающего программиста (в любом случае, в C и Си .) Самый простой способ — попросить пользователя указать, сколько записей, но вы этого не хотите.
В противном случае использование класса vector поверх массива, вероятно, лучше (и с ним проще справиться, чем напрямую с использованием указателей.)
http://www.cplusplus.com/reference/stl/vector / — хорошее место для начала. Посмотрите на синтаксис для создания вектора и push_back()
функции-члена для выполнения вашей задачи.
Удачи,
SegFaults Макги
Комментарии:
1. Согласен, но это, скорее всего, вопрос CS101 / high school CS, где концепция векторов поразила бы n00b, и их обучают указателям, на самом деле не обучая указателям.
2. Совершенно верно, но если Амир хочет изучить еще немного синтаксиса, векторы могут превратить ситуацию : ( или: O или D: в ситуацию 🙂
Ответ №3:
Вам придется использовать какую-то структуру данных переменной длины, и Vector — лучший выбор для этого, поскольку вы работаете на C . Следовательно, вместо вашего массива фиксированной длины:
int *A;
A=new int[5];
используйте вектор, подобный этому:
std::vector<int> input;
А затем, чтобы добавить значения к этому, используйте следующее:
input.push_back(10);
Ответ №4:
означает, что пользователь должен иметь возможность вводить как можно больше записей, не указывая, сколько в начальной
С учетом вышеуказанного требования и имеющегося у вас кода вы можете ввести в массив не более 5 элементов.
do{
cin>>x;
if(x==''){
flag=true;
}
*(A i)=x;
i ;
}while(!flag);
Используйте std::vector
вместо этого для требования, когда оно неявно управляет памятью для вас.
Ответ №5:
Если вы используете
std::vector<int> a;
тогда ввод становится просто
while (std::cin >> x)
a.push_back(x);
Затем пользователь может нажать ^ D (Unix / Linux / etc) или ^ Z (DOS / Win), когда они ввели все цифры, или использовать программу, как в:
echo 1 4 22 | program
program < input_file
Если вы хотите, чтобы пустая строка обозначала конец ввода, то с помощью проверки ввода:
std::string line;
while (getline(std::cin, line))
{
char c;
std::istringstream iss(line);
int x;
if (iss >> x)
{
a.push_back(x);
char c;
if (iss >> c)
{
std::cerr << "unexpected character '" << c << "' in line '" << line << "', terminatingn";
exit(EXIT_FAILURE);
}
}
else if (!iss.eof())
break; // empty line...
else
{
std::cerr << "unexpected characters in line '" << line << "', terminatingn";
exit(EXIT_FAILURE);
}
}