Škôlka jazyka C

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

Aktuálny čas je 18 Jan 2021, 05:57

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


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

Autor Správa

 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
Stránka 1 z 1 [ Vyhľadávanie našlo 3 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