Új hozzászólás Aktív témák
-
Jester01
veterán
válasz kicsitomi88 #88 üzenetére
Azért ez nem ötös... A 2. feladat nagyon szépen elszáll ha páratlan számjegyből álló számot adsz be. A gets használata pedig egyébként is veszélyes, mert nincs hossz ellenőrzés, tehát mindkét progi elszáll ha 19-nél több karaktert adsz be (tehát már a specifikáció szerinti 20ra is!), amiről még csak meg sem nézed, hogy számjegyek-e. Annak meg mi értelme, hogy a számjegyeket (48 - c) alakban adod össze és a végén szorzod -1-el?
Jester
-
Jester01
veterán
válasz [HUN]Zolee #132 üzenetére
t.c: In function ‘test’:
t.c:40: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int *’
t.c:41: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int *’Valamint a foglalás valóban rossz, ha már egyszer int-eket akarsz tárolni, akkor azoknak foglalj helyet, illetve ügyelj a pointerekre!
Diff:
--- t.c.orig 2007-11-20 16:48:48.000000000 +0100
+++ t.c 2007-11-20 16:59:32.000000000 +0100
@@ -8,24 +8,24 @@
int i,j;
- (*t)=(int***)malloc(sor*sizeof(char));
+ (*t)=(int***)malloc(sor*sizeof(int**));
for (i=0;i<sor;i++) {
- (*t)[i]=(int**)malloc(sor*sizeof(char));
+ (*t)[i]=(int**)malloc(sor*sizeof(int*));
}
for(i=0;i<sor;i++){
for (j=0;j<sor;j++){
printf("i:%d j:%d\n",i,j);
- (*t)[i][j]=(int*)malloc(2*sizeof(char));
+ (*t)[i][j]=(int*)malloc(2*sizeof(int));
}
}
for (i=0;i<sor;i++){
for (j=0;j<sor;j++) {
- t[i][j][0]=0;
- t[i][j][1]=0;
+ (*t)[i][j][0]=0;
+ (*t)[i][j][1]=0;
}
}
@@ -37,8 +37,8 @@
for (i=0;i<sor;i++) {
for (j=0;j<sor;j++) {
- printf("%d",t[i][j][0]);
- printf("%d",t[i][j][1]);
+ printf("%d",(*t)[i][j][0]);
+ printf("%d",(*t)[i][j][1]);
}
printf("\n");
}Jester
-
Jester01
veterán
válasz [HUN]Zolee #149 üzenetére
Semmit, kicsi a k amivel hívod. 3 lépés kevés, próbáld hattal vagy többel.
[ Szerkesztve ]
Jester
-
Jester01
veterán
-
Jester01
veterán
válasz plaschil #200 üzenetére
A lényeget pont lehagytad. Emberek, legyetek szívesek mindig a teljes programot is mellékelni (külső link formájában), hogy ki lehessen próbálni! Ugyancsak általános megjegyzés, hogy tessék szépen bekapcsolni az összes warningot és kijavítani őket, hacsak nincs rá nyomós ok.
Valószínűleg az f változód simán char*. Ez baj, annak bizony helyet kell foglalni. A scanf hívásba pedig nem kell az & jel az f elé. Ettől eltekintve a progi sajnos több sebből vérzik.
A struct és az union közötti óriási különbség, hogy az union tagjai egymást átfedve helyezkednek el a memóriában, míg a struct esetében egymás után. Union esetén általában mindig csak az egyik mezőt használjuk (speciális eset pl. a típuskonverzió)
Jester
-
-
Jester01
veterán
válasz plaschil #203 üzenetére
Jajj, az f ráadásul egy int.
Én a következő módon csinálnám. Mivel az stdin is egy fájl, ezért készítenék egy függvényt ami bemenetként FILE* argumentumokat vár. Ezt ezután simán lehet hívni "igazi" fájlokkal illetve az stdin-el is.
Az "abcdef" stílusú változókról pedig addig szokj le amíg nem késő
Jester
-
Jester01
veterán
--- t.c.orig 2007-12-14 18:46:12.000000000 +0100
+++ t.c 2007-12-14 18:49:52.000000000 +0100
@@ -7,7 +7,7 @@
}
-int eszam(){
+double eszam(){
int h, p=0, i=0;
double e=2.0;
@@ -17,13 +17,13 @@
printf("Csak pozitiv egesz szam fogadhato el!");
else
for (i=2; i<p; i++) {
- e+=1/faktorialis(p);
+ e+=1./faktorialis(i);
}
return e;
}
int main(){
- printf("\nVegeredmeny:%e",eszam());
+ printf("Vegeredmeny:%g\n",eszam());
return 0;
}Fő probléma 2 volt: az egész és a lebegőpontos számítások helytelen használata, illetve a faktoriális hívásban nem a ciklusváltozót adtad át.
Jester
-
Jester01
veterán
válasz feherpeter #214 üzenetére
Hát mert gondolom a szerencsétlen outtextxy szöveget vár, te meg egy számot adsz be neki. Ezt egyébként a fordító valószínűleg meg is mondta neked.
Jester
-
Jester01
veterán
válasz #25954560 #248 üzenetére
Több magot akkor fog kihasználni, ha több szálon fut. Ahhoz meg az kell, hogy a feladatot lebontsd párhuzamosan végezhető műveletekre, lehetőleg hasonló számításigénnyel. Mindezt ideális esetben tetszőleges számú szálra, például az adatmennyiség n részre osztásával. Általában ehhez szükséges valami extra művelet, ami a részműveletek eredményéből összerakja a végeredményt. Például ha az a feladat, hogy készíts fényességdiagramot egy fényképről, akkor a képet feloszthatod annyi részre ahány mag van és a részekre párhuzamosan végrehajtod a számlálást. Végül pedig összeadod a részeredményeket. Persze ha lehetséges, akkor menet közben is egyből aggregálhatsz, csak akkor figyelni kell a szinkronizálásra. (Amire persze amúgy is figyelni kell). Ha eleve több feladat van (mint például egy web szerver esetén) akkor tipikusan a thread pool architektúrát szokták alkalmazni, amikoris az n (vagy n-1) végrehajtó szál párhuzamosan, de önállóan dolgozza fel a kéréseket. A feladatokat funkcionálisan is szét lehet bontani, csak ekkor nagyobb probléma az egyenlő elosztás illetve a tetszőleges skálázódás. Pl. egy játék esetén lehet dedikált futási szála a rajzolásnak, a hangkezelésnek, a hálózatkezelésnek -- csak ezek ugye közel sem azonos processzorigényűek.
64 bites architektúra általában nem igényel speciális kódot, de persze ki lehet használni az előnyeit a nagyobb címtartománynak. Például ha van sok adatot tartalmazó fájlod amit eddig seek/read módon használtál véletlen elérésre, azt most nyugodtan bemappolhatod (jajj) a memóriába és így majd az operációs rendszer a hardver segítségével meggyorsíthatja a működést.
Ugyanakkor át kell nézni a jelenlegi programot, nem végez-e trükköket (tipikusan pointer -> int -> pointer konverziót) ami nem működik 64 biten.Az x86-64 továbbá nem csak azt jelenti, hogy 64 bites a címtartomány, hanem több regiszter is van. Ezzel viszont c++ esetén elég a fordítónak foglalkozni.
Jester
-
Jester01
veterán
válasz #25954560 #250 üzenetére
1. Igen, alapvetően jobb az operációs rendszerre hagyni a magok kezelését, de bele lehet szólni.
2. Ha nem tudsz dinamikusan szétosztani tetszőleges szálra, akkor írd meg 8ra, igen.
3. Nem értem mit akarsz a memóriaterülteteken optimalizálni. Lehet, hogy csak nem ismerem ezt a technikát.Jester
-
Jester01
veterán
- s és t a cél illetve a forrás paraméter
- *s és *t az aktuális karakter
- a *s++/*t++ eltárolja/visszaadja az aktuális karaktert majd növeli a pointert, hogy a következő kartakterre mutasson
- pedig a while bizony onnan tudja, hogy vége a szövegnek, hogy összetalálkozik a lezáró 0-val. Máshonnan nem is tudhatjaJester
-
Jester01
veterán
Akkor a SetConsoleCursorPosition függvény kell neked és amúgy a Console Reference részt olvasgasd az msdnben.
Jester
-
Jester01
veterán
válasz cellpeti #656 üzenetére
Azok azért vannak, hogy megkapd a számjegyek értékét. A 0 ascii kódja (ahogy a stringben van) ugyanis 48 (másnéven '0'). Szerencsére innen sorban jön a többi 9 számjegy, tehát sima kivonással meg lehet kapni a számértéket.
Egyébként a string hosszának ellenőrzése még nincs meg.
Jester
-
Jester01
veterán
válasz cellpeti #658 üzenetére
Igen, a bekért számjegyek tömbjén megy végig, összedva őket. Azért nem <= kell mert a tömbök indexelése 0-val kezdődik. Tehát az első 5 számjegy a 0,1,2,3,4 indexeken van.
A string hosszát valóban az strlen adja meg, de mivel a te beolvasó függvényed eleve nem ad vissza csak 6 karaktert, ezért ezzel azt nem tudod kiszűrni ha többet írnak be. Ehhez a beolvasásnál kellene ellenőrizni, hogy pontosan 6 karaktert írtak-e be.
MOD: sőt, mivel egy lezáró 0 byteot is tesz, rögtön túl is címzi a 6 elemű tömböt. Uppsz.[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz cellpeti #664 üzenetére
Pl. kiveszed a 0 lezárást a getline függvényből, mert úgysem kell. Ugyanakkor az i növelését beleteszed a while ciklusba is. Így tehát a függvény legfeljebb 6 karaktert ír a tömbbe (ezzel a túlcsordulás megoldva) és a visszatérési érték alapján pedig a main-ben ellenőrizheted a hosszt (nem kell strlen).
Jester
-
Jester01
veterán
válasz Fire/SOUL/CD #761 üzenetére
Jelen esetben persze tök fölösleges kétszer végigolvasni a fájlokat, hiszen az előzetes hossz ellenőrzésnek csak annyi értelme lenne, hogy akkor nem kell végigolvasni őket. Szépen el kell kezdeni összehasonlítani, aztán ha a hossz nem stimmel, az úgyis kiderül.
A "nem fogadta el" résszel nekem nem a "nem tanította" résszel van bajom, hanem hogy miért nem örül inkább hogy a diák többet tud?
Jester
-
Jester01
veterán
Azért vegyük észre, hogy az eredeti feladatban szavak szerepelnek. A fenti megoldások mind megtalálnák (kicserélnék) a betűkombináció összes előfordulását. (pl. ha az alma szót kellene *-ra cserélni, akkor a hatalmas szóból is hat*s lenne.)
Jester
-
Jester01
veterán
válasz Dirty_Pio #796 üzenetére
A dinamikus tömb kezelés nem egyszerű C-ben. Jelen esetben javaslom, hogy a függvényparaméterekben a ROW és COL makrókat használd, pl így:
void mread (int max1, int max2, int q[ROW][COL])
Persze a max1 és max2 átadása ekkor már szintén fölösleges.Van még pár apró hiba benne, gondolom azokat majd megleled vagy ha nem, akkor kérdezel
Jester
-
-
Jester01
veterán
válasz cellpeti #811 üzenetére
Egyes számú okos tanács: próbáld ki
Kettes számú okos tanács: mindig használj kapcsos zárójelet ciklusokban és feltételekben
Hármas számú okos tanács: a main úgy illik, hogy int-et adjon visszaHa a kapcsos zárójeleket betesszük úgy, ahogy a fordító értelmezi a te kódod, akkor ez lesz:
while (( c = getchar()) != EOF) {
if (c == ' ' || c == '\n' || c=='\t') {
++tab;
}
}
++ujsor;
++space;Látható, hogy az utolsó két sor nem hogy az if-ben, de még a while-ban sincs benne. Tehát azok mindig 1-et fognak kapni. A tab változó pedig önmagában számolja mind a 3 típust, vagyis azok összege lesz benne. A 3 karaktert külön-külön feltétellel (vagy switch szerkezettel ha már azt ismered) kell ellenőrizni, és persze mindet a cikluson belül.
Jester
-
Jester01
veterán
válasz Dirty_Pio #838 üzenetére
1) Nem tudom, hogy az [ i ] indexeket a fórum nyelte-e be, de ha nem akkor hiányzanak
2) ha ragaszkodsz a bitmezőkhöz, az megbonyolítja a beolvasást. Én inkább kidobtam őket
3) a switch-ben kimaradtak a case kulcsszavak.
4) a default után is kell kettőspont, de a default: break konstrukciónak nincs sok értelme, olyan mintha ott sem lenne
5) becsúszott egy bezáratlan kapcsos zárójel
6) a %c formátum nem ugorja át a szóközt (whitespace) ilyenkor explicit kell egy szóköz
7) a scanf-nek pointer kell, hiányzik egy pár & jelEz itt patch, hogy jobban látszódjon a módosítás.
--- t.c.orig 2009-03-11 22:10:54.000000000 +0100
+++ t.c 2009-03-11 22:37:13.000000000 +0100
@@ -7,15 +7,15 @@
enum star_type tp;
union star{
struct mai{
- unsigned char type:2;
- unsigned char age:2;
+ unsigned char type;
+ unsigned char age;
char color[11];
}m;
struct bin{
float r1;
float r2;
- unsigned char t1:2;
- unsigned char t2:2;
+ unsigned char t1;
+ unsigned char t2;
}b;
struct var{
float lowlmn;
@@ -32,37 +32,35 @@
scanf("%d",&a);
printf("How many stars?(max 10)\n");
scanf("%d",&n);
- for (i=0;i<n;i++){
+ for (i=0;i<n;i++)
switch (a){
- MA:
- scanf("%50s",x.name);
- x.tp=a;
- scanf("%c %c %s",x.u.m.type, x.u.m.age, x.u.m.color);
- break;
- BIN:
- scanf("%50s",x.name);
- x.tp=a;
- scanf("%f %f %c %c",x.u.b.r1,x.u.b.r2,x.u.b.t1,x.u.b.t2);
- break;
- VAR:
- scanf("%50s",x.name);
- x.tp=a;
- scanf("%f %f %f",x.u.v.lowlmn,x.u.v.highlmn,x.u.v.period);
+ case MA:
+ scanf("%50s",x[i].name);
+ x[i].tp=a;
+ scanf(" %c %c %s",&x[i].u.m.type, &x[i].u.m.age, x[i].u.m.color);
+ break;
+ case BIN:
+ scanf("%50s",x[i].name);
+ x[i].tp=a;
+ scanf("%f %f %c %c",&x[i].u.b.r1,&x[i].u.b.r2,&x[i].u.b.t1,&x[i].u.b.t2);
+ break;
+ case VAR:
+ scanf("%50s",x[i].name);
+ x[i].tp=a;
+ scanf("%f %f %f",&x[i].u.v.lowlmn,&x[i].u.v.highlmn,&x[i].u.v.period);
break;
- default break;
};
for (i=0;i<n;i++)
- switch (x.tp){
- MA:
- printf("%c %c %s\n",x.u.m.type, x.u.m.age, x.u.m.color);
+ switch (x[i].tp){
+ case MA:
+ printf("%c %c %s\n",x[i].u.m.type, x[i].u.m.age, x[i].u.m.color);
break;
- BIN:
- printf("%f %f %c %c\n",x.u.b.r1,x.u.b.r2,x.u.b.t1,x.u.b.t2);
+ case BIN:
+ printf("%f %f %c %c\n",x[i].u.b.r1,x[i].u.b.r2,x[i].u.b.t1,x[i].u.b.t2);
break;
- VAR:
- printff("%f %f %f\n",x.u.v.lowlmn,x.u.v.highlmn,x.u.v.period);
+ case VAR:
+ printf("%f %f %f\n",x[i].u.v.lowlmn,x[i].u.v.highlmn,x[i].u.v.period);
break;
- default break;
};
system("pause");
return(0);Jester
-
Jester01
veterán
4) például bevezetsz index, max és lépés változókat. Az index mutatja, hol állsz az abcben, a max, hogy meddig, az irány pedig, hogy éppen merre (le/fel=-1/+1). Csinálsz egy külső ciklust, ami a kívánt kiírandó karakterszámig fut. A cikluson belül kiírod az aktuális karaktert, majd a lépés hozzáadásával mész a következőre. Ellenőrzöd nem ütköztél-e az intervallum alsó vagy felső határába és ha igen, akkor a lépést megfordítod és az aktuális indexet korrigálod. A betűk kiírásához felhasználhatod, hogy az ascii kód éppen az angol abc szerint van sorban, vagy alkalmazhatsz egy konstans stringet amiből kinézed a betűket.
5) ezzel nem tudom mi a probléma, elég szájbarágósan le van írva. Csinálsz egy függvényt, ami ellenőrzi, hogy a szám prím-e. Erre az egyszerű favágó megoldás gondolom teljesen jó lesz, miszerint végignézed osztható-e valamivel. A főprogram pedig a feladatkiírásnak megfelelően jár el.
Jester
-
Jester01
veterán
Hát mert nem úgy csináltad, ahogy mondtam
Egy ciklus kell összesen, nem 3. Viszont kell egy változó ami mutatja éppen le vagy fel mész.
Valahogy így:int lepes = 1;
int index = 0;
for(i = 0; i < max - 1; i++)
{
printf("%c", 'a' + index);
index += lepes;
if (index >= visszaford)
{
index = visszaford - 2; /* a minta szerint a felso fordulopontot csak egyszer irjuk ki */
lepes = -1;
}
if (index < 0) {
index = 0; /*a minta szerint az also fordulopontot ketszer irjuk ki */
lepes = 1;
}
}Jester
-
Jester01
veterán
Ahogy Benmartin írta, az a baj, hogy az enter amit a felhasználó lenyom szintén bekerül a pufferbe. A %c önmagában nem ugorja át a whitespace-t (mi ennek a magyar neve?) de a szóköz az igen.
Tehát pl. ha a következő két sort adta be a felhaszáló: A<szóköz>B<enter>C<szóköz>D<enter> akkor a "%c %c" mit csinál? Berakja az A-t az első változóba, a szóköz miatt átugorja a bemenetben lévő szóközt, majd a B-t berakja a második változóba. Eddig szép és jó. Na de ha most még egy "%c %c" olvasás következik, az szembetalálja magát a pufferben lévő soremeléssel és azt teszi be az első változóba a C helyett. A formátumban lévő szóköz most a C karakterrel foglalkozik, de mivel az nem whitespace ezért nem történik semmi. A második változóba ezután szépen bekerül a C a D helyett. Ha viszont van egy szóköz a formátum elején is, akkor az megeszi a soremelést és minden megint jó.
Jester
-
Jester01
veterán
Van egy felesleges bezáró kapcsos zárójeled és hiányzik egy #include <string.h> Ettől mondjuk még nem működik, de legalább lefordul.
Ezek így nem jók: if (nev[ i ]=='a' || 'A') helyette if (nev[ i ]=='a' || nev[ i ] == 'A') kell. Így talán jó lesz.
Amúgy a tömbös megoldásnál egyszerűen mejegyzed mi volt az előző lenyomott gomb és ha a mostani ugyanaz, akkor kiteszed a szóközt.
[ Szerkesztve ]
Jester
-
Jester01
veterán
Ja, ilyesmi lenne a tömbös. Csak nem jó Mert azt kell nézni, hogy a leképezett számjegy ugyanaz-e mint az előző, nem pedig a betű. Ha "a" betű után jön "b" betű, akkor is kell a szóköz, ugyebár. Becsúszott néhány nev[0] a nev [ i ] helyett, de ez gondolom csak elírás, ugyanúgy mint a felesleges \0 a tömbben.
Ha nagyon kötözködni akarnék akkor további észrevételek (nem rosszindulatból ):
* az a tömb igazából const char* tomb[] kellene legyen
* A gets annyira rossz, hogy a gcc szól is érte (fgets helyette)
* while feltételbe strlen nem jó ötlet hatékonyság miatt
* printf helyett fputs/fputc és tsai (ha egyszer semmi formázás nincs, akkor minek a printf)
* toupper/tolower valamelyike (vagy ha nagyon trükkös valaki, akkor bit művelet)
*.ellenőrizni kellene, hogy betű jött-e egyáltalánJester
-
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
Jester
-
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.[ Szerkesztve ]
Jester
-
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.
[ Szerkesztve ]
Jester
Ú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!
- Tyű-ha! HP EliteBook 850 G7 Fémházas Szuper Laptop 15,6" -70% i7-10610U 4Mag 32GB 512GB SSD FHD HUN
- Bomba ár! HP EliteBook 840 G5 - i5-8G I 8GB I 128GB SSD I 14" FHD I HDMI I Cam I W10 I Gari!
- The Last of Us Part I Ps5
- Bomba ár! HP EliteBook 830 G6 - i7-8G I 8GB I 256GB SSD I 13,3" FHD I HDMI I Cam I W11 I Gari!
- Bomba ár! Dell Latitude 5580 - i5-G6 I 8-16GB I 256 SSD I 15,6" FHD I HDMI I CAM I W10 I Garancia