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

Не могу найти ошибку - C++

Восстановить пароль Регистрация
 
SharkBass
0 / 0 / 0
Регистрация: 31.03.2013
Сообщений: 12
16.04.2013, 08:13     Не могу найти ошибку #1
Здравствуйте, есть задача: Написать программу которая по введенному числу и месяцу рассчитывает день недели и выводит ответ на экран. Условия: Год високосный, начало года выпало на понедельник, также следует учесть все возможные ошибки пользователя. Использовать только алгоритм ветвления. Среда: Borland

Написал программу, но не могу понять где ошибка, некоторые даты не считает.

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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
void main()
{
int dd,mm,y,K,h,j;
    printf("Программа рассчитывает день недели по дате.\n Учитывается что это високосный год и он начался с Четверга.\n  Введите последовательно число и месяц в формате 01/01\n");
scanf("%i %i",&dd,&mm);
if (dd==31&&mm==1)
printf ("СУББОТА\n");
else
if(dd==1&&mm==3)
printf("ПОНЕДЕЛЬНИК\n");
else
if ((((dd>31||dd<1)||(mm>12||mm<1))||(mm==4&&dd>=31))||(mm==2&&dd>=30)||(mm==4&&dd>=31)||(mm==6&&dd>=31)||(mm==9&&dd>=31)||(mm==11&&dd>=31))
printf ("Не корректно введена дата\n");
else
{
if (mm==1)
{int mm=13;
int j=2003/100;
int K=2003%100;
h=(dd+(13*(mm+1)/5)+K+(K/4)+(j/4)-2*j) %7;}
else if (mm==2)
{int mm=14;
int j=2003/100;
int K=2003%100;
h=(dd+(13*(mm+1)/5)+K+(K/4)+(j/4)-2*j) %7;}
else
{
int j=2004/100;
int K=2004%100;
h=(dd+(13*(mm+1)/5)+K+(K/4)+(j/4)-2*j) %7;}
}
{ if(h==2) printf("ПОНЕДЕЛЬНИК\n");
else if(h==3) printf("ВТОРНИК\n");
else if(h==4) printf("СРЕДА\n");
else if(h==5) printf("ЧЕТВЕРГ\n");
else if(h==6) printf("ПЯТНИЦА\n");
else if(h==0) printf("СУББОТА\n");
else if(h==1) printf("ВОСКРЕСЕНЬЕ\n");
}
getch();
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2013, 08:13     Не могу найти ошибку
Посмотрите здесь:

Не Могу найти ошибку C++
C++ Не могу найти ошибку
Не могу найти ошибку C++
найти слова повторяющиеся более одного раза, не могу найти ошибку C++
C++ Не могу найти ошибку.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
16.04.2013, 08:26     Не могу найти ошибку #2
чето ты накрутил
рассчитывай день в году
и остаток от деления на 7 (0 воскресенье)
например дата введена 8 марта
C++
1
2
3
4
dd=8;
mm=3;
day=31/*дней в январе*/+29/*дней в феврале*/+8;
dayY=day%7;
dayY=5 пятница

Добавлено через 2 минуты
вот это не понятно
Цитата Сообщение от SharkBass Посмотреть сообщение
Условия: Год високосный, начало года выпало на понедельник,
Цитата Сообщение от SharkBass Посмотреть сообщение
Учитывается что это високосный год и он начался с Четверга.
так с понедельника или с четверга
SharkBass
0 / 0 / 0
Регистрация: 31.03.2013
Сообщений: 12
16.04.2013, 09:08  [ТС]     Не могу найти ошибку #3
Извините, допустил ошибку, год начинается с Четверга. И если рассчитывать так, то программа поучится довольно длинная, или я ошибаюсь?

Добавлено через 31 минуту
Переписал. Ошибки пользователя правильно учтены?
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
void main()
{
int dd,mm,day,dayY;
    printf("Программа расчитывает день недели по дате.\n Учитывается что это високосный год и он начался с Четверга.\n  Введите последовательно число и месяц в формате 01/01\n");
scanf("%i %i",&dd,&mm);
if ((((dd>31||dd<1)||(mm>12||mm<1))||(mm==4&&dd>=31))||(mm==2&&dd>=30)||(mm==4&&dd>=31)||(mm==6&&dd>=31)||(mm==9&&dd>=31)||(mm==11&&dd>=31))
printf ("Не корректно введена дата\n");
else
if (mm==1)
dayY=dd%7;
else if (mm==2)
dayY=(31+dd)%7;
else if (mm==3)
dayY=(31+29+dd)%7;
else if (mm==4)
dayY=(31+29+31+dd)%7;
else if (mm==5)
dayY=(31+29+31+30+dd)%7;
else if (mm==6)
dayY=(31+29+31+30+31+dd)%7;
else if (mm==7)
dayY=(31+29+31+30+31+30+dd)%7;
else if (mm==8)
dayY=(31+29+31+30+31+30+31+dd)%7;
else if (mm==9)
dayY=(31+29+31+30+31+30+31+31+dd)%7;
else if (mm==10)
dayY=(31+29+31+30+31+30+31+31+30+dd)%7;
else if (mm==11)
dayY=(31+29+31+30+31+30+31+31+30+31+dd)%7;
else if (mm==12)
dayY=(31+29+31+30+31+30+31+31+30+31+30+dd)%7;
{ if(dayY==5) printf("ПОНЕДЕЛЬНИК\n");
else if(dayY==6) printf("ВТОРНИК\n");
else if(dayY==0) printf("СРЕДА\n");
else if(dayY==1) printf("ЧЕТВЕРГ\n");
else if(dayY==2) printf("ПЯТНИЦА\n");
else if(dayY==3) printf("СУББОТА\n");
else if(dayY==4) printf("ВОСКРЕСЕНЬЕ\n");
}
getch();
 
}
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
16.04.2013, 09:23     Не могу найти ошибку #4
Цитата Сообщение от SharkBass Посмотреть сообщение
то программа поучится довольно длинная, или я ошибаюсь?
нет
если тебе нельзя использовать массивы switch и т.д
то на if
C++
1
2
3
4
5
6
7
8
int Day=3;// четверг-1 числа начинаются с 1 а не с 0
 
if(mm==1)
 Day+=dd;
else  if(mm==2)
  Day+=dd+31;
else if(mm==6)
  Day+=dd+60;// 31+29
всего 12 блоков
потом остаток от деления на 7
и вывод как у тебя сделан ( только числа поправь 0 воскресенье)

Добавлено через 7 минут
Цитата Сообщение от SharkBass Посмотреть сообщение
Ошибки пользователя правильно учтены?
не знаю заплюхался в твоем выражении
можно сделать так
прописать по месяцам ( это без оптимизации)
C++
1
2
3
4
if ( (dd<1 || dd>31) && ( mm==1) ) ||
     (dd<1 || dd>29) && ( mm==2) ) || 
     (dd<1 || dd>31) && ( mm==3) ) || 
..................................
Yandex
Объявления
16.04.2013, 09:23     Не могу найти ошибку
Ответ Создать тему
Опции темы

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