[c++] zamiana z printf na cout - formatowanie liczb

0

Witam.
Potrzebuję napisać programik w C++, lecz osobiście dobrze znam tylko czysty C - jakoś C++ nigdy mi nie podchodziło.

printf("%02u", d/*jakas liczba*/);

W c++ stosuje się te "nienormalne" cout. Jak powyższą linijkę zamienić na c++(jak już pisać to żeby było poprawnie)?

0

Zostawić jak jest - nikt ci nie każe używać strumieni, printf w C++ też działa.

0

Wiem, wiem....
Ale nie ma odpowiednika w C++?

0

Jest, manipulatory strumienia z <iomanip>, ale są znacznie mniej wygodne niż taki zapis w printf() kiedy chcesz wypisać kilka wartości obok siebie z róznym formatowaniem. Manipulatory są fajne jak wypisujesz dużo ale tak samo sformatowane.

0

Proste:

cout << "Jakis tekst lub cos" << jakaszmiennaczycos;
0
gencom napisał(a)

Ale nie ma odpowiednika w C++?

Jest, nazywa się printf, siedzi w nagłówku cstdio, należy do przestrzeni nazw std, działa identycznie jak printf w ANSI C.

0

@Macron1 przeczytałeś w ogóle o co autor pytał? o_O
Takie coś jak podałeś, czyli liczby minum 2 cyfrowe, dopełnione zerami z lewej strony za pomocą strumienia wygląda tak:

#include <iomanip>
#include <iostream>
using namespace std;

int main()
{
  int zmienna = 9
  cout<<setw(2)<<setfill('0')<<zmienna;
  return 0;
}
0

Super, bardzo dziękuję.
Przyda mi się to do pewnego formatowania, ale też potrzebuje to zastosować tutaj:

float t;// czas w sekundach
/*...*/
cout<<"Minut: "<<(int)(t/60)<<" sekund: "<<(float)((int)(t*10)%600)/10<<endl;

Potrzebuje wyświetlić sekundy w formacie 00 albo (jeśli występuje przecinek) 00.0 (z jedną cyfrą po przecinku), powyższy przykład pewnie nie jest w ogóle zoptymalizowany pod kątem C++ - o poprawę też proszę.
Szukałem jakiś typów czasowych w C++, ale ciężko mi się trochę odnaleźć jak się cały czas siedzi w czystym C.
Dodam jeszcze raz że nie chcę stosować w C++ kodu który stosuje się w C.

0
gencom napisał(a)

Dodam jeszcze raz że nie chcę stosować w C++ kodu który stosuje się w C.

Tja, ale floaty stosujesz? Resztę typów prostych, struktury, funkcje...

0

(float)((int)(t*10)%600)/10

skoro chcesz już w c++ to nie stosuj rzutowania w stylu C tylko static_cast :)

edit:
co do liczb po przecinku w cout znajduje się manipulator "precision" więcej tutaj

0

oczywiście, że tak! Mój błąd przepraszam ;)

0

Tak, tylko jak pogodzić ze sobą te 2 formatowania:

$ cat main.cpp
/* przyklad */
#include <iostream>
#include <iomanip>
using namespace std;

void show(double f){
  cout << setw(2) << setfill('0') << setprecision(1) << f << endl;
}

int main(){
  cout<<fixed;
  show(3.1415);
  show(3);
}
$ g++ main.cpp && ./a.out
3.1  //potrzebuje 03.1
3.0  //potrzebuje 03

Nie chce stosować warunków :-/

//Podziwiam i dziękuje za tak szybkie odpowiedzi :-)

0

No cudów nie ma chłopie. Dajesz setw(2) a chcesz w efekcie uzyskać wynik który ma dlugość 3 i jest dopełniony zerem. Tak samo chcesz wypisać doubla 3.0 jako 3, tyle że ten double NIE WIE że po przecinku ma same 0 i że mógłby sobie to zapisać jako 3.

0
  double pi = 3.1415;
  double x = 3;
  cout << setprecision( 1 );
  cout << fixed;
  cout << setw(4) << setfill('0') << pi << endl;
  cout << setw(4) << setfill('0') <<  x;

spróbuj tego, musisz pamiętać, że z przecinkiem i częścią dziesiętną liczba rzeczywista zajmuje już większy obszar.

0

C jest logiczny C++ podobno cudowny z kilkoma błędami.
Więc ify?

#include <iostream>
#include <iomanip>
using namespace std;

void show(double f){
  if((float)(int)f != f)
    cout << setw(4) << setfill('0') << setprecision(1) << f << endl;
  else
    cout << setw(2) << setfill('0') << (int)f << endl;
}

int main(){
  cout<<fixed;
  show(3.1415);
  show(3);
}
0

pamiętaj, że konstrukcja typu "(int)f" nie jest w stylu c++ gdyż rzutowanie odbywa się za pomocą static_cast< typ >( co )

1 użytkowników online, w tym zalogowanych: 0, gości: 1