Ú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...
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- PlayStation 5
- Elektromos autók - motorok
- Kínai, és egyéb olcsó órák topikja
- Lakáshitel, lakásvásárlás
- Medence topik
- Autós topik
- bb0t: Gyilkos szénhidrátok, avagy hogyan fogytam önsanyargatás nélkül 16 kg-ot
- Spyra: akkus, nagynyomású, automata vízipuska
- Magisk
- GoodSpeed: Windows 11 PRO FPP (Full Packaged Product) - Retail, Box, dobozos
- További aktív témák...
- EDIFIER R1700BTS hangfal pár makulátlan, új állapotban, 2 év hivatalos garanciával, alkalmi áron
- LG OLED55B23LA 2 Év GYÁRI GARANCIA
- Apple iPhone XR 128GB, Kártyafüggetlen, 1 Év Garanciával
- Gamer PC , i7 12700KF , RTX 3080 Ti , 64GB DDR5 , 960GB NVME , 1TB HDD
- Intel PC , i5 8500 , 1660 6GB , 32GB DDR4 , 512GB NVME , 500GB HDD
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen
Cég: Promenade Publishing House Kft.
Város: Budapest