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

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

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

Ошибка с целочисленными данными - C++

07.12.2012, 22:57. Просмотров 387. Ответов 11
Метки нет (Все метки)

Есть функция, получающай дату из системы и сохраняющая её в переменные типа int.
C++
1
2
3
4
5
6
7
8
9
void  date::sys(){ 
    time_t t;
    tm *tk;
    time(&t);
    tk = localtime(&t);
    day = tk->tm_mday;
    month = 1+tk->tm_mon;
    year = 1900+tk->tm_year;
}
Есть вторая функция, которая должна менять эти значения.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void date::n_date()
{ N: 
int k=visokos(year);
if ((day == 0) || (month == 0) || (year == 0)){
    cout<<"Ведите ДД ММ ГГГГ:\n";
    cin>>day>>month>>year;
    if (day<1||day>tab_day[k][month-1]||month<1||month>12||year<0)
    {cout<<"Ошибка\n"; goto N;}}
cout<<"Дата введена\n";
cout<<"Задания количества дней N\n";
cin>>n;
day=day+n;
while (day>tab_day[k][month-1])
    if (day>tab_day[k][month-1])
    {int i=day-tab_day[k][month-1];
day=i;
month++;
if (month>12)
{year++;
month=1;}
}
}
Если выполнить первую функцию и вывести значения, то они отображаются нормально(Например day=7 month=12 year=2012). Но во второй функции они имеют непонятные значения. (например day=8337812 month=4059116 year=13568857 )
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2012, 22:57     Ошибка с целочисленными данными
Посмотрите здесь:

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

Массив из структур с двумя целочисленными полями - C++
Я попытался написать программу, определяющую массив из структур с двумя полями, содержащими 5 элементов. Ввод значений элементов с консоли....

Обработка массива точек заданных их целочисленными координатами - C++
а) удалить все точки из IV четверти б) подсчитать количество точек, лежащих на прямой y = x в) найти все наименее удалённые от начала...

Базовый класс (точки в плоскости с целочисленными координатами) - C++
1. Класс точек Базовый класс (точки в плоскости с целочисленными координатами): Конструкторы: по умолчанию, с параметрами и...

вычислите количество точек с целочисленными координатами,находящиеся в круге - C++
вычислите количество точек с целочисленными координатами,находящиеся в круге радиуса R (R&gt;0)

Найти количество точек с целочисленными координатами внутри заданного отрезка - C++
как мне найти количество точек с целочисленными координатами внутри отрезка. Вам даны начальные точки отрезка(координаты)-x и y; и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
07.12.2012, 23:00     Ошибка с целочисленными данными #2
Нужно больше информации. Как что вызывается, откуда и когда
NobleTracer
1 / 1 / 0
Регистрация: 28.09.2012
Сообщений: 29
07.12.2012, 23:09  [ТС]     Ошибка с целочисленными данными #3
Код всего проекта
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
#ifndef __DATE_H
#define __DATE_H
class date
{ int day;
int month;
int year;
int visokos(int) const;
int n;
 
public:
        date();
                int get_year() const {return year;};
                int get_month() const {return month;};
                int get_day() const {return day;};
                void vvod();
                void vivod();
                void n_day();
                void sys();
                void n_month();
 
};
#endif
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
#include "StdAfx.h"
#include "date.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <ctime>
#include <conio.h>
using namespace std;
 
int tab_day [2][12]= {{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}};
date::date() {cout<<"Готово!\n";}
int date:: visokos(int year) const
{ int k=year%4==0&&year%100!=0||year%400==0;
return k;
}
//Ввод дат
void  date::vvod()
{ N: cout<<"Введите ДД ММ ГГГГ\n";
cin>>day>>month>>year;
int k=visokos(year);
if (day<1||day>tab_day[k][month-1]||month<1||month>12||year<0)
{cout<<"Ошибка\n"; goto N;}
else cout<<"Дата введена\n";
}
 
//Получение даты системы
void  date::sys(){ 
    time_t t;
    tm *tk;
    time(&t);
    tk = localtime(&t);
    day = tk->tm_mday;
    month = 1+tk->tm_mon;
    year = 1900+tk->tm_year;
}
 
//Вывод даты
void date::vivod()
{
    cout<<setw(2)<<day<<'.'<<setw(2)<<month<<'.'<<year<<"\n";
}
 
//вычисляющую дату, на N дней вперед по заданной;
void date::n_day()
{ N: 
int k=visokos(year);
if ((day == 0) || (month == 0) || (year == 0)){
    cout<<"Ведите ДД ММ ГГГГ:\n";
    cin>>day>>month>>year;
    if (day<1||day>tab_day[k][month-1]||month<1||month>12||year<0)
    {cout<<"Ошибка\n"; goto N;}}
cout<<"Дата введена\n";
cout<<"Задания количества дней N\n";
cin>>n;
day=day+n;
while (day>tab_day[k][month-1])
    if (day>tab_day[k][month-1])
    {int i=day-tab_day[k][month-1];
day=i;
month++;
if (month>12)
{year++;
month=1;}
}
}
 
void date::n_month()
    { N: 
int k=visokos(year);
if ((day == 0) || (month == 0) || (year == 0)){
    cout<<"Ведите ДД ММ ГГГГ:\n";
    cin>>day>>month>>year;
    if (day<1||day>tab_day[k][month-1]||month<1||month>12||year<0)
    {cout<<"Ошибка\n"; goto N;}}
cout<<"Дата введена\n";
cout<<"Задания количества месяцев N\n";
cin>>n;
month=month+n;
while (month>12)
    if (day>tab_day[k][month-1])
    {int i=day-tab_day[k][month-1];
day=i;
month++;
if (month>12)
{year++;
month=1;}
}
}
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
#include "stdafx.h"
#include "date.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <stdio.h>
#include <ctime>
#include <conio.h>
#include <time.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Rus");
    begin:
    system("cls");
    cout<<"Выберите функцию\n\n";
    cout<<" 0. Выход\n";
    cout<<" 1. Ввод даты\n";
    cout<<" 2. Дата из системы\n";
    cout<<" 3. Изменение даты\n";
    cout<<" 4. Вывод\n"<<" ";
    int nom;
    cin>>nom;
    switch (nom)
    {
    case 0: exit(0);
    case 1: {date d; d.vvod(); break;}
    case 2: {date d; d.sys(); d.vivod(); system("pause"); goto begin; break;}
    case 3: {m1:
        system("cls");
        cout<<" 0. Выход\n";
        cout<<" 1. Изменить дату на несколько дней \n";
        cout<<" 2. Изменить дату на несколько месяцев\n";
        cout<<" 3. Изменить год на несколько лет\n";
        cout<<" 4. Назад\n"<<" ";
        cin>>nom;
        switch (nom){
        case 0:{ exit(0); break;};
            case 1:{date d; d.n_date(); d.vivod(); break;};
            case 2:{ break;};
            case 3:{ break;};
            case 4:{goto begin; break;};
            default :{goto m1; break;}}}
    case 4: {date d; d.vivod(); break;}
    default:cout<<"Не верно!";
        system("pause");
    }
}
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
07.12.2012, 23:22     Ошибка с целочисленными данными #4
внутри кейсов создаются локальные переменные data. Они ничего не знают друг о друге
NobleTracer
1 / 1 / 0
Регистрация: 28.09.2012
Сообщений: 29
07.12.2012, 23:31  [ТС]     Ошибка с целочисленными данными #5
Странно. В функции vivod видны нормально переменные. А в n_date - нет.
А не скажите как передать знаения во все функции? А то я не знаю. Или хоть в каком направлении искать в интернете?
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
07.12.2012, 23:35     Ошибка с целочисленными данными #6
NobleTracer, проблема не в методах класса
проблема в том, что внутри каждого case создается локальная переменная data. и в других кейсах о ней ничего не известно.
NobleTracer
1 / 1 / 0
Регистрация: 28.09.2012
Сообщений: 29
07.12.2012, 23:43  [ТС]     Ошибка с целочисленными данными #7
А я подумал что вы кейсами назвали методы класса...
Огромное спасибо. Убрал из всех case создание date d; и всё заработало как надо.
MrGluck
Модератор
Эксперт CЭксперт С++
7001 / 4172 / 595
Регистрация: 29.11.2010
Сообщений: 11,075
07.12.2012, 23:49     Ошибка с целочисленными данными #8
NobleTracer, избавляйтесь от операторов безусловного перехода goto
и
C++
1
2
3
4
bool date::visokos (int year) const
{
    return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}
Croessmah
07.12.2012, 23:50
  #9

Не по теме:

Цитата Сообщение от I.M. Посмотреть сообщение
NobleTracer, проблема не в методах класса
что и требовалось доказать

NobleTracer
1 / 1 / 0
Регистрация: 28.09.2012
Сообщений: 29
08.12.2012, 00:43  [ТС]     Ошибка с целочисленными данными #10
Цитата Сообщение от MrGluck Посмотреть сообщение
NobleTracer, избавляйтесь от операторов безусловного перехода goto
Как? Покажите хоть на одном примере.
MrGluck
Модератор
Эксперт CЭксперт С++
7001 / 4172 / 595
Регистрация: 29.11.2010
Сообщений: 11,075
08.12.2012, 01:01     Ошибка с целочисленными данными #11
NobleTracer, без проблем
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
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <stdio.h>
#include <ctime>
#include <conio.h>
#include <time.h>
#include <clocale>
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Rus");
    int nom = 1;
    while (nom != 0)
    {
        system("cls");
        cout<<"Выберите функцию\n\n";
        cout<<" 0. Выход\n";
        cout<<" 1. Ввод даты\n";
        cout<<" 2. Дата из системы\n";
        cout<<" 3. Изменение даты\n";
        cout<<" 4. Вывод\n"<<" ";
        cin>>nom;
        switch (nom)
        {
            case 0: exit(0);
            case 1: { break;}
            case 2: { system("pause"); break;}
            case 3:
            {
                int nnom = 1;
                while (nnom != 4)
                {
                    system("cls");
                    cout<<" 0. Выход\n";
                    cout<<" 1. Изменить дату на несколько дней \n";
                    cout<<" 2. Изменить дату на несколько месяцев\n";
                    cout<<" 3. Изменить год на несколько лет\n";
                    cout<<" 4. Назад\n"<<" ";
                    cin>>nnom;
                    switch (nnom)
                    {
                        case 0:{ exit(0); break;};
                        case 1:{ break;};
                        case 2:{ break;};
                        case 3:{ break;};
                        case 4:{ break;};
                        default :{break;}
                    }
                }
            }
            case 4: { break;}
            default:cout<<"Не верно!";
            system("pause");
        }
    }
}
Потыкаете ваши функции, я их убрал т.к. лень было класс объявлять.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2012, 12:09     Ошибка с целочисленными данными
Еще ссылки по теме:

Создать функцию с целочисленными параметрами a и b, возвращающую случайное число из отрезка [a;b] - C++
Создать функцию, которая будет иметь два целочисленных параметра a и b, и в качестве своего значения возвращать случайное целое число из...

Создать класс матриц с целочисленными элементами и определить операции умножения и сложения - C++
Всем привет, помогите с задачей, заранее спасибо. Создать класс матриц с целочисленными элементами и определить операции умножения и...

Функция, которая выполняет обмен значений между двумя целочисленными переменными - C++
Задание такое: написать функцию, которая выполняет обмен между двумя целочисленными переменными. Тип аргумента - int*. #include&lt;iostream&gt;...

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


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

Или воспользуйтесь поиском по форуму:
NobleTracer
1 / 1 / 0
Регистрация: 28.09.2012
Сообщений: 29
08.12.2012, 12:09  [ТС]     Ошибка с целочисленными данными #12
Спасибо. А с goto всё проще в разы... Но я знаю что его лучше не использовать..

Добавлено через 47 минут
Спасибо. Разобрался. В остальных функция тоже убрал все goto.
Yandex
Объявления
08.12.2012, 12:09     Ошибка с целочисленными данными
Ответ Создать тему
Опции темы

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