Hirdetés

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

  • blaces

    tag

    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

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