2013-11-10 3 views
2

Я пытаюсь написать программу, которая выводит календарь. Пользователь должен ввести день начала месяца (понедельник-0, вторник-1 и т. Д.) И сколько дней в месяце. В зависимости от того, в какой день начнется месяц, календарные даты начнутся в этот конкретный день. Проблемы, которые у меня возникают, я не уверен, как начать календарь в определенный день, и я не уверен, как получить даты, чтобы перейти к новой строке через 7 дней. Любая помощь будет оценена по достоинству. До сих пор мы не многому научились, поэтому мне действительно разрешено использовать основы, никаких функций или подобных вещей.C++ Проблемы с календарем

Вот что у меня есть. Я мог бы быть далеко.

#include <iostream> 
#include <iomanip> 
#include <conio.h> 

using namespace std; 

int main() 
{ 
    int monthStartDay, daysInMonth; 

    cout << "Enter the first day of the month: "; 
    cin >> monthStartDay; 
    cout << "Enter how many days are in the month: "; 
    cin >> daysInMonth; 

    cout<<"\nSun Mon Tue Wed Thu Fri Sat"; 
    cout<<"\n\n"<<setw(2); 

    for (int x=1; x <= daysInMonth; x++){ 
     cout << x << setw(6); 

     for (int i=1; i == 6; i++) { 
      cout << "\n"; 
     } 
} 
    return 0; 
} 
+0

У меня есть ответ на этот вопрос по соответствующему сообщению http://stackoverflow.com/questions/37582163/c-calendar-loop-design/37582461#37582461 – winux

ответ

0

Внутренний цикл у вас есть, если i == 6, и этого никогда не произойдет. Может, почему вы застряли?

Здесь можно решить две проблемы: как разместить новую строку в нужном месте и как проложить до первого дня.

Я оставлю первую проблему для вас.

Трудно дать конкретную помощь в таких вещах, не давая ответа. Позвольте мне начать. Если я скажу, что первый день - пятый день, а есть 30 дней, тогда вы собираетесь распечатать 35 вещей. Первые пять - это пустое пространство, а остальные - это числа дня.

+0

Спасибо. Теперь у меня это работает. – apache

0

Я думаю, это то, что вы ищете:

#include <iostream> 
    #include <iomanip> 
    #include <conio.h> 

    using namespace std; 

    int main() 
    { 
     int monthStartDay, daysInMonth; 

     cout << "Enter the first day of the month: "; 
     cin >> monthStartDay; 
     cout << "Enter how many days are in the month: "; 
     cin >> daysInMonth; 

     cout<<"\nSun Mon Tue Wed Thu Fri Sat"; 
     cout<<"\n\n"<<setw(2); 


     int offset = monthStartDay;   // offset for the first date 
     for (int i = 0; i < offset; ++i) 
      cout << "" << setw(6);    // output blank space 

     for (int x=1 ; x <= daysInMonth; x++) 
     { 
      cout << x << setw(6);   
      if ((x+offset)%7 == 0)   // after each 7th output we have to 
       cout << "\n ";    // make a new line 
     } 
     return 0; 
    } 

Также я полагаю, что в случае календаря заголовка будет воскресенье = 0, понедельник = 1, ...

+0

Спасибо, я ценю это. Не копировал и не вставлял свои строки кода, но убедился, что я их понял, и я написал их в свою программу, и теперь он работает. Благодарю. – apache

2

Решение использует новый индекс, который будет показывать позицию в вашей строке календаря. То есть:

int startDayPostion = (monthStartDay + 1) % 7; 

Потому что вы считаете ноль с понедельника, но ваш отпечаток начинается с воскресенья. Следовательно, необходим «сдвиг вправо». Добавьте выше строку после чтения monthStartDay.

Вы должны затем добавить цикл, который будет печатать все пространства вам нужно, и будет смещаться выше положение до нужного startDayPostion:

int p = 0; 
for (; p < startDayPostion; ++p) { 
    cout << "" << setw(6); 
} 

(Вставить это перед вашим for петли с x)

Теперь, когда у вас есть смена, вы можете просто заполнить остальные ячейки, имея в виду, что вы до конца (Sat).

После

cout << x << setw(6); 

Keep сдвигая индекс справки:

++p; 

, а затем, если вы сделали с линии, перейти на новую строку и сбросить р:

if (p > 6) { 
    cout << '\n'; 
    p = 0; 
} 

Я не знаю, почему вы ставите здесь петлю for (int i=1; i == 6; i++) ...Вы можете просто удалить эти строки кода.

+0

Спасибо. Теперь у меня это работает. – apache

+0

Добро пожаловать. Я рад, что моя поддержка была полезна. Просто нажмите кнопку со стрелкой вверх возле моего ответа: D :) Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать. – ktalik

0

Вот что я взбивал - надеюсь, что это поможет!

#include "stdafx.h" 
#include <iostream> 
#include <iomanip> 

using namespace std; 


int main() 
{ 
    int i, days, startday; 

    cout << "Please enter the number of days in the month:" << endl; 
    cin >> days; 

    cout << "Please enter the starting date of the month (1 = Monday, 7 = Sunday):" << endl; 
    cin >> startday; 

    for (i = 1; i < startday; i++) 
    { 
     cout << " "; 
    } 

    for (i = 1; i <= days; i++) 
    { 
     cout << setw(3) << i; 

     if ((startday + i - 1) % 7 == 0) 
     { 
      cout << "\n"; 
     } 
    } 

    cout << endl; 

    system("pause"); 

    return 0; 
} 

Дайте мне знать, если требуется разъяснение.

Смежные вопросы