- Milyen billentyűzetet vegyek?
- Milyen cserélhető objektíves gépet?
- Házimozi belépő szinten
- Retró játékgépet csinál egy applikáció az Apple TV-ből
- Épített vízhűtés (nem kompakt) topic
- Milyen belső merevlemezt vegyek?
- Megjött az ASUS 240 Hz-es, fényes WOLED monitora
- HiFi műszaki szemmel - sztereó hangrendszerek
- Nem indul és mi a baja a gépemnek topik
- HP ProLiant MicroServer Gen8
Hirdetés
-
Megkérték az Apple beszállítóját, hogy ne használjon annyi áramot
it A Foxconn is azon cégek között van, amelyet megkértek Vietnámban, hogy jelentősen csökkentse az áramfogyasztását.
-
AMD Radeon undervolt/overclock
lo Minden egy hideg, téli estén kezdődött, mikor rájöttem, hogy már kicsit kevés az RTX2060...
-
Ismét mozgásban a Kingmakers
gp Továbbra is izgatottan várjuk a játékot, amelyben a középkorba utazunk modern fegyverekkel.
Új hozzászólás Aktív témák
-
veterán
Sziasztok!
Egy olyan problémám lenne, hogy van egy fájlom, benne jó nagy számokkal, melyek előjellel együtt 100 karakternél nem hosszabbak, ám így az összes, C-ben előforduló default típusnál nagyobbak. A sorok végét végjel (gondolom \n) jelzi.
A fájlban egy sorban egy érték szerepel. Újabb sorban a műveleti (összeadás vagy kivonás) jel. Előjeltelenül szerepelnek a pozitiv számok, illetve előjelesen a negatívak. A műveletsor végét egy = jel zárja.
Ami hirtelen eszembe jutott a megoldást illetően:
Karaktertömbben tárolni a számjegyeket, ám ekkor azzal a problémával találtam szembe magam, hogy a karakterek ASCII kódja tárolódik, magyarán ha jól gondolom el kell az egészet tolnom 48-cal, hogy megkapjam a valódi számokat.
Összeadás: Tfh. fel van töltve a két karaktertömböm. Hogyan tovább? Félreértés ne essék, tudok írásban összeadni és kivonni, ám még ez a mezei C kissé új nekem. Valami olyat gondoltam ki, hogy indítok egy for-t a 100-as sorhossztól 0-ig, majd ött jegyenként összeadom őket. Ha nagyobb mint 10 akkor letárolom az utolsó jegyet, a maradékot meg továbbviszem.
Kivonás: -||-
Nyilvánvalóan a teljesen saját megoldás a célom, csupán egy kis gondolatébresztőt kérnék, hogy miként kezdenétek neki. Ez annyira alap, hogy félek túlkomplikálom.
Köszi!
Üdv. core2
-
buherton
őstag
válasz Neil Watts #5701 üzenetére
Szia!
Jó gondolat a karaktertömb és jó a probléma felvetés! Fél siker.
Egy struktúrát használnék pl.:
typedef struct
{
char isMinus;
unsigned int len;
char *number;
} number_sA fájlban ASCII-ként van letárolva, így amikor letárolnám a struktúrámba, akkor kivonnám az offsetet és egyszerű számként tárolnám, hogy később a műveletek során már ne kelljen ezzel foglalkozni.
A műveletek kicsit összetettebbek, de valóban a papíron való számolásra érdemes visszavezetni. Amiből kindulhatsz, hogy összeadásnál a leghosszabb szám hossza vagy plusz egy lesz az összeg hossza. Kivonásnál maximum a leghosszabb szám hossza.
Amit viszont ne kövess el, hogy konstans értékeket használsz! Ha ismerkedsz még csak a nyelvvel, akkor a prototípus lehet fix számú és akkor a logikát ki lehet próbálni, de utána illik generálissá tenni. Ehhez pedig melegen ajánlom a malloc/free függvényt. A struktúrában sem véletlenül van tömb pointer .
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
axioma
veterán
válasz Neil Watts #5701 üzenetére
Irsz egy BCD-s aritmetikat De reg lattam, me'g IBM4361-nel emlegette'k... jo, javitok: a BCD az ket felbyte-on 1-1 tizes szamjegy, de utana az osszeadasa ugyanaz.
Amugy megteheted, hogy egyszerre x decimalis szamjegyet konvertalsz... osszeadsz, maradekot kepzel. Ekkor mondjuk 2^30-ba belefer 10^9, 9 szamjegyenkent egy darab egeszet tarolsz, amit nem is kell igy ascii kavarassal konvertalni, minimum masolassal (bocs, en regen hasznaltam C-t, lehet hogy kozvetlen indexek megadasaval) beolvastathatod szamkent.[ Szerkesztve ]
-
don_peter
senior tag
Kedves fórumtársak!
Írtam egy kis programot mellyel egy általam épített hardverből tölti le a teljes NorFlash (8MB) tartamát.
Mind ezt bináris állományba.
Sajnos minden letöltés után törölnöm kell az előzőleg letöltött állományt, továbbá szeretném valahogy a fájlnevében jelölni az időt, hogy mikor lett letöltve.A kérdésem az, hogy ezt hogy tudnám megtenni.?
A kód rész amellyel az állomány nevét létrehozom:
const string fileName = "dptpsmfdcartridge.bin";
Próbáltam már pár módon módosítottam, de nem sikerült.
A fáj nevébe a dátumot is szeretném eltárolni pl így:const string fileName = "dptpsmfdcartridge_20161118.bin";
Ezzel próbálkoztam, csak hogy érthetőbb legyen a dolog:const string fileName = "dptpsmfdcartridge_" + DateTime.Now.ToString("y-M-d, H:m:s") + ".bin";
Utóbbira sajnos hibát dob.
Létrehozás pedig így:string pathString = System.IO.Path.Combine(folderName, fileName);
csharp 2012-essel próbálkozgatom..Előre is köszönöm a segítséget.
----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
sztanozs
veterán
válasz don_peter #5706 üzenetére
vesszőt, space-t és kettőspontot inkább felejtsd el:
const string fileName = "dptpsmfdcartridge_" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".bin";
[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
sztanozs
veterán
válasz don_peter #5708 üzenetére
Amúgy ez a c# topicba való volna, ott válaszoltam.
[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
llaszlo
veterán
Hali
Ezt, hogy a legegyszerűbb megoldani?
Van egy karakterlánc több karakterből, amit a user ad meg. Ebben csakis betűk szerepelhetnek. Ha más karakter is van, akkor hibaüzenet.
A betűknek számértéket kell adni egy meghatározott táblázat szerint, és ezeket a számokat összeadni. A space-t ne vegye figyelembe.Az elgondolásom.
fgets-szel beolvastatom a szöveget, majd karakterenként kiolvasom. Aztán ezt a karaktert összehasonlítom a táblázat karaktereivel és a hozzárendelt számmal növelem egy változó értékét, amíg el nem fogynak a karakterek.Nagyon régen csináltam ilyet emlékszem rá, hogy a szövegből szám lett. De már nem emlékszem arra, hogy hogyan.
-
buherton
őstag
válasz llaszlo #5711 üzenetére
Az ASCII betűkből kivonsz ha nagy betű akkor 65-t, ha kis betű, akkor 71-t. A kapott értékkel egy tömböt címzel (LUT).
A betű már magában egy számként van értelmezve. Gyakorlatilag a karakterlánc egyet elemeit is össze lehetne adni csak ugye nem ez a feladat.
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
zka67
őstag
válasz llaszlo #5711 üzenetére
Szia, van egy kis ellentmondás a feladatodban:
Ebben csakis betűk szerepelhetnek. Ha más karakter is van, akkor hibaüzenet.
A space-t ne vegye figyelembe.Ha feltételezzük, hogy betűk és szóközök lehetnem az inputban, akkor az isalpha és az isspace lesznek a barátaid.
Utána már csak egy táblázatra lesz szükséged, amit csinálhatsz akár úgy is, hogy 256 elemű, vagy úgy is, hogy 64 elemű. Az első változat előnye, hogy ott meg tudod adni a space karakternek a 0 értéket, nem kell kétszer vizsgálnod a karaktert. A második változatnál pedig kivonsz 0x40-et a karakter kódjából és azt használod a tömb indexekét, ekkor az 'A'-1 karakter értéke lesz a tömb első eleme.
Ha a kisbetű és a nagybetű nincs megkülönböztetve, akkor elég egy 26 elemű tömb is a betűk értékeinek, ebben az esetben még a toupper-re is szükséged lesz, és 'A'-t vonsz ki a karaktered értékéből az indexhez.
Ha nem 256 elemű a tömböd, akkor kétszer is meg kell vizsgálnod a karaktert, hogy valóban betű-e.
[ Szerkesztve ]
-
llaszlo
veterán
Köszi. Igaz, a space-t nem vettem figyelembe.
Példa
Dr Kiss József Géza
Ez így jó.
De pl a
Dr. Kiss József Géza-ban a pont karakter már felesleges, vagy bármi más pl: , ; számok stb.A táblázatra fejből nem emlékszem de valahogy így néz ki
A, Á = 1
B = 5
C = 7
D = 11
stbA bevitt szövegből pedig karakterenként kiolvasom az elemeket és ha A van, akkor ugye 1-el növelve az értéket ha B, akkor 5-tel stb. A space és minden egyéb, viszont 0 kell, hogy legyen, vagy nem is ad hozzá semmit sem. Mert ha eleve nincs egyezés a táblázat elemeivel, akkor mehet tovább a következő karakterre.
Megnéztem az isalpha függvényt. Ha jól értem a működését, akkor azzal ellenőrizni tudom, hogy betű vagy más karakter van-e. Ha igen, akkor mehet a táblázattal való összehasonlítás, hogyha nem, akkor beolvassa a következő karaktert. Ha így oldom meg, akkor az isspace nem is kell. Viszont a toupper-t le kell futtatnom előtte.
Azt hiszem, vissza kell mennem az alapokhoz, olyan régen írtam már programot. Viszont jó kis hobbi ez nekem
buherton: Ezt nagyon jó, hogy leírtad. Az alap cézár kódolás feladat amikor egy szöveget a betű eltolással titkosítottunk. Hú de rég volt 99.
-
llaszlo
veterán
A következő ötletem támadt. Két tömböt hozok létre az egyik tartalmazza a karaktereket kis- és nagybetűkkel a másik pedig az ezekhez tartozó számokat.
Viszont
Miért foglalnak két helyet egy tömbben az ékezetes karakterek?int x=0;
unsigned char betu []="AaÁáBbCcDdEeÉéFfGgHhIiJjKkLlMmNnOoÓóÖöŐőPpQqRrSsTtUuÚúÜüŰűVvWwXxYyZz";Kiíratáskor, viszont ez fogad
while (betu[x])
{
printf ("x=%d %c ", x, betu [x]);
x++;
}x=0 A x=1 a x=2 � x=3 � x=4 � x=5 � x=6 B x=7 b x=8 C x=9 c x=10 D x=11 d x=12 E x=13 e x=14 � x=15 � x=16 � x=17 � x=18 F x=19 f x=20 G x=21 g x=22 H x=23 h x=24 I x=25 i x=26 J x=27 j x=28 K x=29 k x=30 L x=31 l x=32 M x=33 m x=34 N x=35 n x=36 O x=37 o x=38 � x=39 � x=40 � x=41 � x=42 � x=43 � x=44 � x=45 � x=46 � x=47 � x=48 � x=49 � x=50 P x=51 p x=52 Q x=53 q x=54 R x=55 r x=56 S x=57 s x=58 T x=59 t x=60 U x=61 u x=62 � x=63 � x=64 � x=65 � x=66 � x=67 � x=68 � x=69 � x=70 � x=71 � x=72 � x=73 � x=74 V x=75 v x=76 W x=77 w x=78 X x=79 x x=80 Y x=81 y x=82 Z x=83 z
Az ékezetes karakterek helyén ?-ek vannak.
Így látszólag jó, viszont az x értéke mutatja, hogy mégsem egy 69-es tömböt, hanem egy 85-ös tömböt foglal le a \0-val együtt.
while (betu[x])
{
printf ("x=%d %c ", x, betu [x]);
x++;
}printf ("%d", x);
AaÁáBbCcDdEeÉéFfGgHhIiJjKkLlMmNnOoÓóÖöŐőPpQqRrSsTtUuÚúÜüŰűVvWwXxYyZz84
Az ékezetes karaktereket 16 biten tárolná és nem 8-on, a char pedig csak 8-cal dolgozik?
Ez lenne a hiba oka?
Mi lehet a megoldás?Szerk: Visszaolvastam a fórumot is az ékezetes karakterekkel kapcsolatban és láttam, hogy másnál is gondot okoz. Melyik megoldás lenne ebben az esetben a legcélszerűbb?
[ Szerkesztve ]
-
zka67
őstag
válasz llaszlo #5715 üzenetére
Szia, hát igen, az ékezetes karaktereket nem nagyon támogatják a fordítók. Tudod, van több száz kódlap, és egy toupper-hez nem biztos hogy megérné mindegyiket beletenni, mert nem csak magyarok használják a fordítóprogramokat. Csak megjegyzem, hogy magyar kódlapból is van több tucat... melyiket szeretnéd használni? Az UTF-8 pl két vagy több karakteren ábrázolja az ékezetes betűket...
Ha neked megfelel pl. a Windows 1250-es vagy az ISO-8859, akkor egyszerű lesz a dolgod:
Nem kell külön vizsgálnod semmi, csinálsz egy 256 elemű tömböt, amiben 0 értéke van az egyéb karaktereknek, és a kis és nagybetűkhöz (amennyiben nem különbözteted meg őket) ugyan azokat az értékeket írod be. Ha szükséges a hiba kiírása ha egyéb karaktert kapsz, akkor az egyéb karaktereknek adsz pl. -1 értéket, és mielőtt hozzáadod az eredményhez, ezt figyeled.
-
llaszlo
veterán
Ezt a -1-es dolgot nem értem.
Én azt logikáztam ki, hogy kiolvasom a bevitt karaktersor adott elemét 'x'. Aztán összehasonlítom a fent elkészített tömb elemeivel. Ekkor ugye mindegy, hogy kis vagy nagybetű. Mindegy, hogy A, a, Á, á stb van.
Ha egyezés van, akkor a másik tömb (ami a számokat tartalmazza) adott elemével növelem a változó értékét.
Amikor elfogytak a karakterek, akkor pedig kész, kilép.Viszont az ékezetes karakterek több helyet foglalnak a tömbben. Most ez a gondom.
Az is megfelel, hogyha az á-t átalakítja a-ra, vagy az Ű-t U-ra, és csak az alap angol karakterek maradnak.
Azzal is tudok tovább dolgozni.Most így néz ki a két tömb
char betu []="AaÁáBbCcDdEeÉéFfGgHhIiJjKkLlMmNnOoÓóÖöŐőPpQqRrSsTtUuÚúÜüŰűVvWwXxYyZz";
unsigned short szam []= {1,1,1,1,2,2,11,11,4,4,5,5,5,5,17,17,3,3,8,8,10,10,10,10,11,11,12,12,13,13,14,14,16,16,16,16,16,16,16,16,17,17,19,19,20,20,21,21,9,9,6,6,6,6,6,6,6,6,6,6,6,6,15,15,10,10,7,7};[ Szerkesztve ]
-
dabadab
titán
válasz llaszlo #5720 üzenetére
"Még mindig ott tartok, hogy az ékezetes karaktereket két helyen tárolja a tömbben."
Mert UTF-8, ott meg csak az első 128 karakter fér el egy byte-ban.
Ha rendesen akarsz ASCII-n túli karakterekkel dolgozni, akkor nézd meg a wchar-t, de ott meg a tömb inicializálása lesz némileg munkás, mert ott kénytelen leszel a konkrét számértékeket bepötyögni, vagy kódból inicializálni.
DRM is theft
-
llaszlo
veterán
válasz dabadab #5721 üzenetére
Köszi
A wchar-ral már találkoztam valahol.
Mi a helyzet ezzel?
Nem pont ez az ami nekem kéne? Csak még nem értettem meg a működését és, hogy melyik kellene nekem innét. Mert itt van olyan amikor az ékezetes karaktert ékezet nélkülire kódolja. Hogyha jól értek mindent.
[link] -
alapz@j
tag
válasz llaszlo #5724 üzenetére
Szerintem ne erőltesd a wchar-t, mert nagyon sötét erdőbe visz. Ha a bemeneti szövegeid sima ASCII kódolásúak, akkor a használt kódtábla szerint cserélgetheted a nagy- és kisbetűk bájtjait. Ha UTF8 kódolásúak, akkor írj egy olyan függvényt, ami nem csak egy bájtot, hanem egy bájtsorozatot cserél: pl. Á - d0 91 / á - d0 b1.
-
llaszlo
veterán
válasz alapz@j #5725 üzenetére
Ok, de honnét tudom, hogy milyen bytesorozat kell nekem? Ilyet még nem csináltam korábban.
Kiolvasok 16 bitet/2 byte-ot és azt ellenőrzöm/hasonlítom?
Viszont ha a sima betűk meg csak 1 byte-ot foglalnak.
Esetleg kiolvasok 1 byte-ot, ellenőrzöm, hogyha van egyezés, akkor meg van a betű, hogyha nincs, akkor hozzá olvasom a következő byteot is és így hasonlítok? -
alapz@j
tag
válasz llaszlo #5726 üzenetére
Fogsz egy text editor, beleírod, hogy áÁ éÉ ... az összes ékezetes magyar betűt, kimented UTF8 kódolással, megnyitod egy hex editorral és már meg is vannak a bájtsorozataid a karakterekhez. Ha jól emlékszem, az összes magyar ékezetes karakter kódpontja két bájtosra kódolódik UTF8-ban, ez könnyít a munkán. Ezután írsz egy függvényt, ami unsigned char-ként végigmegy a sztringed bájtjain - ha az adott char < 128, akkor hagyományos módon kisbetűsítesz, ha pedig >= 128, akkor a fenti bájtsorozatokat cseréled.
-
dobragab
addikt
válasz alapz@j #5727 üzenetére
Vagy elolvasod ezt és lenyúlod a függvényeit. Mindenképpen utf-8-ként érdemes kezelni a szövegeket.
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
alapz@j
tag
válasz dobragab #5728 üzenetére
Már fentebb is linkelte valaki, de nekem több gondom is van ezzel a cikkel.
Egyrészt hibás nevezéktant használ, mert azt mondja, hogy van az UNICODE kódolás és az UTF8, holott az UTF8 az egy unicode kódolás.
Másrészt nincs olyan, hogy UNICODE kódolás - a cikk - pontos megnevezése nélkül - az UCS2-t mutatja be, illetve az UCS2-UTF8 konverziók egy részét.
Harmadrészt a cikkben szereplő függvények pont nem segítenek a kérdezőnek, mert neki az ASCII-UTF8 konverziókra van szüksége.
-
kpisti1990
csendes tag
Sziasztok!
A segítségeteket szeretném kérni. Adott egy állapotgépes feladat:-alap állapotban üdvözlő szöveg
-a user 3 különböző ital közül választhat
-ital kiválasztása után jelenlen meg az ital neve és ára
-sikertelen fizetés vagy törlés esetén térjen vissza alap állapotba
-sikeres fizetés esetén kezdje elkészíteni az italt
-mikor kész, üzenetben jelezze
-végén (ital elvételekor) álljon vissza alap állapotbaEléggé nagyon kezdő vagyok, most próbálkozok a "hello world"nél komolyabb kóddal először Átrágva a jegyzetetek/fórumokat arra jutottam hogy ez egy switch-case-es eset. Sikerült elérnem, hogy egy adott betű lenyomására egy adott szöveget írjon ki.
char c;
c=getchar();
getchar();
if (c=='k')
printf("Kave 100Ft\n");
if (c=='t')
printf("Tea 150Ft\n");
if (c=='c')
printf("Forrocsoki 200Ft\n");valahogy így. Ezt betettem a case ALAP esetbe, eddig rendben van, viszont sehogyse tudom átugrasztani a következő stádiumra. a break; miatt ugyebár kilép az egészből, de én úgy tudom, valahogy mégiscsak átlehete ugrasztani a következő case-re. Remélem érthetően fogalmaztam, segítségeket köszönöm előre is .
int main()
{
typedef enum state {ALAP,FIZETETT,KESZ};
enum state state=ALAP;
while (1)
{
switch(state){
case ALAP:
printf("Udvozlom!Kerem valasszon italt\n");
{
char c;
c=getchar();
getchar();
if (c=='k')
printf("Kave 100Ft\n");
if (c=='t')
printf("Tea 150Ft\n");
if (c=='c')
printf("Forrocsoki 200Ft\n");
}
break;case FIZETETT:
printf("Ital keszitese folyamatban....\n");
break;case KESZ:
printf("Kesz!Kerem vegye el az italt.Koszonom!\n");
break;
default: printf("Sikertelen fizetes vagy torles.\n");
}return 0;
}
}
Itt a teljes. Feltételezem kismillió hiba van benne, de fut viszont amit el szeretnék érni hogy miután pl a "k" betűt lenyomtam és kiírta az árát meg a nevét, ne lépjen ki, hanem térjen rá a FIZETETT állapotra(ott természetesen más lesz, csak bírtam neki valamit, hogy lássam átugrik-e). -
stepboy
csendes tag
válasz kpisti1990 #5730 üzenetére
hahó;
a switch-el a "state" változó értékét vizsgálod, ezért ha az állapotgépet léptetni akarod, akkor annak kell egy új értéket adni.
valahogy így:{
switch(state)
case ALAP:
...
state = FIZETETT;
break;
case FIZETETT:
...
state = KESZ;
break;
case KESZ:
...
state = ALAP;
break;
}Persze ez csak egy váz. A "state" értéke mindig attól függ, hogy a következő állapotba lépés engedélyezett-e; például az "ALAP" értéknél, csak a megfelelő karakter beolvasása után lehet "FIZETETT" érték, de remélem, hogy a lényeg megvan!
Ha még nem olvastad, akkor hasznos: [Állapotgépek]
Legközelebb használd a "Programkód" formázást, hogy olvasható legyen a kód amit beírsz.
[ Szerkesztve ]
-
kpisti1990
csendes tag
válasz stepboy #5731 üzenetére
Szia!
Köszönöm a választ Hasonlóval próbálkoztam, de valamiért nem akar működni :/
int main()
{
typedef enum STATE_t {ALAP,FIZETETT,KESZ}STATE_t;
STATE_t state;
state=ALAP;
while (1)
{
switch(state){
case ALAP:
printf("Udvozlom!Kerem valasszon italt\n");
{
char c;
c=getchar();
getchar();
if (c=='k')
printf("Kave 100Ft\n");
if (c=='t')
printf("Tea 150Ft\n");
if (c=='c')
printf("Forrocsoki 200Ft\n");
}
state=FIZETETT;
break;
case FIZETETT:Talán rosszul értelmezem neki a state-t? Vagy "csak a megfelelő karakter beolvasása után lehet "FIZETETT" érték" ezt úgy értetted, hogy erre is kéne írni egy if-es szerkezetet? if (valami==true) state=FIZETETT;?
-
stepboy
csendes tag
válasz kpisti1990 #5732 üzenetére
Így már jobban látom a kódod.
Miért van két "getchar()" ?Igen, úgy értettem, hogy csak akkor adhatsz a "state" változónak új értéket, ha a beolvasott karakter megfelelő, valahogy így:
while ( 1 )
{
switch ( state )
{
case ALAP:
{
printf( "szöveg\n" );
char c = getchar();
if ( ( c != 'k' ) || ( c != 't' ) || ( c != 'c' ) )
{
printf( "rossz betű\n" );
}
else if ( c == 'k' )
{
printf( "jó betű 1.\n" );
state = FIZETETT;
}
else if ( c == 't' )
{
printf( "jó betű 2.\n" );
state = FIZETETT;
}
else
{
printf( "jó betű 3.\n" );
state = FIZETETT;
}
break;
}
case FIZETETT:
{
printf( "valami szöveg\n" );
state = KESZ;
break;
}
case KESZ:
{
printf( "megint szöveg\n" );
state = ALAP;
break;
}
}
}Ez nem egy szép kód, de kezdetnek megteszi.
[ Szerkesztve ]
-
kpisti1990
csendes tag
válasz stepboy #5733 üzenetére
Szia! Köszönöm a választ! SIkerült!
int main()
{
typedef enum {ALAP,FIZETETT,KESZ}STATE_t;
STATE_t state;
state=ALAP;
while (1)
{
switch(state){
case ALAP:
{
printf("Udvozlom. Kerem valasszon italt!\n");
char c = getchar();
if (c=='k')
{printf("Kave 100Ft\n");
state=FIZETETT;}
else if (c=='t')
{printf("Tea 150Ft\n");
state=FIZETETT;}
else if (c=='c')
{printf("Forrocsoki 200Ft\n");
state=FIZETETT;}
else if ( ( c != 'k' ) || ( c != 't' ) || ( c != 'c' ) )
printf("rossz\n");
break;
}
case FIZETETT:
{
printf( "valami szoveg\n" );
state = KESZ;
break;
}
case KESZ:
{
printf( "megint szoveg\n" );
state = ALAP;
break;
}
}
}
return 0;
}Egyet nem értek, ha lefuttatom, magától lefut még1x vagy 2x. return-t kéne átírni? 0-val kezdi előlről az egészet? Mintha tárolná valahol azt, hogy előző körben mit adtanm meg neki.
-
Bigro
újonc
Sziasztok!
Az alábbi problémához szeretnék segítséget kérni tőletek.
Szeretnék egy olyan számlálót létrehozni, ami hozzáad az előző értékhez. Tehát 0-val kezd, ha beírom, hogy 10 akkor 10 lesz, ha beírom, hogy 20 akkor már 30 stb. És ez menjen el egy értékekig. Mondjuk ertek_max>=200. Ha átlépi vagy egyenlő 200-el a számláló, akkor írjon ki egy üzenetet.int ertek=0 //szerintem switch szerkezet
switch(ertek)
{
case 10:
ertek += 10;
break;
case 20:
ertek += 20;
break;
case 50:
ertek += 50;
break;
case 100:
ertek += 100;
break;
default:
printf("Hibas érték!\n");Én valami ilyesmire gondoltam,remélem jó úton indultam el , de nem tudok tovább jutni :/(sajnos elég kezdő vagyok még)
Köszönöm a segítséget előre is. -
stepboy
csendes tag
válasz kpisti1990 #5734 üzenetére
A "while( 1 )" az végtelen ciklust jelent, mindig fut a kód amíg nem lépsz ki a ciklusból (például egy "break"-kel). A return-t el sem éri.
Amire gondolni tudok, hogy ez a ciklus a gépeden natívan fut, ergo nagyon gyors - az egyetlen hely ahol várakozik, az a billentyű lenyomása. Tehát amikor lenyomod a billentyűt, azt gyorsan kiértékeli és végig pörög a statemachine-en végül minden kezdődik elölről; de te még mindig ugyanazt a billentyűt nyomod, ezért úgy tűnik, mintha ismételné magát a program, pedig csak többször lefutott. Ez csak egy tipp, sajnos nem ismerem a stdio-t annyira, hogy megtudjam mondani valóban ez történik a te esetedben is.Úgyhogy, lehet hogy érdemes lenne valami lassítást rakni az állapotgépedbe:
- ALAP: ide nem kell, mert itt várakozik egy billentyű lenyomásra
- FIZETETT: ide valamilyen késleltető függvény, ami érzékelhetően feltartatja a programfutást (~1s kb.), tehát kiírja a szöveget, majd várakozik és utána lép a következő állapotba
- KESZ: itt ezt írod "-végén (ital elvételekor) álljon vissza alap állapotba", ebből nekem úgy tűnik, hogy valamilyen gombbal kell jelezni, hogy elvetted az italt, tehát az is billentyű beolvasás kell, hogy legyen.case FIZETETT:
{
printf( "valami szöveg\n" );
kesleltet_ms( 1000 );
state = KESZ;
break;
}A "kesleltet_ms()" pedig egy nagyon hosszú ciklus, ami a megadott milliszekundumnyi ideig várakozik:
void kesleltet_ms ( int ms )
{
while ( ms )
{
ms--;
for ( int c = 0; c < 65535; c++ )
{
/* ez itt ures */
}
}
}Ez egy nagyon kezdetleges megoldás, a belső "for" ciklust úgy kell tuningolni, hogy nagyjából 1 milliszekundum alatt érjen végig, szóval a c-t addig kell növelni.
Két nagyon fontos dolog:
- fordítás mindenféle optimalizáció nélkül (hogy biztosan benne legyen a lefordított kódban a ciklus és végig is menjen rendesen)
- a típusod olyan legyen, amibe a szám amit vizsgálni akarsz még elfér (tehát ha csak 16bites "int"-ed van, abba értelemszerűen 65535-nél nagyobb szám nem fér bele)Itt egy profibb megoldás: [The delay() Function]
A kilépésre meg azt javasolnám, hogy a while( 1 ) helyett legyen valami ilyesmi:
int bentmarad = 1;
while ( bentmarad )
{
switch ( state )
{
case ALAP:
{
printf( "szöveg\n" );
char c = getchar();
if ( ( c != 'k' ) || ( c != 't' ) || ( c != 'c' ) || ( c != 'q' ) )
{
printf( "rossz billentyű\n" );
}
else if ( c == 'k' )
{
printf( "jó betű 1.\n" );
state = FIZETETT;
}
else if ( c == 't' )
{
printf( "jó betű 2.\n" );
state = FIZETETT;
}
else if ( c == 'q' )
{
printf( "viszlát\n" );
bentmarad = 0;
}
...Tehát egy külön billentyűvel megszakítod az egész ciklust - persze, ha a feladatkiírás ezt nem teszi lehetővé, akkor nem kell belerakni a végleges kódba.
[ Szerkesztve ]
-
stepboy
csendes tag
Rossz úton indultál el; mert a switch szerkezeted csak véges értéket fogad el - a 0-t például hibásnak vesz, pedig azt akarod alapértéknek.
Amire szükséged lesz:
1. szám beolvasás
2. számok összeadása
3. feltétel vizsgálat (igaz, akkor kiír egy üzenetet, ha nem akkor vissza az 1.-es pontra)Ha így nézed, ez egy ciklus. Tehát neked valamilyen ciklusra lesz szükséged. Ciklus: működés
-
kpisti1990
csendes tag
válasz stepboy #5737 üzenetére
Szia!
Igen, leírásban IR szenzor ad jelet ha elvették az italt, itt én arra gondoltam, hogy egy számláló leszámol pár secundumot és akkor visszaáll. Másként nem igazán lehet szerintem szimulálni. Köszönöm a részletes választ kipróbálom, próba cseresznye ahogy egy ősi kínai mondás tartja
-
stepboy
csendes tag
válasz kpisti1990 #5741 üzenetére
hát windows.h-val csak windows-on működik a kód, de jó nyomon jársz.
-
XharX
aktív tag
Sziasztok!
A kérdéseim nagyon amatőrek lesznek tudom, de a programozással csak most ismerkedem egy alapozó tárgy keretében és átfutva az elmélet vizsgatémaköröket egyedül a bitműveletekből nincs megfelelő anyagom(ha esetleg valaki tud ilyet és linkelné egy hős lenne ).
Szóval a következő pár feladat nem egyértelmű:"Hogyan kell egy unsigned char típusú változóban egy bit értékét lekérdezni? Milyen maszkot készít és milyen operátort használ?"
"Mutassa be, hogyan készít olyan unsigned char típusú maszkot, amelyben a 2., 3., és a 6. indexű bit egyes, a többi viszont nulla."
"Írjon példákat a kizáró vagy operátor gyakori alkalmazásaira!"
Természetesen alap dolgok azért megvannak, mint a maszkolás stb.
-
kispx
addikt
-
buherton
őstag
Házi feladatként találd ki és írd meg ide, hogy kispx első feladatra adott két megoldása minben különbözik egymástól.
[ Szerkesztve ]
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
XharX
aktív tag
Köszönöm!
-
DasBoot
aktív tag
Szép napot, Mindenkinek! Tudom, sok a kezdő kérdés, Én is ide tartozom, és leegyszerűsítve: mi kell ahhoz, hogy kiírjam az adott szöveget a képernyőre? Konkrét válaszokat szeretnék, részletesen. Köszönöm a válaszokat. Üdv.: Joe
LEGO-ból bármit megépíteni, csak idő kérdése.
-
kispx
addikt
válasz DasBoot #5747 üzenetére
#include <stdio.h>
A fájl elejérekiírni pedig
printf("Szoveg");
utasítással tudsz;
A printfről egy kicsit részletesebben.
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Huawei Watch Fit 3 - zöldalma
- Vicces képek
- Sorozatok
- Politika
- Kerékpárosok, bringások ide!
- Milyen billentyűzetet vegyek?
- Arena Breakout: Infinite
- Az Apple szerint ejteni kell az USA trösztellenes perét
- exHWSW - Értünk mindenhez IS
- Visszavonta az Intel és a Qualcomm Huawei-hez kiadott exportlicencét az USA
- További aktív témák...
- iPhone 15 Pro 128GB - full karcmentes, dobozos, 100% akku, garancia
- Zero 9 (Techlife X6) elektromos roller (35km táv, 45km/h sebesség)
- Dell G5 5590 15.6" FHD IPS i5-9300H GTX 1650 16GB 1TB magyar vbill ujjlolv új akku gar
- Xbox Series X 1TB - 9 hónap garancia, vállalkozástól!
- ESP8266 offline ETAHEN / GOLDHEN wifi modult
- Ds, 3Ds játékok - Ds Stylusok, Ds Lite fóliák, töltők, - R4 Wood, R4 Gold, R4 SDHC is!
- Asztali Pc Intel I5
- Gigabyte H87M-D3H i5 Intel asztali számítógép 8GB HDMI, munkára tanulásra játékra PCIe 3.0
- Eladó eredeti, bontatlan Apple Milanese Loop, 44/45mm, ezüst színű, számlával
- iPhone XR Használt, 64gb, karcmentes előlap és hátlap
Állásajánlatok
Cég: Alpha Laptopszerviz Kft.
Város: Pécs
Cég: Ozeki Kft.
Város: Debrecen