Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

DEV C++ 5beta i rekurzija

[es] :: C/C++ programiranje :: DEV C++ 5beta i rekurzija

[ Pregleda: 2598 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

neopravdano_odsutan
Zekoslav Mrkva

Član broj: 77111
Poruke: 21
*.dlp152.bih.net.ba.



Profil

icon DEV C++ 5beta i rekurzija10.12.2005. u 22:51 - pre 223 meseci
Jedan ocajni student bi vas molio za pomoc ako ikako moze. Mislim da nije tesko ali sam ne znam u cemu je problem.Trazio sam po netu pitao prijatelje, profesore,asistente ali svagdje sam naisao na odbijanje.

Naime u cemu je rijec. Imam napisan program u C-u koji racuna NAJVECI ZAJEDNICKI FAKTOR neka dva broja (npr: 8 i 4, imaju najveci zajednicki faktor 4,to jest broj 4 je najveci moguci broj koji dijeli ova dva broja bez ostatka).Jos jedan uslov zadatka je AKO NZF NIJE DJELJIV SA 2 ISPISI UPOZORENJE,AKO JESTE ISPISI GA.

I taj moj code radi na DEV-C++ VERZIJA 4, BORLAND TURBO C 2.01 I BORLAND TURBO C++ 1.01 ali nece da radi na DEV -C++ (4.9.9.2) tj. 5 beta verzija. U toj verziji radimo na faxu i cini se mocan program,ali jednostavno nece da se rekurzivno poziva moja f-ja.Pokusao sam sa DEBUGGER-om da vidim sta se desava ali i on nesto zeza u DEV5, ili ga ne znam pravilno koristiti.
Evo coda:

Code:

#include <stdio.h>
#include <conio.h>

int gcd(int x, int y)
{
 if(x%2!=0 || y%2!=0)
   {
   printf("Ne postoji najmanji zajednicki djelilac djeljiv sa 2");
   return(0);
   }
 else
 {
     if(y==0) 
        return (x);
     else 
        gcd(y,x%y);   /*mjesto rekurzivnog poziva*/
 }
}
main()
{
int a, b, rez;
    printf("Unesite prvi broj ");
    scanf("%d",&a);
    printf("Unesite drugi broj ");
    scanf("%d",&b);
    rez=gcd(a,b);
    if (rez) printf ("nzd = %d",rez);
getch();
}


Ne bi mi bilo krivo da nisam pokusao sve i svasta, ali stvarno sam se trudio i nije mi se isplatio trud. Prilicno iritirajuce.
MOLIM VAS ako nije problem da mi pojasnite u cemu je problem i kako da ga ispravim. Vjerovatno neki file treba skinuti s neta i ubaciti ga negdje u dev folder.
Code je ispravan sigurno jer radi na drugim compiler-ima.
A stari dev c++ 4 mi se ne svidja nikako, pogotovo sto nema debugger-a. A opcije kao sto su trace,add watch itd...dusu su dale za programera. Koji god code da niasm skontao samo sibnem trace add watch i skonta se nakon par prolaza kroz code.
P.S- Koristim winXP professional i dev c++ 4.9.9.2.
HVALA VAM UNAPRIJED.

Snaga je glava koja lovu valja
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: DEV C++ 5beta i rekurzija12.12.2005. u 11:44 - pre 223 meseci
Trebao si napisati sta dobijes kao rezultat za neki par brojeva (a,b), ...
ovako sve mi se cini da te nisam dobro razumeo.
U principu mislim da si zaboravio jedno return. Kad to ispravis dobijau se smisleni rezultati.
Code:
#include <stdio.h>
int gcd(int x, int y){
    if(x%2!=0 || y%2!=0)   {
        printf("Ne postoji najmanji zajednicki djelilac djeljiv sa 2\n");
        return 0;
    }
    else {
        if(y==0)
            return x;
        else 
            return gcd(y,x%y);   // !!!! nestade ti <return>
    }
}

int main(){
    int a, b, rez;
    printf("Unesite prvi broj ");
    scanf("%d",&a);
    printf("Unesite drugi broj ");
    scanf("%d",&b);
    if (rez=gcd(a,b)) printf ("GCD(%d,%d) = %d", a, b, rez);
    getch();
    return 0;
}

Inace zadatak nije vezan za Dev-C++, ni menje ni vise nego za bilo koji C kompajler, pa je naslov poruke pre trebao biti "Najveci zajednicki delilac i rekurzija"

 
Odgovor na temu

neopravdano_odsutan
Zekoslav Mrkva

Član broj: 77111
Poruke: 21
*.dlp302.bih.net.ba.



Profil

icon Re: DEV C++ 5beta i rekurzija13.12.2005. u 23:14 - pre 223 meseci
Kao prvo od sveg srca ti se zelim zahavliti na pomoci koju si pruzio, mislim da nisi ni svjestan koliko mi je znacilo.
U pravu si kad si pomenuo da nisam naveo par testnih podataka. Naime, moj "problematicni" kod kojeg sam naveo i koji nije htjeo da radi, uvijek mi je vracao kao rezultat -1, znaci koja god dva broja da sam unio, uvijek je rezultat bio -1.
(8,4)=-1
(128,16)=-1 .......

Medjutim kada sam stavio return ondje gdje si naglasio, sve je proradilo. Asistent na faxu tvdri kako je code dobar i kako treba da radi,medjutim ni kod koga nije htio da radi, i on je krivio kompajler, da je problem njemu. Ali fakat je radio pod starijim verzijama komapjera, dok kod novog nije htio, pa sam nisam znao u cemu je problem bio. Ko ce ga znati da u jednoj verziji treba a u drugoj ne treba. Ali i asistent je kriv, jer je rekao da se rekurzivna funkcija poziva bez returna. Ali eto, svaka cast legendo, neizmjerno sam ti zahvalan na pomoci.

Hvala jos jednom.....

P.S.- Forum je .... superlativ superlativa.....
Snaga je glava koja lovu valja
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: DEV C++ 5beta i rekurzija14.12.2005. u 09:30 - pre 223 meseci
Dodaj ovo u Command-line opcije C kompajlera: -Wall
i on ce ti iskompajlirati program i uredno prijaviti:
[Warning] control reaches end of non-void function
Sta ce tada biti rezultat funkcije? Mozda je definisano standardom a mozda i nije, nego prepusteno svakom kompajleru da resi kako hoce, ali ovde je u svakom slucaju -1.
Ne znam sta je sa starijim kompajlerima i ranijim C standardima.

Pogledaj malo modifikovanu funkciju gcd, uveo sam pomocnu promenljivu ret:
Code:

01:  int gcd(int x, int y){
02:      int ret;
03:      if(x%2!=0 || y%2!=0)   {
04:          printf("Ne postoji najmanji zajednicki djelilac djeljiv sa 2\n");
05:          //return 0;
06:          ret = 0;
07:      }
08:      else {
09:          if(y==0)
10:              //return x;
11:              ret = x;
12:          else 
13:              //return gcd(y,x%y);
14:              //ret = gcd(y,x%y); // <-- trebalo bi ovako 
15:              gcd(y,x%y);   // !!!! promenljiva <ret> i dalje nije inicijalizovana 
16:                            // i nece biti inicijalizovana ako se ovde izadje iz "if" strukture
17:      }
18:      return ret;
19:  }

U redu 15, f-ja gcd(y,x%y) je implicitno deklarisana i nikom ne predaje svoju vrednost!

Mozda standard dozvoljava da se ne korist return ali ja ga uvek pisem, cak ces negde naci preporuku da se return bez argumenata pise i na kraju void foo()....
... jedno return vise -> glavobolje manje :-)

 
Odgovor na temu

[es] :: C/C++ programiranje :: DEV C++ 5beta i rekurzija

[ Pregleda: 2598 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.