Сложность с программой, которая распечатывает количество дней между двумя отдельными годами, выбранными пользователем - PullRequest
0 голосов
/ 28 февраля 2012

Я нахожусь во введении в класс C, и мой профессор только что перевел нас с python (в качестве вступления) на C. У меня возникли некоторые трудности с получением синтаксиса C.Предполагается, что программа рассчитывает количество дней между двумя отдельными годами и учитывает високосные годы.

У меня есть такой код:

#include <stdio.h>

int main() {

    int startyear, endyear;
    int totalyears, index;
    int difference, numyears, days;

    printf("What is the starting year of your time period?\n");
    scanf("%d", &startyear);
    printf("What is the ending year of your time period?\n");
    scanf("%d", &endyear);

    difference = startyear;
    numyears = 0;
    days = 0;

    while (difference <= endyear) {
        difference++;
        numyears++;
        if (difference / 4 == 1) {
            days + 1;

        }
     }

    printf("There are %d days between 1/1/%d and 1/1/%d\n", days + numyears * 365 ,     startyear, endyear);

return 0;

}

Когда я использую 2003 и 2005 как два года, но программа печатает результат как 4,201,453 дня, что явно неверно.Фактический результат должен быть около 731. Я знаю, что, вероятно, допустил несколько ошибок в цикле while, но я не совсем уверен, как это исправить.Я пытаюсь убедиться, что цикл while проверяет, делится ли месяц на 4, что будет означать високосный год, и я предполагал, что для этого я буду использовать строку:

if (difference / 4 == 1) {
        days + 1;

«1» означает возвращение логического выражения как «true», но я не совсем уверен, что именно так C его читает.Я прошу прощения за длинный вопрос, но я просто пытаюсь быть максимально ясным.Я также извиняюсь, потому что чувствую, что я публикую беспорядок в коде, но я действительно не знаю, куда идти, чтобы это исправить.

Заранее спасибо, ребята и девочки.

РЕДАКТИРОВАТЬ: я следил за комментариями до сих пор, и мне удалось получить программу для расчета 1095 дней.Я все ближе, но в моих расчетах все еще должно быть что-то не так.

Ответы [ 4 ]

2 голосов
/ 28 февраля 2012

Добавляя ответ передо мной, вы также должны инициализировать days так

int numyears = 0, days = 0;
2 голосов
/ 28 февраля 2012

Ваша линия:

while (difference <= endyear) {

Должно быть:

while (difference < endyear) {

Потому что, если вы собираетесь в 2003-2005 гг., Вам нужно пройти цикл дважды, а не 3 раза. (разница = 2003 первый раз, 2004 второй, затем он должен остановиться).

2 голосов
/ 28 февраля 2012

Вы не инициализировали numyears, поэтому оно содержит Неопределенное значение a.k.a Значение мусора для начала.
Это неопределенное значение используется, когда вы выполняете любые дальнейшие операции, включая numyears++ и вычисление в printf().

Вы должны инициализировать его:

int numyears = 0;

Кроме того, index никогда не используется, но объявлен, поэтому вы можете удалить его.

1 голос
/ 28 февраля 2012

Есть ряд проблем с вашим основным циклом:

while (difference <= endyear) {

Это будет выполняться слишком много раз.Используйте < вместо <=.

        difference++;
        numyears++;

Это означает, что первый год, который вы исследуете, будет startyear+1, а последний (после исправления выше) будет endyear.Это не совсем то, что вам нужно, поэтому переместите эти приращения после оператора if (на самом деле только difference++; имеет значение, но для ясности оба имеют смысл).

        if (difference / 4 == 1) {

Теперь, когда мы 'Глядя на правильные годы (сверху), вы должны проверить по 0.Кроме того, вы ищете оператор модуля (%), а не деление.Таким образом, у нас есть difference % 4 == 0.

            days + 1;

Это не имеет никаких эффектов.Вы хотите либо days += 1, либо days++.

Наконец, обратите внимание, что это неправильный способ определить, является ли год високосным.См. wikipedia для полного алгоритма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...