Форум программистов, компьютерный форум CyberForum.ru

Ошибка в уловии ( if ). выбрать из списка только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток. - C++

Восстановить пароль Регистрация
 
LeeZa
 Аватар для LeeZa
0 / 0 / 0
Регистрация: 30.09.2013
Сообщений: 43
11.02.2014, 11:58     Ошибка в уловии ( if ). выбрать из списка только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток. #1
Задача состояла в том, чтобы из списка выбрать только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток
(tm1.tm - это дата начала промежутка, tm2.tm - конечная дата промежутка, t.tm - дата рождения (в for) )

Условие:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(  ((tm1.tm_year<t.tm_year) && (t.tm_year<tm2.tm_year)) //1
   || ((tm1.tm_year==t.tm_year) && ((tm1.tm_mon<t.tm_mon) || ((tm1.tm_mon==t.tm_mon)&&    (tm1.tm_mday<=t.tm_mday))))  //2
   || ((t.tm_year==tm2.tm_year) && ((t.tm_mon<tm2.tm_mon) || ((t.tm_mon==tm2.tm_mon)&&(t.tm_mday<=tm2.tm_mday))))  //3
   || (((tm1.tm_year==tm2.tm_year) && (t.tm_year==tm2.tm_year))   && ( ((tm1.tm_mon<t.tm_mon)&&(t.tm_mon<tm2.tm_mon)) || 
        ((tm1.tm_mon==t.tm_mon)&&(tm1.tm_mday<=t.tm_mday)) || ((t.tm_mon==tm2.tm_mon)&&(t.tm_mday<=tm2.tm_mday)) || 
        (((tm1.tm_mon==tm2.tm_mon)&&(t.tm_mon==tm2.tm_mon)) && ((tm1.tm_mday<=t.tm_mday)&&(t.tm_mday<=tm2.tm_mday))) ))    )//4
        
        {
             cout << setw(3) << setiosflags(ios::right)<< i+1<< "|" << setw(15) << setiosflags(ios::right)<< stud[i].fname << "|" << setw(15) << setiosflags(ios::right)
            << stud[i].sname << "|" << setw(15) << setiosflags(ios::right)<< stud[i].date << "|"<< endl;
        }
 
        else {}
       }

Но выдает не только тех, кого нужно. Например:
http://www.cyberforum.ru/attachment....1&d=1392105404

Хотя вроде все условия рассмотрены правильно. В чем ошибка?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2014, 11:58     Ошибка в уловии ( if ). выбрать из списка только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток.
Посмотрите здесь:

Морзянка. Вводимый с клавиатуры текст перевести в последовательность точек и тире с помощью азбуки Морзе. C++
Разобрать структуру с именем ZNAK, содержащую поля: фамилия, имя, знак зодиака, дата рождения C++
проверить попадает ли х в промежуток аб, причём если а больше б поменять их местами C++
C++ Программа не работает (описать класс с именем NOTE (фамилия и инициалы; номер телефона; дата рождения))
Как отобразить вводимый символ с клавиатуры C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
11.02.2014, 12:02     Ошибка в уловии ( if ). выбрать из списка только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток. #2
Цитата Сообщение от LeeZa Посмотреть сообщение
В чем ошибка?
в кол-ве if'ов, можно же сделать проще
LeeZa
 Аватар для LeeZa
0 / 0 / 0
Регистрация: 30.09.2013
Сообщений: 43
11.02.2014, 12:05  [ТС]     Ошибка в уловии ( if ). выбрать из списка только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток. #3
Много маленьких If-ов ? но мне же нужен один и тот же рез-тат (вывод)
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
11.02.2014, 12:12     Ошибка в уловии ( if ). выбрать из списка только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток. #4
Представьте даты в виде строк "YYYYMMDD" и сравнивайте лексикографически.
LeeZa
 Аватар для LeeZa
0 / 0 / 0
Регистрация: 30.09.2013
Сообщений: 43
11.02.2014, 12:13  [ТС]     Ошибка в уловии ( if ). выбрать из списка только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток. #5
Всем спасибо! Разобралась! Добавила в 2 и 3 условия еще и то, что tm1 != tm2
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
11.02.2014, 12:13     Ошибка в уловии ( if ). выбрать из списка только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток. #6
Цитата Сообщение от LeeZa Посмотреть сообщение
Много маленьких If-ов ? но мне же нужен один и тот же рез-тат (вывод)
имелось ввиду кол-во условий, у вас куча || которые мазолят глаза
проще же к примеру написать такую функцию
C++
1
2
3
4
5
6
7
bool compareDate(int a, int b, int c) - 
{
if (a<=b && b<=c)
return true;
else 
return false;
}
а потом вызвать к примеру так вызывать проверку
C++
1
2
3
4
5
6
7
8
if (compareDate(tm1.tm_day,tm.tm_day,tm2.tm_day))
           if  (compareDate(tm1.tm_mon,tm.tm_mon,tm2.tm_mon))
              if (compareDate(tm1.tm_year,tm.tm_year,tm2.tm_year))
//или 
{ if ((compareDate(tm1.tm_day,tm.tm_day,tm2.tm_day) && (compareDate(tm1.tm_mon,tm.tm_mon,tm2.tm_mon)
&&(compareDate(tm1.tm_year,tm.tm_year,tm2.tm_year))
//вывод даты
}
хотя это и затратно, проще через строки
Pikemaster
104 / 104 / 31
Регистрация: 24.09.2013
Сообщений: 297
Завершенные тесты: 1
11.02.2014, 12:22     Ошибка в уловии ( if ). выбрать из списка только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток. #7
Первая строка не выполнится, если год не будет находиться в заданных рамках.
Предположим, что год не находится в заданных рамках. Переходим к следующему условию.

Первое условие второй строки не будет выполняться, если месяц заданной даты будет равен месяцу нижней границы.
Предположим так и есть. Идём дальше.

C++
1
((tm1.tm_mon==t.tm_mon)&&    (tm1.tm_mday<=t.tm_mday))
Год тоже должен быть одинаковый. Это условие выполнится, даже если года будут разные.
Возьмите дату начало промежутка 02.02.2006, а выбранную дату 02.02.1996. Результат будет неверный.

Вообщем вместо первого || вам достаточно поставить условие && и взять оставшуюся часть if'a в скобки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2014, 12:28     Ошибка в уловии ( if ). выбрать из списка только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток.
Еще ссылки по теме:

Дано вещественное число х>0. Добывать корень до тех пор, пока результат не попадет в промежуток C++
C++ Дано список записей с полями:фамилия ученика и дата рождения. Найти тех которые родились зимой
C++ Из списка спортсменов выбрать тех кто занимается плаванием

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

Или воспользуйтесь поиском по форуму:
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
11.02.2014, 12:28     Ошибка в уловии ( if ). выбрать из списка только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток. #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Или не греть голову, а пересмотреть подход к решению задачи.
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>
#include <utility>
 
struct DateTime
{
    DateTime(int d, int m, int y):
        day(d),
        month(m),
        year(y)
    { }
 
    std::string Repr() const
    {
        std::stringstream ss;
        ss << std::setw(4) << std::setfill('0') << year
            << std::setw(2) << std::setfill('0') << month
            << std::setw(2) << std::setfill('0') << day;
 
        return ss.str();
    }
 
    int day;
    int month;
    int year;
};
 
bool operator==(const DateTime& lhs, const DateTime& rhs)
{
    return lhs.Repr() == rhs.Repr();
}
 
bool operator<(const DateTime& lhs, const DateTime& rhs)
{
    return lhs.Repr() < rhs.Repr();
}
 
std::ostream& operator<<(std::ostream& os, const DateTime& dt)
{
    os << dt.day << "." << dt.month << "." << dt.year;
}
 
int main()
{
    using namespace std::rel_ops;
 
    DateTime date_min(1, 1, 2014);
    DateTime date_max(1, 2, 2014);
 
    DateTime a(15, 1, 2014);
    DateTime b(15, 1, 2015);
 
    if (a >= date_min && a <= date_max)
    {
        std::cout << "true" << std::endl;
    }
    else
    {
        std::cout << "false" << std::endl;
    }
 
    if (b >= date_min && b <= date_max)
    {
        std::cout << "true" << std::endl;
    }
    else
    {
        std::cout << "false" << std::endl;
    }
}
Yandex
Объявления
11.02.2014, 12:28     Ошибка в уловии ( if ). выбрать из списка только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток.
Ответ Создать тему
Опции темы

Текущее время: 08:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru