Porównywanie elementów tablicy z zadanym wzorem

0

Witam,

Jestem bardzo początkującym "programistom", o ile w ogóle mogę się tak nazwać, i mam pewien problem natury technicznej.

Chcę napisać program, który po wprowadzeniu przez użytkownika pewnego 7 znakowego kodu poda odpowiednią datę. Program, a raczej jego szkielet, generalnie działa poprawnie, ale jego kod nie podoba mi się i wiem, że na pewno da się to zrobić w sposób bardziej elegancki.

Kod, wprowadzany przez użytkownika w formacie: RMxDDxx (R- rok, M - miesiac, DD - dzien), np.: 6HY1763 powinien podać datę 17.08.2006

Pytanie brzmi: W jaki sposób mogę napisać ten kod w bardziej elegancki (krótszy) sposób niż przy użyciu switcha? Wiem, że poziom zaawansowania tego problemu jest bardzo "złożony", ale siedzę nad tym już drugi dzień i nie mogę tego ogarnąć :/

#include <iostream>

using namespace std;

int main()
{
    const int znakow_w_kodzie = 7;
    char kod [znakow_w_kodzie];
    int rok=0, miesiac=0, dzien1=0, dzien2=0;

    cout << "Podaj kod: ";
    for(int i=0; i<znakow_w_kodzie; i++)
        cin >> kod[i];

    // ROK
    switch(kod[0])
    {
        case '0': rok=2010;    break;
        case '1': rok=2011;    break;
        case '2': rok=2012;    break;
        case '3': rok=2013;    break;
        case '4': rok=2014;    break;
        case '5': rok=2005;    break;
        case '6': rok=2006;    break;
        case '7': rok=2007;    break;
        case '8': rok=2008;    break;
        case '9': rok=2009;    break;
    }
    //MIESIAC
    switch(kod[1])
    {
        case 'A': miesiac=01;    break;
        case 'B': miesiac=02;    break;
        case 'C': miesiac=03;    break;
        case 'D': miesiac=04;    break;
        case 'E': miesiac=05;    break;
        case 'F': miesiac=06;    break;
        case 'G': miesiac=07;    break;
        case 'H': miesiac=8;    break;
        case 'I': miesiac=9;    break;
        case 'J': miesiac=10;    break;
        case 'K': miesiac=11;    break;
        case 'L': miesiac=12;    break;
    }
    //PIERWSZA CYFRA DNIA
    switch(kod[3])
    {
        case '0': dzien1=0;    break;
        case '1': dzien1=1;    break;
        case '2': dzien1=2;    break;
        case '3': dzien1=3;    break;
    }
    // DRUGA CYFRA DNIA
    switch(kod[4])
    {
        case '0': dzien2=0;    break;
        case '1': dzien2=1;    break;
        case '2': dzien2=2;    break;
        case '3': dzien2=3;    break;
        case '4': dzien2=4;    break;
        case '5': dzien2=5;    break;
        case '6': dzien2=6;    break;
        case '7': dzien2=7;    break;
        case '8': dzien2=8;    break;
        case '9': dzien2=9;    break;
    }

    cout << "Data: " << dzien1 << dzien2 << "." << miesiac << "." << rok << endl;

    return 0;
}
1

np tak:

#include <iostream>
 
using namespace std;
 
int main()
{
    const int znakow_w_kodzie = 7;
    char kod [znakow_w_kodzie];
    int rok=0, miesiac=0, dzien1=0, dzien2=0;
 
    cout << "Podaj kod: ";
    for(int i=0; i<znakow_w_kodzie; i++)
        cin >> kod[i];
 
    cout << "Data: " << kod[3] - '0' << kod[4] - '0' << "." << kod[1] - 'A' << "." << kod[0] - '0' + 2010 << endl;
 
    return 0;
}
 
0
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
  {
   const int znakow_w_kodzie = 7;
   char kod[znakow_w_kodzie+1];
   cout<<"Podaj kod: ";
   cin>>setw(znakow_w_kodzie)>>kod;
   int rok=2000+10*(kod[0]<5)+kod[0]-'0',miesiac=1+kod[1]-'A',dzien=10*(kod[3]-'0')+kod[4]-'0';
   cout<<"Data: "<<setfill('0')<<setw(2)<<dzien<<'.'<<setw(2)<<miesiac<<'.'<<rok<< endl; 
   return 0;
  }

http://ideone.com/Pbs3ke

0

@stryku - niestety kod ten nie do końca działa prawidłowo, podaje błędny miesiąc ( o jeden za mały)
@_13th_Dragon - też nie do końca działa to prawidłowo...

Może doprecyzuje nieco sam "szyfr".

RMxDDxx, np. 6HY1763 daje 17.08.2006

R - rok jaki powinien sie wyswietlac
0 - 2010
1 - 2011
2 - 2012
3 - 2013
4 - 2014
5 - 2005
6 - 2006
7 - 2007
8 - 2008
9 - 2009

M - miesiąc jaki powinien się wyświetlać
A - 01
B - 02
C - 03
D - 04
E - 05
F - 06
G - 07
H - 08
I - 09
J - 10
K - 11
L - 12

DD - dzień jaki powinien się wyświetlać
01 - 01
02 - 02
...
10 - 10
11 - 11
...
20 - 20
21 -21
...
30 - 30
31 - 31
32 -32
...

1

jest problem z rokiem?

#include <iostream>
 
using namespace std;
 
int main()
{
    const int znakow_w_kodzie = 7;
    char kod [znakow_w_kodzie];
    int rok=0, miesiac=0, dzien1=0, dzien2=0;
 
    cout << "Podaj kod: ";
    for(int i=0; i<znakow_w_kodzie; i++)
        cin >> kod[i];
 
    cout << "Data: " << kod[3] - '0' << kod[4] - '0' << "." << kod[1] - 'A' << "." << kod[0] - '0' + ( ( kod[0] < 5 ) ? 2010 : 2000 ) << endl;
 
    return 0;
} 
0

@stryku - teraz działa prawidłowo. Do pozycji z miesiącem musiałem dodać +1 bo podstawiając w to miejsce np. A dawało 0, a powinno 1.

Byłym wdzięczny jeszcze, gdybyś mógł mi wytłumaczyć co robią te pozycje po komendzie cout - nie bardzo rozumiem, a nie sztuka przepisać gotowy kod... :(

1

Ogólnie jest tak, że znaki(char) w komputerze zapisywane są jako liczby. Liczby te można dodawać, odejmować i robić to do czego liczby są.
I kompilator jak widzi np.

'a' 

to zamienia to na odpowiadającą temu liczbę czyli 97.

Więc jak masz tablicę znaków np taką: [w][y][r][a][z] to tak naprawdę masz takie coś: [119][121][114][97][122]

Jakie liczby odpowiadają jakim znakom znajdziesz tu: http://pl.wikipedia.org/wiki/ASCII

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