2014-11-11 5 views
-4

Я написал следующее консольное приложение, которое просит пользователя ввести день.Усовершенствуйте 2 функции, чтобы дать правильный результат

Мне нужна помощь, чтобы улучшить, чтобы они дали правильный ответ за ВСЕ дни недели.

Если пользователь вводит какой-либо другой день кроме понедельника, выходные данные «сегодня», «вчера», «завтра» с соответствующими выходными днями ниже этих заголовков.

Проблема, кажется, только в понедельник не дает правильного выхода.

Это мой код до сих пор:

#include "stdafx.h" 
#include <stdio.h> 
#include <string.h> 

typedef enum the_days {monday,tuesday,wednesday,thursday,friday,saturday,sunday, noday} day; 

day yesterday (day today); 
day tomorrow (day today); 

char thedays[][10] = {"monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"}; 

day findDay(char string1[]); 

void main(void) 
{ 
    day today; 
    char theDay[10]; 

    puts("Type the day (e.g. 'monday'"); 
    gets(theDay); 

    today = findDay(theDay); 

    if(today == noday) 
    { 
     puts("Error - invalid input - exiting"); 
     return; 
    } 

    printf("today \tyesterday \ttomorrow\n" 
     "============================================\n"); 
    printf("%s\t %s \t %s\n", thedays[today], thedays[yesterday(today)],thedays[tomorrow(today)]); 
} 

day findDay(char string1[]) 
{ 
    int i = 0; 
    day thisday; 

    for (i=0;i<7;i++) 
    { 
     if (!strcmp(thedays[i],string1)) 
     { 
      break;  
     } 
    } 
    thisday = (day)i; 
    return thisday; 
} 

day yesterday(day today) 
{ 
    day before; 
    before = (day)(today- 1); 
    return before; 
} 

day tomorrow(day today) 
{ 
    day after; 
    after = (day)(today + 1); 
    return after; 
} 
+2

Для ввода некоторого образца, каков ожидаемый выход и фактический выход? И попытались ли вы, например? пройдите через код по строкам в отладчике, чтобы узнать, что происходит? –

+0

Если пользователь вводит какой-либо другой день, кроме понедельника, выходные данные «сегодня», «вчера», «завтра» с соответствующими выходными днями ниже этих заголовков. Проблема, кажется, только в понедельник не дает правильного выхода. –

+0

Я бы сказал, что воскресенье также даст вам неправильный результат. Причина, по которой в понедельник дает вам неправильный результат, заключается в том, что тогда 'вчера' возвращает' -1', что недопустимо в перечислении 'day'. Как вы думаете, что вы могли бы исправить это, так что это воскресное перечисление (значение '6')? Другими словами, как вы получаете от «-1» до «6»? –

ответ

1

Вы получите неправильные результаты с понедельника по воскресенье, потому что ваши yesterday и tomorrow функции не заботясь о опоясывающего. Вы можете исправить эти функции следующим образом:

day yesterday(day today) 
{ 
    day before = today > monday ? today - 1 : sunday; 
    return before; 
} 

day tomorrow(day today) 
{ 
    day after = today < sunday ? today + 1 : monday; 
    return after; 
} 
+0

Не могли бы вы объяснить немного больше, пожалуйста, - я поставил ваш код, но я получаю ошибки. –

+0

Извините - пара опечаток - теперь исправлена. –

+0

Спасибо @Paul R, но я получаю следующие ошибки: «1> stdafx.cpp 1> Bug1.cpp 1> C: \ Users \ Дэвид O'Dea \ рабочий стол \ bug1 \ bug1 \ bug1.cpp (54): ошибка C2440: «инициализация»: невозможно преобразовать из «int» в «day» 1> Для преобразования в тип перечисления требуется явное литье (статический_cast, листинг типа C или стиль функции) 1> c: \ пользователи \ david o'dea \ desktop \ bug1 \ bug1 \ bug1.cpp (60): ошибка C2440: 'initializing': невозможно преобразовать из 'int' в 'day' 1> Для преобразования в тип перечисления требуется явное преобразование (static_cast , C-style cast или function-style cast) ' –