2

所以我尝试自己编写 12 天的圣诞节。我还没有完成歌词,但我仍在努力弄清楚。但我不明白为什么我圣诞节的“第一天”会翻倍并搭配不同的礼物,而在第 12 天,没有礼物出现。我检查了我的开关盒,我猜它们似乎是对的。有没有可能我可以减少我的代码来打印出完整的歌词?

#include <stdio.h>
#include <conio.h>

int main() // Main Function
{
    int days, counter, num;
    //int counter = 1;  

    printf("\t\t***TWELVE DAYS OF CHRISTMAS***\n");
    printf("\t\t______________________________\n\n\n");

    for (counter=0; counter<=12; counter++)
    {   
        // counter++;
        switch(counter)
        {
            case 1: printf("\t\tA Partridge in a Pear Tree\n");break; // Day 12
            case 2: printf("\t\tTwo Turtle Doves\n"); break;
            case 3: printf("\t\tThree French Hens\n"); break;
            case 4: printf("\t\tFour Calling Birds \n"); break;
            case 5: printf("\t\tFive Golden Rings\n"); break;
            case 6: printf("\t\tSix Geese a Laying\n"); break;
            case 7: printf("\t\tSeven Swans a Swimming\n"); break;
            case 8: printf("\t\tEight Maids a Milking\n"); break;
            case 9: printf("\t\tNine Ladies Dancing\n"); break;
            case 10: printf("\t\tTen Lords a Leaping\n"); break;
            case 11: printf("\t\tEleven Pipers Piping\n"); break;
            case 12: printf("\t\tTwelve Drummers Drumming\n"); break; // Day 1 
        }
        printf("\n\tOn the ");

        switch(counter){
            case 1:
                printf("1st");
                break;  
            case 2: 
                printf("2nd");
                break;
            case 3: 
                printf("3rd");
                break;
            case 4: 
                printf("4th");
                break;
            case 5: 
                printf("5th");
                break;      
            case 6: 
                printf("6th");
                break;
            case 7: 
                printf("7th");
                break;
            case 8: 
                printf("8th");
                break;  
            case 9: 
                printf("9th");
                break;
            case 10:    
                printf("10th");
                break;  
            case 11:    
                printf("11th");
                break;  
            case 12:    
                printf("12th");
                break;                                                                                      
                default: 
                printf("1st", num);
                break;
            }
            printf(" day of Christmas my true love sent to me\n");

        }   

        getch();
        return 0;
    }

指令说,“你的函数只会在 main() 函数中被调用,不会返回任何东西” 那么这是否意味着我不会创建更多函数?或者我应该只将我的所有代码放在主函数中吗?还是创建单独的代码?

4

9 回答 9

6

我实际上并不认为交换机是这里的最佳选择。我们有一个要显示的项目列表,我们可以轻松地将其放入数组和顺序中,并且每次都必须显示这些项目的不同列表。虽然这里的 switch 语法很好(正如问题的注释中提到的,而不是在提问者的代码本身中使用的那样),但我认为简单的循环比不断要求程序执行 switch 跳转更合适。

这是我建议的解决方案:

#include <stdio.h>

const char
  *presents[] = {
    "\t\tA Partridge in a Pear Tree\n", "\t\tTwo Turtle Doves\n",
    "\t\tThree French Hens\n", "\t\tFour Calling Birds \n",
    "\t\tFive Golden Rings\n", "\t\tSix Geese a Laying\n",
    "\t\tSeven Swans a Swimming\n", "\t\tEight Maids a Milking\n",
    "\t\tNine Ladies Dancing\n", "\t\tTen Lords a Leaping\n",
    "\t\tEleven Pipers Piping\n", "\t\tTwelve Drummers Drumming\n"},
  *days[] = {
    "1st", "2nd", "3rd", "4th", "5th", "6th",
    "7th", "8th", "9th", "10th", "11th", "12th"};

void printTwelveDaysSong(void)
{
  int i, j;

  for (i = 0; i < 12; ++i) {
    printf("\n\tOn the %s day of Christmas my true love sent to me\n", days[i]);
    for (j = i; j > 0; --j) fputs(presents[j], stdout);
    if (i > 0) fputs("\t\tand\n", stdout);
    fputs(presents[0], stdout);
  }
}

/* Example main function */
int main(void)
{
  printTwelveDaysSong();
  return 0;
}

我将核心代码放在不同的函数中,因为这听起来像是需要的,所以我也展示了这一点,没什么特别的。

在代码中,我只使用 C 标准库函数进行输出,并且我没有尝试实现交互式程序,如果您愿意,可以自己添加。

于 2013-08-26T14:46:43.567 回答
6

再次查看 switch 语句,并记住 break 不是完全必要的。

switch (day) {
  case 2: printf("two turtle doves ");
  case 1: printf("and a partridge in a pear tree");
}

这将使“第 2 天”从“两只斑鸠”开始,一直到“和梨树上的一只鹧鸪”。

同时,“第一天”的开始是“梨树上的鹧鸪”。

于 2013-08-26T14:14:54.490 回答
1

您的for循环设置counter为零,但您的switch语句处理大于零的情况。

于 2013-08-26T14:14:16.023 回答
1

好吧,首先您将计数器设置为零,第一个开关不打印任何内容,第二个打印“在第一个...”。

然后你将计数器设置为一个......

此外,在您说出今天是哪一天之前,您会很奇怪地打印出礼物。

为了减少代码,您应该考虑对于 1 到 12,只有 1st、2nd 和 3rd 不以 th 结尾,此外请记住您可能会在 switch 中遇到案例(不是特别好的样式,但适用于这种事物)。

于 2013-08-26T14:15:35.217 回答
0

您从counter=0. 这会导致第一个switch不打印任何内容,而第二个switchdefault打印“1st”。这可能就是您的第一天打印两次的原因!

将你的 for 循环for (counter = 1; counter <= 12; counter++)改为!

于 2013-08-26T14:20:05.277 回答
0
#include <stdio.h>
#include <conio.h>

int main() // Main Function
{
int days, counter, num;
//int counter = 1;  

printf("\t\t***TWELVE DAYS OF CHRISTMAS***\n");
printf("\t\t______________________________\n\n\n");

for (counter=1; counter<=13; counter++)
{   
    printf("\n\tOn the ");

    switch(counter){
        case 1:
            printf("1st");
            break;  
        case 2: 
            printf("2nd");
            break;
        case 3: 
            printf("3rd");
            break;                                                             
        default: 
            printf(counter + "th");
            break;
        }

    printf(" day of Christmas my true love sent to me\n");
    for (int x= counter; x > 0; x--)
    {
        switch(x)
        {
            case 1: printf("\t\t");if (counter > 1 ) printf("And ");printf("A Partridge in a Pear Tree\n");break; // Day 12
            case 2: printf("\t\tTwo Turtle Doves\n"); break;
            case 3: printf("\t\tThree French Hens\n"); break;
            case 4: printf("\t\tFour Calling Birds \n"); break;
            case 5: printf("\t\tFive Golden Rings\n"); break;
            case 6: printf("\t\tSix Geese a Laying\n"); break;
            case 7: printf("\t\tSeven Swans a Swimming\n"); break;
            case 8: printf("\t\tEight Maids a Milking\n"); break;
            case 9: printf("\t\tNine Ladies Dancing\n"); break;
            case 10: printf("\t\tTen Lords a Leaping\n"); break;
            case 11: printf("\t\tEleven Pipers Piping\n"); break;
            case 12: printf("\t\tTwelve Drummers Drumming\n"); break; // Day 1 
        }
    }

}           
    getch();
    return 0;
}
于 2013-08-26T14:35:29.923 回答
0

我假设您的教授的目标是教您如何使用 switch 语句(可能要求您使用多个 switch 语句?)。显然,这个程序除了教学之外没有任何实际用途。因此,所有向您推荐各种“创造性”方法(例如使用数组和其他东西)的人都误解了您的情况。你犯了一些错误——那里有一些不必要的东西。但你走在正确的轨道上,只需要复习几次(评论中来自 SuvP 的特别好的通知)。

于 2013-08-26T15:59:12.447 回答
0

for 条件应该是:

for (counter=1; counter<=12; counter++)
于 2013-08-26T14:13:29.717 回答
0
#include <iostream>
#include <string>

using std::cout;

const char *num_day[] = {"-", "First", "Second", "Third",
         "Fourth", "Fifth", "Sixth", "Seventh",
         "Eighth", "Ninth", "Tenth", "Eleventh", "Twelfth"};
int main()
{

    for (int day = 1; day <= 12; ++day) {
    cout << "On the " << num_day[day]
         << " day of Christmas, my true love gave to me:\n";
    switch (day) {
        case 12: cout << "Twelve Drummers Drumming\n";
        case 11: cout << "Eleven Pipers Piping\n";
        case 10: cout << "Ten Lords a-Leaping\n";
        case 9: cout << "Nine Ladies Dancing\n";
        case 8: cout << "Eight Maids a-Milking\n";
        case 7: cout << "Seven Swans a-Swimming\n";
        case 6: cout << "Six Geese a-Laying\n";
        case 5: cout << "Five Gold Rings\n";
        case 4: cout << "Four Calling Birds\n";
        case 3: cout << "Three French Hens\n";
        case 2: cout << "Two Turtle Doves, and\n";
        case 1: cout << "A Partridge in a Pear Tree\n\n";
    }
}
return 0;

}

于 2015-10-07T05:53:07.290 回答