Пишу код под задачу со считалкой в строке и одномерным массивом с людьми. Через поток делю строку на слова и через while выполняю считалку один раз. А нужно пять раз. Вроде зациклил и написал переменную n,чтобы каждый раз отсчет начинался со следующего человека,но оно не работает,т.е. выводит 5 раз тот же результат. В чем может быть проблема?
#include <iostream>
#include <sstream>
#include <string>
#include <Windows.h>
using namespace std;
int main(){
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
std::string sch("Эни, бени, рики, таки, Турба, урба, синтибряки, Эус, бэус, краснобэус, Бац!");
std::cout << "Считалочка: " << sch << endl;
int n,j,i;
int people[5];
people[0] = 1;
people[1] = 2;
people[2] = 3;
people[3] = 4;
people[4] = 5;
cout << "Нумерация людей: ";
for (i = 0; i < 5; i++)
{
printf("%2d", people[i]);
}
cout << endl;
std::stringstream ss(sch);
n = 0;
for (j = 0; j < 5; j++)
{
while (!ss.eof())
{
std::string s;
ss >> s;
i = n;
while (ss >> s)
{
i++;
if (i > 4)
i = 0;
}
}
cout << people[i] << endl;
n++;
}
}
Читайте свой же код и пытайтесь себе рассказать что написали:
while (!ss.eof())
Пока не достигли признака конца ввода(когда достигнете, установится failbit) { std::string s; ss >> s; вводим из строкового потока строку(кстати std::istringstream обьект вполне достаточно) i = n;
while (ss >> s)
пока вводим из потока строку.... Это значит, что если все нормально, то вы достигнете конца ввода после выхода из цикла, поэтому условие внешнего цикла не выполнится и строка будет инициализирована последней строкой из потока. Получается что внешный абсолютно бесполезный
{
i++;
if (i > 4)
i = 0;
}
А это зачем, если вы потом всеравно пытаетесь инициализировать значением n ( i = n; )
}
В общем написан бессмысленный код.
Насколько я понел вам нужен типа такого:
std::istringstream ss(sch);
std::string s;
for (j = 0; ss >> s; j++)
{
if (j > 4)
j = 0;
cout << people[j] << endl;
}
ОБНОВЛЕНИЕ
Чтобы повторить все это, с началом отсчета от следующего, нужен такой цикл:
int j = -1; // чтобы ++j == 0
for (int i = 0; i < 5; ++i) {
while (ss >> s) ++j;
// if ( j > 4 ) j = 0; можно заменить на j % 5
j %= 5;
cout << people[j] << endl;
//после цикла нужно установить gootbit
ss.clear();
//и начать читать заново от начала
ss.seekg(0, std::ios_base::beg);
}
Или же проще:
int n = 0, j = -1;
while (ss >> s) ++n;
for (int i = 0; i < 5; ++i) {
j += n;
// if ( j > 4 ) j = 0; можно заменить на j % 5
j %= 5;
cout << people[j] << endl;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Можно ли считать указатели на функции одним из способов реализации статического полиморфизма?
Пытаюсь решить следующую задачу: создать пользовательскую очередь, в которой каждый элемент равен сумме предыдущих, первый элемент равен...