Stránka 1 z 4

C# jednoduchý program alá bankomat

Napsal: 04 led 2013 11:00
od Blackie
Zdravím :)
Mám za úkol naprogramovat jednoduchý program bankomatu, ale protože náš učitel neumí učit, potřebovala bych poradit, jak to vůbec udělat. Probrali jsme cykly, ukázali si pár věcí, jako třeba jak v programu udělat menu. Nic víc.
Zároveň sháním někoho, kdo C# rozumí a kdo by mohl doučovat.

Ten bankomat by měl být nějak takto:
Seznam jmen s číslem karty, pinem a částkou na účtě. Při spuštění programu, zadat pin a číslo karty, zkontrolovat, zda všechno sedí (když ne nějaké upozornění) a pak zobrazit kolik je na účtě. Po zadání částky a po "vybrání" z původní částky odebrat. + takové ty okecávačky jako "dobrý den" "váš zůstatek" a "děkujeme, nashledanou"

Zkoušela jsem i nějaké učebnice, ale jako začátečník úplně nevím co mám hledat. Je mi hloupé to sem takto napsat, aby to někdo naprogramoval za mě, nehledě na to, že se to potřebuji naučit a kopírováním mi to do hlavy nenaleze, ale stačilo by, kdyby mi někdo poradil, čím jednotlivé části toho programování udělat např. "ten seznam udělám přes tento příkaz, odečítání částky přes tento příkaz" a já už si to nějak dohledám.
Programujeme ve Visual Studiu 2012

Budu vděčná za jakoukoliv radu :)

Re: C# jednoduchý program alá bankomat

Napsal: 04 led 2013 12:29
od faraon

Re: C# jednoduchý program alá bankomat

Napsal: 04 led 2013 18:55
od domitea
Faraon: Jazyk z Javy a struct ? Tak dobře, ale mému učiteli se to nelíbilo (za 4 :lol: )

Já bych to udělal přes třídu ( Objetové orientované programování), to je obvyklý postup dnešního světa. Ale v letech 70. a 80. frčel faraonův postup ( strukturální programování - struct ), který mimo jiné je používán dodnes, ale ne na tyhle věci pod úroveň :lol:

Nicméně v rámci jednoduchosti se to dá udělat i přes pár polí :lol: , což ukážu, až to napíšu :wink:

// jdem na to: čistě popisně, ale funguje :wink:

Mějme tabulku:

Kód: Vybrat vše

index  Jmeno = string |   Ucet = int |   Pin = int |   Castka = double
0      karel novak |   123456 |   1234 |   20000
1      jan hynek |   569874 |   9857 |   50000000
2      chuck norris |   254412 |   2563 |   36666666666
3      brad pitt |   522367 |   7420 |   1564864
4      tony agelo |   243545 |   1125 |   3576354
5      spejbl |   577411 |   2542 |    35435453
6      George Bool |   100101 |   1110 |   1000101000011
7      Jaroslav hasek |   752214 |   1255 |   8787878287
8      Miroslav simek |   983325 |   1146 |   2872724278
9      Oscar Boelke |   111111 |   3547 |   27287222284




Není moc hezká, aspoň ty svislice označují, co ke komu paří (vždycky oddělují sloupec). Takže tam máme možnost udělat pole, ale každý sloupec má jiný typ proměnné, takže nemůžeme udělat dvourozměrné, to nám ale nebrání udělat několik jednorozměrných o různých typech :idea:

Dá se tedy udělat několik jednorozměrných polí, které budou zastávat určité věci a budou pro nás představovat různé tabulky, !!! MUSÍ ALE MÍT STEJNOU DÉLKU !!!, pak by to už nefungovalo jak chceme ;) (takže bodou pole jmena, ucty, piny a castky -- vše to tam je naznačené a budou mít délku 10 --> může být i víc)

Vyhledávání uživatele:

Znáš cykly ? Pokud ano máš vyhráno. Uživatel zadá číslo účtu a prohledá pole ucty, pokud najde, zapíše si index účtu (bude se hodit) a ukončí se (break), když nic nenajde, vypíše chybovou hlášku. Pak už jen vezme pin uložený podle indexu (piny[index] == nacteny_pin) a porovná, pokud je shodný, můžeme vybírat, pokud ne, dáme facku a vyluxujeme konto :twisted:

Výpis jména:

Použijeme zapsaný index z předchozího hledání a pouze načteme uložené hodnoty (textbox1.text = jmena[index];)

Strhnutí částky z účtu:

Získáme vyžadovanou částku od uživatele a zase pomocí indexu nalezneme částku a pomocí odečítání ( :-o cože ? :lol: ) odečteme částku (castky[index] = castky[index] - potrebny_obnos)

Tak a to je asi tak všechno. potom na různé chybové hlášky se ti bude Message box, MSDN řekne více ;)

Re: C# jednoduchý program alá bankomat

Napsal: 04 led 2013 19:41
od faraon
Když už tvůj učitel učil takové sr[PÍP]ky, tak se aspoň mohl podívat do M$DN :lol:

Kód: Vybrat vše

public struct Point
{
   public int x, y;

   public Point(int p1, int p2)
   {
      x = p1;
      y = p2;   
   }
}

Ale určitě neuškodí zabalení toho pole struktur i s metodami které s ním přímo pracují do jedné třídy, bude se k tomu všemu jednodušeji přistupovat, samotný hlavní program se zjednoduší na volání těch metod a vyhodnocení jejich odpovědí.

Pozor na terminologii, strukturální (strukturované) programování nemá s datovými strukturami nic společného kromě shody jednoho slova v názvu, v něm jde o strukturu řízení běhu programu, tedy rozhodování kterou cestou se dát, zatímco pro složenou datovou strukturu by se hodil spíš název z Pascalu - record (česky záznam). To Céčkové pojmenování je fakt trochu matoucí.

Osobně bych si pro tak jednoduchou úlohu vystačil také jen s několika poli (kdyby tam byla jen čísla, tak dokonce jen s jedním dvourozměrným), ale já jsem se holt naučil programovat v prehistorickém BASICu, kde nic složitějšího nebylo k dispozici :listen:

Re: C# jednoduchý program alá bankomat

Napsal: 04 led 2013 20:15
od domitea
Aktualizace předchozího příspěvku :)

Jak jsem mohl vědět, že faraon odepíše ? :lol:

Faraon: učitel vše řešil přes třídu, vše ! :?

Re: C# jednoduchý program alá bankomat

Napsal: 04 led 2013 22:52
od faraon
No bodejť bych neodepsal, hádáme se tu spolu ode dne kdy jsem se tady poprvé objevil
lool.gif
lool.gif (34.28 KiB) Zobrazeno 1729 x


A takhle bych na to šel já:

Kód: Vybrat vše

zobrazit(uvítání);
zadat(karta);
zadat(pin);
if (existuje(karta,pin))
   {
   zobrazit(zůstatek);
   zadat(castka);
   if (vybrat(karta,castka))
      {
      zobrazit(potvrzení);
      vydat(castka);
      }
   else
      zobrazit(málo peněz!);
   }
else
   zobrazit(chybná identifikace!);

Je to scénář hlavního programu, který by měl běžet v nekonečné smyčce. A jestli si to ty metody budou řešit přes pole, struktury, nebo třeba databázi běžící podle poslední módy v nějakém cloudu na druhém konci světa, je úplně jedno.

P.S. Akorát doufám že ten "třídní" učitel nebyl tvůj třídní...
P.P.S. Proč já, proč zrovna já jsem musel mít třídního tělocvikáře? :lol:

Re: C# jednoduchý program alá bankomat

Napsal: 04 led 2013 23:25
od Sender
Nevím jak Visual Studiu 2012 C# (kdysi jsem několik prográmků psal v VC++ 6),ale v Delphi (i v VC++ 6) bych na to šel jinak.Ono záleží jak přesně by měl ten program vypadat.Pokud se do nějakýho editačního pole (Edit) zadávají z klávesnice nějaký hodnoty -kontroloval bych pole v události OnKeyUp(v Delphi),pokud tam budou nějaký tlačítka,tak zase na událost stisku tlačítka se provede něco.Je to primitivní záležitost...

Re: C# jednoduchý program alá bankomat

Napsal: 05 led 2013 03:42
od CZechBoY
Sender: a co když dám pravej klik->vložit? tam žádnou klávesu nemačkám ;)

Re: C# jednoduchý program alá bankomat

Napsal: 05 led 2013 08:04
od faraon
Sender píše:pokud tam budou nějaký tlačítka,tak zase na událost stisku tlačítka se provede něco

Však tohle klidně může být v té metodě zadat(), když si tam namaluješ numerickou klávesnici, tak si všechna ta čísla naklikáš. Ale hlavní program to nijak neovlivní, je to pouze věc uživatelského rozhraní.
V nejdůležitější části programu - rozhodování - žádné takové věci nikdy být nesmí, to by byla stejná debilita jako grafické služby v jádře Window$, což je neodstranitelná bezpečnostní díra (ostatně jedna z mnoha podobných), kvůli které ten systém nikdy nebude možné úplně zabezpečit. Vždycky zůstanou nějaké boční kanály, jako součást WinAPI.

Co tedy dělá bankomat?
1. Slušně pozdraví.
2. Čeká na zadání čísla karty.
3. Čeká na zadání PIN.
4. Zeptá se databáze jestli údaje platí.
5. Když ne, pošle tě do (_!_) a skončí.
6. Když ano, zobrazí zůstatek.
7. Čeká na zadání částky.
8. Zkusí částku vybrat (a nebo jí nejdřív porovná se zůstatkem, ale takhle je to jednodušší).
9. Metoda vyber() zkontroluje zůstatek a buď částku v databázi odečte a potvrdí výběr vrácením True, nebo vrátí False.
10. Když byl zůstatek menší než požadovaná částka, vynadá zákazníkovi.
11. Když se výběr podařil, tak oznámí vydání peněz, a může třeba nasimulovat výčetku bankovek a mincí, jak je zákazník dostane, s tím si může hrát metoda vyber().
12. A na závěr, když se všechny větve zase spojí, se rozloučí, to v tom mém scénáři už není.

Takže hlavní program zůstává pod dvacet řádků a při změně nebo úpravách uživatelského rozhraní se nijak nemění. Je mu úplně jedno jestli tam bude dotykový displej, nebo čtečka děrných štítků, to se řeší úpravou jen příslušné metody, která se pak důkladně otestuje a odladí samostatně. A podle toho bude zvenku ten program vypadat, i když se v jádře vůbec nic nezmění, upraví se pouze třída User, která načítá čísla a zobrazuje zprávy. Naopak se úpravy nesmí dotknout třídy Card, která se stará o operace s kartou, a která obsahuje databázi bankovních účtů, ke které nikdo jiný z jiné části programu nemůže a nesmí přistupovat. A ve třídě Machine se bude provádět vydávání peněz samotným strojem, to už je věc konstruktéra hardwaru toho bankomatu.
Takhle by se to mělo líbit i třídnímu domitey ;-)

Jen takový zábavný příklad: budeš mít v programu dvacet vstupních údajů a podle nich dvacet různých větvení. Pokud je všechny nacpeš do jedné kupy hnoje (jinak se takovému programu říkat nedá), tak budeš muset otestovat 2^20 kombinací vstupních údajů, v případě že zadáváš pouze ANO/NE. Jestli tam budou číslice 0-9, bude to už 10^20 kombinací! Ale když každý ten vstupní údaj budeš řešit v samostané metodě, tak těch testů bude potřeba 2x20 nebo 10x20. Udělat 200 testů není takový problém, ale chtěl bych tě vidět jak čekáš na výsledek 100000000000000000000 testů a hledáš v takovém programu skrytou chybu :sick:

Re: C# jednoduchý program alá bankomat

Napsal: 05 led 2013 11:27
od Sender
CZechBoY píše:Sender: a co když dám pravej klik->vložit? tam žádnou klávesu nemačkám ;)

Změnou obsahu Editačního pole nastane událost OnChange -bez ohledu na to,jestli byl obsah vkládán pomocí klávesnice,nebo vkládáním ze schránky. V čistém WinAPI nejsem moc v obraze,je to už řada let co jsem v tom psal.C# nedovedu poradit ,zamrznul jsem na Pascalu -hlavně Delphi (C,C++ velmi vyjímečně)

Re: C# jednoduchý program alá bankomat

Napsal: 05 led 2013 11:30
od domitea
Faraon: Třídní byla matikářka :wink: . "Třídnímu" by to připadalo moc komplexní řešení na tak jednoduché zadání :lol: . Hádka navíc vytváří příjemné konkurenční prostředí. Navíc mé řešení testuje postupně (když je to dobře, jdu dál) , takže jen 3 kontroly :lol:

Sender: Naše návrhy jsou tak vymyšlené, že je můžeš ovládat i přes příkazovou řádku. Záleží jak to tazatelka potřebuje, jestli hezky "Metroidní", nebo hezky Unixácké :lol:

Re: C# jednoduchý program alá bankomat

Napsal: 05 led 2013 12:25
od Blackie
Téda takovou odezvu jsem nečekala :D
Takže něco jako podklad tu mám, už to jenom dát dohromady :/ :D dala by se ta pole od Domitea sloučit s postupem programu, co navrhuje Faraon? Protože jeho návrh je dost podobný tomu, o co jsem se snažila já, i když to nefunguje :)
A protože bohužel příliš nechápu, o co se tu hádáte, k poslednímu Domiteovu příspěvku můžu říct jen že, čím jednodušší, polopatičtější a blbuvzdornější, tím lepší :) Jenom aby to fungovalo.
Omlouvám se že vím odepisuji až teď, ale po včerejším odpoledni jsem myslela že přidávání příspěvků skončilo s prvním Faraonovým a víc se tím nebude nikdo zabývat :)