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

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

17 июн 2009, 19:34

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

18 июн 2009, 12:09

1) исправилось, вводится нормально.
А выводом проблеммы.
А при сравнение всё равно ошибка, выводит только 3-и данные, если 2-е данные не соответствуют условию, или 2-е и 3-и данные. если 3-и не
соответствуют условию.
Ерунду выводит.
Аватара пользователя
Airhand
Сообщения: 234
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

18 июн 2009, 12:57

1. Где программишь, в какой среде ? Если в Bulder или VS, то попробуй отключить оптимизацию. Похоже оно слепило 2 цикла в один.
2. Попробуй выводить std::endl вместо "\n".
3. Попробуй заменить одинарные кавычки двойными.
4. После условия в if, поставь "{", а в конце оператора вывода - "}".
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

18 июн 2009, 13:46

&quot писал(а):ISD
Я был уверен, что ты знаешь ISD, если ты из Днепропетровска :) Так вот, я работаю именно в ISD :) Оптимизация в SoftLabMic врублена по максимуму как на Win в студии, так и на AIX серверах.

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

18 июн 2009, 14:05

Romeo писал(а):Я был уверен, что ты знаешь ISD, если ты из Днепропетровска :) Так вот, я работаю именно в ISD :) Оптимизация в SoftLabMic врублена по максимуму как на Win в студии, так и на AIX серверах.
Я знаю ISD, но не работал там. У нас, в городе, на тех проектах, что я знаю, оптимизация вырублена. Не знаю как у вас, в Крыму.
Я повторюсь, но оно того стоит. Оптимизация в компиляторе, это чуть-ли не одна из его основных фич. Если эта фича работает некорректно, то от такого компилятора отказываются, либо, если виноваты люди, которые написали кривой код, то код нужно переписывать, а людей, если они продолжают выдавать на гора код с запашком, то увольнять следует таких людей, да и всё. Сборка проекта, сделанная без оптимизации никому не нужна. Сборка без оптимизации - первый признак профессиональной непригодности команды.
Одна из фич оптимизации: раскрытие циклов. Как прикажеш её делать в том примере ?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

18 июн 2009, 14:48

Короче, ладно, хватит флудить. Я наконец-то нашёл время, чтобы разобрать код. Естественно оптимизация здесь не при чём, а виноваты, как обычно, кривые руки программиста :)

При работе с потоками STL есть известная рекомендация не смешивать чтение строк через оператор >> и с помощью функции getline. Следует использовать либо только одно, либо только другое. Всё дело в том, что оператор >> прячет от пользователя все переводы кареток, расценивая их, как управляющие символы, то есть он завершает ввод строки, когда встречает перевод каретки. Функция getline тоже читает до перевода каретки (либо до другого делиметра, но в нашем коде дилиметр не указан, значит подразумевается дилиметр '\n'). То есть вроде оба способа учитывают перевод каретки и но вот только дейтсвуют они по разному. Оператор >> при достижении '\n' возвращается, оставляя '\n' в потоке, а getline возвращается, удаляя '\n'. Таким образом, если вызвать сначала оператор >>, то следующий за ним вызов getline проскочит за счёт того, что он увидит первым символом в потоке символ '\n', который был оставлен там оператором, и тут же выйдет, вернув пустую строку.

Самый правильный фикс - перейти целиком на использование оператора >>.

Можно также рассмотреть менее кардинальный способ, который предложил WinMain, то есть после КАЖДОГО вызова оператора >>, насильно забирать из потока перевод каретки. Alex.K, обрати внимание на слово, которое я написал большими буквами. Скорее всего ты сделал забор каретки из потока только в одном месте, в то время, как у тебя в программе встречается два места, где вызывается оператор >>.

Вот работающий код:

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

#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;
        char temp[2];
               
                cout<<"Введите дату:";//дата для сравнения
                cin>>data;
                cin.getline(temp, 2);
        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;
                                cin.getline(temp, 2);
        }
               
        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;
}
Сравнение у тебя написано верно и работает оно также верно, я проверил у себя. Если не работает, то давай конкретный пример данных, на которых это видно. Будем разбирать.
&quot писал(а):Я знаю ISD, но не работал там. У нас, в городе, на тех проектах, что я знаю, оптимизация вырублена. Не знаю как у вас, в Крыму.
Я работаю в Севастополе над теми же проектами, над которыми люди работают в Днепропетровске. У нас нет отдельного проекта. Если говоришь, что знаешь проекты, в которых оптимизация отключена, то название проектов, плиз, в студию. Прямо сейчас зайду и посмотрю в настройках и в билд скриптах.
&quot писал(а):Одна из фич оптимизации: раскрытие циклов. Как прикажеш её делать в том примере ?
Одна из фич оптимизации - её интеллектуальность. Оптимизация делается в нужном месте в нужное время. Если она не может быть применена, то она не делается.

Если у тебя есть сомнения, что оптимизацию тут вообще можно применить, то почему говоришь, что в оптимизации дело? Ведь если её нельзя применить, то её здесь нет :) (это вопрос чисто о логике, есть здесь оптимизация на самом деле или нет, это вопрос отдельный)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Alex.K
Сообщения: 8
Зарегистрирован: 15 июн 2009, 18:52

18 июн 2009, 22:08

Среда Microsoft Visual C++ 2008 Express Edition.
отключить оптимизацию
Отлючать JIT-оптимизацию при загрузке модуля(только управляемый код).галочка стоит.
Ещё есть оптимизация кода в Конструкторе Windows Forms там true .
Но это помоему другое
Какую?

Romeo.
Скопировал ваш код.
Ввожу.
дата 062009
ФИО F
адрес ulf
Дата труд. 122001.
далее соот.
i
uli
062003
o
ulo
052008

Выводит 2-е и 3-и данные.
Предложения Airhand проверил,
Набираю как и для вашего кода,
выводит тоже самое.
azrael
Сообщения: 86
Зарегистрирован: 31 май 2009, 15:30
Контактная информация:

19 июн 2009, 12:43

Alex.K писал(а):выводит тоже самое.
А вы возьмите калькулятор и посчитайте на нем разницу между введенными вами датами. По-моему, результат вполне ожидаем. Либо разделите месяц и год, либо при вычислении разности учитывайте, чем месяц отличается от года. Вы просто находите разность двух целых чисел, и нигде не сказано, что это дата.

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

19 июн 2009, 13:32

Romeo писал(а): Я работаю в Севастополе над теми же проектами, над которыми люди работают в Днепропетровске. У нас нет отдельного проекта. Если говоришь, что знаешь проекты, в которых оптимизация отключена, то название проектов, плиз, в студию. Прямо сейчас зайду и посмотрю в настройках и в билд скриптах.
Вообще говоря, это неверно. В ISD много тим, и если вы работаете в разных странах или городах над теми же проектами, это ещё не значит, что в одной тиме.

Одна из фич оптимизации - её интеллектуальность. Оптимизация делается в нужном месте в нужное время. Если она не может быть применена, то она не делается.

Если у тебя есть сомнения, что оптимизацию тут вообще можно применить, то почему говоришь, что в оптимизации дело? Ведь если её нельзя применить, то её здесь нет :) (это вопрос чисто о логике, есть здесь оптимизация на самом деле или нет, это вопрос отдельный)
Покажи где я говорил, что дело в оптимизации. Я говорил, что она МОЖЕТ давать такой результат. Остальное твои фантазии.
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
Классная логика, точнее её отсутствие: говоришь без пробелов, а те что между скобкой и "code", скобкой и "cpp" не считаются ?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

19 июн 2009, 15:39

Alex.K, ну так а кто будет рассказывать в каком ты формате хочешь дату иметь? Мы сами не можем догадаться. В коде у тебя вообще написанно year, то есть год. Я туда и вводил просто год и у меня всё работало.

Если хочешь, чтобы число, которое ты ввёл расценивалось не как число, а как некая сложная конструкция, то ты сам должен обеспечить правильное сравнение для чисел подобного рода. Например, если формат у тебя должен быть таким: mmyyyy (две цифры под месяц и четыре под год), то месяц ты можешь получить по формуле date / 1000, а год по формуле date % 1000. Далее делаешь те проверки, которые тебе нужны.
&quot писал(а):Вообще говоря, это неверно. В ISD много тим, и если вы работаете в разных странах или городах над теми же проектами, это ещё не значит, что в одной тиме.
Не надо мне рассказывать об устройстве мой фирмы, я лучше его знаю. Я попросил указать название продукта, в котором оптимизация отключена, для того, чтобы я это проверил. В продукте, над которым работает моя тима - это не так. Я могу проверить любой продукт, не только свой, лишь скажи его название.
&quot писал(а):Классная логика, точнее её отсутствие: говоришь без пробелов, а те что между скобкой и "code", скобкой и "cpp" не считаются ?
Для недалёких людей естественно логика отсутствует :)

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