C++ program ktory pokazuje jak dluga jest liczba/slowo

0

skopiowalem z internetu programik ktory pokauzje mi jak dluga jest jakas liczba

 			int liczba, i=1;
				cout<<"wpisz jakas liczbe:"<<endl;
				cin>>liczba;
			
				do
				{
					i++;
					
				} while (liczba=liczba/10);
				
				cout<<"liczba ma "<<i<<" dlugosci"<<endl;

nie rozumiem co sie dzieje w do...while
dodawaj do zmiennej i jeden wtedy gdy liczba=liczba/10

czyli ze np. wpisujac 1234 bedzie:
dodaj do zmiennej i jeden wtedy gdy 1234=1234/10 (1234=123,4)

moglby mi ktos to wytlumaczyc? bede wdzieczny

0
#include <iostream>
using namespace std;
 
int main()
  {
   for(int i=1;i<=20;++i)
     {
      cout<<i<<": "<<i/10<<endl;
     }
   return 0;
  }

http://ideone.com/zAmmZI

1

Jako iż liczba jest typu int (cakłowitego) po podzieleniu przez zero "ucinana" jest część po przecinku, tak więc 123/10 == 12, tak samo 199/10 == 19. Warunek pętli "usuwa" więc ostatnią cyferkę w liczbie i sprawdza, czy wynik jest różny od zera (fałsz). Kod można bardziej "rozpisać" i przedstawić w ten sposób:

 
                int liczba, i=1;
                cout<<"wpisz jakas liczbe:"<<endl;
                cin>>liczba;
 
                do
                {
                    i++;
                    liczba=liczba/10; 
                } while (liczba!=0);
                
                cout<<"liczba ma "<<i<<" dlugosci"<<endl;
2
             unsigned liczba;
             cout<<"wpisz jakas liczbe:"<<endl;
             cin>>liczba;
             cout<<"liczba ma "<<(liczba?(unsigned)log10(liczba)+1:1)<<" dlugosci"<<endl;
0

ach juz rozumiem, no przeciez 0 daje prawde a wieksze od 0 daje falsz, gzies o tym bylo na poczatku uczenia sie

0

Właśnie na odwrót :). 0 to fałsz, a wszystko inne (lub tylko dodatnie, zależnie od kompilatora) daje prawdę ;). W kodzie, którzy Ci przesłałem jest negacja(jest różne od) - !=, czyli gdy po wykonaniu pętli liczba jest równa 0 - kończy ją, a gdy jest różna od 0 - kontynuuje.

0
Skyler napisał(a):

0 to fałsz, a wszystko inne (lub tylko dodatnie, zależnie od kompilatora) daje prawdę ...

Że co?

0

Mam na uczelni dedykowany kompilator, który zwraca fałsz przy ujemnych, nie pytaj jakim cudem ;_;

0

Nie rozumiem, czyli kompilator niezgody ze standardem podajesz jako przykład braku standardu?

0

Zwracam tylko uwagę, że warto sprawdzić sobie samemu :). Lepiej tak, niż potem się przejechać na kolokwium (sądząc po zaawansowaniu programu raczej nie jest to żaden profesjonalny projekt .).

0

No to trza w takim razie wszystko zacząć sprawdzać, np czy 1+1==2, 1+2==3 itd, na pełne sprawdzanie nie starczy życia,

1
grzechup napisał(a):

ach juz rozumiem, no przeciez 0 daje prawde a wieksze od 0 daje falsz, gzies o tym bylo na poczatku uczenia sie

To prawda (no prawie). Jest to popularny wzorzec w bibliotece standardowej.

Polega to na tym że funkcje w C nie stosują wyjątków, w związku z tym mogą np. zwracać kod błędu w ten sposób:

// wartość zwracana:
// < 0 dla błędu, wartość jest kodem błędu (np. -4499 =  connection refused)
// >0 dla ostrzeżeń (np. 100 = brak danych)
// = 0 jeśli wszystko OK
int checkAllOk(int arg1, int arg2);

Stosowanie w warunku:

if (!checkAllOk(a,b)) {
  printf("Wszystko OK!\n");
}

Przykłady takich funkcji:
fprintf
rename
atexit
fgetpos

Edit: uszczegóławiając - to co opisałem to bardziej rozbudowana wersja, w stdlib zwykle stosuje się po prostu wartości zero (OK) lub nie-zero (kod błędu). Szczegóły w opisach funkcji.

0
_13th_Dragon napisał(a):

No to trza w takim razie wszystko zacząć sprawdzać, np czy 1+1==2, 1+2==3 itd, na pełne sprawdzanie nie starczy życia,

Jeszcze nie spotkałem kompilatora który źle obsługiwał by dodawanie, ale jeżeli taki znajdziesz to bardzo bym prosił byś mnie przed nim ostrzegł :)

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