Kalendarz wypisany rekurencyjnie

0

Cześć,

Mam za zadanie wypisać prosty kalendarz za pomocą rekurencji (nie mogę używać pętli). Mam mieć dwie zmienne: dni - liczba dni w miesiącu oraz start - pozycja pierwszego dnia. Jeśli pierwszy dzień nie zaczyna się od poniedziałku ma wyrzucić podkreślenia. Np. dla zmiennych dni = 28 i start = 2 ma mi dać w wyniku coś takiego:
_ 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28

#include <iostream>

using namespace std;


int Calendar(int pierwszy, int dni)
{

     cout.width(2);
     cout << pierwszy << "  ";
     if(pierwszy%7==0) cout << endl;
     if(pierwszy < dni) return Calendar(pierwszy+1, dni);


}

int main()
{
    Calendar(1, 28);
    return 0;
}

Nie wiem jak to ugryźć. Niby proste zadanie, ale nie mogę wpaść na pomysł. :(

1

Coś takiego?

#include <iostream>

int Calendar(int pierwszy, int dni)
{
  if(dni > pierwszy)
    Calendar(pierwszy, dni-1);
  else
  {
    if(pierwszy > 1)//rysowanie pustych miejsc na poczatku miesiaca
      std::cout << "_ ";
  }

  if(dni %7 == 0)
    std::cout << "\n";

  std::cout << dni << " ";

}

int main()
{
  Calendar(2, 28);
}
2

Nazwa funkcji powinna być czasownikiem w przypadku gdy funkcja coś robi (w przeciwieństwie do sytuacji gdy funkcja zwraca jakiś stan), i w C++ zazwyczaj zaczyna się małą literą.

Niby proste zadanie

Kto tak mówi? To zadanie wcale nie jest takie banalne (oczywiście mówimy o osobach, które się uczą języka).

  1. Najpierw napisz funkcję, która po prostu wypisuje wszystkie dni miesiąca jak leci 1 2 3 4 5 6 7 8 9 10 11..
  2. Potem dodaj nową linię tam gdzie jest niedziela.
  3. A na koniec dodaj wypisywanie _. Skoro nie można używać pętli, to pewnie trzeba zrobić trik typu wypisz _ jeśli dni ma jakąś specjalną wartość.
1
void create_calendar(uint days, uint start_day) {
    uint flags = start_day & 0xFF0000;
    start_day = 0x00FFFF & start_day;

    assert(days >= 0 and days <= 31);
    assert(start_day >= 1 and start_day <= 7);

    bool is_last_week = (flags == 0);
    bool is_last_week_day = is_last_week or
                            ((days + start_day - 1) % 7 == 0 and days > 0);

    if (is_last_week) {
        flags = 0xFF0000;
    }

    if (days > 0 and start_day >= 1) {
        create_calendar(days-1, flags | start_day);
        std::cout << std::setfill(' ') << std::setw(3) << days;
    } else if (days == 0 and start_day > 1) {
        create_calendar(0, flags | (start_day-1));
        std::cout << std::setfill(' ') << std::setw(3) << "_";
    }
    if (is_last_week_day)  {
        std::cout << "\n";
    }
}

Wywal flags jeżeli nie interesuje cię automatyczna nowa linia po całym miesiącu. Psuje wygląd kodu, ale dosłownie potraktowałam te dwie zmienne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1