Wyświetlenie tablicy ze znaków

Wyświetlenie tablicy ze znaków
mix091
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Musze napisać prosty program, który będzie wyświetlał liczby od 0 do 9 zaprogramowane ze znaków z tablic. Tutaj jest kod mojego programu:

Kopiuj
#include <iostream>

using namespace std;

char tab1[ 10 ][ 6 ];

int wyswietl_0()
{
    
    for( int i = 0; i < 10; i++ )
    {
        for( int j = 0; j < 6; j++ )
        {
            tab1[ i ][ j ] = NULL;
        }
    }
    
    tab1[ 0 ][ 2 ] = { 2 };
    tab1[ 1 ][ 1 ] = { 2 };
    tab1[ 2 ][ 1 ] = { 2 };
    tab1[ 3 ][ 1 ] = { 2 };
    tab1[ 4 ][ 1 ] = { 2 };
    tab1[ 5 ][ 1 ] = { 2 };
    tab1[ 6 ][ 1 ] = { 2 };
    tab1[ 7 ][ 1 ] = { 2 };
    tab1[ 8 ][ 1 ] = { 2 };
    tab1[ 9 ][ 2 ] = { 2 };
    tab1[ 9 ][ 3 ] = { 2 };
    tab1[ 9 ][ 4 ] = { 2 };
    tab1[ 8 ][ 5 ] = { 2 };
    tab1[ 7 ][ 5 ] = { 2 };
    tab1[ 6 ][ 5 ] = { 2 };
    tab1[ 5 ][ 5 ] = { 2 };
    tab1[ 4 ][ 5 ] = { 2 };
    tab1[ 3 ][ 5 ] = { 2 };
    tab1[ 2 ][ 5 ] = { 2 };
    tab1[ 1 ][ 5 ] = { 2 };
    tab1[ 0 ][ 4 ] = { 2 };
    tab1[ 0 ][ 3 ] = { 2 };
    
    for( int i = 0; i < 10; i++ )
    { cout << endl;
        for( int j = 0; j < 6; j++ )
        {
            cout << tab1[ i ][ j ] << " ";
        }
    }
    cout << endl;
}

int wyswietl_1()
{
    
    for( int i = 0; i < 10; i++ )
    {
        for( int j = 0; j < 6; j++ )
        {
            tab1[ i ][ j ] = NULL;
        }
    }
    
    tab1[ 3 ][ 0 ] = { 2 };
    tab1[ 2 ][ 1 ] = { 2 };
    tab1[ 1 ][ 2 ] = { 2 };
    tab1[ 0 ][ 3 ] = { 2 };
    tab1[ 1 ][ 3 ] = { 2 };
    tab1[ 2 ][ 3 ] = { 2 };
    tab1[ 3 ][ 3 ] = { 2 };
    tab1[ 4 ][ 3 ] = { 2 };
    tab1[ 5 ][ 3 ] = { 2 };
    tab1[ 6 ][ 3 ] = { 2 };
    tab1[ 7 ][ 3 ] = { 2 };
    tab1[ 8 ][ 3 ] = { 2 };
    tab1[ 9 ][ 3 ] = { 2 };
    
    for( int i = 0; i < 10; i++ )
    { cout << endl;
        for( int j = 0; j < 6; j++ )
        {
            cout << tab1[ i ][ j ] << " ";
        }
    }
    cout << endl;
}

int main()
{
    wyswietl_0();
    wyswietl_1();
    
    return 0;
}

Mam zaprogramowane dwie liczby 0 i 1. Problem jest w tym że liczby wyświetlają się pionie jedna pod drugą, a chciał bym żeby wyświetlały się w poziomie, jedna koło drugiej. Jestem bardzo początkującym programistą i kompletnie nie mam koncepcji jak wykonać takie wyświetlanie w poziomie. Czy to by trzeba było zrobić jakąś tablice np. [10] na [100] i w nią wpisać te mniejsze tablice z cyframi?. Jak takie coś zrobić, ma ktoś jakiś pomysł? Jak ktoś mnie nie zrozumiał o co mi chodzi, to poniższy screen powinien wyjaśnić o co mi chodzi:

user image

Pozdrawiam

msm
  • Rejestracja: dni
  • Ostatnio: dni
2
Kopiuj
int main()
{
    wyswietl_0();
    wyswietl_1();
 
    return 0;
}

W taki (sekwencyjny) sposób tego niestety nie zrobisz (tzn. dałoby się, ale to by było dużo bardziej skomplikowane), bo wypisuje się na ekran liniami, i nie można 'wrócić' do poprzedniej po wypisaniu jednej.

Możesz za to zrobić funkcje przyjmującą wszystkie cyfry do wyświetlenia, i robiącą to "na raz". Jakiś prosty przykład (nie wiem czy typów nie przekomplikowałem, aczkolwiek działa):

Kopiuj
#include <iostream>

const char *zero[5] = {
    " xxx ",
    "x   x",
    "x   x",
    "x   x",
    " xxx "
};

const char *one[5] = {
    "   x ",
    "  xx ",
    " x x ",
    "   x ",
    "   x "
};

typedef const char *num_array[5]; // typedef dla uproszczenia

num_array *numbers[2] = { &zero, &one };

void display(int firstId, int secondId) { // firstId - pierwsza cyfra do wypisania, secondId - druga
    const char **first = *numbers[firstId];
    const char **second = *numbers[secondId];

    for (int row = 0; row < 5; row++) { // po kolei wypisanie wszystkich wierszy
        std::cout << first[row] << " " << second[row] << "\n";
    }
}

int main() {
    display(1, 0);
}
mix091
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Dzięki wielkie za odpowiedz i nakierowanie mnie jak to powinno wyglądać, bardzo mi pomogłeś ;)
Mam tylko jedno pytanie co tam robią wszędzie te *? Czym się różni

Kopiuj
const char *one[5]

od tego const char one[5]

Kopiuj
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

W to drugie da się wpisać tylko 5 znaków jeden z których to znak końca.

mix091
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

No dobrze a w ten pierwszy to ile się da wpisać? Więcej niż 5? Jeżeli tak to dla czego w nawiasie jest liczba 5 skoro wyświetla wiecej niż 5 znaków?

msm
  • Rejestracja: dni
  • Ostatnio: dni
1

Pierwsze to "tablica pięciu napisów" (albo "tablica pięciu wskaźników na znak"), drugie to "tablica pięciu znaków".

Alternatywnie można zapisać (jeśli bardziej tak widać):

Kopiuj
typedef const char *napis;
napis one[5] = {
    // ...
}
mix091
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Dzięki za odpowiedzi, tylko jeszcze nie mogę ogarnąć jak działa ta funkcja display, pętle rozumiem ale to co się dzieje nad pętlą to jakaś czarna magia jak dla mnie :D

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

A tak:

Kopiuj
#include <iostream>
using namespace std;
 
void display(unsigned val)
  {
   static const char *dig[][10]=
     {
         { " xxx  ", "   x  " },
         { "x   x ", "  xx  " },
         { "x   x ", " x x  " },
         { "x   x ", "   x  " },
         { " xxx  ", "   x  " }
     };
   for(int y=0;y<sizeof(dig)/sizeof(*dig);++y,cout<<endl) for(unsigned i=val;i;i/=10) cout<<dig[y][i%10];
  }
 
int main()
  {
   display(101);
   return 0;
  }

http://ideone.com/byhTkf

mix091
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Też nie rozumiem jak to działa, tak samo jak u kolegi wyżej. Nie rozumiem na jakiej zasadzie program wie co wypisać po podaniu mu argumentów display(101), nie mam pojęcia skąd on wie że ma wyświetlić 1 0 i 1. W programie podanym przez @msm też tego właśnie nie rozumiem ;)

@Edit
Dobra dziękuje już prawie rozumiem :D nie kumam jeszcze tylko tego

Kopiuj
cout<<dig[y][i%10]

co robi ten % o co z tym chodzi?

mix091
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Witam to znowu ja ;)

Mam jeszcze jeden problem odnośnie tego "projektu". Muszę te tablice z liczbami wprowadzić w ruch np. żeby jeździły od lewej strony ekranu do prawej. O ile problemu nie mam ze zrobieniem takiej animacji na pojedynczej linijce tekstu(gotoxy), to na tablicy już nie potrafię tego zrealizować. Ktoś mi doradził abym to zrobił za pomocą "timera", ale wszystkie przykłady, które znalazłem tyczyły się już programowania okienkowego a nie w konsoli. Możecie mi pomóc zrobić taka animacje?

Pozdrawiam :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.