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

Wyświetlanie wyniku w kolumnach

Object Storage Arubacloud
0 głosów
1,863 wizyt
pytanie zadane 25 października 2019 w C i C++ przez j4nsk Nowicjusz (160 p.)
otagowane ponownie 25 października 2019 przez j4nsk

Hej, mam problem z zadaniem, które dostałem jako domowe na studiach. Opis problemu jest na zdjęciu. Udało mi się wyświetlić już prawidłowe wyniki w przedziałach, ale mam problem z wyświetlaniem wyników w kolumnach i kompletnie nie wiem już jak kombinować. Próbowałem wielu metod, rozbijałem na trzy przypadki dla różnych przedziałów, wyniki ciągle ukazywały się w błędnej formie. Czy możecie mi pomóc i wskazać co i gdzie mogę napisać aby działało?

 

Problem:

 

Kod: https://pastebin.com/bbviLct6

#include <iostream>

int n,k;
char a; //znaki ascii
int bin[8]; //tablica do liczb binarnych

int d_2_b(int n){ //dec 2 bin
	
	for(int b=0;b<8;b++){
		
		bin[b]=0; //zerowanie tablicy
	}

	for(int b=0;n>0;b++){
		
		bin[b]=n%2; //wypelnianie tablicy
		n=n/2;
	}
	
	for(int b=7;b>=0;b--){
		
		std::cout << bin[b]; //wypisywanie tablicy od konca
	}
}

int main(){

	std::cout << "Podaj dolny zakres (32-127): ";
	std::cin >> n;
	std::cout << "Podaj gorny zakres (32-127): ";
	std::cin >> k;
	std::cout << std::endl;
	
	while(n<32||n>127||n>k||k>127){ //wymaganie poprawnego przedzialu
		
		std::cout << "Podaj dolny zakres (32-127): ";
		std::cin >> n;
		std::cout << "Podaj gorny zakres (32-127): ";
		std::cin >> k;
		std::cout << std::endl;
	}
		
		for(int i=n; i<=k; i++){ //wyswietlanie wartosci w 1 kolumnie
				
				if(i<100){
					
					a=i;
					std::cout << " ";
					d_2_b(i);
					std::cout << "  " << i << "  " << a << "|";
					std::cout << std::endl;	
				}
				
				else{
			
					a=i;
					std::cout << " ";
					d_2_b(i);
					std::cout << "  " << i << " " << a << "|";
					std::cout << std::endl;		
				}
		}

	return 0;
}

 

Dziękuję i pozdrawiam!

komentarz 25 października 2019 przez j4nsk Nowicjusz (160 p.)
przeniesione 25 października 2019 przez j4nsk

Tak powinien wyglądać output:

komentarz 25 października 2019 przez j4nsk Nowicjusz (160 p.)

Tutaj moje próby wyświetlania w kolumnach - niestety nie każdy przedział działa poprawnie.

#include <iostream>

int n,k;
char a;
int bin[8];

int d_2_b(int n){ //dec 2 bin
	
	for(int b=0;b<8;b++){
		
		bin[b]=0; //zerowanie tablicy
	}

	for(int b=0;n>0;b++){
		
		bin[b]=n%2; //wypelnianie tablicy
		n=n/2;
	}
	
	for(int b=7;b>=0;b--){
		
		std::cout << bin[b]; //wypisywanie tablicy od konca
	}
}

int main(){

	std::cout << "Podaj dolny zakres (32-127): ";
	std::cin >> n;
	std::cout << "Podaj gorny zakres (32-127): ";
	std::cin >> k;
	std::cout << std::endl;
	
	while(n<32||n>127||n>k||k>127){ //wymaganie poprawnego przedzialu
		
		std::cout << "Podaj dolny zakres (32-127): ";
		std::cin >> n;
		std::cout << "Podaj gorny zakres (32-127): ";
		std::cin >> k;
		std::cout << std::endl;
	}
	
	if(n>31&&n<64&&k<64&&k>31){
		
		for(int i=n; i<=k; i++){ //wyswietlanie wartosci w 1 kolumnie
				
				a=i;
				std::cout << " ";
				d_2_b(i);
				std::cout << "  " << i << " " << a << "|";
				std::cout << std::endl;
		}
	}
	
	else if(n>31&&n<96&&k<96&&k>31){
		
		for(int i=n; i<=k-32; i++){ //wyswietlanie wartosci w 2 kolumnach
				
				a=i;
				std::cout << " ";
				d_2_b(i);
				std::cout << "  " << i << " " << a << "|" << "  ";
				a=i+32;
				d_2_b(i+32);
				std::cout << "  " << i+32 << " " << a << "|";
				std::cout << std::endl;	
		}
	}
	
	else{
		
		for(int i=n; i<=k-64; i++){ //wyswietlanie wartosci w 3 kolumnach
		
				a=i;
				std::cout << " ";
				d_2_b(i);
				std::cout << "  " << i << " " << a << "|" << "  ";
				a=i+32;
				d_2_b(i+32);
				std::cout << "  " << i+32 << " " << a << "|" << "  ";
				a=i+64;
				d_2_b(i+64);
				std::cout << "  " << i+64 << " " << a << "|";
				std::cout << std::endl;	
		}
	}
	

	return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 25 października 2019 przez niezalogowany
0 głosów
odpowiedź 25 października 2019 przez mokrowski Mędrzec (155,460 p.)

Najpierw poprawnie wyświetl jeden wiersz a później zajmiesz się poskładaniem kolumn:

#include <iostream>
#include <iomanip>
#include <bitset>

int main() {
    for(auto i = 80U; i < 112; ++i) {
        std::cout << std::setw(9) << std::bitset<8>(i)
          << std::setw(4) << i
          << std::setw(2) << static_cast<char>(i)
          << std::setw(2) << '|' << ' ' << '\n';
    }
}

 

komentarz 25 października 2019 przez j4nsk Nowicjusz (160 p.)
No dobrze, rozumiem, ale jak ma mi to pomóc w tym zakresie? To znaczy jeśli użytkownik poda liczby 32 i np. 100 to powinny utworzyć się dwie kolumny i trochę trzeciej. I tu właśnie jest problem - jak napisać to, żeby program wyświetlał i przechodził w kolejne kolumny, i dopiero jak dojdzie do tego k (górnej granicy) to wtedy stop.
komentarz 25 października 2019 przez mokrowski Mędrzec (155,460 p.)

Proponuję byś podzielił program na następujące sekcje (kod ideowy, dodaj nagłówki):

void show_char_info(unsigned i) {
    // To jest funkcja którą proponowałem....
    std::cout << std::setw(9) << std::bitset<8>(i)
      << std::setw(4) << i
      << std::setw(2) << static_cast<char>(i)
      << std::setw(2) << '|' << ' ';
}

void show_ascii(unsigned min_char_value, unsigned max_char_value) {
   // Tu będzie drukowanie kolumnowe... 
   // Podpowiedź: Ilość kolumn jest zależna od (max_char_value - min_char_value) / 32
}

unsigned input_value(std::string_view msg, unsigned min_inclusive, unsigned max_inclusive) {
    unsigned value;
    // Tu napisz ładne wprowadzenie danych wraz z pętlą do momentu aż dane
    // nie będą poprawne.
    return value;
}

int main() {
    unsigned min_value = input_value("Podaj dolny zakres [32, 127]: ", 32, 127);
    unsigned max_value = input_value("Podaj górny zakres [32, 127]: ", 32, 127);
    // Tu dodasz sprawdzenie czy min_value <= max_value
    show_ascii(min_value, max_value);
}

 

komentarz 25 października 2019 przez j4nsk Nowicjusz (160 p.)
#include <iostream>
#include <iomanip>
#include <string>

int bin[8];
int min_value,max_value;

int dec_2_bin(int n){ //dec 2 bin
	
	for(int b=0;b<8;b++){
		
		bin[b]=0; //zerowanie tablicy
	}

	for(int b=0;n>0;b++){
		
		bin[b]=n%2; //wypelnianie tablicy
		n=n/2;
	}
	
	for(int b=7;b>=0;b--){
		
		std::cout << bin[b]; //wypisywanie tablicy od konca
	}
}

void show_char_info(unsigned i) {
    // To jest funkcja którą proponowałem....
    
    std::cout << std::setw(9) << dec_2_bin(i);
    std::cout << std::setw(4) << i
     << std::setw(2) << static_cast<char>(i)
	 << std::setw(2) << '|' << ' ';
}
 
void show_ascii(unsigned min_char_value, unsigned max_char_value) {
   // Tu będzie drukowanie kolumnowe... 
   // Podpowiedź: Ilość kolumn jest zależna od (max_char_value - min_char_value) / 32
   
   for(int i=0;i<32;i++){
   	
   		if((max_char_value - min_char_value + 1) / 32 < = 1){
   			
   			//wyswietlanie max 1 kolumny
   			
		   }
		   
		else if((max_char_value - min_char_value + 1) / 32 < = 2){
			
			//wyswietlanie max 2 kolumn
			
		}
		
		else{
			
			//wyswietlanie max 3 kolumn
			
		}
   }
   
}
 
int main() {
	
	while(min_value<32||min_value>127||min_value>max_value||max_value>127){ //wymaganie poprawnego przedzialu
		
		std::cout << "Podaj dolny zakres (32-127): ";
		std::cin >> min_value;
		std::cout << "Podaj gorny zakres (32-127): ";
		std::cin >> max_value;
		std::cout << std::endl;
	}

    // Tu dodasz sprawdzenie czy min_value <= max_value
    show_ascii(min_value, max_value);
    
    
    
    return 0;
}

Dopisałem parę rzeczy, kod jest niedokończony. Czy idę w dobrym kierunku? Zrezygnowałem też z gotowej funkcji wypisującej liczby w systemie binarnym, gdyż mamy to zrobić sami.

komentarz 25 października 2019 przez mokrowski Mędrzec (155,460 p.)

Kierunek dobry. Funkcja zwracająca postać binarną albo niech nią zwraca albo wypisuje. Jeśli zwraca, to ma sens...

std::cout << std::setw(9) << dec_2_bin(i);

Jeśli nie zwraca, to powyższa linia jest bez sensu.

Podpowiedź, w okolicach 41 linii możesz mieć:

unsigned columns = (max_char_value - min_char_value + 1) / 32;
for(unsigned col = 0; col <= columns; ++col) {
    // Tu sobie policz wartość każdej kolumny i ją wyświetl :)

.... i dopiero po pętli "columns", wyprowadź znak nowej linii...

 

 

komentarz 25 października 2019 przez j4nsk Nowicjusz (160 p.)
Zwraca, gdyż funkcja dec_2_bin to int. Spróbuję pokombinować i wyślę rezultat ;)
komentarz 25 października 2019 przez j4nsk Nowicjusz (160 p.)

Okej, teraz program wyświetla jedną, dwie lub trzy kolumny w zależności od podanych parametrów, ale gdy podam przedział 32-120, to wszystkie trzy kolumny są takie same i mają 88 elementów (a mają mieć maksymalnie po 32 każda). Ponadto nie wiem czym są te liczby przy outpucie po liczbie binarnej. Wszędzie pojawia się ten sam ciąg "4xxxxx....".

 

#include <iostream>
#include <iomanip>

int bin[8];
int min_value,max_value;

int dec_2_bin(int n){ //dec 2 bin
	
	for(int b=0;b<8;b++){
		
		bin[b]=0; //zerowanie tablicy
	}

	for(int b=0;n>0;b++){
		
		bin[b]=n%2; //wypelnianie tablicy
		n=n/2;
	}
	
	for(int b=7;b>=0;b--){
		
		std::cout << bin[b]; //wypisywanie tablicy od konca
	}
}

void show_char_info(unsigned i) {
    // To jest funkcja którą proponowałem....
    
    std::cout << std::setw(9) << dec_2_bin(i);
    std::cout << std::setw(4) << i
     << std::setw(2) << static_cast<char>(i)
	 << std::setw(2) << '|' << ' ';
}
 
void show_ascii(unsigned min_char_value, unsigned max_char_value) {
   // Tu będzie drukowanie kolumnowe... 
   // Podpowiedź: Ilość kolumn jest zależna od (max_char_value - min_char_value) / 32
   
   unsigned columns = (max_char_value - min_char_value + 1) / 32;
	
	for(int i=min_char_value;i<=max_char_value;i++){
	
		for(unsigned col = 0; col <= columns; ++col) {

			show_char_info(i);
		
		}
		std::cout << std::endl;	
	}
}
 
int main() {
	
	while(min_value<32||min_value>127||min_value>max_value||max_value>127){ //wymaganie poprawnego przedzialu
		
		std::cout << "Podaj dolny zakres (32-127): ";
		std::cin >> min_value;
		std::cout << "Podaj gorny zakres (32-127): ";
		std::cin >> max_value;
		std::cout << std::endl;
	}

    show_ascii(min_value, max_value);    
    
    return 0;
}

 

komentarz 25 października 2019 przez mokrowski Mędrzec (155,460 p.)

No i teraz:

void show_ascii(unsigned min_char_value, unsigned max_char_value) {
    unsigned columns = (max_char_value - min_char_value) / max_in_column;
    for(auto i = min_char_value; i < (min_char_value + max_in_column); ++i) {
        for(auto column = 0; column <= columns; ++column) {
            unsigned value = column * max_in_column + i;
            if(value <= max_char_value) {
                show_char_info(value);
            }
        }
        std::cout << '\n';
    }
}

.... i jesteś w domu :-)

Gdzie max_in_column to stała równa 32 :)

komentarz 25 października 2019 przez j4nsk Nowicjusz (160 p.)
Super, działa, teraz tylko w pełni zrozumieć dlaczego :) Dzięki!
komentarz 25 października 2019 przez mokrowski Mędrzec (155,460 p.)
No to analizuj i pytaj :)

Podobne pytania

0 głosów
2 odpowiedzi 1,685 wizyt
pytanie zadane 16 marca 2017 w C i C++ przez Michał Sokołowski Nowicjusz (210 p.)
0 głosów
0 odpowiedzi 1,779 wizyt
0 głosów
4 odpowiedzi 2,514 wizyt
pytanie zadane 20 lipca 2015 w C i C++ przez Decol Użytkownik (560 p.)

92,572 zapytań

141,422 odpowiedzi

319,644 komentarzy

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

...