Проблема с printf - не печатается введенное целое значение - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь собрать мою программу на C, чтобы она выглядела как настоящая Unix-программа.В частности, я пытаюсь заставить первые 3 месяца отображаться так:

                            2017
      January               February               March          
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
 1  2  3  4  5  6  7            1  2  3  4            1  2  3  4  
 8  9 10 11 12 13 14   5  6  7  8  9 10 11   5  6  7  8  9 10 11  
15 16 17 18 19 20 21  12 13 14 15 16 17 18  12 13 14 15 16 17 18  
22 23 24 25 26 27 28  19 20 21 22 23 24 25  19 20 21 22 23 24 25  
29 30 31              26 27 28              26 27 28 29 30 31     

Вот мой код, это черновик, и я постараюсь уменьшить его позже.Я делаю печать построчным методом

void printJanFebMar(int year)
{
    printf("                               %d\n",year);
    //print months from January to March
    printf("      January               February               March\n");
    for(int i = 0;i<3;i++){
        printf(" Su Mo Tu We Th Fr Sa ");
    }
    printf("\n");
    //January, February and March
    //first line of days...
    int record1 = 0;
    int record2 = 0;
    int record3 = 0;
        for(int k = 0;k<findStartDateInMonth(1,year);k++){
            printf("   ");
        }
        for(int j = 1;j<=daysInMonth[1];j++){
            printf("%3d",j);
            if((j+findStartDateInMonth(1,year)) % 7 == 0){
                break;
                record1 = j + findStartDateInMonth(1,year) +1;
                printf("%d",record1);
            }
        }
        printf(" ");
        for(int k = 0;k<findStartDateInMonth(2,year);k++){
            printf("   ");
        }
        for(int j = 1;j<=daysInMonth[2];j++){
            printf("%3d",j);
            if((j+findStartDateInMonth(2,year)) % 7 == 0){
                break;
                record2 = j + findStartDateInMonth(2,year) +1;
                printf("%d",record2);
            }
        }
        printf(" ");
        for(int k = 0;k<findStartDateInMonth(3,year);k++){
            printf("   ");
        }
        for(int j = 1;j<=daysInMonth[3];j++){
            printf("%3d",j);
            if((j+findStartDateInMonth(3,year)) % 7 == 0){
                break;
                record3 = j + findStartDateInMonth(3,year) +1;
                printf("%d",record3);
            }
        }
        printf("\n");
        //second line
        /*
        for(int i = record1;i<record1+7;i++){
            printf("%3d",i);
        }
        printf(" ");
        for(int i = record2;i<record2+7;i++){
            printf("%3d",i);
        }
        for(int i = record2;i<record2+7;i++){
            printf("%3d",i);
        }
        */
        printf("\n");

Однако печатается первая строка для дней, когда я пытаюсь сохранить значение дня, который будет в новой строке для будущегооператоры printf, значения не распечатываются, как показано в

printf("%d",record1);

Вот текущий вывод моей программы:

                               2017
    January               February               March
 Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa 
  1  2  3  4  5  6  7            1  2  3  4            1  2  3  4

В чем моя ошибка при назначении значений для записи1,record2 и record3 и как бы я это исправить.

Извините за длинный пост, и я был бы очень признателен за любую помощь

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Операторы break неуместны в дневных циклах печати. После обновления номера рабочего дня вы должны выйти из цикла:

        if ((j + findStartDateInMonth(1, year)) % 7 == 0) {
            record1 = j + findStartDateInMonth(1, year) + 1;
            break;
        }

Ваш подход можно упростить и сделать более общим. Для наглядности, вот более полная версия:

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

static const char *MonthNames[] = {
    NULL,
    "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December",
};

/* Print the Proleptic* Gregorian calendar
   (*) extended into the past before its adoption */
static void printYear(int year) {
    int DaysInMonth[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    const char *DayHeadings = "Su Mo Tu We Th Fr Sa";
    int d1, d2, d3, y1, day;

    y1 = year - 1;
    day = y1 * 1461 / 4 - y1 / 100 + y1 / 400 + 1;
    if (!(year % 4) && ((year % 100) || !(year % 400)))
        DaysInMonth[2] = 29;

    printf("%33d\n\n", year);
    for (int m = 1; m <= 12; m += 3) {
        int pad = 0;
        for (int i = 0; i < 3; i++) {
            int len = strlen(MonthNames[m + i]);
            int pad1 = len + (20 - len) / 2;
            printf("%*s", pad + pad1, MonthNames[m + i]);
            pad = 22 - pad1;
        }
        printf("\n%s  %s  %s\n", DayHeadings, DayHeadings, DayHeadings);
        d1 = 1 - day % 7;
        day += DaysInMonth[m];
        d2 = 1 - day % 7;
        day += DaysInMonth[m + 1];
        d3 = 1 - day % 7;
        day += DaysInMonth[m + 2];
        for (int j = 0; j < 6; j++) {
            pad = -1;
            for (int i = 0; i < 7; i++, d1++) {
                pad += 3;
                if (d1 > 0 && d1 <= DaysInMonth[m])
                    pad -= printf("%*d", pad, d1);
            }
            pad += 1;
            for (int i = 0; i < 7; i++, d2++) {
                pad += 3;
                if (d2 > 0 && d2 <= DaysInMonth[m + 1])
                    pad -= printf("%*d", pad, d2);
            }
            pad += 1;
            for (int i = 0; i < 7; i++, d3++) {
                pad += 3;
                if (d3 > 0 && d3 <= DaysInMonth[m + 2])
                    pad -= printf("%*d", pad, d3);
            }
            printf("\n");
        }
    }
}

int main(int argc, char *argv[]) {
    if (argc > 1) {
        for (int i = 1; i < argc; i++) {
            int year = strtol(argv[i], NULL, 0);
            printYear(year);
        }
    } else {
        printYear(2018);
    }
    return 0;
}
0 голосов
/ 17 сентября 2018

Прежде всего, это похоже на действительно классную программу.

Ваш код на данный момент довольно хорош - вам просто нужно переместить оператор break; после других команд, или он завершит цикл перед их выполнением. Не забудьте делать это в течение всех 3 месяцев.

for(int j = 1;j<=daysInMonth[1];j++){
    printf("%3d",j);
    if((j+findStartDateInMonth(1,year)) % 7 == 0){
        record1 = j + findStartDateInMonth(1,year) +1;
        break; // Moved this line to AFTER the record update
    }
}

И еще одна проблема, с которой вы можете столкнуться:

record1 = j + findStartDateInMonth(1,year) +1;

Эта строка должна быть просто:

record1 = j + 1;

Попробуйте онлайн! Просто нажмите «Выполнить» и пролистайте, чтобы увидеть результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...