• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tablica 4 na 4?

Object Storage Arubacloud
0 głosów
363 wizyt
pytanie zadane 17 marca 2021 w C i C++ przez emmail Nowicjusz (160 p.)

 

Witam,

chcę pomóc synowi w informatyce. Musimy zrobić program, który wyświetli znak wpisany z klawiatury w czterech wierszach i czterech kolumnach.

Udało nam się na razie coś takiego:

#include <iostream>

using namespace std;

void wypiszZnak (char znak)
{
    for (int i=0; i<4; i++)
    {
        cout << znak << endl;
    }
}

int main()
{
    wypiszZnak ('X');
    return 0;

}

Nie wiemy jednak teraz jak wymusić, aby wyświetlało znak, który użytkownik wpisze z klawiatury.

Oczywiście wiemy, że trzeba użyć np. "cin>>n", aby zapamiętać wpisany znak, ale nie wiemy jak wymusić później jego wyświetlenie.

Dodatkowo, nie wiemy jak zrobić 4 kolumny... Czy tutaj trzeba użyć "int tab [4][4]" ?

2 odpowiedzi

+1 głos
odpowiedź 17 marca 2021 przez Michał Muzyka Pasjonat (24,080 p.)

Dzień dobry,
nie, w takim przypadku nie potrzeba definiować tablicy, wystarczy jedna zmienna, która przechowa wczytany znak. Później znak zapisany w zmiennej przekazujemy do funkcji.

Proszę wyobrazić sobie to jako cztery wiersze wypisane czterokrotnie. Do tego potrzebna będzie druga pętla wewnątrz pierwszej. Pętla wewnętrzna wypisuje 4 znaki oddzielone spacjami, potem wypisywany jest znak nowej linii i to zapętlone jest czterokrotnie. Są Państwo na bardzo dobrej drodze wystarczy dodać kilka linijek:

#include <iostream>
 
using namespace std;
 
void wypiszZnak (char znak)
{
    for (int  y=0; y<4; y++){
         for(int x=0; x<4; x++)
           cout << znak << ' ';
       cout << endl;
    }
}
 
int main()
{
    char c;
    cout << "Podaj znak: ";
    cin >> c;
    wypiszZnak(c);
    return 0;
 
}

 

komentarz 17 marca 2021 przez emmail Nowicjusz (160 p.)

 

Dziękuję za pomoc.

Do tego doszliśmy sami:

 for (int  i=0; i<4; i++)
{
         for(int j=0; j<4; j++)
           cout << znak << ' ';
       cout << endl;
  }

brakowało nam tylko w mainie:

char c;
cin >> c;
wypiszZnak(c);

Działa, dziękuję jeszcze raz

0 głosów
odpowiedź 17 marca 2021 przez SzkolnyAdmin Szeryf (86,360 p.)

Troche zmodyfikowałem program Michała. Nie potrzeba dwóch pętli, w pętli pytasz o podzielność licznika. Co 4 znaki dajesz znak nowej linii.

#include <iostream>
  
using namespace std;
  
void wypiszZnak (char znak)
{
    for (int  y=1; y<=16; y++){
         cout << znak;
		 if(y%4 == 0) cout << endl;
		 else << ' ';
    }
}
  
int main()
{
    char c;
    cout << "Podaj znak: ";
    cin >> c;
    wypiszZnak(c);
    return 0;
}

 

komentarz 17 marca 2021 przez Michał Muzyka Pasjonat (24,080 p.)
To rozwiązanie daje taką samą złożoność, nie uzyskuje się dzięki temu żadnej optymalizacji czasowej. Nie ma sensu rozdzielania na pojedynczą pętlę z kwadratowym warunkiem, utrudnia to tylko czytanie kodu. Proszę zauważyć, że dla czytającego kod coś takiego jest tylko utrudnieniem.
komentarz 17 marca 2021 przez SzkolnyAdmin Szeryf (86,360 p.)
Pozwoliłbym się nie zgodzić. Pętla w pętli to spory problem dla początkującego. Nie zamierzałem kwestionować twojego rozwiązania - jest poprawne. A kwestia optymalizacji w dużej mierze zależy od kompilatora. Zresztą w tak małym programie nie jest ona w żadem sposób istotna.
komentarz 17 marca 2021 przez Michał Muzyka Pasjonat (24,080 p.)
kompilator nie wykona tutaj żadnych optymalizacji ponieważ ten kod jest analogiczny, wykonane zostanie 16 wypisań pojedynczego znaku i 16 porównań (tak naprawdę u Pana 32 porównania), 16 inkrementacji oraz 16 skoków pomiędzy blokami pamięci. Jednakże niewielkie ma to znaczenie, ponieważ analizując koszt czasowy programu rozpatrujemy go jako złożoność obliczeniową, w obu przypadkach jest to O(n^2). Chciałem tylko zwrócić uwagę, że raczej w komercyjnym podejściu nie powinniśmy tworzyć takich konstrukcji, ponieważ jedyne co możemy uzyskać to spadek czytelności kodu, a dobrych nawyków powinniśmy uczyć się od początku naszej drogi programistycznej.
Jeżeli chcielibyśmy uzyskać jakąś optymalizacje czasową to moglibyśmy utworzyć bufor, który reprezentowałby cały wiersz. Najpierw wypełnilibyśmy go znakami potem wypisali  cały n krotnie na ekran, wówczas to by dało nam złożoność O(n)
komentarz 17 marca 2021 przez SzkolnyAdmin Szeryf (86,360 p.)
Zauważ, ze pyta początkujący, zatem programistyczna ortodoksja nie jest na miejscu. Otrzymał odpowiedź, a nawet i to mu na teraz wystarczy. My też zakończmy wymianę komentarzy, po od słowa do słowa ...

Miłego wieczoru.
komentarz 17 marca 2021 przez emmail Nowicjusz (160 p.)

 

@SzkolnyAdmin, pętla w pętli była nam bliższa, bo już coś takiego robiliśmy, ale Pański sposób też jest ciekawy. Myślę, że może przydać się na przyszłość :)

Podobne pytania

0 głosów
1 odpowiedź 210 wizyt
pytanie zadane 2 sierpnia 2019 w Rozwój zawodowy, nauka, praca przez luna22 Obywatel (1,420 p.)
0 głosów
1 odpowiedź 310 wizyt
0 głosów
1 odpowiedź 402 wizyt
pytanie zadane 12 marca 2016 w C i C++ przez luparuwka Początkujący (400 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...