Kedves Lista!
Csatlakoznek Kocsi Zoltanhoz, aki elmagyarazta, hogy miert nem jo a Prim
program. Azert meg egy-ket kiegeszitest is tennek.
On 8 Oct 2000, at 4:43, HIX CODER wrote:
> Felado : Ko'csi Zolta'n
> E-mail : [Australia]
> > #include <stdio.h>
> > #include <stdlib.h>
> >
> > main () {
> > int szam;
> > int eredmeny;
> > printf("Írj be egy számot:");
> > scanf("%d", &szam);
> > eredmeny = prim(&szam);
> > if (eredmeny == 0)
> > printf("A szám prím");
> > else if (eredmeny != 0)
> > printf("A szám nem prím");
> > }
> >
> > prim (szam) {
> > int x, y;
> > div_t div(int x, int y);
> > long int ciklus;
> > long int ertek;
> > int eredmeny;
> > for (ciklus = 1; ciklus <ertek; ciklus++) {
> > ldiv_t ldiv(ciklus, ertek);
> > if (y != 0)
> > eredmeny++;
> > }
> > return eredmeny;
> > }
> >
> > Miert nem megy a program?
>
>
> - a prim( szam ) nem deklaralja a 'szam' tipusat. Ez az ANSI C szerint
> nem legalis es a K&R szerint sem volt az.
Azert van itt meg tobb problema is. Ha nem irja ki az int-et, akkor az meg
nem annyira baj. Az mar igen, hogy a prim meghivasakor &szam-ot ir be, ami
ugyebar a pointer. Tehat a prim fv-ben a szam erteke egy pointer lesz, ami
nem sok jora vezet. Nyugodtan hasznald a prim(szam) hivast. Kevesbe faj.
> - a ciklus terminaciojara az 'ertek' valtozot hasznalod, ami sehol nem
> kap erteket.
>
> - az 'y' valtozot deklaraltad, de sehol nem adsz neki erteket, megis
> az alapjan dontesz az if-ben
>
> - az 'x' valtozot deklaralod de sehol nem hasznalod
>
> - a ldiv_t ldiv( ... ) a ciklusban formalisan egy kulso fuggveny-
> deklaracio, csak szintaktikailag hibas. Gondolom, fuggvenyhivas
> akart lenni, de annak is hibas szintaktikailag.
>
> - nem egeszen vilagos a "div_t div( ..)" deklaracio sem a fuggveny
> elejen, minthogy a stdlib.h ezt amugy is deklaralja, viszont sehol
> nem hasznalod.
Nem tudom mi az a ldiv es div fuggveny. De valahogy ugy tunik, hogy a prim fv-
n belul akarod oket definialni. Ha jol gondolom, akkor nem egy ilyen
figgvenyre mutato pointert akarsz csinalni, mert ebben az esetben nem sok
ertelme lenne. Fv. definicion belul pedig csak a Pascal-ban lehet fv-t
definialni.
> - a main-ben ez a konstrukcio:
> if ( eredmeny == 0 )
> ...
> else if ( eredmeny != 0 )
> ...
> nem hibas, csak tautologia. Ha az elso if-nek az else agaba
> kerultel, akkor nyilvanvalo, hogy az 'eredmeny' nem nulla.
> Egy jo compiler (pl. a gcc is) kioptimalizalja, de akkor is.
Ez nekem is feltunt...
> - a main() -t int main( int argc, char *argv[] ) -nek kellett volna
> deklaralnod (felteszem, hogy nem embedded systemet csinalsz). Te
> implicite int main( void ) -nak deklaraltad, viszont sehol nem
> adsz vissza erteket.
Ez nem problema. En "void main()"-nak szoktam, de tok mindegy. Ugy sem fogod
sehol sem felhasznalni a visszateresi erteket...
> Szerintem szerezd meg Kernighan - Ritchie: A C programozasi nyelv
> konyvenek 2. kiadasat, az egy *nagyon* jo C konyv.
Azt hiszem egyszerubb programokkal kellene kezdened, mert nagyon latszik,
hogy meg a C-nyelv alapjait sem ertetted meg. Nagyon sok hibat vetetel.
Valamint maga az algoritmus sem vilagos, amit meg akarsz valositani (bar
lehet, hogy itt a hiba az en keszulekemben vagyon).
Ha leirod, hogy mit is szeretnel csinalni, akkor elvekengunk rajt'! :-)
Udv From:, a relativ prim
|