Войти

Показать полную графическую версию : Помощь с кодом на С++


arlekon
03-09-2016, 14:15
Ребята при изучении С++ возникли множество вопросов. И вот одни из них (привожу для начала код функции):

int fill_array(double ar[], int limit)
{
using namespace std;
double temp;
int i;
for (i=0; i<limit; i++)
{
cout << "Enter value # " << (i+1) << endl;
cin >> temp;
if (!cin)
{
cin.clear();
while (cin.get() != '\n')
continue;
cout << "Bad input; input process terminated.\n";
break;
}
else if (temp<0)
break;
ar[i] = temp;
}
return i;
}
В общем это функция с именем fill_array куда передается массив и число означающее предел заполнения массива. В функции используется защита от неправильного вода (!cin) и от заполнения массива отрицательными числами (if (temp<0)....). Тело функции main где используется fill_array думаю не стоит приводить. Так вот вопросы:
- оператор continue который используется в циклах для возврата в начало цикла, в данном случае он множество раз возвращает в начало while или всетаки for?
- оператор break (первый) как я понимаю он в циклах типа for переводит управление на последнюю фигурную скобку, т.е если до него дойдет то он прерывает for и не дает заполнить массив (управление не доходит до ar[i]=temp) или всетаки операция break выводит из if на else if (temp<0).
Поправте если ошибаюсь: строки while (cin.get() != '\n') continue; - как я понимаю они означают проходку по всем символам "неправильным" которые ввел юзер до символа новой строки (enter?) и стирания с помощью cin.clear()?.
Плюс, если есть возможность объясните конкретнo как в циклах (в условиях проверки) работаю cin, или cin.get(), получается что в условиях проверки они превращаются в булевы типы, но непонятно успевают ли они присваивать значения массивам или операндам. ну например while (cin >> n) {тело цикла} - вот в этом примере в консоле по идее должно появится запрос на вод n, допустим вел букву d согласно теории это "неправильный вод" и в цикл while мы не входим, но вот позже если попытаться вызвать n он должен быть заполнен d или он должен быть пустой?

lxa85
07-09-2016, 08:25
int fill_array(double ar[], int limit) {
using namespace std; // так ли оно здесь нужно?
double temp;
int i;
for (i = 0; i < limit; i++) {
cout << "Enter value # " << (i + 1) << endl;
cin >> temp;
if (!cin) {
cin.clear();
while (cin.get() != '\n')
continue;
cout << "Bad input; input process terminated.\n";
break;
} else if (temp < 0)
break;
ar[i] = temp;
} //<-- вот сюда ведет брейк
return i;
}
continue - Чтобы быть уверенным где цикл начался, а где закончился - пишите операторные скобки и, пардон, не выпендривайтесь.
Это довольно распространенная ошибка, отформатировать код "на глаз" пропустив скобки, а потом думать о том "что пошло не так"?
В данном случае, т.к. continue относится к while, то он и будет продолжать итерацию в while.
То же самое касается break - он завершает текущую итерацию цикла. Цикл какой? Правильно - счетный for. Его и завершаем.Поправте если ошибаюсь: строки while (cin.get() != '\n') continue; - как я понимаю они означают проходку по всем символам "неправильным" которые ввел юзер до символа новой строки (enter?) и стирания с помощью cin.clear()?. »
Не все там так просто
cin.get() и его друзья (https://cppstudy.wordpress.com/2009/03/27/cin-get-and-co/)

----
Я полагаю правильное изучение С++ сложным для новичка. Чтобы вы в дальнейшем не "прострелили себе ногу", посмотрите на другие, более явные что ли, языки программирования. Но это чистое ИМХО разумеется.

arlekon
07-09-2016, 19:53
Спасибо)) :)

arlekon
11-09-2016, 17:02
Плюс еще кое-что. Товарищ lxa85
Во первых, код был взят из книги (насколько мне известно) американского профессора Stephen Prata, и как мне кажется американцы будуче умнее русских и более продвинутые в создании высоких технологии знают о чем писать для обучения и передачи данных своим ученикам. Тут даже на беглый взгляд можно разглядеть их непомерный энтузиазм. Во вторых, если у вас нет возможности не плюнуть в других при оказании псевдопомощи, то я со всей ответственностью прошу Вас в темы созданные мною больше не писать, и далее, этот ваш "не выпендривайтесь" можете засунуть себе в задницу и там хорошенько законсервировать. Возможно Вы можете отметить для себя, что в тексте моего сообщения небыло вопроса как мне оформлять код, там небыло имени конкретного пользователя у которого я спрашиваю ответа. Тот кто может нормально ответить тот и отвечает, смекаете?
Я надеюсь, что у меня максимально хорошо вышло передать основную идею претензия по вашему ответу. Еще раз спасибо :)

lxa85
11-09-2016, 21:24
Уважаемы arlekon.
Я ценю Ваш юношеский максимализм, спасибо, позабавили.
Мое "не выпендривайтесь" было обращено к "молодым специалистам" "в целом". Т.к. до тех пор, пока они не могут четко ориентироваться, между оператором и составным оператором, им лучше писать синтаксические конструкции полностью. Банально проще и полезней. Сохраняет множество нервов. ;)
При использовании полных синтаксических конструкций у вас скорей всего не возникло бы проблем с операторами прерывания цикла. Равно как и при использовании полного и грамотного форматирования.
Мне проще указать на систематическую ошибку, которая в дальнейшем может привести к печальным результатам и осложнениям в усвоении материала, тем более такого не простого, как С++.

К сожалению, я не могу подтвердить исходник за авторством уважаемого Стефана Прата (Stephen Prata). В данном случае эти строки публикуете Вы, следовательно Вы несете за них ответ.
Что касается авторитета автора строк, то в рунете бытует мнение, что и Бьерн Страуструп (Bjarne Stroustrup) (создатель языка С++, казалось бы куда уж "круче") дает "ложные" и "опасные" примеры, поэтому его книга не рекомендована к начальному обучению. как мне кажется американцы будуче умнее русских и более продвинутые в создании высоких технологии знают о чем писать для обучения и передачи данных своим ученикам. »
Я бы не был столь категоричен в суждениях. Люди везде одинаковые, а ИТ развиваются столь стремительно, что нет возможности лет 5-10 отработать технологии обучения.
----
У меня за плечами чуть больше опыта подготовки программистов и чтения лекций юным адептам. Нюни 25 летнего парня, выглядят смешно. Мне жаль.

arlekon
13-09-2016, 18:23
Вот это: юношеский максимализм » обосновано этим: Мое "не выпендривайтесь" ». Я не просил развернутое сочинение, по теме У меня за плечами чуть больше опыта подготовки программистов и чтения лекций юным адептам. Нюни 25 летнего парня, выглядят смешно. Мне жаль. » типовая песня которую возможно услышать от преподов за +50. К тому же возраст не может быть 100% гарантией адекватности и правоты человека.
Ну а это: Люди везде одинаковые, а ИТ развиваются столь стремительно, что нет возможности лет 5-10 отработать технологии обучения. » это сводит на нет последние надежды услышать от Вас что-то профессиональое, ибо минимум социология, анатомия, генетика, психофизиология намекают нам что есть между людьми небольшие отличия :( . А нахождение (min) таких компании как Intel, Microsoft Corporation, NVIDIA Corporation на территории Америки забивают последний гвоздь.....

lxa85
13-09-2016, 21:54
arlekon, хотите путать "теплое" с "мягким" - путайте, я вам мешать не стану.




© OSzone.net 2001-2012