JustAStudent
JustAStudent

Reputation: 99

12 Days Of Christmas C Program in Functions

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.

Upvotes: 3

Views: 4367

Answers (4)

Xavier S.
Xavier S.

Reputation: 1167

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();
    }

Upvotes: 0

juanchopanza
juanchopanza

Reputation: 227488

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
}

Upvotes: 3

Pierre Fourgeaud
Pierre Fourgeaud

Reputation: 14510

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.

Upvotes: 0

Daniel Daranas
Daniel Daranas

Reputation: 22634

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.

Upvotes: 2

Related Questions