Skocz do zawartości


Zdjęcie

[c++]Formatowanie tekstu


  • Zaloguj się, aby dodać odpowiedź
9 odpowiedzi w tym temacie

#1 Pakrys

Pakrys

    Początkujący

  • 31 postów

Napisano 12 10 2009 - 17:25

Kod:

#include <cstdlib>
#include <iostream>
#include <iomanip>
using namespace std;
int i;
int main(int argc, char *argv[])
{
    
    double x[9];
  char* znaki=" \n";    
  
  for (int i=0 ;i < 3*3;i++)
    cin >> x[i];
  cin.ignore(0x7fff,'\n');
  cout << endl;
  
  cout << setprecision(3) << setiosflags(ios::right | ios::fixed)<< setfill(' ') ;
       
  for(i=0; i < 3*3; i++)
     cout << setw(10) << x[i]<< znaki[(i%3)/(3-1)] ;
       
  cin.get();

    system("PAUSE");
    return EXIT_SUCCESS;
}
Za pomocą tego kodu można wyświetlić tekst ( wpisane liczby) w trzech kolumnach.
Formatowanie wyświetlania znajduje się w tej linijce kodu: cout << setw(10) << x[i]<< znaki[(i%3)/(3-1)] ;
Ten fragment kodu jest dla mnie nie zrozumiały.
Chciałbym poprosić o wytłumaczenie tego kodu, szczególnie chodzi mi o ten fragment kodu: znaki[(i%3)/(3-1)] ;

  • 0

#2 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 20 11 2009 - 21:38

Wprawdzie minął już ponad miesiąc od opublikowania tematu, ale pozwolę sobie napisać odpowiedź na to pytanie, może przyda się innym, początkującym programistom.
instrukcja setw() oznacza taką jakby "rezerwacje" ilości miejsca na ekranie dla wypisanych znaków. Np. setw(10) tworzy "komórkę" wielkości 10 pojedynczych komórkę. Takie jakby scalanie.
natomiast kod znaki[(i%3)/(3-1)]. Pewnie niezrozumiała jest instrukcja i%3 - czyli i modulo 3 (reszta z dzielenia). Następnie ta reszta jest dzielona przez 2.

  • 0

#3 Pakrys

Pakrys

    Początkujący

  • 31 postów

Napisano 23 11 2009 - 13:34

Dziękuję za zajęciem się problemem który poruszyłem. Informacja która została podana ukierunkowała moje myślenie. W tym kodzie jest jakiś trik.
W linijce kodu: char* znaki=" \n"; tworzona jest zmienna wskaźnikowa typu znakowego
i przypisana jest wartość " \n".
W kodzie ASCII nie ma takiego znaku "\n".
Ponadto w linijce kodu: cout << setw(10) << x[a]<< znaki[(a%3)/(3-1)] ;
do tablicy o nazwie znaki wpisywane są indeksy.
Próbowałem za pomocą operatora & uzyskać adresy pamięci i jakie wartości są wpisane do tych komórek pamięci. Niewiele mi to dało.
Sam kod jest sprytnie napisany poznając jego mechanizm można bardzo ładnie formatować wyświetlany tekst.

//nie cytuj posta znajdującego się nad Twoim :))
  • 0

#4 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 23 11 2009 - 19:42

"\n" to jest manipulator, który oznacza przejście do nowej linii. A w jaki sposób probowałeś uzyskać te adresy? Możesz wkleić ten kod?
  • 0

#5 Pakrys

Pakrys

    Początkujący

  • 31 postów

Napisano 23 11 2009 - 19:54

Kod jest bardzo prosty w tym przypadku to:
dla tej linijki char* znaki=" \n";
jest taki dla adresu :cout << &znaki;
a dla wartości: cout << *&znaki;
  • 0

#6 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 23 11 2009 - 20:23

O ile w tej chwili sobie dobrze przypominam, to po pierwsze, zrobiłeś błąd pisząc cout << *&znaki -> po pierwsze, parę słów o wskaźnikach:
*wsk - oznacza wartość, która znajduje się pod adresem będącym wartością wskaźnika wsk
wsk - oznacza adres, czyli wartość wskaźnika wsk
&a - oznacza adres komórki, w której znajduje się zmienna a.

Wnioski możesz teraz sam wyciągnąć :)

Ponadto, nigdzie nie masz zadeklarowanej tablicy "znaki", a w tym programie próbujesz wyciągnąć z poszczególnych "komórek" tablicy znaki jakieś wartości, które nie istnieją.
  • 0

#7 fernandez

fernandez

    150% normy

  • 1 866 postów

Napisano 23 11 2009 - 20:45

nie bardzo zrozumialem o co Ci chodzi z tym kawalkiem kodu i co jest w nim niezrozumiale


cout << setw(10) << x[a]<< znaki[(a%3)/(3-1)];


ten kod odpowiada za wpisanie SPACJI lub ZNAKU_NOWEJ_LINII w odpowiednim miejscu - w tym wypadku za dwoma pierwszymi wypisanymi liczbami jest spacja, za trzecim razem nowa linia


stad ta tablica

znaki = " \n"
  • 0

#8 Pakrys

Pakrys

    Początkujący

  • 31 postów

Napisano 24 11 2009 - 12:41

Do Szanownego Użytkownika "Fernandeza".
Czy zechciałbyś szerzej napisać na temat linijki tego kodu:
cout << setw(10) << x[a]<< znaki[(a%3)/(3-1)];
Kiedy ten kod tworzy spację a kiedy znak nowej linii.

Ps.Pozostałe informacje to pobocze poruszonego zagadnienia.
  • 0

#9 fernandez

fernandez

    150% normy

  • 1 866 postów

Napisano 24 11 2009 - 15:59

ok, wiec tak

x to jest tablica liczb double, ktore maja byc wyswietlane
a jest iteratorem tej tablicy
znaki[2] = " \n" - czyli tablica skaldajaca sie z dwoch znakow: spacji i znaku nowej linii

wykonujac petle for mamy takie sytuacje

dla a=0 => znaki[(0%3)/(3-1)] <=> znaki[0/2] <=> znaki[0], czyli ' ' (spacja)
dla a=1 => znaki[(1%3)/(3-1)] <=> znaki[1/2] <=> znaki[0], czyli ' ' (spacja)
dla a=2 => znaki[(2%3)/(3-1)] <=> znaki[2/2] <=> znaki[1], czyli '\n' (nowa linia)
dla a=3 => znaki[(3%3)/(3-1)] <=> znaki[0/2] <=> znaki[0], czyli ' ' (spacja)

..itd itp

dziwi mnie tylko po co dawac 3-1 skoro mozna wpisac 2
ale podejrzewm, ze kod zostal tak zrobiony zeby potem mozna bylo wiecje kolumn zrobic ale wtedy to sie robi jakas stala na poczatku i jej potem uzywa wlasnie w podobny sposob
  • 0

#10 Pakrys

Pakrys

    Początkujący

  • 31 postów

Napisano 24 11 2009 - 18:37

Dziękuję za zajęcie się moim tematem oraz rzeczowym i wszechstronnym wyjaśnieniem zagadnienia.

  • 0

Zobacz więcej tematów z tagiem: język C++



Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych