Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
_Eldar_
44 / 29 / 11
Регистрация: 31.10.2009
Сообщений: 200
#1

Структуры - C++

17.01.2010, 10:20. Просмотров 614. Ответов 14
Метки нет (Все метки)

Привет всем. Я описал структуру и заполняю массив из 3 элементов с типом этой структуры вводом с клавиатуры. После первой итерации цикла ввода больше ничего не вводится (( помогите разобраться пожалуйста, заранее благодарен.
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
#include <string.h>
#include <iostream.h>
#include <windows.h>
 
int main (){
 
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
 
   const int l_fio = 20;
 
   struct student{
      char fio[l_fio+1];
      int  group;
      int  value[5];
   };
 
   student stud[3];
 
   for(int i=0; i<3; i++){
 
      cout << "\nВведите ФИО: ";
      cin.get(stud[i].fio, l_fio);
      stud[i].fio[l_fio+1] = '\0';
      cout << "\nВведите группу: ";
      cin >> stud[i].group;
      cout << "\nВведите оценки(5шт.): ";
      for(int j=0; j<5; j++) cin >> stud[i].value[j];
 
   }
   cout << "\nКонтрольный вывод: \n";
   for(int i=0; i<3; i++){
 
      cout << "\nФИО: " << stud[i].fio;
      cout << "\nГруппа: " << stud[i].group;
      cout << "\nОценки(5шт.): ";
      for(int j=0; j<5; j++) cout << stud[i].value[j] << " ";
      cout << "\n\n";
   }
 
   return 0;
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2010, 10:20
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Структуры (C++):

Помещение структуры в вектор, удаление структуры, изменение элементов структуры
Здравствуйте. Помогите разобраться с тем, как: 1 - находить элементы в...

Функция внутри структуры использует указатель, как поле этой структуры
Коротко, есть класс A, описан в файле A_class.h ну и реализованы функции в...

Динамические структуры данных. Программа ввода в структуры и вывода информации из неё.
Автоматизированная информационная система на железнодорожном вокзале содержит...

Структуры, массивы структур (как можно присваивать(инициализировать) значения полям структуры)
Есть у меня вот такая структура, например struct Subject { int cost; int...

Вывод структуры, строка как элемент структуры
Описать структуру с именем TRAIN, содержащую следующие поля: □ название пункта...

Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла?
Ничего нельзя. Итак, новичкам напомню, что после выполнения кода FILE* f=...

14
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
17.01.2010, 10:23 #2
C++
1
cin.getline(stud[i].fio, l_fio);
0
_Eldar_
44 / 29 / 11
Регистрация: 31.10.2009
Сообщений: 200
17.01.2010, 10:27  [ТС] #3
теперь ввод продолжается, но ФИО 2-ой и 3-ий раз я не могу ввести, сразу на группу переходит
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
17.01.2010, 11:13 #4
C++
1
2
        cin >> stud[i].value[j];
    cin.get();
вообще там можно как-то чистить
cin.clear() или cin.ignore() чтоли

Добавлено через 16 минут
cin.clear() - это другое, а cin.ignore() - то, что надо

C++
1
2
        cin >> stud[i].value[j];
    cin.ignore();
1
_Eldar_
44 / 29 / 11
Регистрация: 31.10.2009
Сообщений: 200
17.01.2010, 11:17  [ТС] #5
да работает в принципе и с cin.get(),СПАСИБО, только я так и не понял саму причину ошибки (

Добавлено через 1 минуту
и что игнорирует cin.ignore() ?
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
17.01.2010, 11:21 #6
когда вводишь последнюю оценку, перевод строки после неё идёт в следующий запрос fio
cin.ignore() видимо пропускает всё, что до его вызова в потоке (не думаю, что он пропускает только пробельные)
0
_Eldar_
44 / 29 / 11
Регистрация: 31.10.2009
Сообщений: 200
17.01.2010, 11:29  [ТС] #7
СПАСИБО ЗА ПОМОЩЬ!)
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
17.01.2010, 11:30 #8
в курсе, что, благодаря getline, stud[i].fio[l_fio+1] = '\0'; можно убрать
и вообще
C++
1
    cin.getline(stud[i].fio, sizeof stud[i].fio);
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
17.01.2010, 11:40 #9
cin.clear() - сбрасывает флаги состояния потока (eof, fail, bad,)
cin.ignore() - удаляет символ из потока
cin.ignore(n, 'delim') - удаляет n символов из потока или до символа 'delim' (если он встретится раньше)
cin.ignore(n) - удалаяет n сиволов из потока ('delim' по умолчанию равен eof)

Добавлено через 2 минуты
Можно применить такую конструкцию для очищения потока
C++
1
2
3
4
5
while (!cin.eof())
{
   cin.ignore();
}
cin.clear();
1
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
18.01.2010, 05:21 #10
C++
1
while (!cin.eof())
может зависнуть цикл (при ошибке чтения стандартного потока)
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
18.01.2010, 09:46 #11
Вместо eof можно использовать флаг fail.
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
18.01.2010, 11:31 #12
что-нибудь типа такого
C++
1
while (!(cin.eof() | cin.fail()))
C++
1
while (!cin.eof() && !cin.fail())
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
18.01.2010, 12:29 #13
Эксперименты показали, что пример оказался неудачным, т.к. cin.ignore() не изменяет флаги состояния потока((, также как и оператор взять из потока >>. Для функций getline и get можно так попытаться очистить поток
C++
1
2
3
4
5
if (cin.fail())
{
   cin.clear();
   while (cin.get() != '\n');
}
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
18.01.2010, 13:19 #14
C++
1
while (cin.get() != '\n');
этот может зависнуть, если не сможет прочитать
C++
1
while (cin.get(c) && c != '\n');
Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
#include <iostream>
 
using namespace std;
 
int main(void)
{
    char c;
    
    while (cin.get(c) && c != '\n')
        ;
        
    cout << "ok" << endl;
    
    return 0;
}
Код
[guest@station tmp]$ ./t2
lkajsdflkj.
ok
[guest@station tmp]$ echo abcd | ./t2
ok
[guest@station tmp]$ echo -n abcd | ./t2
ok
[guest@station tmp]$
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
18.01.2010, 14:08 #15
Ну если так пессимистично смотреть, тогда так
C++
1
2
3
4
5
6
7
8
9
if (cin.fail())
{
   cin.clear();
   while (!cin.fail());
   {
      cin.get();
   }
   cin.clear();
}
0
18.01.2010, 14:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2010, 14:08
Привет! Вот еще темы с решениями:

Оператор if и структуры. Возвращение структуры из функции
Здравствуйте, имеется такая вот функция. void InputStructEmployee (int...

Структуры. Вызов данных структуры по указателю. с++
Условие задачи: Помогите, пожалуйста, с как реализовать печать вообще...

Структуры. Работа с файлами, содержащими структуры
2) Дана совокупность сведений, каждое из которых состоит из следующих...

Понятие структуры данных. Элементарные структуры данных. Простые структуры данных
Понятие структуры данных. Элементарные структуры данных. Простые структуры...


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

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

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