Code Review Stack Exchange is a question and answer site for peer programmer code reviews. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Desired output:

screenshot screenshot

Can I get an shorter version of this code? My instructor just wants me to figure it out my self.

#include <stdio.h>

int main() {

    int month,week,day;

    printf("Enter month: ");
    scanf("%d",&month);
    printf("[ 1=Sunday  2=Monday 3=Tuesday 4=Wednesday ]\n[      5=Thursday 6=Friday 7=Saturday      ]\n");
    printf("Enter starting day of the week: ");
    scanf("%d",&week);

        if (week==1 && month>0 && month<=12)
            if (month == 1 || month == 3 || month ==5 || month ==7 || month ==8 || month == 10 || month ==12)
            for (day=1;day<=31;day++)
                if (day==7 || day==14 || day==21 || day==28)
                printf("%3d\n",day);
                else
                printf("%3d",day);
            else if (month ==4 || month==6 || month ==9 ||month==11 )
            for (day=1;day<=30;day++)
                if (day==7 || day==14 || day==21 || day==28)
                printf("%3d\n",day);
                else
                printf("%3d",day);
            else
            for (day=1;day<=29;day++)
                if (day==7 || day==14 || day==21 || day==28)
                printf("%3d\n",day);
                else
                printf("%3d",day);

        else if (week==2 && month>0 && month<=12)
            if (month == 1 || month == 3 || month ==5 || month ==7 || month ==8 || month == 10 || month ==12)
            for (day=1;day<=31;day++)
                if (day==6 || day==13 || day==20 || day==27)
                printf("%3d\n",day);
                else if (day==1)
                printf("   %3d",day);
                else
                printf("%3d",day);
            else if (month ==4 || month==6 || month ==9 ||month==11 )
            for (day=1;day<=30;day++)
                if (day==6 || day==13 || day==20 || day==27)
                printf("%3d\n",day);
                else if (day==1)
                printf("   %3d",day);
                else
                printf("%3d",day);
            else
            for (day=1;day<=29;day++)
                if (day==6 || day==13 || day==20 || day==27)
                printf("%3d\n",day);
                else if (day==1)
                printf("   %3d",day);
                else
                printf("%3d",day);

        else if (week==3 && month>0 && month<=12)
            if (month == 1 || month == 3 || month ==5 || month ==7 || month ==8 || month == 10 || month ==12)
            for (day=1;day<=31;day++)
                if (day==5 || day==12 || day==19 || day==26)
                printf("%3d\n",day);
                else if (day==1)
                printf("      %3d",day);
                else
                printf("%3d",day);
            else if (month ==4 || month==6 || month ==9 ||month==11 )
            for (day=1;day<=30;day++)
                if (day==5 || day==12 || day==19 || day==26)
                printf("%3d\n",day);
                else if (day==1)
                printf("      %3d",day);
                else
                printf("%3d",day);
            else
            for (day=1;day<=29;day++)
                if (day==5 || day==12 || day==19 || day==26)
                printf("%3d\n",day);
                else if (day==1)
                printf("      %3d",day);
                else
                printf("%3d",day);

        else if (week==4 && month>0 && month<=12)
            if (month == 1 || month == 3 || month ==5 || month ==7 || month ==8 || month == 10 || month ==12)
            for (day=1;day<=31;day++)
                if (day==4 || day==11 || day==18 || day==25)
                printf("%3d\n",day);
                else if (day==1)
                printf("         %3d",day);
                else
                printf("%3d",day);
            else if (month ==4 || month==6 || month ==9 ||month==11 )
            for (day=1;day<=30;day++)
                if (day==4 || day==11 || day==18 || day==25)
                printf("%3d\n",day);
                else if (day==1)
                printf("         %3d",day);
                else
                printf("%3d",day);
            else
            for (day=1;day<=29;day++)
                if (day==4 || day==11 || day==18 || day==25)
                printf("%3d\n",day);
                else if (day==1)
                printf("         %3d",day);
                else
                printf("%3d",day);


        else if (week==5 && month>0 && month<=12)
            if (month == 1 || month == 3 || month ==5 || month ==7 || month ==8 || month == 10 || month ==12)
            for (day=1;day<=31;day++)
                if (day==3 || day==10 || day==17 || day==24 || day==31)
                printf("%3d\n",day);
                else if (day==1)
                printf("            %3d",day);
                else
                printf("%3d",day);
            else if (month ==4 || month==6 || month ==9 ||month==11 )
            for (day=1;day<=30;day++)
                if (day==3 || day==10 || day==17 || day==24)
                printf("%3d\n",day);
                else if (day==1)
                printf("            %3d",day);
                else
                printf("%3d",day);
            else
            for (day=1;day<=29;day++)
                if (day==3 || day==10 || day==17 || day==24)
                printf("%3d\n",day);
                else if (day==1)
                printf("            %3d",day);
                else
                printf("%3d",day);

        else if (week==6 && month>0 && month<=12)
            if (month == 1 || month == 3 || month ==5 || month ==7 || month ==8 || month == 10 || month ==12)
            for (day=1;day<=31;day++)
                if (day==2 || day==9 || day==16 || day==23 || day==30)
                printf("%3d\n",day);
                else if (day==1)
                printf("               %3d",day);
                else
                printf("%3d",day);
            else if (month ==4 || month==6 || month ==9 ||month==11)
            for (day=1;day<=30;day++)
                if (day==2 || day==9 || day==16 || day==23 || day==30)
                printf("%3d\n",day);
                else if (day==1)
                printf("               %3d",day);
                else
                printf("%3d",day);
            else
            for (day=1;day<=29;day++)
                if (day==2 || day==9 || day==16 || day==23)
                printf("%3d\n",day);
                else if (day==1)
                printf("               %3d",day);
                else
                printf("%3d",day);

        else if (week==7 && month>0 && month<=12)
            if (month == 1 || month == 3 || month ==5 || month ==7 || month ==8 || month == 10 || month ==12)
            for (day=1;day<=31;day++)
                if (day==8 || day==15 || day==22 || day==29)
                printf("%3d\n",day);
                else if (day==1)
                printf("                  %3d\n",day);
                else
                printf("%3d",day);
            else if (month ==4 || month==6 || month ==9 ||month==11 )
            for (day=1;day<=30;day++)
                if (day==8 || day==15 || day==22 || day==29)
                printf("%3d\n",day);
                else if (day==1)
                printf("                  %3d\n",day);
                else
                printf("%3d",day);
            else
            for (day=1;day<=29;day++)
                if (day==8 || day==15 || day==22 || day==29)
                printf("%3d\n",day);
                else if (day==1)
                printf("                  %3d\n",day);
                else
                printf("%3d",day);

        else printf("Invalid Input!");

    getch();
}
share|improve this question
    
Welcome to Code Review! This question is incomplete. To help reviewers give you better answers, please add sufficient context to your question. The more you tell us about what your code does and what the purpose of doing that is, the easier it will be for reviewers to help you. See also this meta question. – SuperBiasedMan Feb 14 at 14:24
4  
If your instructor wants you to figure it out yourself, it's unlikely your instructor actually meant "ask people on the internet." – Edward Feb 14 at 14:46

Avoid repetitions of code

Whenever you repeat your code you need to look into whether it can simplified. The key thing to look for is where does the copied code blocks differ, and can you extract those differences into variables or similar.

In your case this should be rather simple, as what varies is the major loop counter, i.e. 28(/29), 30 or 31. In addition you need to know which day of the week you're starting on, and when to add the newlines.

The latter can be approached using the modulo operator, % 7, with a proper offset related to the day of week.

Some style comments

Here are also some style comments related to your code:

  • Use braces around blocks of for and if – All of your code relies heavily on using single statements for all of your for and if blocks. This is somewhat dangerous, and you should always use braces arounds blocks to be safe.

    This in addition to using proper indentation for each new code level, i.e. for and if would make your code a lot more readable and better to understand. This would also help you eliminate some bugs, which are very likely to occur at some point in time.

  • Be precise in variable naming – Instead of week, use something like starting_weekday (or weekday). Having precise variable names will help you when your programs evolve and get more complicated. Having unclear variable names, will obfuscate the meaning of your program and make it harder to write correct logic.

  • Add spaces around operators – Instead of for (day=1;day<=29;day++), add a space around the operators, making it for (day = 1; day <= 29; day++). This is yet another tip which makes your code easier to understand, and helps you avoid bugs and features later on. So add spaces after commas, and around operators.

More could be said, but this should get you going on implementing a much nicer and cleaner version of your code in a lot less lines.

share|improve this answer

You have 3 × 7 cases, which is a lot. One better approach would be to print the desired number of blanks, like the code in this question.

For handling the month lengths, it would be better to use a lookup table instead of so many if statements, like this.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.