- D1Rect: Nagy "hülyétkapokazapróktól" topik
- hdanesz: Hyundai Ioniq 28kWh - Első benyomások - második felvonás
- btz: Internet fejlesztés országosan!
- Luck Dragon: Asszociációs játék. :)
- sziku69: Fűzzük össze a szavakat :)
- gban: Ingyen kellene, de tegnapra
- koxx: Bloons TD5 - Tower Defense játék
- sziku69: Szólánc.
- ubyegon2: Airfryer XL XXL forrólevegős sütő gyakorlati tanácsok, ötletek, receptek
- sto1911: Pinball FX3 PH! verseny
Új hozzászólás Aktív témák
-
hruodnand
senior tag
válasz
Jester01 #3098 üzenetére
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? -
kispx
addikt
válasz
hruodnand #3095 üzenetére
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. -
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
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.
-
bpx
őstag
válasz
hruodnand #3090 üzenetére
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 -
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, -
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. -
Jester01
veterán
válasz
Rickazoid #3085 üzenetére
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).
-
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? -
Karma
félisten
válasz
kovacsakos91 #3080 üzenetére
Sajnos nem tudom, én amikor használtam könyvtárból vettem ki, úgy hét éve Kecskeméten
-
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
-
kispx
addikt
válasz
kovacsakos91 #3076 üzenetére
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.
-
Karma
félisten
válasz
kovacsakos91 #3072 üzenetére
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ó.
-
kovacsakos91
csendes tag
válasz
Sk8erPeter #3073 üzenetére
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.
-
kispx
addikt
válasz
kovacsakos91 #3069 üzenetére
-
Sk8erPeter
nagyúr
válasz
kovacsakos91 #3072 üzenetére
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. -
kovacsakos91
csendes tag
válasz
Sk8erPeter #3070 üzenetére
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!
-
Sk8erPeter
nagyúr
válasz
Sk8erPeter #3070 üzenetére
Még egy link: [InfoC portál]
-
Sk8erPeter
nagyúr
-
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/9NtteJguA válaszokat előre is köszönöm!
-
Jester01
veterán
válasz
Korcsii #3066 üzenetére
Ez egy nagyon trükkös optimalizálás.
-
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);
} -
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. -
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
válasz
kingabo #3061 üzenetére
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
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! -
artiny
őstag
válasz
kingabo #3057 üzenetére
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?
-
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) -
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))
-
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.
-
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.
-
artiny
őstag
válasz
Korcsii #3050 üzenetére
(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;
} -
Korcsii
őstag
-
Jester01
veterán
Van több is
while(d != '1');
Ide nem karakter konstans kell, csak simán egy szám.Másik probléma, hogy a d-be számítod ki az új értéket de az a-t használod.
Kicsit letisztázva ilyesmi lehet:
#include <stdio.h>
int main(void)
{
int a;
scanf("%d",&a);
do
{
if (a % 2 == 0)
{
a = a / 2;
} else {
a = a * 3 + 1;
}
printf("%d\n", a);
} while (a != 1);
return 0;
} -
artiny
őstag
válasz
WonderCSabo #3045 üzenetére
köszi a válaszokat
esetleg erre:
pl. irj egy fol progit ami bekér egy számot,ha páros,akkor irja ki a felét a számnak ,ha nem akkor irja ki a haromszorosát es adjon hozzá egyet. Csak akkor áll le a progi ha valamelyik érték 1 -s lessz. pl. 3 számra ezt fogja kiirni 3, 10, 5, 16,
8, 4, 2, 1. Gondolod hogy valaha is megáll a program futása.#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
int a,d,egy = 1;
scanf("%d",&a);
do{
d=a%2;
if (d == 0)
{
printf("\n%d ",d=a/2);
}
else{
printf("\n%d ",d=a*3+1);
}
}while(d != '1');
return 0;
}
Erre jutottam,de valmi gond van vele -
Jester01
veterán
válasz
WonderCSabo #3043 üzenetére
Azok közül csak a gets vár entert, a többinél csak azért látszik úgy, mert az alatta lévő réteg eleve soronként pufferel. Ennek kikapcsolása vagy megkerülése sajnos platformfüggő.
-
artiny
őstag
válasz
WonderCSabo #3041 üzenetére
koszi szepen
getchar,gets,scanf ezeken kozzul melyik a jo megoldas ilyes fajta feladatoknal?
-
artiny
őstag
/C/ hogyan irjuk meg olyan feladatokat amik ugy szolnak, pl. irjon programot ami addig olvas be karaktereket amig nem adjuk meg az X -et?
Ez igy helyes,kezdo szintu megoldas,
Irjon progit ami addig olvasbe karaktereket amig nem adjuk meg az X -et,majd a vegen irja ki hanyszor szerepelt az A betu a beolvasottak kozott.
A kerdesem hogy nem all meg rogton a beolvasas pedig megadtam az X -t ,csak akkor ha az entert lenyomom akkor ertekeli ki hogy megadtam e vagy nem.#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define konstans 'A'
int main(void)
{
char b;
int szamlalo=0;
printf("Adjon meg betuket, az 'X' jelzi a veget \n\n");
while(b != 'X'){
scanf("%c",&b);
if (b ==konstans){
szamlalo++;
}
}
printf("\n A betuk szama: %d\n",szamlalo);
return 0;
}Probaltam volna gets(b); a scanf("%c",&b); helyett,de ez a hiba jon ki:
Compiling...
yt.cpp
D:\VB6\yt\yt.cpp(17) : error C2664: 'gets' : cannot convert parameter 1 from 'char' to 'char *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
yt.obj - 1 error(s), 0 warning(s)VB 6.0 hasznalok
-
Jester01
veterán
válasz
WonderCSabo #3038 üzenetére
Főleg, hogy ennek olyan szaga van, hogy valakivel megíratta a tanár meg lebuktatta...
-
vorosbv
csendes tag
Sziasztok! Egy kis segítségre lenne szükségem! Nemrég kezdtem a programozást, és van egy félévi feladatom, amit el is kéne magyarázni, de az egyik részét nem igazán értem! Ez lenne az:
int ellenorzes (char *str) {
if (!str || !*str)
return 0;
char c;
while(c=*str++)
if(c<'0' || c>'9')
return 0;
return 1;
}
Ez egy telefonszám-ellenőrző program részlete, és főként az első 3 sorát nem vágom. Persze a tanár abba kérdezett bele (miért *str, miért char van előtte, mi a funkciója, mit jelent az alatta lévő sor...). Nagyon nagy segítség lenne, ha leírni vki ennek az egésznek az értelmét! -
artiny
őstag
Olyan progit akarok,ami egy kisebb szamot...harmadik gyokre emel amit beolvassunk a billentyuzetrol...de mikor megadok egy szamot...mindig ketszer keri be a szamot mire kiirja:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
int a;
scanf("%d\n",&a);
a= a*a*a;
printf("%d\n",a);
return 0;
} -
Zefír
őstag
Sziasztok!
Egy olyan kérdéssel fordulnék felétek, hogy szeretnék megtanulni c-nyelveken programozni, viszont jelenleg, nincsen pénzem megvenni programozó könyveket, ezért valami olyan lehetőséget keresek, ami letölthető netről, és az alapoktól bevezet a C-programozásba, ja és persze MAGYAR. A végső célom, hogy objecitve orientált programozzak, mobileszközökre szeretnék fejleszteni, ( de persze ez csak egy cél, amit kitűztem, majd idő kőzben elvállik.)Bocsánatot kérek, ha a topikban leírtátok 1000-szer, de nagyonsokszor az van, hogy megtalálok egy jó könyvet, letöltő linkel, és elavult, leszedték a szerverről, ezért szeretnék aktuális választ kapni.
Talán még az fontos lehet, hogy MAC-em van, (osx lion) bár ez nem befolyásol semmit.
Előre is hatalmas köszönet a válaszokért!!!!
Üdv: Andrew
-
artiny
őstag
válasz
WonderCSabo #3030 üzenetére
igen sajnos nem sikerult...
ezert most neki allok minden fele ebooknak ami van C bol es elolvasom oket ..majd gyakorlasnak szeretnek egy feladatgyujtemenyt hogy ha nem megy a porgram akkor legalabb lassam,hogy kellet volna...
-
artiny
őstag
tudtok segiteni..egy olyan felaladgyujtemeny kene ami kezdoknek programok vannak es megoldasokkal egyutt? C ben
-
artiny
őstag
CSV fájl szétdarabolása strtok () függvény segítségével?
Ilyan adat szerepel a csv fájlban.akcia;action;0;0
autobus;bus;0;0
budova;building;0;0
celkom;quite;0;0
centrum;centre;0;0ezt csv fajlban hogyan kell szetdarabolni?
Beolvasas a csv fájlnak és szetdarabolas majd kiiratas..hogyan kéne?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {
FILE *doo = fopen("slovnik.csv", "r");
fclose(doo);
return 0;
}Strtok()
Example:
char str[] = "now # is the time for all # good men to come to the # aid of their country";
char delims[] = "#";
char *result = NULL;
result = strtok( str, delims );
while( result != NULL ) {
printf( "result is "%s"\n", result );
result = strtok( NULL, delims );
}OUTPUT:
result is "now "
result is " is the time for all "
result is " good men to come to the "
result is " aid of their country" -
artiny
őstag
C programot átírni, valaki megtudná csinálni?
Van egy alap program:
ez egy szotar akar lenni..
Randomban adja a magyar szavakat es angolra kell forditani. Ha nem jo akkor kiirja a helyes megoldast. MIkor kilepunk a programbol akkor irja ki azokat a szavakat amire rosszul válaszotltunk.Itt a magyar vezioja /Szaab nevű programozó érdeme/:
http://pastebin.com/ViFeNimBItt pedig a szlovak,amiben több minden meg van valositva/be van fejezve/
http://pastebin.com/jbP8N18FEzt a programot kell átiri:
Olyan feladat van,hogy az előző szótárt kell át írni,hogy ezt a fájlt CSV /ezt kell használni/ olvassa be:
http://www.mediafire.com/?057r7i17uklqi7tEl kell tárolni a helyes/nem helyes válaszok számát egy csv fájlba/azt hiszem hogy a slovnik.csv fájlba/ és dolgozni/számolni vele ha újra belép a felhasználó. A program engedélyezi/lehetővé teszi ,hogy újabb szavakat tudjon a felhasználó elmenteni a szótár fájlban és azokat abcd szerint lesznek majd sorba téve.
A baj hogy mar az elejen elakadtam...
Ha beolvasom a csv fájlt:
FILE *doo = fopen("slovnik.csv", "r");
ekkor:
hlboko;deep;0;0igy teszi ki nem pedig csak a hlboko szavat.Hogyan kell megcsinalni hogy csak a hlbko -t irja ki?
-
Jester01
veterán
Ahogy mondod
Mivel a main a kapcsolat a futo és a futolepes között, így először futo-ból kellene visszaadni a main-be, majd onnan tovább. A helyzetet bonyolítja, hogy 2 értékről van szó. Egy lehetséges megoldás ha definiálsz egy struktúrát a két értéknek és azt adogatod, valahogy így:struct pozicio
{
int sor;
int oszlop;
};
struct pozicio futo(char tabla[TABLA_MERET][TABLA_MERET], char input[3])
{
struct pozicio p;
...
return p;
}
...
void futolepes(char tabla[TABLA_MERET][TABLA_MERET], struct pozicio p)
{
...
}
...
int main()
{
struct pozicio p;
...
p = futo(tabla, input);
gyalog(tabla, input);
futolepes(tabla, p);
...
}A naív megoldás persze a globális változók használata lenne, de az általában nem ajánlott.
-
e=mc²
őstag
Sziasztok!
Szeretnek segitseget kerni az alabbi programhoz:
#include <stdio.h>
#define TABLA_MERET 8
void futo(char tabla[TABLA_MERET][TABLA_MERET], char input[3]){
int sor, oszlop;
printf("Kerem a futo poziciojat:");
scanf("%s", input);
sor = input[1] - '1';
oszlop = input[0] - 'a';
tabla[sor][oszlop] = 'f';
}
void gyalog(char tabla[TABLA_MERET][TABLA_MERET], char input[3]) {
int sor, oszlop;
do {
printf("Kerem a gyalogok helyzetet:");
scanf("%s", input);
if (input[0] != '*') {
sor = input[1] - '1';
oszlop = input[0] - 'a';
tabla[sor][oszlop] = 'g';
}
} while (input[0] != '*');
}
void futolepes(char tabla[TABLA_MERET][TABLA_MERET]){
int i, sor, oszlop;
int bl = 0;
int bf = 0;
int jl = 0;
int jf = 0;
for (i=sor+1; i<TABLA_MERET; i++) {
//balra le
if ((oszlop+(sor-i) >= 0) && !bl) {
if (tabla[i][oszlop+(sor-i)] != 'g') {
tabla[i][oszlop+(sor-i)] = '*';
}else {
bl++;
}
}
//jobbra le
if ((oszlop-(sor-i) < TABLA_MERET) && !jl) {
if (tabla[i][oszlop-(sor-i)] != 'g') {
tabla[i][oszlop-(sor-i)] = '*';
}else {
jl++;
}
}
}
for (i=sor-1; i>-1; i--) {
//jobbra fel
if ((oszlop+(sor-i) < TABLA_MERET) && !jf) {
if (tabla[i][oszlop+(sor-i)] != 'g') {
tabla[i][oszlop+(sor-i)] = '*';
}else {
jf++;
}
}
//balra fel
if ((oszlop-(sor-i) >= 0) && !bf) {
if (tabla[i][oszlop-(sor-i)] != 'g') {
tabla[i][oszlop-(sor-i)] = '*';
}else {
bf++;
}
}
}
}
void kiir(char tabla[TABLA_MERET][TABLA_MERET]) {
int i, j;
printf("A tabla:\n");
printf("\n ");
for (i=0; i<TABLA_MERET; i++) {
printf("%c ",'A'+i);
}
printf("\n");
for (i=0; i<TABLA_MERET; i++) {
printf("%d ", i+1);
for (j=0; j<TABLA_MERET; j++) {
if (tabla[i][j] != '\0') {
printf("|%c", tabla[i][j]);
} else {
printf("|%c", '.');
}
}
printf("|\n");
}
printf("\n");
}
int main() {
char tabla[TABLA_MERET][TABLA_MERET];
int i, j;
char input[3];
for (i=0; i<TABLA_MERET; i++) {
for (j=0; j<TABLA_MERET; j++) {
tabla[i][j] = '\0';
}
}
futo(tabla, input);
gyalog(tabla, input);
futolepes(tabla);
kiir(tabla);
return 0;
}Ez igy elszall hibaval a futolepes fuggvenyben, meghozza ha minden igaz az oszlop erteke miatt. Hogy lehetne oda atadni a futo aktualis helyzetet a a futo fv-bol? tabla[sor][oszlop]
Ha a gyalog fuggveny fut le elobb, mint a futo fv, akkor jo.
koszi, udv,
-
válasz
Jester01 #3021 üzenetére
Nem tudom, hogy hova masolod ki, nekem Notepad++-ba, meg vim-be is 3 szokoz maradt.
A kolleganak tovabbra is ajanlom, hogy ha nem is kabinetes gepen irja meg, de mindenkepp ott forditsa es ellenorizze a progit, mert ott azonnal kitunt, hogy tobb szokoz van a kelletenel s a Bironal is valszeg ezert hasal el.
-
vanek
tag
válasz
Jester01 #3011 üzenetére
A lineáris algebrából jól ismert linearis diofantoszi egyenlet megoldásának a megvalósítása a feladat.
Tekintsük a lineáris difantoszi egyenleteket a következő alakban:
ax - by = c , ahol a, b, c eleme Z+
Ekkor keressük azt az x, y egész számpárt, amely a legkisebb nem negatív megoldása az egyenletnek,
amennyiben létezik megoldás. Ennek menete a következő: d = lnko(a, b), ahol a = d * av, b = d * bv
és c = d * cv. Ha c nem osztható d-vel, akkor nincs megoldás, különben oldjuk meg az av *x0+bv * y0 = 1
egyenletet az egész számok halmazán az euklideszi algotritmussal (az lnko-t is ezzel tudjuk kiszámolni).
Pl.: 1027 * x0 + 712 * y0 = 1 esetén1027 = 712 * 1 + 315
712 = 315 * 2 + 82
315 = 82 * 3 + 69
82 = 69 * 1 + 13
69 = 13 * 5 + 4
13 = 4 * 3 + 10 + 1 * 3 = 3;
1 + 3 * 5 = 16;
3 + 16 * 1 = 19;
16 + 19 * 3 = 73;
19 + 73 * 2 = 165;
73 + 165 * 1 = 238;A második részt az első részben kapott számok segítségével számolva végül megkapjuk a két számot: 165
és 238. Ez után ki kell próbálni, hogy mi lehet a két szám előjele (4 variáció). Majd ha az előző megoldás
volt av * x+bv * y = 1 -re, akkor av * x0 - bv * (-y0) = 1 lesz, ami nekünk kell. Végül az eredeti egyenlet
megoldását kapjuk, ha vissza szorzunk cv * d-vel:av * x0 - bv * (-y0) = 1
av * x0 * cv - bv * (-y0) * cv = cv
d * av * x0 * cv - d * bv * -y0 * cv = a * (x0 * cv) - b * (-y0 * cv) = c = d * cvTehát x = x0 * cv és y = -y0 * cv megoldás, de nem feltétlenül a két legkisebb nemnegatív, tehát ezt még
meg kell keresni: x- = k * bv és y- = k * av mind megoldások bármely k eleme Z-re. Keresd meg a megfelelő
k-t és kész vagy.Bemenet: be.txt a, b, c
Kimenet: ki.txt x, yPl:
Be: 53,8,64
Ki: 8,45Be: 516,390,564
Ki: 54,70 -
vanek
tag
válasz
WonderCSabo #3008 üzenetére
közben letelt a határidő..
de van más problémám is..
szóval a feladatom a lineáris diofantoszi egyenlet..
próbálkoztam a megírásával..de nem sokáig jutottam..a legnagyobb közös többszörös még ment..de utána már problémám volt...be kell vallani, hogy nem könnyű program..
szerencsémre, vagy nem..de véletlen rátaláltam a kész programra..igaz, nem volt nehéz, mivel csak be kellett írnom..nah de a lényeg, hogy ,tanulva a hibámból megnéztem a példában szereplő példákat és mindegyik a helyes eredményt adja vissza..
#include <stdio.h>
#include <stdlib.h>
#define HAMIS 0
#define IGAZ 1
int lnko(int x, int y) {
int maradek;
int temp;
if (y > x) {
temp = y;
y = x;
x = temp;
}
maradek = y;
while (y != 0) {
if ((x % y) == 0) {
break;
}
maradek = x % y;
x = y;
y = maradek;
}
return maradek;
}
void euklidesziAlg(int av, int bv, int* x0, int* y0) {
int i;
int szorzo[100];
int darab = 0;
int maradek;
int temp;
int avSeged;
int bvSeged;
int x0Seged;
int y0Seged;
int voltCsere = HAMIS;
avSeged = av;
bvSeged = bv;
if (bv > av) {
temp = bvSeged;
bvSeged = avSeged;
avSeged = temp;
voltCsere = IGAZ;
}
if (bvSeged != 1) {
do {
szorzo[darab] = avSeged / bvSeged;
maradek = avSeged % bvSeged;
avSeged = bvSeged;
bvSeged = maradek;
darab++;
} while (maradek != 1);
maradek = 0;
x0Seged = 1;
for (i = darab-1; i >= 0; i--) {
y0Seged = maradek + x0Seged * szorzo[i];
if (i > 0) {
maradek = x0Seged;
x0Seged = y0Seged;
}
}
} else {
x0Seged = 1;
y0Seged = 1 - avSeged;
}
if (voltCsere) {
temp = y0Seged;
y0Seged = x0Seged;
x0Seged = temp;
}
if (-av*x0Seged + bv*y0Seged == 1) {
x0Seged *= -1;
} else if (av*x0Seged - bv*y0Seged == 1) {
y0Seged *= -1;
} else if (-av*x0Seged - bv*y0Seged == 1) {
x0Seged *= -1;
y0Seged *= -1;
}
*x0 = x0Seged;
*y0 = -y0Seged;
}
int main() {
FILE *f, *fk;
int a;
int b;
int c;
int d;
int av;
int bv;
int cv;
int x0;
int y0;
int x;
int y;
int teszt;
f=fopen("be.txt", "r");
fk=fopen("ki.txt", "w");
if(f==NULL)
{
exit (-1);
}
teszt=fscanf(f, "%d %d %d", &a, &b, &c);
if(teszt!=3)
{
fprintf(fk, "0\n");
}
else
{
d = lnko(a, b);
av = a / d;
bv = b / d;
cv = c / d;
if (c % d == 0) {
euklidesziAlg(av, bv, &x0, &y0);
x = x0 * cv;
y = y0 * cv;
while (x < 0 || y < 0) {
x += bv;
y += av;
}
while (x-bv >= 0 && y-av >= 0) {
x -= bv;
y -= av;
}
fprintf(fk,"%d %d\n\n", x, y);
}
else {
fprintf(fk, "0\n");
}
fclose(f);
fclose(fk);
return 0;
getchar();
}
}de ha feltöltöm a bíróra..nincs helyes eredmény..
lehet, hogy a nagy zűrzavarban félrenéztem valamit..
tudom, hogy így csak nekem lesz nehezebb a vizsga..de hátha tanulok belőle..
köszi előre is!
-
Jester01
veterán
válasz
WonderCSabo #3006 üzenetére
Tévedés:
A bemenet két sorból áll. Mindkét sorban egy-egy szóközt nem tartalmazó, legalább egy de maximum 255 karakter hosszú sztring található, melyeket rögtön sorvégejel követ.
Mind a két sor végén kellene \n legyen. És akkor már nem működik.
-
Becopyznád a jelenlegi teljes programodat?
Mert en most megneztem az eredeti kododdal, meg a javitasokkal is, de mar a linkelt pdf-ben szereplo peldat hasznalva is helytelen eredmenyt ad...
Meg milyen kornyezetben probaltad te ezt?
En egy kabinetes gepen futtattam s ott adott vissza rosszat s ugye a Biro is ugyanilyen kornyezetben futtattja majd.Szerk: Latom Jester01 megelozott.
-
Jester01
veterán
válasz
WonderCSabo #3003 üzenetére
Nekem nem. Hol vágja le a sorvég jelet amit az fgets beolvas?
(gdb)
40 fgets(s,256,f);
(gdb)
41 fgets(d,256,f);
(gdb)
43 kimenet=vizsgal(s,d);
(gdb) x/s s
0x7fffffffe5d0: "abrakadabra\n"
(gdb) x/s d
0x7fffffffe4d0: "rak\n"A vizsgal függvénynek meg kutya kötelessége az egész stringet nézni a lezáró 0-ig, vagyis a \n-t is. Így pedig csak a sor végén fog egyezni.
255-nél hosszabbra nem is kell működnie, de ez már 255-re sem működik, amire még kellene. A tesztelő meg lehet, hogy gonosz módon ki is próbálja azt.
-
WonderCSabo
félisten
válasz
Jester01 #3002 üzenetére
Ezáltal egyfelől csak akkor találod meg a dolgokat ha az éppen a sor végén van
Miért is? Én lefuttattam a progit a kijavított keresőfv-el, megtalált mindent, ezzel nem volt gond. Nyilván 255-nél hosszabb stringekre nem próbáltam meg.
Egyébként a maint nem nagyon néztem, csak az algoritmust.
-
Jester01
veterán
Ez nagyon kreatívan megírt program. Ha ember bírálná el, nem sok jó származna belőle.
Mindenesetre a baj az fgets körül lehet, az ugyanis eltárolja a sorvég jelet is. Ezáltal egyfelől csak akkor találod meg a dolgokat ha az éppen a sor végén van, másfelől pedig a 255 hosszú sorokon elcsúszik a feldolgozás (és onnan már nem is jön helyre). Jelen formájában a feladatkiírásban lévő példára sem működik, nem értem ezt hogy nem vetted észre.
-
WonderCSabo
félisten
Megírtam egy picit más megközelítéssel. Nem lehet, hogy a mainben rossz vmi? Én most már fáradt vagyok elemezni ezt a bonyolult problémát.
int vizsgal(char s1[], char d1[])
{
int i, j;
int b = 1;
for(i = 0; i<= strlen(s1)-strlen(d1); ++i)
{
for(j=0; j < strlen(d1); ++j)
{
if(s1[i+j-1] != d1[j])
{
b = 0;
break;
}
else
b = 1;
}
if(b)
return i-1;
}
return i-1;
}
Ú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!
- Eladó konfig! Ryzen 7 7800X3D 2TB SSD 64GB DDR5 RX9070XT 16GB!
- Új, makulátlan állapotú Samsung Galaxy Buds FE, fehér, fél év garancia
- Új, makulátlan állapotú Samsung Galaxy Watch7 44mm ezüst, 2 év garancia
- Új, makulátlan állapotú Samsung Z Fold 6 256GB Tengerészkék, független, 2 év garancia
- Használt TP-Link Deco M4 - AC1200 Router (Mesh-ként is használható)
- ÁRGARANCIA!Épített KomPhone i5 14600KF 32/64GB DDR5 RAM RTX 5070Ti 16GB GAMER PC termékbeszámítással
- ÁRGARANCIA!Épített KomPhone i5 12400F 16/32/64GB RAM RX 7600 XT 16GB GAMER PC termékbeszámítással
- BESZÁMÍTÁS! MSI Z77 MPOWER Z77 chipset alaplap garanciával hibátlan működéssel
- MacBook felvásárlás!! Macbook, Macbook Air, Macbook Pro
- Lenovo Thinkpad T14 üzleti i5-10310u 10th gen. 8-32Gb RAM 256GB-1TB SSD gar.
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged