Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
#1

Массив строк - C++

25.02.2011, 22:21. Просмотров 507. Ответов 8
Метки нет (Все метки)

Добрый вечер! Решая задачу из главы 7, книги Лафоре, столкнулся с неправильной работой программы, второй и последующие параметры, при вводе строки, пропускаются:
Код:
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
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//////////////////////////////////////////////////////////////////////////////////////////////////
class employee
{
private:
    string name;                    // строка
    long num;                       // число
public:
    employee() : name(), num(0)     // конструктор без аргументов
    { }         
    void getData()                  // ввод значений пользователем
    {
        cout << "\n   Введите имя и фамилию: ";
        getline(cin, name);
        cout << "   Введите табельный номер работника: ";
        cin >> num;
    }
    void putData()                  // возврат введеных значений
    {
        cout << "\n   Должность: " << name << endl;
        cout << "   Табельный номер: " << num << endl;
    }
};
//////////////////////////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    employee s1 [100];              // массиы из 100 значений
    int n = 0;                      // вспомагательная переменная
    char answer;                    // ответ для продолжения цикла
    do                              // цикл для ввода значений
    {
        cout << "Введите параметры сотрудника: " << n + 1;
        s1[n++].getData();          // изменяем вручную переменную для цикла
        cout << "Продолжить ввод (y/n)? ";
        cin >> answer;
    } while(answer != 'n');         // для продолжения цикла
    for(int i = 0; i < n; i++)
    {
        cout << "\nСотрудник " << i + 1 << ": "; 
        s1[i].putData();
    }
    system("PAUSE");
    return 0;
}
Посмотрел решение, аналогичное моему.

Добавлено через 1 час 5 минут
Я так понимаю идей нет ни у кого...
0
Миниатюры
Массив строк  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2011, 22:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив строк (C++):

Сформировать массив строк. Удалить из него одинаковые строки. Сформировать массив строк. Удалить из него К последних строк - C++
Сформировать массив строк. Удалить из него одинаковые строки. Сформировать массив строк. Удалить из него К последних строк.

Вводится массив строк текста с неизвестным заранее количеством строк - C++
1)Вводится массив строк текста с неизвестным заранее количеством строк.Ввод текста заканчивается, если введенная строка текста будет равна...

Используя функцию копирования строк, организуйте конкатенацію и копирование строк в четвертый массив, содержащий полные имена - C++
Пожалуйста с этим заданием. Написать программу, которая описывает четыре массива. Три первых массива должны содержать имена, фамилии и...

Ввод нескольких строк или массив строк - C++
У меня есть массив строк. Нужно ввести несколько строк, но не получается. Вот код: int main() { const int n=4; const int...

Запросить название учебного заведения, специальность и номер группы. записав их в массив из 3 строк. Подсчитать длины каждой строк - C++
Запросить у пользователя название учебного заведения, специальность и номер группы. записав их в массив из 3 строк. Подсчитать длины каждой...

Внесение строк в массив строк (не сложно) - C++
Всем привет. Есть одна проблемка в решении задачи. Задачу я решил, но необходимо немного доделать. Прошу помощи! Заранее благодарен) ...

8
Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 94
25.02.2011, 22:34 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <cstdio>
......                                // ответ для продолжения цикла
    do                                                              // цикл для ввода значений
    {
        cout << "Введите параметры сотрудника: " << n + 1;
        s1[n++].getData();                      // изменяем вручную переменную для цикла
        cout << "Продолжить ввод (y/n)? ";
        cin >> answer;
        fflush(stdin);
    }
    while(answer != 'n');                   // для продолжения цикла
}
1
zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
26.02.2011, 00:56  [ТС] #3
Цитата Сообщение от Vandris Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
#include <cstdio>
    do                                                              // цикл для ввода значений
    {
        ............
        fflush(stdin);
    }
    while(answer != 'n');                   // для продолжения цикла
}
Не работает.
0
Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 94
26.02.2011, 08:07 #4
Не работает.
стоит ли мне говорить, что у меня работает?

а что у вас конкретно: ошибка или все тоже самое, как и без изменений?

P.S. у меня компилятор gcc 4.5.1, у вас как вижу MSVS
0
Миниатюры
Массив строк  
zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
26.02.2011, 11:13  [ТС] #5
Цитата Сообщение от Vandris Посмотреть сообщение
стоит ли мне говорить, что у меня работает?
http://picsave.ru/images/00001.jpg

а что у вас конкретно: ошибка или все тоже самое, как и без изменений?

P.S. у меня компилятор gcc 4.5.1, у вас как вижу MSVS
Да, все без изменения. Компилятор MSVS.
0
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.02.2011, 11:38 #6
Попробуйте так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
do
{
    // очистка istream
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());        
 
    cout << "Введите параметры сотрудника: " << n + 1;
    s1[n++].getData();
    cout << "Продолжить ввод (y/n)? ";
    cin >> answer;
 
} while(answer != 'n');
1
zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
26.02.2011, 12:24  [ТС] #7
Цитата Сообщение от fasked Посмотреть сообщение
Попробуйте так:
C++
1
2
3
4
5
6
do
{
    // очистка istream
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());    
} while(answer != 'n');
Спасибо большое!

Вы можете объяснить, пожалуйста, эти функции.
0
asics
Freelance
Эксперт С++
2847 / 1782 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
26.02.2011, 12:31 #8
fasked, Так вроде и одного
C++
1
cin.sync()
перед
C++
1
getline(cin, name);
хватит, или я ошибаюсь ?
0
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.02.2011, 12:42 #9
Цитата Сообщение от zabuka Посмотреть сообщение
Вы можете объяснить, пожалуйста, эти функции.
Суть проблемы в том, что после ввода строки и нажати клавиши "Enter" во стандартном потоке ввода (stdin - cin) остаются некоторые символы (типа разрыва строки и так далее). Решение проблемы заключается в том, чтобы очистить входящий поток или проигнорировать лежащие в нем символы.

Описание istream

ignore
Извлечь символы (или пропустить): Извлекает (пропускает) n символов из потока.
ignore ( streamsize n = 1, int delim = EOF );

rdbuf
указатель на буфер потока: указатель на связанный (ассоциированный) объект streambuf. Он может быть получен/изменен вызовом функции rdbuf.

streambuf
базовый класс буфера для потоков
Объект streambuf отвечают за выполнение чтения и записи в/из некоторые типы символьных последовательностей, такие как внешние файлы или строки (std::string).
in_avail - input function (get). Позволяет получить количество символов, доступных в настоящий момент для чтения (то есть количество символов, которые уже есть в буфере).

В итоге получаем, что
C++
1
cin.ignore(cin.rdbuf()->in_avail())
означает извлечь (пропустить) столько символов из стандартного потока ввода, сколько в нем уже есть.

Цитата Сообщение от asics Посмотреть сообщение
хватит, или я ошибаюсь ?
да, так тоже можно
2
26.02.2011, 12:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2011, 12:42
Привет! Вот еще темы с ответами:

Добавление неодинаковых строк в массив строк - C++
Здравствуйте! Возникла такая проблема, не могу понять как реализовать добавление в массив строк нодинаковых значений. Вот моя проба, знаю,...

Заполнить массив строк из файла. Массив заполняется, но выводится не корректно - C++
Здравствуйте! Такая проблема. В файле имена записаны в столбик и разделены точкой с запятой. Массив заполняется, но выводится не корректно....

Задано массив строк произвольной длины. Отформатировать данный массив по ширине поля. - C++
Задано массив строк произвольной длины. Отформатировать данный массив по ширине поля.

Массив строк как массив указателей на массивы чаров - C++
Я всё правильно сделал? char* Files; Files = &quot;AHEAD&quot;; Files = &quot;LEFT&quot;; Files = &quot;RIGHT&quot;; Files = NULL; int searchFile()...


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

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

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