Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Kalendarz z pierwszym dniem tygodnia wybranym przez użytkownika

Ostatnio zmodyfikowano 2017-11-27 08:43
Autor Wiadomość
piggykce
Temat założony przez niniejszego użytkownika
[C++] Kalendarz z pierwszym dniem tygodnia wybranym przez użytkownika
» 2017-11-26 15:55:05
Mam taki kod jak poniżej, wszystko pięknie ładnie funkcjonuje, ale potrzebuje wdrożyć jeszcze jedną opcję, mianowicie chcę żeby użytkownik mógł wybrać pierwszy dzień tygodnia a co za tym idzie jak będzie się wyświetlał kalendarz. Opcja musi być możliwa dla każdego dnia tygodnia. Jak zrobić to najzgrabniej?
C/C++
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

bool czyRokPrzestepny( int rok ) {
    return(( rok % 4 == 0 && rok % 100 != 0 ) ||( rok % 400 == 0 ) );
}
/*Funkcja zwracajaca indeks dnia
dla danej daty - dzien/miesiac/rok

Index     dzien
0         Niedziela
1         Poniedzialek
2         Wtorek
3         Sroda
4         Czwartek
5         Piatek
6         Sobota*/
int indeksDnia( int dzien, int miesiac, int rok ) //Algorytm Sakamoto
{
   
    static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1,
        4, 6, 2, 4 };
    rok -= miesiac < 3;
    return( rok + rok / 4 - rok / 100 +
    rok / 400 + t[ miesiac - 1 ] + dzien ) % 7;
}

/*
Funkcja zwracajaca nazwe miesiaca po jego indeksie

indeks Miesiaca     Name
0                Styczen
1                Luty
2                Marzec
3                Kwiecien
4                Maj
5                Czerwiec
6                Lipiec
7                Sierpien
8                Wrzesien
9                Pazdziernik
10               Listopad
11               Grudzien */
string nazwaMiesiaca( int numerMiesiaca )
{
    string miesiac[] = { "Styczen", "Luty", "Marzec",
        "Kwiecien", "Maj", "Czerwiec",
        "Lipiec", "Sierpien", "Wrzesien",
        "Pazdziernik", "Listopad", "Grudzien"
    };
   
    return( miesiac[ numerMiesiaca ] );
}

/* Funkcja zwracajaca liczbe dni w danym miesiacu

Numer miesiaca     Nazwa        Liczba dni
0                Styczen     31
1                Lity        28 (nieprzestepny) / 29 (przestepny)
2                Marzec      31
3                Kwiecien    30
4                Maj         31
5                Czerwiec    30
6                Lipiec      31
7                Sierpien    31
8                Wrzesien    30
9                Pazdziernik 31
10               Listopad    30
11               Grudzien    31

*/
int liczbaDniMiesiaca( int numerMiesiaca, int rok )
{
    // Styczen
    if( numerMiesiaca == 0 )
         return( 31 );
   
    // Luty
    if( numerMiesiaca == 1 )
    {
        if( czyRokPrzestepny( rok ) )
             return( 29 );
        else
             return( 28 );
       
    }
   
    // Marzec
    if( numerMiesiaca == 2 )
         return( 31 );
   
    // Kwiecien
    if( numerMiesiaca == 3 )
         return( 30 );
   
    // Maj
    if( numerMiesiaca == 4 )
         return( 31 );
   
    // Czerwiec
    if( numerMiesiaca == 5 )
         return( 30 );
   
    // Lipiec
    if( numerMiesiaca == 6 )
         return( 31 );
   
    // Sierpien
    if( numerMiesiaca == 7 )
         return( 31 );
   
    // Wrzesien
    if( numerMiesiaca == 8 )
         return( 30 );
   
    // Pazdziernik
    if( numerMiesiaca == 9 )
         return( 31 );
   
    // Listopad
    if( numerMiesiaca == 10 )
         return( 30 );
   
    // Grudzien
    if( numerMiesiaca == 11 )
         return( 31 );
   
}

// Funkcja wyswietlajaca kalendarz na dany rok
void wyswietlKalendarz( int rok )
{
    cout << "      Kalendarz " << rok;
    int dni;
   
    // Indeks dnia od 0 do 6
    int obecny = indeksDnia( 1, 1, rok );
   
    // i --> Wszystkie miesiace
    // j --> Wszystkie dni miesiaca "i"
    for( int i = 0; i < 12; i++ )
    {
        dni = liczbaDniMiesiaca( i, rok );
       
        // Wyswietl nazwe miesiaca
        if( nazwaMiesiaca( i ).length() % 2 == 0 ) {
            cout << endl << "  " << string((( 34 - nazwaMiesiaca( i ).length() ) / 2 ), '-' ) << nazwaMiesiaca( i ) << string((( 33 - nazwaMiesiaca( i ).length() ) / 2 ), '-' ) << endl;
        }
        else {
            cout << endl << "  " << string((( 33 - nazwaMiesiaca( i ).length() ) / 2 ), '-' ) << nazwaMiesiaca( i ) << string((( 33 - nazwaMiesiaca( i ).length() ) / 2 ), '-' ) << endl;
           
        }
       
       
        // Wyswietl kolumny z nazwami dni
        cout << "  Nie  Pon  Wto  Sro  Czw  Pia  Sob" << endl;
       
        // Wyswietl odpowiednia ilosc miejsc
        int k;
        for( k = 0; k < obecny; k++ )
             cout << "     ";
       
        for( int j = 1; j <= dni; j++ )
        {
            cout << setw( 5 ) << j;
           
            if( ++k > 6 )
            {
                k = 0;
                cout << endl;
            }
        }
       
        if( k )
             cout << endl;
       
        obecny = k;
    }
   
    return;
}


int main()
{
    int rok;
    cin >> rok;
    while( rok < 1 ) {
        cout << "Niepoprawny rok, podaj rok z naszej ery: ";
        cin >> rok;
    }
   
    wyswietlKalendarz( rok );
   
    return 0;
}
 
EDIT:
Dla zainteresowanych - dodałem int pierwszyDzienTygodnia, 1 dla pon, 2 dla wt... 6 dla soboty, 0 dla niedzieli. Odjalem jej wartosc od indeksDnia (przed zakonczeniem nawiasu i " % 7" oraz w wyświetlaniu kalendarza dalem warunki i zalezenie od wartosci pierwszyDzienTygodnia cout'uje PON WTO ... albo jakas inną opcję.
P-167207
darko202
» 2017-11-27 07:59:24
? nie do końca rozumiem czego potrzebujesz, ale jest dużo linków na podobny temat
np.
http://www.algorytm.org​/przetwarzanie-dat​/wyznaczanie-dnia-tygodnia.html
https://pebx.pl/t​/c-jaki-dzien-w-roku.195185/
https://msdn.microsoft.com​/en-us/library/windows/desktop​/ms724950(v=vs.85).aspx

opisz dokładniej swój problem
w tym jakiego narzędzia chcesz użyć.

P-167222
mateczek
» 2017-11-27 08:43:21
albo lepiej. Daj przeczytać swój post komuś znajomemu (komuś, kto jeszcze nie wie na czym Twój problem polega). W ten sposób się przekonasz czy problem, który tu wstawiłeś jest wystarczająco jasno naświetlony.
P-167224
« 1 »
  Strona 1 z 1