Fontos linkek a C-ről:
Prog.hu-s cikkek
Prog.hu-s tudástár témák
The C Library Reference Guide
Standard C
Wikipedia
C Tutorial
Programming in C
Bevezetés a C programozási nyelvbe
Gyorskeresés
Legfrissebb anyagok
- Bemutató Spyra: akkus, nagynyomású, automata vízipuska
- Bemutató Route 66 Chicagotól Los Angelesig 2. rész
- Helyszíni riport Alfa Giulia Q-val a Balaton Park Circiut-en
- Bemutató A használt VGA piac kincsei - Július I
- Bemutató Bakancslista: Route 66 Chicagotól Los Angelesig
Általános témák
LOGOUT.hu témák
- [Re:] [D1Rect:] Nagy "hülyétkapokazapróktól" topik
- [Re:] [bb0t:] Gyilkos szénhidrátok, avagy hogyan fogytam önsanyargatás nélkül 16 kg-ot
- [Re:] [GoodSpeed:] ASUS ROG STRIX B650E-F GAMING WIFI - Memory Context Restory (MCR)
- [Re:] [Sub-ZeRo:] Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- [Re:] [sziku69:] Fűzzük össze a szavakat :)
- [Re:] [btz:] Internet fejlesztés országosan!
- [Re:] [Mr Dini:] Ha szeretnéd rootolni az LG Smart TV-d, tedd meg most!
- [Re:] [plevips:] Építkezünk 3. rész (2024)
- [Re:] [gban:] Ingyen kellene, de tegnapra
- [Re:] [Luck Dragon:] Asszociációs játék. :)
Szakmai témák
PROHARDVER! témák
Mobilarena témák
IT café témák
Téma összefoglaló
- Utoljára frissítve: 2014-04-25 14:12:00
LOGOUT.hu
Hozzászólások
artiny
őstag
(s)sanf itt a fscanf re gondoltal? mert a sanf t nem ismerem es nem adott semmit a google.
Valmi ilyesmit probaltam. Harom szamot beolvasni egy txt bol es azt osszeadni es kiiratni.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
int i;
int d;
FILE * f;
f = fopen("szam.txt","r");
while (( i= getc(f)) != EOF ){
fscanf(f,"%d",&i);
}
fclose(f);
printf("%d",d);
return 0;
}
Csak fura volt elsore, meg szokatlan, nem probaltam meg ilyesmit, Jester01 valtozata mar ismerosebb.
Korcsii
őstag
sscanf-re gondoltam, csak rosszul... elfelejtettem, hogy fájlból olvasol...
Hogy hogyan kezeli őket, az attól függ, hogy hogyan olvasod be.
Mindenesetre fscanf-et és f(?)getc-t nem kéne keverni, elég a kettő magában is (az előbbi kódoddal levágsz egy karaktert, aztán beolvasol egy számot a maradékból).
Egyszerű programban én simán fscanf-fel olvasnék, esetleg vizsgálnám, hogy sikeres-e.
[ Szerkesztve ]
artiny
őstag
oke.koszi vegul sikerult a fscanf l.
Jester01
veterán
Az értékadás mint kifejezés inkább feltételben szokott előfordulni, ilyesmiket lehet gyakrabban látni:
while ((c = fgetc(in)) != EOF) { ... }
vagy
while ((bytes = read(...)) > 0) { ... }
Ezekben az esetekben olvashatóbbá teszi a kódot, artiny verziójában valóban fölösleges, inkább zavaró volt.
Jester
artiny
őstag
Hogyan lehet egy számot ami több számjegyből áll feldarabolni?
Ilyet megirni :
3-mal osztható az a szám, melynek számjegyeinek összege 3-mal osztható. (Úgy is meg lehet fogalmazni, hogy 3-mal osztható az a szám, amelynek a 3-mal nem osztható számjegyeinek (vagyis a 0, 3, 6, 9 számjegyeket nem számolva) összege osztható hárommal (például a 3694692306 szám osztható 3-mal, mert hárommal nem osztható számjegyeinek összege 4+2=6 osztható 3-mal))
kingabo
őstag
5let: A számot osztod maradékosan 10-el, így megkapod az utolsó számjegyet, amit hozzáadsz egy összeghez. Ezt kell addig csinálnod, amíg végül 0-t nem kapsz. Ezután megvizsgálod, hogy az összeget 3-al osztva 0-e a maradék.
C-s megvalósításhoz:
maradek = szam % 10;: a szám 10-el vett osztási maradéka (a szam változatlan marad)
szam = szam / 10;: a szám osztása 10-el (int osztás)
[ Szerkesztve ]
artiny
őstag
Helo
"Ezt kell addig csinálnod, amíg végül 0-t nem kapsz." -ezt nem nagyon ertem,
hogyan tudok beljebb halladni,hogy nem csak az utolso szamot tudjam "levagni",ellenorizni?
pl.: 151
a = num%10; // erdemeny: 1
b = num%100; // erdemeny: 51
itt a baj hogy az 5 utan az 1 is ott van...hogy lehet h csak az 5 .st irja ki?
[ Szerkesztve ]
artiny
őstag
mar meg van>
int main() {
int x, data[sizeof(int)];
x=251;
data[2] = x/100; x%=100; //data[2]=2; x=51;
printf("%d\n",data[2]);
data[1] = x/10; x%=10; //data[1]=5; x=1;
printf("%d\n",data[1]);
data[0] = x; //1
printf("%d\n",data[0]);
doc
nagyúr
a szamot minden lepesben oszd el a szamrendszer alapjaval (jelen esetben 10)
kingabo
őstag
Ciklusban kell végezned amit leírtam.
Tehát a példádnál maradva az első iterációban leszeded az 1-et, a szám 15 lesz, aztán a másodikban a 5-t, a szám 1 lesz, aztán a harmadikban a maradék 1 lesz, a szám 0.
Szerk:
Ez azért így elég csúnya: data[sizeof(int)];!! 32bites gépen ez 4 lesz, viszont 9 számjegyű számot is lehet tárolni a változóban!
[ Szerkesztve ]
artiny
őstag
Köszönöm a segítségeteket,sikerült így most már megírni /talán jól is /
#include <stdlib.h> // for itoa() call
#include <stdio.h> // for printf() call
int main() {
int num,i,mard,erd = 0,num2;
printf("Adjon meg egy szamot \n");
scanf("%d",&num);
num2=num;
for(i = 1; ; i++){
mard = num%10;
// printf("mardadek %d\n", mard);
if(!(mard == 0 || mard == 3 || mard == 6 || mard == 9)){
erd = erd + mard;
}
num = num/10;
// printf("%d\n", num);
if(num==0){
break;
}
}
printf("Szamjegyek osszege /0,3,6,9 kivul/ %d\n", erd);
if(erd%3 == 0){
printf("%d oszthato 3 .al",num2);
}
else{
printf("%d nem oszthato 3 .al \n\n",num2);
}
return 0;
}
kingabo
őstag
Nem tudom feladat-e, de célszerű lenne ellenőrizni, hogy tényleg számot adott-e meg a lyúzer.
Pár észrevétel a kódhoz:
- az itoa-t nem használod, szerintem felesleges a hozzá tartozó include
- if(!(mard == 0 || mard == 3 || mard == 6 || mard == 9)) helyet írhatod ezt is
if(mard != 0 && mard != 3 && mard != 6 && mard != 9)) (ha már 1 hamisat talál, akkor a többit ki se értékeli)
- nem tudom kötelezőe a fenti módon való számolás, de sokat gyorsíthatnál, ha simán csak összegzed a számjegyelet, esetleg a mard-nak a 3al vett maradékát néznéd, hogy 0-e (ez utóbbi valszeg lassabb lenne, de a kód átláthatóbbá válna, illetve könnyebben módosítható, ha 3 helyett a 9-el való osztás kell)
- for ciklus helyett egy while sokkal szebb lenne
artiny
őstag
kingaboezt a feladatot csak gyakorlas keppen talaltam ki magamnak,hogy lehetne megirni.
TXT knél mikor melyiket használjuk/ printf, fprintf, scanf, fscanf putchar, getchar, fputc, fgetc fpots, fgets /?
printf, - ha ki akarok íratni valamit txtbol pl. egy getc bol
fprintf, - ha egy beolvasott karaktert kiíratok,elmentek egy txt be
scanf, - érteket adok egy változónak
fscanf,
putchar, - egy darab karaktert megjelenít a képernyőn,
getchar, - egy darab karaktert beolvas egy txtbol,
putc,
getc,
fputc,
fgetc,
fputs,
Amihez nem irtam azzal nem vagyok tisztába teljesen vagy mar teljesen összekavart.
www.cplusplus.com/
cpprefence oldalakon mar átnéztem többször is de....nem értem teljesen stb ...
feladatokhoz kell ez az összegzés nekem hogy tudjam mikor melyiket kell használni altban.
[ Szerkesztve ]
kispx
addikt
Üdv,
Az alábbi kódrészletet miért lehet lefordítani? Mármint definiálunk egy switch szerkezetet, majd az egyik case ágában egy do-while ciklust írunk és ebben a ciklusban folytatjuk tovább a case ágakat.
switch (count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while ((count -= 8) > 0);
}
[ Szerkesztve ]
Korcsii
őstag
jesszus...
mit kéne ennek a kódnak csinálnia? mert arra is nehéz rájönni...
én csinálnék egy if-et 0-ra, és akkor belép a do-while-ba, ahol lenne egy switch...
break; nem hiányzik?
Jester01
veterán
Ez egy nagyon trükkös optimalizálás.
Jester
kispx
addikt
Konkrétan nem tudom, hogy mit csinál a kódrészlet (de a változódeklarációkkal kiegészítve lefordul) . Azért kérdeztem, mert még ilyen szintaktikát még nem láttam.
Jester01
Köszönöm szépen.
kovacsakos91
csendes tag
Szeretném megkérdezni, hogy tudna e valaki C programozási feladatgyűjteményt ajánlani? Esetleg amit maga is használt? A Juhász István, Kósa Márk, Pánovics János féle "C példatár" című könyvet ismerem.
Ehhez hasonló feladatokat keresnék: http://pastebin.com/9NtteJgu
A válaszokat előre is köszönöm!
(#3070) Sk8erPeter válasza kovacsakos91 (#3069) üzenetére
Sk8erPeter
nagyúr
(#3071) Sk8erPeter válasza Sk8erPeter (#3070) üzenetére
Sk8erPeter
nagyúr
Még egy link: [InfoC portál]
Sk8erPeter
(#3072) kovacsakos91 válasza Sk8erPeter (#3070) üzenetére
kovacsakos91
csendes tag
Köszönöm a linkeket! Olyan feladatgyűjteményt is tudnál linkelni, amiben a példámhoz hasonló feladatok vannak? Akár könyv is megfelelne.
Előre is köszönöm!
(#3073) Sk8erPeter válasza kovacsakos91 (#3072) üzenetére
Sk8erPeter
nagyúr
Szívesen.
Ennyi idő alatt az összes példát végignézted, és felfedezted, hogy nahát, ezek között egy sincs, ami ahhoz hasonló lenne? Kétlem...
Ezeket tudtam linkelni.
Sk8erPeter
kispx
addikt
(#3075) kovacsakos91 válasza Sk8erPeter (#3073) üzenetére
kovacsakos91
csendes tag
Nem ma néztem át őket, az igazság az, hogy párhuzamosan több fórumon is kérdezősködök és ezeket már ajánlották mások is korábban, akkor néztem át őket.
kovacsakos91
csendes tag
Csak az "bosszant", hogy szinte minden feladatgyűjtemény hasonló feladatokat tartalmaz, de olyat nem találok sehol amilyet linkeltem is.
Karma
félisten
Ennek a második kötetében előfordulnak ilyen jellegű feladatok, még ha nem is ilyen bő lére eresztve. Instant nosztalgia!
Illetve, kategóriánál maradva, nézz utána Nemes Tihamér OKSzTV feladatsoroknak, ott is voltak ilyenek jópár éve. Bonyolultságra és stílusra is hasonló.
[ Szerkesztve ]
“All nothings are not equal.”
kispx
addikt
Kisebb játékot akarsz írni? Vagy milyen témájút? Több fórumon is láttam, hogy ezt a kérdést felraktad, és gyakorlatilag az összes használható feladatgyűjteményt felsoroltuk.
Esetleg egy-két házi van még, amit az egyetemen kaptunk.
kovacsakos91
csendes tag
Igazából bármilyen témájút, ami hasonló a példához.
kovacsakos91
csendes tag
Köszönöm válaszod! Az első ajánlott könyvre esetleg lenne valami ötleted honnan lehetne beszerezni? Itt találtam meg egyedül, de itt sincs belőle elérhető példány: http://www.antikvarium.hu/ant/book.php?konyv-cim=programozasi-feladatok-ii&ID=124277
[ Szerkesztve ]
Karma
félisten
Sajnos nem tudom, én amikor használtam könyvtárból vettem ki, úgy hét éve Kecskeméten
“All nothings are not equal.”
Rickazoid
addikt
Üdv!
A következő kóddal (mintakód, de a problémám ugyanez) lenne a problémám:
int i;
scanf("%d",&i);
printf("%d",i); //nem integer esetén 0
while(i==0)
{
printf("Nem jó. Új szám: ");
scanf("%d",&i);
}
printf("%d",i);
Amíg az i-nek számot adok meg, nincs gond, de amint betűt, a mögötte lévő ciklus végtelen ciklusba kerül. Ezt próbáltam meg kiküszöbölni a példában szereplő while ciklussal ami megnézi, hogy 0-e, mivel nem szám esetében 0 lesz az i értéke, de az is végtelen ciklusba kerül. Hogy tudom elérni, hogy nem szám beírásakor újrakérje a számot végtelen ciklusok helyett?
Az int-et nem módosíthatom karakterre, főleg nem karaktertömbre, az most túl bonyolult lenne a program többi része miatt.
Van valami megoldás erre? Egyáltalán miért nem működik? Ha az i értéke 0 lesz, akkor a while miért hülyül meg, mi a különbség 0 és 0 közt, ha mindkettő integer?
[ Szerkesztve ]
Erkölcstelen csíkot húzni a másik krumplifőzelékébe csak azért, hogy legyen egy szünet.
Jester01
veterán
Az i nem feltélten lesz 0. Egyszerűen csak nem változik az értéke. Mivel te semmivel sem inicializáltad, véletlen érték lesz, ami éppen a memóriában volt. Feladattól függően egyébként sem biztos, hogy a 0 hibás bevitel lenne.
Azért végtelen a ciklus mert ha a scanf elakad, akkor nem olvassa ki a pufferből a maradékot. A következő scanf hívás tehát pont ugyanúgy elakad. Neked kell takarítani, a következő sorvég jelig, például getchar használatával. EOF-ot is illik lekezelni.
A scanf amúgy visszaadja mennyi mezőt sikerült beolvasnia, de ettől még lehet szemét a pufferben. Nem véletlenül mondják, hogy nem ajánlott scanf-et használni. Bármennyire is nem szeretnéd, a korrekt megoldás általában teljes sor olvasása (fgets) után kézi feldolgozás (strtol, strtod).
Jester
Rickazoid
addikt
Egyelőre megoldottam puffertörléssel.. bár néha csinál érdekességeket, bugos a drága. Egy következő programomnál már lehet eleve másképp állok majd neki.
[ Szerkesztve ]
Erkölcstelen csíkot húzni a másik krumplifőzelékébe csak azért, hogy legyen egy szünet.
Fenyo12
tag
Sziasztok!
C++-ban hogyan lehet megoldani a következő problémát:
-bekérek egy számot, ami 1-3 számjegyű lehet (nem kritérium, de eltérő számjegyű lehet)
-a számjegy számjegyeit helyiértékenként leválogatom és eltárolom 3db változóban
Tehát pl.: megadom 234-et bemenetnek, akkor a=2, b=3, c=4,
de ha 15 a bemeneti érték, akkor a=0, b=1, c=5.
bpx
őstag
a = szam / 100;
szam = szam - a * 100;
b = szam / 10;
szam = szam - b * 10;
c = szam;
hruodnand
senior tag
Sziasztok!
Egy kis problémába ütköztem CodeBlocks terén.
Debug-olás: LINK
A linkelt képen jól látható, hogy az u1-es tömböt szépen feltölti "0"-val, míg az u3-asat nem! Holott evidens, hogy azt is fel kellene töltenie.
Próbáltam sokféleképpen megadni neki a nullát, és sehogy se ment. u2-es volt alapból a neve a tömbnek, de átírtam u3-asra kínomba.
CodeBlocks hiba vagy esetleg én néztem be valamit?
Megj.:
Minden más kódrészlet a programban ki van kommentelve, illetve csak ezt az egy fájlt használom.
MOD:
A program le lett fordítva újra természetesen.
Azt is tudom, hogy 8 elemű a tömb és én 7 elemet rakok bele u3-nál, de ez ugye nem lényeg,
[ Szerkesztve ]
hruodnand
senior tag
7 elemű a tömb és 7-et rakok bele. Csak már megzavarodtam.
Probléma mindig fenn áll még.
bpx
őstag
ez szerintem a CodeBlocks vagy a fordító sara
elvileg a CodeBlocks-ban is van disassembler, az mit mutat?
én VS2010-el néztem debug közben:
int u1[N] = { 0 };
002813F9 mov dword ptr [ebp-48h],0
00281400 xor eax,eax
00281402 mov dword ptr [ebp-44h],eax
00281405 mov dword ptr [ebp-40h],eax
00281408 mov dword ptr [ebp-3Ch],eax
0028140B mov dword ptr [ebp-38h],eax
0028140E mov dword ptr [ebp-34h],eax
00281411 mov dword ptr [ebp-30h],eax
int u3[N] = { 0, 0, 0, 0, 0, 0, 0};
00281414 mov dword ptr [ebp-6Ch],0
0028141B mov dword ptr [ebp-68h],0
00281422 mov dword ptr [ebp-64h],0
00281429 mov dword ptr [ebp-60h],0
00281430 mov dword ptr [ebp-5Ch],0
00281437 mov dword ptr [ebp-58h],0
0028143E mov dword ptr [ebp-54h],0
[ Szerkesztve ]
hruodnand
senior tag
Szia!
Köszönöm, hogy meglested.
Disassembler se akar működni rendesen. Windows 7 x64 alatt van a CodeBlocks... Nem tudom, hogy számít-e.
Szerintem felrakok egy Ubuntu-t, mert így nem tudok programozni...
Windows mellé nem fogom felrakni, inkább virtuális gép, mert az egész winchesterem TrueCrypt-es. Nem szeretném hazavágni az adataimat.
Ismerős gépén (Ubuntu-val, CodeBlocks-al) tökéletesen megy a program, mármint értéket ad a tömb elemeinek. Érdekes.
kingabo
őstag
Úgy tűnik a vs alapból kinullázza a tömböt, ráadásul a gyorsabb megoldással. Vajon miért nem veszi észre, hogy a többit is lehetne optimalizálni.
hruodnand: Ha megnézed a lenti kódot (az 1db 0-ásat), akkor akár lehet az is a gond, hogy nincs elég 0.
For ciklussal kinullázni esetleg? Így akkor sem lesz gond, ha 8 helyett 22 elemű lesz a tömb.
hruodnand
senior tag
Épp ez az, hogy nem az első tömbbel van gond, hanem a másodikkal. Az első tömböt szépen teleírja, de a másodikat már nem. Ha ugyanúgy adom meg a dolgokat, akkor se tölti fel nullával a második tömbömet.
kispx
addikt
Nos, debuggoltam egy kicsit a Code :: Block alatt és ugyanaz a hiba mint neked. Egy pár említésre méltó érdekesség:
1) ha a tömbdeklaráció után egy printffel kiíratom az u3 tömb egyik elemét, akkor a deklarálásnál mindkét tömböt normálisan kinullázza.
2) ugyanúgy kinullázza az u3 tömböt, ha az u1 tömb egyik elemét íratom ki
3) a szokásos memset(u1, 0, N); memset(u3, 0, N) kezdőértékadásnál is a deklarációnál kinullázza a tömböket.
[ Szerkesztve ]
hruodnand
senior tag
Poén benne, hogy felraktam VMware-ben egy Ubuntu 10.04-est, ráraktam a CodeBlocks-ot és gyönyörűen ad értéket. Tehát... Fejleszteni csak Linux alatt...
Nem tudok jobbat... Vicc. Mármint érdekes.
Jester01
veterán
Itt jegyezném meg, hogy ha egyáltalán nem olvassa a program az adott tömbelemet akkor a fordító nem köteles azt nullázni. Tehát amíg olyan kódot nem mutat valaki ami rosszul működik, addig ez csak "optimalizációs érdekesség" kategória.
Jester
hruodnand
senior tag
Igazad van, de szerintem nyugodtan nullázhatja, attól függetlenül, hogy fogom-e használni az adott tömbelemet vagy sem. Neki kutya kötelessége, ha én azt mondom.
Linux alatt miért működik az érték adás rendesen? Windows alatt pedig miért nem?
Ilyen különbségek lehetnek a kettő között?
Téma tudnivalók
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
Mai Hardverapró hirdetések
prémium kategóriában
- Commlite CM-EF-NEX Auto-Focus Adapter (Canon EF - Sony E)
- Üzletből, garanciával, legújabb Asus Vivobook 17" i7-1355U 10 mag 5GHz/16RAM/1TBSSD/17,3"FULLHD
- Üzletből, garanciával DeLL XPS 15 9500 i7-10750H 32GBRAM 1TBSSD/GTX1650Ti 15,6"4KTOUCH
- i5 12400f 3070 gamer pc
- DeLL Precision 7740 workstation, üzletből, I7-9850H/32RAM/512GBSSD/NVIDIA QuadroRTX3000/17,3"FULLHD