Programiranje u C++-u - pitanja i odgovori izdvojena tema

poruka: 7.285
|
čitano: 1.725.642
|
moderatori: XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
mbaksa kaže...
Ne da mi se sad zezati još s trećim returnom, no za ova dva je jasno da si ih mogao izbjeći jednostavnom oporabom else-a. {#} Logika ti je posve kontra - ti ideš ispitivati je li došlo do neke greške i onda silom izlaziš iz programa umjesto da ideš ispitivati treba li se program nastaviti izvršavati, a ako se ne treba, neka prirodno dođe do kraja.

Moram priznati da nista lose ne vidim u domagojevom kôdu, i ja to uglavnom tako radim. Ako je priroda greske takva da nema smisla nastavljati izvrsavanje programa/funkcije, onda ga odmah prekidam uz ispis poruke s greskom.

 

EDIT: ali ja *jesam* odrastao na bejziku :P

My computer once beat me at chess, but we got even after a round of boxing.
Poruka je uređivana zadnji put čet 8.12.2011 11:04 (rustweaver).
17 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
mbaksa kaže...

Nije te brinulo jer si pogrešno naučio pisati strukturiran kôd. Možda ti nitko ni nije pokazao da to može drugačije. Uglavnom, nadam se da si sad nešto naučio i da ćeš se sljedeći put dvaput zapitati trebaš li zaista negdje u sredini funkcije puknuti exit ili return. Imaš opet ekstremista koji su protiv bilo kakvog kršenja hijerarhije programa, dakle i protiv brakea, ali eto - to su ekstremisti.

Pa bilo je to za neki labos, ne sjecam se vise, tako da mi je svejedno bilo kako je napisano, bitno da funkcionira. Ali, da, zgodno je ovo.

rustweaver kaže...
... Ako je priroda greske takva da nema smisla nastavljati izvrsavanje programa/funkcije, onda ga odmah prekidam uz ispis poruke s greskom.

That also. xD

C provides a programmer with more than enough rope to hang himself. C++ provides a firing squad, blindfold and last cigarette.
Poruka je uređivana zadnji put čet 8.12.2011 11:07 (1domagoj1).
15 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
mbaksa kaže...
rustweaver kaže...
athlon64 kaže...

ah ma šta je najgore od svega to mi je i palo napamet pa sam stavia zbrojdjelovapizze = 0, al s obzirom da je double varijabla treba sam stavit 0.0

Nisam siguran da kod dodjeljivanja vrijednosti varijabli tipa double ili float ima neke razlike izmedu 0 i 0.0, compiler bi to trebao automatski prilagoditi. Bitno je samo da varijabli dodjelis neku vrijednost.

Tako je. Onda bi mu se eventualno žalio na implicitni cast ili tako nešto.

a cujes, stavljanje 0 mi je palo na pamet, ali ovaj nije radio, radi tek kad sam stavia 0.0

Nikad te necemo zaboraviti. RIP EnlightenedPhoenix 24.6.2011.
17 godina
moderator
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...
mbaksa kaže...
Ne da mi se sad zezati još s trećim returnom, no za ova dva je jasno da si ih mogao izbjeći jednostavnom oporabom else-a. {#} Logika ti je posve kontra - ti ideš ispitivati je li došlo do neke greške i onda silom izlaziš iz programa umjesto da ideš ispitivati treba li se program nastaviti izvršavati, a ako se ne treba, neka prirodno dođe do kraja.

Moram priznati da nista lose ne vidim u domagojevom kôdu, i ja to uglavnom tako radim. Ako je priroda greske takva da nema smisla nastavljati izvrsavanje programa/funkcije, onda ga odmah prekidam uz ispis poruke s greskom.

Logika je naopaka, hijerarhija programa je narušena. Ona kôd s trećim returnom mu se izvodi samo ako je drugi uvjet zadovoljen, do provjere drugog uvjeta dolazi samo ako je prvi uvjet zadovoljen. Dakle, posve jasna hijerarhijska struktura! Međutim, njegov program je tipa:

 

ako nisu navedeni svi argumenti onda kraj;

pokušaj dohvatiti datoteku;

ako nisi dohvatio datoteku onda kraj;

unutarnji blok

 

 

Znači, u kodu nema nikakve hijerarhije, ali se program izvodi kao da ima hijerarhije, kao da je napisan u stilu:

 

ako su navedeni svi argumenti onda:

--pokušaj dohvatiti datoteku;

--ako si uspio dohvatiti datoteku

----unutarnji blok;

 

 

Kužiš? Mislim da takva diskrepancija nije u redu. Da, nekad je možda jednostavnije prekinuti odmah program ili što već, ali treba dobro razmisliti što time činiš. Nekad je bolje prekinuti, ali u ovom slučaju mislim da to baš i nema nekog realnog smisla.

 

Najgora stvar je to što kad se naučiš tako nasilu prekidati programe, onda ćeš ih ćešće prekidati i kad za to zaista nema potrebe, kad si jednostavno stvar mogao riješiti pomoću if-else umjest if-exit ili if-return. {#}

 

Poruka je uređivana zadnji put čet 8.12.2011 11:47 (mbaksa).
17 godina
offline
Programiranje u C++-u - pitanja i odgovori

Može se bez prekida sa samo jednim return 0 na kraju programa

 

#include<iostream>
using namespace std;
int main()
{
   
    if(argc == 3) // ako ima tri argumenta idi u blok
    {
       dat = dohvati_datoteke ( argv[1], &n );
       if(dat != null) // ako si dohvatio datoteku idi u blok
       {
           if ( ( test = opendir ( argv[2] ) ) == NULL ) // ako nema odredišmog direktorija pokušaj ga stvoriti
           {
              if ( mkdir ( argv[2], 0755 ) ) /* 0755 == rwx r-x r-x */
              {
                  perror ( "mkdir" );
                       fprintf ( stderr, "Ne moze se stvoriti direktorij %s\n",
                       argv[2]);
              }
           }
           if(argv[2] != null) // ako je odredišni direktorij postojao ili je stvoren idi u blok
           {
              // blok sa kodom
           }
       }
       else
       {
          // nema datoteke iz koje kopiramo
       }
    }
    else
    {
       // nedovoljno ili previše argumenata
    }
    return 0;
   }

 
2 0 hvala 0
16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Imam glupi problem:
program ucitava imena, i upisuje ih u datoteku. Medjutim, nikako ne uspijevam u datoteci dobiti ispravna 'nasa' slova, nego samo neke divlje znakove, dok ispis na konzolu sa cout radi kako treba. Pokusao sam i sa wofstream, ali zapisani fajl je isto ansi, a ne unicode. Tu je kod:

 

vector<wstring> imena;

cout<<"Upisi 3 imena:"<<endl;

for (int i = 0; i < 3; i++)
{
    wstring strIme;

    getline(wcin, strIme);

    imena.push_back(strIme);
}

wofstream file;

file.open(L"TestImena.txt");

for (int i = 0; i < imena.size(); i++)
{
    file << imena[i]<<endl;

    wcout<<imena[i]<<endl;
}

file.close();

 

 

Lack of money is the root of all evil. George Bernard Shaw
14 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Ja ne vidim ništa loše u Domagojevom codu. I osobno vrlo često pišem na taj način;

 

1. Ulazni parametri se validiraju odmah na početku i ako ne zadovoljavaju funkcija nema smisla dalje da nastavlja s radom. Jednostavno vrati code greške i to je to.

2. Brže je. Nema može-bitnih među-operacija između validacije parametara.

3. Nema nepotrebnih grananja.

 

I sam C/C++ koristi ovaj princip rada. Npr;

 

int A = 0, B = 1, C = 1;

if(A!=0 && B == C) ...

 

Ovo je jedna obična if naredba čije se ispitivanje u C/C++u prekida odmah čim se provjeri stanje izraza A!=0. S obzirom na operator and (&&) tu je prevoditelj odmah ustanovio da će cjelokupni izraz biti false bez obzira što se dalje u codu nalazilo, dok npr. Visual Basic provjerava cjelokupni izraz.

 

 

http://www.chess.com/livechess/profile/Tracer1808
Moj PC  
0 0 hvala 0
17 godina
offline
Programiranje u C++-u - pitanja i odgovori

Možemo i iskoristiti prirodu operatora OR u složenom uvjetu, ako je lijeva strana true (uspješno otvorilo odredišnu datoteku) odmah ide u blok sa kodom, ako je false, pokušava stvoriti novu datoteku, ako je true (stvorilo novu datoteku) ide u blok sa kodom, ako je i desna strana false - ide u else.

 

 

#include<iostream>
using namespace std;
int main()
{
   
    if(argc == 3) // ako ima tri argumenta idi u blok
    {
       dat = dohvati_datoteke ( argv[1], &n );
       if(dat != null) // ako si dohvatio datoteku idi u blok
       {
           if ( ( test = opendir ( argv[2] ) ) != NULL || mkdir (argv[2], 0755 == NULL)) // ako otvori odredišnu datoketu,
           {                                                                            // ulazi u blok sa kodom
               // blok sa kodom                                                         // ako ne uspije pronaći odredišnu
           }                                                                           // datoteku pokušava je stvoriti
           else                                                                       
           {
              // nema datoteke u koju kopiramo i ne može se stvoriti
           }
       }
       else
       {
          // nema datoteke iz koje kopiramo
       }
    }
    else
    {
       // nedovoljno ili previše argumenata
    }
    return 0;
   }

Poruka je uređivana zadnji put čet 8.12.2011 15:03 (Floki).
 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
CalvinRi kaže...

Imam glupi problem:
program ucitava imena, i upisuje ih u datoteku. Medjutim, nikako ne uspijevam u datoteci dobiti ispravna 'nasa' slova, nego samo neke divlje znakove, dok ispis na konzolu sa cout radi kako treba. Pokusao sam i sa wofstream, ali zapisani fajl je isto ansi, a ne unicode. Tu je kod:

 

vector<wstring> imena;

cout<<"Upisi 3 imena:"<<endl;

for (int i = 0; i < 3; i++)
{
    wstring strIme;

    getline(wcin, strIme);

    imena.push_back(strIme);
}

wofstream file;

file.open(L"TestImena.txt");

for (int i = 0; i < imena.size(); i++)
{
    file << imena[i]<<endl;

    wcout<<imena[i]<<endl;
}

file.close();

 

 

Probaj definirati locale prije otvaranja datoteke. Npr.

 

std::locale::global( std::locale("en_US.UTF8") );

 

Ovo sam izvukao iz jednog starog programa pa detaljnije potraži na netu.

 

http://www.chess.com/livechess/profile/Tracer1808
17 godina
moderator
offline
Re: Programiranje u C++-u - pitanja i odgovori
TracerCPP kaže...

Ja ne vidim ništa loše u Domagojevom codu. I osobno vrlo često pišem na taj način;

 

1. Ulazni parametri se validiraju odmah na početku i ako ne zadovoljavaju funkcija nema smisla dalje da nastavlja s radom. Jednostavno vrati code greške i to je to.

U onome što sam napisao program ne nastavlja dalje s radom, kad ga else odvede do kraja programa. To je moja kritika - umjesto da koristi if-else, on koristi if-return i na silu prekida izvođenje programa, negdje na početku. Kao da ne postoji naredba if-else. Kao da ga se hijerarhija ne tiče.

 

TracerCPP kaže...
2. Brže je. Nema može-bitnih među-operacija između validacije parametara.

Gledajući tvoja prva dva komentara rekao bih da nisi skužio moju kritiku i da nisi skužio moju korekciju. Pogledaj ponovno. Pišeš nešto što se ne odnosi na moju korekciju. Razlika u izvođenju između moje korekcije i njegovog koda je samo u tome što on nasilno izlazi na više mjesta, a moji if-else umjesto nasilnog izlaska jednostavno dovedu do kraja funkcije. Ako nema tri parametra, onda neće ni doći do validacije parametara kad se u tom slučaju izvodi else, odnosno ide se na kraj main funkcije. Mislim... Jesi ti uopće pročitao moju korekciju? Jesi pogledao Flokijev kôd? O čem ti pričaš?

 

TracerCPP kaže...
3. Nema nepotrebnih grananja.

Koja nepotrebna grananja?

Poruka je uređivana zadnji put čet 8.12.2011 15:12 (mbaksa).
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Ne razumijem što si se ti tu našao prozvanim? Ja sam samo dao svoj komentar i dalje stojim iza njega. if-return po meni nije greška niti je tu riječ o ikakvom nasilnom prekidu programa, već tek prijevremenom - što je sasvim normalna stvar u aplikacijama. Isto tako, hijerarhija takvog tipa ne mora nužno postojati niti ju je itko kao takvu propisao. Štoviše, imam ovdje kraj sebe cca. 45 bankovnih aplikacija (java) razvojnih timova u kojima se upravo koristi taj stil, tako da to nije nikakva čudna ili loša praksa.

 

I bez obzira na to skužio ja nešto dobro ili ne, mislim da si nismo tako dobri da mi se obraćaš u stilu "O čem ti pričaš". Ne mora ti se sviđati moje mišljenje, no ako ga ne možeš poštovati nemoj na njega niti odgovarati.

http://www.chess.com/livechess/profile/Tracer1808
17 godina
moderator
offline
Re: Programiranje u C++-u - pitanja i odgovori
TracerCPP kaže...
I bez obzira na to skužio ja nešto dobro ili ne, mislim da si nismo tako dobri da mi se obraćaš u stilu "O čem ti pričaš".

Dao si neopravdani kritiku pa očekujem da je i pojasniš. O kakvim to "može-bitnih među-operacija između validacije parametara." pričaš?

14 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Ako je parametar1 ispravan

    operacija1

    operacija2

    operacija3

    Ako je parametar2 ispravan

        operacija4

        operacija5

        operacija6

...

 

I to je ono na što sam ja mislio. Meni nema smisla raditi operacije 1,2 i 3 ukoliko parametar2 nije ispravan jer u programu obično moraš raspolagati svim tim parametrima da bi napravio posao. Štoviše, ako su operacija 1,2 i 3 nešto tipa "sortiraj" i sl. što traži vremena onda svakako nije preporučljivo.

 

E sad, ako si ti govorio o nečemu drugome onda je moja greška. Nije baš da imam vremena gledati svaki "milimetar" koda.

http://www.chess.com/livechess/profile/Tracer1808
Poruka je uređivana zadnji put čet 8.12.2011 16:14 (TracerCPP).
Moj PC  
0 0 hvala 0
17 godina
moderator
offline
Re: Programiranje u C++-u - pitanja i odgovori
TracerCPP kaže...

Ako je parametar1 ispravan

    operacija1

    operacija2

    operacija3

    Ako je parametar2 ispravan

        operacija4

        operacija5

        operacija6

...

 

I to je ono na što sam ja mislio. Meni nema smisla raditi operacije 1,2 i 3 ukoliko parametar2 nije ispravan jer u programu obično moraš raspolagati svim tim parametrima da bi napravio posao. Štoviše, ako su operacija 1,2 i 3 nešto tipa "sortiraj" i sl. što traži vremena onda svakako nije preporučljivo.

Slažem se s tim što si napisao, no koliko ja vidim, u Domagojevom kôdu nema takvih testiranja parametara. A i kad bi bilo, to nema veze s mojom kritikom, a i ako bi imalo veze s mojom kritikom, onda bih mu rekao neka odmah na početku testira sve parametre pa neka mu dalje kod ispravno hijerarhijski teče.

 

-----------------------------

 

 

Poanta moje kritike je vidljiva na slici - dijagram tijeka bi bio praktički identičan (samo što bi se zamijenilo true/false), a program je napisan kao ovo ljievo (ovo nije dijagram tijeka niti bi trebao biti - ovo je prikaz hijerarhije), a izvodi se kao ovo desno. Ako se izvodi kao ovo desno, zar onda ne bi bilo logičnije da je tako i napisan?

 

Valja napomenuti da iako u programu nije specificirano else, sve nakon if-a je zapravo else, pošto se na if na silu izlazi van iz programa - dakle, i u tom kôdu s if-returnom i dalje zapravo postoji (virtualni) if-else, samo što je zamaskiran i nema hijerarhiju u samom programskom kôdu. Koja je onda svrha takvog kôda, gdje ti namjerno zamaskiravaš način izvođenja/funkcioniranja, odnosno hijerarhiju programa? Hijerarhija postoji, ali si ju sakrio pomoću if-return konstrukcije. S koje god strane pogledaš, to nije u redu. Ako već siliš s returnom, da si ne moraš uvoditi zastavicu pa returnati zastavicu, pa onda zamijeni if i else, pa returnaj u else, pa em će hijerarhija programa biti sačuvana, em ćeš returnati pri samom kraju programa!

 

I rekao sam - ne treba pod svaku cijenu izbjegavati returne unutar funkcije (jer to ponekad može jako zakomplicirati situaciju), no ako je moguće funkciju napisati bez nepotrebni returna, onda ju je bolje napisati bez nepotrebnih returna, jer je hijerarhija programa očuvana i u kôdu, a ne da postoji samo virtualna hijerarhija tijekom izvođenja programa.

13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
CRT kaže...

ovo sa exit(0)

Inače nevezano za ovo što ovi gore raspravljaju, imaš funkciju system(), http://www.cplusplus.com/reference/clibrary/cstdlib/system/, njoj predaješ argumente koje si koristio u CMD-u, za izlazak je bila exit, za pauzu, pause, za brisanje prethodnog teksta, cls, za pregled direktorija dir, znači možeš i praviti foldere, jednostavno predaš argument "md ime", još zgodno možeš mijenjati boje, argumentom color, napišeš color i broj od 1 do f:

0 = Black

1 = Blue

2 = Green

3 = Aqua

4 = Red

5 = Purple

6 = Yellow

7 = White

8 = Gray

9 = Light Blue

A = Light Green

B = Light Aqua

C = Light Red

D = Light Purple

E = Light Yellow

F = Bright White

 

Programming is understanding. – Kristen Nygaard
17 godina
moderator
offline
Re: Programiranje u C++-u - pitanja i odgovori
royalhero kaže...
CRT kaže...

ovo sa exit(0)

Inače nevezano za ovo što ovi gore raspravljaju, imaš funkciju system(), http://www.cplusplus.com/reference/clibrary/cstdlib/system/, njoj predaješ argumente koje si koristio u CMD-u, za izlazak je bila exit, za pauzu, pause, za brisanje prethodnog teksta, cls, za pregled direktorija dir, znači možeš i praviti foldere, jednostavno predaš argument "md ime", još zgodno možeš mijenjati boje, argumentom color, napišeš color i broj od 1 do f:

Te stvari se inače ne rade, jer su ovisne o platformi. Ti s pozivanjem funkcije system samo zapravo OS-ovom interpreteru predaješ naredbu (znači isto ono što ukucavaš u terminal ili command prompt). Ako već imaš potrebe manipulirati s takvim nekim stvarima poput boja ili čegaveć, a da nemaš alternativu u standardnoj C/C++ biblioteci, onda si nabaviš biblioteke preko kojih imaš tu mogućnost.

 

Općenito je apsurdno išta takvo ići raditi u tekstualnom sučelju, jer je to stvar prošlosti, osim ako ne radiš neki komandnolinijski program kojeg misliš dati ljudima na korištenje.

13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Ali eto korisan je za system("PAUSE");, system("EXIT");, system("CLS");

Programming is understanding. – Kristen Nygaard
17 godina
offline
Programiranje u C++-u - pitanja i odgovori

Imamo ove validacije:

1. postojanje tri argumenta

2. postojanje izvorišne datoteke

3. postojnje odredišne datoteke

4. uspješnost stvaranja odredišne datoteke (opcionalna - ako je treća validacija false)

 

Ako se može izvesti bez prekida, super, ako se i stavi jedan prekid, nema zla

Čisto da vidimo razne mogućnosti, a  previše prekida nije baš cool, uz postojanje tih if else if else grananja i kombiniranih uvjeta AND i OR,

a sad, stavljati za svaku validaciju false prekid, nije u redu.

Poruka je uređivana zadnji put čet 8.12.2011 16:57 (Floki).
 
0 0 hvala 0
17 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
royalhero kaže...

Inače nevezano za ovo što ovi gore raspravljaju, imaš funkciju system(), http://www.cplusplus.com/reference/clibrary/cstdlib/system/

...

Koju sam mu rekao da ne koristi. U prvom redu jer je ovisna o platformi. A tu su i druge stvari.

 

@moj kod

Posteno ste ga isecirali xD, cak i dijagrame imamo :D. A i najsmijalo me... :D

C provides a programmer with more than enough rope to hang himself. C++ provides a firing squad, blindfold and last cigarette.
16 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Nije baš programiranje, nego kodiranje, ali rješavan zadatke za vježbu i sve kužim osim ovog zadatka, koji je još i jedan od lakših... znao bih da treba pomoću 6 bitova, to je onda 20, ali kako za 8 bitova?

 

Broj (-44) predstavite pomoću 8 bita u sustavu dvojnog komplementa!
Pomoću 6 bitova je prim. kompl. 010100, pomoću 8.. hmmm?!

 

Da pomoću 8 nije 11010100?

Ste videli lepote, ko sredi noci Zapiha veter samote Rosa, reke in morja R.I.P. EnlightenedPhoenix 24.6.2011.
Poruka je uređivana zadnji put čet 8.12.2011 17:05 (Mitsuoka).
 
0 0 hvala 0
17 godina
moderator
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...

Imamo ove validacije:

1. postojanje tri argumenta

2. postojanje izvorišne datoteke

3. postojnje odredišne datoteke

4. uspješnost stvaranja odredišne datoteke (opcionalna - ako je treća validacija false)

 

Ako se može izvesti bez prekida, super, ako se i stavi jedan prekid, nema zla

Čisto da vidimo razne mogućnosti, a  previše prekida nije baš cool, uz postojanje tih if else if else grananja i kombiniranih uvjeta AND i OR

Najveća fora je da u Domagojevom programu prekidi uopće nisu potrebni - samo da je drugačije razmišljao, da nije išao linijom "ako se dogodila greška onda ruši program", nego da je išao linijom "ako nema greške napravi ovo". Čemu takvo negativno razmišljanje kod pisanja programa? {#}

 

royalhero kaže...

Ali eto korisan je za system("PAUSE");, system("EXIT");, system("CLS");

system("EXIT")? Što to radi?

 

Nego - je li stvarno koristan? Što će ti System("PAUSE")? To ti treba samo ako koristiš DevC++ da ti ne zatvori prozor. Ako takav program pozoveš iz naredbenog retka, tek onda si napravio glupost - bezveze ćeš za prekid izvođenja programa trebati pritisnuti tipku. system("CLS")? Što kad takav program pokreneš na Unixu/Linuxu? AFAIK u terminalu je naredba za brisanje ekrana clear - ne znam jesu li noviji shellovi uveli i CLS pa da bude kao kod DOS-a/Windowsa. Shvaćaš? S tim si samo kompliciraš život. Rješavaš probleme koji ni ne bi trebali postojati, odnosno koji ni ne postoje ako koristiš neki normalni vizualni razvojni alat koji ti nudi razvoj GUI aplikacija.

 

1domagoj1 kaže...
@moj kod

Posteno ste ga isecirali xD, cak i dijagrame imamo :D. A i najsmijalo me... :D

Ovdje smo da analiziramo, propitkujemo, učimo. Čak i ja ponekad nešto naučim, a ako ništa drugo, imam mogućnost analiziranja - vježba za mozak. {#}

14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Naravno da to ima isti efekt kao if-else, no ne vidim u čemu je problem s returnom? Nije to nasilno prekidanje izvođenja već naprotiv, izlazak s povratnom informacijom. Pogledaj samo rekurzije. U njima je dodatni return obavezan zbog uvjeta završetka rekurzije.

 

Da li ti izašao iz funkcije u tom zadanom trenutku (liniji) ili tek poslije if bloka koji vodi na kraj funkcije je... u praksi svejedno. To što ti voliš pisati na taj način ima svojih prednosti u pogledu vizualnog pregleda kôda, no ja osobno ne volim raditi toliko blokova naredbi. U jednom trenutku ipak postane teško za pratiti. Pogotovo još kada u ozbiljnim programima imaš još i try,catch blokove. Šuma vitičastih zagrada.

http://www.chess.com/livechess/profile/Tracer1808
17 godina
moderator
offline
Re: Programiranje u C++-u - pitanja i odgovori
TracerCPP kaže...

Naravno da to ima isti efekt kao if-else, no ne vidim u čemu je problem s returnom?

Zbog onog što sam prikazao na ilustraciji - ruši se hijerarhija programa. Postoji virtualna hijerarnija kod izvođenja programa, ali ne postoji hijerarhija u kôdu.

 

TracerCPP kaže...

Nije to nasilno prekidanje izvođenja već naprotiv, izlazak s povratnom informacijom.

Isto tako možeš izaći s povratnom informacijom u elseu! I pazi stvar, ako u Domagojevom programu s povratnom informacijom izlaziš u elseu (umjesto u if-u), svi izlasci su ti na samom kraju programa! Dakle, em si koristio return za vraćanje vrijednosti umjesto da uvodiš zastavicu, em nema ranih izlazaka, em si sačuvao hijerarhiju. WIN-WIN-WIN situacija. {#}

17 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Mitsuoka kaže...
...

 

Da pomoću 8 nije 11010100?

Je.

 

44 binarno je 101100. Sa 8 bitova to napises tako da dodas dvije nule na najznacajnija mjesta, dakle s lijeve strane. 00101100. Dvojni komplement najlake radis tako da krenes od desne strane i prepisujes brojeve sve dok ne dodes do prve jedinice, prepises i nju, a onda nakon nje sve nule invertiras u jedinice, a sve jedinice u nule. Dakle, 11010100. Nadam se da je ovo dobro, da se jos dobro sjecam toga. Ako nije, slobodno nek me ispravi netko.

C provides a programmer with more than enough rope to hang himself. C++ provides a firing squad, blindfold and last cigarette.
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
1domagoj1 kaže...
Mitsuoka kaže...
...

 

Da pomoću 8 nije 11010100?

Je.

 

44 binarno je 101100. Sa 8 bitova to napises tako da dodas dvije nule na najznacajnija mjesta, dakle s lijeve strane. 00101100. Dvojni komplement najlake radis tako da krenes od desne strane i prepisujes brojeve sve dok ne dodes do prve jedinice, prepises i nju, a onda nakon nje sve nule invertiras u jedinice, a sve jedinice u nule. Dakle, 11010100. Nadam se da je ovo dobro, da se jos dobro sjecam toga. Ako nije, slobodno nek me ispravi netko.

E tako sam i radio.. dobro ovo mi je samo bilo za potvrdu jer nisam bio siguran... 

Ste videli lepote, ko sredi noci Zapiha veter samote Rosa, reke in morja R.I.P. EnlightenedPhoenix 24.6.2011.
17 godina
moderator
offline
Programiranje u C++-u - pitanja i odgovori

@Domagoj - jel znaš inače da imašbug u programu? Pred sam kraj programa imaš naredbu free(dat). Hoće li se ta naredba izvršiti svaki put kad je uspješno provedena naredba dat = dohvati_datoteke(argv[1], & n);? NEĆE! Kad neće? Ako ti dođe do onog return 3!

 

To je jedan od razloga zašto su preuranjeni izlasci opasni! Jer ne obaviš uvijek stvari do kraja - previdiš, zaboraviš. A da si sve returnove nagurao na kraj, to bi puno lakše skužio. Da si umjesto returnova koristio zastavicu, taj bug ni ne bi bio moguć!

 

 

Dakle, najbolja opcija bi bila zastavica - najsiguranija je. Druga najbolja opcija je nastaviti s programom ako je sve u redu, a returnati ako nije, odnosno na kraju programa. Dakle, u stilu:

 

int main(int argc, char * argv[]) { /* zadano */
    char ime1[IME], ime2[IME], ime3[IME], vrijeme[20];
    int n, i;
    char * * dat;
    DIR * test;

    if (argc == 3) {
        dat = dohvati_datoteke(argv[1], & n);

        if (dat != NULL) {
            mkdir(argv[2], 0755);

            if ((test = opendir(argv[2])) != NULL) {
                closedir(test);

                printf("Kopiram iz %s -> %s:\n", argv[1], argv[2]);

                /* Iteriraj po svim datotekama */
            
             ...........................
            
            } else {
                perror("mkdir");
                fprintf(stderr, "Ne moze se stvoriti direktorij %s\n", argv[2]);
            free(dat);
                return 3;
            }
         
           free(dat);
        } else return 2;
    } else {
        fprintf(stderr, "Program kopira jedan direktorij u drugi\n");
        fprintf(stderr, "Uporaba: %s direkt1 direkt2\n", argv[0]);
        return 1;
    }

    return 0;
}

 

-----------------

 

Domagoje, vidiš ovo označeno žutom bojom? To ti nemaš u svom programu, a trebao bi imati - previdio si return 3.

 
1 0 hvala 0
17 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Evo. {#}

     dat = dohvati_datoteke ( argv[1], &n );
     if ( dat == NULL )
         return 2;

     if ( ( test = opendir ( argv[2] ) ) == NULL )
     {
         if ( mkdir ( argv[2], 0755 ) ) /* 0755 == rwx r-x r-x */
         {
             perror ( "mkdir" );
             fprintf ( stderr, "Ne moze se stvoriti direktorij %s\n",
                   argv[2]);
             free(dat);
             return 3;
         }
     }

 

Kao sto rekoh, ovo je bio jedan labos, bitno mi je bilo samo da radi i da prekopira te datoteke, bugove nisam trazio osim ako nije u pitanju bio segmentation fault ili neki drugi error. Moguce da je kompajler ovo prijavio kao warning, ali sam to sretno ignorirao. Nek se OS pobrine za kucanske poslove u ovom slucaju, ignorantski, ali jbg, nije da sam radio neku krucijalno bitnu aplikaciju, a koliko se poznajem, vjerojatno sam ovo pisao dan prije predaje ili jos vjerojatnije, noc prije predaje.

C provides a programmer with more than enough rope to hang himself. C++ provides a firing squad, blindfold and last cigarette.
 
0 0 hvala 0
17 godina
moderator
offline
Re: Programiranje u C++-u - pitanja i odgovori
1domagoj1 kaže...
Kao sto rekoh, ovo je bio jedan labos, bitno mi je bilo samo da radi i da prekopira te datoteke, bugove nisam trazio osim ako nije u pitanju bio segmentation fault ili neki drugi error. Moguce da je kompajler ovo prijavio kao warning, ali sam to sretno ignorirao. Nek se OS pobrine za kucanske poslove u ovom slucaju, ignorantski, ali jbg, nije da sam radio neku krucijalno bitnu aplikaciju, a koliko se poznajem, vjerojatno sam ovo pisao dan prije predaje ili jos vjerojatnije, noc prije predaje.

Ma ništa strašno, ja ti samo na tvom primjeru objašnjavam zašto je bolje raditi onako kako sam rekao. Dakle, em sam u teoriji objasnio zašto je bolje, em sad i u praksi na tvom primjeru. {#}

16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
TracerCPP kaže...

To što ti voliš pisati na taj način ima svojih prednosti u pogledu vizualnog pregleda kôda, no ja osobno ne volim raditi toliko blokova naredbi. U jednom trenutku ipak postane teško za pratiti. Pogotovo još kada u ozbiljnim programima imaš još i try,catch blokove. Šuma vitičastih zagrada.

Pri pisanju "ozbiljnog" programa koristit ćeš "ozbiljan" IDE koji će voditi računa o zagradama.

 

Osim toga, argument da kod u vizualnom smislu je superiorniji sam bi morao nadglasati sve ostale argumente (osim ukoliko se preformanse ozbiljnije najrušavaju). Ovaj puta slažem se u potpunosti s mbaksom, iako sam prvi koji će ići dočekati na nož nekoga tko za skripticu od 20 redova ide kenjati da nije pisana po OO paradigmi i da bi se sve moglo učahuriti u klasu, u ovome slučaju sam... Ne baš toliko naklonjen proceduralnom programiranju. Jednostavno hijerarhija je zbrda-zdola. A po sebi znam koliko je teško kada se jednom naučiš na jedan tip programiranja, preći na drugi (QB na C++, C++ na Python (uvlačenja), Ruby na Haskell).

You can patch technical vulnerabilities as they evolve, but there is no patch for stupidity, or rather gullibility. - Kevin Mitnick
17 godina
moderator
offline
Re: Programiranje u C++-u - pitanja i odgovori

@Bukva - konačno neko razme o čem ja pripovedam i da ne kenjkam zabezveze. {#}

 

Inače, kvalitetno napisan program ima jedan nedostatak - u slučaju da pojede puno memorije, sporo se gasi. Zato jer obrnutim redoslijedom uništava sve objekte koje je kreirao. Ako recimo koristiš Firefox i imaš hrpu otvorenih stranica i pojede ti više od gigabajta memorije, bome se i sporo gasi.

 

Međutim, bolje i to nego nešto što nas se dogodilo kad smo snimali BugTV. Koristili smo nekakav program za snimanje ekrana na Androidu i kolega pritisne snimanje, snima se neko vrijeme, izađe van iz programa, probamo vidjeti kako je ispalo snimljeno, a kad ono - nečitljiva datoteka. Nakon malo muke, skužili smo u čemu je stvar - trebalo je ručno prekinuti snimanje (sučelje je malo nejasno po tom pogledu) pa kod izlaska iz programa program nije završio snimanje i zatvorio datoteku! Pa ti onda returnaj prije reda! {#} Ta greška u tom programu je isključivo posljedica šlampavosti i nemarnosti, odnosno odbijanja poštivanja hijerarhije i toga da sve što se kreira, mora se i uništiti. Kod gašenja programa trebali su se uništiti svi objekti, uključujući i objekt koji vrši snimanje i spremanje u datoteku i taj objekt je u svom destruktoru trebao provjeriti snima li se i ako se snima trebao je pozvati metodu za zatvaranje datoteke.

E-mail:
Lozinka:
 
vrh stranice