Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > почему происходит заполнение массива


Автор: kLASTER 25.2.2013, 10:34
здравствуйте! Объясните, пожалуйста, почему не срабатывает условие и массив продолжает заполняться
Код

#include <iostream>

double func(int, int);
using namespace std;
int main()
{ 
  int i = 0;
  int x = 0;
  int * p = new int[10]; 
  cout << "Input rezult the game: " << endl;
  cout << "q for exit\n";
  cin >> x;
  for(i = 0; i < 10; i++)
  {
    if(x)
    {
      cin >> x;
      p[i] = x;
      cout << p[i];
    }
    else
      break;
  }
  delete [] p;
  
  system("PAUSE");
  return 0;
}



И как сделать условие останова через буквенную?
Заранее спасибо!!!

Автор: bsa 25.2.2013, 11:08
kLASTER, ты вводишь тип int, при этом, ты не проверяешь поток на ошибки. Чтобы вводить буквы, тебе необходимо изменить тип переменной, в которую ты читаешь данные:
Код
for(i = 0; i < 10; ++i) {
   std::string value;
   if ((cin >> value) && (value != "q")) {
      std::istringstream stream(value);
      int x;
      if (stream >> x) {
          p[i] = x;
          cout << p[i] << ", " << flush;
      } else
          break;
   } else
      break;

Автор: kLASTER 25.2.2013, 15:03
да, спасибо! Но мне как раз и надо вводить int.
по условию: 
Цитата

Напишите программу, которая запрашивает у пользователя 10 результатов игры 
в гольф, сохраняя их в массиве. При этом необходимо обеспечить возможность 
прекращения ввода до ввода всех 10 результатов. Программа должна отобразить 
все результаты в одной строке и сообщить их среднее значение. Реализуйте 
ввод, отображение и вычисление среднего в трех отдельных функциях,  
работающих с массивами.
 

Получается в первой функции я должен ввести дин. массив, и вводить по одному результату до момента "q"!
Т.к. типы данных разные я пытаюсь false 'НУЛЁМ', он останавливает и последнее значение вводит в остальные ячейки массива!!!

И чета я с первой функцией и застрял. Мне не надо решать всю задачу, я хочу сам! Дайте пинка в правильном напрвлении!!
Заранее СПАСИБО!!!

Автор: feodorv 25.2.2013, 16:02
Цитата(kLASTER @  25.2.2013,  16:03 Найти цитируемый пост)
Но мне как раз и надо вводить int

А какая разница?  С клавиатуры (стандартного входа) всё равно вводятся символы. И уже потом неявным образом происходит преобразование последовательности символов в int. В коде bsa эта неявность грамотно раскрыта, что никак не противоречит условию задачи.

Автор: kLASTER 25.2.2013, 16:38
istringstream - ни разу не было в учебнике, теперь узнав об этом конструкторе я понял как идет преобразование!!!
СПАСИБО!

пс: в книге с потоком связано тока cinget();

Автор: kLASTER 25.2.2013, 22:12
может кому пригодится решение неофита:

Код

#include <iostream>

const int SIZE = 10;

//Прототипы функций
int inputData(int p[], int n);
void outputData(int p[],int n);
void middleValue(int p[], int n);

using namespace std;

int main()
{ 
  int * p = new int[10];
  
  int count = inputData(p, SIZE);//функция ввода данных
  outputData(p, count);//функция просмотра данных
  middleValue(p, count);//среднее значение
  
  delete [] p;
  
  system("PAUSE");
  return 0;
}
//////////////////////////////////////
int inputData(int p[], int n)
{
  int count = 0;
  cout << "Input data of the golf; 'q' its exit:\n";
  int ch;
  for(int i = 0; cin >> ch; i++)
  {
     if(ch == 'q')
       break;
     p[i] = ch;
     count++;
     if(i == 9)
       break;
  }
  return count;
}
/////////////////////////////////////////////////
void outputData(int p[], int n)
{
  for(int i = 1;i < n; i++)
  {
    cout << i << " = " << p[i] << endl;
  }
}
/////////////////////////////////////////////////////
void middleValue(int p[], int n)
{
  float sum = 0;
  float total = 0;
  for(int i = 0; i < n; i++)
  {
    sum += p[i];
  }
  if(!sum)
    return;
  cout << "Middle value:" << endl;
  total = n/sum;
  cout << total << endl;
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)