- Házimozi haladó szinten
- Bambu Lab 3D nyomtatók
- Nem indul és mi a baja a gépemnek topik
- Bemutatkozott a Transcend SSD-inek zászlóshajója
- Milyen egeret válasszak?
- Milyen TV-t vegyek?
- Steam Deck
- Bluetooth hangszórók
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- HiFi műszaki szemmel - sztereó hangrendszerek
Új hozzászólás Aktív témák
-
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;
}
} -
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.
-
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); -
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.
-
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
-
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.)
-
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?
-
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).
-
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. -
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.
-
Jester01
veterán
Akkor a SetConsoleCursorPosition függvény kell neked és amúgy a Console Reference részt olvasgasd az msdnben.
-
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 tudhatja -
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. -
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.
-
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.
-
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.
-
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ő
-
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ó)
-
Jester01
veterán
válasz
[HUN]Zolee #161 üzenetére
Hát mert az elemeket nem foglaltad le egyáltalán.
-
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.
-
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");
} -
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?
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- LG 65" C1 OLED - 4K 120Hz 1ms - NVIDIA G-Sync - FreeSync Premium - HDMI 2.1 - PS5 és Xbox Ready!
- Game Pass Ultimate előfizetés azonnal, élettartam garanciával, problémamentesen! Immáron 8 éve!
- BESZÁMÍTÁS! ASRock Z370 i5 8500 16GB DDR4 512GB SSD 2060 Super 8GB Zalman Z9 Plus Enermax 750W
- Telefon felváráslás!! iPhone 15/iPhone 15 Plus/iPhone 15 Pro/iPhone 15 Pro Max
- Bomba ár! HP Elitebook 8570W - i7-QM I 16GB I 750GB I 15,6" HD+/FHD I Nvidia I W10 I Garancia
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest