Programiranje u C-u - od svega pomalo izdvojena tema

poruka: 1.661
|
čitano: 386.859
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...

Tražio sam po net-u dosta pa sam našao ove stranice:

1. razlog ampersanda

Uff, ne znam kako točno da ti ovo jednostavno objasnim. Ampersand tu možeš i izostaviti, jer i sa njime i bez njega dobiješ istu stvar.

 

Počnimo redom. Što je pokazivač? To je varijabla koja sadrži u sebi neku brojčanu vrijednost. Ta vrijednost je u biti memorijska adresa nečega. Ali kako su memorijske adrese brojčane vrijednosti sa njima možeš vršiti računske operacije kao i sa integerima. A pošto su pokazivači varijable to znači da i oni imaju svoju memorijsku adresu.

 

Polje je niz nečega u memoriji. To je agregatni tip koji se sastoji od skupa više vrijednosti, baš kao i struktura. No polje se u nekim situacijama ponaša kao pokazivač (za razliku od struktura). Npr. gdje god se ime polja spominje u programu, to ime će biti zamjenjeno adresom prvog elementa tog polja (kao da radiš sa vrijednosti pokazivača). Ako polje pokušaš proslijediti funkciji kao argument, u biti ćeš proslijediti memorijsku adresu prvog elementa tog polja, ako iskoristiš "&" operator, također ćeš dobiti memorijsku adresu prvog elementa tog polja. Strukture su drukčije, ako strukturu proslijediš funkciji kao argument, ti doslovno vrijednosti cijele strukture šalješ toj funkciji (pass by value), a ako upotrijebiš operator "&" onda ćeš funkciji proslijediti samo memorijsku adresu te strukture.

 

Dinamički alocirana polja su nešto posve drugo. To u biti nisu polja, nego blokovi memorije koji mogu biti tretirani kao polja. Takvim blokovima se pristupa preko pokazivača (tada pokazivač sadrži početnu adresu alociranog bloka memorije).

 

Gdje se polja i pokazivači susreću (što im je zajedničko)? U aritmetici sa pokazivačima. I na jednima i na drugima možeš koristiti iste operatore kako bi došao do nekih elemenata:

 

int A[20];
int *B=(int*) malloc(20*sizeof(int));

A[2]=200;
B[2]=200;

printf("%d %d\n", A[2], B[2]);

*(A+2)=66;
*(B+2)=66;

printf("%d %d\n", A[2], B[2]);

U ovom primjeru možeš vidjeti polje od 20 integera nazvano "A", i pokazivač koji pokazuje na alocirani blok memorije velicine 20 integera (20*sizeof(int)), nazvan "B".

 

I polje i pokazivač možemo tretirati kao polje koristeći operator subskripta elementa "[]", te pomoću tog operatora postavimo vrijednost trećeg elementa na 200 (ovo je primjer gdje se pokazivač tretira kao polje).

 

I polje i pokazivač možemo tretirati kao memorijske adrese, pa ih dereferencirati kako bi aritmetikom pokazivača postavili vrijednost memorije na određenoj adresi na 66 (ta memorijska adresa se u ovom primjeru poklapa sa adresom drugog elementa polja).

 

 

A gdje se polja i pokazivači razilaze?

 

Hajdemo im obojima pokušati uvećati vrijednost:

A+=2;
B+=2;

 

Ne može. Kompajler ne želi kompajlirati jer tvrdi da "A" nije varijabla koja ima jednu vrijednost, nego je skup vrijednosti (elemenata). "B" s druge strane ima jednu jedinu vrijednost koju možeš mijenjati kako god ti drago. Dakle naučili smo da elemente polja možemo mijenjati, ali ono što se krije iza tog polja se ne može mijenjati.

 

Da vidimo u čemu se još razlikuju, hajdemo im ispisati vrijednost i adresu:

printf("0x%x 0x%x\n", A, &A);
printf("0x%x 0x%x\n", B, &B);

 

Interesantno, "A" u oba načina daje adresu svojeg prvog elementa, "B" je drukčiji. On prvo ispiše svoju vrijednost (to jest memorijsku adresu na koju pokazuje), a pomoću operatora "&" dobijemo adresu same varijable "B".

 

Pokušati dobiti veličinu:

printf("%d\n", sizeof(A));
printf("%d\n", sizeof(B));

Opa, veličina polja "A" je 80 (20 puta po 4 bajta za svaki integer), ali veličina pokazivača "B" je 4 (na 32 bitnom računalu memorijske adrese su velike 32 bita, odnosno 4 bajta), dakle nismo dobili veličinu alociranog bloka memorije nego veličinu same varijable.

 

 

Ukratko, naletio si na jednu malo manje jasnu stranu C jezika (ako se dobro sjećam bila je i velika rasprava baš o tome ovdje na forumu edit: dobro se sjećam).

 

http://c-faq.com/aryptr/aryptrequiv.html

 

To je u standardu pokriveno ovom rečenicom:

Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue.

 

Polje iz primjera koji si ti linkao je "pravo" polje, ti u svom programu nemaš polje nego pokazivač na blok memorije koji koristiš kao polje. Polje ti u oba slučaja da adresu prvog elementa polja (praktički ne možeš fulati), dok ti pokazivač ili može dati adresu na koju pokazuje, ili svoju vlastitu adresu.

 

Nadam se da ti je ovaj post koji se pretvorio u esej objasnio malo u čemu su pokazivači i polja slični, a u čemu se razlikuju. Često o tome ne moraš razmišljati, ali ponekad se opečeš ako ih jednostavno poistovjetiš.

 

pr0n_addict kaže...
2. razlog pointer ludila-a (mada je i meni bilo čudno - zašto bi ga castao u ** pa ga onda dereferencirao, wtf?)

E za ovo moraš malo zabrazditi u C++ i MFC. Frajer stvara objekt "data" klase CArray, koji sadrži polje u kojemu je svaki element pokazivač na foo. Dakle ima polje od kojih je svaki element pokazivač. Njemu funkcija qsort proslijedi pokazivač na taj element, što je u biti pokazivač na pokazivač.

 

Kod tebe svaki element polja nije pokazivač na strukturu, nego struktura. A funkcija qsort ti onda proslijedi pokazivač na taj element, odnosno dobiješ pokazivač na strukturu.

 

Kužiš sada razliku?

0xBADC0DE
Poruka je uređivana zadnji put pet 8.3.2013 5:38 (rustweaver).
14 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Sjedi, 5 {#}

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
Moj PC  
3 0 hvala 2
13 godina
offline
Programiranje u C-u - od svega pomalo

Trebao bi knjigu napisati, čovječe.

Odlično objašnjeno, ne mogu vjerovati da si to u 5 ujutro napisao.

Tek sad su mi neke stvari definitivno jasnije.

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Moj PC  
0 0 hvala 0
13 godina
offline
Programiranje u C-u - od svega pomalo

Kako podesiti konzolu da mi čita s tipkovnice (stdin) naše znakove?

 

chcp mi daje "Active code page: 852". Možda mi treba 1250 ili što? Za trajne promjene treba podešavati registry, to bih radije izbjegao ako je ikako moguće {#}

 

Pitam zbog ovih linija:

 

fgetws(query, 64, stdin);

fputws(query, stdout);

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put pet 8.3.2013 17:53 (pr0n_addict).
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

#include <locale.h>

 

setlocale(LC_ALL, "croatian" );
wprintf(L"šđč枊ĐČĆŽ ");

 

...bilo već pitano par stranica prije.

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
Poruka je uređivana zadnji put pet 8.3.2013 18:47 (TracerCPP).
Moj PC  
1 0 hvala 1
13 godina
offline
Re: Programiranje u C-u - od svega pomalo
TracerCPP kaže...

#include <locale.h>

 

setlocale(LC_ALL, "croatian" );
wprintf(L"šđč枊ĐČĆŽ ");

 

...bilo već pitano par stranica prije.

Istina, ali to je samo printanje konstante te mi to radi normalno.

Ja pokušavam s tipkovnice učitati wide string te mi to pravi probleme.

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

wchar_t niz[50];
setlocale(LC_ALL, "croatian" );
wscanf(L"%s", niz);
wprintf(L"Unijeli ste: %s", niz);

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo
Ja sam Plavi zmaj.Form the future!Masa,društvo većina,''normalni'' su ništa bez onih pojedinaca koji ih čine.
Moj PC  
1 0 hvala 0
13 godina
offline
Re: Programiranje u C-u - od svega pomalo
TracerCPP kaže...

wchar_t niz[50];
setlocale(LC_ALL, "croatian" );
wscanf(L"%s", niz);
wprintf(L"Unijeli ste: %s", niz);

Vjerojatno je stvar do Visual C-a, opet {#}

I ne može wscanf jer mi treba gutati i razmake.

Hvala svejedno na pokušaju.

lol lol
0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
15 godina
online
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...
TracerCPP kaže...

wchar_t niz[50];
setlocale(LC_ALL, "croatian" );
wscanf(L"%s", niz);
wprintf(L"Unijeli ste: %s", niz);

Vjerojatno je stvar do Visual C-a, opet {#}

I ne može wscanf jer mi treba gutati i razmake.

Hvala svejedno na pokušaju.

  Ne radi ni menu u visual studio, no kada izbacim ovu liniju:

setlocale(LC_ALL, "croatian" );

 

onda radi bez problema:

 

A umjesto wscanf koristi getws, odnosno _getws u vc++.

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

Nažalost, ne mogu ga izbaciti jer je ovo samo dio većeg zadatka gdje sve radim s našim znakovima - ako maknem setlocale, ruši mi se.

Ma snaći ću se ja već nekako {#}

 

EDIT: Izgleda da sam riješio problem sa dva zasebna poziva setlocale-a u kojima sam eksplicitno naveo code page koji želim:

 

setlocale(LC_ALL, ".1250"); // code page fajla kojeg otvaram

/*

.

.

.

*/

setlocale(LC_ALL, ".852"); // defaultni code page moje konzole

 

Valjda će biti sve u redu sada, za izluditi {#}

Zanemarite donji post.

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put sub 9.3.2013 2:34 (pr0n_addict).
Moj PC  
0 0 hvala 0
13 godina
offline
Programiranje u C-u - od svega pomalo

Pogledajte ovo, u wprintf-u samo tražio da mi ispiše dereferenciranu vrijednost wchar_t-a u hex-u.

Druge su vrijednosti prije i poslije poziva setlocale-a, zanimljivo.

 

#include <stdio.h>
#include <locale.h>

int main()
{
    wchar_t niz[32];
    printf("Unos: ");
    wscanf(L"%s", niz);
    wprintf(L"Hex (prije setlocale-a): %X %s\n", *niz, niz);
    setlocale(LC_ALL, "croatian");
    putchar('\n');
    printf("Unos: ");
    wscanf(L"%s", niz);
    wprintf(L"Hex (poslije setlocale-a): %X %s\n", *niz, niz);
    putchar('\n');
}

 

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put sub 9.3.2013 1:45 (pr0n_addict).
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...

Kako podesiti konzolu da mi čita s tipkovnice (stdin) naše znakove?


fgetws(query, 64, stdin);

fputws(query, stdout);

Vidiš, ja opet nemam taj problem. Utipkam naše znakove sa dijakriticima, i ispiše mi iste te znakove (koristeći ove dvije funkcije koje si naveo).

 

Ali kad ispisujem u konzolu sadržaj datoteke "popis-cp1250.txt", ne ispisuju mi se naši dijakritički znakovi. Tj. ta je datoteka u windows 1250 encodingu, a on se ne poklapa sa cp 852 koji mi je u konzoli. Da malo bolje objasnim. Npr. šesta linija te datoteke počinje tekstom "Blaguša...". Slovo 'š' u datoteci ima vrijednost 0x9A što odgovara znaku 'š' u windows 1250 tabeli, ali vrijednost 0x9A u cp852 pokazuje na znak 'Ü', tako da se meni u konzoli ispiše "BlaguÜa" umjesto "Blaguša".

 

Koliko ja uspjevam skužiti sa slike koju si priložio, tvoj unos je u cp852 formatu, a ispis u utf16 formatu. Jako zbunjujuće. Možeš i provjeriti:

 

cp852:

ž=0xA7

š=0xE7

đ=0xD0

ć=0x86

 

A pogledaj koji su UTF-16 znakovi dodjeljeni tim vrijednostima (gledaš one U+nešto brojeve u zagradi). Točno ono znakovi koji ti se ispišu u konzolu.

0xBADC0DE
Poruka je uređivana zadnji put sub 9.3.2013 4:09 (rustweaver).
13 godina
offline
Programiranje u C-u - od svega pomalo

Ne bih sad u to ulazio jer debelo izlazi van gabarita ovog zadatka. Toliko ima tih različitih encodinga, character setova i čega sve ne - jednostavno se pogubiti.

Iskreno, sretan sam da mi sad radi kako spada {#}

 

Netko se potrudio odgovoriti na moje pitanje na SO-u. Link

 

EDIT: Da me ne bi krivo shvatio - zahvalan sam na uloženom trudu u objašnjenje nego me iznerviralo sve to. Jednostavno su nam mogli dati fajl na engleskom, ANSI encoding i bok.

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put sub 9.3.2013 4:15 (pr0n_addict).
Moj PC  
1 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...
Netko se potrudio odgovoriti na moje pitanje na SO-u. Link

Gledam tvoju zadnju sliku na stackoveflowu i gledam svoju, i pitam se tko je ovdje lud :D

Iz nekog se razloga obojici "č" pretvori u 0x17A (što nije kod za slovo "č"). Tebi se onda ispiše znak koji doista i pripada kodu 0x017A, a meni se ispiše "č". {#}

 

Čisto radi informativnosti, ja koristim GCC na WinXP, a koliko sam skužio ti koristiš MSVC na Win7. Obojici nam konzola koristi cp852.

Možda se javi netko tko zna što je ovdje u pitanju...

 

Ma u biti glavno da si ti riješio zadatak. Nemoj ovime razbijati glavu, vjerojatno ne bih ni ja trebao ali znatiželja mi ne da mira...

0xBADC0DE
Poruka je uređivana zadnji put sub 9.3.2013 5:34 (rustweaver).
14 godina
offline
Programiranje u C-u - od svega pomalo

Pozdrav svima 

 

Imam problem sa svojim kodom u c jeziku.

 

Naime izračunava mi samo za case 1.

za case 2,3 mi daje vrijednost 0.

trebam imati switch case unutar do while petlje.

 

 

 

#include <iostream>

#include <stdio.h>

#define pi 3.14

#include <math.h>

 

float opseg,povrsina,dijagonala,s;

int i=1,polumjer,a,b,c;

int main()

 

{

 

   printf("Birajte:\n");

   printf("1 za krug\n");

   printf("2 za pravokutnik\n");

   printf("3 za trokut\n");

   printf("4 za izlaz\n");

   scanf("%d", &i);

   do

   switch (i)

 

   {

      case 1: {

         printf("unesi polumjer");

         scanf("%d", &polumjer);

 

         opseg=2*polumjer*pi;

 

         printf("opseg= %.2f\n",opseg);

         povrsina=polumjer*polumjer*pi;

         printf("povrsina=%.2f\n",povrsina);

 

         break;

 

 

   }

   case 2: {

     printf("unesi a");

     scanf("%d", &i);

     printf("unesi b");

     scanf("%d", &i);

     opseg=2*a+b;

     printf("opseg= %.2f\n",opseg);

     povrsina=a*b;

     printf("povrsina= %.2f\n",povrsina);

     dijagonala=sqrt(a*a*b*b);

     printf("dijagonala=%.2f\n",dijagonala);

     break;

     }

 

     case 3: {

        printf("unesi a");

        scanf("%d", &i);

        printf("unesi b");

        scanf("%d", &i);

        printf("unesi c");

        scanf("%d", &i);

        s=(a+b+c)/2;

        povrsina=sqrt(s*(s-a)*(s-b)*(s-c));

        printf("povrsina=%.2f\n",povrsina);

 

        break;

        }

 

        case 4: {

        printf("Hvala na koristenju\n");

        break;

        }

 

 

        default: printf("pogresan unos! 1-4\n");

        }

 

        while(i<0);

 

        system("pause");

        return 0;

        }

 

 

 

voltaža a.k.a. napon, amperaža a.k.a. struja, omaža a.k.a. otpor, vataža a.k.a. snaga, hercaža a.k.a. frekvencija, (mega, giga)bajtaža a.k.a. kapacitet memorije, kelvinaža a.k.a. temperatura
Moj PC  
1 0 hvala 1
15 godina
online
Re: Programiranje u C-u - od svega pomalo
RaZ0R9111 kaže...

Pozdrav svima

 

Imam problem sa svojim kodom u c jeziku.

 

Naime izračunava mi samo za case 1.

za case 2,3 mi daje vrijednost 0.

trebam imati switch case unutar do while petlje.

 

  Imas nekoliko greski. Prva greska je to sto nisi oko do-while bloka stavio viticaste zagrade. Sve sto je unutar do-while petlje mora biti unutar viticastih zagrada:

do{
// naredbe
}while(uvjet);

 

Druga greska koju pravis je sto oko onoga sto se nalazi pod odredenim case-om stavljas viticaste zagrade. Tu se ne stavljaju viticaste zagrade, vec ce samo stavi break; na kraju:

case 1:

  //naredbe

break;

 

I ne trebas svaki case uvlaciti u odnosu na prethodni. Puno je urednije ako svi case blokovi imaju istu indentaciju:

switch(x){
    case 1:
        //naredbe
        break;
    case 2:
        //naredbe
        break;
}

 

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

U slučajevima 2 i 3 ne unosiš varijable a, b, c.

Sitan previd.

 

Meni u VS C++ compileru traži i ovo da napravim:

dijagonala= sqrt((float)a*a*b*b);

 

Ne dozvoljava se neodređenost preopterećenog sqrt() metoda.

Poruka je uređivana zadnji put ned 10.3.2013 14:44 (Floki).
 
1 0 hvala 1
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
RaZ0R9111 kaže...

Pozdrav svima

 

Imam problem sa svojim kodom u c jeziku.

 

Naime izračunava mi samo za case 1.

za case 2,3 mi daje vrijednost 0.

trebam imati switch case unutar do while petlje.

 

 

 

  Sviđa mi se taj kod,imaš li šta protiv da ga ispravljenog koristim u svom kalkulatoru?

Ja sam Plavi zmaj.Form the future!Masa,društvo većina,''normalni'' su ništa bez onih pojedinaca koji ih čine.
14 godina
offline
Programiranje u C-u - od svega pomalo

Slobodno ga koristi i ako možeš pošalji mi u PP što češ ispraviti.

 

 

Promjenio sam sve kako ste mi rekli no svejedno dobivam za case 2 i 3 rezultate 0

 

Inaće uopče nevidim smisao do while petlje,no takav zadatak mi je zadan :S

voltaža a.k.a. napon, amperaža a.k.a. struja, omaža a.k.a. otpor, vataža a.k.a. snaga, hercaža a.k.a. frekvencija, (mega, giga)bajtaža a.k.a. kapacitet memorije, kelvinaža a.k.a. temperatura
Moj PC  
0 0 hvala 0
17 godina
offline
Re: Programiranje u C-u - od svega pomalo
RaZ0R9111 kaže...

Slobodno ga koristi i ako možeš pošalji mi u PP što češ ispraviti.

 

 

Promjenio sam sve kako ste mi rekli no svejedno dobivam za case 2 i 3 rezultate 0

 

Inaće uopče nevidim smisao do while petlje,no takav zadatak mi je zadan :S

jesi li ovo izmjenio, odnosno napravio ovako:

scanf("%d", &a);

 

Ovo ti je smisao do-while petlje u ovom primjeru:

 

do

{

 

   printf("Zelis li nastaviti<Y/N> ");

   char nastavak = scanf("%c", &nastavak);

}while(nastavak == 'Y' || nastavak == 'y');

 

Petlja se vrti, odnosno izvršavaš aplikaciju dok god unosiš Y ili y na gornji upit, a aplikacija se izvrši najmanje jednom dok ne dođe prvi put do testa kod while.

Poruka je uređivana zadnji put ned 10.3.2013 15:06 (Floki).
17 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
g12356 kaže...

Da, moze se to, ali to naravno, ne cini C OO jezikom. Recimo, RL primjer OO koda u C-u ti je GObject iz GTK+ toolkita.

Perhaps today IS a good day to die. PREPARE FOR RAMMING SPEED!
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
RaZ0R9111 kaže...

Slobodno ga koristi i ako možeš pošalji mi u PP što češ ispraviti.

 

 

Promjenio sam sve kako ste mi rekli no svejedno dobivam za case 2 i 3 rezultate 0

 

Inaće uopče nevidim smisao do while petlje,no takav zadatak mi je zadan :S

  Ma,za sada sam koristio samo case 1...

 

Evo nova verzija mog kalkulatora kojeg svako malo nadograđujem.Ako mi daš ime,spomenem te po imenu u creditsima.

Main:

#include<stdio.h>
#include<locale.h>
#include"termihead.h"
int main()
{
char op;
float a,b;
calc:printf("___________________\n");
printf("| TERMICALC v0.2757245775424 |\n");
printf("-------------------\n");
printf("\n");
printf("CHOOSE YOUR MATHEMATICAL OPERATION\n");
printf("\n");
printf("[*] MULTIPLY \n");
printf("[/] DIVIDE \n");
printf("[+] ADD \n");
printf("[-] SUBSTRACT \n");
printf("[M] MODULO \n");
printf("[A] AVERAGE out of 2 \n");
printf("[O] CIRCLE\n");
printf("EXIT [E]\n\n");
printf("CREDITS [C]\n\n");
printf("OPERATION: ");
scanf(" %c", &op);

switch(op)
{
case 'e':
{
return 0;
}
case 'E':
{
return 0;
}
case '*':
{
mul();//those are from "termihead.h"
break;
}
case '/':
{
div();
break;
}
case '+':
{
sum();
break;
}
case '-':
{
sub();
break;
}
case 'M':
{
mod();
break;
}
case 'm':
{
mod();
break;
}
case 'A':
{
avg();
break;
}
case 'a':
{
avg();
break;
}
case 'O':
{
cir();
break;
}
case 'o':
{
cir();
break;
}
case 'c':
{
setlocale(LC_ALL, "croatian" );
cred();
break;
}
case 'C':
{
setlocale(LC_ALL, "croatian" );
cred();
break;
}
default:
{
printf("Wrong input!");
break;
}
}
printf("\n\n");
goto calc;
return 0;
}

Termihead.h:

 

  #include<stdio.h>
#include<locale.h>
#define pi 3.14
#include <math.h>
void sum () //+
{
float f1,f2;
printf("Input 2 numbers(divided by a space): ");
scanf("%f %f", &f1, &f2);
float c = f1 + f2;
printf ("Result: %f\n", c);
}
void mul () //*
{
float f1,f2;
printf("Input 2 numbers(divided by a space): ");
scanf("%f %f", &f1, &f2);
float c = f1 * f2;
printf ("Result: %f\n", c);
}
int div()
{
float f1,f2;
printf("Input 2 numbers(divided by a space): ");
scanf("%f %f", &f1, &f2);
if(f2==0)
{
printf("Error\n");
return 1;
}
else
{
printf("Result:%f / %f = %f\n", f1, f2, f1/f2);
}
return 1;
}
void sub () //-
{
float f1,f2;
printf("Input 2 numbers(divided by a space): ");
scanf("%f %f", &f1, &f2);
float c = f1 - f2;
printf ("Result: %f\n", c);
}
void mod()
{
float f1,f2;
printf("Input 2 numbers(divided by a space): ");
scanf("%f %f", &f1, &f2);
printf("Result: %f MODULO %f = %d\n", f1, f2, ((int)f1)%((int)f2));
}
void avg()
{
float f1,f2;
printf("Input 2 numbers(divided by a space): ");
scanf("%f %f", &f1, &f2);
printf("Result: (%f + %f)/2 = %f\n", f1, f2, (f1+f2)/2);
}
void cir()/*Thank you RaZ0R9111*/
{
float scope,radius,surface,s;
int i=1,a,b,c;
printf("Input radius\n");
scanf("%f", &radius);
scope=2*radius*pi;
printf("Scope= %.2f\n",scope);
surface=radius*radius*pi;
printf("Surface=%.2f\n",surface);
}
void cred()
{
setlocale(LC_ALL, "croatian" );
printf("**\n\tAuthor:\n\tMario Kamenjak a.k.a.\"Bluedragon\"");
printf("**\n\tco developer:\n\tRaZ0R9111");
printf("**\n\tSpecial thanks to:\n\tKristijan Župan for teaching me how C functions work.");
printf("**\n\tSpecial thanks to:\n\tBarbara Komočar for teaching me how C headers work.");
printf("**\n\tSpecial thanks to:\n\tThe staff and the students of the polytechnic of Zagreb for well everything.");
printf("**\n\tSpecial thanks to:\n\tHrvoje Kovačićek,Ivan Knežević(a.k.a.\"kez\"),Andrija Janček,Nikola Klemeš\t,Petra Laškarin and Jurica Petreković.");
printf("**\n\tSpecial thanks to:\n\tAlbert Einstein for the theory of relativity.");
printf("**\n\tSpecial thanks to:\n\tLinus Torvlads for creating a great operating sistem.");
printf("**\n\tSpecial thanks to:\n\tRichard Stallman for the GNU GPL licence.");
printf("\n\nThis program is licensed under the GNU GPL v2 licence!");
}

Ja sam Plavi zmaj.Form the future!Masa,društvo većina,''normalni'' su ništa bez onih pojedinaca koji ih čine.
13 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

Da li stvarno pišeš takav kôd ili ti ga je editor shebao?

15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Copy paste mi ga sj*bao...inače uvijek volim indentaciju   i novi red...

Ovo ovdje kako piše,Dijkstra me nebi volio da sam tako zaista napisao.

 

Inače,Dijkstra je programerska legenda:

http://en.wikiquote.org/wiki/Dijkstra

Ja sam Plavi zmaj.Form the future!Masa,društvo većina,''normalni'' su ništa bez onih pojedinaca koji ih čine.
Poruka je uređivana zadnji put ned 10.3.2013 17:03 (g12356).
Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

Meni editor uvijek pljune kôd kakav je i u IDE-u. Probaj zalijepiti na Pastebin.

Dobro, to je neki početnički program, malo bespotrebno zakompliciran, ali makni to GOTO. Nije da sam pristalica onih što su negdje pročitali da GOTO ne valja, ali ako se već furaš na Dijkstru, uredan kôd (ko se na to ne fura?), sredi i to.

 

Pa nisi ti tako nov programer, nije da si još uvijek na ovakvim stvarima? U redu je C, ali daj proširi vidike. :)


E da, i makni te zahvale, molim te. :)

 

15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
royalhero kaže...

Meni editor uvijek pljune kôd kakav je i u IDE-u. Probaj zalijepiti na Pastebin.

Dobro, to je neki početnički program, malo bespotrebno zakompliciran, ali makni to GOTO. Nije da sam pristalica onih što su negdje pročitali da GOTO ne valja, ali ako se već furaš na Dijkstru, uredan kôd (ko se na to ne fura?), sredi i to.

 

Pa nisi ti tako nov programer, nije da si još uvijek na ovakvim stvarima? U redu je C, ali daj proširi vidike. :)


E da, i makni te zahvale, molim te. :)

  Sa programiranjem se bavim godinu i pol.Ali bavim se time onako "polagano".Na faksu su me pokušali C++-u naučit ali to je imalo samo djelomičan uspjeh,jer mi je C ostao u srcu.Jednostavno mi C++ još nije sasvim sjeo.Možda bi objektno programiranje i bolje naučio da su koristili jezik sa prelijepom sintaksom poput python-a.Ali znam da su imali sasvim opravdane razloge da me uče C++.

 

Ovaj semestar krećem sa Javom pa će se valjda nešto dogoditi.A u slobodno vrijeme je zasada meni C favourite.Slijedeće šta se tiče C-a šta želim je da se naučim sve keywordove iz C11,pa makar po najjednostavnijem načinu nekom.

 

Razlog zašto sam tako komplicirao taj kalkulator je to da sam ga htio napraviti "po svim pravilima struke".

 

Ako se pitaš zašto idem polagano?

Razlog je taj da na faksu volim podjednako vremena davati svakom predmetu...

 

Budem onda maknuo taj goto...

edit:evo,maknuo ga u roku sekunde...ja sam budala koja nekad nema samopouzdanja...

Ja sam Plavi zmaj.Form the future!Masa,društvo većina,''normalni'' su ništa bez onih pojedinaca koji ih čine.
Poruka je uređivana zadnji put ned 10.3.2013 17:30 (g12356).
15 godina
online
Programiranje u C-u - od svega pomalo

@g12356

 

Kad pises kod u vanjskim datotekama onda obavezno u header fileove stavi guardove:

http://en.wikipedia.org/wiki/Include_guard

 
2 0 hvala 1
13 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

Ili pragma once, koliko se sjećam radila je istu stvar?

EDIT: Evo provjerio sam na Wikipediji:
Thus, #pragma once serves the same purpose as #include guards, but with several advantages, including: less code, avoiding name clashes, and sometimes improved compile speed.

Poruka je uređivana zadnji put ned 10.3.2013 18:08 (royalhero).
15 godina
online
Re: Programiranje u C-u - od svega pomalo
royalhero kaže...

Ili pragma once, koliko se sjećam radila je istu stvar?

Moze i nju koristiti. No ako strogo gledamo ona se ne nalazi u standardu, ali svi poznatiji kompajleri je podrzavaju.

Nova poruka
E-mail:
Lozinka:
 
vrh stranice