Выведите месяц, соответствующий соответствующему вводу - PullRequest
2 голосов
/ 26 марта 2011

Я должен написать программу, в которой пользователь принимает два целых числа, a и b, где a соответствует месяцу года (1 = январь, 2 = февраль и т. Д.).Программа должна распечатать месяц, который следует после "a" и следующие "b" месяцы.Это то, что у меня есть, но для каждых двух целых чисел, которые я ввожу, я всегда получаю один и тот же результат: «Январь, Февраль».Любая помощь приветствуется.

#include<stdio.h>

        enum month {jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec}; /*This
allows yoou to name a finite set and to declare identifiers*/
        typedef enum month      month;

month next_month(month M)  /*this is a function definition*/
{
        switch (M) /* like an if-else statement, if this month is true goto the M=month you chose*/
        {
        case  jan:
                M=feb;break;
        case  feb:
                M=mar;break;
        case  mar:
                M=apr;break;
        case apr:
                M=may;break;
        case may:
                M=jun;break;
        case jun:
                M=jul;break;
        case jul:
                M=aug;break;
        case aug:
                M=sep;break;
        case sep:
                M=oct;break;
        case oct:
                M=nov;break;
        case nov:
                M=dec;break;
        case dec:
                M=jan;break;
        }
        return M;
}
void print_month (month M)  /*this is a function definition*/
{
        switch (M)  /* like an if-else statement, if this month is true goto the M=month you chose*/
        {
        case jan:
                printf("January");break;
        case feb:
                printf("February");break;
        case mar:
                printf("March");break;
        case apr:
                printf("April");break;
        case may:
                printf("May");break;
        case jun:
                printf("June");break;
        case jul:
                printf("July");break;
        case aug:
                printf("August");break;
        case sep:
                printf("September");break;
        case oct:
                printf("October");break;
        case nov:
                printf("November");break;
        case dec:
                printf("December");break;
        }
}
int main(void)
{
        month M, N, sat;
        printf("Please enter two integers:\n");
        scanf("%d%d", &M, &N);
        for (M = jan; M <= N; ((int)M++))
        {
                printf(" ");
                print_month(M);  /*function call to print month*/
                printf(" ");
                print_month(next_month(M));  /*function call to print previous month*/
                putchar('\n');
                return;
        }
}

Ответы [ 6 ]

6 голосов
/ 26 марта 2011

Мое предложение по улучшению вашей программы - заменить операторы switch массивом названий месяцев. Было бы намного проще программировать и читать.

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

Поэтому, следуя моему совету использовать массив месяцев, выглядело бы примерно так:

#include <stdio.h>

const char* months[12] = {
 "January", "February", "March", "April", "May", "June",
 "July", "August", "September", "October", "November", "December"
};

int main(void)
{
    int m;
    printf("Enter month: ");
    scanf("%d", &m);
    if( 1 <= m && m <= 12 ) {
        printf("%s\n", months[m-1]);
    }
    return 0;
}
6 голосов
/ 26 марта 2011

У вас есть это в основном

    scanf("%d%d", &M, &N);
    for (M = jan; M <= N; ((int)M++))
    {
         /* ... */
    }

Итак ... в строке scanf вы меняете M (и N) на значения, предоставленные пользователем
и сразу после этого вы устанавливаете M на jan, фактически теряя то, что выбрал пользователь.

Вам нужно проверить, как вы это делаете.

5 голосов
/ 26 марта 2011

return означает возврат из текущей функции, поэтому в конце первой итерации цикла for вы возвращаетесь из основной функции, и программа завершается.

2 голосов
/ 26 марта 2011

Попробуйте этот код:

int main(void)
{
        int a, b, m;
        printf("Please enter two integers between 1-12:\n");
        scanf("%d%d", &a, &b);
        for (m=a+1; b; b--, m++)
        {
                printf(" ");
                print_month(m);  /*function call to print month*/
                putchar('\n');
        }
}

Берегите себя, Beco

PS.Отредактировано:

Кроме того, измените строку перечисления на:

    enum month {jan=1,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec};

И позаботьтесь о возможном переполнении a + b> 12

2nd.Редакция: Другое объяснение может быть полезным: вы не можете использовать return внутри цикла, подобного этому, и ожидать, что цикл будет работать, потому что в то время, когда компьютер запускает return, он выходит из программы навсегда.

0 голосов
/ 10 июля 2014
include <stdio.h>

const char* months[12] = {
 "January", "February", "March", "April", "May", "June",
 "July", "August", "September", "October", "November", "December"
};

int main(void)
{
    int m;
    printf("Enter month: ");
    scanf("%d", &m);
    if( 1 <= m && m <= 12 ) {
        printf("%s\n", months[m-1]);
    }


    return 0;
}

Работал на меня.спасибо.

0 голосов
/ 26 марта 2011

Ознакомьтесь с документацией на C / C ++ для "%" и макросов - "#define".Для этой проблемы переключатели не нужны, неэффективны и делают код длинным.

Приращение и модуль могут использоваться для приращения месяца.Перечислить значение в sting можно с помощью макроса, который заменяет код значения строкой, содержащей тот же код.

Перечисление в строку с использованием макросов: Ссылка MSDN - оператор Stringizing (#)

Существует много способов использовать это для преобразования перечислений в строки ( Google it ), в том числе:

// Use correct number of parameters here (can use multiple macros)
#define ENUM_MACRO(name, offset, v1, v2, v3, v3)\
    enum name { v1 = offset, v2, v3, v4};\
    const char name##Strings[] = { #v1, #v2, #v3 };\
    const char* name##ToString(value) { return name##Strings[value - offset]; }

// This way you do not have two different
// lists of months to maintain in your code
// (the preprocessor creates them)
ENUM_MACRO(Month, 1, January, February, March);

//
// usage:
//
Month month = Month::Janurary;
const char* st = MonthToString(month);

//
// Incrementing month taking offset (1) and max (12) into account
//
month = (month + 1) % 12 + Month::Janurary;

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

Отказ от ответственности - Я не скомпилировал этот код, написанный из памяти.

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