Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38

Массив строк

25.02.2011, 22:21. Показов 1112. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2011, 22:21
Ответы с готовыми решениями:

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

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

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

8
 Аватар для Vandris
66 / 65 / 29
Регистрация: 19.01.2011
Сообщений: 94
25.02.2011, 22:34
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  [ТС]
Цитата Сообщение от Vandris Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
#include <cstdio>
    do                                                              // цикл для ввода значений
    {
        ............
        fflush(stdin);
    }
    while(answer != 'n');                   // для продолжения цикла
}
Не работает.
0
 Аватар для Vandris
66 / 65 / 29
Регистрация: 19.01.2011
Сообщений: 94
26.02.2011, 08:07
Не работает.
стоит ли мне говорить, что у меня работает?

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

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

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

P.S. у меня компилятор gcc 4.5.1, у вас как вижу MSVS
Да, все без изменения. Компилятор MSVS.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
26.02.2011, 11:38
Попробуйте так:
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  [ТС]
Цитата Сообщение от fasked Посмотреть сообщение
Попробуйте так:
C++
1
2
3
4
5
6
do
{
    // очистка istream
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());    
} while(answer != 'n');
Спасибо большое!

Вы можете объяснить, пожалуйста, эти функции.
0
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
26.02.2011, 12:31
fasked, Так вроде и одного
C++
1
cin.sync()
перед
C++
1
getline(cin, name);
хватит, или я ошибаюсь ?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
26.02.2011, 12:42
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.02.2011, 12:42
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru