1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
1

Массив строк

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

Author24 — интернет-сервис помощи студентам
Добрый вечер! Решая задачу из главы 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2011, 22:21
Ответы с готовыми решениями:

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

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

Имеется текстовый файл, содержащий 20 строк. Переписать каждую из его строк в массив в том же порядке
Имеется текстовый файл, содержащий 20 строк. Переписать каждую из его строк в массив в том же...

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

8
66 / 65 / 29
Регистрация: 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
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
66 / 65 / 29
Регистрация: 19.01.2011
Сообщений: 94
26.02.2011, 08:07 4
Не работает.
стоит ли мне говорить, что у меня работает?

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

P.S. у меня компилятор gcc 4.5.1, у вас как вижу MSVS
Миниатюры
Массив строк  
0
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
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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
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
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
26.02.2011, 12:31 8
fasked, Так вроде и одного
C++
1
cin.sync()
перед
C++
1
getline(cin, name);
хватит, или я ошибаюсь ?
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2011, 12:42
Помогаю со студенческими работами здесь

Ввод нескольких строк или массив строк
У меня есть массив строк. Нужно ввести несколько строк, но не получается. Вот код: int main()...

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru