- A Föld teraformálásával építene galaktikus birodalmat Elon Musk
- Ilyen beviteli eszközről álmodnak a digitális művészek
- Idővel a képgenerálást is megkapja a PlayStation
- Felhasználóbarát módosítást kaphat az EU-ban a Nintendo Switch 2
- Már fut az Intel grafikus vezérlőin az év egyik legjobban várt címe
Ú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!
- Hitelkártyák használata, hitelkártya visszatérítés
- DVB-T, DVB-S (2), DVB-C eszközök
- AliExpress tapasztalatok
- Xiaomi 17 - még mindig tart
- A Föld teraformálásával építene galaktikus birodalmat Elon Musk
- Íme az új Android Auto!
- OLED TV topic
- Futás, futópályák
- Analóg fényképezés
- EA Sports WRC '23
- További aktív témák...
- Eladó ÚJ - 0 napos OEM WD PC SN740 1TB NVMe SSD (PCIe 4.0)
- Ipad 8 gen 128 GB gyönyörű állapotban, Tactical erős tokkal, fóliával, dobozzal, 10,2" colos kijelző
- Lenovo ThinkPad L14 Gen 2 Ryzen 5 pro 5650U, 16GB RAM, 256-512GB SSD, jó akku, számla, gar
- Ipad 5. gen 128 GB Wifi + Cellular gyönyörű állapotban, asztroszürke, tokkal
- Lenovo X395 Ryzen 5 pro 3500U, 16GB RAM, SSD, jó akku, számla, garancia
- Beszámítás! LENOVO LOQ 15AHP10 FHD Gamer notebook - R7 250 32GB DDR5 1TB SSD RTX 5050 Max-Q 8GB
- Logitech G29 (PS) // Számla // Garancia //
- AKCIÓ! Apple MacBook Pro 14 M4 Max 48GB RAM 1TB SSD notebook garanciával hibátlan működéssel
- Intel Core i3 10105F processzor
- GYÖNYÖRŰ iPhone 12 Mini 64GB Black -1 ÉV GARANCIA - Kártyafüggetlen, MS4167, 94% Akksi
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest


