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

Прекращена работа программы - C++

Восстановить пароль Регистрация
 
dac
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 6
22.09.2013, 23:20     Прекращена работа программы #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
50
51
52
53
54
55
56
57
58
59
60
#include "stdafx.h"
#include <iostream>
#include <locale>
using namespace std;
 
static char daytab [2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
 
class DATE{
    int d,m,y;
public:
    void INPUT()
    {cout<<"\n День - ";
     cin>>d;
     cout<<" Месяц - ";
     cin>>m;
     cout<<" Год - ";
     cin>>y;
     cout<<"\n";
    }
    int YEAR()
    {return (y%4==0 && y%100!=0 || y%400==0);
    }
    int REST(DATE &P,DATE &L)
    {int p,l,rest;
     char *pp;
     char *ll;
     p=P.YEAR();
     l=L.YEAR();
     pp=daytab[p];
     ll=daytab[l];
     while (--P.m)
        P.d+=*++pp;
     while (--L.m)
        L.d+=*++ll;
     if (P.y==L.y)
         rest=L.d-P.d;
     else
        {if (ll==0)
            rest=L.d-P.d+365;
        else 
            rest=L.d-P.d+366;
        }
     return rest;
    }
};
 
void _tmain()
{setlocale(LC_ALL,"Russian");
  DATE day,ny,br;
  cout<<"\n Введите текущую дату:";
  day.INPUT();
  cout<<"\n Введите дату ближайшего Дня Рождения:";
  br.INPUT();
  cout<<" До Дня Рождения осталось - "<<day.REST(day,br)<<" дней!";
  cout<<"\n Введите дату ближайшего Нового Года:";
  ny.INPUT();
  cout<<" До Нового Года осталось - "<<day.REST(day,ny)<<" дней!";
  
  cout<<endl<<endl;
}
P.S. Это далеко уже не первый вариант программы
Создавала и два разных метода,где дату нового года вводить не надо,но результат,к сожалению, аналогичен
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ab
75 / 75 / 1
Регистрация: 03.05.2012
Сообщений: 161
23.09.2013, 06:21     Прекращена работа программы #2
У вас при первом вызове REST() модифицируется текущая дата, обнуляются день и месяц. Из-за этого при втором вызове попадаете уже не на элементы в массиве daytab, а неизвестно куда.
dac
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 6
23.09.2013, 17:18  [ТС]     Прекращена работа программы #3
Спасибо огромное)))
Вот всё из-за чего)
Не подскажете, как я могу это исправить?
А-то я вожусь с этой программой давно, кучу вариантов переделала, не могла понять, в чем же дело...
Даже преподаватель мне не смогла помочь...
Ab
75 / 75 / 1
Регистрация: 03.05.2012
Сообщений: 161
23.09.2013, 18:55     Прекращена работа программы #4
Ну, грамотный преподаватель все-таки должен находить ошибки в учебных программах объемом ~50 строк. Исправлять можно по-разному, например:
1. В методе REST используйте дополнительные локальные переменные, а члены класса пусть остаются нетронутыми.
2. Перед первым вызовом REST скопируйте текущую дату и во второй вызов засылайте копию.

И не пишите вы конструкции типа
C++
1
P.d+=*++pp;
Выглядят эффектно, но для новичков сложновато, разбейте на 2-3 простых, будет нагляднее и понятнее.
dac
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 6
23.09.2013, 19:03  [ТС]     Прекращена работа программы #5
Спасибо))
Я поняла,исправлю)
Yandex
Объявления
23.09.2013, 19:03     Прекращена работа программы
Ответ Создать тему
Опции темы

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