2013-04-30 5 views
1

Вот код, я все равно получаю недопустимый ввод при каждом запуске программы.Функция подсчета дней в C

#include<stdio.h> 

int dpm[13]={31,28,31,30,31,30,31,31,30,31,30,31}; 

struct Sdate { 
    int month; 
    int day; 
    int year; 
} begin, end; 

int isleapyear(int a) 
{ 
    if((a%4==0&&a%100!=0)||a%400==0) 
     return 1; 
    else 
     return 0; 
} 


struct Sdate EnterDate(void){ 
    int d,m,y; 
    struct Sdate A; 

     printf("Enter the date(mm/dd/yyyy): "); 
     scanf("%i/%i/%i", &m, &d, &y); 

    printf("\n"); 

    A.month=m; 
    A.day=d; 
    A.year=y; 

    return(A); 
} 

int validate(void){ 
    if(begin.year > end.year) 
     return 1; 
    if((begin.year == end.year) && (begin.month > end.month)) 
     return 1; 
    if((begin.year == end.year) && (begin.month == end.month) && (begin.day > end.day)) 
     return 1; 
    else 
     return 0; 
} 

int count_days(void){ 
    int i; 
    int days=0; 
    int days_per_year = 365; 

    if(isleapyear(begin.year)){ // first year 
     if(begin.month == 1) 
     days = dpm[begin.month] - begin.day + 1; 
     else 
     days = dpm[begin.month] - begin.day; 
    }  
    else 
     days = dpm[begin.month] - begin.day; 
    for(i = (begin.month + 1); i < 13; ++i) 
     days +=dpm [i]; 

    for(i = (begin.year + 1); i < end.year; ++i) //in between years 
     days += (days_per_year + isleapyear(i)); 

    if(isleapyear(end.year))//end year 
     for(i = 0; i < end.month; ++i){ 
      days += dpm[i] + 1; 
     days += dpm[end.month] - end.day; 
     } 
    else 
     for(i = 0; i < end.month; ++i) 
     days += dpm[i]; 
     days += dpm[end.month] - end.day; 

    return days; 
    } 


int main(int n){ 
    printf("Please enter the first date then the second one\n"); 
    begin=EnterDate(); 
    end=EnterDate(); 

    validate(); 
    if(n == 1) 
    printf("Invalid Input!!!"); 
    else 
     printf("Total days between these two dates is %i\n", count_days()); 
    return 0; 
} 

Код по-прежнему говорит, что Validate всегда верно делают вывод «Invalid Input» и я только был в состоянии проверить подсчет программы дней редко, но когда я сделал это было довольно далеко либо год или около 200 дней.

+2

У вас есть несоответствующие парсы в этой нечитабельно длинной линии. –

+0

Должен ли я вместо этого сделать это вместо if? – Linebacker15

+0

Это вариант. Я лично не помню длительных условий, но я бы разбил их на несколько строк и использовал отступы, чтобы показать, как связаны предложения. (Фактически, я обнаружил это, пытаясь отредактировать, чтобы сделать именно это.) Здесь я покажу вам. Ред. –

ответ

4

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

if((begin.year>end.year) || 
    ((begin.year==end.year) && (begin.month>end.month)) || 
    begin.year==end.year) && (begin.month==end.month) && (begin.day>end.day))) 

Очевидно, что на этой третьей линии есть хотя бы одна пропущенная скобка. Даже после вы добавляете его, вам не хватает еще одной пары круглых скобок. Давайте исправить эти две проблемы, не так ли?

if((begin.year>end.year) || 
    ((begin.year==end.year) && (begin.month>end.month)) || 
    ((begin.year==end.year) && (begin.month==end.month) && (begin.day>end.day))) 

По-прежнему, это довольно трудно быстро прочитать и понять. Разделим это и добавим разумный интервал, не так ли?

int validate(void) 
{ 
    if(begin.year > end.year) 
     return 1; /* time travelling is not allowed. Yet! */ 

    if((begin.year == end.year) && (begin.month > end.month)) 
     return 1; /* you can't begin after you end! */ 

    if((begin.year == end.year) && (begin.month == end.month) && (begin.day > end.day)) 
     return 1; /* finishing before you start isn't allowed by the union */ 

    return 0; 
} 

Это невозможно ответить на вопрос о «от 200 дней», не зная больше об этих массивах, как dpm и тех функциях, которые вы называете.

Обновление: Вы отправили немного дополнительного кода; до сих пор не совсем достаточно, но теперь мой здравый смысл покалывает. Что-то говорит мне, что проблема в вашем EnterDate, который принимает даты как «1-based» (т. Е. 3 января 2012 года введен как 1/3/2012), но ваши массивы основаны на 0.

Update2: Хмм ... Давайте посмотрим здесь:

int main(int n){ 
    printf("Please enter the first date then the second one\n"); 
    begin=EnterDate(); 
    end=EnterDate(); 

    validate(); 
    if(n == 1) 
    printf("Invalid Input!!!"); 

я не пошел гораздо дальше, чем это. Прежде всего, int main(int n) недействителен синтаксис для main. Во-вторых, я полон, что вы утверждаете, что пытались найти ошибку, заявив, что ваша функция validate() не работает ... как вы знаете? вы даже не проверяете результат!

Как об этом:

int main(int argc, char **argv) { 
    printf("Please enter the first date then the second one\n"); 
    begin = EnterDate(); 
    end = EnterDate(); 

    if(validate()) { 
     printf("Invalid Input!!!\n"); 
     return 1; 
    } 

    ... 

Update 4: Если бы вы потрудились добавить printf заявления в вашей count_days функции, чтобы увидеть исполнение, ошибка (s) будет иметь сразу станет очевидным вы. Попробуйте следующее:

int count_days(void){ 
    int i; 
    int days=0; 
    int days_per_year = 365; 

    if(isleapyear(begin.year)){ // first year 
     printf("%d is a leap year!\n", begin.year); 

     if(begin.month == 1) 
      days = dpm[begin.month] - begin.day + 1; 
     else 
      days = dpm[begin.month] - begin.day; 
    }  
    else 
     days = dpm[begin.month] - begin.day; 

    printf("At first checkpoint: %d days\n", days); 

    for(i = (begin.month + 1); i < 13; ++i) 
     days +=dpm [i]; 

    printf("At second checkpoint: %d days\n", days); 

    for(i = (begin.year + 1); i < end.year; ++i) //in between years 
     days += (days_per_year + isleapyear(i)); 

    printf("At third checkpoint: %d days\n", days); 

    if(isleapyear(end.year))//end year 
     printf("%d is a leap year!\n", end.year); 
    for(i = 0; i < end.month; ++i){ 
     days += dpm[i] + 1; 
     days += dpm[end.month] - end.day; 
    } 
    else 
     for(i = 0; i < end.month; ++i) 
      days += dpm[i]; 
    days += dpm[end.month] - end.day; 


    return days; 
} 
+0

Я поставил основную функцию и массив dpm. – Linebacker15

+0

@ Linebacker15 Я добавил комментарий, который * должен * указать вам в правильном направлении. Если это не так, нам нужно будет увидеть больше кода. Но у меня возникает соблазн спросить, как вы отлаживаете это? Вы пытались проверить даты, которые на один день друг от друга, один месяц друг от друга и один год друг от друга, чтобы попытаться изолировать конкретные случаи отказа? Или это просто не работает, и вы поднимаете руки и публикуете в StackOverflow? –

+2

+1 @nik Bougalis для юмора и терпения. –

Смежные вопросы