Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613

Почему не работает цикл [B]do{}while(.)[/B], если вводить строку с пробелом?

03.04.2017, 22:52. Показов 624. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Рассматриваю пример из книги Лафоре (ниже). Программа как бы работает, но если вводить имя из двух слов(Имя Фамилия), с пробелом, цикл do{}while(...) не срабатывает. После первой же итерации вторая не начинается. Почему так происходит?
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
using namespace std;
 
class person                        
   {
   protected:
      char name[40];
   public:
      void getName()
         { cout << "   Enter name: "; cin >> name; }
      void putName()
         { cout << "Name is: " << name << endl; }
      virtual void getData() = 0;        //pure virtual func
      virtual bool isOutstanding() = 0;  //pure virtual func
   };
 
class student : public person        //student class
   {
   private:
      float gpa;              //grade point average
   public:
      void getData()          //get student data from user
         {
         person::getName();
         cout << "   Enter student's GPA: "; cin >> gpa;
         }
      bool isOutstanding()
         { return (gpa > 3.5) ? true : false; }
   };
 
class professor : public person      
   {
   private:
      int numPubs;             //number of papers published
   public:
      void getData()           //get professor data from user
         {
         person::getName();
         cout << "   Enter number of professor's publications: ";
         cin >> numPubs;
         }
      bool isOutstanding()
         { return (numPubs > 100) ? true : false; }
   };
////////////////////////////////////////////////////////////////
int main()
   {
   person* persPtr[100];     //array of pointers to persons
   int n = 0;                //number of persons on list
   char choice;
   
   do {
      cout << "Enter student or professor (s/p): ";
      cin >> choice;
      if(choice=='s')                  //put new student
         persPtr[n] = new student;     //   in array
      else                             //put new professor
         persPtr[n] = new professor;   //   in array
      persPtr[n++]->getData();         //get data for person
      cout << "   Enter another (y/n)? ";  //do another person?
      cin >> choice;                    
      } while( choice=='y' );          //cycle until not 'y'
 
   for(int j=0; j<n; j++)              //print names of all
      {                                //persons, and
      persPtr[j]->putName();           //say if outstanding
      if( persPtr[j]->isOutstanding() )
         cout << "   This person is outstanding\n";
      }
   return 0;
   }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2017, 22:52
Ответы с готовыми решениями:

Почему если во вторую и третью строку, вводить сперва символы а потом числа. То atoi, atof выводят "0"
#pragma hdstop #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #define eof 26 #define max 1000 #include &lt;stdlib.h&gt; getline(char s, int...

Как извлечь строку из Listbox'a? Почему цикл не работает?
1) Как из листбокса выделить строку, и по нажатию кнопки чтобы извлеклась эта строка(в текстовый файл)? 2) Цикл работает неправильно: ...

Почему если условие входа в цикл не выполняется, функция заново входит в цикл
Сам код: private void traverse_node(TreeControlItem node) { TreeControlItem childNode = default(TreeControlItem);...

3
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
03.04.2017, 22:59
может нужно char заменить на string. char это знаковая переменная а вы имя и фамилию вводите
пример
C++
1
2
char i='A';
string b="Bool Bo";
а спрашиваеться "Enter student or professor (s/p): " тоисть нужно ввести s студент или p професор
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
03.04.2017, 23:04
Fatmarmelad,
C++
1
cin >> name;
Если ввести "Иванов Иван"
Здесь в name читаются данные из потока до пробела. Прочитали "Иванов".
Остался в потоке "Иван".
Этот остаток читается в choice строкой
C++
61
cin >> choice;
Соответственно условие продолжения цикла while( choice=='y' ) не выполняется.
В качестве эксперимента попробуйте ввести имя "qqqq y". В choice должен записаться 'y' и цикл продолжится.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
03.04.2017, 23:05
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
Почему так происходит?
Потому, что cin >> читает до пробела. Используй getline(). Но тогда, все вводы через cin >>, делай аналогично этому:
C++
1
(cin >> choice).get();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.04.2017, 23:05
Помогаю со студенческими работами здесь

Как работает программа,если можно последовательные этапы, после запуска(что вводить и т.д.)
//--------------------------------------------------------------------------- # include &lt;fstream.h&gt; #include &lt;vcl.h&gt; #pragma hdrstop ...

Класс (вводить данные пока фамилия не будет пробелом)
#include &lt;iostream&gt; #include &lt;clocale&gt; #include &lt;string.h&gt; using namespace std; class Aviabilet { private: static int...

Почему макрос работает, если создавать и запускать его в Командной строке, а если в пакетном файле, то нет?
Подскажите почему если вводить последовательно в командной строке DOSKEY npp=&quot;C:\Program Files\WinRAR\WinRAR.exe&quot; а потом npp, то все...

Как сделать так, чтобы можно было вводить Имя Фамилию с пробелом
Как сделать так, чтобы можно было вводить Имя Фамилию с пробелом и почту? struct mas { char name; char email; }; class x...

do while - почему выполняется цикл, даже если условие истина?
Подскажите пожалуйста, пишу программу вопрос/ответ. При не правильным вводе ответа, программа должна выводить сообщение об ошибке. ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru