Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
1

Вылетает программа. Не пойму, почему?

19.03.2016, 10:13. Просмотров 980. Ответов 25
Метки нет (Все метки)

Здравствуйте. Написал прогу на С++ - это лаба по ООП. Но она вылетает. Не пойму почему!
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
73
74
75
76
77
78
79
80
// объявление класса Date
#include <iostream>
using namespace std;
 
class Date
{
    int day, month, year;
    int checkDay(int) const; // вспомогательная функция для проверки допустимости дня месяца
public:
    Date(int = 1, int = 1, int = 2000); // конструктор по умолчанию
    ~Date(); // деструктор
    void print();
};
 
#include "Date.h"
 
Date::Date(int d, int m, int y) // конструктор (должен проверять диапазон)
{
    day = checkDay(d);
    if(m > 0 && m <= 12) // проверить значение месяца
    {
    month = m;
    }
    else
    {
        m = 1; // недействительный месяц заменяется на 1
        cout << "Oops, invalid month ("<< m <<") set to 1.\n";
    }
    year = y;
}
 
Date::~Date() // деструктор
{
}
 
// вспомогательная функция для подтверждения действительности
// дня для данных месяца и года (обрабатывает високосные годы)
int Date::checkDay(int testDay) const 
{
    static const int daysPerMonth[13] =
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
    // определить действительность testDay для указанного месяца
    if(testDay > 0 && testDay <= daysPerMonth[month])
        return testDay;
 
    // проверить 29 февраля для високосного года
    if(month == 2 && testDay == 29 && (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)))
        return testDay;
 
    cout << "Oops, invalid day ("<< testDay <<") set to 1. \n";
    return 1; 
}
 
void Date::print() // напечатать дату
{
    cout << day << "/" << month << "/" << year;
}
 
// реализация интерфейса
 
#include "Date.h"
#include <windows.h>
 
void main()
{
    Date date1(21, 3, 2016);
    Date date2; // по умолчанию 1/1/2000
 
    cout << "format date dd/mm/yy";
    cout << "\n";
    cout << "\ndate1 = ";
    date1.print();
    cout << "\n";
    cout << "\ndate2 = ";
    date2.print();
    cout << "\n";
 
    system("pause");
}
Где здесь, что не правильно????? Помогите, пожалуйста!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2016, 10:13
Ответы с готовыми решениями:

не пойму почему не идет программа
Дана последовательность из n целых чисел. Определить, все ли числа являются...

Почему программа вылетает
Здраствуйте, почему, когда пишу: unsigned char* p = new unsigned char;...

Строка (почему вылетает программа?)
Подскажите пожалуйста почему вылетает программа, вроде всё правильно написано....

Почему вылетает программа на delete []
Здравствуйте, подскажите, пожалуйста, что именно не так и как исправить....

Программа на С++ вылетает, не могу понять почему!?
#include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include...

25
Байт
Эксперт C
18318 / 12029 / 2506
Регистрация: 24.12.2010
Сообщений: 24,293
19.03.2016, 10:40 2
Все не смотрел. Но одну дырку увидел сразу. Строка 26
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
m = 1; // недействительный месяц заменяется на 1
0
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
20.03.2016, 10:54  [ТС] 3
И что это значит? Что за дырка?

Добавлено через 1 час 6 минут
Компилятор ругается на строку 44. Не пойму почему! Что за дурной компилятор?

Добавлено через 21 час 27 минут
Вот я списал код с книги. А он не компилируется. Не пойму что надо этому грёбанному компилятору.
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include <iostream>
using namespace std;
 
// определение класса Date
class Date
{
public:
    Date(int = 1, int = 1, int = 1900); // конструктор по умолчанию
    void print() const;
    ~Date();
private:
    int month;
    int day;
    int year;
    // вспомогательная функция для проверки допустимости дня месяца
    int checkDay(int) const;
};
 
#include "Date.h"
#include <iostream>
 
// конструктор подтверждает действительность месяца; вызывает
// вспомогательную функцию checkDay для подтверждения значения дня
 
Date::Date(int mn, int dy, int yr)
{
    if(mn > 0 && mn <= 12)
        month = mn;
    else
    {
        month = 1; // недействительный месяц заменяется на 1
        cout << "Oops, invalid month ("<< mn <<") set to 1";
    }
 
    year = yr;
    day = checkDay(dy);
 
    // вывести объект Date, чтобы обозначить вызов конструктора
    cout << "Date object constructor for date";
    print();
}
 
// напечатать объект Date в формате mm/dd/yyyy
void Date::print() const
{
    cout << month << '/' << day << '/' << year;
}
 
// вывести объект Date, чтобы обозначить вызов деструктора
Date::~Date()
{
    cout << "Date object destructor for date";
    print();
}
 
// вспомогательная функция для подтверждения действительности
// дня для данных месяца и года (обрабатывает високосные годы)
int Date::checkDay(int testDay) const
{
static const int daysPerMonth[13] = 
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
// определить действительность testDay для указанного месяца
if(testDay > 0 && testDay <= daysPerMonth[month])
    return testDay;
 
// проверить 29 февраля для високосного года
if(month == 2 && testDay == 29 && (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)))
    return testDay;
 
cout << "Oops, invalid day ("<< testDay <<") set to 1.";
return 1;
}
 
#include "Date.h"
// определение класса Employee
 
class Employee
{
public:
    Employee(const char * const, const char * const, const Date &, const Date &);
    void print() const;
    ~Employee();
private:
    char firstName[25];
    char lastName[25];
    const Date birthDate; // композиция: элемент-объект
    const Date hireDate; // композиция: элемент-объект
};
 
#include <iostream>
#include <cstring>
#include "Employee.h"
#include "Date.h"
 
// Конструктор использует список инициализаторов, чтобы передать
// значения конструкторам элементов-объектов birthDate и hireDate
// [Замечание: здесь вызывается "конструктор копии по умолчанию", неявно генерируемый компилятором С++].
Employee::Employee(const char* const first, const char* const last,
                   const Date &dateOfBirth, const Date &dateOfHire)
                   : birthDate(dateOfBirth),
                    hireDate(dateOfHire) // инициализировать
 
                   {
    // копировать first в firstName; убедиться, что строка поместится
    int length = strlen(first);
    length = (length < 25 ? length : 24);
    strncpy(firstName, first, length);
    firstName[length] = '\0';
 
    // копировать last в lastName; убедиться, что строка поместится
    int length = strlen(last);
    length = (length < 25 ? length : 24);
    strncpy(lastName, last, length);
    lastName[length] = '\0';
 
    // вывести объект Employee, чтобы обозначить вызов конструктора
    cout << "Employee object constructor: "
        << firstName << ' ' << lastName;
}
 
// напечатать объект Emplyee
void Employee::print() const
{
    cout << lastName << ", " << firstName << " Hired: ";
    hireDate.print();
    cout << " Birthday: ";
    birthDate.print();
}
 
// вывести объект Employee, чтобы обозначить вызов деструктора
Employee::~Employee()
{
    cout << "Employee object destructor: "
        << lastName << ", " << firstName;
}
 
#include <iostream>
using namespace std;
#include "Employee.h"
 
int main()
{
    Date birth(7, 24, 1949);
    Date hire(3, 12, 1988);
    Employee manager("Bob", "Blue", birth, hire);
 
    manager.print();
 
    cout << "\nTest Date constructor with invalid values:\n";
    Date lastDayOff(14, 35, 1994);
    return 0;
}
Вылетают вот эти ошибки.

Ошибка 1 error C2011: Date: переопределение типа "class" c:\users\александр\documents\visual studio 2012\projects\fig18.10\fig18.10\date.h 5 1 fig18.10
Ошибка 2 error C2027: использование неопределенного типа "Date" c:\users\александр\documents\visual studio 2012\projects\fig18.10\fig18.10\employee.cpp 14 1 fig18.10
Ошибка 3 error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции c:\users\александр\documents\visual studio 2012\projects\fig18.10\fig18.10\employee.cpp 14 1 fig18.10

Ну, помогите же кто-нибудь!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0
Aleksanyan
2 / 2 / 2
Регистрация: 13.05.2015
Сообщений: 29
20.03.2016, 12:00 4
зачем написали строку 19? в нем есть ошибка кажется! файл Date.h где и как определен?
0
eagl69
5 / 10 / 7
Регистрация: 12.10.2011
Сообщений: 506
20.03.2016, 12:25 5
44 строка
C++
1
 void Date::print() const
константа чего? убери....const
0
GbaLog-
Любитель чаепитий
3166 / 1472 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
20.03.2016, 12:37 6
eagl69, Зачем? Константа после имени функции значит, что эта функция не изменяет решительно ничего. А у него это просто вывод данных, поэтому const вполне приемлемо.
0
zss
Модератор
Эксперт С++
7186 / 6681 / 4230
Регистрация: 18.12.2011
Сообщений: 17,629
Завершенные тесты: 1
20.03.2016, 12:42 7
Вот это компилируется без ошибок
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <iostream>
using namespace std;
 
// определение класса Date
class Date
{
public:
    Date(int = 1, int = 1, int = 1900); // конструктор по умолчанию
    void print() const;
    ~Date();
private:
    int month;
    int day;
    int year;
    // вспомогательная функция для проверки допустимости дня месяца
    int checkDay(int) const;
};
 
 
// конструктор подтверждает действительность месяца; вызывает
// вспомогательную функцию checkDay для подтверждения значения дня
 
Date::Date(int mn, int dy, int yr)
{
    if(mn > 0 && mn <= 12)
        month = mn;
    else
    {
        month = 1; // недействительный месяц заменяется на 1
        cout << "Oops, invalid month ("<< mn <<") set to 1";
    }
 
    year = yr;
    day = checkDay(dy);
 
    // вывести объект Date, чтобы обозначить вызов конструктора
    cout << "Date object constructor for date";
    print();
}
 
// напечатать объект Date в формате mm/dd/yyyy
void Date::print() const
{
    cout << month << '/' << day << '/' << year;
}
 
// вывести объект Date, чтобы обозначить вызов деструктора
Date::~Date()
{
    cout << "Date object destructor for date";
    print();
}
 
// вспомогательная функция для подтверждения действительности
// дня для данных месяца и года (обрабатывает високосные годы)
int Date::checkDay(int testDay) const
{
static const int daysPerMonth[13] = 
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
// определить действительность testDay для указанного месяца
if(testDay > 0 && testDay <= daysPerMonth[month])
    return testDay;
 
// проверить 29 февраля для високосного года
if(month == 2 && testDay == 29 && (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)))
    return testDay;
 
cout << "Oops, invalid day ("<< testDay <<") set to 1.";
return 1;
}
 
class Employee
{
public:
    Employee(const char * const, const char * const, const Date &, const Date &);
    void print() const;
    ~Employee();
private:
    char firstName[25];
    char lastName[25];
    const Date birthDate; // композиция: элемент-объект
    const Date hireDate; // композиция: элемент-объект
};
 
 
// Конструктор использует список инициализаторов, чтобы передать
// значения конструкторам элементов-объектов birthDate и hireDate
// [Замечание: здесь вызывается "конструктор копии по умолчанию", неявно генерируемый компилятором С++].
Employee::Employee(const char* const first, const char* const last,
                   const Date &dateOfBirth, const Date &dateOfHire)
                   : birthDate(dateOfBirth),
                    hireDate(dateOfHire) // инициализировать
 
                   {
    // копировать first в firstName; убедиться, что строка поместится
    int length = strlen(first);
    length = (length < 25 ? length : 24);
    strncpy(firstName, first, length);
    firstName[length] = '\0';
 
    // копировать last в lastName; убедиться, что строка поместится
    length = strlen(last);
    length = (length < 25 ? length : 24);
    strncpy(lastName, last, length);
    lastName[length] = '\0';
 
    // вывести объект Employee, чтобы обозначить вызов конструктора
    cout << "Employee object constructor: "
        << firstName << ' ' << lastName;
}
 
// напечатать объект Emplyee
void Employee::print() const
{
    cout << lastName << ", " << firstName << " Hired: ";
    hireDate.print();
    cout << " Birthday: ";
    birthDate.print();
}
 
// вывести объект Employee, чтобы обозначить вызов деструктора
Employee::~Employee()
{
    cout << "Employee object destructor: "
        << lastName << ", " << firstName;
}
 
 
int main()
{
    Date birth(7, 24, 1949);
    Date hire(3, 12, 1988);
    Employee manager("Bob", "Blue", birth, hire);
 
    manager.print();
 
    cout << "\nTest Date constructor with invalid values:\n";
    Date lastDayOff(14, 35, 1994);
    return 0;
}
Никаких include больше не надо. Вы ведь все уже воткнули в один файл.
1
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
20.03.2016, 16:43  [ТС] 8
Нужно, чтобы было тремя файлами.

Добавлено через 13 минут
Вот этот код работает. Спасибо.
0
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
25.03.2016, 16:38  [ТС] 9
Здравствуйте. Написал программу, а она работает некорректно. Помогите, пожалуйста, исправить.
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
using namespace std;
 
// определение класса Date
class Date
{
public:
    Date(int = 1, int = 1, int = 1900); // конструктор по умолчанию
    void Inputdate();
    void print();
    ~Date();
private:
    int month;
    int day;
    int year;
    // вспомогательная функция для проверки допустимости дня месяца
    int checkDay(int) const;
};
 
#include "Date.h"
 
// конструктор подтверждает действительность месяца; вызывает
// вспомогательную функцию checkDay для подтверждения значения дня
Date::Date(int mn, int dy, int yr)
{
    if(mn > 0 && mn <= 12)
        month = mn;
    else
    {
        month = 1; // недействительный месяц заменяется на 1
        cout << "\nOops, invalid month ("<< mn <<") set to 1.";
    }
 
    year = yr;
    day = checkDay(dy);
 
    // вывести объект Date, чтобы обозначить вызов конструктора
    cout << "Date object constructor for date";
    print();
}
 
void Date::Inputdate() // ввод даты с клавиатуры
{
    int m, d, y;
    month = m = 0;
    day = d = 0;
    year = y = 0;
    cin >> m >> d >> y;
 
}
 
// напечатать объект Date в формате mm/dd/yyyy
void Date::print()
{
    cout << month << '/' << day << '/' << year;
}
 
// вывести объект Date, чтобы обозначить вызов деструктора
Date::~Date()
{
    cout << "\nDate object destructor for date";
    print();
}
 
// вспомогательная функция для подтверждения действительности
// дня для данных месяца и года (обрабатывает високосные годы)
int Date::checkDay(int testDay) const
{
static const int daysPerMonth[13] = 
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
// определить действительность testDay для указанного месяца
if(testDay > 0 && testDay <= daysPerMonth[month])
    return testDay;
 
// проверить 29 февраля для високосного года
if(month == 2 && testDay == 29 && (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)))
    return testDay;
 
cout << "\nOops, invalid day ("<< testDay <<") set to 1.\n";
return 1;
}
 
#include "Date.h"
#include <windows.h>
#include <locale.h>
 
void showMenu()
{
cout << "\nМеню:\n";
cout << "1.Ввести и напечатать дату(mm,dd,yyyy).";
cout << "\n0.Выход из программы.";
}
 
void main()
{
    setlocale(LC_ALL, "Russian");
    cout << "Format date mm/dd/yyyy.";
    cout << "\n";
    Date date1(4, 7, 2016);
    cout << "\n";
    Date date2;
    
    char ch=0;
    while (ch != '0') // цикл меню
    {
        showMenu(); // вывод меню на экран
        scanf_s("%c", &ch);
        switch (ch)
        {
        case '1':
            date2.Inputdate();
            date2.print();
            break;
            case '0': // ничего не делаем - выходим из цикла
            break;
            default:
                break;
        }
    }
    cout << "\n";
    
    date1.print();
    cout << "\n";
 
    system("pause");
}
Вот что выдаёт программа
0
Миниатюры
Вылетает программа. Не пойму, почему?  
zss
Модератор
Эксперт С++
7186 / 6681 / 4230
Регистрация: 18.12.2011
Сообщений: 17,629
Завершенные тесты: 1
25.03.2016, 17:14 10
Это называется, каждый любит сам наступать на грабли.
См. оставление символа \n в потоке ввода
строка 42 - 50
C++
1
2
3
4
5
  void Date::Inputdate() // ввод даты с клавиатуры
{
    cout<<"\nВведите дату в формате мес день год:"
    (cin >> month >> day >> year).get();
 }
строка 108
C++
1
2
3
#include <conio.h>
...
ch=getch();
0
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
25.03.2016, 17:29  [ТС] 11
Я что-то не понял. Вы о чём? Я спрашивал почему программа выдает нули вместо введённой даты. В функции Inputdate вообще нет такого символа.
0
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
26.03.2016, 19:57  [ТС] 12
Переписал код.
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// объявление класса Date
#include <iostream>
using namespace std;
 
class Date
{
    int day, month, year;
public:
    Date(int = 1, int = 1, int = 2000); // конструктор по умолчанию
    ~Date(); // деструктор
    void input();
    void print();
};
 
#include "Date.h"
// методы класса Date
 
Date::Date(int d, int m, int y) // конструктор (должен проверять диапазон)
{
    day = d;
    if(m > 0 && m <= 12)
    month = m;
    else
    {
        cout << "Неправильный месяц, введите дату ещё раз: ";
        void input();
    }
    year = y;
}
 
Date::~Date() // деструктор
{
}
 
void Date::input()
{
    int d, m, y;
    cout << "\nВведите дату в формате день, месяц, год: ";
    (cin >> d >> m >> y).get();
}
 
void Date::print() // напечатать дату
{
    cout << day << "/" << month << "/" << year;
}
 
// реализация интерфейса
#include "Date.h"
#include <windows.h>
#include <locale.h>
#include <conio.h>
 
void showMenu();
 
void main()
{
    setlocale(LC_ALL, "Russian");
    Date date1;
    Date date2(1,1,2000); // по умолчанию 1/1/2000
    char ch = _getch();
    while(ch != 0) // цикл меню
    {
        showMenu();
        scanf_s("%c", &ch);
        switch(ch)
        {
        case '1':
            date1.input();
    cout << "\nдата1 = ";
    date1.print();
    break;
        case '0': // выходим из цикла
            break;
        default:
            cout << "\nдата2 = ";
    date2.print();
    break;
        }
    }
    cout << "\n";
    system("pause");
}
 
void showMenu()
{
cout << "\nМеню:\n";
cout << "1.Ввести и напечатать дату.";
cout << "\n0. Вывод даты по умолчанию и выход из программы.";
}
Программа выдаёт вот это
Вылетает программа. Не пойму, почему?

Почему-то не ту дату, которую я ввел с клавиатуры. Не пойму почему так. Где ошибка? Помогите, пожалуйста.
0
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
28.03.2016, 07:50  [ТС] 13
Что-то я не могу понять где ошибка.
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// объявление класса Date
#include <iostream>
using namespace std;
 
class Date
{
    int day, month, year;
public:
    Date(int = 1, int = 1, int = 2000); // конструктор по умолчанию
    ~Date(); // деструктор
    void input();
    void print();
};
 
#include "Date.h"
// методы класса Date
 
Date::Date(int d, int m, int y) // конструктор (должен проверять диапазон)
{
    day = d;
    if(m > 0 && m <= 12)
    month = m;
    else
    {
        cout << "Неправильный месяц, введите дату ещё раз: ";
        void input();
    }
    year = y;
}
 
Date::~Date() // деструктор
{
}
 
void Date::input()
{
    int d, m, y;
    cout << "\nВведите дату в формате день, месяц, год: ";
    (cin >> d >> m >> y).get();
}
 
void Date::print() // напечатать дату
{
    cout << day << "/" << month << "/" << year;
}
 
// реализация интерфейса
#include "Date.h"
#include <windows.h>
#include <locale.h>
#include <conio.h>
 
void showMenu();
 
void main()
{
    setlocale(LC_ALL, "Russian");
    Date date1;
    Date date2; // по умолчанию 1/1/2000
    char ch = 1;
    while(ch != 0) // цикл меню
    {
        showMenu();
        cin >> ch;
        switch(ch)
        {
        case '1':
            date1.input();
    cout << "\nдата1 = ";
    date1.print();
    break;
        case '0': // выходим из цикла
            break;
        default:
            
    break;
        }
    }
    cout << "\nдата2 = ";
    date2.print();
    cout << "\n";
    system("pause");
}
 
void showMenu()
{
cout << "\nМеню:\n";
cout << "1.Ввести и напечатать дату.";
cout << "\n0. Вывод даты по умолчанию и выход из программы.";
}
Помогите, пожалуйста!
0
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
28.03.2016, 07:57  [ТС] 14
Программа выдаёт вот это.
Вылетает программа. Не пойму, почему?

Помогите, пожалуйста!
0
zss
Модератор
Эксперт С++
7186 / 6681 / 4230
Регистрация: 18.12.2011
Сообщений: 17,629
Завершенные тесты: 1
28.03.2016, 08:07 15
C++
1
2
3
4
5
6
7
void Date::input()
{
    //int d, m, y;
    char c; // нужен для пропуска запятых
    cout << "\nВведите дату в формате день, месяц, год: ";
    cin >> day>>c>> month>>c>>year;
}
d,m,h - это НЕ ЧЛЕНЫ классы, а локальные переменные

Добавлено через 1 минуту
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
while(ch != 0) // цикл меню
C++
1
while(ch != '0')
1
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
28.03.2016, 08:43  [ТС] 16
Вот так работает нормально.
http://www.cyberforum.ru/images/attach/png.gif

А вот здесь почему-то не проверяет месяц.
http://www.cyberforum.ru/images/attach/png.gif
Почему так?
0
Миниатюры
Вылетает программа. Не пойму, почему?   Вылетает программа. Не пойму, почему?  
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
28.03.2016, 09:19  [ТС] 17
Почему-то не проверяет дату день и месяц .
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// объявление класса Date
#include <iostream>
using namespace std;
 
class Date
{
    int day, month, year;
    int checkDay(int) const; // вспомогательная функция для проверки правильности дня
public:
    Date(int = 1, int = 1, int = 2000); // конструктор по умолчанию
    ~Date(); // деструктор
    void input();
    void print();
};
 
#include "Date.h"
// методы класса Date
 
Date::Date(int d, int m, int y) // конструктор (должен проверять диапазон)
{
    if(m > 0 && m <= 12)
    month = m;
    else
    {
        month = 1; // неправильный месяц заменяется на 1
        cout << "\nНеправильный месяц ("<< m <<") заменим на 1.";
    }
    day = checkDay(d);
    year = y;
}
 
Date::~Date() // деструктор
{
}
 
void Date::input()
{
    char c; // нужен для пропуска запятых
    cout << "\nВведите дату в формате день, месяц, год: ";
    cin >> day >> c >> month >> c >> year;
}
 
void Date::print() // напечатать дату
{
    cout << day << "/" << month << "/" << year;
}
 
 
// вспомогательная функция для проверки правильности дня
int Date::checkDay(int testDay) const
{
static const int daysPerMonth[13] = 
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
// определить действительность дня для указанного месяца
if(testDay > 0 && testDay <= daysPerMonth[month])
    return testDay;
 
// поверить 29 февраля для високосного года
if(month == 2 && testDay == 29 && (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)))
    return testDay;
 
else
{
cout << "\nНеправильный день ("<< testDay <<") заменим на 1.\n";
return 1;
}
}
 
// реализация интерфейса
#include "Date.h"
#include <windows.h>
#include <locale.h>
#include <conio.h>
 
void showMenu();
 
void main()
{
    setlocale(LC_ALL, "Russian");
    Date date1;
    Date date2; // по умолчанию 1/1/2000
 
    char ch = 1;
    while(ch != '0') // цикл меню
    {
        showMenu();
        cin >> ch;
        switch(ch)
        {
        case '1':
            date1.input();
    cout << "\nдата1 = ";
    date1.print();
    break;
        case '0': // выходим из цикла
            break;
        default:
            
    break;
        }
    }
    cout << "\nдата2 = ";
    date2.print();
    cout << "\n";
 
    system("pause");
}
 
void showMenu()
{
cout << "\nМеню:\n";
cout << "1.Ввести и напечатать дату.";
cout << "\n0. Вывод даты по умолчанию и выход из программы.";
}
http://www.cyberforum.ru/images/attach/png.gif
Не пойму в чём дело.
0
Миниатюры
Вылетает программа. Не пойму, почему?  
icpu
475 / 356 / 91
Регистрация: 10.03.2011
Сообщений: 1,503
Записей в блоге: 4
28.03.2016, 09:34 18
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
C++
1
2
3
4
5
6
void Date::input()
{
* * char c; // нужен для пропуска запятых
* * cout << "\nВведите дату в формате день, месяц, год: ";
* * cin >> day >> c >> month >> c >> year;
}
во время ввода дату проверять не нужно?
0
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
28.03.2016, 09:49  [ТС] 19
Почему-то не проверяет. В классе Date есть функция для проверки дня, а в конструкторе проверка месяца, но почему-то не работает.
0
icpu
475 / 356 / 91
Регистрация: 10.03.2011
Сообщений: 1,503
Записей в блоге: 4
28.03.2016, 10:17 20
А вы в каком порядке эти операции производите? Распишите по пунктам, что у вас где проверяется, и что где вводится.
0
28.03.2016, 10:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2016, 10:17

Почему программа вылетает при конкатенации строк?
Собственно код #ifndef __STRING #define __STRING #include &lt;ostream&gt; ...

считываю текстовый файл в строку, программа вылетает на ровном месте, почему?
Друзья! Вот код #include &lt;windows.h&gt; #include &lt;vector&gt; #include &lt;iostream&gt;...

Почему вылетает программа при 32768, а при 20 все работает нормально?
Помогите исправить, почему программа вылетает при больших числах, а если...


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

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

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