Autor |
Správa |
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 20 Apr 2012, 09:57
|
|
|
Program odpočíta po sekundách od 10 do nuly a potom niečo spraví. Jediný použitý znak na vykreslovanie je * (hviezdička). |
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 06 Jan 2012, 21:57
|
|
|
Užívatelia systému MS Windows a DevC++(kompilátor pre win) majú oproti Linuxákom jednu výhodu a jednu nevýhodu. Výhoda spočíva v tom, že nemusia písať nič do príkazového riadku v termináli a stačí im stlačiť tlačidlo. Z tých troch tlačidiel vyznačených na obrázku to vľavo spôsobí, že sa program skompiluje, prostredné tlačidlo spôsobí, že sa program spustí a tretie tlačidlo v poradí spôsobí, že sa program najprv skompiluje a potom spustí. Odkaz na stiahnutie je v ďalšom príspevku.
Kompilátor ktorý som chviľku používal vo windows xp (vhodný pre Windows 2000 / XP / Vista / 7) sa nazýva Code::Blocks. Tu si ho môžte stiahnuť .
Ak pri inštalácii narazíte na takéto niečo: problem.PNG znamená to, že v adresári C:\Program Files sa nedá vytvoriť zložka CodeBlocks, preto zmeňte cestu niekde inde. Napríklad D:\
Niekedy sa stane, že nefunguje kompilácia. V takom prípade je potrebné spraviť toto: cb_problem1.png cb_problem2.png Na všetky otázky dať OK a malo by to byť v poriadku. |
|
|
Globálne oznámenie Skočiť do témy |
Hosť |
|
|
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 24 Máj 2012, 07:13
|
|
|
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 03 Feb 2012, 11:27
|
|
|
Používám DEV-C++, to tvoje jede. Jestli to chapu spravne, getch() bere primo znak z bufferu ( proto ho tisknes putch() ) bez cekani na enter, kdezto getchar() ceka potvrzeni a tedy i znak vytiskne ? Je to presne ako píšeš. Práve som si stiahol a nainstalil devccp, idem testnúť ten tvoj program.
Ide, len mi hneď zhasne. Niečo si asi upravoval vo win, aby to ostalo, je tak? Poraď. |
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 03 Aug 2012, 10:31
|
|
|
Vychadzam z ucebnice od Herouta a on navrhuje 2 medzery. Editorov na pisanie kodu je strasne vela a mnohe ani nenavrhuju odskoky v blokoch. Vsetko zálezi na programatorovi. Jedna zasada je vsak velmi dolezita. Treba aby bol kod prehladny a dobre citatelny aj tomu, kto ho nepisal.
pisane v krcmicke na pivku z mobilu iPhone |
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 20 Okt 2012, 15:44
|
|
|
Bol som stanovený predsedom inventarizačnej komisie na hnuteľný majetok. V majetku je vyše 2 000 položiek a väčšina z nich má po viac kusoch. Navyše sú položky rôzne rozčlenené zhruba do 148-ich súčastí. Teraz to vysvetlím ľudsky. :D Napríklad: Ja som jedna súčasť, moja kancelária je druhá súčasť. Ja mám na karte (položka) - PC, (položka) - tlačiareň, (položka) - scaner. V mojej kancelárii je (položka) - písací stôl, (položka) - stôl pod PC, (položka) - skriňa atd.
Potreboval som v Exceli 2007 vytvoriť súbor, v ktorom by som mal prehľad o tom, aké položky máme na stave, aké sú súčasti, čo majú na stave jednotlivé súčasti, kontrola či sa skutočnosť rovná tomu čo je na stave a všetko to musí spolupracovať aj po zadaní akejkoľvek zmeny.
Za pomoci jednoduchého makra som vytvoril 148 nových listov očíslovaných od 1 do 148. (komentáre tu začínajú apostrofom ') Sub VytvorListy()
Dim i As Integer ' deklarácia premennej typu int
For i = 1 To 148 ' cyklus 1 až 148 Worksheets.Add After:=Worksheets(Worksheets.Count) ' vytvor nový pracovný hárok Worksheets(Worksheets.Count).Name = i ' s názvom i, teda 1 až 148 Next i
End Sub
Takto sa vytvára makro: excel1a.JPG Napíšeš názov a dáš vytvoriť. excel2.JPG Obsah tela makra treba dopísať. excel3.JPG Takto sa spustí: excel4.JPG
Ďalší list som nazval "celkom", vytvoril som v ňom tabuľku s údajmi o položkách (vyše 2000), toto bolo najpracnejšie, pretože som ich tam musel nahádzať jednotlivo po riadkoch so všetkými potrebnými údajmi.
Ukážka: excel.JPG
Potom som vytvoril makro, ktoré do listov 1 až 148 vložilo tabuľku z listu "vzor" (upravená tabuľka !celkom") s pridaným stĺpcom na zadanie skutočného množstva položiek u súčastí (všade je tlačitko pre skok na list "obsah"). Sub VlozDatabazuNovu() ' ' VlozDatabazu Makro '
' ' definovanie celočíselnej premennej i Dim i As Integer ' pracuje na pozadí Application.ScreenUpdating = False ' aktivácia listu vzor Sheets("vzor").Select ' vybranie stĺpcov Columns("A:H").Select ' skopírovanie vybratých stĺpcov do pamäti Selection.Copy ' vytvorenie slučky 1 až 148 For i = 1 To 148 ' aktivácia i-teho listu v poradí (nie názvu) Sheets(i).Select ' aktivácia bunky A1 Range("A1").Select ' vloženie skopírovaného ActiveSheet.Paste ' zápis do bunky E2 i-té číslo Cells(2, 5) = i ' aktivácia bunky A1 Range("A1").Select ' ukončenie slučky Next i ' aktivácia listu vzor Sheets("vzor").Select ' zrušenie označenia kopírovanej oblasti Application.CutCopyMode = False ' aktivácia bunky A1 Range("A1").Select ' koniec práce na pozadí Application.ScreenUpdating = True End Sub Ďalej som vytvoril 148 makier - skok na list č. 1 - 148.
Ukážka: Sub tlac1() Sheets("1").Select End Sub Sub tlac2() Sheets("2").Select End Sub Sub tlac3() Sheets("3").Select End Sub Sub tlac4() Sheets("4").Select End Sub Sub tlac5() Sheets("5").Select End Sub Sub tlac6() Sheets("6").Select End Sub Sub tlac7() Sheets("7").Select End Sub ... Nasledujúci list som nazval "obsah" a v ňom som vytvoril 148 tlačítok na 148 súčastí a priradil som im makrá skok na list č.1 - 148 (zmazal som názvy súčastí, to vás nemusí zaujímať :D ) excel1.JPG
Ďalšie makro je aktualizácia databázy, to sa použije vždy, keď sa niečo zmení v liste "celkom", aby sa zmeny premietli do listov 1 - 148. Sub AutualizujDatabazu()
Dim i As Integer ' pracuje na pozadí Application.ScreenUpdating = False ' aktivácia listu číslo celkom Sheets("celkom").Select ' vybranie oblasti buniek Range("A4:E1600").Select ' skopírovanie vybratých stĺpcov do pamäti Selection.Copy ' vytvorenie slučky 1 až 148 For i = 1 To 148 ' aktivácia i-teho listu v poradí (nie názvu) Sheets(i).Select ' aktivácia bunky A1 Range("A4").Select ' vloženie skopírovaného ActiveSheet.Paste ' zápis do bunky E2 i-té číslo ' Cells(2, 5) = i ' aktivácia bunky A1 Range("A1").Select ' ukončenie slučky Next i ' aktivácia listu číslo celkom Sheets("celkom").Select ' zrušenie označenia kopírovanej oblasti Application.CutCopyMode = False ' aktivácia bunky A1 Range("A1").Select ' koniec práce na pozadí Application.ScreenUpdating = True End Sub Na toto všetko mi stačili stránky o visual basic excel 2007 a základy céčka.
Teraz som však potreboval aby sa mi do jednej bunky v liste "celkom" automaticky spočítavali obsahy bunky (napr.) E7 z každého listu (1 - 148). Minulý rok som to robil tak, že som klikol na liste "celkom" na príslušnú bunku, kde sa to malo spočítavať, potom na "suma" a pomaly som prechádzal list po liste, všade označil bunku E7 a stlačil +. Trvalo to hrozne dlho, bolo to deprimujúce a mohol som sa pomýliť, niečo vynechať, niečo zapísať viackrát.
Tohto roku som to vyriešil veľmi jednoducho. Jednoduchý programík v céčku vytvoril potrebný (poriadne dlhý) reťazec, ten som z výstupu programu skopíroval, vložil do word súboru (bolo treba odstrániť znaky '\n', ktoré pri výpise príkazový riadok automaticky vytvorí) na malú úpravu, odtiaľ do konkrétnej bunky listu "celkom" a bolo vystarané.
#include <stdio.h> #include <string.h>
int main (void) { int i; char slovo[2000], pom[10];
slovo[0] = '\0'; for ( i = 1; i <= 190; i++) { sprintf(pom,"'%d'!F4+", i); strcat(slovo, pom); } printf("%s\n", slovo); return 0; } Výpis vytvoreného reťazca: '1'!F4+'2'!F4+'3'!F4+'4'!F4+'5'!F4+'6'!F4+'7'!F4+'8'!F4+'9'!F4+'10'!F4+'11'!F4+'12'!F4+'13'!F4+'14'!F4+'15'!F4+'16'!F4+'17'!F4+'18'!F4+'19'!F4+'20'!F4+'21'!F4+'22'!F4+'23'!F4+'24'!F4+'25'!F4+'26'!F4+'27'!F4+'28'!F4+'29'!F4+'30'!F4+'31'!F4+'32'!F4+'33'!F4+'34'!F4+'35'!F4+'36'!F4+'37'!F4+'38'!F4+'39'!F4+'40'!F4+'41'!F4+'42'!F4+'43'!F4+'44'!F4+'45'!F4+'46'!F4+'47'!F4+'48'!F4+'49'!F4+'50'!F4+'51'!F4+'52'!F4+'53'!F4+'54'!F4+'55'!F4+'56'!F4+'57'!F4+'58'!F4+'59'!F4+'60'!F4+'61'!F4+'62'!F4+'63'!F4+'64'!F4+'65'!F4+'66'!F4+'67'!F4+'68'!F4+'69'!F4+'70'!F4+'71'!F4+'72'!F4+'73'!F4+'74'!F4+'75'!F4+'76'!F4+'77'!F4+'78'!F4+'79'!F4+'80'!F4+'81'!F4+'82'!F4+'83'!F4+'84'!F4+'85'!F4+'86'!F4+'87'!F4+'88'!F4+'89'!F4+'90'!F4+'91'!F4+'92'!F4+'93'!F4+'94'!F4+'95'!F4+'96'!F4+'97'!F4+'98'!F4+'99'!F4+'100'!F4+'101'!F4+'102'!F4+'103'!F4+'104'!F4+'105'!F4+'106'!F4+'107'!F4+'108'!F4+'109'!F4+'110'!F4+'111'!F4+'112'!F4+'113'!F4+'114'!F4+'115'!F4+'116'!F4+'117'!F4+'118'!F4+'119'!F4+'120'!F4+'121'!F4+'122'!F4+'123'!F4+'124'!F4+'125'!F4+'126'!F4+'127'!F4+'128'!F4+'129'!F4+'130'!F4+'131'!F4+'132'!F4+'133'!F4+'134'!F4+'135'!F4+'136'!F4+'137'!F4+'138'!F4+'139'!F4+'140'!F4+'141'!F4+'142'!F4+'143'!F4+'144'!F4+'145'!F4+'146'!F4+'147'!F4+'148'!F4 |
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 31 Jan 2013, 15:15
|
|
|
Máš pravdu. Je to výborne napísané, ale predsa mám malú pripomienku k štruktúre programu. Proste bloky píš tak, aby to bolo prehľadnejšie. Keď si na to nezvykneš, budeš mať myslím v budúcnosti problémy. (Upravil som tvoj program)
Attachment: cifernysucet2.cpp |
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 24 Mar 2013, 09:58
|
|
|
Pokúsim sa ti vysvetliť tú 15. úlohu z 5. lekcie.
Hexadecimálne čísla sa skladajú z čísiel 0 - 9 a znakov a - f alebo A - F. Čísla 0 - 9 majú svoju hodnotu, teda 0 - 9. Znaky a - f (A -F) majú nasledujúce hodnoty: a - 10 b - 11 c - 12 d - 13 e - 14 f - 15 To isté je pravda, aj keď sú to veľké písmená.
Prvá časť úlohy je zadať z klávesnice 2 znaky v rozsahu '0' - '9' alebo 'A' - 'F'. To ti určite problém nerobí. Zoberme to tak, že bolo zadané F 9. Teda F9 je hexadecimálne číslo, ktoré má nejakú decimálnu hodnotu a tú teraz vypočítame:
samotné F má hodnotu 15 9 má hodnotu 9
Keď sa pozrieš na tento príspevok , mal by si pochopiť princíp výpočtu.
Čiže výpočet je nasledovný:
F(15) * 16 (na prvú) + 9(9) * 16 (na nultú)
teda
(15 * 16) + (9 * 1) = 240 + 9 = 249
Hodnota F9(hexadecimálne) je 249(decimálne).
Ešte jedna pomôcka a keď budeš trošku premýšľať, program napíšeš. Podľa ASCII tabuľky (2. lekcia) má každý znak decimálnu hodnotu a my si ju vieme vypísať, poprípade dosadiť do vzorca.
Príklad: 'F' má hodnotu 70, ale my potrebujeme aby bola hodnota 15. Teda 'F' - 55 = 15 '9' má hodnotu 57, ale my potrebujeme aby bola hodnota 9. Teda '9' - 48 = 9 Keď sa pozornejšie pozrieš do ASCII tabuľky, zistíš, že znaky '0' - '9' ('a' - 'f', 'A' - 'F') idú za sebou a ich decimálna hodnota stúpa po jednotkách. Teda aby si dostal správne výstupy zo zadaných znakov treba od: '0' - '9' odpočítať 48 'a - 'f' odpočítať 87 'A' - 'F' odpočítať 55 a dostaneš potrebné výstupy a môžeš ich dosať do vzorca. ;) |
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 03 Júl 2013, 17:20
|
|
|
Tak som to nakoniec napísal vo winform c#. Je to plne objektová aplikácia.
Attachment: Databáza.png Dávam sem zdrojáky:
Attachment: Databáza.zip a exe súbor:
Attachment: CSV.zip
Kto má čas a chuť, vyskúšajte to prosím a napíšte, ak niečo nefunguje korektne.
Díky, libcosenior. |
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 09 Feb 2015, 18:40
|
|
|
Vždy, keď si nie som istý, nájdem si riešenie cez google: http://stackoverflow.com/questions/210590/why-does-scanf-need-lf-for-doubles-when-printf-is-okay-with-just-f
Because C will promote floats to doubles for functions that take variable arguments. Pointers aren't promoted to anything, so you should be using %lf, %lg, %le or %la (C99) to read in doubles. Google preklad: Vzhľadom k tomu, C bude podporovať pláva zdvojnásobuje funkcií, ktoré sa variabilné argumenty. Ukazovatele nie sú podporované k ničomu, takže by ste mali používať %lf, %lg ,%le alebo %la (C99), čítať vo štvorhre.
Použitie: #include <stdio.h>
int main(int argc, char** argv) {
double cislo;
printf("Zadajte cislo:"); scanf("%lf", &cislo); printf("Cela cast cisla: %lf je: %d\n",cislo, (int)cislo); printf("Zadajte cislo:"); scanf("%lg", &cislo); printf("Cela cast cisla: %lg je: %d\n",cislo, (int)cislo); printf("Zadajte cislo:"); scanf("%le", &cislo); printf("Cela cast cisla: %le je: %d\n",cislo, (int)cislo); printf("Zadajte cislo:"); scanf("%la", &cislo); printf("Cela cast cisla: %la je: %d\n",cislo, (int)cislo);
return 0; } |
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 15 Feb 2015, 11:40
|
|
|
Vyčistenie konzoly win/linux
Zabezpečí prenositeľnosť medzi OS. #ifdef _WIN32 #define CLEAR "cls" #else //In any other OS #define CLEAR "clear" #endif Zmena velkosti okna konzoly a ďalšie triky: http://www.programming-techniques.com/2011/09/how-to-resize-console-window-using-c.html |
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 04 Mar 2015, 14:57
|
|
|
Poprípade riadok: if (i % 2 == 0){ nahraď týmto: if (i > 1){ |
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 29 Mar 2015, 21:43
|
|
|
Zapojil som sa do súťaže na itnetwork.cz a napísal som aplikáciu apríl. Ak by to niekoho zaujímalo, tak do prílohy dávam zip súbor. (windows)
Attachment: april.zip |
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 31 Mar 2015, 11:55
|
|
|
Pripravil som ti podklady na testami riadený vývoj systémom Black-box Testing: databaza.h #ifndef DATABAZA_H_INCLUDED #define DATABAZA_H_INCLUDED
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h>
/** Vytvori dynamicky prazdne pole retazcov o zadanom pocte prvkov * @param int pocet prvkov pola * @param int maximalna velkost retazca * @return pointer na pole pointerov */ char** vytvor_pole_pointerov(const int pocet_prvkov, const int velkost_retazca);
/** Uvolni pamat pola pointerov * @param pointer na pole * @param int pocet prvkov pola * return void */ void uvolni_pole_pointerov(char **p_pole, const int pocet_prvkov);
/** Vytvori dynamicky retazec a vrati ho * @param pointer na string * @return pointer na string */ char* vytvor_retazec(char *p_zdroj);
/** Naplni pole zadanym poctom retazcov * @param int pocet prvkov pola * @param pointer na pole stringov (vstupno-vystupny parameter) * @return void */ void napln_pole_stringov(const int pocet_prvkov, char **p_pole);
#endif // DATABAZA_H_INCLUDED databaza.c #include "databaza.h" //#define TESTY // zakomentovaním sa testy odstavia
char** vytvor_pole_pointerov(const int pocet_prvkov, const int velkost_retazca) { }
void uvolni_pole_pointerov(char **p_pole, const int pocet_prvkov) { }
char* vytvor_retazec(char *p_zdroj) { }
void napln_pole_stringov(const int pocet_prvkov, char **p_pole) { }
#ifdef TESTY #define POCET_PRVKOV 5 // Jano, Ivan, Miro, Jozef, Jana int main(void) { char **jednotlivci, **dvojice;
jednotlivci = vytvor_pole_pointerov(5); dvojice = vytvor_pole_pointerov(5);
// Test funkcie vytvor_retazec() char buffer[] = "Popokatepetl"; assert(strlen(vytvor_retazec(buffer)) == 12); printf("Test funkcie vytvor_retazec() presiel.\n");
// Test funkcie napln_pole_stringov() printf("\nZadaj po jednom retazce Jano, Ivan, Miro, Jozef, Jana a kazdy odentruj.\n"); napln_pole_stringov(POCET_PRVKOV, jednotlivci); assert(strcmp(jednotlivci[1], "Ivan") == 0); assert(strcmp(jednotlivci[4], "Jana") == 0); printf("\nZadaj po jednom retazce Jano Ivan, Jano Miro, Jozef Jana, Jana Ivan, Jozef Jano a kazdy odentruj.\n"); napln_pole_stringov(POCET_PRVKOV, dvojice); assert(strcmp(dvojice[1], "Jano Miro") == 0); assert(strcmp(dvojice[4], "Jozef Jano") == 0); printf("Tesy funkcie napln_pole_stringov() presli.\n");
free(jednotlivci); free(dvojice);
return 0; } #endif porovnanie.h #ifndef POROVNANIE_H_INCLUDED #define POROVNANIE_H_INCLUDED #include "databaza.h"
/** Zisti ci je prepojenie medzi vsetkymi menami, * teda ked sa da informacia jednemu z nich, ci sa dostane ku kazdemu * @param pointer na pole jednotlivych mien * @param pointer na pole dvojic mien * @return int 1 alebo 0 v true / false */ int porovnaj(char **jednotlivci, char **dvojice);
#endif // POROVNANIE_H_INCLUDED porovnanie.c #include "porovnanie.h" //#define TESTY // zakomentovaním sa testy odstavia
int porovnaj(char **jednotlivci, char **dvojice) { }
#ifdef TESTY int main(void) { char **jednotlivci, **dvojice_ok, **dvojice_nok, **dvojice_ok4;
jednotlivci = vytvor_pole_pointerov(5, 21); strcpy(jednotlivci[0], "Julka"); strcpy(jednotlivci[1], "Misof"); strcpy(jednotlivci[2], "Monika"); strcpy(jednotlivci[3], "Palo"); strcpy(jednotlivci[4], "YoYo"); dvojice_ok = vytvor_pole_pointerov(5, 41); strcpy(dvojice_ok[0], "Julka YoYo"); strcpy(dvojice_ok[1], "YoYo Misof"); strcpy(dvojice_ok[2], "Misof Julka"); strcpy(dvojice_ok[3], "Palo Monika"); strcpy(dvojice_ok[4], "Misof Monika"); dvojice_nok = vytvor_pole_pointerov(4, 41); strcpy(dvojice_nok[0], "Julka YoYo"); strcpy(dvojice_nok[1], "YoYo Misof"); strcpy(dvojice_nok[2], "Misof Julka"); strcpy(dvojice_nok[3], "Palo Monika"); dvojice_ok4 = vytvor_pole_pointerov(4, 41); strcpy(dvojice_ok4[0], "Julka Misof"); strcpy(dvojice_ok4[1], "Misof Monika"); strcpy(dvojice_ok4[2], "Monika Palo"); strcpy(dvojice_ok4[3], "Palo YoYo");
assert(porovnaj(jednotlivci, dvojice_ok) == 1); assert(porovnaj(jednotlivci, dvojice_nok) == 0); assert(porovnaj(jednotlivci, dvojice_ok4) == 1); printf("Testy funkcie porovnaj() presli.\n");
uvolni_pole_pointerov(jednotlivci, 5); uvolni_pole_pointerov(dvojice_ok, 5); uvolni_pole_pointerov(dvojice_nok, 4); uvolni_pole_pointerov(dvojice_ok4, 4);
return 0; } #endif
V header súboroch sú popisy jednotlivých funkcií vrátane funkčných prototypov. V source súboroch sú len názvy funkcií a testy funkcií. Aby si mohol testovať, treba odkomentovať riadok //#define TESTY // zakomentovaním sa testy odstavia Začať treba s modulom databaza. Ak sa ti bude chcieť, toto je najlepší spôsob programovania. Samozrejme treba vedieť tie testovacie časti aj napísať. To znamená, že problém treba rozdeliť na malé časti, na tie vymyslieť funkcie a mať prestavu, aké vstupy do nich a výstupy z nich použiť pri testoch. Čím viac rôznych testov prejde v poriadku, tým je menšia pravdepodobnosť chyby v programe. Nie je to ešte úplné, chýba tam modul behu celého programu(napr. priebeh.h a priebeh.c) a súbor main.c.
Ešte doplním, že do modulu porovnanie bude dobré pridať niekolko ďalších funkcií, aby tá jedna nebola špagety kód. |
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 15 Apr 2015, 09:36
|
|
|
Na itnetwork.cz jeden člen potreboval pomoc s touto hrou, tak som ju nakódil. ;) Samozrejme, že je to project zložený z niekoľkých header a source súborov:
grafika.h #ifndef GRAFIKA_H_INCLUDED #define GRAFIKA_H_INCLUDED
#include "cas.h" #include <windows.h>
/** definicie vykreslenia kociek s hodnotou 1 az 6 */ #define JEDEN printf("\ ***********\n\ * *\n\ * *\n\ * O *\n\ * *\n\ * *\n\ ***********\n\n")
#define DVA printf("\ ***********\n\ * *\n\ * O *\n\ * *\n\ * O *\n\ * *\n\ ***********\n\n")
#define TRI printf("\ ***********\n\ * *\n\ * O *\n\ * O *\n\ * O *\n\ * *\n\ ***********\n\n")
#define STYRI printf("\ ***********\n\ * *\n\ * O O *\n\ * *\n\ * O O *\n\ * *\n\ ***********\n\n")
#define PAT printf("\ ***********\n\ * *\n\ * O O *\n\ * O *\n\ * O O *\n\ * *\n\ ***********\n\n")
#define SEST printf("\ ***********\n\ * *\n\ * O O O *\n\ * *\n\ * O O O *\n\ * *\n\ ***********\n\n")
HANDLE wHnd; // Riadit pisanie do konzoly HANDLE rHnd; // Riadit citanie z konzoly
/** Nastavi sirku, vysku a nazov konzoly * @param int sirka * @param int vyska * @param retazec nazov konzoly * @return void */ void konzola(const int sirka, const int vyska, char *nazov_okna);
/** Nahodne vyberie kocku, tu vykresli a vrati jej hodnotu * @param void * @return void */ int kocka(void);
/** Hadze tromi kockami, vykresluje 9 hodou v intervale 100 milisekund * 10. hod necha viditelny * @param pointer na int prva kocka * @param pointer na int druha kocka * @param pointer na int tretia kocka * @return void */ void hod_kockou(int *p_x, int *p_y, int *p_z);
#endif // GRAFIKA_H_INCLUDED grafika.c #include "grafika.h"
void konzola(const int sirka, const int vyska, char *nazov_okna) { // Nastavi riadenie na citanie a zapis wHnd = GetStdHandle(STD_OUTPUT_HANDLE); rHnd = GetStdHandle(STD_INPUT_HANDLE); // Nastavenie nazvu okna SetConsoleTitle(nazov_okna); // Nastavenie velkosti okna: SMALL_RECT windowSize = {0, 0, sirka, vyska}; SetConsoleWindowInfo(wHnd, 1, &windowSize); }
int kocka(void) { int i;
i = rand() % 6 + 1; // nahodne cislo v rozsahu 1 - 6 switch (i) { case 1: // vykresli kocku s hodnotou 1 JEDEN; break; case 2: DVA; break; case 3: TRI; break; case 4: STYRI; break; case 5: PAT; break; case 6: SEST; break; }
return i; }
void hod_kockou(int *p_x, int *p_y, int *p_z) { int i;
for (i = 0; i < 10; i++) { // 10 krat cyklus system("cls"); *p_x = kocka(); // vykresli nahodnu kocku a do pointera ulozi hodnotu *p_y = kocka(); // -"- *p_z = kocka(); // -"- sleep(100); // zastavenie na 100 ms } // posledne kocky ostanu vykreslene } hra.h #ifndef HRA_H_INCLUDED #define HRA_H_INCLUDED
#include "grafika.h" #include <math.h> // pouzitie funkcie abs() absolutna hodnota cisla
/** Vyhodnoti ci su po hode aspon dve kocky zhodne, ak su zhodne, ci je zadany * medzernik v stanovenom case a vrati hodnotu vyhodnotenia * @param int x, y, z su premenne ktorych adresy (&x, &y, &z) sa zadaju ako parametre * do funkcie hod_kockou() * @param char znak - medzernik alebo iny znak * @param int prednastaveny cas ne hadanie po hode v milisekundach * @param float cas trvania, kym hrac stlacil klavesu * @return int poradove cislo vyhodnotenia */ int vyhodnotenie(const unsigned int x, const unsigned int y, const unsigned int z, const unsigned char znak, const int nastaveny_cas, const float trvanie);
/** Samotny priebeh hry so zaverecnym vyhodnotenim * @param void * @return void */ void hrame(void);
#endif // HRA_H_INCLUDED hra.c #include "hra.h"
int vyhodnotenie(const unsigned int x, const unsigned int y, const unsigned int z, const unsigned char znak, const int nastaveny_cas, const float trvanie) { int vysledok;
vysledok = ((x == y || x == z || y == z) && znak == ' ' && trvanie <= (float)(nastaveny_cas / 1000.0)) ? 1 : // 1-OK v termine ((x == y || x == z || y == z) && znak == ' ' && trvanie > (float)(nastaveny_cas / 1000.0)) ? 2 : // 2-OK po termine ((x == y || x == z || y == z) && znak != ' ' && trvanie <= (float)(nastaveny_cas / 1000.0)) ? 3 : // 3-zhoda a znak nie je medzera v termine ((x == y || x == z || y == z) && znak != ' ' && trvanie > (float)(nastaveny_cas / 1000.0)) ? 4 : // 4-zhoda a znak nie je medzera po termine (!(x == y || x == z || y == z) && znak == ' ' && trvanie <= (float)(nastaveny_cas / 1000.0)) ? 5 : // 5-nezhoda a znak je medzera v termine (!(x == y || x == z || y == z) && znak == ' ' && trvanie > (float)(nastaveny_cas / 1000.0)) ? 6 : // 6-nezhoda a znak je medzera po termine (!(x == y || x == z || y == z) && znak != ' ' && trvanie <= (float)(nastaveny_cas / 1000.0)) ? 7 : // 7-nezhoda a znak nie je medzera v termine 0; // 0-nezhoda a znak nie je medzera po termine -> posledna moznost
return vysledok; }
void hrame(void) { int i = 0, n = 15, a, b, c, nastaveny_cas, body_spolu = 0, vysledok, znamka = 5, chyba = 0; float trvanie; char typ;
srand(time(0)); // potrebne pre generator nahodnych cisiel konzola(79, 40, "HRA KOCKY"); // nastavenie konzoly /** Uvodne informacie a zahajenie hry */ printf("\n\n\t* * * VITAJTE V HRE: HADAJ ROVNAKE KOCKY * * *\n\n"); printf("Ulohou hraca je po hode tromi kockami v stanovenom limite uhadnut, ci boli\n" "aspon dve kocky rovnake. " "Ak su rovnake, stlaci medzernik, ak nie stlaci klavesu ENTER.\n" "Na konci sa spocitaju chybne typy hraca, porovnaju sa\n" "so skutocnostou a hrac bude " "ohodnoteny znamkou 5 - 0. (za kazdu chybu sa znamka znizuje o jedna.\n\n" "Celkom bude %d hodov kockami.\n\n", n); printf("Za kolko milisekund uhadnete zhodne kocky (1 s = 1000 ms - [odporucane 1500]):\n"); scanf("%d", &nastaveny_cas); // nastavenie casu za ktory sa ma stlacit spravna klavesa for (i = 0; i < n; i++) { // cyklus n krat hod_kockou(&a, &b, &c); // vykreslenie hodu kociek s hodnotami ulozenymi do pointerov clock_t start = clock(); // zaciatok merania casu do stlacenia klavesy fflush(stdin); // vyprazdnenie bufferu typ = getch(); // stlacenie medzernika alebo inej klavesy clock_t finish = clock(); // koniec merania trvanie = (float)((int)finish - (int)start) / CLOCKS_PER_SEC; // vypocet casu tvania do stlacenia klavesy vysledok = vyhodnotenie(a, b, c, typ, nastaveny_cas, trvanie); // vyhodnotenie hodu a vratenie hodnoty switch (vysledok) { // podla hodnoty sa body celkom a body hraca pripocitavaju case 1: //printf("1-OK v termine, cas: %.2f\n", trvanie); // test printf("OK\n"); body_spolu++; break; case 2: //printf("2-OK po termine, cas: %.2f\n", trvanie); // test printf("Chyba! cas je po termine: %.3f sek.\n", trvanie); chyba++; body_spolu++; break; case 3: //printf("3-zhoda a znak nie je medzera v termine, cas: %.2f\n", trvanie); // test printf("Chyba! mala byt medzera!\n"); chyba++; body_spolu++; break; case 4: //printf("4-zhoda a znak nie je medzera po termine, cas: %.2f\n", trvanie); // test printf("Chyba! mala byt medzera a cas je po termine: %.3f sek.\n", trvanie); chyba++; body_spolu++; break; case 5: //printf("5-nezhoda a znak je medzera v termine, cas: %.2f\n", trvanie); // test printf("Chyba! nemala byt medzera!\n"); chyba++; break; case 6: //printf("6-nezhoda a znak je medzera po termine, cas: %.2f\n", trvanie); // test printf("Chyba! mala byt medzera a cas je po termine: %.3f sek.\n", trvanie); chyba++; break; case 7: //printf("7-nezhoda a znak nie je medzera v termine, cas: %.2f\n", trvanie); // test printf("OK\n"); break; default: //printf("0-nezhoda a znak nie je medzera po termine, cas: %.2f\n", trvanie); // test printf("Chyba! cas je po termine: %.3f sek.\n", trvanie); chyba++; break; } sleep(3000); //getch(); // test } sleep(2000); system("cls"); if (chyba > 5) chyba = 5; /** Vypis vysledkov hry */ printf("\n\t* * * VYHODNOTENIE * * *\n\n" "Celkom bolo v hre %d zhodnych hodov.\n" "Pocet chyb hraca: %d.\n\n" "Vysledna znamka je %d.\n\n", body_spolu, chyba, znamka - chyba); system("pause"); } main.c #include "hra.h"
int main(void) { hrame();
return 0; } Prikladám aj zazipovaný exe súbor na vyskúšanie pre tých, ktorým sa nechce (alebo nevedia) prekopírovať kód do nejakého IDE a skompilovať si ho. ;)
PS. Trochu som to opravil. :D kocky.zip |
|
|
Skočiť do kategórie Skočiť do témy |
libcosenior |
Napísal: 18 Okt 2015, 09:41
|
|
|
|
|
|