Дан массив данных, как доделать программу. что бы работала

Alex.K
Сообщения: 8
Зарегистрирован: 15 июн 2009, 18:52

15 июн 2009, 19:12

Дан массив данных о работающих в фирме:
фамилия, имя, отчество, адрес ( улица, дом, квартира) и дата поступления на работу (месяц, год).
Напечатать данные тех из них, кто на сегодняшний день проработал уже не менее 5 лет.
Проблемы такие:
1) пишет (Введите дату) вводишь, нажимаешь Enter, выводит сразу две строки(Введите ФИО: Введите адрес)
2) правильно ли делается сравнение?

Код: Выделить всё

#include <iostream>
 
using namespace std;
int j, g;
 
struct Works{
        char fio[30];  
        char adres[30];
        int year;  
};
 
int main(){
        setlocale(0,"RUS");
        const int count = 3;
 
        int data;
                
                cout<<"Введите дату:";//дата для сравнения
                cin>>data;
        Works workers[count];
 
        for (int i = 0; i < count; i++)
                {
                            cout<<"Введите ФИО: ";   
                                cin.getline(workers[i].fio,30);
                cout<<"Введите адрес: "; 
                                cin.getline(workers[i].adres,30);
                cout<<"Введите дату трудоустройства: "; 
                                cin>>workers[i].year;
        }
                
        for (int i = 0; i < count; i++)
                {
                if ((data-workers[i].year) >= 5)//сравнение
                        cout << "\nНе менее 5 лет проработал(а): \n"<< workers[i].fio
                             << "\nАдрес: " << workers[i].adres << '\n'
                             << "\nДата трудоустройства: " << workers[i].year << '\n'
                             << '\n';
        }
        system("pause");
        return 0;
}
Аватара пользователя
WinMain
Сообщения: 913
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

16 июн 2009, 11:34

Это давно известная проблема. Всё дело в том, что когда ты вводишь в консоль первую строку и нажимаешь Enter, введённая строка считывается, но в буфере консоли остаётся непрочитанным символ перевода строки. Следующая команда на чтение воспринимает этот символ как уже введённую пустую строку. Поэтому не удивительно, что сразу же идёт следующий запрос ввода строки.
тебе после операции cin >> data нужно выполнить ещё одну операцию чтения, чтобы проглотить этот лишний символ.

Попробуй сделать так:
cin >> data;
cin.get();

Или так:
char c;
cin >> data;
cin >> c;

И так после каждой строки.
Аватара пользователя
Airhand
Сообщения: 234
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

16 июн 2009, 11:34

Отключи оптимизация, она, бывает, делает пункт №1.
Для того, чтобы посмотреть тех, кто работает 5 лет надо из текушей даты вычитать дату поступления и потом уже сравнивать. Текущую дату надо взять, а не вычитать из нуля.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Alex.K
Сообщения: 8
Зарегистрирован: 15 июн 2009, 18:52

16 июн 2009, 16:11

WinMain и Airhand спасибо за помощь.
Вот с этим вводится нормально.
cin.get();
Но только не после каждой строки, а после
cout<<"Введите дату:";
cin>>data;
и после
cin>>workers.year;
cin.get();
иначе только один цикл нормально,
а далее снова две строки.

Воздушная рука
(Отключи оптимизация,)-что такое оптимизация? и чтобы я оконча-
тельно на запутался-в данном случае?
(Текущую дату надо взять, а не вычитать из нуля) Но здесь же так и делается (if ((data-workers.year) >= 5)//сравнение).
Сначала дата вводится(data), потом данные, из данных берётся дата поступления(workers.year), и из(data) вычитается.
А при сравнение всё равно ошибка, выводит только 3-и данные, если 2-е данные не соответствуют условию, или 2-е и 3-и данные. если 3-и не
соответствуют условию.
О как.
Аватара пользователя
Airhand
Сообщения: 234
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

16 июн 2009, 17:03

Воздушная рука
Вообще-то ники не переводятся...
что такое оптимизация? и чтобы я оконча-
тельно на запутался-в данном случае?
Оптимизация проводится компилятором. Так что зависит от среды разработки.
Тут не оптимизация, и, скорее-всего, WinMain прав, просто я нечасто сталкиваюсь с консолью.
Скорее всего ошибка с вводом/выводом консоли.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

16 июн 2009, 17:18

&quot писал(а):Отключи оптимизация, она, бывает, делает пункт №1.
Никогда о таком не слышал. Звучит мифически. Производители компиляторы бы понесли огромные убытки, имей их детище такой баг: зачем нужен компилятор, который не генерирует нормальный код без оптимизации. Думаю, что ты с чем-то перепутал.
&quot писал(а):Текущую дату надо взять, а не вычитать из нуля.
Airhand, где ты ноль увидел? Или ты не прочитал следующие две строки после объявления переменной data? Там в эту переменную читается значение к клавиатуры. И даже если бы этого чтения не было, в переменной бы всё равно не был ноль. Там был мы мусор.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Airhand
Сообщения: 234
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

16 июн 2009, 17:37

Romeo писал(а):Никогда о таком не слышал. Звучит мифически. Производители компиляторы бы понесли огромные убытки, имей их детище такой баг: зачем нужен компилятор, который не генерирует нормальный код без оптимизации. Думаю, что ты с чем-то перепутал.
Раз не слышал, значит мало программил. Не знаю как где, а Borland и мелкософт грешат этим, поэтому в Builder-e и VS оптимизацию отключают.
Airhand, где ты ноль увидел? Или ты не прочитал следующие две строки после объявления переменной data? Там в эту переменную читается значение к клавиатуры. И даже если бы этого чтения не было, в переменной бы всё равно не был ноль. Там был мы мусор.
Что б ты знал, по 3 стандарту все встроенные типы всегда инициализируются нулём в той или иной форме.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

16 июн 2009, 18:00

&quot писал(а):Раз не слышал, значит мало программил.
Не буду отвечать на провокацию, Airhand. Ты свой уровень уже показал в другой теме.
&quot писал(а):Не знаю как где, а Borland и мелкософт грешат этим, поэтому в Builder-e и VS оптимизацию отключают.
Продукт, являющийся частью поставки Oracle - достаточно серьёзный пример? Громадный комплекс, установленный в бОльшей части лабораторий и клиник в штатах достаточно серьёзный пример? Над первых продуктом я проработал 4 года, над вторым уже 2. Оптимизация включена по самые помидоры. Где это видано, чтобы официальная feature компилятора отключалась? Зачем такой компилятор вообще нужен? Не знаю на счёт Builder, но оптимизацию в VS отключают не те люди, который мало "программили", а те, которым лень разобраться в сути проблемы.
&quot писал(а):Что б ты знал, по 3 стандарту все встроенные типы всегда инициализируются нулём в той или иной форме.
Чтоб ты знал, согласно стандарта ANSI ISO 97, инициализация нулём касается только глобальных и статических данных, но не касается локальных переменных. Если этот простой факт не знаешь, да ещё и под рукой нет стандарта, то хоть бы на VS проверил перед тем, как писать.

ОК, ладно, этого ты не знаешь. Но мы сейчас совсем о другом. Даные там читаются из стандартного потока, никакого неинициализированного значения там нет. Снова читаешь невнимательно?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Airhand
Сообщения: 234
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

17 июн 2009, 12:50

Romeo писал(а):Не буду отвечать на провокацию, Airhand. Ты свой уровень уже показал в другой теме.
Это, далее, идёт не ответ. Это так себе. :)
Продукт, являющийся частью поставки Oracle - достаточно серьёзный пример? Громадный комплекс, установленный в бОльшей части лабораторий и клиник в штатах достаточно серьёзный пример? Над первых продуктом я проработал 4 года, над вторым уже 2. Оптимизация включена по самые помидоры. Где это видано, чтобы официальная feature компилятора отключалась? Зачем такой компилятор вообще нужен? Не знаю на счёт Builder, но оптимизацию в VS отключают не те люди, который мало "программили", а те, которым лень разобраться в сути проблемы.
Borland пишет на borland-e. В VS пишут такие софтварные гиганты как мелкософт, ISD и другие. И все они отклчают оптимизацию потаму, что ленивые. :D

Снова читаешь невнимательно?
Может я невнимательно читал код.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Alex.K
Сообщения: 8
Зарегистрирован: 15 июн 2009, 18:52

17 июн 2009, 14:29

Я вас понял.
Таки как доделать программу?
Ответить