Programiranje

Programiranje u C-u - od svega pomalo

beno101 ned 13.2.2011 16:26
MrBlc kaže...

Prvo inicijaliziraš random generator (ovo radiš samo jednom)

srand( time(NULL) );

 

rand() ti vrača nasumični broj, a da bi imao broj 0 - 6 (7 oblika) radiš modulo:

oblik_ind = rand() % 7;

Primjer molim.

MrBlc ned 13.2.2011 16:52

Imaš varijablu:

 

int oblik_ind; // ova varijabla predstavlja index oblika sljedećeg elementa

 

srand( time(NULL) ); // ovo pozoveš prije prvog korištenja rand() funkcije


oblik_ind = rand() % 7; //pomoću rand() funkcije dobiješ nasumičan broj, uzimaš ostatak dijeljenja sa 7 i spremaš u oblik_ind

 

dalje samo za svaki novi element ponovno pozivaš:

oblik_ind = rand() % 7;

MrBlc ned 13.2.2011 21:28

Prvo, govoriš o tome da želiš programirati u C-u, a ovo je c++. Drugo, ako imaš više od jedne naredbe koja se izvršava ako je zadovoljen uvjet, one idu u vitičaste zagrade. Treće, ako ćeš stvarno pisati u C++ onda bi si mogao prilično olakšati stvar objektnim pristupom. Trenutno skidam Visual Studio C++, a ti si u međuvremenu barem mogao napisati što ti se dogodi kad pokreneš program ili koje greške izbaci kad kompajliraš.

 

Edit:

za liniju: char (*lik)[sirinaLika] = (char (*)[sirinaLika])aktivniLik; mi javlja error prilikom kompajliranja jer bi dimezije polja trebale biti poznate prilikom kompajliranja ili bi polje trebao dinamički alocirati. S obzirm da su svi elementi "jednakih dimenzija", onda možeš koristiti konstantu za dimenzije lika (nače je u tetrisu 4x4, a ne 3x3 - | ti je jednu kockicu kratak). Uz to, moraš znati za svaki element gdje mu je točka najbliža lijevoj, desnoj i donjoj stranici (u odnosu na gornji lijevi kut lika) kako bi mogao ispravno testirati da li je elemenat pao ili došao u krajnji lijevi ili desni položaj. Ako je došao, ne resetiraš mu položaj, već u tom smjeru više ne smije ići, odnosno, ako je pao dolje, ide sljedeći element. Da bi stari element zapamtio, moraš imati i spremanje svih elemenata koji su do sad pali (ali to je drugi korak).

Bilo bi dobro kad bi elemente spremao u nekakvu strukturu preko koje možeš pristupiti prethodnoj i sljedećoj rotaciji tog elementa.   To može biti 3D polje u kojem su u jednu dimenziju spremljene sve rotacije jednog lika u obliku kako ih sad spremaš u posebne varijable - ako ima 2 rotacije, spremaš 1,2,1,2 a za jednu rotaciju 1,1,1,1 kako bi imao za sve likove 4 rotacije jer nećeš morati testirati koji je lik i koliko ima rotacije kad ga budeš rotirao.

 

U skladu s objektnim programiranjem bi bilo napraviti interface Lik kojeg bi svi likovi implementirali, a imao bi metodu za rotaciju ulijevo, udesno, pad za jedno polje, pomak ulijevo, udesno i za dohvat podataka za prikaz. Svaki element bi sam za sebe vodio računa o tome da li je došao do lijevog zida, do desnog zida , do poda ili do drugih elemenata, a provjeru bi vršio s objektom klase Prostor. Ukoliko bi detektirao da više ne može padati, javio bi tom objektu da je završio.

Objekt klase prostor bi pohranjivao mapu palih likova, imao bi metodu za provjeru da li je polje zauzeto, te metodu kojoj bi objekt koji implementira interface Lik javio da je završio padati. Ta metoda bi izvela provjeru da li je ijedan red popunjen, ako je popunjen, izbrisala bi ga, a sve elemente iznad njega spustila za jedno mjesto, te kad završi provjeru svih redaka triggala kreiranje novog Lik-a.

FiCoO čet 24.2.2011 19:43

pozdrav..malo pomalo ucim programiranje u C-u uz pomoc knjige koja se koristi u matematickoj u lucijanki iz informatike...ima li itko da mi pogleda program i ako ima gresaka da ih ispravi (nemogu skinut program jer imam malo MB jos)...zahvaljujem unaprijed

 

#include <stdio.h>
void main()
{
 float s,t,v;
int b;
printf("Izaberite što želite izračunati");
printf("\n 1:brzina \n 2:put \n 3:vrijeme \n  4:akceleracija_vt \n 5:akceleracija_fm \n 6:sila \n 7:masa\n");
printf("Izbor: ")
scanf("%d", &b);
switch (b)
{
case 1: printf("Unesi duljinu puta u metrima: ");
        scanf("%f", &s);

        printf("Unesi vrijeme u sekundama: ");
        scanf("%f", &t);

        printf("Brzina iznosi: %.2f m/s", s/t);break;

case 2: printf("Unesi brzinu u m/s: ");
        scanf("%f", &v);

        printf("Unesi vrijeme u sekundama: ");
        scanf("%f", &t);

        printf("Duljina puta iznosi: %.2f m", v*t);break;

case 3: printf("Unesi duljinu puta u metrima: ");
        scanf("%f", &s);

        printf("Unesi brzinu u m/s: ");
        scanf("%f", &v);

        printf("Vrijeme iznosi: %.2f s", s/v);break;

case 4: printf("Unesi brzinu u m/s: ");
        scanf("%f", &v);
   
        printf("Unesi vrijeme u sekundama: ");
        scanf("%f", &t);

        printf("Akceleracija iznosi: %.2f m/s2", v/t);break;

case 5: printf("Unesi silu u njutnima: ");
        scanf("%f", &f);
     
        printf("Unesi masu u kilogramima; ");
        scanf("%f", &m);
    
        printf("Akceleracija iznosi %.2f m/s2", f/m);break;

case 6: printf("Unesi akceleraciju u m/s2: ");
        scanf("%f", &a);

        printf("Unesi masu u kilogramima: ");
        scanf("%f", &m);

        printf("Sila iznosi %.2f N", a*m);break;

case 7: printf("Unesi silu njutnima: ");
        scanf("%f", &f);

        printf("Unesi akceleraciju u m/s2: ");
        scanf("%f", &a);

        printf("Masa iznosi %.2f kg", f/a);break;

default: printf"\n Izabrali se pogrješan broj!");break;
}

rustweaver čet 24.2.2011 20:07
FiCoO kaže...
...

Imas ne zatvorenih zagrada, ne otvorenih zagrada, na jednom mjestu nedostaje ';', koristis varijable koje nisi deklarirao i kôd ti je lose uvucen.

Eh, da, funkcija main bi trebala vracati int, a ne biti void, to je bolje... Ukratko nista strasno i nista sto ne bi i sam primjetio da si imao compiler pri ruci ;)

 

Osim svega nabrojanog, program ti radi, koliko sam uspio vidjeti nabrzinu.

 

#include <stdio.h>

int main()
{
    float s,t,v,f,m,a;
    int b;
   
    printf("Izaberite što želite izračunati");
    printf("\n 1:brzina \n 2:put \n 3:vrijeme \n 4:akceleracija_vt \n 5:akceleracija_fm \n 6:sila \n 7:masa\n");
    printf("Izbor: ");
    scanf("%d", &b);
   
    switch (b)
    {
    case 1: printf("Unesi duljinu puta u metrima: ");
            scanf("%f", &s);
   
            printf("Unesi vrijeme u sekundama: ");
            scanf("%f", &t);
   
            printf("Brzina iznosi: %.2f m/s", s/t);break;
   
    case 2: printf("Unesi brzinu u m/s: ");
            scanf("%f", &v);
   
            printf("Unesi vrijeme u sekundama: ");
            scanf("%f", &t);
   
            printf("Duljina puta iznosi: %.2f m", v*t);break;
   
    case 3: printf("Unesi duljinu puta u metrima: ");
            scanf("%f", &s);
   
            printf("Unesi brzinu u m/s: ");
            scanf("%f", &v);
   
            printf("Vrijeme iznosi: %.2f s", s/v);break;
   
    case 4: printf("Unesi brzinu u m/s: ");
            scanf("%f", &v);
      
            printf("Unesi vrijeme u sekundama: ");
            scanf("%f", &t);
   
            printf("Akceleracija iznosi: %.2f m/s2", v/t);break;
   
    case 5: printf("Unesi silu u njutnima: ");
            scanf("%f", &f);
        
            printf("Unesi masu u kilogramima; ");
            scanf("%f", &m);
       
            printf("Akceleracija iznosi %.2f m/s2", f/m);break;
   
    case 6: printf("Unesi akceleraciju u m/s2: ");
            scanf("%f", &a);
   
            printf("Unesi masu u kilogramima: ");
            scanf("%f", &m);
   
            printf("Sila iznosi %.2f N", a*m);break;
   
    case 7: printf("Unesi silu njutnima: ");
            scanf("%f", &f);
   
            printf("Unesi akceleraciju u m/s2: ");
            scanf("%f", &a);
   
            printf("Masa iznosi %.2f kg", f/a);break;
   
    default: printf("\n Izabrali se pogrješan broj!");break;
    }
   
    return 0;
}

Prepravljena verzija ^

FiCoO čet 24.2.2011 21:16

dok ja imam volje za to dobro je..hehe...e sad me zanima posto nisam dosao do lekcije o tipu varijable char...to meni zapravo umjesto da pisem broj za brzinu itd. upisem zapravo brzina i onda mi izbaci sto trebam, jelda?

mbaksa čet 24.2.2011 21:24
FiCoO kaže...

to meni zapravo umjesto da pisem broj za brzinu itd. upisem zapravo brzina i onda mi izbaci sto trebam, jelda?

Ovo je hrvatski jezik? LOL

 

 

Varijabla char je veličine jednog bajta i može se na nju gledati kao na cijeli broj ili kao na jedan ASCII znak (slovo, broj, posebni znakovi...). Ako se gleda kao na broj, onda dolazi u dva okusa: signed char (to je defaultni okus), koji ima vrijednost od -128 do 127, ili unsigned char, koji ima vrijednost od 0 do 255. Znači, char može, ovisno o okusu, držati cijeli broj u navedenom rasponu.

 

Ako se na char gleda kao ASCII znak: http://en.wikipedia.org/wiki/ASCII_characters

Recimo slovo 'G' ima brojčanu vrijednost 71, a slovo 'g' ima brojčanu vrijednost 103.

 

Na polje charova se u pravilu gleda kao na niz znakova. Više o tome imaš ovdje: http://www.cplusplus.com/doc/tutorial/ntcs/

FiCoO čet 24.2.2011 21:29

hvala kaj si me sad jos vise zbunio ;)

mene samo zanima da sad umjesto broja 1 koji je npr. za brzinu ja taj broj 1 nepisem nego napisem brzina i da mi onda trazi dalje da upisem pu i vrijeme....mozes to objasniti a da me neubijes u pojam{#}

mbaksa čet 24.2.2011 21:33
FiCoO kaže...

hvala kaj si me sad jos vise zbunio ;)

mene samo zanima da sad umjesto broja 1 koji je npr. za brzinu ja taj broj 1 nepisem nego napisem brzina i da mi onda trazi dalje da upisem pu i vrijeme....mozes to objasniti a da me neubijes u pojam{#}

 

    int b;
    ...
   scanf("%d", &b);

 

Ono što korisnik upiše, ide u varijablu tipa int. Stoga ne vidim kamo bi korisnik imao za upisati riječ brzina, kad od korisnika tražiš da upiše cijeli broj.

mbaksa čet 24.2.2011 21:49
FiCoO kaže...

onda sam ja nesto krivo shvatio...ima li onda ikakva naredba da se umjesto brojke pise rijec?

Pa koristiš varijablu u koju možeš zapisati riječ. A to je polje (niz) znakova. Npr. u ovom slučaju polje od 30 znakova nazvali smo rečenica (zapravo, mislim da u tu varijablu možeš spremiti 29 znakova + null-znak, koji označava kraj niza znakova) .

 

   char[30] recenica;
    ...
   scanf("%s", &recenica);

 

Uoči i da smo sada prvi argument promijenili u %s - time govorimo da želimo upisati string (niz znakova).

Shody_1994 čet 24.2.2011 21:57
mbaksa kaže...
FiCoO kaže...

onda sam ja nesto krivo shvatio...ima li onda ikakva naredba da se umjesto brojke pise rijec?

Pa koristiš varijablu u koju možeš zapisati riječ. A to je polje (niz) znakova. Npr. u ovom slučaju polje od 30 znakova nazvali smo rečenica (zapravo, mislim da u tu varijablu možeš spremiti 29 znakova + null-znak, koji označava kraj niza znakova) .

 

   char[30] recenica;
    ...
   scanf("%s", &recenica);

 

Uoči i da smo sada prvi argument promijenili u %s - time govorimo da želimo upisati string (niz znakova).

 

Kada unosiš char polje, onda u scanf-u nema adresnog operatora.

 

Evo ispravan kod:

 

char[30] recenica;
    ...
   scanf("%s", recenica);

 

FiCoO čet 24.2.2011 21:59

pa to sam ja i mislio ali izgleda da se nismo dobro razumili....eto jel bi sad mogao jedan primjer ili samo da se pokaze znaci kad ja upisem brzina to kao string?! jel tako? i onda ce mi otvoriti u switch-case pokrenuti case brzina: ? ako sam u krivu ispravite me

cerberus čet 24.2.2011 22:03

...
    switch (b)
    {
  ...
    case 'brzina': printf("Unesi brzinu u m/s: ");
            scanf("%f", &v);
   
            printf("Unesi vrijeme u sekundama: ");
            scanf("%f", &t);
   
            printf("Duljina puta iznosi: %.2f m", v*t);break;


...    

valjda je to to, bitno je da b primis kao string :)

mbaksa čet 24.2.2011 22:04
Shody_1994 kaže...
Kada unosiš char polje, onda u scanf-u nema adresnog operatora.

 

Evo ispravan kod:

 

char[30] recenica;
    ...
   scanf("%s", recenica);

Istina, pošto je varijabla u biti referenca na prvi znak u polju.

rustweaver čet 24.2.2011 22:06
FiCoO kaže...

pa to sam ja i mislio ali izgleda da se nismo dobro razumili....eto jel bi sad mogao jedan primjer ili samo da se pokaze znaci kad ja upisem brzina to kao string?! jel tako? i onda ce mi otvoriti u switch-case pokrenuti case brzina: ? ako sam u krivu ispravite me

U krivu si, switch ne moze usporedivati stringove niti mozes koristiti string kao case. Vidim da je Cerberus sada napisao nesto takvo, radi li to!? :S

 

U C-u zapravo uopce ne mozes usporedivati stringove pomocu znaka jednakosti '=', za to ti treba posebna funkcija (strcmp i slicne).

FiCoO čet 24.2.2011 22:08
rustweaver kaže...
FiCoO kaže...

 

U krivu si, switch ne moze usporedivati stringove niti mozes koristiti string kao case. Vidim da je Cerberus sada napisao nesto takvo, radi li to!? :S

 

U C-u zapravo uopce ne mozes usporedivati stringove pomocu znaka jednakosti '=', za to ti treba posebna funkcija (strcpy i slicne).

mozes mi onda navest neki primjer koji je ispravan? :D

cerberus čet 24.2.2011 22:10

Hmm, nisam siguran sad po pitanju toga. Davno je bilo kada se C radio, ali je u biti logika rjesavanja tu. Implementacija je nesto drugo :/.

 

EDIT:

Ipak ne:

The value of the expressions in a switch-case statement must be an ordinal type i.e. integer, char, short, long, etc. Float and double are not allowed.

rustweaver čet 24.2.2011 22:21
FiCoO kaže...

mozes mi onda navest neki primjer koji je ispravan? :D

Znaci ti zapravo zelis da korisnik napise "brzina" i da se program prebaci na racunanje brzine?

To bi ovako napravio:

 

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char b[10];
   
    scanf("%s", b);
   
    if (strcmp(b, "brzina")==0)
    {
       //ovdje ide neki kod
    }

    return 0;
}

 

I moram se ispraviti za prethodni post, nije strcpy za usporedivanje stringova, nego strcmp.

 

cerberus kaže...

The value of the expressions in a switch-case statement must be an ordinal type i.e. integer, char, short, long, etc. Float and double are not allowed.

Jep, samo brojevi. I to jednostavni brojevi (zato i float otpada).

 

FiCoO kaže...

znaci nis od tog sa slovima? :P

Jep, mozes eventualno jedan znak (char). Zato sto je char zapravo broj (bio sam to negdje vec pisao). Ali cijelo polje charova (string) ne mozes...

FiCoO čet 24.2.2011 22:26

mozda ovako

 

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char b[10];
  
    scanf("%s", b);
  
    if (strcmp(b, "brzina")==0)
         {  printf("Unesi duljinu puta u metrima: ");
            scanf("%f", &s);
  
            printf("Unesi vrijeme u sekundama: ");
            scanf("%f", &t);
  
            printf("Brzina iznosi: %.2f m/s", s/t);
         }
return 0;
}

mbaksa čet 24.2.2011 22:28
Shody_1994 kaže...
mbaksa kaže...
FiCoO kaže...

onda sam ja nesto krivo shvatio...ima li onda ikakva naredba da se umjesto brojke pise rijec?

Pa koristiš varijablu u koju možeš zapisati riječ. A to je polje (niz) znakova. Npr. u ovom slučaju polje od 30 znakova nazvali smo rečenica (zapravo, mislim da u tu varijablu možeš spremiti 29 znakova + null-znak, koji označava kraj niza znakova) .

 

   char[30] recenica;
    ...
   scanf("%s", &recenica);

 

Uoči i da smo sada prvi argument promijenili u %s - time govorimo da želimo upisati string (niz znakova).

 

Kada unosiš char polje, onda u scanf-u nema adresnog operatora.

 

Evo ispravan kod:

 

char[30] recenica;
    ...
   scanf("%s", recenica);

LOL! Nije ispravan. Znaš zašto? Treba ići char recenica[30];

 

Eto, ostao sam malo u Pascalu, gdje se varijale deklariraju u stilu recenica: array[30] of char;

 

 

1domagoj1 kaže...
mbaksa kaže...

Istina, pošto je varijabla u biti referenca na prvi znak u polju.

Pointer :P

Jesi 100% siguran? Možda se to tako inače govori, ali je li zaista riječ o pointeru? Naime, ako je u pitanju pointer, onda bi vrijednost dodjeljivao ovako:

 

*recenica = "abcd";

 

A to ne ide. Ali zato:

 

recenica = "abcd";

 

ide bez problema; Baš kao da varijabli pristupamo "preko reference". {#} Ili pak - pointer možeš preusmjeriti. Ali rečenicu u ovom slučaju ne možeš.

 

    char recenica1[30];
    char recenica2[30];
    char *recenica3;

    recenica2 = recenica1;  // ne prolazi
    recenica3 = recenica1;  // OK

 

Možda se doduše varam...

FiCoO čet 24.2.2011 22:31
cerberus kaže...

Slova mogu, 'rijeci' ne. Ipak fail.

Ali nema potrebe da se obeshrabris, ima jos dosta nacina na koje se to moze uraditi.

Morat ces malo gledat c string funkcije (:boring:)

ocu li ja danas mozda od nekoga saznat jel se moze to ikako napraviti..ako ne onda bar da za brzinu napisem b za vrijeme v itd.