Što znači int main u c. Razlika između int main() i int main(void)? Formalni i stvarni parametri

Glavna funkcija.

Svaki C i C++ program mora imati glavnu funkciju; a na vama je gdje ćete ga postaviti. Neki programeri ga stavljaju na početak datoteke, neki na kraj. Međutim, bez obzira na njegovu poziciju, morate zapamtiti sljedeće: Argumenti za "main" funkciju. Pokretna procedura Borland C++ šalje tri parametra (argumenta) glavnoj funkciji: argc, argv i env. - argc, cijeli broj, je broj argumenata naredbenog retka koji se šalju glavnoj funkciji, - argv je niz pokazivača na nizove (char *). Pod DOS-om 3.x i novijim, argv je definiran kao puna staza programa koji se pokreće. Kada se izvodi pod ranijim verzijama DOS-a, argv pokazuje na nulti niz (""). argv pokazuje na prvu liniju naredbenog retka nakon naziva programa. argv pokazuje na drugu liniju naredbenog retka nakon naziva programa. argv pokazuje na posljednji argument poslan na main. argv sadrži NULL. - env ​​​​je također niz pokazivača na nizove. Svaki env element sadrži niz u obliku ENVVAR=vrijednost. ENVVAR je naziv varijable okruženja, kao što je PATH ili 87.<значение>ovo je vrijednost dane varijable okruženja, na primjer C:\DOS;C:\TOOLS (za PATH) ili YES (za 87). Imajte na umu, međutim, da ako navedete neke od ovih argumenata, morate ih navesti ovim redoslijedom: argc, argv, env. Na primjer, sljedeće deklaracije argumenata su važeće: main() main(int argc) /* valjano, ali ne baš dobro */ main(int argc, char *argv) main(int argc, char *argv, char *env) Main (int) deklaracija argc) nije baš zgodna jer znajući broj parametara, nemate im sami pristup. Argument env uvijek je dostupan putem globalne varijable environ. Pogledajte varijablu okruženja (u 3. poglavlju) i funkcije putenv i getenv (u 2. poglavlju). Parametri argc i argv također su dostupni kroz varijable _argc i _argv. Primjer programa koji koristi argc, argv i env. Ovo je primjer programa, ARGS.EXE, koji pokazuje najjednostavniji način korištenja argumenata proslijeđenih glavnoj funkciji. /* ARGS.C program */ #include #uključi void main(int argc, char *argv, char *env) ( int i; printf("Vrijednost argc je %d \n\n",argc); printf("Komandna linija sadrži %d parametara \n\ n" ,argc); za (i=0; i<=argc; i++) printf(" argv[%d]: %s\n",i,argv[i]); printf("Среда содержит следующие строки:\n"); for (i=0; env[i] != NULL; i++) printf(" env[%d]: %s\n",i,env[i]); return 0; } Предположим, что вы запускаете программу ARGS.EXE со следующей командной строкой: C:> args prvi_arg "arg s prazninama" 3 4 "pretposljednji" stop! Imajte na umu da argument s prazninama možete poslati tako da ga stavite u dvostruke navodnike, kao što je prikazano u primjeru "argument s prazninama" i "pretposljednji" u pozivu programa. Kao rezultat pokretanja programa dobit ćete nešto poput ovoga: Vrijednost argc je 7 Naredbeni redak sadrži 7 parametara argv: c:\turboc\testargs.exe argv: first_arg argv: arg s praznim argv: 3 argv: 4 argv: pretposljednji argv: stani! Okruženje sadrži sljedeće retke: env: COMSPEC=C:\COMMAND.COM env: PROMPT=$p $g env: PATH=C:\SPRINT;C:\DOS;C:\BC Maksimalna ukupna duljina naredbe linija poslana glavnoj funkciji (uključujući razmake i naziv samog programa), ne smije premašiti 128 znakova; Ovo su DOS ograničenja. Izlazni znakovi naredbenog retka Argumenti naredbenog retka mogu sadržavati izlazne znakove. Međutim, mogu se proširiti za sve nazive datoteka koji odgovaraju argumentu na isti način kao što se to radi, na primjer, s DOS naredbom kopiranja. Za korištenje izlaznih simbola, kada povezujete svoj program s povezivačem, morate uključiti objektnu datoteku WILDARGS.OBJ koja dolazi s Borland C++. Ako je datoteka WILDARGS.OBJ priložena vašem programu, možete koristiti argumente poput "*.*" u naredbenom retku. U ovom slučaju, nazivi svih datoteka koje odgovaraju ovoj maski unose se u polje argv. Maksimalna veličina argv polja ovisi samo o veličini područja dinamičke memorije. Ako nisu pronađene odgovarajuće datoteke za danu masku, tada se argument prosljeđuje u obliku u kojem je upisan u naredbenom retku. (To jest, glavnoj funkciji se prosljeđuje niz koji sadrži izlazne znakove). Argumenti u dvostrukim navodnicima ("...") nisu prošireni. Primjer. Sljedeće naredbe kompajliraju datoteku ARGS.C i povezuju je s modulom WILDARGS.OBJ, a zatim pokreću rezultirajući program ARGS.EXE: bcc args wildarg.obj args C:\BORLANDC\INCLUDE\*.H "*.C" Prilikom pokretanja ARGS.EXE, prvi argument se proširuje na imena svih datoteka s ekstenzijom H u direktoriju Borland C++ INCLUDE. Imajte na umu da svi redovi uključuju punu rutu (na primjer C:\TC\INCLUDE\ALLOC.H). Argument *.C nije proširen jer nalazi se u navodnicima. Ako radite u integriranom okruženju (BC.EXE), tada jednostavno trebate navesti u izborniku projekta naziv projektne datoteke, koja bi trebala sadržavati sljedeće retke: ARGS WILDARGS.OBJ Zatim, koristeći "Run/Arguments ", trebate postaviti parametre naredbenog retka. Komentar. Ako želite da se obrada izlaznih znakova uvijek odvija, tj. Kako bi WILDARGS.OBJ bio automatski povezan od strane uređivača veza, morate modificirati svoju standardnu ​​C?.LIB biblioteku da uključi datoteku WILDARGS.OBJ. Da biste to učinili, uklonite SETARGV iz biblioteke i dodajte WILDARGS. To se može učiniti sa sljedećim naredbama (pretpostavljamo da su standardne biblioteke i WILDARGS.OBJ sadržani u trenutnom direktoriju): TLIB je opisan u Poglavlju 7, Pomoćni programi, Korisničkog vodiča. tlib cs -setargv +wildargs tlib cc - setargv +wildargs tlib cm -setargv +wildargs tlib cl -setargv +wildargs tlib ch -setargv +wildargs Prevođenje pomoću prekidača -p (Pascal konvencija pozivanja) Ako svoj program prevedete koristeći Pascal konvenciju pozivanja (detaljno opisano u Poglavlju 9 " Sučelje s asemblerskim jezikom", "Vodič za programere"), morate zapamtiti da glavna funkcija mora biti eksplicitno deklarirana kao C funkcija. To se može učiniti pomoću ključna riječ cdecl je nešto poput ovoga: cdecl main(int argc, char *argv, char *env) Vrijednost koju vraća glavna funkcija. Glavna funkcija vraća vrijednost koja je izlazni kod programa: ovo je cijeli broj. Međutim, ako vaš program koristi funkciju izlaz (ili _exit) za izlaz, tada će povratna vrijednost biti argument te funkcije. Na primjer, ako vaš program sadrži poziv: exit(1) tada će izlazni kod biti 1. Ako koristite integrirano okruženje Borland C++ (BC.EXE) za pokretanje programa, tada možete vidjeti povratnu vrijednost glavnog funkciju odabirom "File | Get Info ".

Stranica 53 od 85

1.5.3. Prosljeđivanje parametara u glavnu funkciju

Glavna funkcija, koja započinje izvršavanje C programa, može se definirati parametrima koji se prosljeđuju iz vanjskog okruženja, na primjer, iz naredbenog retka. Vanjsko okruženje ima svoja pravila za prikaz podataka, odnosno svi podaci su prikazani u obliku znakovnih nizova. Za prosljeđivanje tih nizova glavnoj funkciji koriste se dva parametra, prvi parametar se koristi za prijenos broja nizova koji se prenose, drugi se koristi za prijenos samih nizova. Uobičajeni (ali ne i obavezni) nazivi za ove parametre su argc i argv. Parametar argc je tipa int, njegova vrijednost se formira analizom naredbenog retka i jednaka je broju riječi u naredbenom retku, uključujući i naziv pozvanog programa (riječ je svaki tekst koji ne sadrži razmak lik). Parametar argv je niz pokazivača na nizove, od kojih svaki sadrži jednu riječ iz naredbenog retka. Ako riječ mora sadržavati znak razmaka, mora biti unutar navodnika kada se upisuje u naredbeni redak.

Glavna funkcija može imati i treći parametar koji se obično naziva argp, a služi za prijenos u glavnu funkciju parametara operacijskog sustava (okruženja) u kojem se izvršava program u programskom jeziku C.

Zaglavlje glavne funkcije izgleda ovako:

Ako, na primjer, naredbeni redak programa u programskom jeziku C izgleda ovako:

A:\>cprog radi "C program" 1

tada su argumenti argc, argv, argp predstavljeni u memoriji kao što je prikazano u dijagramu na slici 1.

Argc[4]
argv --> -->
-->
-->
-->
argp --> -->
-->
-->
-->
Sl. 1. Raspored opcija naredbenog retka

Operativni sustav podržava prosljeđivanje vrijednosti za parametre argc, argv, argp, a odgovornost je korisnika da proslijedi i koristi stvarne argumente glavnoj funkciji.

Sljedeći primjer je program koji ispisuje stvarne argumente proslijeđene glavnoj funkciji iz operativnog sustava i parametara operativnog sustava.

Primjer:
int main (int argc, char *argv, char *argp)
( int i=0;
printf("\nNaziv programa %s", argv);
za (i=1; i>=argc; i++)
printf("\n argument %d je %s", argv[i]);
printf("\nPostavke operativnog sustava:");
dok (*argp)
( printf ("\n %s",*argp);
argp++;
}
povratak(0);
}

Parametrima operacijskog sustava također se može pristupiti pomoću funkcije knjižnice geteuv; njen prototip izgleda ovako:

char *geteuv (const char *varname);

Argument ove funkcije navodi naziv parametra okruženja, pokazivač na vrijednost kojeg će vratiti funkcija geteuv. Ako navedeni parametar trenutno nije definiran u okruženju, povratna vrijednost je NULL.

Pomoću pokazivača dobivenog funkcijom geteuv možete samo očitati vrijednost parametra operativnog sustava, ali je ne možete promijeniti. Funkcija puteuv koristi se za promjenu vrijednosti parametra sustava.

Prevodilac programskog jezika C konstruira C program na takav način da se određena inicijalizacija izvodi na početku programa, uključujući, između ostalog, obradu argumenata proslijeđenih glavnoj funkciji i prosljeđivanje vrijednosti parametara okoline. Ove radnje izvode funkcije biblioteke _setargv i _seteuv, koje prevoditelj uvijek stavlja ispred glavne funkcije.

Ako program u programskom jeziku C ne koristi prosljeđivanje argumenata i vrijednosti parametara operativnog sustava, tada je preporučljivo zabraniti korištenje funkcija biblioteke _setargv i _seteuv postavljanjem u program C u programskom jeziku, ispred glavne funkcije, funkcije s istim imenima, ali koje ne izvode nikakve radnje (stubovi). Početak programa u ovom slučaju će izgledati ovako:

setargv()
}
-seteuv()
( return ; /* prazna funkcija */
}
int main()
( /* glavna funkcija bez argumenata */
...
...
povratak(0);
}

U gornjem programu, prilikom pozivanja funkcija knjižnice _setargv i _seteuv, koristit će se funkcije koje je korisnik postavio u program i neće izvršavati nikakve radnje. Ovo će značajno smanjiti veličinu rezultirajuće exe datoteke.

Borland C++ podržava tri argumenta za main(). Prva dva su tradicionalni argc i argv. Ovo su jedini argumenti za main() definirani standardom ANSI C. Oni omogućuju prosljeđivanje argumenata naredbenog retka programu. Argumenti naredbenog retka su informacije koje slijede nakon naziva programa u naredbenom retku operativnog sustava. Na primjer, kada se program kompajlira pomoću Borland line kompajlera, tipično se upisuje bcc naziv_programa

Gdje naziv_programa je program koji treba kompajlirati. Naziv programa prosljeđuje se kompajleru kao argument.

Parametar argc sadrži broj argumenata naredbenog retka i cijeli je broj. Uvijek je jednak barem 1, jer se naziv programa kvalificira kao prvi argument. Parametar argv je pokazivač na niz znakovnih pokazivača. Svaki element ovog polja ukazuje na argument naredbenog retka. Svi argumenti naredbenog retka su nizovi. Sve brojeve program pretvara u interni format. Sljedeći program ispisuje "Hello" nakon čega slijedi korisničko ime kada se upiše neposredno iza naziva programa:

#uključi

{
ako(argc!=2)
{
printf("Zaboravili ste upisati svoje ime\n");
povratak 1;
}
printf("Zdravo %s", argv);
povratak 0;
}

Ako nazovete ovaj program imenom, a korisničko ime je Sergey, tada za pokretanje programa trebate upisati:
ime Sergej.
Kao rezultat programa pojavit će se sljedeće:
"Zdravo Sergej."

Argumenti naredbenog retka moraju biti odvojeni razmacima ili tabulatorima. Zarezi, točka-zarez i slični znakovi ne smatraju se razdjelnicima. Na primjer:

Sastoji se od tri retka, dok

Herb, Rick, Fred

Ovo je jedan redak - zarezi nisu razdjelnici.

Ako trebate proslijediti niz koji sadrži razmake ili tabulatore kao jedan argument, morate ga staviti u dvostruke navodnike. Na primjer, ovo je jedan argument:

"ovo je test"

Važno je ispravno deklarirati argv. Najtipičnija metoda je:

Prazne zagrade označavaju da niz nema fiksnu duljinu. Možete pristupiti pojedinačni elementi koristeći argv indeksiranje. Na primjer, argv pokazuje na prvi redak, koji uvijek sadrži naziv programa. argv pokazuje na sljedeći redak i tako dalje.

Ispod je mali primjer korištenja argumenata naredbenog retka. Odbrojava od vrijednosti navedene u naredbenom retku i emitira signal kada dosegne nulu. Imajte na umu da prvi argument sadrži broj pretvoren u cijeli broj pomoću standardne funkcije atoi(). Ako je niz "display" prisutan kao drugi argument, tada će se sam brojač prikazati na ekranu.

/* program za brojanje */

#uključi
#uključi
#uključi
int main(int argc, char *argv)
{
int disp, brojanje;
ako (argc<2)
{
printf("Morate unijeti duljinu brojanja\n");
printf("na naredbenom retku. Pokušajte ponovno.\n");
povratak 1;
}
if (argc==3 && !strcmp(argv,"display")) disp = 1;
inače disp = 0;
za (count=atoi(argv); count; -count)
if (disp) printf("%d ", broj);
printf("%c", "\a"); /* na većini računala ovo je poziv */
povratak 0;
}

Imajte na umu da se pojavljuje poruka o pogrešci ako nisu navedeni argumenti. Ovo je najtipičnije za programe koji koriste argumente naredbenog retka za izdavanje uputa ako se pokušalo pokrenuti program bez točnih informacija.

Za pristup pojedinačnim znakovima naredbenog retka, dodajte drugi indeks u argv. Na primjer, sljedeći program ispisuje sve argumente s kojima je pozvan, jedan po jedan znak:

#uključi
int main(int argc, char *argv)
{
int t, i;
za (t=0; t {
i = 0;
dok(argv[t][i])
{
printf("%c", argv[t][i]);
}
printf(" ");
}
povratak 0;
}

Moramo zapamtiti da je prvi indeks za pristup nizu, a drugi je za pristup znaku u nizu.

Obično se argc i argv koriste za dobivanje izvornih naredbi. Teoretski je moguće imati do 32767 argumenata, ali većina operativnih sustava ne dopušta čak ni da se približite tome. Ti se argumenti obično koriste za određivanje naziva datoteke ili opcija. Korištenje argumenata naredbenog retka daje programu profesionalni izgled i omogućuje korištenje programa u skupnim datotekama.

Ako uključite datoteku WILDARGS.OBJ isporučenu s Borland C++, možete koristiti predloške u argumentima tipa *.EXE. (Borland C++ automatski obrađuje zamjenske znakove i prema tome povećava argc.) Na primjer, ako povežete WILDARGS.OBJ sa sljedećim programom, reći će vam koliko datoteka odgovara nazivu datoteke navedenom u naredbenom retku:

/* Povežite ovaj program s WILDARGS.OBJ */

#uključi
int main(int argc, char *argv)
{
registar int i;
printf("%d datoteka odgovara navedenom nazivu\n", argc-1);
printf("Oni su: ");
za (i=1; i printf("%s ", argv[i]);
povratak 0;
}

Ako ovaj program nazovemo WA, a zatim ga pokrenemo na sljedeći način, dobit ćemo broj datoteka s ekstenzijom EXE i popis imena tih datoteka:

Uz argc i argv, Borland C++ također nudi treći argument naredbenog retka -env. Env parametar omogućuje programu pristup informacijama o okruženju operacijskog sustava. Env parametar mora slijediti argc i argv i deklariran je na sljedeći način:

Kao što vidite, env se deklarira na isti način kao argv. Baš kao i argv, to je pokazivač na niz stringova. Svaki je redak niz okoline definiran operativnim sustavom. Env parametar nema ekvivalentni argc parametar koji govori koliko redaka okruženja postoji. Umjesto toga, posljednji redak okruženja je null. Sljedeći program ispisuje sve nizove okruženja koji su trenutno definirani u operativnom sustavu:

/* ovaj program prikazuje sve linije okruženja */

#uključi
int main(int argc, char *argv, char *env)
{
int t;
za (t=0; env[t]/ t++)
printf("%s\n", env[t]);
povratak 0;
}

Imajte na umu da iako program ne koristi argc i argv, oni moraju biti prisutni na popisu parametara. C ne zna imena parametara. Umjesto toga, njihova je upotreba određena redoslijedom kojim su parametri deklarirani. Zapravo, možete nazvati parametar kako god želite. Budući da su argc, argv i env tradicionalni nazivi, najbolje je nastaviti ih koristiti tako da svatko tko čita program može odmah shvatiti da su to argumenti za funkciju main().

Tipičan zadatak za programe je traženje vrijednosti definirane u nizu okruženja. Na primjer, sadržaj linije PATH dopušta programima korištenje staza pretraživanja. Sljedeći program pokazuje kako pronaći nizove koji deklariraju standardne staze pretraživanja. Koristi standardnu ​​bibliotečku funkciju strstr(), koja ima sljedeći prototip:

Char *strstr(const char *str1, const char *str2);

Funkcija strstr() traži niz na koji pokazuje str1 u nizu na koji pokazuje str2. Ako se pronađe takav niz, vraća se pokazivač na prvu poziciju. Ako nema rezultata, funkcija vraća NULL.

/* program među nizovima okruženja traži liniju koja sadrži PATH */

#uključi
#uključi
int main (int argc, char *argv, char *env)
{
int t;
for(t=0; env[t]; t++)
{
if(strstr(env[t], "PATH"))
printf("%s\n", env[t]);
}
povratak 0;
}

Svaki C program počinje pozivom funkcije main(). Ova funkcija bi trebala biti u svakom programu.

Kao i svaka druga funkcija, funkcija main() može imati parametre. Ponekad je prilikom pokretanja programa korisno proslijediti mu neke informacije. Ove se informacije prosljeđuju main() pomoću argumenata naredbenog retka. Argumenti naredbenog retka– ovo su informacije koje se unose u naredbeni redak nakon naziva programa kada se program pokrene za izvođenje izvan okruženja za razvoj programa. Na primjer, da biste započeli arhiviranje datoteke task.cpp, morate u naredbeni redak upisati sljedeće:

winrar archTasktask.cpp // winrar.exe archTaskzadatak.cpp

gdje je winrar naziv programa za arhiviranje, a linije " a», « archTask"I" zadatak. cpp» predstavlja argumente naredbenog retka koji govore programu da stvori arhivu (" a") S imenom archTask iz jedne datoteke zadatak. cpp.

Kada prosljeđujete parametre funkciji main(), ona mora biti definirana ovako:

int main(int argc, char *argv) ( ) // ili void main(...)()

Parametar argc sadrži broj argumenata u naredbenom retku i cijeli je broj, a uvijek je najmanje 1, jer je prvi argument uvijek naziv programa (ime programa s punim putem do programa).

Parametar argv je pokazivač na niz pokazivača na nizove. U ovom polju svaki element pokazuje na sljedeći argument naredbenog retka. Prazne uglate zagrade označavaju da niz ima neodređenu duljinu. Pojedinačnim argumentima možete pristupiti indeksiranjem argv polja. Na primjer, argv pokazuje na prvi znakovni niz, koji je uvijek naziv programa; argv pokazuje na prvi argument i tako dalje. Popis argumenata ograničen je na NULL, tj. argv == NULL.

Za pristup pojedinačnom znaku jednog od argumenata naredbenog retka, morate koristiti drugi indeks u argv. To jest, prvi indeks argv pruža pristup nizu, a drugi indeks omogućava pristup njegovim pojedinačnim znakovima.

Svi argumenti naredbenog retka su nizovi, tako da konverzija numeričkih parametara u željeni format mora biti osigurana u programu kada se razvija.

Primjer programa s različitim načinima pretvaranja brojeva u simboličkom formatu u cijele i realne brojeve:

#uključi

#uključi

// pri pokretanju postavljamo, na primjer, sljedeće argumente: 100 2.7

void main(int a, char *b) (

k = strtol(b, &ptr, 10); // ptr = adresa greške u retku

f = strtod(b, &ptr);

sscanf(b, "%d", &k);

sscanf(b, "%lf", &f);

Imena argc i argv su tradicionalna, ali nisu potrebna. Ova dva parametra u funkciji main() mogu se zvati kako god želite.

Jednostavan primjer korištenja argumenata naredbenog retka:

int main(int argc, char *argv) (

if (argc != 4) (

printf("Nevažeći parametri pokretanja programa!\n");

k = atoi(argv); // pretvorba parametra broja

printf("Pozdrav, %s iz grupe %s od %d godine",

Ako je naziv programa zadatak, a vaše ime je "Vasya", grupa "PM-11" iz prve godine, tada za pokretanje programa trebate unijeti u naredbeni redak:

zadatak Vasya PM-11 1

Kao rezultat izvršavanja programa, na ekranu će se pojaviti sljedeća poruka: "Zdravo, Vasya iz 1. godine grupe PM-11."

Imajte na umu da će se prikazati poruka o pogrešci ako nisu dostavljeni svi argumenti naredbenog retka. Programi koji uzimaju argumente naredbenog retka često čine sljedeće: Kada korisnik pokrene te programe bez unosa potrebnih informacija, oni prikazuju upute o tome kako ispravno specificirati argumente.

Argumenti naredbenog retka moraju biti odvojeni razmakom. Ako u samom argumentu ima razmaka, kako bi se spriječilo stvaranje više argumenata, ovaj argument mora biti u dvostrukim navodnicima. Kao rezultat toga, cijeli citirani niz će se smatrati jednim argumentom. Na primjer, program se može pokrenuti ovako: zadatak “Vasya i Petya” PM-21 2. Kao rezultat izvršavanja programa, na zaslonu će se pojaviti poruka: “Zdravo, Vasya i Petya iz 2. godine PM- 21 grupa.”

Što je char *argv? Ovaj niz čiji su elementi pokazivači, to je niz pokazivača. To znači da se kod prosljeđivanja parametara u main() može definirati ovako:

void main(int argc, char **argv) (

Zadatak. Prikaz svih argumenata naredbenog retka (nema potrebe za prikazom naziva programa).

#uključi

void main(int argc, char *argv)(

za (i = 1; i< argc; i++)

printf("%s\n", argv[i]);

Druga opcija =================

#uključi

void main(int argc, char **argv)(

dok((p=*argv) != NULL) (

printf("%s\n", p);

Tipično, argumenti naredbenog retka koriste se kako bi programu pružili početne podatke koji će mu trebati kada se pokrene (na primjer, argumenti naredbenog retka često prosljeđuju podatke kao što su naziv datoteke ili parametri pokretanja programa).

Kada program ne zahtijeva parametre naredbenog retka, funkcija main() koristi ključnu riječ void na svom popisu parametara (ili jednostavno ne specificira ništa).

Kako otkloniti pogreške u prije Krista programe koji zahtijevaju argumente naredbenog retka. U izborniku Run→Arguments... morate unijeti argumente naredbenog retka. Nema potrebe za navođenjem naziva programa. Tada možete jednostavno pokrenuti i ispraviti program u razvojnom okruženju kao i obično.

Molimo obustavite AdBlock na ovoj stranici.

Dakle, zašto su nam potrebne prilagođene funkcije? Korisnički definirane funkcije potrebne su kako bi se programerima olakšalo pisanje programa.

Podsjetimo, govorili smo o paradigmama programiranja, točnije o strukturnom programiranju. Glavna ideja je bila da se svaki program može napisati koristeći samo tri osnovne konstrukcije: praćenje, uvjet i petlja. Sada ćemo ovim strukturama dodati još jednu - "podrutine" - i dobiti novu paradigmu proceduralno programiranje".

Jedina je razlika u tome što ćemo pojedinačne dijelove našeg glavnog programa (osobito one koji se ponavljaju) napisati u obliku zasebnih funkcija (potprograma, procedura) i po potrebi ih pozvati. U biti, program će sada opisati interakciju različitih funkcija.

Stoga ćemo u ovom vodiču detaljno raspravljati o tome kako se funkcije izgrađuju interno. Također ćemo naučiti kako izraditi vlastite prilagođene funkcije.

Kako funkcioniraju funkcije

Prisjetimo se informacija iz prve lekcije. Sve funkcije, uključujući one koje je napisao korisnik, raspoređene su na sličan način. Imaju dva glavna dijela: zaglavlje funkcije i tijelo funkcije.

Ispis 1.

Int main(void)( // zaglavlje funkcije // tijelo funkcije napisano je u vitičastim zagradama)

S tijelom funkcije sve je jasno: ono opisuje algoritam funkcije. Pogledajmo naslov. Sastoji se od tri obvezna dijela:

  • povratna vrsta;
  • naziv funkcije;
  • argumenti funkcije.

Prvo se napiše tip povrata, na primjer, int , kao u glavnoj funkciji. Ako funkcija ne bi trebala vratiti nikakvu vrijednost programu, tada se na ovom mjestu piše ključna riječ void. Čini se da budući da funkcija ne vraća ništa, onda nema potrebe ništa pisati. Inače, prije se to radilo na jeziku C, ali su ga onda dodali radi jednoobraznosti. Danas će moderni prevoditelji izdavati upozorenja/pogreške ako ne navedete vrstu povrata.
U nekim programskim jezicima funkcije koje ne vraćaju nikakvu vrijednost nazivaju se procedure (na primjer, Pascal). Štoviše, postoje različite sintakse za stvaranje funkcija i procedura. U jeziku C nema takve diskriminacije.

Naziv funkcije piše se nakon tipa povrata. Pa, nakon naziva su naznačeni tipovi i broj argumenata koji se prosljeđuju funkciji.

Pogledajmo naslove funkcija koje su nam već poznate.

Ispis 2.

// funkcija pod nazivom srand koja uzima cijeli broj ne vraća ništa void srand(int) // funkcija pod nazivom sqrt koja uzima pravi float vraća float float sqrt(float) // funkcija pod nazivom rand koja ne uzima argumente, vraća cijeli broj int rand(void) //funkcija imena pow koja uzima dva argumenta tipa double, vraća realni broj tipa double double pow(double, double)

Kako stvoriti vlastitu funkciju

Kako biste kreirali vlastitu funkciju, morate je u potpunosti opisati. Ovdje vrijedi opće pravilo: prije uporabe deklarirajte i opišite kako bi trebao raditi. Da bismo to učinili, vratimo se na dijagram strukture programa na jeziku C koji smo imali u prvoj lekciji. Označimo na njemu mjesta na kojima se mogu opisati funkcije.

Slika 1 Pojašnjenje strukture programa. Deklaracija funkcija.

Kao što vidite, postoje dva mjesta na kojima se to može učiniti.

Pogledajmo primjer koji ilustrira stvaranje prilagođene funkcije za izračun najviše dva broja.

Ispis 3.

#uključi // deklarirajte prilagođenu funkciju pod nazivom max_num // ulaz: dva cjelobrojna parametra pod nazivom a i b // izlaz: maksimum od dva argumenta int max_num(int a, int b)( int max = b; if (a > b) max = a; return max; ) //glavni program int main(void) ( int x = 0, y = 0; int m = 0; scanf("%d %d", &x, &y); m = max_num( x ,y); printf("max(%d,%d) = %d\n",x,y,m); return 0; )

Dopustite mi da detaljno opišem kako će ovaj program raditi. Izvršeno je tijelo glavne funkcije. Kreiraju se cjelobrojne varijable x, y i m. Varijable x i y čitaju se s tipkovnice. Recimo da smo unijeli 3 5, zatim x = 3, y = 5. Ovo bi vam sve trebalo biti jasno. Sada sljedeći redak

Ispis 4.

M = max_num(x,y);

Varijabla m mora biti dodijeljena onome što je desno od znaka =. Tu imamo naziv funkcije koju smo sami kreirali. Računalo traži deklaraciju i opis ove funkcije. Nalazi se iznad. Prema ovoj deklaraciji, ova funkcija mora prihvatiti dvije cjelobrojne vrijednosti. U našem slučaju to su vrijednosti zapisane u varijablama x i y. Oni. brojevi 3 i 5. Imajte na umu da se same varijable x i y ne prosljeđuju funkciji, već samo vrijednosti (dva broja) koje su u njima pohranjene. Ono što se zapravo prosljeđuje funkciji kada se pozove u programu naziva se stvarnim parametrima funkcije.

Sada se funkcija max_num počinje izvršavati. Prvi korak je stvaranje zasebne privremene varijable za svaki parametar opisan u zaglavlju funkcije. U našem slučaju, stvorene su dvije cjelobrojne varijable s imenima a i b. Ovim varijablama dodijeljene su vrijednosti stvarnih parametara. Sami parametri, opisani u zaglavlju funkcije, nazivaju se formalni parametri. Dakle, formalnim parametrima a i b dodijeljene su vrijednosti stvarnih parametara 3, odnosno 5. Sada je a = 3, b = 5. Dalje unutar funkcije možemo raditi s tim varijablama kao da su obične varijable.

Kreira se cjelobrojna varijabla imena max kojoj se dodjeljuje vrijednost b. Zatim se provjerava uvjet a > b. Ako je istina, vrijednost u max varijabli treba zamijeniti s .

Slijedi naredba return, koja pozivajućem programu (glavnoj funkciji) vraća vrijednost zapisanu u max varijabli, tj. 5 . Nakon toga se varijable a, b i max uklanjaju iz memorije. I vraćamo se na red

Ispis 5.

M = max_num(x,y);

Funkcija max_num vratila je vrijednost 5, što znači da sada desno od znaka = stoji 5. Ova vrijednost se upisuje u varijablu m. Zatim se linija prikazuje na ekranu i program završava.

Ponovno pažljivo pročitajte posljednja 4 odlomka kako biste u potpunosti razumjeli kako program radi.

U međuvremenu ću vam reći zašto je potreban donji blok opisa funkcija. Zamislite da ste napisali 20 malih funkcija u svom programu. I svi su opisani prije glavne funkcije. Nije baš zgodno toliko dugo dolaziti do glavnog programa. Kako bi se riješio ovaj problem, funkcije se mogu opisati u donjem bloku.

Ali tamo neće biti moguće jednostavno prenijeti cijeli funkcijski kod, jer tada će se prekršiti pravilo: prije nego nešto upotrijebiš, moraš to deklarirati. Kako biste izbjegli ovaj problem, trebate koristiti prototip funkcije.

Prototip funkcije u potpunosti ponavlja zaglavlje funkcije, nakon čega slijedi ; . Nakon što smo specificirali prototip u gornjem bloku, u donjem već možemo u potpunosti opisati funkciju. Za gornji primjer to bi moglo izgledati ovako:

Ispis 6.

#uključi int max_num(int, int); int main(void) ( int x =0, y = 0; int m = 0; scanf("%d %d", &x, &y); m = max_num(x,y); printf("max(%d) ,%d) = %d\n",x,y,m); return 0; ) int max_num(int a, int b)( int max = b; if (a > b) max = a; return max; )

Sve je vrlo jednostavno. Imajte na umu da prototip funkcije ne mora specificirati nazive formalnih parametara, dovoljno je samo naznačiti njihove tipove. U gornjem primjeru sam učinio upravo to.