Выведите месяц, соответствующий соответствующему вводу
Я должен написать программу принимает два целых числа пользователем, 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 ответов
У вас есть это в основном
scanf("%d%d", &M, &N);
for (M = jan; M <= N; ((int)M++))
{
/* ... */
}
Итак... в строке scanf вы меняете M (и N) на значения, предоставленные пользователем
и сразу после этого вы установите М jan
фактически теряя то, что выбрал пользователь.
Вам нужно пересмотреть, как вы это делаете.
Мое предложение по улучшению вашей программы - заменить операторы 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;
}
return
означает возврат из текущей функции, поэтому в конце первой итерации цикла for вы возвращаетесь из основной функции, и программа завершается.
Попробуйте этот код:
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');
}
}
Береги себя, Беко
PS. Отредактировано:
Также измените строку перечисления на:
enum month {jan=1,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec};
И позаботьтесь о возможном переполнении a+b>12
Второй. Редакция: может быть полезно другое объяснение: вы не можете использовать return
внутри цикла, как это и ожидать, что цикл будет работать, потому что в то время, когда компьютер запускает return
это выходит из программы навсегда.
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;
}
Работал на меня. благодарю вас.
Посмотрите на 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;
Используя эти методы, вы можете значительно уменьшить размер вашего кода, упрощая его чтение и обслуживание. Также - вы улучшаете производительность, избавляясь от всех веток.
Отказ от ответственности - я не скомпилировал этот код, написанный по памяти.