Hirdetés

Új hozzászólás Aktív témák

  • Fire/SOUL/CD
    félisten

    Hali!

    Így csináltam meg a házim:
    A feladat:[I]Írj programot, amely kiszámítja, hogy két szöveges állomány szóhasználata mennyire hasonló! A hasonlóságot egy 0 és 1 közé eső törtszámmal mérjük. Kiszámítása a következőképpen történik: minden szóra, ami legalább az egyik állományban előfordul, vesszük a szó gyakoriságát az első fájlban és a másodikban. A két gyakoriságot kivonjuk egymásból, majd a különbség abszolútértékét elosztjuk a szó összes előfordulásának számával (gyakoriság_az_első_fájlban + gyakoriság_a_második_fájlban). Ezt a számítást elvégezzük minden szóra. Az szavakra kiszámított értékeket végül összeadjuk, és elosztjuk a két állományban előforduló különböző szavak számával.

    A szöveges állományok nevét a program parancssori argumentumként kapja meg. Az állományok minden sora legfeljebb 1000 karakter hosszú. A sorokban a szavak szóközzel, vesszővel, felkiáltójellel, kérdőjellel és ponttal lehetnek elválasztva. A kis- és nagybetűket azonosként kell kezelni. Az állományok szavai közül csak azokat kell figyelembe venni, amelyek három vagy több karakterből állnak. Minden szó csak az angol ábécé kis- és nagybetűit tartalmazhatja.

    A program a kiszámított értéket írja a kimenetre 5 tizedesjegy pontossággal![/I]

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #define IGAZ 1
    #define HAMIS !IGAZ


    typedef struct listaelem{
    char szo[50];
    struct listaelem *kov;
    }LISTAELEM;

    int abszolut(int a,int b)
    { int c;
    c=(a-b)>=0 ? (a-b):(a-b)*(-1);
    return c;
    }

    int keres(LISTAELEM *fej,char sz[])
    {
    LISTAELEM *seged;
    for(seged=fej;seged;seged=seged->kov)
    {
    if(strcmp(sz,seged->szo)!=0)
    return IGAZ;
    }
    return HAMIS;

    }

    LISTAELEM* beszur(LISTAELEM *fej,char szo[])
    {
    LISTAELEM *ujelem=(LISTAELEM*)malloc(sizeof(LISTAELEM));
    strcpy(ujelem->szo,szo);
    ujelem->kov=NULL;
    if(!fej)
    return ujelem;
    else
    {
    LISTAELEM *seg=fej;
    while(!seg->kov)
    seg=seg->kov;
    seg->kov=ujelem;
    }
    return fej;
    }

    LISTAELEM* feldolgoz(FILE *f,LISTAELEM *fej)
    {
    char betu,sz[50];
    int j,i=0;
    while( (betu=fgetc(f)) !=EOF)
    {
    if(betu==' ' || betu==',' || betu=='!' || betu=='?' || betu=='.' || betu=='\n')
    {
    if(strlen(sz)>2)
    {
    fej=beszur(fej,sz);
    for(j=0;j<50;j++)
    sz[j]=' ';
    i=0;
    }
    }
    else
    {
    sz[i]=tolower(betu);
    i++;
    }
    }
    return fej;
    }

    int gyak(LISTAELEM *fej,char sz[])
    {
    LISTAELEM *seg;
    int gyakorisag=0;
    for(seg=fej;seg;seg=seg->kov)
    {
    if(strcmp(seg->szo,sz)==0)
    gyakorisag++;
    }
    return gyakorisag;
    }

    int main(int argc,char **argv)
    {
    FILE *f1,*f2;
    LISTAELEM *fej1,*fej2,*fej3,*seged;
    int gyak1,gyak2,szavak=0,n;
    float hasonlosag=0,eredm;

    f1=fopen(argv[1],"r");
    f2=fopen(argv[2],"r");
    fej1=feldolgoz(f1,fej1);
    fej2=feldolgoz(f2,fej2);

    for(seged=fej1;seged;seged=seged->kov)
    {
    if((n=keres(fej3,seged->szo))==0)
    {
    gyak1=gyak(fej1,seged->szo);
    gyak2=gyak(fej2,seged->szo);
    hasonlosag+=(abszolut(gyak1,gyak2))/(gyak1+gyak2);
    szavak++;
    }
    }

    for(seged=fej2;seged;seged=seged->kov)
    {
    if((n=keres(fej3,seged->szo))==0)
    {
    gyak1=gyak(fej1,seged->szo);
    gyak2=gyak(fej2,seged->szo);
    hasonlosag+=(abszolut(gyak1,gyak2))/(gyak1+gyak2);
    szavak++;
    }
    }

    eredm=hasonlosag/szavak;
    printf("%.5f\n",eredm);

    return 0;
    }

    De lefordításkor ilyen szegmens hibát ír ki:

    Szegmens hiba
    A debug.out fájlban nyomkövetési információk érhetőek el.
    A teszt_debug.out fájlban a nyomkövetés során előállt kimenet található!
    Érvenytelen memória hivatkozás.

    debug tartalma:
    ==21624== Conditional jump or move depends on uninitialised value(s)
    ==21624== at 0x40079A: feldolgoz (1_feladat.c:57)
    ==21624== by 0x4008C3: main (1_feladat.c:95)
    ==21624==
    ==21624== Conditional jump or move depends on uninitialised value(s)
    ==21624== at 0x4A1CD9E: strcpy (mc_replace_strmem.c:272)
    ==21624== by 0x4006E5: beszur (1_feladat.c:35)
    ==21624== by 0x4007B7: feldolgoz (1_feladat.c:59)
    ==21624== by 0x4008C3: main (1_feladat.c:95)
    ==21624==
    ==21624== Conditional jump or move depends on uninitialised value(s)
    ==21624== at 0x4006F7: beszur (1_feladat.c:37)
    ==21624== by 0x4007B7: feldolgoz (1_feladat.c:59)
    ==21624== by 0x4008C3: main (1_feladat.c:95)
    ==21624==
    ==21624== Invalid read of size 8
    ==21624== at 0x40071D: beszur (1_feladat.c:42)
    ==21624== by 0x4007B7: feldolgoz (1_feladat.c:59)
    ==21624== by 0x4008C3: main (1_feladat.c:95)
    ==21624== Address 0x38 is not stack'd, malloc'd or (recently) free'd
    ==21624==
    ==21624== Process terminating with default action of signal 11 (SIGSEGV)
    ==21624== Access not within mapped region at address 0x38
    ==21624== at 0x40071D: beszur (1_feladat.c:42)
    ==21624== by 0x4007B7: feldolgoz (1_feladat.c:59)
    ==21624== by 0x4008C3: main (1_feladat.c:95)

    Ez meg egy másik házinak a kódja, de itt is ugyanaz a hiba, érvénytelen memória hivatkozás:

    #include <stdio.h>
    #include <stdlib.h>

    typedef struct faelem{
    int adat;
    struct faelem *bal,*jobb;
    }FA;
    typedef struct listaelem{
    int adat;
    struct listaelem *kov;
    }LISTA;


    LISTA* beszur_lista(LISTA *fej,int adat)
    {
    LISTA *ujelem=(LISTA*)malloc(sizeof(LISTA));
    ujelem->adat=adat;
    ujelem->kov=NULL;
    if(!fej)
    return ujelem;
    else
    {
    LISTA *segb=fej;
    while(!segb->kov)
    segb=segb->kov;
    segb->kov=ujelem;
    }
    return fej;
    }



    FA *ujelem(){
    FA *uj = (FA *)malloc(sizeof(FA));

    uj -> bal = NULL;
    uj -> jobb = NULL;
    return uj;
    }


    FA *beszur_fa(FA *gyoker, int adat){
    FA *uj;

    if(gyoker == NULL)
    {
    uj = ujelem();
    uj -> adat = adat;
    gyoker = uj;
    }
    else if(adat <= gyoker -> adat)
    gyoker -> bal =beszur_fa(gyoker -> bal, adat);
    else if(adat > gyoker -> adat)
    gyoker -> jobb =beszur_fa(gyoker -> jobb, adat);
    return gyoker;
    }

    int elemszam(FA *fa)
    {
    return fa ? 1+elemszam(fa->bal)+elemszam(fa->jobb) : 0;
    }

    LISTA* preorder(FA *fa,LISTA *fej1)
    { if(fa)
    {
    fej1=beszur_lista(fej1,fa->adat);
    preorder(fa->bal,fej1);
    preorder(fa->jobb,fej1);
    }
    return fej1;
    }

    LISTA* inorder(FA *fa,LISTA *fej2)
    {
    if(fa)
    {
    inorder(fa->bal,fej2);
    fej2=beszur_lista(fej2,fa->adat);
    inorder(fa->jobb,fej2);
    }
    return fej2;
    }

    int hasonlit(LISTA *fej1,LISTA *fej2)
    {
    LISTA *seged1,*seged2;
    seged1=fej1;
    seged2=fej2;
    while(seged1)
    {
    if(seged1->adat!=seged2->adat)
    goto c;
    seged1=seged1->kov;
    seged2=seged2->kov;
    }
    c:return 1;
    return 0;
    }


    int main(int argc,char **argv)
    {
    int szam,i;
    FILE *f,*ki;
    FA *forras;
    LISTA *in,*pre;
    f=fopen(argv[1],"r");
    ki=fopen(argv[2],"w");
    fscanf(f,"%d\n",&szam);
    forras=beszur_fa(forras,szam);
    while(szam!=EOF)
    {
    fscanf(f,"%d\n",&szam);
    forras=beszur_fa(forras,szam);
    }
    in=inorder(forras,in);
    pre=preorder(forras,pre);

    i=hasonlit(pre,in);
    if(i==1)
    fprintf(ki,"nem\n");
    else fprintf(ki,"igen\n");

    fclose(f);
    fclose(ki);

    return 0;
    }

    A CodeBlocks nem talál hibákat, és az egyik C ismerősöm sem érti, hogy mi a gond... :R

    Hali!

    Mondjuk az nem ártana ha ilyenkor azt is leírnád, hogy milyen fejlesztőkörnyezetet használsz. :K
    Vagy hibás a környezet, vagy olyan kapcsoló(k) vannak beállítva(compiler. linker, stb), amik ezt az eredményt adják. (pl memória modellek)

    Fire.

    UI: csak átfutottam, kipróbálni most nem tudtam, de nem látok bent olyan hibát, ami miatt ilyen "hiba" állna elő, mármint hogy befordul simán(az viszont gyanús hogy nem is lehet futtatni, majd 15-óra után ki tudom próbálni, még az is lehet, hogy kékhalált fog dobni) :K

Új hozzászólás Aktív témák