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
offline
Programiranje u C-u - od svega pomalo

#include<stdio.h>

int main (void) {
 unsigned int a,n=1;
 double q=0;

 

do {
 scanf("%u",&a);
} while (a<1 || a>1000);


while (n<a) {
 q+=((double)1/((2*n+1)*(2*n-1)));
 printf("\n%lf",q);
 ++n;
}

 

printf("%lf",q);
return 0;
}

 

Zašto je riješenje nula?

Ako stavim float sve radi

You have to be odd to be number one
Moj PC  
2 0 hvala 0
17 godina
offline
Re: Programiranje u C-u - od svega pomalo
Top Bugovac kaže...

#include<stdio.h>

int main (void) {
 unsigned int a,n=1;
 double q=0;

 

do {
 scanf("%u",&a);
} while (a<1 || a>1000);


while (n<a) {
 q+=((double)1/((2*n+1)*(2*n-1)));
 printf("\n%lf",q);
 ++n;
}

 

printf("%lf",q);
return 0;
}

 

Zašto je riješenje nula?

Ako stavim float sve radi

 

U VS 2015 to radi čisto OK.

Čemu onaj ispis dolje, ako uneseš a = 1 ne ulaziš u petlju jer je uvjet n < a, a za n = 1 ispišeš q = 0, što nije točno. Za a > 1 ponavljaš ispis za zadnji n.

Valjda ovako izačunaš vrijednosti za uneseni a gdje n ide [1, a]

 

 

#include<stdio.h>

int main() {
   unsigned int a, n = 1;
   double q = 0;



   do {
      scanf_s("%u", &a);
   } while (a<1 || a>1000);


   while (n<=a) {
      q += (1. / ((2 * n + 1)*(2 * n - 1)));
      printf("%lf\n", q);
      ++n;
   }


   return 0;
}

Poruka je uređivana zadnji put uto 29.12.2015 22:28 (Floki).
15 godina
offline
Re: Programiranje u C-u - od svega pomalo
Meni u mingwu ne radi :/
Baca minus nulu čak za svaki krug petlje
You have to be odd to be number one
Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
Top Bugovac kaže...

#include<stdio.h>

int main (void) {
 unsigned int a,n=1;
 double q=0;

 

do {
 scanf("%u",&a);
} while (a<1 || a>1000);


while (n<a) {
 q+=((double)1/((2*n+1)*(2*n-1)));
 printf("\n%lf",q);
 ++n;
}

 

printf("%lf",q);
return 0;
}

 

Zašto je riješenje nula?

Ako stavim float sve radi

 

2 puta će na kraju ispisat isti broj u slučaju da je unesen a u tom intervalu(izbacit ovaj zadnji printf ?).

 

Kako ide zadatak?

 

visual studio express 2008 radi sve

 

 

 

 

Poruka je uređivana zadnji put sri 30.12.2015 2:28 (Ajmodaj).
15 godina
offline
Re: Programiranje u C-u - od svega pomalo
Nije to bitno
Algoritam valja no samo kada umjesto double svagdje stavim float
Zašto s double ne radi? :/
Očito je do compilera
You have to be odd to be number one
Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Format specifier "%Lf" ? probaj s ovim

Moj PC  
0 0 hvala 0
15 godina
offline
Re: Programiranje u C-u - od svega pomalo
Ajmodaj kaže...

Format specifier "%Lf" ? probaj s ovim

 Ništa...

 

Može li mi netko objasniti zašto u C-u ne postoji call by reference ako možemo predati pointer?

U čemu je razlika?

You have to be odd to be number one
15 godina
online
Re: Programiranje u C-u - od svega pomalo
Top Bugovac kaže...
Može li mi netko objasniti zašto u C-u ne postoji call by reference ako možemo predati pointer?

U čemu je razlika?

 Pa i pointer je varijabla samo sto ima drugaciji tip podataka. Kada prenosis pointer, onda prenosis njegovu vrijednost koja je adresa onoga na sto on pokazuje. Iz funkcije taj pointer ne mozes promijeniti, no mozes otici na adresu koja je njegova vrijednost i tu nesto promijeno. Tako da strogo gledano to nije call by reference vec call by value.

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

A šta bi onda TOČNO bio call by reference?

You have to be odd to be number one
Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
Top Bugovac kaže...

A šta bi onda TOČNO bio call by reference?

Call by value:

void call_by_value(int x)
{
    printf(x);
}

int main()
{
    int a = 10;
    call_by_value(a);

    return 0;
}

 

Call by reference:

void call_by_ref(int *y)
{
    printf(*y);
}

int main()
{
    int b = 10;
    call_by_ref(&b);

    return 0;
}

 

To dvoje je sve sto trebas znati.

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

A šta bi onda TOČNO bio call by reference?

Call by value:

void call_by_value(int x)
{
    printf(x);
}

int main()
{
    int a = 10;
    call_by_value(a);

    return 0;
}

 

Call by reference:

void call_by_ref(int *y)
{
    printf(*y);
}

int main()
{
    int b = 10;
    call_by_ref(&b);

    return 0;
}

 

To dvoje je sve sto trebas znati.

 Ali u skirptama piše da C ne podržava Call by reference 

Zašto?

You have to be odd to be number one
15 godina
online
Re: Programiranje u C-u - od svega pomalo
Top Bugovac kaže...

 Ali u skirptama piše da C ne podržava Call by reference 

Zašto?

 Obrati pažnju na ovo strogo gledano. Dakle ono što je domagoj pokazao se obično smatra call by reference, no strogo gledano (ako ćemo baš cjepidlačiti) nije zato što se prenosi vrijednost pokazivača pa je to call by value pokazivača.

17 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

Pise "strogo promatrano"!

Ako cemo cjepidlaciti pokazivac je takoder vrijednost (kao sto je kolega captain iznad napisao) i tu se takoder primjenjuje call-by-value mehanizam (interno kod kompajliranja), a ne posebnicall-by-reference mehanizam. Stvar je samo u tome sto pokazivac pokazuje na adresu stvarnog objekta pa se time "imitira" call-by-reference. I sasvim je u redu to zvati call-by-reference iako to strogo gledajuci nije cisti call-by-reference.

 

No, ti detalji su totalno nebitni za cijelu pricu i koncept oko toga.

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

Može li mi netko objasniti zašto u C-u ne postoji call by reference ako možemo predati pointer?

 

Poziv funkcije gdje se kao argument predaje adresa neke varijable umjesto njene vrijednosti je call by reference. Ta adresa se može predati direktno ili tu adresu može sadržavati pokazivač koji se onda preda funkciji.

 

void f(int *p) {
    *p = 10;
}

int x = 0;
f(&x);  // call by reference
printf("%d", x); // 10

 

Ovdje je stvar jednostavna jer se direktno vidi da se predaje adresa varijable x. No ovdje može biti zbunjujuće:

 

void f(int *p) {
   *p = 10;
}

int x = 0;
int *p = &x;
f(p);  // call by value - p, call by reference - &x
printf("%d", x); // 10

 

Varijabla (pokazivač) 'p' se predaje preko call by value jer se njegova vrijednost kopira u pokazivač 'p' u funkciji f. Znamo da je to call by value i zato jer vrijednost predanog pokazivača (adresa na koju pokazuje) se ne može mijenjati u funkciji f. No, gledano s aspekta varijable 'x' riječ je o call by reference jer se vrijednost varijable 'x' može mijenjati unutar funkcije f. Dakle, jednim pozivom imamo oboje, a u ovisnosti o varijabli koju promatramo imamo call by value ili call by reference.

 

Top Bugovac kaže...

 Ali u skirptama piše da C ne podržava Call by reference 

Zašto?

To nije točno. Pitaj profesora da točno objasni na što misli jer možda je riječ o nesporazumu...

 

Poruka je uređivana zadnji put ned 3.1.2016 15:42 (TracerCPP).
17 godina
offline
Programiranje u C-u - od svega pomalo

Ako u C-u ne postoji poziv predajom adresa, onda u donjem primjeru varijabla a u funkciji main neće promjeniti vrijednost. E pa, uvjeri se sam da li je varijabla a iz funkcije main posije izvršene funkcije increment promijenila vrijednost ili nije.

Strogo gledano, ili manje strogo gledano ili bilo kako gledano ja jesam promijenio vrijednost varijable a iz funkcije main pozivom funkcije increment. A to znači da je tip u skripti napisao glupost, manje diplomatski rečeno, ili "možda je došlo do nesporazuma", kako ti bolje odgovara.

 

U C-u ne postoje reference kao posebni tipovi podataka, a call by reference postoji, da ne postoji call by reference u C-u, to bi bio beskoristan i spor programski jezik i kao takav bio bi odavno napušten, kopiranje struktura kao argumenata funkcija bi trošilo previše resursa i bilo bi sporo.

 

 

#include<stdio.h>

void increment(int* b)
{
   (*b)++;
}

int main()
{
   int a = 5;
   printf("a = %d\n", a);
   increment(&a);
   printf("a = %d\n", a);
   return 0;
}

Poruka je uređivana zadnji put pon 4.1.2016 13:18 (Floki).
 
0 0 hvala 0
17 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

Ne znam kome si odgovarao, no ovo je zgodno za procitati.

Perhaps today IS a good day to die. PREPARE FOR RAMMING SPEED!
17 godina
offline
Programiranje u C-u - od svega pomalo

Ovo se može, promjeniti vrijednosti objekta strukture koju šaljemo kao argument funkciji.

 

#include<stdio.h>

struct Test
{
   int broj;
};
void increment(Test* x)
{
   x->broj++;
}

int main()
{
   Test a;
   a.broj = 5;
   printf("a = %d\n", a.broj);
   increment(&a);
   printf("a = %d\n", a.broj);
   return 0;
}

Poruka je uređivana zadnji put pon 4.1.2016 15:55 (Floki).
 
0 0 hvala 0
17 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

Procitaj komentare.

"Why do you say C cannot pass by reference? Both C and C++ can. For C: void foo(Type * val) and the caller is foo(&y). The value of y will be modified by this call. For C++: void foo(Type & val) and the caller is simply foo(y)"

"Nope, in the case of foo(&y) the value of the argument is passed. What's the argument? &y. That expression takes the address of y, and then the result is passed by value. C++ does have pass-by-reference, but C really doesn't."

 

Ili ovaj link.

"C parameters are always passed by value rather than by reference. However, if you think of the address of an object as being a reference to that object then you can pass that reference by value."

 

Drugi odgovor na tom linku:

"The concept of "reference semantics" is an abstract, theoretical one, meaning that you have a way for a function to modify existing data in place by giving that function a reference to the data.

 

The question is whether reference semantics can be implemented by a language. In C, you can obtain reference semantics by using pointers. That means you can obtain the desired behaviour, but you need to assemble it yourself from various bits and pieces (pointer types, address-of operators, dereference operators, passing pointers as function arguments ("by value")).

 

By contrast, C++ contains a native reference type and thus implements reference semantics directly in the language." - sto se tice ovog zadnjeg za C++, reference su najcesce pod haubom implementirane kao obicni pokazivaci.

 

Ovaj odgovor:

"No, it doesn't. It has pointers, but they're not quite the same thing.

In particular, all arguments in C are passed by value, rather than pass-by-reference being available as in C++. Of course, you can sort of simulate pass-by-reference via pointers:"

 

Ovo. Ili ovo.

 

Mozda ovo?

"In C, Pass-by-reference is simulated by passing the address of a variable (a pointer) and dereferencing that address within the function to read or write the actual variable. This will be referred to as 'C style pass-by-reference.' "

 

Stvarno ne znam vise sto da ti stavim. :D

Ti predajes vrijednost pokazivaca sto je pass-by-value, ali na taj nacin s obzirom da pokazivac pokazuje na neki objekt simuliraspass-by-reference. To je pitanje bilo.

Perhaps today IS a good day to die. PREPARE FOR RAMMING SPEED!
Poruka je uređivana zadnji put pon 4.1.2016 16:10 (1domagoj1).
17 godina
offline
Programiranje u C-u - od svega pomalo

Taj naziv pass by reference je ustanovljen davno prije pojave i C++ i referenci u C++, a odnosio se na razliku od pass by value, gdje kopiramo samu varijablu koju prenosimo, i kopija je potpuno neovisna od varijable koju prenosimo. U ovom slučaju kopiramo pokazivač na varijablu, a to nije pass by value u odnosu na varijablu koju prenosimo, nego u odnosu na pokazivač, a pokazivač nije sam sebi svrha, što će nam on, jedina mu je svrha da dođemo do varijable i nikakva drukčija.

Možda bi danas tvorci C-a taj način nazvali pass by pointer, u to ne ulazim, međutim da su na ovo mislili kad su nazvali taj način prijenosa pass by reference, jesu.

Poruka je uređivana zadnji put pon 4.1.2016 16:30 (Floki).
 
1 0 hvala 1
14 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

U terminologiji je zastupljeno da je predaja varijable funkciji preko adrese zapravo call by reference jer se u tom slučaju vrijednost predane varijable može mijenjati unutar pozivajuće funkcije. Sad se tu može otegnuti rasprava o tome što je referenca, a pošto to ne postoji u C-u onda tvrditi da call by reference ne postoji u C-u. Ali opet, čim se vrijednost predane varijable može mijenjati unutar pozivajuće funkcije time se dobije isti efekt kao da je riječ o C++ referenci (samo uz dodatno dereferenciranje pokazivača).

 

Dakle, istina je da se u C-u predaju vrijednosti no zbog efekta pokazivača tj. mogućnosti mijenjanja varijable čija je adresa predana to se naziva call by reference.

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

U terminologiji je zastupljeno da je predaja varijable funkciji preko adrese zapravo call by reference jer se u tom slučaju vrijednost predane varijable može mijenjati unutar pozivajuće funkcije. Sad se tu može otegnuti rasprava o tome što je referenca, a pošto to ne postoji u C-u onda tvrditi da call by reference ne postoji u C-u. Ali opet, čim se vrijednost predane varijable može mijenjati unutar pozivajuće funkcije time se dobije isti efekt kao da je riječ o C++ referenci (samo uz dodatno dereferenciranje pokazivača).

 

Dakle, istina je da se u C-u predaju vrijednosti no zbog efekta pokazivača tj. mogućnosti mijenjanja varijable čija je adresa predana to se naziva call by reference.

Upravo to sam odmah i rekao u drugom ili trecem postu. Drago mi je da smo se shvatili. :D

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

U terminologiji je zastupljeno da je predaja varijable funkciji preko adrese zapravo call by reference jer se u tom slučaju vrijednost predane varijable može mijenjati unutar pozivajuće funkcije. Sad se tu može otegnuti rasprava o tome što je referenca, a pošto to ne postoji u C-u onda tvrditi da call by reference ne postoji u C-u. Ali opet, čim se vrijednost predane varijable može mijenjati unutar pozivajuće funkcije time se dobije isti efekt kao da je riječ o C++ referenci (samo uz dodatno dereferenciranje pokazivača).

 

Dakle, istina je da se u C-u predaju vrijednosti no zbog efekta pokazivača tj. mogućnosti mijenjanja varijable čija je adresa predana to se naziva call by reference.

Upravo to sam odmah i rekao u drugom ili trecem postu. Drago mi je da smo se shvatili. :D

 Uopće nije sporno što ste napisali i ti i kapetan u prvim postovima. Ja sam samo napisao što je call by reference kao termin značio i znači u C-u, a termin jest stariji od svih novih programskih jezika.

 

Ali nevezano za to, tip na onom linku piše:

Pass-by-reference semantics mean that when you change the value of the parameter in the method, the caller will see that change in the argument.

 

Što želi reći u biti, da u C++ ne postoji pass by reference. Poznato je da se vrijednost reference u C++ ne može promijeniti, čak ni staviti na null. Vidim da je dobio puno pluseva, ali ovo mi nije baš logična definicija, ne uklapa mi se u C++.

Ili sam nešto previdio, ali onaj primjer koji je stavio da dokaže kako u C ne postoji pass by reference, u C++ sa referencom ne bi mogao ni napisati, pa mu data definicija za C++ ne vrijedi.

 

To je moguće napraviti tek u C#, što je on i naveo, ali mi je ostao nedorečen, što onda sa C++, ili ne valja njegova definicija, ili C++ nema pass by reference brz obzira što ima reference kao tip podataka ili sam ja nešto previdio.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace reference
{
    class Test
    {
        public int Broj
        {
            get;
            set;
        }
        public static void StaviNaNull(ref Test b)
        {
            b = null;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Test a = new Test { Broj=5 };
            if (a != null)
            {
                Console.WriteLine(a.Broj);
            }
            else
            {
                Console.WriteLine("Null");
            }
            Test.StaviNaNull(ref a);
            if (a != null)
            {
                Console.WriteLine(a.Broj);
            }
            else
            {
                Console.WriteLine("Null");
            }
        }
    }
}

Poruka je uređivana zadnji put pon 4.1.2016 21:50 (Floki).
16 godina
offline
Programiranje u C-u - od svega pomalo

kako čitati file sa brojevima dok ne dođe do kraja file-a (eof?) ne očitava mi prvi broj,pretpostavljam zbog ovog prvog fscanf i kako da implementiram bubble sort ako ne znam konacni broj clanova u listi

FILE *file;
file = fopen("C:\brojevi.txt","r");
int i = 0;
while(fscanf(file, "%d", brojevi) != EOF){
fscanf(file, "%d", &brojevi[i]);
printf("Broj: %d\n",brojevi);
i++;
}

 

Poruka je uređivana zadnji put čet 7.1.2016 17:17 (loky4i4).
Moj PC  
0 0 hvala 0
17 godina
offline
Programiranje u C-u - od svega pomalo

Nije ti dobra putanja do datoteke, funkciju fscanf ne treba na dva mjesta stavljati, varijabla i ti služi kao brojač koliko si brojeva iz text datoteke unio u niz, pa je možeš iskoristiti kod ispisa niza, sortiranja niza ili čega već.

 

 

int main()
{
   int brojevi[100];
   FILE *file;
   file = fopen("C:\\brojevi.txt", "r");
   int i = 0, j;
   while (fscanf(file, "%d", &brojevi[i]) != EOF) {
      i++;
   }
   for ( j = 0; j < i; j++)
   {
      printf("%d ", brojevi[j]);
   }
   fclose(file);
   return 0;
}

Poruka je uređivana zadnji put čet 7.1.2016 19:47 (Floki).
 
0 0 hvala 1
16 godina
offline
Programiranje u C-u - od svega pomalo

jel mogu pokazivac na adresu spremiti u varijablu i promijeniti pokazivac na neku drugu adresu s tom varijablom ? 

Poruka je uređivana zadnji put čet 7.1.2016 19:29 (loky4i4).
Moj PC  
0 0 hvala 0
17 godina
offline
Re: Programiranje u C-u - od svega pomalo
loky4i4 kaže...

jel mogu pokazivac na adresu spremiti u varijablu i promijeniti pokazivac na neku drugu adresu s tom varijablom ? 

 Aha, sa fclose zatvori datoteku za čitamje, kako si je sa fopen otvorio. Poslije otvori što hoćeš.

Dakle, pokazivač tipa FILE si prikačio sa fopen da pokazuje na datoteku ili otvorio datoteku, sa fscanf si čitao podatke iz datoteke, sa fclose si otkačio pokazivač od datoteke ili zatvorio datoteku. Taj pokazivač možeš ponovno koristiti istom tehnikom, otvori, čitaj, zatvori.

 

btw. stavi ovdje kod, ne na pp, koliko vidim ta struktura ti ne treba kad radiš sa nizom, niz u strukturi na ovaj način nema logike, a ne radiš vezanu listu, niti se radi vezana lista  na taj način. Stavi brojeve iz datoteke u niz, pa sortiraj niz i to je to. Dakle, ako ti u zadatku ne traže vezanu listu nego niz, napravi po onom mom kodu, prije ispisa sortiraj niz. Ako ti traže vezanu listu, to je onda čisto nešto drugo, onda ti ne treba niz, nego pogledaj malo kako se radi vezana lista.

Poruka je uređivana zadnji put čet 7.1.2016 22:11 (Floki).
13 godina
offline
Programiranje u C-u - od svega pomalo

Imam jedan problem. Naime rjesavam zadatak pa koristim switch case. Problem je u tome što mi se "default" dio koda uvijek izvršava, totalno zanemaruje ostale case-ove. Kad ga zakomentiram, onda 90% koda radi normalno. Ovaj ostatak je u defaultu, te ne razumijem zašto se on uvijek izvodi.

 

Jedan od case-ova

 

case 'a':
case 'A':
{
nesto = zadnji_stupac;
for(x = 0; x < 5; x++)
{
b = 0;
for( y = nesto; y < (nesto + 5); y++)
{

output[x][y] = znakovi[0].znak[x][b];
//printf("\tx:%d, y:%d\n", x, y);
b++;
}
}
}
zadnji_stupac += 5;
break;

 

 

 

Default:

 

default:
{
nesto = zadnji_stupac;
for(x = 0; x < 5; x++)
{
b = 0;
for( y = nesto; y < (nesto + 5); y++)
{

output[x][y] = znakovi[26].znak[x][b];
//printf("\tx:%d, y:%d\n", x, y);
b++;
}
}
}
zadnji_stupac += 5;

 

 

Kod u svim case-ovima je isti, samo se slova mijenjaju. 

 

Sve se dobro izvodi dok je default zakomentiran. Kad maknem komentare onda se nekakve gluposti upisuju u tu output matricu i dobivam totalno glupost na ispisu.

 

Dali netko zna u čemu je problem?

 

Problem riješen, jedan detalj u drugoj petlji je sve poremetio

Poruka je uređivana zadnji put pon 11.1.2016 2:05 (Grozni_Zabac).
Moj PC  
0 0 hvala 0
15 godina
offline
Programiranje u C-u - od svega pomalo

Sad vidim da sam sjeb. i definiciju i deklaraciju

Ili ipak nisam

 

Nije mi 100% jasno što se događa kod kompajliranja kada imam svoje funkcije smještene u više datoteka uz prototipove

Poništite mitove koje sam si stvorio u glavi

 

Dakle imam npr neki header file bug.h, a u njemu su deklarirane funkcije (određeno im je ime, formalni argumenti i tip koji vraćaju)

Imam i .c file u kojem su mi smještene definicije funkcije, odnosno definirana je funkcija funkcije (ne znam kako bih to nazvao)

I imam .c file u kojem mi je glavni program

 

1. Prije nego što smo na faksu obradili to gradivo bilo mi je intuitivnije da ćemo funkcije smještene u više datoteka definirati i deklarirati u nekom .h fileu i onda ih samo kao library uključiti u glavnom programu

Očito sam onda krivo shvatio .h file 

Zašto funkcije moram deklarirati u drugom fileu?

Što se nalazi u .h fileu i gdje su te funkcije definirane?

(mislim na funckije iz stdio.h i sl.)

 

2. Što se događa ako imam više deklariranih funkcija pod jednim imenom u više različitih .c datoteka i onda pozovem funckiju iz glavnog programa?

 

3. Koje su prednosti definiranja i deklrariranja funkcija u drugim datotekama?
 (Osim što ih jednom možemo def/dekl i onda ih kasnije možemo koristiti i u drugim programima koje pišemo i što je sam program "lakši" jer ne ponavljamo više puta jednu funkciju)

You have to be odd to be number one
Poruka je uređivana zadnji put sub 16.1.2016 13:49 (Top Bugovac).
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

U .h datekama se nalaze deklaracije funkcija. Dakle, samo prototipi. Smisao .h datoteke jest da prikaže podržane funkcionalnosti (npr. popis funkcija koje se mogu koristiti) ali ne i kako su te funkcionalnosti implementirane (napisane).

 

Primjerice recimo da sam ja napravio funkciju suma.

 

mojefunkcije.h

double suma(double a, double b);

 

mojefunkcije.c

double suma(double a, double b){
    return a + b;
}

 

Dovoljno je napraviti #include mojefunkcije.h i funkcija suma se može koristiti u bilo kojem programu.

 

Ovdje je sve poprilično jednostavno, no treba primjetiti da se implementacija funkcije suma nalazi u .c datoteci. Dakle, svatko vidi kako izgleda tijelo te funkcije. No da sam ja odlučio prodati taj source code onda ja ne bih htio tu funkcionalnost dati u .c datoteci jer bi ju onda svatko mogao lako kopirati, prepraviti i eventualno prodati pod svoje. Zato je primjerice moguće da umjesto u mojefunkcije.c datoteku tu implementaciju spremimo u mojefunkcije.dll. Dakle, kupcu damo mojefunkcije.h tako da zna koje funkcionalnosti (funkcije) postoje, dok tijela funkcija nisu u .c datoteci već su u .dll datoteci u kojoj se nalazi već compilirani code i iz koje se ne može vidjeti kako izgleda tijelo funkciju suma ali ju je i dalje moguće pozvati i koristiti. Dakle, .h datoteka se koristi kao nekakav invertar funkcionalnosti tako da bi se implementacija mogla spremiti na jedan od više načina (čisti tekst - .c datoteka, statička biblioteka - .lib ili dinamička .dll datoteka).

 

Ako imaš više funkcija s istim imenom onda će se compiler buniti jer neće znati koju da koristi. To je u C++u razriješeno korištenjem imenika (namespace).

Poruka je uređivana zadnji put sub 16.1.2016 20:34 (TracerCPP).
14 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Pozdrav, moze mi netko pomoci sa zadatkom, vrlo je jednostavan al sam novi u ovome. Zadatak glasi:
Napisati program koji u unosu prima pocetni i krajnji broj niza. Brojevi moraju biti cijeli, pozitivni i troznamenkasti.

Program treba ispisati sve brojeve i sumu njihovih znamenaka u rasponu od pocetnog pa do krajnjeg u rastucem nizu.

 

Jesam uopce dobro poceo? I gdje grijesim? 

#include "stdio.h"
int main()
{
int i,prvi,zadnji,pom,prva,druga,treca,pom2;
printf("Unos brojeva:\n");
scanf("%d", &prvi);
scanf("%d", &zadnji);
pom = prvi;
printf("Ispis brojeva:\n");
for(i=100;i<=999;i++)
{
pom2 = pom;
prva = pom2/100;
pom2 = pom2%100;
druga = pom2/10;
pom2 = pom2%10;
treca = pom2;
printf("%d = %d\n",pom,(prva+druga+treca));
pom++;

}
}

 
0 0 hvala 0
Nova poruka
E-mail:
Lozinka:
 
vrh stranice