Hirdetés

2024. május 13., hétfő

Gyorskeresés

Hozzászólások

(#501) ltz400


ltz400
csendes tag

Sziasztok!
Még kezdő vagyok programozás terén.C nylvet kezdtem el tanulni.Segítségeteket szeretném kérni.Kellene egy olyan program amely bekér két számot majd eldönti páros vagy páratlan.Asszem modf-el kéne valamit ügyeskedni hogy ha elosszuk a számot 2-vel és nincs maradék páros ha van páratlan.

(#502) doc válasza ltz400 (#501) üzenetére


doc
nagyúr

modf? sosem hallottam rola :D

annak eldontese hogy paros-e az x szam: !(x%2)
tehat pl:
if (!(x%2)) printf("paros\n");
else printf("paratlan\n");

(#503) ltz400 válasza doc (#502) üzenetére


ltz400
csendes tag

pedig létezik:)
Megtennéd hogy leírod az egész programot?
PLS

[ Szerkesztve ]

(#504) amargo válasza ltz400 (#503) üzenetére


amargo
addikt

A moduló jobb erre, de Te ezt kerested:

//------------------------------------------
int rounder(double pix)
{
double egesz = 0, tort = 0;
tort = modf(pix,&egesz);
if(tort >= 0.5)
{
pix = ceil(pix);
}
else if(tort < 0.5)
{
pix = floor(pix);
}

return pix;
}//int rounder
//------------------------------------------

Szerk:
Kódba raktam

[ Szerkesztve ]

“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”

(#505) Fire/SOUL/CD válasza doc (#502) üzenetére


Fire/SOUL/CD
félisten

Hali!

Hát szomorú ha nem hallottál róla, a MATH.H-ban van. Egy lebegőpontos számot "oszt" két részre, egész ill törtrészre. (vagy egyszerűbben a tizedespont jobb oldalára ill bal oldalára)
persze abban egyetértek, hogy eldönteni egy számról, hogy páros vagy páratlan tök felesleges használni(de lehet)

Fire.

UI: amargo kódja, már kerekítéssel is foglalkozik(0,5-től felfelé kerekítünk, egyébként meg lefeleé)
Annyi "kritika", ha valami NEM NAGYOBB EGYENLŐ MINT 0,5, akkor felesleges az ELSE után az összehasonlítás.... :DDD (Amargo kódjáról van szó)

[ Szerkesztve ]

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#506) ltz400 válasza amargo (#504) üzenetére


ltz400
csendes tag

Sajnos nem nagyon akar futni.:(
Ötlet?
Neked megy?

(#507) doc válasza Fire/SOUL/CD (#505) üzenetére


doc
nagyúr

ja, kozben utananeztem hogy mit is csinal, de sosem volt ra szuksegem :)
ltz400: ez nem teljes program, csak egy fuggveny, ha mindenaron modf-et akarsz hasznalni, akkor meghivhatod a megadott szammal mint parameterrel

[ Szerkesztve ]

(#508) amargo válasza Fire/SOUL/CD (#505) üzenetére


amargo
addikt

Jogos!
Én csak alakiságot figyeltem.

“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”

(#509) ltz400 válasza doc (#507) üzenetére


ltz400
csendes tag

Megteszed hogy leírod a program teljes forráskódját?
Bocsi a sok offért.

(#510) !wannabe válasza ltz400 (#509) üzenetére


!wannabe
tag

Nem OFF-ban írkálsz

(#511) rothkrisz


rothkrisz
csendes tag

Sziasztok segítséget szeretnék kérni.

Sakktáblarajzoló programot kellen írnom ami a megrajzolt sakktáblán 1,2,5 ös számokat helyez el pl.A32(A oszlop 3 sor egy 2 érme kerül.)

a bekérés * jelig tart.

Remélem érthető

előre is Köszönöm

(#512) Fire/SOUL/CD válasza rothkrisz (#511) üzenetére


Fire/SOUL/CD
félisten

Hali!

Kellemes feladatokat kaptok, nekem is jó, mert "retrózhatok". :DDD
Nos, több megoldása is lehet a feladatnak, Én az alábbi módszert választottam, elsősorban mert x64 Vista alatt ne futnak a DOS-os c/cpp editorok, ebből adódóan a kurzorpozicíóval, assembly betéttel, megszakításokkal nem tudok mit kezdeni.(ugyanis úgy is meg lehetett volna oldani, hogy egyből megjelenik a tábla, és egyből megjelenik rajt a bevitt mezőn az "érme"....)

Lesz bent egy teljesen kikommentezett rész, azt csak azért hagytam bent, hogy még egy mátrix definíciót is láss. Sajna ott viszont már "keményen" mútatókkal lehet volna csak operálni, és ha valaki nincs tisztában velük, akkor tényleg nem fog érteni belőle semmit....

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CB_XY 17

/*
unsigned char ChessBoard_Matrix[][CB_XY]={
"╔","═","╦","═","╦","═","╦","═","╦","═","╦","═","╦","═","╦","═","╗",
"║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║",
"╠","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╣",
"║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║",
"╠","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╣",
"║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║",
"╠","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╣",
"║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║",
"╠","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╣",
"║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║",
"╠","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╣",
"║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║",
"╠","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╣",
"║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║",
"╠","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╬","═","╣",
"║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║"," ","║",
"╚","═","╩","═","╩","═","╩","═","╩","═","╩","═","╩","═","╩","═","╝"

};
*/

int ChessBoard_Matrix[CB_XY][CB_XY]={
{0xC9,0xCD,0xCB,0xCD,0xCB,0xCD,0xCB,0xCD,0xCB,0xCD,0xCB,0xCD,0xCB,0xCD,0xCB,0xCD,0xBB},
{0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA},
{0xCC,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xB9},
{0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA},
{0xCC,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xB9},
{0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA},
{0xCC,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xB9},
{0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA},
{0xCC,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xB9},
{0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA},
{0xCC,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xB9},
{0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA},
{0xCC,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xB9},
{0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA},
{0xCC,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xCE,0xCD,0xB9},
{0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA,0x20,0xBA},
{0xC8,0xCD,0xCA,0xCD,0xCA,0xCD,0xCA,0xCD,0xCA,0xCD,0xCA,0xCD,0xCA,0xCD,0xCA,0xCD,0xBC}

};

int main()
{
int i,j,k;
char str[256];

while(0==0) {
printf("Enter coordinate and value: ");
strupr(gets(str));
if (str[0]=='*') { printf("\nGenerating Chessboard\n\n"); break; }
if (!strlen(str) || strlen(str)>3) { printf("Bad SIZE found [%s=>%d], skipped...\n",str,strlen(str)); continue; }
if (str[0]<'A' || str[0]>'H') { printf("Bad COLUMN found [%c], skipped...\n",str[0]); continue; }
if (str[1]<'1' || str[1]>'8') { printf("Bad ROW found [%c], skipped...\n",str[1]); continue; }
if (str[2]!='1' && str[2]!='2' && str[2]!='5') { printf("Bad VALUE found [%c], skipped...\n",str[2]); continue; }

ChessBoard_Matrix[('8'-str[1])*2+1][(str[0]-'A')*2+1]=str[2];
}

for(i=0,k=8;i<CB_XY;i++) {
if ((i % 2)) printf("%d ",k--);
else printf(" ");
for(j=0;j<CB_XY;j++)
printf("%c",ChessBoard_Matrix[i][j]);
printf("\n");
}
for(printf(" "),i=0;i<8;printf("%c ",'A'+i),i++);

printf("\n\n");

return 0;
}

Fire.

UI: remélem jól értelmeztem a feladatot... :U

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#513) Fire/SOUL/CD válasza rothkrisz (#511) üzenetére


Fire/SOUL/CD
félisten

Hali!

Elnézésedet kérem, de voltam olyan ügyes, hogy nem olvastam el a privát üzeneted. :W
Majd ránézek ígérem, mert az általam kreált kód, "enyhén szólva" nem hasonlít a forrásodra a privátban.

Mégegyszer, bocsi! :(((

Fire.

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#514) Fire/SOUL/CD válasza Fire/SOUL/CD (#513) üzenetére


Fire/SOUL/CD
félisten

Hali!

Küldtem privbe.

Fire.

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#515) ltz400


ltz400
csendes tag

Nekem nem tudtok segíteni?

(#516) Fire/SOUL/CD válasza ltz400 (#515) üzenetére


Fire/SOUL/CD
félisten

Hali!

Még az a páros-páratlan dolog érdekel? Esetleg a "teljes" forrás érdekel?
Írd le mégegyszer légyszives(vagy link), ha tudok segítek...

Fire.

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#517) !wannabe válasza Fire/SOUL/CD (#516) üzenetére


!wannabe
tag

Szerintem ez érdekli. Jaja ez a páratlan-páros dolog, viszont header file-okkal, szóval teljes kód az igény ha jól értelmezem.

[ Szerkesztve ]

(#518) speedtouch


speedtouch
csendes tag

Hali!

Lenne egy olyan gondom, hogy visual studioban olyan programot kell írnom, ami ha bekér egy számot, akkor azt LDC-el formátumban mutassa majd ki. Az lenne a probléma, hogy nem tudom, hogy állítsam be ezt a formát hozzá.

(#519) Fire/SOUL/CD válasza speedtouch (#518) üzenetére


Fire/SOUL/CD
félisten

Hali!

Sajna VS-ben nem dolgozom, de ha egy példával illusztrálnád, hogy VS-ben mi is az a LDC formátum, az sokat segítene... :DDD

pl: 1234567 a szám és ebből lesz 1980.01.01 vagy valami

Fire.

[ Szerkesztve ]

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#520) speedtouch


speedtouch
csendes tag

http://e-oktat.pmmf.hu/webgui/www/uploads/images/677/hf2.pdf

Itt a 9-es feladat. (lehet, hogy rosszul fogalmaztam az előbb)

(#521) Fire/SOUL/CD válasza speedtouch (#520) üzenetére


Fire/SOUL/CD
félisten

Hali!

:DDD :DDD :DDD
Így már más, LCD nem LDC, így érthető...

.NET-be sajna nem tudok segíteni(ezért most nem pakolom fel a VS-t), de ha sima C megfelel, akkor oké.

Fire.

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#522) speedtouch


speedtouch
csendes tag

Bocsi a helytelen leírásért, még korán volt, mikor írtam :DDD
Bármilyen segítségnek nagyon örülnék, hátha el tudok indulni utánna :)

(#523) Fire/SOUL/CD válasza speedtouch (#522) üzenetére


Fire/SOUL/CD
félisten

Hali!

A kód Code::blocks-ban íródott, sima Ansi C. Ha valami nem érthető esetleg, akkor írj nyugodtan.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CS_Y 38
#define CS_X 5

int LCD_Digits[CS_X][CS_Y]={
{0x20,0xC9,0xCD,0xBB, 0x20,0xCB, 0x20,0xCD,0xCD,0xBB, 0x20,0xCD,0xCD,0xBB, 0x20,0xCB,0x20,0xCB, 0x20,0xC9,0xCD,0xCD, 0x20,0xC9,0xCD,0xCD, 0x20,0xCD,0xCD,0xBB, 0x20,0xC9,0xCD,0xBB, 0x20,0xC9,0xCD,0xBB},
{0x20,0xBA,0x20,0xBA, 0x20,0xBA, 0x20,0x20,0x20,0xBA, 0x20,0x20,0x20,0xBA, 0x20,0xBA,0x20,0xBA, 0x20,0xBA,0x20,0x20, 0x20,0xBA,0x20,0x20, 0x20,0x20,0x20,0xBA, 0x20,0xBA,0x20,0xBA, 0x20,0xBA,0x20,0xBA},
{0x20,0xBA,0x20,0xBA, 0x20,0xBA, 0x20,0xC9,0xCD,0xBC, 0x20,0xCD,0xCD,0xB9, 0x20,0xC8,0xCD,0xB9, 0x20,0xC8,0xCD,0xBB, 0x20,0xCC,0xCD,0xBB, 0x20,0x20,0x20,0xBA, 0x20,0xCC,0xCD,0xB9, 0x20,0xC8,0xCD,0xB9},
{0x20,0xBA,0x20,0xBA, 0x20,0xBA, 0x20,0xBA,0x20,0x20, 0x20,0x20,0x20,0xBA, 0x20,0x20,0x20,0xBA, 0x20,0x20,0x20,0xBA, 0x20,0xBA,0x20,0xBA, 0x20,0x20,0x20,0xBA, 0x20,0xBA,0x20,0xBA, 0x20,0x20,0x20,0xBA},
{0x20,0xC8,0xCD,0xBC, 0x20,0xCA, 0x20,0xC8,0xCD,0xCD, 0x20,0xCD,0xCD,0xBC, 0x20,0x20,0x20,0xCA, 0x20,0xCD,0xCD,0xBC, 0x20,0xC8,0xCD,0xBC, 0x20,0x20,0x20,0xCA, 0x20,0xC8,0xCD,0xBC, 0x20,0xCD,0xCD,0xBC}

};

int main()
{
int i,j,LCD_Digit_Index,LCD_Digit_Width,k;
char num[255];

printf("Type INTEGER number: ");

if (!strlen(gets(num))) {
printf("\n\nINTEGER not found...\nShow all LCD digits and EXIT\n\n");
for (i=0;i<CS_X;i++) {
for (j=0;j<CS_Y;j++)
printf("%c",LCD_Digits[i][j]);
printf("\n");
}
return -1;
}

printf("\n\n");
for (i=0;i<strlen(num);i++)
if(num[i]<'0' || num[i]>'9') {
printf("Is NAN [Not A Number]...\nEXIT");
return -1;
}

for (i=0;i<CS_X;i++) {
for (j=0;j<strlen(num);j++) {
LCD_Digit_Index = num[j]-'0'>1 ? (num[j]-'0')*4-2 : (num[j]-'0')*4;
LCD_Digit_Width = num[j]-'0'==1 ? 2 : 4;
for (k=0;k<LCD_Digit_Width;k++)
printf("%c",LCD_Digits[i][LCD_Digit_Index+k]);
}
printf("\n");
}

return 0;
}

Fire.

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#524) speedtouch válasza Fire/SOUL/CD (#523) üzenetére


speedtouch
csendes tag

Hali!

Uhh isten vagy. Köszi nagyon. :)
Prímán működik :)

(#525) cellpeti


cellpeti
veterán

Sziasztok!
Van egy ilyen feladat,hogy:
Adott egy pozitív egész szám, mint forintban kifizetendő pénzösszeg. Fizessük ki a legkevesebb címlet felhasználásával!

Tehát,ha jól értem a feladatot,akkor:
Be kell kérni egy összeget a billentyűzetről és azt felbontani,ugye?
Mivel pozitív egész számról van szó,ezt rakhatom nyugodtan "int" változóba,majd be kell kérnem a billről egy összeget. majd maradékos osztással kell kiszámolnom? Vagy sima osztással? :U

Tigris, tigris, csóvafény...

(#526) PazsitZ válasza cellpeti (#525) üzenetére


PazsitZ
addikt

Haladsz a legnagyobb címlettől a legkisebbig. Ezeket berakhatod egy tömbbe. [20000,10000,5000...]
Ha az összeg nagyobb, mint a címlet: kivonod a címletet a pénzösszegből, letároloda címletet majd újravizsgálod.
Ha kisebb: kisebb címletre lépsz.
Ha a pénzösszeg nulla kiírod a letárolt címleteket.

Szvsz ha aktualizálni akarod beolvasásnál szabd ki, hogy 5-re vagy nullára végződjön a pénzösszeg.

- http://pazsitz.hu -

(#527) cellpeti válasza PazsitZ (#526) üzenetére


cellpeti
veterán

De ha kivonom a pénzösszegből a címletet,akkor nem kapom meg,hogy hány db kell belőle nem?
Azt nem osztani kell? Hogy határozom meg,hogy 0 vagy 5 legyen a vége?

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#528) dabadab válasza cellpeti (#527) üzenetére


dabadab
titán

p++

:)

DRM is theft

(#529) cellpeti válasza dabadab (#528) üzenetére


cellpeti
veterán

Rohadtul nem vágom,hogy most mi van!!:(:( :O :O

Tigris, tigris, csóvafény...

(#530) cellpeti


cellpeti
veterán

Hogyan kell bekérni a billről számokat?
Hogyan töltök fel tömböt C-ben??

Tigris, tigris, csóvafény...

(#531) dabadab válasza cellpeti (#529) üzenetére


dabadab
titán

Alapfoku C ismeretek azert megvannak? Mutatok? Mert azok nelkul azert nem lesz egyszeru menet.

DRM is theft

(#532) cellpeti válasza dabadab (#531) üzenetére


cellpeti
veterán

Mutatok??? Azok mik??? Változókra gondolsz? :U
2 számot össze tudok adni,meg kiíratni azt ennyi! Csak az a gond,hogy fősulin ez nem elég!:(

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#533) dabadab válasza cellpeti (#532) üzenetére


dabadab
titán

Hat, az tenyleg nem eleg.
Javaslom a Kernighan-Ritchie szerzoparos "A C programozasi nyelv" c. konyvet esetleg ezt.

DRM is theft

(#534) PazsitZ válasza cellpeti (#527) üzenetére


PazsitZ
addikt

Azért írtam oda, hogy "letárolod a címletet"
Bár osztással tényleg gyorsabb.
Megtaláltam egy régi pascalos forráskódom.
Ez bankautomata és csak pár értékes, de hátha segít:

write('K‚rt ”sszeg:');readln(be);
x:=be mod 1000;
if x<=0 then begin
y:=(be div 1000);
if y mod 10>=0 then begin
ossz10:=y div 10;
be:=y mod 10;
end;
if y mod 5>=0 then begin
ossz5:=be div 5;
y:=be mod 5;
end;
if y mod 1>=0 then begin
ossz1:=y div 1;
be:=y mod 5;
end;
writeln('kiadand˘ cˇmletek:');
writeln('10000ft-os cˇmlet:',ossz10:8:0);
writeln('5000ft-os cˇmlet:',ossz5:8:0);
writeln('1000ft-os cˇmlet:',ossz1:8:0);
end
else begin
writeln('Minimum 1000,5000,10000ft-os cˇmletek vehet‹ ki');
end;

[ Szerkesztve ]

- http://pazsitz.hu -

(#535) cellpeti válasza dabadab (#533) üzenetére


cellpeti
veterán

Szia!

Ez nem egy kék könyv véletlen??
PazsitZ a "y" változó az mi? Mert nincs deklarálva! Vagy csak én nem vágom!

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#536) dabadab válasza cellpeti (#535) üzenetére


dabadab
titán

Amikor utoljara lattam, akkor pont ezustszurke volt, de lehet, hogy mostanaban kek.
Nem tul vastag, raadasul kb az utolso harmada a nyelv referencialeirasa, szoval eleg gyorsan vegig lehet rajta menni (Dennis Ritchie meg a C nyelv (es mellesleg a Unix) egyik alkotoja).

DRM is theft

(#537) PazsitZ válasza cellpeti (#535) üzenetére


PazsitZ
addikt

Mivel nálam 1000 a legkisebb érték, így y az beolvasott érték osztva 1000-el.
Utólag nézve nem tudom miért pont így csináltam. :) Régen írtam...

[ Szerkesztve ]

- http://pazsitz.hu -

(#538) cellpeti válasza PazsitZ (#537) üzenetére


cellpeti
veterán

Tehát az "y" a billentyűzetről bekért adat,ugye? Ha jól értelek!

Tigris, tigris, csóvafény...

(#539) Fire/SOUL/CD válasza cellpeti (#538) üzenetére


Fire/SOUL/CD
félisten

Hali!

Gyorsan megcsináltam(több megoldás is létezik persze), mielött ellépek itthonról. Ha valami nem tiszta írj. Késő este vagy holnap leszek majd.
(mivel ez csak példa, nem foglalkoztam azzal hogy kitudja mekkora számot lehessen beírni, ezért 2 gigánál nagyobbat ne írj be, mert hibásan fog működni. Bár kipróbálhatod :DDD )

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define C_Y 14

int cimlet[C_Y] = {20000,10000,5000,2000,1000,500,200,100,50,20,10,5,2,1};
int hanyszor[C_Y] = {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0,0,0};

int main()
{
long int i, cash;
char money[255];

printf("Enter money: ");

if (!strlen(gets(money))) {
printf("\n\nMoney not found...EXIT");
return -1;
}
printf("\n\n");
for (i=0;i<strlen(money);i++)
if(money[i]<'0' || money[i]>'9') {
printf("Is NAN [Not A Number]...\nEXIT");
return -1;
}

cash=atoi(money);

for (i=0;i<C_Y;i++) {
hanyszor[i]=cash / cimlet[i];
cash-=hanyszor[i]*cimlet[i];
if (hanyszor[i]) printf("%5d db\t %d\n",hanyszor[i],cimlet[i]);
}

return 0;
}

Fire.

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#540) sghc_toma válasza Fire/SOUL/CD (#539) üzenetére


sghc_toma
senior tag

egy tanács: a gets függvényt érdemes elásni.. jó mélyre.. olyan gyönyörű buffer overflow-t lehet vele gyártni, hogy ihaj.. ott van helyette pl. az fgets: harmadik paraméter stdin, és ugyanazt csinálja, mint a gets, csak kultúráltabban..

[ Szerkesztve ]

in asm we trust

(#541) Fire/SOUL/CD válasza sghc_toma (#540) üzenetére


Fire/SOUL/CD
félisten

Hali!

Esetleg meg is tudnád mutatni, hogy a kódom hogy "gyárt" overflow-t?

Fire.

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#542) dabadab válasza Fire/SOUL/CD (#541) üzenetére


dabadab
titán

Egyszeruen stdinen be kell adni a programnak. Semmi ellenorzes nincs arra nezve, hogy nem jon be 255-nel tobb karakter, siman felul lehet irni az egesz stacket.

DRM is theft

(#543) sghc_toma válasza Fire/SOUL/CD (#541) üzenetére


sghc_toma
senior tag

hello!

ahogy dabadab mondja, egy túl hosszú input csinálhat gonosz dolgokat.. próbáld ki mondjuk 300-400 számjeggyel, úgy tuti felülírod a return address-t a stack-en valami hülyeséggel, és kapsz egy segfault-ot.. persze a mai fordítókban vannak mindenféle védelmek overflow-k ellen, de azért nem szabad csak azokra támaszkodni..

in asm we trust

(#544) Fire/SOUL/CD válasza sghc_toma (#543) üzenetére


Fire/SOUL/CD
félisten

Hali!

Elöször is bocsesz a "költői visszakérdezésért", de már előfordult, hogy valaki minden szakmai alapot nélkülöző hozzászólással gazdagított, amikor meg visszakérdeztem, hogy hát azért mégis elmagyarázhatná nekem(amúgy nem kellett volna) hogy hogyis van az, na azóta nem hallottam felőle.
Való igaz (ahogy Te illetve dabadab kolléga is írta) a GETS magában rejti ezt a fajta hibalehetőséget, de csak ezt, és ez jól látható(money[255]). Nyílván nem létezik olyan bankautomata amibe be lehet írni 255 számjegyből álló összeget, hogy adja ki 20ezresekbe, vagy ha igen szóljatok, mert kérek kölcsön egy MTZ traktort azt elhozzuk, mert akkor k... sok pénz van benne... :DDD

Azért nem szeretem a pl SCANF-t, mert az viszont rejtett "hibákat" tartalmaz és aki most ismerkedik a C-vel(lásd CELLPETI) azt nem tudhatja(mert sajnos a informatika vagy prográmozást oktató tanárbácsik is gyakran megfeletkeznek ennek elmagyarázásáról). Mire gondolok? Hát például Te is említést teszel ama bizonyos STDIN-ről ugyebár, amit a SCANF is "használ". Ha valaki tényleg korrekt INPUT-ot akar írni, annak erre oda kell figyelni. egy példával illusztrálom:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
int n1,n2;

do {
printf("Enter 2 numbers [num1,num2]: ");
if (scanf("%d,%d",&n1,&n2)!=2) {
printf("Bad INPUT, try again or * to EXIT...\n");
continue;
}
printf("SUM(%d,%d) = %d\n",n1,n2,n1+n2);
} while (getch()!='*');
return 0;
}

Nos, első ránézésre hibátlan, de mégsem. A következőképp működik az adott értékek mellett:
ha 5,7 akkor hibátlanul fut
ha 12345678901,12345678901, akkor hibás eredmény
ha a,b akkor hibás működés
ha 5.0,7.0 akkor hibás működés

A hibás értékkel nem kell foglalkozni, az nyílvánvaló, azonban mi okozza a hibás működést? Nos annyit elárulok hogy a STDIN.
Természetesen nem Tőletek kérdem a megoldást(hisz biztosan tudjátok), hanem azoktól a leendő programozópalántáktól akik most ismerkednek a C-vel, és remélhetőleg elolvassák mások szakmai hozzászólását.
Szóval ezzel csak azt akartam illusztrálni, hogy kézenfekvő alap C input fx-ek is megtudják nehezíteni az ember életét, és ráadásul ezt úgy teszik hogy amúgy a kód hibátlan(vagy annak tűnik)

Nos ezért szoktam kezdő programozóknál inkább a GETS-et alkalmazni.

Fire.

[ Szerkesztve ]

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#545) sghc_toma válasza Fire/SOUL/CD (#544) üzenetére


sghc_toma
senior tag

Hello!

Semmi gond, én is találkoztam már beszólogató emberkékkel :)

Tény, hogy lehet szívni az stdin-nel, amíg az ember nem tudja, hogyan is működik az a fránya input buffer. Az a baj, hogy a gets-el akkor is szívhatsz, ha tisztában vagy a dolgok működésével - ugyanis semmilyen lehetőséged nincs biztosan elkerülni a túlcsordulást.

Azzal érvelsz, hogy a programozást oktató tanárok ezt nem tanítják. Ellopom az érvedet, és felhasználom :) A tanárok pl. a gets veszélyeire sem hívják fel a figyelmet.

Azért nem tartom jó ötletnek a gets használatát példakódban, mert akkor a programozópalánta azt ismeri meg, azt fogja használni, pedig van biztonságos(abb) megoldás is. Persze ahhoz többet kell tanulnia, meg pötyögnie, de potenciális b0f-t nem szabad benthagyni egy programban. Szerintem.

in asm we trust

(#546) Benmartin válasza sghc_toma (#545) üzenetére


Benmartin
senior tag

Szia!

Annyit fűznék hozzá, hogy általában a házifeladatok és a versenyfeladatok többsége pontos input definíciót határoz meg, tehát ilyen ellenőrzések a feladat megoldása szempontjából fölöslegesek és még időigényesek is (lásd: acm-icpc feladatok).

(#547) sghc_toma válasza Benmartin (#546) üzenetére


sghc_toma
senior tag

Szia!

Igazad van, beadandóimban én sem mindig csinálok teljes input-validációt, mert minek. Viszont ez tudatos. Azért említettem meg a dolgot, mert ha a kezdő programozóba belerögzül, hogy gets, és nem ismeri annak veszélyeit, akkor simán elképzelhető, hogy production code-ban is használni fogja.

in asm we trust

(#548) TomBoy1986


TomBoy1986
veterán

Sziasztok!

Egy kis segítséget szeretnék kérni, mert új felületen kellene programoznom, de valahogy sehogy sem tudok rájönni arra, hogy miképp is kellene működésre bírni.

Szóval, Visual Studio 2008 Exp. Edit. feltelepítve. Szeretnék egy egyszerű hello-t kiiratni, hogy lássam miben is különbözik a régitől, de sajnos ez olyan sokban, hogyha csak egy cpp-t nyitok, akkor le sem tudom fordítani :(( (vagy pedig ha mégis lehet, akkor nem tudom hogyan - tehát valami menüpont, hasonló kellene).

Maradt a projektes megoldás, amelynél pedig hiába addolok hozzá cpp-t és írom bele a main fgv.-t tojik a fejemre, s azt mondja, hogy nincs programkód.

Tehát szeretném megkérni, valamely hozzáértő kollégát, hogy az elindulásról világosítson fel, legyen szíves. Köszönöm szépen előre is!

AMD FX-6300 ; MSI 970A-G46 ; XFX RX-460 4GB ; CSX DDR3-1600 2x8GB ; WD 1TB ; CoolerMaster RealPower RS-520W

(#549) TomBoy1986 válasza TomBoy1986 (#548) üzenetére


TomBoy1986
veterán

Már rájöttem mi volt a gond. Rossz típusú projektet nyitottam. Szóval tárgytalan.

AMD FX-6300 ; MSI 970A-G46 ; XFX RX-460 4GB ; CSX DDR3-1600 2x8GB ; WD 1TB ; CoolerMaster RealPower RS-520W

(#550) cellpeti


cellpeti
veterán

Sziasztok!

Elkezdtem olvasni az ajánlott irodalmat:

Brian W, Kernghan és Dennis M. Ritchie: A C programozási nyelv

Értehetően írja le meg minden,de a fejezetek végén vannak feladatok és azokat nem tudom,hogy kéne megoldani.
Ötltetem van,de lehet nagy baromság. Nincs ehhez valami CD a neten esetleg,nem tudja valaki,vagy megoldás?? :U

Tigris, tigris, csóvafény...

Copyright © 2000-2024 PROHARDVER Informatikai Kft.