Obliczanie silni i pętla

0

Witam, chcę napisałem program, który oblicza silnie i jeśli użytkownik chce to ponownie oblicz daną silnię. Oto co napisałem

#include <iostream>

using namespace std;

int main()
{
   int i=1, d, s=1;
   string t, n, c;
   t="tak";
   n="nie";
   do{
    cout<<"Podaj liczbe do silni: ";
   cin>>d;
   for (i;i<=d;i++)
    {
    s=s*i;
   }
   cout<<"Silnia z "<<d<<" wynosi "<<s<<endl;
   cout<<"Czy chcesz jeszcze raz?";
   cin>>c;
   }while (c==n);
   return 0;
}

 

i niestety nie działa i nie wiem dlaczego.Możliwe, że jest coś nie tak ze stringami bo dopiero je oswajam. Proszę o pomoc.

0

Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
Nie działa dla tego że napisany przez ciebie algorytm zakłada że i=1 i s=1co owszem jest prawdą ale tylko przy pierwszym obliczeniu.

0

Dzięki.

0

Z tego ci widzę, to nie "zerujesz" ( a raczej nie przywracasz zmiennej s wartości 1 i program w następnym liczeniu silni pamięta poprzednią wartość ). W dodatku porównywanie stringów w innych językach może nie przynieść rezultatów, więc odradzałbym korzystanie z tego :P

#include <iostream>

int main() {
	using namespace std;
	char again='t';
	int liczba, silnia;
	
	while(again=='t'){
		silnia=1; //ustawianie zmiennej na 1, aby silnia liczyła się "od początku"
		cout<<"Podaj liczbe: ";
		cin>>liczba;
		for(int i=1; i<=liczba; i++)
			silnia=silnia*i;
			
		cout<<"Silnia: "<<silnia<<endl;
		cout<<"Jeszcze raz? [t/n] ";
		cin>>again;	
	}
	
	
	
	return 0;
}

Tak jak napisał kolega, staraj się formatować kod, aby był czytelny ( wcięcia ).

1

@HipolitZabujca, tobie też by się przydało to i owo podciągnąć:

  1. int liczba - czyżby miała sens silnia z liczby ujemnej?
  2. int silnia - czyżby sama silnia mogła mieć wynik ujemny?
  3. Nie ma potrzeby wprowadzania dodatkowych zmiennych kiedy można obejść się istniejącymi.
  4. Od C99 można deklarować zmienne w dowolnym miejscu, to zwiększa czytelność oraz daje pole do popisu optymalizatorowi. Nieużywanie tego - wg mnie zbrodnia.
  5. Brak zabezpieczenia przed wprowadzeniem liter zamiast liczby.
  6. Zobacz co się będzie dziać na ekranie po wprowadzeniu na prośbę: - "Podaj liczbe: " - następującego ciągu: 1t2t3t4t5t6t7n
    Poniżej przykład bez tych problemów: http://ideone.com/cHHPls
#include <iostream>
using namespace std;
 
int main()
  {
   while(true)
     {
      cout<<"Podaj liczbe (!-koniec): ";
      unsigned val;
      if(cin>>val)
        {
         cout<<"Silnia("<<val<<")=";
         unsigned factor=1;
         while(val>=2) factor*=val--;
         cout<<factor<<';'<<endl;
        }
      else
        {
         cin.clear();
         if(cin.get()=='!') return 0;
         cout<<"Błąd wprowadzania"<<endl;
        }
      while(cin.get()!='\n') {}
     }
  }
0

Nie chodziło mi o wprowadzanie zabezpieczeń przy wczytywaniu liczby ( itp. ) tylko raczej o sposób rozumowania, bo bez tego to nici.
Z unsigned się zgadzam, zwiększamy zakres liczb kosztem znaku, który tutaj i tak zawsze będzie dodatni.
PS Dla początkujacego, Twój kod mógłby być trochę trudny do zrozumienia, nie sądzisz? :) Chodzi mi tylko o samo zrozumienie.

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