- Luck Dragon: Asszociációs játék. :)
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- gban: Ingyen kellene, de tegnapra
- No Voice in the Galaxy
- bitpork: MOD Júni 28- Augusztus 2- szombat jelen állás szerint.
- laskr99: Újrakezdem a processzor és videókártya szilícium magok fotózását
- Klaus Duran: 2025 dude
- sziku69: Fűzzük össze a szavakat :)
- sh4d0w: Palpatine - A Terv
- eBay-es kütyük kis pénzért
Új hozzászólás Aktív témák
-
Jester01
veterán
Már majdnem megdícsértelek, hogy milyen ügyesen használod a valgrind-ot.
Az első hiba amit a vg talált, hogy az 57-es sorban nem inicializált változót használsz. Ez konkrétan az strlen(sz) és nyilván azért mert az sz nincs inicializálva. Ráadásul a cikluson belül is csupa szóközzel akarod feltölteni, 0 byteok helyett.
A második az az első folyománya, ha azt javítod, ez is eltűnik.
A harmadik a 37. sorban a main-ben inicializálatlan fej változók miatt van.
A következő a 42. sorban gondolom a fordított while feltétel miatt van.
#1000
-
Hali!
Mondjuk az nem ártana ha ilyenkor azt is leírnád, hogy milyen fejlesztőkörnyezetet használsz.
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)
-
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...
-
Hali!
1. Elméletileg működnie kell(főleg ha a "\\\\target.......... elé teszel egy szóközt
" \\\\target.......2. pont az a dolga, hogy a target nevű gépen futtassa az adott progit....
3. Több gép esetén(LAN vagy ugyanazon Domain esetén) van megoldás, hogy ne kelljen pl 20-szor lefuttatni külön gépnevekkel.
készítesz egy TXT fájlt pl : gepek.txt néven, ebbe a TXT fájba felsorolod azokat a gépeket, amiket szeretnél:
\\gep1
\\gep2
....
\\gepXezután:execl("psexec.exe"," @gepek.txt -i -c d:\\kampi\\map.bat",NULL);
(figyelj a szóközre, itt is ott van)3. a psexec nem ad vissza hibakódot!(bele is vagyon írva)
Ha 0-val tér vissza akkor minden ok, ha nem akkor azt az általa futtatott alkalmazás vagy egyéb adja vissza. Ezek a hibakódok szabványos Windows hibakódok(már ha az alkalmazás amit futattál windows-os)
Ezen hibakódokat itt megtalálhatod: [Windows System Error Codes]Ha van esetleg még kérdésed(és tudok bent segíteni) akkor azt privbe légyszives, mert ez mégis csak C Topic, amiről meg beszélünk az egész más már...
-
kampi_
csendes tag
válasz
Fire/SOUL/CD #993 üzenetére
Hi!
Tehát ha jól értem, akkor elvileg ebben a formában működnie kellene, ugye?
execl("psexec.exe","\\\\target -i -c d:\\kampi\\map.bat",NULL);
Csak az volt a gáz ezzel, hogy a "target" változót nem értelmezte rendesen, mert a "\\target" nevű gépen akarta lefutattni a progit, pedig pont az lenne a lényege, hogy a target az változik. Kiolvas egy gépnevet egy fájlból és azon a gépen lefut a progi, aztán kiolvassa a következőt és megint lefut. Mondjuk azóta variáltam még, csak sajnos legkésőbb hétfőn este tudom majd kipróbálni....
Másik kérdés. Mielőtt ez a rész lefutna, akarok egy olyat, hogy megpingelje az összes gépet ami a fájlban van, mert ha a psexec-et egy olyan gépen akarom futtatni, ami nem elérhető akkor leáll a progi. Ezért szertnék olyat csinálni, hogy előtte megpingelek minden gépet ami a fájlban van, és ha elérhető, akkor kiírja egy fájlba, ha meg nem akkor egy másik fájlba, és így tuti lefutna végig a progi rendesen. A kérdés csak az, hogy hogyan tudom a ping visszatérési értékét vizsgálni?? Nincs erre valamilyen ötletetek, vagy programrészleteteket, ami ha lefutott a ping akkor pl.: visszaad 0-át, ha nem elérhető, akkor 1-et, ha meg valamilyen hiba van akkor 2-vel. Mert így már tudnám kezelni rendesen.
Köszi a segítséget!
-
DJ.Gróf
aktív tag
Sziasztok. Tanulgatom a c++-ot. Honnan tudnák egy ingyenes otthoni használatú borland builderX-et letölteni? Köszönöm
-
Vessel
csendes tag
Üdv nektek,érdeklődni szeretnék,hogy esetleg nincs valami ismerősötök aki vállalná korrepetálásomat c-ből?Szeretném az alapokat elsajátítani,csak hát egyedűl nem megy.Netes tanulós módszert nem alkalmaztam,valaki azt mondja meg lehet tanúlni így is,valaki azt hogy nem.Köszi
-
Hali!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
int error;
error = execl ("c:\\windows\\system32\\mspaint.exe", " d:\\ubul.jpg", NULL);
system("c:\\windows\\system32\\mspaint.exe d:\\ubul.jpg");
return 0;
}Mindkét esetben megnyitom a Paint-et 1 paraméterrel ami egy kép elérése, azaz a Paint elindul és betölti az adott képet automatikusan.
A system-es megoldás nem elegáns és nem is szokták javasolni, de ennek ellenére használható, ha nem fontos hogy a progi hordozható legyen, és tudod hogy csak egy adott környezetben fogod úgyis csak használni a progit.(vagy másképp fogalmazva: ha magánhasználatra készíted a progit)
Ahogy látszik execl esetén csak simán fel kell sorolni az adott paramétereket(ügyelve hogy szóköz legyen közte!), az error változó ha -1, akkor nem sikerült futtatni az adott külső alkalmazást.
Az execl használatához az unistd.h headerfile szükséges.Fire.
-
blaces
tag
Hello!
Tudtok olyan C vagy C++ könyvet ajánlani amelyben rengeteg: Fa, Lista programkód található?
-
kampi_
csendes tag
Sziasztok!
Tudnátok nekem mondani egy függvényt, aminek segítségével C-ben tudok egy külső programot futtatni paraméterekkel?? Én így próbáltam :
execl("psexec.exe","\\\\target -i -c d:\\kampi\\map.bat",NULL);
A target az egy változó, ami mindig egy épp aktuális gépnevet tartalmaz amit fájlból olvas ki, de így nem műkődik sajnos.
Előre is köszönöm a segítséget!
-
doc
nagyúr
ezt eleg durvan tulbonyolitottad
MOD: amit az elejen irsz a cimekrol meg meretekrol abbol egy arva szot sem ertettem
nincs itt semmi magia, hasznalhatsz 6000 elemu tombot is, ugyanugy mukodni fogint main(void)
{
double a[6]={3.4, 1.4, 2.3, 6.8, 6.6, 2.4};
double osszeg; // ezt nullazd le az elejen!
int i;
double z2=0; // ez tokfoloslegesfor(i=0;i<6;i++)
{
z2=a[i]; // ez is
osszeg=osszeg+z2; // ehelyett siman: osszeg += a[i];
z2=0; // ez is}
double atl;
atl=osszeg/6;
printf("az atlaga: %.2f\n",atl);
printf("az osszege: %.2f\n",osszeg);
}tehat mondjuk igy:
int main()
{
double a[]={3.4, 1.4, 2.3, 6.8, 6.6, 2.4};
double osszeg=0;
double atl;
int i;
for(i=0;i<6;i++)
osszeg += a[i];
atl=osszeg/6;
printf("az atlaga: %.2f\n",atl);
printf("az osszege: %.2f\n",osszeg);
} -
Celebro
csendes tag
válasz
Jester01 #985 üzenetére
Amire jutottam az nem sok.. Eddig simán ciklussal próbálgattam de az 6 elemnél nem bír többet a 7. re túlcsordul.Olvasgattam hogy ha cím szerint kezeljük a tömböt akkor kevesebb hely is elég neki, mert ha jól tudom a címnek csak fele annyi bit kell.Ezért gondoltam arra, hogy függvénnyel és címekkel kéne számoltatni, csak még nem jöttem rá a nyitjára.(Sajnos a könyv amiben keresgéltem nem nyújtott használható infókat.) A progi amit eddig alkottam itt van:deh ez csak 6 elemet bír...
int main(void)
{
double a[6]={3.4, 1.4, 2.3, 6.8, 6.6, 2.4};
double osszeg;
int i;
double z2=0;for(i=0;i<6;i++)
{
z2=a[i];
osszeg=osszeg+z2;
z2=0;}
double atl;
atl=osszeg/6;
printf("az atlaga: %.2f\n",atl);
printf("az osszege: %.2f\n",osszeg);system("PAUSE");
}
ui:ha hülyeséget írtam boocccs.. -
doc
nagyúr
a fuggveny fejlece lehet mondjuk:
void szamol(int *tomb, int *osszeg, int *atlag)
es meghivhatod mondjuk igy:
int tombocske[8];
int sum;
int avg;
...
szamol (tombocske, &sum, &avg);a fv belseje szerintem menni fog, ha megsem segitunk
de tenyleg erdemes lenne bemasolni ide a kodot, az sem baj ha rossz, abbol tanulhatsz a legtobbet
-
Celebro
csendes tag
Sziasztok!Most kezdem programozói életem C ben és egy olyan problémába ütköztem amit nem tudok megoldani. A problémá(i)m a következő:
Egy 8 elemű tömb címét szeretném átadni egy függvénynek mutatóval.
Hogy a függvény meghatározza a tömb összegét és átlagát, és adja vissza őket mutatókkal.
Ha valaki tud segítsen LÉCCI és linkelje be nekem a progit! Én már kb 5órája verem a fejem a falba.
Előre is köszi minden segítséget! -
timikee
csendes tag
sziasztok
dev c++ban, windows alatt kéne szervert/klienst programoznom. milyen headereket/libeket kéne belinkelnem?
-
kampi_
csendes tag
Utoljár 4-5 éve programoztam rendesebben, szóval mind a kettő problémát jelent
Bár most eszembe jutott, hogy olyan progit tudok csinálni, ami meghívja a psexec-et és ott paraméteresen átadom neki az épp aktuális gépnevet. Legalábbi remélem, hogy menni fog
Köszi szépen a segítséget
-
-
kampi_
csendes tag
Sziasztok!
Szeretnék csinálni, egy olyan programot, aminek kb ez lenne a működési elve, hogy van egy .txt (pl.
arget.txt) és van egy másik (pl.:what.txt). A target.txt-ben csak gépnevek vannak. Minden gép domainban van. Ha elindítom a progit, akkor a target.txt-ből kiolvassa a gépneveket, és minden gépen lefutattja a what.txt-ben megadott file-szerveren lévő fájlt. Ez így medoldható szerintetek? Mert én csak leginkább olyan megoldást találtam, hogy külön csinálok egy kliens progit, amit minde gépre fel kell tennem, és egy szerver progit, amit meg ugye én vezérelek, hogy mit csináljon éppen a progi. A kérdés az lenne, hogy ahogy én leírtam (nem a kliens-szerver megoldással) megoldható-e valahogyan a progi amit szeretnék, és ha igen akkor egy két ötletet is kérnék, hogy nagyjából miket kellene hozzá használnom.
Előre is ksözi szépen a segítséget!
-
Jester01
veterán
válasz
Sk8erPeter #975 üzenetére
Azért növelgetük egy tetszőleges számig, mert annyi darab pontot teszünk ki. Vagyis a kört 100 részre osztjuk. A teljes kör ugye 2*PI radián, ezért lesz a fi annyi amennyi.
A P futó pont koordinátái nyilvánvalóan azok, amik a setpixel hívásban szerepelnek.
Ha a képpont rajzolás már megvan (a setpixel, vagy bármi ami azzal ekvivalens) akkor a fenti for ciklus kirajzolja a kört, semmi egyebet nem kell csinálni.
-
Davey7
senior tag
válasz
Jester01 #972 üzenetére
ez eléggé bonyolult nekem... beszéltük egy cimborámmal,hogy talán úgy is meg lehetne csinálni,hogy beolvasunk egy sort aztán egy másik fájlba azt elmentjük,aztán abból a fájlból szavanként kiolvasom és úgy végzem el a vizsgálatot.
Hogy lehetne egész mondatot beolvasni EOF-ig?Mert ugye az fgets nem is meri az EOF-ot.
-
Sk8erPeter
nagyúr
válasz
Jester01 #974 üzenetére
Értem, de sajnos egyelőre így sincs elképzelésem, hogy hogyan kéne megcsinálni ezt a feladatot, meg szerintem nem is totál kezdőnek való feladat, de persze lehet, hogy csak én vagyok a béna.
Mondjuk itt ezt sem értem: "double fi = i / 100.0 * 2 * M_PI;" Növelgetjük egészen 99-ig i-t (for(i = 0; i < 100; i++)), de nem tudom, miért.
-
Jester01
veterán
válasz
Sk8erPeter #973 üzenetére
Hát mert elírtam!
Nyilván nem az r megy 0-tól 2PI-ig, mert az állandó, hanem a fi. Uppsz.
Annyi lépésben amennyi pontra szükséged van. Ez is a kör egyenlete, ha behelyettesíted a tiedbe, akkor látszik (a sin^2 fi + cos^2 fi = 1 azonosság alapján)
Tehát pl. így lehetne ezzel kört rajzolni:for(i = 0; i < 100; i++)
{
double fi = i / 100.0 * 2 * M_PI;
setpixel(r * cos(fi) + u, r * sin(fi) + v);
}Ez a lépésszám függvényében lehet, hogy lukacsos lesz kicsit.
Van persze másik módszer is, de az szerintem macerásabb. -
Sk8erPeter
nagyúr
válasz
Jester01 #962 üzenetére
Bocs, de mi az az "r=0..2 PI"?
Elsőre úgy értelmezném, hogy a 2kPi-t akarja jelenteni, ahol k=0,1,2, de ennek a körnél semmi értelme, mert a sugár nem 2kPi.
A kör egyenlete alapján kéne megoldanom a feladatot:
ha C(u,v) a kör középpontja, és P(x,y) a kör egyik pontja, akkor az egyenlet:
CP^2 = r^2 = (x-u)^2 + (y-v)^2De nem igazán tudom, hogy is oldjam meg ez alapján a feladatot.
-
Jester01
veterán
A másoláshoz eleve tudnod kellene hol kezdődik és hol végződik. És ha azt tudod, akkor már nem is kell átmásolni
int next_word(const wchar_t** start, const wchar_t** end)
{
/* az előző szó végétől indulunk */
*start = *end;
/* keressük meg a következő szó elejét */
while(**start != 0 && !iswalnum(**start)) *start += 1;
/* ha a string vége, akkor kész */
if (**start == 0) return 0;
/* keressük meg a szó végét */
*end = *start + 1;
while(iswalnum(**end)) *end += 1;
return 1;
}Az előző példához képest ez most pointeres, de ugyanaz a logika.
-
Davey7
senior tag
válasz
Jester01 #969 üzenetére
de ha ismeretlen mondatot olvas be akkor nem tudom,hogy milyen szavak vannak benne...így hogyan tartom nyílván a szó elejét és végét?
azért kérdeztem,hogy az átmásolás,hogy van,mert még nagyon kezdő vagyok és talán úgy meg tudnám csinálni...
tehát a mondat sztringből valamilyen módon a szavakat átrakom egy másik sztringbe és ott az strlen-el meg tudom mondani a szó hosszát és el tudom minden szóra végezni a vizsgálatot...aztán a kiíratás talán már nem vészes. -
Sk8erPeter
nagyúr
válasz
Jester01 #967 üzenetére
Mi így oldottuk meg az ékezetes karakterek helyes megjelenítését:
char * magyarit(const char * src){
unsigned i;
static char dest[2000];
for(i=0;src[i];i++){
switch(src[i]){
case 'á': dest[i]=160; break;
case 'é': dest[i]=130; break;
case 'í': dest[i]=161; break;
case 'ó': dest[i]=162; break;
case 'ö': dest[i]=148; break;
case 'ő': dest[i]=139; break;
case 'ú': dest[i]=163; break;
case 'ü': dest[i]=129; break;
case 'ű': dest[i]=251; break;
case 'Á': dest[i]=181; break;
case 'É': dest[i]=144; break;
case 'Í': dest[i]=214; break;
case 'Ó': dest[i]=224; break;
case 'Ö': dest[i]=153; break;
case 'Ő': dest[i]=138; break;
case 'Ú': dest[i]=233; break;
case 'Ü': dest[i]=154; break;
case 'Ű': dest[i]=235; break;
default: dest[i]=src[i];
}
}
dest[i]=0;
return dest;
}Aztán printf-nél meg így hivatkozom rá, pl.:
printf(magyarit("Nettó ár: "));
Ez itt nem lenne jó?
-
Jester01
veterán
Ja, ha soronként egy mondat van az jó.
Tulajdonképpen átmásolni felesleges, elég pozíció alapján nézegetni a mondatot. Tehát nyilvántartod a szó elejét és a végét és az alapján ellenőrzöl. Valami ilyesmivel:
int start = 0;
int end;
int found = 0;
while(next_word(&start, &end))
{
if (end - start >= 5 && is_palindrome(start, end))
{
found = 1;
break;
}
}Értelemszerűen a next_word és is_palindrome függvényeket neked kell megírni. Az előbbi sorban visszaadja a szavak kezdő és végpozícióját, az utóbbi pedig megnézi, hogy az adott szó palindróma-e.
-
Davey7
senior tag
válasz
Jester01 #967 üzenetére
a példabemenetben egy sorban egy mondat és a végén van egy pont.
be kell vállalnom,mert beadandó és talán ez annyira nem vészes
Ugye ilyenkor egy sztringbe lesz a mondat, és itt kellene valahogy megoldani,hogy ha 5 betűnél nagyobb egy szó akkor megnézze,hogy palindroma e... úgy gondoltam,hogy valahogy szavanként át kellene másolni egy másik tömbbe,de azt hogyan tudom megoldani?
-
Jester01
veterán
Azért kínálgatják a wchar.h-t, hogy az ékezetes karaktereket helyesen tudd kezelni. Éppen csak azt felejtették el megmondani, hogy milyen kódolásban van a fájl.
Igen, ha mondatonként olvasol be, az jó megoldás lehet. Figyelned kell arra, hogy esetleg nem fér bele a pufferbe, ezért dinamikusan kell méretezni. Vagy, ha nagyon csúnyán akarod, akkor egyszerre be is olvashatod az egész fájlt
Mindenesetre azt kellene tudni, mi határoz meg egy mondatot - erre jó lenne ha a specifikáció kitért volna. Márcsak azért is, mert bizonyos esetkben igen nehéz eldönteni. Például az Apám neve id. Kiss János. az hány mondat is?
Ennek hiányában egyszerű szabályként például azt lehet használni, hogy a mondat vége ott van ahol egy vagy több ., ! vagy ? áll ami után a következő betű nagy. De ezt mindenképp rögzíteni kell a dokumentációban. Összességében ez egy igen rosszul specifikált probléma, szerintem ne vállald el
A másik kérdésre: valamilyen alkalmas adatszerkezetben nyilván kell tartani a szavakat. Ahogy olvasod a bemenetet, a megfelelő szó előfordulásainak számát növeled. Tipikusan erre a hash tábla a célszerű, de mivel C-ben ilyen nincs, ezért például egy láncolt lista vagy egy bináris fa is megteszi. MOD: persze ilyenek sincsenek, de könnyebb csinálni
-
Davey7
senior tag
Adott egy állomány, amely magyar nyelvű mondatokat tartalmaz, minden sorban pontosan egyet. Írj programot, amely egy másik állományba írja az első állomány azon mondatait, amelyeknek van olyan legalább öt karakter hosszúságú szava, amely palindróma. (A wchar.h használata javasolt.)
Nekem már van egy olyan programom,hogy EOF-ig szavakat olvas be és megnézi,hogy palindroma e és aztán ezeket kiírja egy fájlba...
Ezt a feladatot,hogyan kellene a legegyszerűbben megoldani? Én gondoltam arra,hogy egy hosszabb sztringbe beolvasom a mondatot és onnan valahogy(nemtudom,hogy kell) egy másik sztringbe átmásolom a szavakat és ha palindroma akkor kiírom a mondatot.
Mert akkor itt egyszerű lenne az a vizsgálat is,hogy figyelembe vegye azt,hogy legalább 5 betűs legyen a palindroma....Mi van a wchar.h-ban amiért ajánlják?Utánanéztem,de nem esett le...
Másik: több szó közül,hogyan állapítom meg,hogy melyik fordul elő a leggyakrabban?
-
bkgb
csendes tag
Sziasztok! Egy feladatban kérném a segítségeteket:
Billentyűzetről megadunk egy teljesen zárójelezett kifejezést, amely csak egyetlen betűből álló azonosítójú változókat és a +, -, *, / kétoperandusú operátorokat tartalmazhatja a zárójeleken kívül. Írjon programot, amely beolvassa a kifejezést, és ha az szintaktikusan helyes, akkor felépíti a hozzátartozó bináris fát, ha pedig hibás, akkor képernyőre írja azt a részkifejezést, amely még hibátlan volt, és ezután megjelöli a hiba okát! Feltesszük, hogy redundáns zárójelek nincsenek. Írjon hozzá egy eljárást is, amely a szintaktikusan helyes kifejezést képernyőre írja és megjelöli azt az operátort, amely utoljára lesz végrehajtva a kifejezés kiértékelésénél!
Előre is köszönettel: bkgb. -
doc
nagyúr
válasz
Sk8erPeter #961 üzenetére
tulajdonkeppen nem is kell kulon fuggveny, ha van egy ketdimenzios tombod, mondjuk char screen[80][25]; akkor ebbe irogathatsz, mondjuk screen[5][9]='X' az (5;9) koordinatan "kigyujt egy pixelt"
ha a rajzolas elott feltoltod sima space-ekkel, akkor mas dolgod nem is lesz, mint megcsinalni a "rajzolo" fuggvenyeket, amik a screen[x][y] elemet irva 'rajzolnak'
a vegen meg egy ciklussal siman kiiratni a tombot -
Jester01
veterán
válasz
Sk8erPeter #959 üzenetére
Persze, hogy nem tanultál a setpixel függvényről, azt neked kellene megírni
Induláshoz: a setpixelnek semmi más dolga nincs, mint a megfelelő tömbelembe egy X-et tenni. Kört legegyszerűbb az x = r cos fi, y = r sin fi, r=0..2 PI paraméteres egyenletből csinálni, téglalapot meg simán a négy egyenesből.
Az egészet nem fogom megírni helyetted, de ha elakadsz valahol akkor segítek.
MOD: de lassú vagyok
-
doc
nagyúr
válasz
Sk8erPeter #959 üzenetére
Jester pont errol beszelt
tehat a setpixel fv-t neked kell megcsinalni, ez annyit tesz majd hogy a megfelelo tombelemet pl. space-rol X-re allitja
kezdd a teglalappal, az egyszeru -
Sk8erPeter
nagyúr
válasz
Jester01 #958 üzenetére
Lehet, hogy triviális, csak nem számomra.
Nem tanultunk setpixel függvényről, ami azt jelenti, hogy jelen esetben nem is kéne használni, hanem csak olyan alap függvényekkel és utasításokkal kellene megoldani, amiket az elején tanul az ember, kb. printf, scanf, for és (do-)while ciklusok, if/else, tömbök meg hasonlók szintjén, szóval tényleg nagyon amatőr módon, meg olyan headereket include-olva, mint az stdio.h, string.h, stdlib.h, esetleg math.h, vagy ha nagyon kell, a kevésbé független conio.h, stb...
Ilyen megoldás elképzelhető?Egyébként köszi, hogy ilyen gyorsan válaszoltál!
-
Jester01
veterán
válasz
Sk8erPeter #957 üzenetére
A platformfüggetlen megoldás az lenne, hogy csinálsz egy tömböt a memóriában ami a rajzfelületed. Implementálsz egy csoda setpixel függvényt ami kitesz egy képpontot ebben a tömbben. A rajzolás végén pedig sorban végigmész a tömbön és kiteszed a képernyőre. Azért kell ilyen körülményesen, hogy elkerüljük a kurzorpozícionálás problémáját.
Innentől kezdve a kör és a téglalapok rajzolása már triviális. -
Sk8erPeter
nagyúr
Valószínű elég láma kérdés, de kezdő vagyok C-ben, két feladatom van:
1.) Kör egyenlete alapján karakteresen kirajzolni egy kört (pl. mittudomén, X-ekkel) (persze nyilván nem lesz egy szép kör, de nem baj)
2.) Mondjuk 5 db egymásban elhelyezkedő téglalapot kirajzolni szintén karakteresen (szintén mondjuk X-ekkel), lehetőleg rekurzívan (de nem rekurzív megoldás is jöhet)
Most gyorsan lerajzoltam Paint-ben, valami ilyesmire gondolok:
Csak a téglalap oldalai X-ekkel kirajzolva.
De ha sima négyzettel jóval egyszerűbb, akkor akár az is jó.Ilyen tök alap (ANSI) C utasításokra gondoljatok, semmi komplikált, ezekkel kellene tudni megoldani a feladatot.
Előre is köszönöm!
-
Dirty_Pio
csendes tag
Hihetetlen de mindig az ilyen huesegeken akadok fent: szoval van egy file es be kene olvasni belole par adatot, az elso sorban egy lebegopontos valtozo(k) van es egy egesz tipusu(n) szunettel elvalasztva. N a kovetkezo ket sorban tallahato elemek szamat adja meg. A kovetkezo sorban n darab lebegopontos valtozo van es az azt koveto sorban n darab egesz. a kodom igy nez ki:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *f;
int n,i;
float k;
if ( !(f=fopen("thief.in","r")) ){
printf("error input file");
exit (1);
}
fscanf(f,"%f %d",&k,&n);
int v[n];
float d[n];
for (i=0;i<n;i++)
{
fsncaf(f,"%d",&v[i]);
printf("%d ",v[i]);
}
for (i=0;i<n;i++)
{
fsncaf(f,"%f",&d[i]);
printf("%f ",d[i]);
}
close(f);
return 0;
}A program nem, a kovetkezo errorra hivatkozva: [Linker error] undefined reference to'fscanf'. Ha jo tudom az fscanf a stdio.h header filebe van definialva szoval kene menjen nem?
-
mm779
tag
Most arra lenne szükségem, hogy egy dinamikusan foglalt 3D-s tömböt át kell adnom egy függvénynek és ott feltölteni. C++ -ban ezt hogy tudom megoldani?
2D -re:
void fv(char **t, .... );
void main()
{
...
char **t = new char*[sor];
...
}
void fv(char **t, ...)
{
for(int i = 0, i < sor, i++) t[i] = new char[oszlop];
....
}3D-re ez hogy van? (vagy úgy általában 2-nél több dimenziós tömb esetén)
-
mm779
tag
Most arra lenne szükségem, hogy egy dinamikusan foglalt 3D-s tömböt át kell adnom egy függvénynek és ott feltölteni. C++ -ban ezt hogy tudom megoldani?
2D -re:
void main()
{
...
char **t = new char*[sor]; -
mm779
tag
Hali.
Gyors segítség kellene éppen házit írok.Hogyan tudok átadni többdimenziós tömböt függvénynek cím(referencia) szerint C++ -ban?
(ezt a többdimenziós tömböt fel szeretném tölteni adatokkal a függvényben)A feltöltött tömböt ki is szeretném íratni cout << -al. Ez megoldható alapból, vagy át kell definiálni a << operátort ?
ui: bocsi, hogy c++ -ból kérdezek, de talán ugyan így működik c-ben is.
-
Dirty_Pio
csendes tag
Sziasztok, mi itt a baj, a file ugy nez, ki, hogy az elso sorban a sorok(oszlopok) szama van es a tobbiben emg szunettel elvalasztva a matrix elemei.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *f;
int n,i,j;
if ( !(f=fopen("input.in","r")) ) {
printf("no input file found");
exit (1);
}
fscanf(f,"%d",&n);
int x[n][n];
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
fscanf(f,"%d",x[i][j]);
//fgetc(f); - ez kell-e az enter beolvasasara? Ha hagyom ugyse megy szoval ki kene segitsetek.
}
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
printf("%3d",x[i][j]);
printf("\n");
}
close(f);
system("pause");
return 0;
} -
Dirty_Pio
csendes tag
válasz
Jester01 #943 üzenetére
Szoval ha ki szeretned szamitani az Euler-fele szam egyik x-ik hatvanyat( e^x -t ), akkor az a dolgod, hogy veszed a Taylor fele felbontasat a szamnak, ami lenyegebe a megoldas: e^x=1+e^1/1!+e^2/2!+e^3/3!+... egeszen egy megfeleloen nagy szamig. Es magyarazas kozbe ra is jottem mi is a problema, azaz en nem valasztottam eleg nagy szamot azaz enm eleg pontos az osszegem, mivel az elso x db szamot vettem igy ha mondjuk az e^4-t szeretnem kiszamolni csak az osszeg elso 4 tagjat veszem, es a kovetkezo szamok nem eleg kicsik ahhoz, hogy lehanyagolhato legyen. A kodban a kovetkezo javitasokat eszkozoltem :
#include <stdio.h>
int ex(int n, int x)
{
if (n>0) return x*ex(n-1,x);
else return 1;
}
int fact(int n)
{
if (n>0) return n*fact(n-1);
else return 1;
}
float xex(int n, int x)
{
float q;
if (n>0) {q=(float)ex(n,x)/fact(n);
// printf("%f \n",q);
return q+xex(n-1,x);
}
-->>else return 0;<<-- mivel igy ketszer szamolna a 0 faktorialist h
}
int main(void)
{
int x,n;
scanf("%d",&x);
->>printf("%f",xex(32,x)); <<- ennyit bit meg a float vagy a memoria... ha nagyobb pontossaggal probalkozok akkor errort kapok. Mondjuk igy sem olyan pontos a szamitas, mint amilyent a google mutat, de azt hiszem nincs mar mas hiba. Ha ti talaltok szoljatok!
system("pause");
return 0;
} -
Dirty_Pio
csendes tag
Sziasztok! Ki kellene szamolnom az Euler fele szam adott hatvanyat. Rekurzioval oldottam meg a dolgot:
#include <stdio.h>
int ex(int n, int x)
{
if (n>0) return x*ex(n-1,x);
else return 1;
}
int fact(int n)
{
if (n>0) return n*fact(n-1);
else return 1;
}
float xex(int n, int x)
{
float q;
if (n>0) {q=(float)ex(n,x)/fact(n);
printf("%f \n",q);
return q+xex(n-1,x);
}
else return 1;
}
int main(void)
{
int x,n;
scanf("%d",&x);
printf("%f",xex(x,x));
system("pause");
return 0;
}Amint latjatok, a Taylor polinom ahsznalataval probaltam megoldani a dolgot, de az eredmeny hibas. Tudnatok segiteni?
-
cellpeti
nagyúr
Sziasztok!
Kellene nekem egy kis segítség!
Ez a feladat,nem teljesen világos:/* ROMAI.C */
#include <stdio.h>
#include <conio.h>
main()
{
int x,y;
y=1;
printf("\nR˘mai sz mok (1..2000):\n");
printf("b rmely billenty– le�t‚se sz�ks‚ges\n");
do {
x=y;
printf("%4d : ",x);
while (x>=1000){ printf("M"); x=x-1000;}
if( x>=900) { printf("CM"); x=x-900; }
if( x>=500) { printf("D"); x=x-500; }
if( x>=400) { printf("CD"); x=x-400; }
while (x>=100){ printf("C"); x=x-100;}
if( x>=90) { printf("XC"); x=x-90; }
if( x>=50) { printf("L"); x=x-50; }
if( x>=40) { printf("XL"); x=x-40; }
while (x>=10){ printf("X"); x=x-10;}
if( x>=9) { printf("IX"); x=x-9; }
if( x>=5) { printf("V"); x=x-5; }
if( x>=4) { printf("IV"); x=x-4; }
while (x>=1){ printf("I"); x=x-1;}
printf("\n");
if( y == 40) getch();
if( y == 100) getch();
if(y<20) y+=1;
else
if(y<100) y+=10;
else y+=100;
}
while (y <=2000);
}
� -
cellpeti
nagyúr
Sziasztok!
ComputerBooks: Programozzunk C nyelven című könyv CD mellékletét keresem még mindig!
-
Jester01
veterán
-
blaces
tag
-
Jester01
veterán
Na hát a baj az, hogy a második szám összes jegyét végigszorozza nullával, és ezért lesz annyi nullád. Ha más probléma nincs, akkor egyszerűen speciális esetként lehet kezelni ha bármelyik szám 0, és simán 0-t írni ki.
Egyébként én személy szerint inkább úgy csinálnám, hogy egyáltalán nem törődnék a nullákkal csak a legvégén a kiírásnál szépen elhagynám őket. A szorzást abszolúte nem zavarja, ugye, csak kicsit tovább tart.
-
blaces
tag
Hello!
Ismét egy feladathoz kéne segítség.
A feladat két hosszú egész szám összeszorzása (olyannyira hosszú, hogy a long double-kbe se ment bele, ezért stringeztem) 3 napig tartott az összehegesztése...Feladat: Írj programot, amely két hosszú egész számot szoroz össze! Csak pozitív számok fordulnak elő a bemeneten, viszont ezek tetszőlegesen sok 0-val kezdődhetnek. Egy szám legfeljebb 100 számjegyből áll. A két szám két egymást követő sorban helyezkedik el. A program kimenetén nem lehetnek vezető nullák!
Bemenet: Kimenet:
2. eset:
0000789675 19375465800
24536
3. eset:
0000000000000000000000000000000000000000000000000000 0.
35363567#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NUMBER 200
int toInt(char ch) {
return (ch - '0');
}
char toChar(int num) {
return (num + '0');
}
void eraseNewLine(char* str) {
size_t len;
len = strlen(str);
if (len > 0 && str[len-1] == '\n') {
str[len-1] = '\0';
}
}
void eraseNulls(char* str) {
unsigned int count = 0;
size_t i = 0;
size_t len;
char c;
len = strlen(str);
c = str[0];
while (c != '\0') {
c = str[i];
i++;
if (c == '0') {
count++;
} else {
break;
}
}
if (count == len) {
str[0] = '0';
str[1] = '\0';
} else if (count > 0) {
memcpy(str, str+count, (len-count+1));
}
}
void addNulls(int num, char* solution) {
size_t len;
unsigned int i;
len = strlen(solution);
if (num > 0) {
for (i = 0; i < num; i++) {
solution[len+i] = '0';
}
solution[i+len] = '\0';
}
}
void changeStr(char* s1, char* s2) {
char temp[2*MAX_NUMBER];
size_t l1;
size_t l2;
l1 = strlen(s1);
l2 = strlen(s2);
memcpy(temp, s1, l1+1);
memcpy(s1, s2, l2+1);
memcpy(s2, temp, l1+1);
}
void multiplyWithOneChar(char x, char* y, char* solution) {
unsigned int xv = toInt(x);
unsigned int yi;
unsigned int tempi;
unsigned int carry = 0;
char temp[2*MAX_NUMBER];
unsigned int i;
size_t len;
len = strlen(y);
for (i = 0; i < len; i++) {
yi = toInt(y[len-i-1]);
tempi = yi * xv + carry;
if (tempi > 9) {
carry = tempi / 10;
yi = tempi % 10;
} else {
carry = 0;
yi = tempi;
}
temp[i] = toChar(yi);
}
if (carry > 0) {
temp[i] = toChar(carry);
temp[i+1] = '\0';
} else {
temp[i] = '\0';
}
len = strlen(temp);
for (i = 0; i < len; i++) {
solution[i] = temp[len-i-1];
}
solution[i] = '\0';
}
void add(char* y, char* solution) { // solution = solution + y;
unsigned int yi;
unsigned int si;
unsigned int tempi;
unsigned int carry = 0;
char temp[2*MAX_NUMBER];
unsigned int i;
size_t len;
size_t lens;
len = strlen(y);
lens = strlen(solution);
if (lens > len) {
changeStr(y, solution);
len = strlen(y);
lens = strlen(solution);
}
for (i = 0; i < len; i++) {
yi = toInt(y[len-i-1]);
if (i < lens) {
si = toInt(solution[lens-i-1]);
} else {
si = 0;
}
tempi = yi + si + carry;
if (tempi > 9) {
carry = tempi / 10;
yi = tempi % 10;
} else {
carry = 0;
yi = tempi;
}
temp[i] = toChar(yi);
}
if (carry > 0) {
temp[i] = toChar(carry);
temp[i+1] = '\0';
} else {
temp[i] = '\0';
}
len = strlen(temp);
for (i = 0; i < len; i++) {
solution[i] = temp[len-i-1];
}
solution[i] = '\0';
}
void multiply(char* x, char* y, char* solution) {
size_t len;
unsigned int i;
char temp[2*MAX_NUMBER];
eraseNewLine(x);
eraseNewLine(y);
eraseNulls(x);
eraseNulls(y);
solution[0] = '0';
solution[1] = '\0';
len = strlen(y);
for (i = 0; i < len; i++) {
multiplyWithOneChar(y[len-i-1], x, temp);
addNulls(i, temp);
add(temp, solution);
}
}
int main() {
char first[MAX_NUMBER];
char second[MAX_NUMBER];
char solution[2*MAX_NUMBER];
fgets(first, MAX_NUMBER, stdin);
fgets(second, MAX_NUMBER, stdin);
multiply(first, second, solution);
printf("%s\n", solution);
return 0;
}és a második esett az ahol, a második számjegyig végig adja ki a nullákat, az elsőre(ezt nem írtam fentebb) és másodikra jó!
-
cellpeti
nagyúr
Esetleg erre valaki?
-
Latency
senior tag
Üdv.
Parancssori paraméterekkel kapcsolatban kellene nekem egy kis segítség. Meg kellene keresni a paraméterek között egy karakter sorozatot, de nekem sehogy sem sikerül.
for (i=1;i<=ArgDb;i++)
{
if (ArgTmb[i]=="-h")
{
//csinál valamit
}
}Na most ez nekem sosem lép be az if-be. Mi lehet ezzel a probléma?
Kösz a segítséget.
-
tilde
csendes tag
Hello
Én csak C ben tudok programozni, de felhasználtam a programomban a c++ -ból is dolgokat mivel UNICODE karakterekkel kell dolgoznom(magyar ékezetes betűk). Amit felhasználtam az a wchar_t változó, ebbe olvastam be a szövegfájlomat, majd kis átalakítás után vissza ki is írtam fájlba, ez működött is, addig amíg nem kellett a switch case -ében UNICODE karakterra keresni. Ebben kérnék segítséget, hogy felismerje a case az UNICODE karaktereket is.
Feltettem a forráskódomat, a link lenn van, a fő forrásfájl a makesampa.c++, egyébként linux alatt a g++ nevű fordítóval fordítottam. Elég sok a forráskód, még nics kész, de már működik , egyébként a case -el az összes magyar betűre szeretnék rákeresni.
http://trioda.extra.hu/ideir/bc/bc.html
Ne tévesszen meg a c++ kiterjesztés, a program alapjában véve C program, csak a wchar_t miatt kell g++ -al kompilálnom. Hallottam, hogy a C is tudja ezt a változótípust kezelni, de be kell hozza kapcsolni valamilyen könyvtárat.
Bármilyen megoldást elfogadok, nekem csak az kell, hogy át tudjam alakítani a programomat, UNICODE karakterek kezelésére.
Előre is köszönöm a válaszokat.
-
cellpeti
nagyúr
Sziasztok!
Nekem egy CD kellene a "Programozzunk C nyelven"-hez van egy CD amin feladatok és magyarázatok vannak és nekem kellenne az a CD.
Nem tudja valaki,hogy honnan lehet letölteni?
-
amargo
addikt
Na de ha megtaláltad, akkor miért nem elég neked csak egy példa a brute force algo
Itt van egy olyan rész, hogy The C code:void BF(char *x, int m, char *y, int n) {
int i, j;
/* Searching */
for (j = 0; j <= n - m; ++j) {
for (i = 0; i < m && x[i] == y[i + j]; ++i);
if (i >= m)
OUTPUT(j);
}
}Ezt most betudom annak, hogy fáradt és megszeppent vagy, én is szoktam ilyen lenni. De legközelebb, ha konkrét linkeket kapsz, nézd is meg.
-
[HUN]Zolee
őstag
Hát fapados megoldásként, feltolod az adott sort egy tömbbe, és elkezded olvasni az elejéről és figyeled hogy mikor jön "B" ha talált, akkor megnézed hogy az utána lévő 2 karakter "U" és "G" ha igen akkor a ciklusváltozódon léptetsz hogy pont kihagyja , ha nem akkor meg nem csinálsz semmit és kiírod .
-
Davey7
senior tag
Van újabb feladatsor. Az első és a harmadik feladatot ahogy nézegettem mintaillesztéssel lehetne megcsinálni...
De azt,hogyan tudom használni? Nincs erre valami kész C algoritmus? Mert nem találtam a goggle-ben.
-
cellpeti
nagyúr
Sziasztok!Szeretnék írni egy olyan progit amely 90 szám közül(1-90) véletlen adjon ki 5 számot!
Ha lehet 2x ne szerepeljen egy generálásba ugyanaz a szám! -
blaces
tag
válasz
Jester01 #910 üzenetére
Igen a ciklus gyorsabb, az valóban nem jó neki. A 2 for ciklus megengedett...
#include <stdio.h>
int main(){
int terfog;
int i, j, k;
int teglatestek=0;
/*int rovidebb;*/
scanf("%d", &terfog);
/*rovidebb=terfog/2;*/
for(i=1; i<=terfog/i; i++){
if (!(terfog%i)){
for(j=i; j<=terfog/j; j++){
if (!(terfog%j)){
k=terfog/(i*j);
if(k>=j)
teglatestek++;
}
}
}
}
printf("%d\n", teglatestek);
return 0;
}Na így tudtam rövidíteni (a tegnapi fórumozásból így tudtam kivenni.), de most nem tudom, hogy hol a hiba, a példa esetekből a 254-re 3-t ad, holott 2-öt kéne adnia, a többire annyit ad amennyit illik neki.
-
Jester01
veterán
Itt van egy ciklussal ... van helyette viszont rekurzió
(a ciklus gyorsabb)int factor(int x, int start, int depth)
{
int count = 0;
int max = sqrt(x);
int i;
for(i = start; i <= max; i++)
{
div_t q = div(x, i);
if (q.rem == 0)
{
count += (depth > 1) ? factor(q.quot, i, depth - 1) : 1;
}
}
return count;
}A feladat eredményét a factor(terfogat, 1, 3) adja.
Ez az én gépemen (2.2GHz) kevesebb mint 5ms alatt lefut bármit is adtam be neki eddig. Na jó, 2 milliárdra már 12ms -
blaces
tag
válasz
Jester01 #908 üzenetére
konkrétan mondta a gyakvezér, hogy a 3 ciklus valami mást kell..., hogy a program 5 másodpercen belül legyen... (vagy millisecundum...).
Rákérdezek mélben a gyakvezérnél, és még alszok rá egyet, holnap éjfélig van a beadási határidő, hátha eszembe jut valami okosság álomközben.a primtényezős felbontást meglestem. A wikipédián talált kóddal ellenőriztem le, a 99 kivételével mindegyikre annyi prím számot adott le amennyi a példában a kimenten szerepel.
"Ha osztója, akkor gyorsan le is kell osztani és belső ciklusban már csak ezt felbontani."
Ez hogy nézz ki egy példa kódban? if (terfogat%i==0) eddig oké a további részt nem tudom megvalósítani -
Jester01
veterán
Hirtelen csak a prímtényezőkre bontás jut eszembe mint alternatíva.
MOD: ha konkrétan nem mondták, hogy a 3 ciklus baj, akkor azon még lehet csiszolni. Nyilván elég akkor futtatni a belső ciklust, ha a külső változó osztója a térfogatnak. Ha osztója, akkor gyorsan le is kell osztani és belső ciklusban már csak ezt felbontani.
-
blaces
tag
válasz
Jester01 #905 üzenetére
Feladat:
Írj programot, amely a bemenetről beolvas egy természetes számot - egy térfogatot! A program írja a szabványos kimenetre, hogy hány különböző téglatesthez tartozhat ez a térfogat! (A téglatestek oldalhossza csak egész szám lehet!)
Példa:
bemenet- kimenet
27 - 3
4 - 2
99 - 4
254 - 2Nekem erre csak a 3 for ciklusos megoldás jutott eszembe
-
Jester01
veterán
válasz
Dirty_Pio #903 üzenetére
1 byteos számot olvasd (un)signed char változóba, aztán csinálj vele amit akarsz. Ha mindenképp short-ba olvasod, akkor eleve azt is tudnod kell, hogy melyik felébe (endianness). A másik felét pedig neked kell nullázni (akár úgy, hogy a beolvasás előtt az egészet nullázod).
MOD: ja és negatív számoknál még sign extension is kell. Szóval macerás, jobb ezt a fordítóra bízni. -
blaces
tag
Lortech köszönöm a kódot. Igyekszem átjavítani. Bocs a késői reagálásért, de közben zh időszak is van, így elvagyok havazva. És szívesen várom a további kritikákat
gets() függvényhez annyit, hogy nem csak suliban alkalmazák, hanem könyvekben is... az fgets-et csak megemlítették, példa feladat mindegyike a gets()-el volt. Úgyhogy az a link nagyon jól jött. A többi "hibát" meg megpróbálom még magam kijavítani, csak a könyveken és a prohardveren kívül nem tudok másra támaszkodni, és a ezek szerint a könyvek alapján is betanulom a nem ajánlott kategóriákat.Jester01 értettem, majd törekszem arra, hogy jó C programozó legyek
Ismét kéne egy kis help. Google-val nem tudtam, hogy hogyan kell arra még rákeresni, hogy ha több for ciklust eggyé alakítani. Meg angolul sem kaptam értelmes találatot a havi cikluson kívül...
for(i=1; i<=terfog; i++){
for(j=i; j<=terfog; j++){
for(k=j; k<=terfog; k++){
if(i*j*k==terfog)
teglatestek++;
}
}
}, hogy ezt a 3 for ciklust kéne 1 ciklusba írni, vagy gyorsabb formába, amiatt nem kaptam rá pontot mert lassú..., próbáltam az alap tudásommal is papíron, de ötletem sincs. Mivel j és k az előző for ciklusból kapja az értékét...
-
Dirty_Pio
csendes tag
Ok, rajottem a dologra, szal en allapitom meg hogy miylen tipusu memoriamezobe olvasom be a fielbol a byteot es azt is, hogy hany byteot akarok ott latni. A kerdesem az lenne, hogy ha tegyuk fel en csak egy 1 byteon abrazolt szamot akarok kiolvasni es short intet hasznalok ami 2 bytet folglal, akkor a tobbit keegesziti 0-kal a program? Amugy a dolog azert kellett, hogy egy binaris fileban levo adatokbol kirajzoljak egy kepet a kepernyore.
-
Dirty_Pio
csendes tag
Sziasztok, az volna a kerdesme, hgoy hogyan tudok egy binaris filebol kiolvasni szamokat. Azaz ha meg van adva hogy pl. az elso 2 byteon van egy szam ami egy tulajdonsagat jeloli a filenak aminek majd a feldolgozas soran veszem hasznat, es utana meg byteonkent vannak mas szamok( ha jol tudom igy maximum 0-255 intervallumba lehetnek). Szoval az a kerdesem hogy hogyna csinalok ezekbol a byteokbol ujra szamokat? Esetleg ha tudtok kuldeni egy tenyleg osszetett es ertelemse leirast a binaris filokkal valo dolgozasrol c ben szovesen vennem.
-
Jester01
veterán
A const-nak annyi jelentősége van, hogy a string literal az const (csak olvasható memóriaterületen van). Tulajdonképp nem is értem, miért fordul le (-Wwrite-strings és akkor van warning). De próbálj csak meg beleírni, lesz szép segfault
A szám/egyéb valóban nem volt feladat, de mivel egy tömböt indexelsz a beadott karakterekkel azért jó ha ellenőrzöd.
Csak azért kötözködtem, hogy ha valaki meglátja azért tudja, hogy még lehet rajta mit csiszolni. Gondoltam, hogy neked nem okozna problémát
Ú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!
- Milyen belső merevlemezt vegyek?
- World of Tanks - MMO
- iPhone topik
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Háztartási gépek
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- Luck Dragon: Asszociációs játék. :)
- Vicces képek
- Honor 400 Pro - gép a képben
- További aktív témák...
- 0% THM 3 havi részlet! Beszámítás, 27% áfa, Sapphire Nitro+ RX 9070XT 16GB készletről
- BESZÁMÍTÁS! GIGABYTE AORUS ELITE Z790 i7 14700K 64GB DDR5 1TB SSD 7900XTX 24GB be quiet! SB802 1000W
- Telefon felvásárlás!! iPhone 11/iPhone 11 Pro/iPhone 11 Pro Max
- ÁRGARANCIA!Épített KomPhone i5 13400F 32/64GB RAM RX 7800 XT 16GB GAMER PC termékbeszámítással
- Bomba ár! Lenovo ThinkPad T480s - i7-8GEN I 16GB I 256GB I 14" WQHD I HDMI I Cam I W11 I Gari!
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest