3

A C program that contains a function that outputs the lyrics of the traditional Christmas song “Twelve Days of Christmas.” Do not print the entire lyrics manually.

So I made a code and there were errors but I finally fixed it. My Twelve Days of Christmas Song prints well with the looping.

But I have another problem. Is my code possible to be separated or dissected as functions?

The instruction says, "Your function will just be invoked in the main() function and will not return anything." So I guess I'll be using void? In what way?

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

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

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

for (counter=1; counter<=12; counter++) {

printf("\tOn the ");

switch(counter){
        case 1:
            printf("1st");
            break;
        case 2:
            printf("2nd");
            break;
        case 3:
            printf("3rd");
            break;
        default:
            printf("%dth", counter);
            break;
    }
printf(" day of Christmas my true love sent to me\n\n");

switch(counter) {

    case 12: printf("\t\tTwelve Drummers Drumming\n\n");
    case 11: printf("\t\tEleven Pipers Piping\n\n"); 
    case 10: printf("\t\tTen Lords a Leaping\n\n");
    case 9: printf("\t\tNine Ladies Dancing\n\n"); 
    case 8: printf("\t\tEight Maids a Milking\n\n");
    case 7: printf("\t\tSeven Swans a Swimming\n\n");
    case 6: printf("\t\tSix Geese a Laying\n\n"); 
    case 5: printf("\t\tFive Golden Rings\n\n"); 
    case 4: printf("\t\tFour Calling Birds \n\n"); 
    case 3: printf("\t\tThree French Hens\n\n");
    case 2: printf("\t\tTwo Turtle Doves\n\n");
    case 1: printf("\t\t");if (counter > 1 ) printf("And ");printf("A Partridge in a Pear Tree\n\n");
    //  case 1: printf("\t\tA Partridge in a Pear Tree\n\n");



}

}

getchar(); return 0; }

Tried executing this and works fine with the printing. Do you have any suggestions to imporove my code? Having trouble with functions.

Mats Petersson
  • 126,704
  • 14
  • 140
  • 227
JustAStudent
  • 99
  • 1
  • 5
  • 10

4 Answers4

3

It just means all the work should be done in a void function, which is then called in main:

void doTheWork(void); // function declaration

int main(void)
{
  doTheWork();
  return 0;
}

#include <stdio.h>
// function definition
void doTheWork(void)
{
  // put the implementation here
}
juanchopanza
  • 223,364
  • 34
  • 402
  • 480
  • I tried that but an error occurred saying for example dothework is not declared in the scope. What scope? @juanchopanza – JustAStudent Aug 27 '13 at 08:47
  • 2
    @JennicaPrincess OK, I had a typo in the call to the work function. `dotheWork()` should have been `doTheWork()`. – juanchopanza Aug 27 '13 at 08:54
2

Use a void function.

void print12DaysOfChristmas(void)
{
    // Paste all your code here
}

int main(void) // Main Function
{
    print12DaysOfChristmas();
    return 0;
}

Notes:

  1. About the function signatures in C, see this answer.
  2. If the function were not defined before main, you would need to use a forward declaration.
Community
  • 1
  • 1
Daniel Daranas
  • 22,454
  • 9
  • 63
  • 116
  • Tried that but then an error occurred saying, "print12DaysOfChristmas" was not declared in the scope. @Daniel Daranas – JustAStudent Aug 27 '13 at 08:45
  • 3
    Did you paste the exact code I wrote? Either define print12DaysOfChristmas before int main(void), or use a forward declaration like in [this answer](http://stackoverflow.com/a/18460793/96780). – Daniel Daranas Aug 27 '13 at 08:46
0

It means that you should create a void function to do the job :

#include <stdio.h>

// Function Implementation
void yourFunction(void)
{
    int days, counter, num;

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

    for (counter=1; counter<=12; counter++) {

        printf("\tOn the ");

        switch(counter){
        case 1:
            printf("1st");
            break;
        case 2:
            printf("2nd");
            break;
        case 3:
            printf("3rd");
            break;
        default:
            printf("%dth", counter);
            break;
        }
        printf(" day of Christmas my true love sent to me\n\n");

        switch(counter) {

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

int main(void)
{
    yourFunction(); // Call your function

    getchar();
    return 0;
}

With a live example.

Pierre Fourgeaud
  • 14,290
  • 1
  • 38
  • 62
0

On your program you need to suppress all magic number (cf: http://en.wikipedia.org/wiki/Magic_number_%28programming%29)

Also, i optimize a bit your code as following:

    #include <stdio.h>
    #include <string.h>

    #define FIRST_DAY  "1st"
    #define SECOND_DAY "2nd"
    #define THIRD_DAY  "3rd"
    #define N_DAY      "th"

    #define ONLY_ONE_SENTENCE 0
    #define LAST_DAY          1
    #define NUMBER_OF_DAYS    12

    #define BUFFER_SIZE       5

    #define FIRST_ANNOUNCE "\tOn the %s day of Christmas my true love sent to me\n\n"

    const char *sentences[] = {
        "\t\tA Partridge in a Pear Tree\n\n", 
        "\t\tAnd A Partridge in a Pear Tree\n\n", 
        "\t\tTwo Turtle Doves\n\n", 
        "\t\tThree French Hens\n\n", 
        "\t\tFour Calling Birds \n\n", 
        "\t\tFive Golden Rings\n\n", 
        "\t\tSix Geese a Laying\n\n", 
        "\t\tSeven Swans a Swimming\n\n", 
        "\t\tEight Maids a Milking\n\n", 
        "\t\tNine Ladies Dancing\n\n", 
        "\t\tTen Lords a Leaping\n\n", 
        "\t\tEleven Pipers Piping\n\n", 
        "\t\tTwelve Drummers Drumming\n\n"};

    void print12DaysOfChristmas();

    int main() { // Main Function
        print12DaysOfChristmas();
        return 0;
    }


    void print12DaysOfChristmas() {
        int days, counter, num, index;
        char buffer[BUFFER_SIZE];
        char *day;

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

        for (counter=1; counter <= NUMBER_OF_DAYS; counter++) {
            switch (counter) {
                case 1:
                    day=FIRST_DAY;
                    break;
                case 2:
                    day=SECOND_DAY;
                    break;
                case 3:
                    day=THIRD_DAY;
                    break;
                default:
                    snprintf(buffer, BUFFER_SIZE,"%d",counter);
                    day=strcat(buffer, N_DAY);
                    break;
                }

            printf(FIRST_ANNOUNCE, day);

            for (index=counter; index > 0; index--) {
                // If there is only one sentence 
                if (counter == LAST_DAY) {
                    printf(sentences[ONLY_ONE_SENTENCE]);
                } else {
                    printf(sentences[index]);
                }
            }
        }

        getchar();
    }
Xavier S.
  • 1,147
  • 13
  • 33