[C++] Program dziwnie się zachowuje przy większej zmiennej

0

Witajcie.
Mam nadzieję, że temat umieszczam w prawidłowym dziale (dopiero się zarejestrowałem).

Mój program ma wczytywać dowolną liczbę, a następnie wypisywać wszystkie kombinacje ciągów cyfr, których suma będzie równa tej liczbie.

Namęczyłem się, ale udało się - program działa.

Ale jednak przy większych liczbach (pow 15) przerywa w momencie swoją pracę i dokańcza ją wypisując:

1
1
1
1
1

Wiem, że wielu z Was zrobiłoby ten program lepiej i sprawniej, ale zrobiłem go tak jak jest i potrzebuje tylko pomocy co do tego dlaczego program tak działa...

oto kod programu

#include <iostream>
#include <conio.h>
using namespace std;
int main(int argc, char *argv[]) 
{
	int n,x,i,suma,b,k,c;
	cout<<"Podaj n"<<endl;
	cin>>n;
	cout<<endl;
	i=n;
	k=0;
	
	for (i;i>0;)
		{	
			int tab[i-1];
			c=-1;
			suma=0;
			x=i;
			for (x;x>0;)
				{
				if ((suma+x)<=n)
					{
					c++;
					//cout<<" s="<<suma<<" ";
					tab[c]=x;
					cout<<x<<" ";
					suma=suma+x;
					}
					else					
					x--;
			
			if ((suma==n)and(c<=n-x)and(c!=0)and(tab[1]!=1))
				{
					cout<<endl;
					k++;
					suma=0;
					int a=0;
					
				for (c;c>0;)
					{
						if (tab[c]!=1)
						{							
							for (int d=0;d<c;d++)
								{
								cout<<tab[d]<<" ";
								suma=suma+tab[d];
								a++;
								}
								x=tab[c]-1;
								c=0;
						}
						else 
						c--;
						
				}
				c=-1+a;
				}
				
			}
			cout<<endl;
			i--;
			k++;
		}
		cout<<"Ilosc kominacji "<<k<<endl;
		int wybor;
		cin>>wybor;
	return 0;
}

Dzięki za pomoc ;-)

Pozdrawiam:
mrozo

P.S. Aha i jeszcze coś. Program od zmiennej 12 w góre wypisuje błędną ilość jedynek na samym końcu, też nie wiem dlaczego :/

1

Uruchom to pod debugerem.

0

Używam programu Dec-C++ i uruchamiam odpluskwiacz tak jak radzisz. I nic się nie zmienia :/
A przy okazji jaki program polecasz? Bo może Dev jest jakiś dziwny (ale używam go w szkole) i lepszy jest jakiś inny.

Nie używałem nigdy odpluskwiacza i nie do końca wiem jak się nim posługiwać. Ustawiłem odpluskwianie całego programu. Kiedy się program uruchamia wszystko jest jak poprzednio.

Ale raz wyrzuca komunikaty a raz nie :/

cin=not found in current context
endl=?
1

Uzyj czegoś gdzie debugger działa. Ja bym polecił Eclipse CDT jeśli poradzisz sobie z instalacją...
Debugera trzeba umiec używać! To nie jest coś co ci wykrywa błędy tylko coś co pomaga ci znaleźć błąd. Samo się nic nie dzieje.
Ustaw breakpoint na początku programu a potem wykonuje program step-by-step i analizuj czy wartości zmiennych są takie jakie powinny.

1

To ja polecam Code Blocks (prosty tam gdzie trzeba i zaawansowany, również tam gdzie powinien), a co do debaggera, to najpierw dowiedz się, jak go wykorzystywać i czym on jest, bo mam wrażenie, że myślisz, że to magiczny przycisk usuwający błędy w kodu.

0

OK ściągam Eclipse i zobaczymy jak to będzie śmigać.

A mam jeszcze małe pytanko. Potrzebuje do innego programu sprawdzenie czy zmienna jest równa wybranym literom.
Można jakoś krócej zrobić, żeby sprawdzić czy zmienna należy do zbioru danych liter? Jeśli tak to jak.

Wiem, że można dać if i mnóstwo warunków z "||" ale czy jest jakiś inny sposób?

Pamiętam, że rok temu jak się uczyłem Pascala to tam była taka opcja. Jeśli jest coś takiego to proszę o napisanie tego na jakimś przykładzie (kodem).

Dzięki :D

1

Tablica char'ów + pętla i jazda

1

Mało komu będzie się chciał analizować ten kod. Kod jest nieczytelny bo wszytko siedzi w jednej wielkiej funkcji main.
Poza tym, mam wątpliwości co do opisu twojego problemu, treść sugeruje jedno twój kod zwraca drugie.
Tu masz swój kod lepiej sformatowany z przykładowymi wynikami.

0

Nie czaje wgl. jak działa odpluskwiacz (tzn. wiem do czego służy ale tak jak piszecie - trzeba też go umieć używać). Ściągnąłem zarówno Eclipse i CodeBlocks i ustawiam punkt na początku programu, ale funkcje debuggera są niekatywne :/)

Chyba jakoś muszę sam na to wpaść, chyba że w Dev'ie jakoś na to wpadnę :/

Dzięki wielkie za pomoc i chyba temat będzie do zamknięcia (nie chcę marnować Waszego czasu skoro i tak nie umiem nawet głupiego debuggera używać)

Najciekawsze dla mnie jest to, że wszystko jest ok a w jednym momencie się wali (i nie jest tak, że to jest w np. 30tym wierszu się to wali tylko to zależy od zmiennej :()

Dzięki Wam wszystkim za pomoc i miłego dnia.

0

w codeblocks musisz zrobić projekt. Następnie dodać swój plik do projektu. Wtedy debugger działa.

0
 
int n,x,i,suma,b,k,c;

Do czego są przeznaczone te zmienne? Nazwij je "trafniej", wtedy pomogę.

0

n - liczba którą wprowadzamy.
k - zmienna licząca ilość kombinacji
suma - zmienna do sprawdzania sumy ciągów
reszta to zmienne do pętl for

1

Ten kawałek

for (i;i>0;)
{        
      int tab[i-1];
       c=-1;
       // ...
} 

Zamień na

int * tab= new int [i-1];
for (i;i>0;)
{        
     c=-1;
     // ...
} 

I działa dla większych niż 15, ale analizować mi się tego nie chcę. Swoją drogą nie wiem jak to się mogło kompilować.

  if ((suma==n) && (c<=n-x) && (c!=0) &&(tab[1]!=1)) 
1

Widzę że dopóki nie padnie gotowiec ten temat się nie skończy:

#include <iostream>
using namespace std;

int main() 
  {
   while(true)
     {
      cout<<"Podaj N (0-koniec): ";
      unsigned N;
      if(cin>>N)
        {
         if(!N) break;
         unsigned *tb=(new unsigned[N])-1; // tablica z indeksacją od 1
         for(unsigned i=1;i<N;++i) tb[i]=0;
         tb[N]=1;
         unsigned count=0;
         while(true)
           {
            cout<<(++count)<<":";
            for(unsigned i=1;i<=N;++i) if(tb[i]) cout<<" "<<tb[i]<<'*'<<i;
            cout<<endl;
            unsigned Sum=tb[1],p=1;
            tb[1]=0;
            while((p<=N)&&(!tb[p])) ++p;
            if(p>N) break;
            --tb[p];
            Sum+=p;
            while(--p)
              {
               unsigned add=Sum/p;
               tb[p]=add;
               Sum-=p*add;
              }
           }         
         delete[] (tb+1); // zwolnienie tablicy z indeksacją od 1
         cout<<"Ilosc kombinacji "<<count<<endl;
        }
      else
        {
         cin.clear();
         cout<<"Ma to byc liczba"<<endl;
        }
      while(cin.get()!='\n'){}
     }
   return 0;
  }

http://ideone.com/1T0Utt

1

Jak już dawać gotowca, to takiego co się da czytać.

0

Dziękuje Wam bardzo za pomoc, teraz to wszystko śmiga jak powinno :D

Zmieniłem program tak jak radził witekkq bo to jest mi najbliższe do zrozumienia (nie do końca jeszcze łapie funkcje, mimo że wiem, że dzięki nim program działa szybciej. A chyba lepiej mieć program, który się rozumie, prawda? ;-)

Ale Wasze programy: _13th_Dragon i MarekR22 wezmę żeby przeanalizować co można było zrobić lepiej i szybciej.

Jeśli jeszcze macie chwilkę cierpliwości to nie do końca łapię o co chodzi w tej linijce:

int * tab= new int [i-1];

Uczę się C++ w szkole więc znam tylko podstawy :( A i tak teraz jave zaczynamy, więc reszty będę już musiał się uczyć samodzielnie.

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