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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
LeeZa
0 / 0 / 0
Регистрация: 30.09.2013
Сообщений: 43
#1

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

11.02.2014, 11:58. Просмотров 303. Ответов 7
Метки нет (Все метки)

Задача состояла в том, чтобы из списка выбрать только тех, чья дата рождения попадает в вводимый с клавиатуры промежуток
(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

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

Вычислить значение функции в зависимости от интервала, в который попадает вводимый с клавиатуры аргумент - Pascal
Вычислить значение функции в зависимости от интервала, в который попадает вводимый с клавиатуры аргумент. Для x Є , где a = -2.7, b =...

Удалите из списка А тех людей, чья профессия не указана в списке В - Turbo Pascal
Пусть в списке А хранится информация о людях (фамилия, имя, отчество, профессия) Имеется список В, содержащий перечень профессий. Удалите...

Дата: вывести только год и месяц их рождения - MS Access
Есть таблица с людьми и их днём рождения. Нужно в запросе вывести только год и месяц их рождения в одном поле. Помогите...

Дано список записей с полями:фамилия ученика и дата рождения. Найти тех которые родились зимой - C++
Помогите пожалуйста, задачу надо сдать через пол часа!!! Заранее спасибо

Из списка спортсменов выбрать тех кто занимается плаванием - C++
Из данного списка спортсменов распечатать данные о тех из них, кто занимается плаванием. Указать возраст, сколько лет они занимаются...

Выбрать только тех спортсменов, которые занимаются боксом - Turbo Pascal
Помогите пожалуйста Добавлено через 1 час 18 минут Имеется список спортсменов, который состоит из следующих полей: ФИО, возраст...

7
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
11.02.2014, 12:02 #2
Цитата Сообщение от LeeZa Посмотреть сообщение
В чем ошибка?
в кол-ве if'ов, можно же сделать проще
0
LeeZa
0 / 0 / 0
Регистрация: 30.09.2013
Сообщений: 43
11.02.2014, 12:05  [ТС] #3
Много маленьких If-ов ? но мне же нужен один и тот же рез-тат (вывод)
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
11.02.2014, 12:12 #4
Представьте даты в виде строк "YYYYMMDD" и сравнивайте лексикографически.
0
LeeZa
0 / 0 / 0
Регистрация: 30.09.2013
Сообщений: 43
11.02.2014, 12:13  [ТС] #5
Всем спасибо! Разобралась! Добавила в 2 и 3 условия еще и то, что tm1 != tm2
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
11.02.2014, 12:13 #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))
//вывод даты
}
хотя это и затратно, проще через строки
0
Pikemaster
297 / 297 / 120
Регистрация: 24.09.2013
Сообщений: 765
Завершенные тесты: 4
11.02.2014, 12:22 #7
Первая строка не выполнится, если год не будет находиться в заданных рамках.
Предположим, что год не находится в заданных рамках. Переходим к следующему условию.

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

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

Вообщем вместо первого || вам достаточно поставить условие && и взять оставшуюся часть if'a в скобки.
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
11.02.2014, 12:28 #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;
    }
}
0
11.02.2014, 12:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2014, 12:28
Привет! Вот еще темы с ответами:

Выбрать из учеников тех, которые учатся в 10 классе, и вывести их, с помощью односвязного списка. - C++
Нужно выбрать из учеников тех, которые учатся в 10 классе, и вывести их, с помощью односвязного списка. Программа работает, но почему-то...

Как выбрать из базы только тех, кому на текущую дату нет 18 лет? - Delphi БД
Есть записи в базе даных Имя человека и дата рождения Как выбрать только тех кому нет 18 лет на текущюю дату?

Определить, сколько значений функции попадает в каждый промежуток - Delphi
Попалась вот такая задачка: Отрезок разбит на 16 равных частей. Определить, сколько значений функции F=cos^2(k)(косинус квадрат k)...

Скрыть вводимый текст с клавиатуры - Free Pascal
Бодрого дня, господа. Пытаюсь (пока безуспешно) найти решение такой мысли - нужно, чтоб то, что вводится с клавиатуры не отображалось на...


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

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

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