Programiranje u C-u - od svega pomalo izdvojena tema

poruka: 1.661
|
čitano: 384.663
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

I kad učitavaš ime, nejde &.

 

Također, kod računanja prosjeka moraš na početku petlje stavit sumu na 0. Ovako će u sumi nakon prvoj koraka petlje ostat zbroj ocjena prvog učenika, a onda ćeš na to dodavat ocjene drugog, što ne valja.

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
Poruka je uređivana zadnji put čet 3.3.2011 11:39 (Luuka).
15 godina
protjeran
offline
Re: Programiranje u C-u - od svega pomalo
Luuka kaže...

I kad učitavaš ime, nejde &.

 

Također, kod računanja prosjeka moraš na početku petlje stavit sumu na 0. Ovako će u sumi nakon prvoj koraka petlje ostat zbroj ocjena prvog učenika, a onda ćeš na to dodavat ocjene drugog, što ne valja.

scanf ("%s",ime);

 

 

tako znači treba izgledati

 

jer & ide kad ucitavas jedan znak ili broj... %c i %d...

 

Socijalizam, nacionalizam i antiimeperijalizam. To nam treba.
15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Jasno mi je Luka to, rekoh, nisam stigao dovršiti zadatak.

 

  • @ beno - čak sam na stranici objasnio to za & , ali sam očito zaboravio jer sam žurio.
Nista nije sveto sve je bruto i neto, sve je zabava!
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Imam jedno pitanje za vas koji profesionalno programirate, znači radite kao programeri.

Koliko su ove osnovne stvari (npr. zadaci iz ove teme) zapravo slične "pravom" programiranju?

 
0 0 hvala 0
16 godina
online
Re: Programiranje u C-u - od svega pomalo

@ betmen, sve je isto... kao 'cigle' za gradnju ili matematika. Razlika je samo u aplikaciji, platformi, robustnosti... (različiti zahtijevi su za knjigovodstvo u odnosu na bankarstvo ili SMSparking).

Kao primjena matematike, nemožeš reči točno u čemu je razlika, osim u korištenim znamenkama u školi 2+2, ili u banci 2.000.000 +2.000.000 .. tako je i s kodom.

Jedina (morala bi biti) razlika je u kvaliteti tj full-proof kodiranju. Dok učenik može griješiti (bez posljedica, osim ocjene), u poslu moraš biti apsolutno bezgrješan. Kao i  s tim poveznao recimo komentiranje koda ili urednost (što mr.baksa često traži), jer na kodu radi ekipa ili će ti neki kod trebati za par godina, bez kvalitetne dokumentacije (najbolje unutar koda-REMovi) to je teže.

C64/TurboModul-OpenSourceProject.org.cn.部分作品为网上收集整理,供开源爱好者学习使用
17 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
ihush kaže...
...

Jedina (morala bi biti) razlika je u kvaliteti tj full-proof kodiranju. Dok učenik može griješiti (bez posljedica, osim ocjene), u poslu moraš biti apsolutno bezgrješan. Kao i  s tim poveznao recimo komentiranje koda ili urednost (što mr.baksa često traži), jer na kodu radi ekipa ili će ti neki kod trebati za par godina, bez kvalitetne dokumentacije (najbolje unutar koda-REMovi) to je teže.

Eh da je bar to slučaj sa svakim programom i kodom :D...

Q: a kako se to linux ponasa kad crkne hdd? A: zastekava svakih 60 sec,ali prezivi se
16 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Lijepo. Znači, ako sam dobar s osnovama programiranja, vjerojatno ću se snaći i u "pravom" programiranju. To sam htio čuti, hvala.

Poruka je uređivana zadnji put pet 4.3.2011 13:37 (betmen).
 
0 0 hvala 0
16 godina
odjavljen
offline
Re: Programiranje u C-u - od svega pomalo
betmen kaže...

Lijepo. Znači, ako sam dobar s osnovama programiranja, vjerojatno ću se snaći i u "pravom" programiranju. To sam htio čuti, hvala.

I da i ne. Kada radiš osnovne stvari i male programčiće otprilike već imaš skoro cijeli kod u glavi, pa ti nije problem snalaziti se. Kad radiš veći projekt ili, još gore, više ljudi radi na projektu onda ti dokumentacija postaje važnija od samog koda. Ako nemaš sve kvalitetno dokumentirano lako ti se dogodi da moraš nešto promijeniti ali se više ne možeš snaći u kodu jer više ne znaš tko koga poziva, inicijalizira, tko s kim komunicira i na kraju ti zbog jednostavne izmjene dođe da sve izbrišeš i kreneš ispočetka.

Big wheel keep on turning, Proud Mary keep on burning, Trolling, trolling, trolling on the river.
15 godina
protjeran
offline
Programiranje u C-u - od svega pomalo

Pozdrav!

Kako se ono ispisuje neki ASCII znak?

Mislim, recimo.

Želim ispisati neko sunce i sad recimo je ASCII broj 2.

Kako da to ispišem?

Hvala!

Socijalizam, nacionalizam i antiimeperijalizam. To nam treba.
Moj PC  
0 0 hvala 1
16 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
beno101 kaže...

Pozdrav!

Kako se ono ispisuje neki ASCII znak?

Mislim, recimo.

Želim ispisati neko sunce i sad recimo je ASCII broj 2.

Kako da to ispišem?

Hvala!

  printf("%c",2);

 

odokativno <.<

14 godina
offline
Programiranje u C-u - od svega pomalo

napokon uspio sam svoj program i kompajlat i pokrenut(radi!{#}) ali me sad zanima posto nisam imao vremena ucit programiranje dalje znaci u onom mom kodu...kad se izabere jedna opcija i kad ju on izvrsi pogledajte sliku 1.1 i recite mi kako da to popravim i jos jedan stvar...kad mi zavrsi tu jednu operaciju ja nezelim da mi ugasi program nego da me ponovo trazi da izaberem sto zelim izracunati

slika 1.1 slika 1.1
★★★★★
Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
FiCoO kaže...

napokon uspio sam svoj program i kompajlat i pokrenut(radi!{#}) ali me sad zanima posto nisam imao vremena ucit programiranje dalje znaci u onom mom kodu...kad se izabere jedna opcija i kad ju on izvrsi pogledajte sliku 1.1 i recite mi kako da to popravim i jos jedan stvar...kad mi zavrsi tu jednu operaciju ja nezelim da mi ugasi program nego da me ponovo trazi da izaberem sto zelim izracunati

Stavi sve u while petlju, tj. do-while i da se izvršava sve dok korisnik ne unese neki znak/string/broj, kaj god hoćeš.

Q: a kako se to linux ponasa kad crkne hdd? A: zastekava svakih 60 sec,ali prezivi se
15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Samo ne koristi goto. {#}

Nista nije sveto sve je bruto i neto, sve je zabava!
Moj PC  
1 0 hvala 0
14 godina
offline
Programiranje u C-u - od svega pomalo

aha..oke{#}

★★★★★
Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
Shody_1994 kaže...

Samo ne koristi goto. {#}

Goto slobodno nek koristi kod višestrukog break-a, lakše to nego slagati uvjete tak da kad prvi brejka da svi izlete :D.

 

Samo nek ima zlatno pravilo goto-a uvijek na umu:

Goto nikad nek ne baca unazad.

Q: a kako se to linux ponasa kad crkne hdd? A: zastekava svakih 60 sec,ali prezivi se
16 godina
offline
Re: Programiranje u C-u - od svega pomalo
1domagoj1 kaže...
Goto slobodno nek koristi kod višestrukog break-a, lakše to nego slagati uvjete tak da kad prvi brejka da svi izlete :D.

 

Samo nek ima zlatno pravilo goto-a uvijek na umu:

Goto nikad nek ne baca unazad.

pročito sam i u prijašnjim postovima kak svi proklinjete taj goto i sad me zanima sljedeće.

 

napravio sam jedan program koji ima cirka 1100 linija koda i ima relativno puno goto-a. al jednostavno ne vidim način kako bi ih mogao izbjeći.

 

program je još u razvoju, ali gotovo je preko 95%. ako je tko voljan i želi pregledat kod da vidi jel se može kako izbjeć goto, neka kaže, pa ću mu dat na pm, jer ne želim baš javno :D

Atomska bubamara
17 godina
moderator
online
Re: Programiranje u C-u - od svega pomalo
jurluk kaže...
napravio sam jedan program koji ima cirka 1100 linija koda i ima relativno puno goto-a. al jednostavno ne vidim način kako bi ih mogao izbjeći.

Zato jer nisi naučio pravilno programirati. Usvojio si pogrešnu logiku pa sad sve gledaš iz perspektive goto naredbe i onda razmišljaš kako bi se to moglo napraviti bez goto. A to je pogrešan put.

 

Ja nikad ni u jednom programu (osim radi probe kako to radi) u Pascalu, Delphiju, C++-u nisam upotrijebio goto naredbu. Što će reći da se može izbjeći - i to vrlo lako. Zaista ne znam kakve bi to trebale biti petlje i skokovi da ne bi mogao izbjeći naredbu goto. Možda si zaboravio na naredbu break koja prekida trenutnu petlju i vraća se na hijerarhijsku razinu iznad?

 

jurluk kaže...
program je još u razvoju, ali gotovo je preko 95%. ako je tko voljan i želi pregledat kod da vidi jel se može kako izbjeć goto, neka kaže, pa ću mu dat na pm, jer ne želim baš javno :D

Pa slobodno valjda daš nekoliko primjera/dijelova koda gdje si koristio naredu goto - ne treba nam cijeli program.

16 godina
offline
Re: Programiranje u C-u - od svega pomalo

ajd dobro, evo onda samo dio koda.

 

a evo vam i sam program i tipovi tekstualnih datoteka koje otvara: download. samo nisam stavio 17., 18. i 19. tip

 

 

int main (){

   // ovaj dio koda nije bitan, samo se ispisuje nešto na ekran

   scanf("%d", &type);

   switch (type){

      /* kod ovih caseova, poziva se fja import_menu, i ona vraća vrijednost
         koju poprima varijabla a. ako je a = 1, program se vraca na pocetak,
         a ako je 2 ide na kraj, a na kraju se nesto ispisuje i program se zatvara
         funkcija import_manu i sama poziva druge funkcije i ima tu jos svega, ali
         vazno je samo ono sto ona vraca */

      case 0: {
         a=import_menu();
         if (a==1) goto start;
         if (a==2) goto end;
      }

      case 1: {
         a=import_menu();
         if (a==1) goto start;
         if (a==2) goto end;
      }

      case 2: {
         a=import_menu();
         if (a==1) goto start;
         if (a==2) goto end;
      }

      case 3: {
         a=import_menu();
         if (a==1) goto start;
         if (a==2) goto end;
      }

      // i takvih case-ova ima 21 :D

Atomska bubamara
16 godina
odjavljen
offline
Re: Programiranje u C-u - od svega pomalo

Za izlaz može kreirati funkciju koja će obaviti ispis i prekinuti izvođenje programa.

 

Povratak na početak ovisi o ostatku koda, ali najjednostavniji oblik je napraviti petlju u kojoj će se nalaziti sve ono što se ponavlja. Naravno, svaki komad koda koji radi nešto konkretno će se nalaziti u funkcijama, pa će ti petlja zapravo raditi par provjera i pozivati funkcije. Izlazak iz petlje može riješiti nekim od standardnih oblika petlji (while, do while), a ako je provjera potrebna na nezgodnom mjestu unutar petlje napraviš beskonačnu petlju i izvođenje prekidaš s break. U takvom slučaju ispis može ići iza petlje i onda return za izlaz.

 

Inaće, ovaj case ti nije dobro napisan. Ne trebaju ti vitičaste zagrade, a na kraju svakog case bloka ide break jer se u protivnom izvršavaju svi case-ovi do kraja switch bloka. Ukoliko imaš potrebu izaći iz petlje dok si u switch bloku, možeš koristiti pomoćnu varijablu koju ćeš provjeriti nakon switch bloka i izaći.

Big wheel keep on turning, Proud Mary keep on burning, Trolling, trolling, trolling on the river.
16 godina
offline
Re: Programiranje u C-u - od svega pomalo
MrBlc kaže...

Inaće, ovaj case ti nije dobro napisan. Ne trebaju ti vitičaste zagrade, a na kraju svakog case bloka ide break jer se u protivnom izvršavaju svi case-ovi do kraja switch bloka. Ukoliko imaš potrebu izaći iz petlje dok si u switch bloku, možeš koristiti pomoćnu varijablu koju ćeš provjeriti nakon switch bloka i izaći.

evo makno sam vitičaste zagrade

 

što se tiče break-a, koliko vidim ovdje može i bez njega, jer nastavak programa ovisi o vrijesnosti koju vraća fja import_menu, pa nece odma prijeci na drugi case, nego ili na pocetak programa ili na kraj

 

e sad, riješio sam se jednog goto-a. evo privremeno rješenje. sad me još samo pati kako maknuti još ovaj goto što je ostao

 

int main (){

    int a;

    system("COLOR 9");

    start: start_func();

    switch (type){

       case 0:
          input_format = "MPC";
          soft = "Soft00Cmt";
          a=import_menu();
          if (a==1) goto start;   // kazem, ovo je sam privremeno rjesenje. jer ne mogu samo pozvati
                                    // funkciju start_func, jer onda nece radit switch-case
          if (a==2) end_func();

       case 1:
          input_format = "SkyMap";
          soft = "Soft01Cmt";
          a=import_menu();
          if (a==1) goto start;
          if (a==2) end_func();

       case 2:
          input_format = "Guide";
          soft = "Soft02Cmt";
          a=import_menu();
          if (a==1) goto start;
          if (a==2) end_func();

 

void start_func(){

    // tu su printfovi koji sve ono ispisuju

    scanf("%d", &type);   //type je deklariran u globalnom području, pa ga vide sve funkcije
}

 

void end_func(){
    exit_screen();
    printf("Press any key to exit...                             Copyright (c) 2011, jurluk");
    getch();
    exit (EXIT_SUCCESS);
}

Atomska bubamara
17 godina
moderator
online
Re: Programiranje u C-u - od svega pomalo
jurluk kaže...
MrBlc kaže...

Inaće, ovaj case ti nije dobro napisan. Ne trebaju ti vitičaste zagrade, a na kraju svakog case bloka ide break jer se u protivnom izvršavaju svi case-ovi do kraja switch bloka. Ukoliko imaš potrebu izaći iz petlje dok si u switch bloku, možeš koristiti pomoćnu varijablu koju ćeš provjeriti nakon switch bloka i izaći.

evo makno sam vitičaste zagrade

 

što se tiče break-a, koliko vidim ovdje može i bez njega, jer nastavak programa ovisi o vrijesnosti koju vraća fja import_menu, pa nece odma prijeci na drugi case, nego ili na pocetak programa ili na kraj

 

e sad, riješio sam se jednog goto-a. evo privremeno rješenje. sad me još samo pati kako maknuti još ovaj goto što je ostao

 

    switch (type){

       case 0:
          input_format = "MPC";
          soft = "Soft00Cmt";
          a=import_menu();
          if (a==1) goto start;   // kazem, ovo je sam privremeno rjesenje. jer ne mogu samo pozvati
                                    // funkciju start_func, jer onda nece radit switch-case
          if (a==2) end_func();

       case 1:
          input_format = "SkyMap";
          soft = "Soft01Cmt";
          a=import_menu();
          if (a==1) goto start;
          if (a==2) end_func();

       case 2:
          input_format = "Guide";
          soft = "Soft02Cmt";
          a=import_menu();
          if (a==1) goto start;
          if (a==2) end_func();

Idemo korak po korak... Ti si samouk ili što? Tvoj kod pokazuje totalno nepoznavanje strukturnog (ili strukturiranog) programiranja. Morat ćeš totalno promijeniti pristup programiranju.

 

Prvo - problem zaliihosti. Ti u svakom (osim u zadnjem slučaju, koji služi za izlaz iz programa) koristišidentične tri linije koda. Zašto ih onda pišeš čak 20-ak puta, ako sve mogu biti iza switcha?! Naravno, u caseovima ćeš trebati napraviti break. To što ne koristiš break mi govori da ne shvaćaš njegovu funkciju.

 

Znači, što fali ovome:

 

    switch (type){

       case 0:
          input_format = "MPC";
          soft = "Soft00Cmt";
          break;
       case 1:
          input_format = "SkyMap";
          soft = "Soft01Cmt";
          break;
       case 2:
          input_format = "Guide";
          soft = "Soft02Cmt";
          break;
       case .....

}    // kraj switcha

    a=import_menu();
    if (a==1) goto start;
    if (a==2) end_func();

 

Znači, na ovaj način uklonio bi tu zalihost - pa bi goto imao samo . Međutim, imaš ti tu još zalihosti - dodjeljivanje vrijednosti varijablama input_format i soft. Naime, nemaš iznimke - za svaki type imaš neku vrijednost. Zar te to ne podsjeća na - polje? S indeksima od 0 do 19?

 

Znači, sve to možemo tranformirati u ovo (i umjesto gotoa i forsiranja izlaska iz programa pomoću funkcije exit, jednostavno napravimo petlju do..while kojom ćemo oblikovati prirodni tijek izvođenja programa - ako nisu zadovoljeni uvjeti za nastavak petlje, program jednostavno dođe do kraja, a ne da ga mi ručno rušimo:

 

int main (){    int a;    system("COLOR 9");
    struct Izbornik {        char format[20];        char soft[20];    } izbornik[20] = {        { format: "MPC",      soft: "Soft00Cmt" },        { format: "SkyMap",   soft: "Soft01Cmt" },        { format: "Guide",    soft: "Soft02Cmt" },        { format: "xephem",   soft: "Soft03Cmt" },
           ...................
   };
    // glavna petlja    do {        start_func();
        if ((type >= 0) && (type < 20)) {            input_format = izbornik[type].format;            soft = izbornik[type].soft;            a = import_menu();        }    } while ((type != 21) && (a != 2));   // vrti se sve dok na prvom izborniku nije upisan broj 21 ili na drugom broj 2
    // ne treba ti zasebna end-funkcija - mozes je integrirati ovdje, s obzirom    // da neces na silu izlaziti iz programa    exit_screen();    printf("Press any key to exit...                             Copyright (c) 2011, jurluk");    getch();    return EXIT_SUCCESS;}

Također, i start_func() bi mogao integrirati u main(). I jedna vrlo ozbiljna kritika - ne treba ti toliko globalnih varijabli! Time samo uzrokuješ to da ne znaš na kraju gdje se koja varijabla mijenja ili koristi. Recimo varijabla type - kako ja iz tvog koda mogu znati gdje se toj varijabli dodjeljuje vrijednost?! Moram ići kroz cijeli program i gledati! To se tako ne smije raditi. Varijabla type je trebala biti lokalna, samo u funkciji main i eventualno ako ti za nešto treba, proslijeđena kao argument nekoj drugoj funkciji! TOME SLUŽE ARGUMENTI! Tebi skoro pa ni jedna funkcija ne prima argumente, nego skoro sve koriste globalne varijable - TO JE POGREŠNO!

 

Funkcija start_func() je trebala vraćati int vrijednost i onda ti je njeno pozivanje trebalo izgledati ovako:

type = start_func();

 

i onda si funkciji import_menu trebao proslijediti tu vrijednost, znači

a = import_menu(type);

 

I sad na kraju pogledaj moj kod - mnogo je jednostavniji i pregledniji od tvojeg i ne koristi ni jednu jedinu goto naredbu. {#}

 

Počni učiti programirati ispočetka. Počni od najjednostavniji zadataka, u kojima si dosad koristio goto. I napiši to bez goto naredbe, korištenjem do/while/for/if konstrukcija. Ako ne možeš sam dokučiti kako - PITAJ! Nemoj koristiti naredbu goto nego pitaj.

17 godina
moderator
online
Programiranje u C-u - od svega pomalo

Ili recimo kako se riješiti gotoa u funkciji import_menu()... Znači, ti imaš ovo:

 

    unos:    printf("  Enter input filename: ");    scanf("%s", fin_name);
    if (fin_name[0]=='1' && fin_name[1]=='\0') return 1;    if (fin_name[0]=='2' && fin_name[1]=='\0') return 2;
    fin=fopen(fin_name, "r");    if (fin==NULL) {       printf("\n  Error opening file %s\n\n", fin_name);       goto unos;    }
    else printf("\n  File %s is successfully opened\n", fin_name);

 

A što fali ovome - jednoj lijepoj do-while petljici:

 

    do {
        printf("  Enter input filename: ");
        scanf("%s", fin_name);

        if (fin_name[0]=='1' && fin_name[1]=='\0') return 1;
        if (fin_name[0]=='2' && fin_name[1]=='\0') return 2;

        fin=fopen(fin_name, "r");
        if (fin==NULL) printf("\n  Error opening file %s\n\n", fin_name);
    } while (fin==NULL);

    printf("\n  File %s is successfully opened\n", fin_name);

 

Edit: Ovo se da još malo ljepše napisati. Naime, uspoređivanje s NULL ti je nepotrebno. Zašto?

if (fin==NULL) je isto kao da si napisao if(!fin). Dakle, ovo bi bilo optimalnije rješenje.

 

    do {
        printf("  Enter input filename: ");
        scanf("%s", fin_name);

        if (fin_name[0]=='1' && fin_name[1]=='\0') return 1;
        if (fin_name[0]=='2' && fin_name[1]=='\0') return 2;

        fin=fopen(fin_name, "r");
        if (!fin) printf("\n  Error opening file %s\n\n", fin_name);
    } while (!fin);

 

I kad to napraviš, u programu više nemaš ni jednu jedinu goto naredbu! Na tisuću linija koda, ni jedna goto naredba... Fascinantno. {#}

 

Poruka je uređivana zadnji put pet 11.3.2011 23:13 (mbaksa).
 
0 0 hvala 1
16 godina
offline
Re: Programiranje u C-u - od svega pomalo
mbaksa kaže...
Idemo korak po korak... Ti si samouk ili što? Tvoj kod pokazuje totalno nepoznavanje strukturnog (ili strukturiranog) programiranja. Morat ćeš totalno promijeniti pristup programiranju.

nisam samouk, učim programiranje na faksu, odnosno c sam učio, više ne. pa što sam naučio, naučio sam. tako da sam zapravo od sad ipak samouk :D

a bože moj. sumnjam da si i ti nakon par mjeseci učenja c-a znao ovo što si sad ovdje objasnio. učim polako, ovo mi je prvi malo veći program. do sad su to sve bili "školski programi" po par desetaka linija koda...

 

mbaksa kaže...
Prvo - problem zaliihosti. Ti u svakom (osim u zadnjem slučaju, koji služi za izlaz iz programa) koristišidentične tri linije koda. Zašto ih onda pišeš čak 20-ak puta, ako sve mogu biti iza switcha?!

ajd dobro, sad vidim da može i tako...

 

mbaksa kaže...
Naravno, u caseovima ćeš trebati napraviti break. To što ne koristiš break mi govori da ne shvaćaš njegovu funkciju.

shvaćam ja njegovu funkciju itekako, samo u onom mom slučaju nije trebalo koristiti break, jer kao što sam već rekao, nastavak programa bi ovisio i vrijednosti koji vrati funkcija import_menu(), pa nece odmah prijeci na drugi case, nego ili na pocetak programa ili na kraj. a u ovom tvom slučaju naravno break se ne smije izostaviti. i da, ovo mi je zapravo bio prvi put uopce da sam koristio switch-case

 

mbaksa kaže...
Znači, na ovaj način uklonio bi tu zalihost - pa bi goto imao samo . Međutim, imaš ti tu još zalihosti - dodjeljivanje vrijednosti varijablama input_format i soft. Naime, nemaš iznimke - za svaki type imaš neku vrijednost. Zar te to ne podsjeća na - polje? S indeksima od 0 do 19?

 

Znači, sve to možemo tranformirati u ovo (i umjesto gotoa i forsiranja izlaska iz programa pomoću funkcije exit, jednostavno napravimo petlju do..while kojom ćemo oblikovati prirodni tijek izvođenja programa - ako nisu zadovoljeni uvjeti za nastavak petlje, program jednostavno dođe do kraja, a ne da ga mi ručno rušimo:

istina, ovo mi nije palo na pamet. al dobro, da programiram kojih 15-20 godina, koliko ti sigurno programiras i da imam toliko iskustva, sigurno bi mi palo na pamet. pa ne mogu ja u ovih 5 mjeseci znati koliko ti znas u toliko godina

 

mbaksa kaže...
Također, i start_func() bi mogao integrirati u main(). I jedna vrlo ozbiljna kritika - ne treba ti toliko globalnih varijabli! Time samo uzrokuješ to da ne znaš na kraju gdje se koja varijabla mijenja ili koristi. Recimo varijabla type - kako ja iz tvog koda mogu znati gdje se toj varijabli dodjeljuje vrijednost?! Moram ići kroz cijeli program i gledati! To se tako ne smije raditi. Varijabla type je trebala biti lokalna, samo u funkciji main i eventualno ako ti za nešto treba, proslijeđena kao argument nekoj drugoj funkciji! TOME SLUŽE ARGUMENTI! Tebi skoro pa ni jedna funkcija ne prima argumente, nego skoro sve koriste globalne varijable - TO JE POGREŠNO!

 

Funkcija start_func() je trebala vraćati int vrijednost i onda ti je njeno pozivanje trebalo izgledati ovako:

type = start_func();

 

i onda si funkciji import_menu trebao proslijediti tu vrijednost, znači

a = import_menu(type);

znam da ima dosta globalnih varijabli, ali eto tako mi je bilo lakse nego da proslijeđujem vrijednost funkciji. znam da je to na neki nacin pogresno, jer eto kao sto i sam kazes, moras pregledat cijeli kod da vidis kako se gdje mijenja vrijednost. ali eto nisam planirao nikome davati taj kod, pa se niko ne bi zalio, i meni je bilo u redu. ali eto kad uhvatim vremena, malo cu se poigrati s time, samo da "pravda"bude zadovoljena ;)

 

mbaksa kaže...
I sad na kraju pogledaj moj kod - mnogo je jednostavniji i pregledniji od tvojeg i ne koristi ni jednu jedinu goto naredbu. {#}

tko zna, zna!

 

mbaksa kaže...

Počni učiti programirati ispočetka. Počni od najjednostavniji zadataka, u kojima si dosad koristio goto. I napiši to bez goto naredbe, korištenjem do/while/for/if konstrukcija. Ako ne možeš sam dokučiti kako - PITAJ! Nemoj koristiti naredbu goto nego pitaj.

do sad nikad nisam koristio goto, ovo je prvi put, jer je program za mene kao pocetnika bio dosta velik zalogaj, pa se nisam mogao izvuci a da ne koristim goto

 

mbaksa kaže...

Ili recimo kako se riješiti gotoa u funkciji import_menu()... Znači, ti imaš ovo:

...

 

A što fali ovome - jednoj lijepoj do-while petljici:

 

 ...

a dobro, to sam znao i ja, al mi se nije dalo preuređivat kod. lijen sam, priznajem, a ko prizna pola mu se prasta :D

 

mbaksa kaže...
Edit: Ovo se da još malo ljepše napisati. Naime, uspoređivanje s NULL ti je nepotrebno. Zašto?

if (fin==NULL) je isto kao da si napisao if(!fin). Dakle, ovo bi bilo optimalnije rješenje.

 

...

a dobro, isti drek, drugo pakovanje ;)

 

mbaksa kaže...

I kad to napraviš, u programu više nemaš ni jednu jedinu goto naredbu! Na tisuću linija koda, ni jedna goto naredba... Fascinantno. {#}

zbilja jest!

 

 

i da, hvala na uloženom trudu i vremenu! rezultat je očigledan ;)

Atomska bubamara
Poruka je uređivana zadnji put sub 12.3.2011 0:05 (jurluk).
17 godina
moderator
online
Re: Programiranje u C-u - od svega pomalo
jurluk kaže...
znam da ima dosta globalnih varijabli, ali eto tako mi je bilo lakse nego da proslijeđujem vrijednost funkciji. znam da je to na neki nacin pogresno, jer eto kao sto i sam kazes, moras pregledat cijeli kod da vidis kako se gdje mijenja vrijednost. ali eto nisam planirao nikome davati taj kod, pa se niko ne bi zalio, i meni je bilo u redu. ali eto kad uhvatim vremena, malo cu se poigrati s time, samo da "pravda"bude zadovoljena ;)

Kažeš - "lakše". To ti je dvosjekli mač. U programiranju "lakše" ne podrazumijeva to da ćeš ti u programu od 1000 linija koda deklarirati globalnu varijablu kako za dvije funkcije ne bi morao koristiti argument, a za jednu povratnu vrijednost. Razumiješ? Na programu od 1000 linija koda ti si ušićario desetak riječi teksta. Zar se to zbilja isplati? Planirao ti kome davati taj kod ili ne? NE, ne isplati se. Jer ovako kako si to napisao, u biti ti te funkcije nisu ni bile potrebne - izdvajao si kod u funkcije samo da kod razdijeliš na više dijelova. Da, ok, funkcije se mogu raditi i radi preglednosti, no u pravilu se u funkcije izdvaja kod koji će se više puta pozivati. Zbog toga funkcije često i imaju argumente. I funkcije, ako to nije posve nužno, ne bi trebale koristiti globalne varijable.

 

Funkcije bi trebale biti zasebne "cjeline". Trebale bi primiti neke podatke, nešto napraviti te bi eventualno bi trebale vratiti neku vrijednost. Uzmi si recimo ovo za primjer:

 

int a, b;

 

void zamijeni() {

  int temp = a;

  a = b;

  b = temp;

}

 

int main() {

  a = 5;

  b = 3;

 

  printf("a=%i, b=%i", a, b);

 

  zamijeni();

 

  printf("a=%i, b=%i", a, b);

 

  return 0;

}

 

Koliko program ima smisla pisati na taj način, pa makar to radio sam za sebe i misliš da mu se poslije više nikad nećeš vraćati? Zar ne bi bilo logičnije, odnosno zar se ne bi imalo smisla malkice više potruditi pa napisati to kak spada?

 

void zamijeni(int &a, int &b) {

  int temp = a;

  a = b;

  b = temp;

}

 

int main() {

  int a = 5;

  int b = 3;

 

  printf("a=%i, b=%i", a, b);

 

  zamijeni(a, b);

 

  printf("a=%i, b=%i", a, b);

 

  return 0;

}

 

Takvu funkciju zamijeni možeš čak izvući iz svog programa i upotrijebiti je u nekom drugom programu. S onom prijašnjom funkcijom, koja je vezana na globalne varijable, to ne možeš.

 

Uglavnom - poanta ovog mojeg je - ako već učiš, onda uči ispravno. I onda radi ispravno. Jer će ti se u suprotnom nekad i u nekom ozbiljnijem programu dogoditi da ne radiš ispravno, da koristiš globalne varijable tamo gdje ne treba itd. Pazi - iz iskustva znam da ti se takve stvari, za koje ti se isprva čini da su "lakše", kasnije obiju u glavu. {#} Recimo ti bi, sad da ideš prepraviti program da to bude kak spada, trebao potrošiti barem pet puta više vremena na prepravljanje, nego da si odmah to napravio kako treba. I ne samo da bi time gubio vrijeme, nego ti se otvara mogućnost da napraviš i neki bug.

 

Nisam doduše baš toliko programirao na proceduralan način, ali zato imam dosta iskustva u OOP-u. U OOP-u takva ad hoc rješenja imaju gore posljedice. Čak i kad radiš web-programiranje, isto ti se stvari mogu obiti u glavu. Znači, ili radi ispravno, ili uopće nemoj raditi. {#}

 

 

jurluk kaže...

do sad nikad nisam koristio goto, ovo je prvi put, jer je program za mene kao pocetnika bio dosta velik zalogaj, pa se nisam mogao izvuci a da ne koristim goto

Meni bi u tom slučaju bilo logičnije da si napravio konstrukciju:

 

int kraj = FALSE;

 

do {

  ...

} while (!kraj);

 

Pa da si unutar petlje stavio uvjete i onda u slučajevima u kojima bi trebao izaći iz programa (ako je type jednako 21 ili a jednako 2), da si jednostavno varijablu kraj postavio u TRUE. Zapamti si ovu konstrukciju i ako ikad dođeš u napast da koristiš naredbu goto, iskoristi ovo.

 

jurluk kaže...
mbaksa kaže...
Edit: Ovo se da još malo ljepše napisati. Naime, uspoređivanje s NULL ti je nepotrebno. Zašto?

if (fin==NULL) je isto kao da si napisao if(!fin). Dakle, ovo bi bilo optimalnije rješenje.

 

...

a dobro, isti drek, drugo pakovanje ;)

Tamo gdje bi trebao pisati više teksta (recimo koristiti argumente u funkcijama), tamo to izbjegavaš, a ovdje pišeš ono što ne treba. {#} Fora je u tome da ono što je u if-uvjetu u zagradi, ono se samo po sebi logički uspoređuje.

 

Znači da, ako staviš provjeru je li nešto NULL, onda "logički gledano" radiš dvije provjere - prvo uspoređuješ varijablu s definiranom konstantom NULL, a potom provjeravaš je li rezultat te usporedbe logički true. U praksi je svejedno, jer kompajler to fino sve optimizira, ali zašto pisati ono što ne moraš pisati? I ono što se u drugim jezicima možda drugačije piše? Recimo u C-u i C++-u je definirana konstanta NULL, dok se u drugim jezicima koristi null (u pascalu nil). A u svim tim jezicima možeš provjeriti je li pokazivač ili objekt null tako da napišeš u stilu if(pokazivac)...

 

jurluk kaže...
i da, hvala na uloženom trudu i vremenu! rezultat je očigledan ;)

Nema problema. Bar negdje mogu prosipati svoju mudrost, s obzirom da nisam završio faks pa da mudrost prosipam učenicima ili studentima. {#}

Poruka je uređivana zadnji put sub 12.3.2011 2:21 (mbaksa).
16 godina
online
Re: Programiranje u C-u - od svega pomalo

@ jurluk,

pošto je već netko pametniji savršeno (precizno) dao savjet, moram ga iskoristiti.

mbaksa kaže...
Uglavnom - poanta ovog mojeg je - ako već učiš, onda uči ispravno. I onda radi ispravno. Jer će ti se u suprotnom nekad i u nekom ozbiljnijem programu dogoditi da ne radiš ispravno, da koristiš globalne varijable tamo gdje ne treba itd. Pazi - iz iskustva znam da ti se takve stvari, za koje ti se isprva čini da su "lakše", kasnije obiju u glavu. {#} Recimo ti bi, sad da ideš prepraviti program da to bude kak spada, trebao potrošiti barem pet puta više vremena na prepravljanje, nego da si odmah to napravio kako treba. I ne samo da bi time gubio vrijeme, nego ti se otvara mogućnost da napraviš i neki bug.

- jer učenje-vježbanje, čemu služi?

- Služi dobijanju rutine, rutina (u svakom poslu) vodi do savršenosti-preciznosti, izbjegavanju grešaka. Dali je to kuhanje, nogomet, glazba... jednako s programiranjem.

- Upravo je važno učiti 'pravilno', tek kasnije možeš razviti svoj stil, možda izmisliti nešto bolje..

Važno je da te vježbe (učenje) od početka radiš po pravilima struke, kasnije se navike teže mijenjaju.

Jednako ako ikad misliš proči razgovor za posao, vozači imaju internacionalne znakove, glazbenici note.. programeri imaju čist (ili prljav) kod. S takvim kodiranjem ispao bi u prvom krugu kvalifikacija za posao...

Isprika da si početnik ne vrijedi, jer se gubi smisao učenja (na pravi način). Može se takva isprika koristiti kad već radiš neki posao i uleti nešto novo-hitno, tad je rješenje po ''good enough'' principu prihvatljivo (ali znaš da će se već sutra pojaviti problem zbog tog..). To je privremeno krpanje, izuzetak od pravila.

C64/TurboModul-OpenSourceProject.org.cn.部分作品为网上收集整理,供开源爱好者学习使用
15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

pozdrav forumaši

koristim devc++ i ne znam namjestiti da mi "prozor"(??kak da drugačije napišem??) stoji..tj. ja kad napravim neki program kompajler mi kaže da je sve u redu i da nema grešaka.. ali kad taj program idem pokrenuti pojavi mi se prozor na samo nekoliko mili sekundi (jedva ga vidim) i odmah nestane...danas sam razgovarao sa profesorom i on mi je rekao da moram napisati neku naredbu ispred zadnje vitičaste zagrade ali koju, nebi se sjetio da ga hebeš {#}

govorio mi je da u cmd-u mogu nešto pokušati namjestiti...do sata sam pokretao programe sa onim "izvrši do zadnjeg naredbenog retka" ali me zanima kako se namjestiti da normalno radi... pa ako neko zna o čemu uopće ja sad tu brbljam neka pomogne {#}

''Znam da ništa ne znam.''
Poruka je uređivana zadnji put pon 14.3.2011 23:11 (ilija2010lukic).
Moj PC  
0 0 hvala 0
16 godina
offline
Re: Programiranje u C-u - od svega pomalo

getch(); ?

Atomska bubamara
Poruka je uređivana zadnji put pon 14.3.2011 23:21 (jurluk).
14 godina
offline
Programiranje u C-u - od svega pomalo

#include <cstdlib>

.

.

.

.

.

.

system("PAUSE");

return 0;

}

Inteligencija nije znanje,već mašta
Poruka je uređivana zadnji put pon 14.3.2011 23:22 (KKristijan).
 
0 0 hvala 1
15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

radi se o čistom c-u..ne radi ni jedna od ove dvije naredbe, ali mislim da mi je profesor nešto slično spominjao kao jurluk..

izbaci grešku {#}

 

''Znam da ništa ne znam.''
Moj PC  
0 0 hvala 0
14 godina
offline
Re: Programiranje u C-u - od svega pomalo
ilija2010lukic kaže...

radi se o čistom c-u..ne radi ni jedna od ove dvije naredbe, ali mislim da mi je profesor nešto slično spominjao kao jurluk..

izbaci grešku {#}

 

Za njegovu naredbu tj.getch(); trebaš includead <conio.h>

dakle u includovima...#include <conio.h>

Inteligencija nije znanje,već mašta
Nova poruka
E-mail:
Lozinka:
 
vrh stranice