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

Łamigłówka zamiany znaków

Object Storage Arubacloud
0 głosów
108 wizyt
pytanie zadane 20 lipca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam !

Program ma za zadanie wyświetlić prostokąt, który będzie miał w sobie kratki. Problem polega na tym, że w momencie umieszczenia "kratki" wprowadziłem warunek jednak nie wiem w jaki sposób zamienić jeden znak na drugi podczas trwania pętle oraz włożenia tam nowej (pętli zawierającej tzw. kratke).

Oto kod do programu:

#include <iostream>

const int gora_dol = 10;
const int boczne = 10;

void rys()
{
        for(int i = 0; i < gora_dol + 2; i++)
                std::cout << "#";
        std::cout << std::endl;

        for(int i = 0; i < boczne; i++)
        {
                if(i == 3 || i == 6)
                        std::cout << "=";
                for(int j=0; j < gora_dol; j++)
                {
                        if(j == 0)
                                std::cout << "#";

                        std::cout << " ";

                        if(j == gora_dol - 1)
                                std::cout << "#";
                }
                std::cout << std::endl;
        }

        for(int i = 0; i < gora_dol + 2; i++)
                std::cout << "#";
        std::cout << std::endl;

}

int main()
{
        rys();
        return 0;
}

Tak wygląda wyście programu (chodzi o zamianę znaku '#' na '=', przez całą linie)

############
#          #
#          #
#          #
=#          #
#          #
#          #
=#          #
#          #
#          #
#          #
############

 

1 odpowiedź

+1 głos
odpowiedź 20 lipca 2018 przez RafalS VIP (122,820 p.)
wybrane 20 lipca 2018 przez Sic
 
Najlepsza

Po pierwsze widze w tym kodzie sporo powtarzanego kodu. Uprośc sobie to taką funkcją:

void print_n_times(char c, unsigned n) {
	for (size_t i = 0; i < n; i++) {
		cout << c;
	}
}

Potem sprawa jest prosta. Pierwszai ostatnia linia jest banalna. A na reszte for z ifem w środku - jesli jestesmy na lini 3 lub 6 wypisz '=' 10 razy, jesli nie to 1x '#' 8x' ' i 1x'#'.

komentarz 20 lipca 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję to pozwoli łatwiej zadbać o unikanie błędów.
komentarz 21 lipca 2018 przez Sic Dyskutant (8,510 p.)

Mam jeszcze jedno pytanie w jaki sposób mogę zamienić '=' na początku i końcu linii aby było "#" ?

#include <iostream>
#include <cstddef>

void print_n(char c, int n)
{
        for (std::size_t i = 0; i < n + 2; i++)
                std::cout << c;
        std::cout << std::endl;

        for(std::size_t i = 0; i < n; i++)
        {
                if(i == 3 || i == 6)
                        for(std::size_t j=0; j < n + 2; j++)
                                std::cout << "=";
                else
                        for(std::size_t k=0; k < n + 1; k++)
                        {
                                if(k == 0)
                                        std::cout << c;
                                std::cout << " ";
                                if(k == n - 1)
                                        std::cout << c;
                        }
                std::cout << std::endl;
        }

        for (std::size_t i = 0; i < n + 2; i++)
                std::cout << c;
        std::cout << std::endl;
}

int main()
{
        print_n('#', 10);
}
############
#          # 
#          # 
#          # 
============
#          # 
#          # 
============
#          # 
#          # 
#          # 
############

 

1
komentarz 21 lipca 2018 przez RafalS VIP (122,820 p.)
                if(i == 3 || i == 6)
                        for(std::size_t j=0; j < n + 2; j++)
                                std::cout << "=";
                std::cout << std::endl;

Teraz wypisujesz n+2 znaków '='. Wypisz po prostu jeden znak '#' n znaków '=' i '#'.

Identycznie jak to zrobiłeś ze spacjami, aczkolwiek Twoje podejście nie do końca mi sie podoba. Po pierwsze jest nieczytelne, po drugie jeśli n wynosiłoby 100000 to dokładnie tyle razy byś sprawdzał czy jesteśmy na krawędzi. Czemu po prostu nie wypisać pojedyńczego znaku '#' potem 99998 spacji i drugi znak '#'. Sprawdzanie w każdym obiegu czy jesteśmy na krawędzi jest bez sensu. Sprawdzanie czy jesteśmy w środku na lini 3 lub 6 jest ok, bo rozbijanie pętli na 3 byłoby jeszcze gorsze niż ten if. Na coś trzeba się zdecydować.

1
komentarz 21 lipca 2018 przez RafalS VIP (122,820 p.)

Tak widzę to ja:

#include <iostream>
using namespace std;

void print_n_times(char c, unsigned n) {
	for (size_t i = 0; i < n; i++) {
		cout << c;
	}
}
int main()
{
	int n = 10, m = 20;
	print_n_times('#', m);
	cout << endl;
	for (size_t i = 0; i < n; i++) {
		if (i == 3 || i == 6) {
			cout << '#';
			print_n_times('=', m-2);
			cout << '#';
		}
		else {
			cout << '#';
			print_n_times(' ', m - 2);
			cout << '#';
		}
		cout << endl;
	}
	print_n_times('#', m);
}

Jeśli chcemy jeszcze zwiększyć czytelność to możesz rozbić to na więcej funkcji:

#include <iostream>
using namespace std;

void print_n_times(char c, unsigned n) {
	for (size_t i = 0; i < n; i++) {
		cout << c;
	}
}

void print_row(int m, char corners, char inside) {
	cout << corners;
	print_n_times(inside, m - 2);
	cout << corners;
	cout << endl;
}

int main()
{
	int n = 10, m = 20;

	print_row(m, '#', '#');
	for (size_t i = 0; i < n; i++) {
		if (i == 3 || i == 6) {
			print_row(m, '#', '=');
		}
		else {
			print_row(m, '#', ' ');
		}
	}
	print_row(m, '#', '#');
}

 

komentarz 22 lipca 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję nie mogłem tego rozgryść ;)

Podobne pytania

0 głosów
2 odpowiedzi 75 wizyt
pytanie zadane 4 grudnia 2023 w SQL, bazy danych przez kordix Gaduła (3,910 p.)
+1 głos
3 odpowiedzi 511 wizyt
pytanie zadane 24 lutego 2021 w Algorytmy przez ania1210 Nowicjusz (200 p.)
0 głosów
2 odpowiedzi 1,147 wizyt
pytanie zadane 28 października 2015 w C i C++ przez marcinRO Początkujący (280 p.)

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 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!

...