Škôlka jazyka C

Fórum o programovaní v jazyku C založené 3. januára 2012

Aktuálny čas je 29 Mar 2024, 07:18

Všetky časy sú v GMT + 1 hodina


Vyhľadávanie našlo 19 výsledkov

Autor Správa

 Skočiť do kategórie   Skočiť do témy

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

 Predmet príspevku: Kompilátor - windows
Napísal: 06 Jan 2012, 21:57 

Užívatelia systému MS Windows a Dev­C++(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

Napísal:  

 Skočiť do kategórie   Skočiť do témy

 Predmet príspevku: Re: Dajte návrhy na zlepšenie.
Napísal: 24 Máj 2012, 07:13 

Už je to upravené.

 Skočiť do kategórie   Skočiť do témy

 Predmet príspevku: Re: Úlohy k 6. lekcii.
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

 Predmet príspevku: Re: Úlohy k 4. lekcii
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

 Predmet príspevku: Ako mi Céčko pomohlo v práci.
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

 Predmet príspevku: Re: 1. úloha odovzdanie
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. :roll:
(Upravil som tvoj program)
Attachment:
cifernysucet2.cpp

 Skočiť do kategórie   Skočiť do témy

 Predmet príspevku: @ 16DodgE16
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

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

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

 Predmet príspevku: Práca s konzolou win/lin
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

 Predmet príspevku: Re: POLIA:"Porovnanie znakov v poli"
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

 Predmet príspevku: Aprílový žartík
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

 Predmet príspevku: Re: Klebety(Liahen ksp)
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

 Predmet príspevku: Hra: Hadaj rovnake kocky
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

 Predmet príspevku: Pre itnetwork
Napísal: 18 Okt 2015, 09:41 

Obrázky a jQuery.
Stránka 1 z 1 [ Vyhľadávanie našlo 19 výsledkov ]


Všetky časy sú v GMT + 1 hodina


Skočiť na:  
cron
Powered by phpBB® Forum Software © phpBB Group

Hosted by FreeSpace SK