Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Armatus
53 / 53 / 45
Регистрация: 24.03.2016
Сообщений: 377
Завершенные тесты: 4
1

Непонятное условие while

22.04.2016, 00:17. Просмотров 1001. Ответов 10
Метки нет (Все метки)

Вообщем попрошу знатоков объяснить мне пару строк ( смотреть комментарии к коду )

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
const int ArSize = 10;
void strcount(const char * str);
int main()
{
    using namespace std;
    char input[ArSize];
    char next;
 
    cout << "Enter a line:\n";
    cin.get(input, ArSize);
    while (cin) // Что это за условие? 
    {
        cin.get(next); //Эти вещи мне тоже не совсем понятны
        while (next != '\n') //Эти вещи мне тоже не понятны(2)    
            cin.get(next); //Эти вещи мне тоже не понятны(3)    
        strcount(input); // ну тут вызываем функцию и передаем ей вводимый символ char
        cout << "Enter next line (empty line to quit):\n";
        cin.get(input, ArSize); 
    }
    cout << "Bye\n";
 
    return 0;
}
 
void strcount(const char * str)
{
    using namespace std;
    static int total = 0;        
    int count = 0;               
 
    cout << """ << str <<"" contains ";
    while (*str++) //что это за условие?(2)              
        count++;
    total += count;
    cout << count << " characters\n";
    cout << total << " characters total\n";
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2016, 00:17
Ответы с готовыми решениями:

Непонятное условие
Problem 3. Given two positive integers a, m. Find the inverse element of a by modulo m, i.e., the...

Непонятное условие задачм
Добрый день! У меня если такое задание необходимо подсчитать значение y по следующей формуле ...

Непонятное условие задачи
Напишите перегруженные версии функции iquote(), которая отображает аргументы, заключенные в двойные...

Непонятное условие задачи
Создать класс Array --- одномерный массив целых чисел c задаваемыми границами индексов c...

Непонятное условие задачи
Всем привет! Такая проблема, нужно исправить ошибки в готовом коде, такое задание. Ниже дал условие...

10
GREGOR_812
26 / 26 / 5
Регистрация: 23.04.2014
Сообщений: 130
22.04.2016, 01:08 2
Лучший ответ Сообщение было отмечено Armatus как решение

Решение

Цитата Сообщение от Armatus Посмотреть сообщение
C++
1
while (cin) // Что это за условие?
"до тех пор, пока поток ввода не пуст"
Цитата Сообщение от Armatus Посмотреть сообщение
C++
1
cin.get(next); //Эти вещи мне тоже не совсем понятны
"получить символ из потока ввода и записать его значение в next"
Цитата Сообщение от Armatus Посмотреть сообщение
C++
1
while (next != '\n') //Эти вещи мне тоже не понятны(2)
"до тех пор, пока next не станет символом конца строки"
Цитата Сообщение от Armatus Посмотреть сообщение
C++
1
cin.get(next); //Эти вещи мне тоже не понятны(3)
см. выше
Цитата Сообщение от Armatus Посмотреть сообщение
C++
1
while (*str++) //что это за условие?(2)
"до тех пор, пока не дойдём до конца строки"
А, вообще, читайте книги, в них на ваши вопросы давно ответили.
1
Armatus
53 / 53 / 45
Регистрация: 24.03.2016
Сообщений: 377
Завершенные тесты: 4
22.04.2016, 01:12  [ТС] 3
Спасибо за ответ.
Книги я читаю, и как раз от-туда у меня возникают вопросы
0
GREGOR_812
26 / 26 / 5
Регистрация: 23.04.2014
Сообщений: 130
22.04.2016, 01:14 4
Armatus, плохо читаете, значит. Уверен в этом, судя по вашим топикам, где вы делаете наиболее распространённые ошибки, в любой из книг описанные
0
22.04.2016, 01:14
Armatus
53 / 53 / 45
Регистрация: 24.03.2016
Сообщений: 377
Завершенные тесты: 4
22.04.2016, 01:17  [ТС] 5
GREGOR_812, Книга которую я сейчас читаю ( Стивен Прата 6 издание ) это первая моя книга по с++. И конечно мне не получается осваивать всю информацию сразу, и приходиться возвращаться к истокам и искать нужную информацию, что порой занимает много времени, на форуме отвечают быстрее и чаще всего понятнее чем в книге
0
ValeryS
Модератор
7523 / 5700 / 736
Регистрация: 14.02.2011
Сообщений: 19,505
Завершенные тесты: 1
22.04.2016, 06:34 6
Лучший ответ Сообщение было отмечено Armatus как решение

Решение

Цитата Сообщение от Armatus Посмотреть сообщение
И конечно мне не получается осваивать всю информацию сразу, и приходиться возвращаться к истокам и искать нужную информацию,
пойми главное что цикл while крутится пока условие истинное
а ИСТИНА(TRUE) в Си является любое число кроме 0, 0 соответственно ЛОЖЬ(FALSE)
теперь разберем твой цикл, например этот
Цитата Сообщение от Armatus Посмотреть сообщение
while (*str++) //что это за условие?(2)
*str это разыменованый указатель, т.е показывает значение по адресу
например у тебя str указывает на адрес 1000 там лежит значение 10, *str вернет 10
str++ инкремент(увеличение на 1) указывал на 1000 будет указывать на 1001
плюсики после переменной значит это постинкремент( после) сначала вызовется значение (10) и только потом изменится указатель
т.е порядок действий такой
1 получили значение
2 увеличили указатель
3 сравнили значение с 0
4 если равно выйдем из цикла, иначе войдем в тело цикла

по другому можно написать так
C++
1
while( 0== *str++)
1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4853 / 2496 / 697
Регистрация: 18.10.2014
Сообщений: 4,333
22.04.2016, 08:10 7
Лучший ответ Сообщение было отмечено Armatus как решение

Решение

Цитата Сообщение от GREGOR_812 Посмотреть сообщение
"до тех пор, пока поток ввода не пуст"
В общем случае это не верное утверждение.

Условие while (cin) эквивалентно while (cin.operator bool()), а std::istream::operator bool() возвращает true тогда и только тогда, когда в состоянии потока не выставлены биты failbit и badbit. badbit означает катастрофическую ошибку, а failbit означает лишь то, что предыдущая операция чтения ничего не смогла прочитать. Например, если из потока попытаться прочитать целое число в то время как в потоке сейчас сидит строка "Вася", то чтение будет неудачным и будет выставлен failbit. Условие станет ложным, хотя поток при этом совсем не пуст. Заметьте, кстати, что eofbit в этой проверке никак напрямую не участвует вообще.

И вообще, от цикла с предусловием while (cin) несет той же типичной ошибкой, что и от цикла с предусловием while (!cin.eof()). Путем дополнительных телодвижений внутри тела цикла его можно заставить работать правильно, но я бы сказал, что лучше все таки избегать таких предусловий.
1
Armatus
53 / 53 / 45
Регистрация: 24.03.2016
Сообщений: 377
Завершенные тесты: 4
22.04.2016, 15:43  [ТС] 8
ValeryS, TheCalligrapher, Спасибо вам, этот ресурс ( в частности вы ) лучший мой учитель
0
meJevin
157 / 149 / 92
Регистрация: 18.11.2015
Сообщений: 677
Завершенные тесты: 1
22.04.2016, 16:06 9
ValeryS, получается, это тоже самое, что и while(*str != '\0').
0
Armatus
53 / 53 / 45
Регистрация: 24.03.2016
Сообщений: 377
Завершенные тесты: 4
22.04.2016, 18:30  [ТС] 10
meJevin, а вот это самое понятное для меня условие
0
ValeryS
Модератор
7523 / 5700 / 736
Регистрация: 14.02.2011
Сообщений: 19,505
Завершенные тесты: 1
23.04.2016, 07:52 11
Цитата Сообщение от meJevin Посмотреть сообщение
получается, это тоже самое, что и while(*str != '\0').
да
поскольку '\0' это и есть 0
"терминальный 0" в Си признак конца строки
например строка "ABBA" в памяти будет лежать как 0x41 0x42 0x42 0x41 0x00
и можно записать её так 'A','B','B','A','/0'
а можно так 'A','B','B','A',0;

Добавлено через 2 минуты
Цитата Сообщение от meJevin Посмотреть сообщение
получается, это тоже самое, что и while(*str != '\0').
не совсем, в оригинале все же было увеличение указателя
Цитата Сообщение от Armatus Посмотреть сообщение
while (*str++)
а здесь нет
если и в теле цикла не будет то цикл будет крутится вечно

Добавлено через 12 часов 11 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
while( 0== *str++)
ошибся я и никто не поправил
аналог
C
1
while (*str++)
это конечно же
C
1
while( 0!= *str++)
причем описал правильно, а листинг неправильный привел

Прошу прошения за дезинформацию
1
23.04.2016, 07:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2016, 07:52

Непонятное условие на лабораторную работу
на завтра нужно лабу сделать..все выходные сидел и даже с условием сильно не разобрался..проблема...

Условные операторы. Будет ли проверено условие condition2, если первое условие condition1 ложно?
Подскажите знающие люди новичку в С++ есть условный оператор: 1) if( condition1 &amp;&amp; condition2 )...

Непонятное условие
Здравствуйте. Прошу помочь с решением. Необходимо было создать отчет, в который входят...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru