Hirdetés

2024. május 4., szombat

Gyorskeresés

Hozzászólások

(#3051) artiny válasza Korcsii (#3050) üzenetére


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;
}

(#3052) birno válasza Korcsii (#3050) üzenetére


birno
addikt

Csak fura volt elsore, meg szokatlan, nem probaltam meg ilyesmit, Jester01 valtozata mar ismerosebb. :)

(#3053) Korcsii válasza artiny (#3051) üzenetére


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 ]

(#3054) artiny válasza Korcsii (#3053) üzenetére


artiny
őstag

oke.koszi vegul sikerult a fscanf l.

(#3055) Jester01 válasza birno (#3052) üzenetére


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

(#3056) artiny


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))

(#3057) kingabo válasza artiny (#3056) üzenetére


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 ]

(#3058) artiny válasza kingabo (#3057) üzenetére


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 ]

(#3059) artiny válasza artiny (#3058) üzenetére


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]);

(#3060) doc válasza artiny (#3058) üzenetére


doc
nagyúr

a szamot minden lepesben oszd el a szamrendszer alapjaval (jelen esetben 10)

(#3061) kingabo válasza artiny (#3058) üzenetére


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 ]

(#3062) artiny válasza kingabo (#3061) üzenetére


artiny
őstag

Köszönöm a segítségeteket,sikerült így :DDD most már megírni /talán jól is :DDD /

#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;
}

(#3063) kingabo válasza artiny (#3062) üzenetére


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

:C

(#3064) artiny


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 ]

(#3065) kispx


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 ]

(#3066) Korcsii válasza kispx (#3065) üzenetére


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?

(#3067) Jester01 válasza Korcsii (#3066) üzenetére


Jester01
veterán

Ez egy nagyon trükkös optimalizálás.

Jester

(#3068) kispx válasza Korcsii (#3066) üzenetére


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.

(#3069) kovacsakos91


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!

(#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

(#3074) kispx válasza kovacsakos91 (#3069) üzenetére


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.

(#3076) kovacsakos91 válasza kispx (#3074) üzenetére


kovacsakos91
csendes tag

Csak az "bosszant", hogy szinte minden feladatgyűjtemény hasonló feladatokat tartalmaz, de olyat nem találok sehol amilyet linkeltem is. :F

(#3077) Karma válasza kovacsakos91 (#3072) üzenetére


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! :D

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.”

(#3078) kispx válasza kovacsakos91 (#3076) üzenetére


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.

(#3079) kovacsakos91 válasza kispx (#3078) üzenetére


kovacsakos91
csendes tag

Igazából bármilyen témájút, ami hasonló a példához.

(#3080) kovacsakos91 válasza Karma (#3077) üzenetére


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 ]

(#3084) Karma válasza kovacsakos91 (#3080) üzenetére


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.”

(#3085) Rickazoid


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.

(#3086) Jester01 válasza Rickazoid (#3085) üzenetére


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

(#3087) Rickazoid válasza Jester01 (#3086) üzenetére


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.

(#3088) Fenyo12


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.

(#3089) bpx válasza Fenyo12 (#3088) üzenetére


bpx
őstag

a = szam / 100;
szam = szam - a * 100;
b = szam / 10;
szam = szam - b * 10;
c = szam;

(#3090) hruodnand


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. :U

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 ]

(#3091) hruodnand válasza hruodnand (#3090) üzenetére


hruodnand
senior tag

7 elemű a tömb és 7-et rakok bele. :) Csak már megzavarodtam.
Probléma mindig fenn áll még. :U

(#3092) bpx válasza hruodnand (#3090) üzenetére


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 ]

(#3093) hruodnand válasza bpx (#3092) üzenetére


hruodnand
senior tag

Szia!

Köszönöm, hogy meglested.

Disassembler se akar működni rendesen. :U 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. :U Érdekes.

(#3094) kingabo válasza bpx (#3092) üzenetére


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.

(#3095) hruodnand válasza kingabo (#3094) üzenetére


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. :U

(#3096) kispx válasza hruodnand (#3095) üzenetére


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 :W :W
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 ]

(#3097) hruodnand válasza kispx (#3096) üzenetére


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... :U

Nem tudok jobbat... Vicc. Mármint érdekes. :)

(#3098) Jester01 válasza kispx (#3096) üzenetére


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

(#3099) hruodnand válasza Jester01 (#3098) üzenetére


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. :U 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? :U
Ilyen különbségek lehetnek a kettő között?

(#3100) Jester01 válasza hruodnand (#3099) üzenetére


Jester01
veterán

Tévedsz, nem kötelessége.

A különbség pedig nem operációs rendszertől függ hanem fordítóprogramtól (és annak verziójától)

Jester

Copyright © 2000-2024 PROHARDVER Informatikai Kft.