Programare În C
Programare În C
Funcț ie în C
Ne referim la o funcț ie ca la un grup de declaraț ii diferite care îndeplinesc împreună o sarcină. Orice program C
pe care îl folosim are cel puț in o funcț ie, care este main(). Apoi, programele pot defini multiple funcț ii suplimentare.
funcț ii într-un cod.
• Când folosim funcț iile, putem evita cu uș urinț ă rescrierea aceluiaș i cod.
logic de fiecare dată ș i din nou de mai multe ori în orice program.
• Apelarea funcț iilor C poate apărea de un număr oricât de ori dorim în orice program.
Ș i putem face asta din orice loc din programul care ne este dat.
• Putem realiza urmărirea unui program C mare destul de uș or dacă îl împărț im în diverse
funcț ii.
• Una dintre realizările principale ale funcț iilor C este reutilizabilitatea.
• Cu toate acestea, aminteș te-ț i că apelarea funcț iei acț ionează întotdeauna ca o suprasarcină în cazul unui C
program.
• Numele funcț iei − Denotă numele actual al oricărei funcț ii pe care o folosim în textul dat
Codul. Numele ș i parametrul unei funcț ii constituie împreună o semnătură a funcț iei în cod.
• Corpul funcț iei - Consistă dintr-o colecț ie a tuturor declaraț iilor. Acestea oferă o definiț ie a
ce va face funcț ia în cod.
• Parametrii - Este ca un loc rezervat. Ori de câte ori invocăm o funcț ie, transmitem o valoare către
parametrul disponibil. Facem referire la această valoare ca la un argument sau un parametru efectiv. Facem referire
la lista de parametri ca numărul, ordinea ș i tipul funcț iei din cod. Parametrii
poate fi opț ional. Asta înseamnă că orice funcț ie într-un cod poate să nu aibă deloc parametri.
• Tip de returnare - Putem obț ine o valoare înapoi pentru o funcț ie. Termenul tip de returnare se referă la
tipul de date al valorilor întoarse pe care le obț inem din funcț ii (returnările funcț iilor). Unele dintre funcț ii
sunt de asemenea capabili să efectueze orice operaț iune dorită fără a primi o valoare în schimb pentru aceasta. În
în orice astfel de caz, cuvântul cheie folosit pentru return_type va fi void.
Exemplu
Aici, am dat un cod sursă mai jos pentru funcț ia max(). Funcț ia max() ia două dintre
parametrii - mai exact val1 ș i val2. Apoi returnează valoarea maximă care este prezentă între ambele.
pe ei. Să aruncăm o privire:
/* funcț ia returnează maximul dintre două valori */
int max(int val1, int val2) {
/* declaraț ia variabilei locale */
int rezultat;
dacă (val1 > val2)
rezultat = val1;
altfel
rezultat = val2;
returnează rezultatul;
Tipuri de Funcț ii
Limbajul de programare C are funcț ii care sunt de următoarele tipuri:
• Funcț ii definite de utilizator – Acestea sunt tipurile de funcț ii pe care le putem crea folosind C
programator astfel încât să putem să-l folosim de mai multe ori. Această funcț ie reduce complexitatea
orice program mare - ș i astfel, optimizează codul dat.
• Funcț ii de bibliotecă–Acestea sunt funcț iile a căror declaraț ie apare în fiș ierele de antet ale C,
cum ar fi floor(), ceil(), outs(), gets(), printf(), scanf(), etc.
Valoare de Returnare
Orice funcț ie în programarea C poate să nu returneze valoarea sa din nicio funcț ie. În caz că nu avem nevoie
pentru a returna valoarea care este disponibilă în orice funcț ie, putem folosi voidul sub forma unui return
tip. Să ne uităm la un exemplu de funcț ie C care nu returnează o valoare din
funcț ie disponibilă.
Să ne uităm la un exemplu de funcț ie C care nu are valoare de întoarcere:
void ciocolata()
{
printf("ciocolată c");
}
În cazul în care dorim să returnăm o valoare dintr-o funcț ie disponibilă, trebuie să folosim oricare dintre datele
tipuri, cum ar fi char, long, int, etc. Astfel, tipul de returnare depinde total de valoarea care trebuie returnată
din funcț ia disponibilă. Vom examina un exemplu de funcț ie C care va returna o valoare int
din funcț ia dată.
Exemplu de funcț ie C cu valoare de retur int,
int obtine()
{
returnează 20;
}
În exemplul menț ionat mai sus, încercăm să returnăm valoarea 20, iar tipul de date, în acest caz, este
int. Dacă suntem dispuș i să ne întoarcem la valoarea punctului flotant (exemplu, 64,5, 7,9, 27,61, etc.), atunci
trebuie să folosim float-ul sub forma tipului de returnare al metodei.
float get()
{
returnează 83.7;
}
Aici, trebuie să apelăm o funcț ie astfel încât să obț inem valoarea funcț iei.
printName();
}
void printName()
{
printf("Kiddo");
}
Ieș irea generată de acest program ar fi:
Pa, micuț ule
Exemplu de funcț ie care nu are argumente, dar are o valoare de întoarcere,
#include<stdio.h>
int sum();
void main()
{
printează("Prin calcularea suprafeț ei pătratului dat\n");
float arie = patrat();
printf("Suprafaț a pătratelui dat va fi: %f\n", area);
}
int patrat()
{
float latură;
printf("Lungimea laturii pătratului în metri va fi: ");
scanf("%f", &side);
returnare latură * latură;
}
Ieș irea generată de acest program ar fi:
Prin calcularea ariei pătratului dat
Lungimea laturii pătratului în metri va fi: 10
aria pătratului dat va fi: 100.000000
Suma este: %d
}
int suma(int x, int y)
{
returnează x+y;
}
Ieș irea generată de acest program ar fi:
Calculul sumei a două valori:
Introducerea a două valori: 49
51
Suma este: 100
Declaraț ie de Funcț ie
Definiț ia funcț iei spune practic unui compilator despre numele funcț iei ș i cum poate fi apelată.
această funcț ie. Apoi putem defini corpul efectiv al acestei funcț ii separat.
Există următoarele părț i care exist în o declaraț ie de funcț ie:
tip_retur nume_functie(lista_parametrii);
Pentru funcț ia definită mai sus, care este max(), declaraț ia funcț iei va apărea în următorul mod:
int max(int val1, int val2);
Numel din parametrii nu sunt atât de importanț i în cazul declaraț iei funcț iei - avem nevoie doar de ai lor.
tip. Astfel, declaraț ia menț ionată mai jos va fi de asemenea valabilă:
int max(int, int);
Cerem doar declaraț ia funcț iei atunci când definim acea funcț ie într-un fiș ier sursă în timp ce
încă apelăm acea funcț ie într-un fiș ier separat. În orice astfel de caz, trebuie să declarăm acea funcț ie foarte
partea de sus a fiș ierului care apelează acea funcț ie.
Când o funcț ie este apelată de un program, funcț ia apelată va primi controlul programului transferat.
pentru ea. Funcț ia apelată va efectua o sarcină definită. Odată ce executăm declaraț ia return sau
când ajunge la acolada de închidere a finalizării funcț iei, este obligat să returneze controlul programului la
programul principal.
Pentru a apela o funcț ie, trebuie doar să trecem parametrii necesari pentru aceasta, împreună cu numele ei.
funcț ia. Aici, dacă funcț ia se dovedeș te a returna o valoare, atunci putem păstra cu uș urinț ă valoarea returnată
stocat cu noi.
De exemplu -
#include <stdio.h>
/* declaraț ia funcț iei */
int max(int val1, int val2);
int main () {
/* definiț ia variabilei locale */
int x = 400;
int y = 500;
int ret;
/* apelul funcț iei pentru a obț ine o valoare maximă */
altfel
rezultat = val2;
returnează rezultatul;
}
Ieș ire
În acest caz, am păstrat funcț ia max() împreună cu funcț ia main(). După aceea, am efectuat
compilarea codului sursă. Rularea executabilului final ar produce rezultatul că
urmează:
Valoarea maximă este: 500
Argumente de funcț ie
Când o funcț ie trebuie să folosească argumentele, trebuie să declare acele variabile care se întâmplă să accepte
valorile argumentelor. Astfel de variabile sunt cunoscute ca parametrii formali ai funcț iei date.
Parametrii formali se comportă exact ca orice alte variabile locale în cadrul funcț iei noastre date. Aceș tia
parametrii sunt creaț i când intră într-o funcț ie. După aceea, sunt distruș i când ies.
În timpul apelului unei funcț ii, vor exista două moduri în care putem efectua transmiterea acestora.
argumente pentru o funcț ie dată:
Tip de
Descrierea tipului de apel
Apel
Apel prin Metoda Call by Reference creează o copie a adresei argumentului dat în
Face ț i referire la parametrul care este formal în natură. Între aceste func ț ii, utilizarea adresei ajută la
accesând argumentul actual care este folosit în acest apel. Aceasta înseamnă că modificările
care apar pe parametru sunt legate de a afecta argumentul dat.
Apel prin Metoda Call by Value creează o copie a valorii actuale a argumentului dat în
Valoare parametrul funcț iei care este de natură formală. Aici, schimbările care apar pe
parametrul (care există în interiorul funcț iei) nu are niciun efect asupra
argument disponibil.
Programarea C, prin default, este apelul prin valoare pentru trecerea argumentelor. În general, înseamnă
că nu putem folosi codul care există într-o funcț ie pentru a modifica argumentele care ajută
în apelarea funcț iei.
Funcț ii de bibliotecă în C
Funcț iile de bibliotecă din limbajul de programare C sunt funcț iile încorporate care sunt grupate împreună
ș i apoi plasat într-un loc comun cunoscut sub numele de bibliotecă. Folosim funcț iile bibliotecii pentru a
efectuează un tip specific de operaț ie. De exemplu, funcț ia de bibliotecă printf ajută la imprimarea pe
console. Designerii unui compilator creează funcț iile bibliotecii. Definirea tuturor funcț iilor din biblioteca standard
funcț iile în C apar în mai multe fiș iere header care sunt salvate folosind extensia .he
Un utilizator trebuie să includă astfel de fiș iere de antet în programul său pentru a utiliza funcț iile bibliotecii care există.
în acele fiș iere de antet. De exemplu, dacă dorim să facem uz de funcț iile din biblioteca scanf/printf, atunci
trebuie să includem fiș ierul de antet stdio.h în programul nostru. Acest fiș ier de antet conț ine toate funcț iile bibliotecii.
care se referă la ieș irea/introducerea standard.
Iată o listă cu câteva dintre fiș ierele de antet care sunt utilizate cel mai mult în programarea C:
conio.h Este un tip de fiș ier header pentru ieș irea/introducerea pe consolă.
stdio.h Este un tip standard de fiș ier de antet de ieș ire / intrare. Acest fiș ier de antet constă din toate biblioteca
funcț ii care sunt legate de ieș irea/introducerea standard.
stdlib.h Este un tip de fiș ier header care constă din diverse funcț ii generale de bibliotecă, cum ar fi exit()
calloc(), malloc(), etc.
string.h Acest fiș ier de antet constă din toate funcț iile bibliotecii care sunt legate de ș iruri, cum ar fi puts(),
gets(), etc.
timp.h Este un tip de fiș ier antet care constă din toate funcț iile legate de timp.
math.h Este un tip de fiș ier header care constă din toate funcț iile care sunt legate de matematică.
operaț iuni, cum ar fi pow(), etc.
stdarg.h Folosim acest fiș ier de antet pentru a defini funcț iile cu argumente variabile.
ctype.h Este un tip de fiș ier header care constă din caracterele care gestionează funcț iile.
setjmp.h Este un tip de fiș ier header care constă în toate funcț iile care sunt funcț ii de salt.
signal.h Folosim acest fiș ier header pentru a defini orice funcț ie de manipulare a semnalelor dată.
errno.h Acest tip de fiș ier de antet constă din toate funcț iile de gestionare a erorilor.
locale.h Este un tip de fiș ier antet care constă în toate funcț iile de localizare.
assert.h Este un tip de fiș ier header care constă în toate funcț iile de diagnostic.
Când o funcț ie este apelată de un program, funcț ia apelată va primi controlul programului transferat.
la ea. Funcț ia apelată va efectua o sarcină definită. Odată ce executăm declaraț ia de returnare sau
când ajunge la acolada de închidere a funcț iei, este obligat să returneze controlul programului
la programul principal.
Pentru a apela o funcț ie, trebuie doar să transmităm parametrii necesari pentru aceasta, împreună cu numele ei.
funcț ia. Aici, dacă funcț ia întâmplător returnează o valoare, atunci putem salva cu uș urinț ă valoarea returnată
stocate la noi.
Nesting-ul funcț iilor
Limbajul C permite de asemenea imbricarea funcț iilor, adică utilizarea/apelarea unei funcț ii în interiorul alteia.
corpul funcț iei. Trebuie să fim atenț i în timp ce folosim funcț ii imbricate, deoarece aceasta poate duce la
la cuibărit infinit.
functie1()
{
// corpul funcț iei 1 aici
function2();
// corp funcț iei 1 aici
}
Dacă funcț ia function2() are, de asemenea, un apel pentru function1() în interiorul ei, atunci în acest caz, va duce la un
întrebări infinite. Ei se vor suna unii pe alț ii ș i programul nu va înceta niciodată.
Nu reuș eș ti să înț elegi? Să presupunem că în interiorul funcț iei main() se află funcț ia function1()
apelat ș i execuț ia sa începe, apoi în interiorul function1(), avem un apel pentru function2(), aș a că
controlul programului va trece la function2(). Dar, deoarece function2() are de asemenea un apel la
function1() în corpul său, va apela function1(), care va apela din nou function2(), ș i aceasta
va continua la infinit, până când ieș iț i forț at din execuț ia programului.
Recursie în C
Recursia este procesul care apare atunci când o funcț ie apelează o copie a sa pentru a lucra asupra ei.
o problemă mai mică. Orice funcț ie care se apelează pe sine este numită funcț ie recursivă, iar o astfel de funcț ie apelează
se numesc apeluri recursive. Recursia implică un număr mai multor apeluri recursive. Cu toate acestea, este
este important să impui o condiț ie de terminare a recursiei. Codul de recursie este mai scurt decât codul iterativ
cu toate acestea, este dificil de înț eles.
Recursia nu poate fi aplicată tuturor problemelor, dar este mai utilă pentru sarcinile care pot fi definite
în ceea ce priveș te subtask-urile similare. De exemplu, recursia poate fi aplicată sortării, căutării ș i traversării
probleme.
În general, soluț iile iterative sunt mai eficiente decât recursia, deoarece apelul funcț iei este întotdeauna o suprasarcină.
Orice problemă care poate fi rezolvată recursiv, poate fi de asemenea rezolvată iterativ. Cu toate acestea, unele probleme
sunt cele mai potrivite pentru a fi rezolvate prin recursie, de exemplu, turnul din Hanoi, seria Fibonacci, factorialul
găsire, etc.
#include <stdio.h>
int fact (int);
int main()
{
int n,f;
printf("Introduceț i numărul al cărui factorial doriț i să-l calculaț i?");
scanf("%d",&n);
f = fact(n);
printf("factorial = %d", f);
}
int fact(int n)
{
dacă (n==0)
{
return 0;
}
altfel dacă ( n == 1)
{
returnează 1;
}
altfel
{
return n*fact(n-1);
}
}
Ieș ire
Introduceț i numărul al cărui factorial doriț i să-l calculaț i? 5
factorial = 120
Structură ș i Uniune
O structură ș i o unire în C pot fi transmise prin valoare funcț iilor ș i returnate prin valoare de funcț ii.
structură, putem trece seturi complete de înregistrări la orice funcț ie folosind un singur parametru. Uniunea este
folosit atunci când trebuie să foloseș ti aceeaș i locaț ie de memorie pentru doi sau mai mulț i membri de date.
Difference between Structure and Union in C on the basis of keyword, memory, value altering,
accesarea membrilor ș i iniț ializarea membrilor.
Structură Uniune
Cuvântul cheie unire este folosit pentru a defini o Cuvântul cheie struct este definit ca o structură
uniune.
Uniunea este egală cu dimensiunea celei mai mari Mai mare sau egal cu suma dimensiunilor
membru. membrii săi.
Memoria alocată este partajată de fiecare individ Fiecare membru dintr-o structură este atribuit
membrii uniunii. o zonă de stocare unică a locaț iei.
Numai primul membru al uniunii poate fi Mai mulț i membri ai unei structuri pot fi
iniț ializat. iniț ializat imediat.
Structura angajatului are trei membri: nume, id și clasă. Membrul nume este un 20-
element array, iar id și clasa sunt membri simpli cu tipurile int și long, respectiv.
identificatorul angajat este structura identificator.
▪ Structura în C elimină multe povara atunci când lucrăm cu înregistrări care con ț in
elemente de date heterogene, sporind astfel productivitatea. Mentenan ț a codului: utilizând
structură, reprezentăm înregistrări complexe folosind un singur nume, ceea ce face codul
menț inerea ca un vânt.
În Structuri ș i Uniuni în C,
▪ Uniunea ocupă mai puț in spaț iu în memorie comparativ cu structura.
▪ Când foloseș ti un union, doar ultima variabilă poate fi accesată direct. Union este folosit atunci când
trebuie să foloseș ti aceeaș i locaț ie de memorie pentru doi sau mai mulț i membri de date. Îț i permite să reț ii
datele unui singur membru de date.
▪ Toate variabilele de unire nu pot fi iniț ializate sau utilizate cu valori variate în acelaș i timp.
▪ Structura este mai lentă deoarece necesită spaț iu de stocare pentru toate datele.
O structură este un tip de date definit de utilizator disponibil în C, care permite combinarea elementelor de date diferite.
tipuri. În structuri ș i uniuni în C, structurile sunt utilizate pentru a reprezenta un registru. O uniune este un tip de dată special
tip disponibil în C care permite stocarea diferitelor tipuri de date în aceeaș i locaț ie de memorie.
Structură
▪ Este utilizat în principal pentru stocarea diferitelor tipuri de date
▪ Ocupa spaț iu pentru un membru având cea mai mare dimensiune scrisă în parametrii interni.
structname/tag
{
//membrii structurii
} variabile;
Exemplu
structcar
{
charname[100];
preț flotant
} maș ină1;
Sintaxă
variabile structname;
Exemplu
structcar
{
charname[100];
preț plutitor
};
structcar ma ș ina1, ma ș ina2, ma ș ina3;
Exemplu
#include<stdio.h>
intmain()
{
structcar
{
[100]
preț float
};
Benz
987432,50
structcar car1={"xyz",987432.50};
//tipărirea valorilor folosind operatorul punct (.) sau 'operatorul de acces la membri'
return0;
Ieș ire
Benz
Preț ul maș inii = 987432.500000
Compararea a două structuri
Compararea structurilor în C nu este permisă pentru a verifica sau compara direct cu operatori logici.
Numai structură membri pot fii comparable cu logic operator.
Îmi place
struc_object_1.varsta == struc_object_2.varsta
Program
#include<stdio.h>
#include<conio.h>
struct student {
int rno;
char nume[20];
int procentaj;
};
void main()
{
clrscr();
//compara structură prin membri
struct student stu1 = {1001,"Ramesh",87};
struct student stu2 = {1002,"Arun",85};
dacă ([Link] < [Link]) {
%s are note mai mari.
}
altfel {
%s are note mai mari.
}
}
Rezultatul
Ramesh are note mai mari.
Array de structuri în C
Un tablou de structuri în C poate fi definit ca o colec ț ie de multiple structuri
variabile în care fiecare variabilă conț ine informaț ii despre entităț i diferite. Array-ul
structurile în C sunt folosite pentru a stoca informaț ii despre multiple entităț i de diferite tipuri de date
tipuri. Array-ul de structuri este, de asemenea, cunoscut sub numele de colecț ia de structuri.
Exemplu de un array de structuri care stochează informaț ii despre 5 studenț i ș i le afiș ează.
#include<stdio.h>
#include <string.h>
structstudent{
număr de interior
charname[10];
};
intmain(){
inti
structstudent st[5];
printf("Introduceti inregistrarile a 5 studenti");
pentru(i=0;i<5;i++){
Introduceti numarul de inregistrare:
scanf("%d",&st[i].rollno);
Introduceț i Numele:
scanf("%s", &st[i].name);
}
Lista informaț iilor studenț ilor:
pentru(i=0;i<5;i++){
printf("\nNumăr de ordine:%d, Nume:%s",st[i].rollno,st[i].name);
}
return0;
}
Introduceti numele
Introduceț i numărul de rol: 2
Introduceti numele
Introduceț i numărul de înmatriculare: 4
Introduceț i numele: James
Uneori, array-urile pot fi membri într-o structură, această situaț ie este cunoscută sub numele de array-uri în interior
Structura. Accesarea array-urilor din interiorul structurii este similară cu accesarea altor membri.
Când te găseș ti să stochezi o valoare ș ir, atunci trebuie să alegi un tablou în interior.
structură. deoarece numele tău se încadrează doar în tipul de date caracter, astfel că tabloul este
capabil de a stoca date de acelaș i tip de date.
Program C - Array în interiorul structurii
#include <stdio.h>
int main()
{
struct student {
char nume[30];
int numar_de_rol;
} stud;
Introdu numărul tău de înmatriculare :
scanf ("%d",&[Link]);
Introduceț i-vă numele:
scanf ("%s", [Link]);
Număr de ordine : %d Nume : %s
return 0;
}
Introduceti numarul dumneavoastra de inregistrare: 16
16
Abi
Herestudact ca un obiect pentru un student de structură, astfel încât să ne fie posibil să accesăm orice.
membru în interiorul unui student folosind obiectul nostru stud.
Toate articolele care intră sub indicaț ii pot fi grupate împreună ș i declarate sub o
sub–structură după cum este arătat mai jos.
struct emp{
int eno;
char ename[30];
float salariu;
Punctoare C
Pointerul în limbajul C este o variabilă care stochează adresa unei alte variabile. Această variabilă poate
să fie de tip int, char, array, funcț ie sau orice altă zonă de memorie. Dimensiunea pointerului depinde de
arhitectură. Totuș i, în arhitectura pe 32 de biț i, dimensiunea unui pointer este de 2 octeț i.
Consideraț i următorul exemplu pentru a defini un pointer care stochează adresa unui întreg.
[Link] = 10;
[Link]* p = &n;// Variabila p de tip pointer pointează la adresa variabilei n de tip int
teger.
Declaraț i un pointer
Punctatorul în limbajul C poate fi declarat folosind * (simbolul asterisc). De asemenea, este cunoscut sub numele de indirectionare.
pointer folosit pentru a dereferentia un pointer.
[Link]*a;//pointer la int
[Link]*c;//pointer la char
Exemplu de pointer
Un exemplu de utilizare a pointerilor pentru a imprima adresa ș i valoarea este dat mai jos.
După cum poț i vedea în figura de mai sus, variabila pointer stochează adresa variabilei număr, adică fff4.
Valoarea variabilei număr este 50. Dar adresa variabilei pointer p este aaa3.
Să vedem exemplul de pointer, aș a cum a fost explicat pentru figura de mai sus.
#include<stdio.h>
intmain(){
50
int*p;
p=&number;//stochează adresa variabilei number
printf("Adresa variabilei p este %x \n",p);// p conț ine adresa numărului, de aceea printi
ng p oferă adresa numărului.
printf("Valoarea variabilei p este %d \n",*p);// După cum ș tim, * este folosit pentru a dereferenț ia un pointer
prin urmare, dacă imprimăm *p, vom obț ine valoarea stocată la adresa conț inută de p.
return0;
}
Ieşire
Punctator la masiv
[Link][10];
[Link]*p[10]=&arr;// Variabila p de tip pointer indică adresa unui array de întregi arr.
[Link] (int);
[Link](*p)(int) = &display;// Pointerul p indică adresa unei func ț ii
[Link] {
2. inti
3. floatf;
4. }ref;
[Link] *p = &ref;
Avantajul pointer-ului
1) Pointerul reduce codul ș i îmbunătăț eș te performanț a, fiind folosit pentru a recupera ș iruri, arbori, etc.
ș i folosit cu tablouri, structuri ș i funcț ii.
În limbajul C, putem aloca dinamic memorie folosind funcț iile malloc() ș i calloc() unde
se foloseș te un pointer.
Punctele în limbajul C sunt utilizate pe scară largă în tablouri, funcț ii ș i structuri. Reduce codul ș i
îmbunătăț eș te performanț a.
Punctator la array
Foloseș te un pointer la un array ș i apoi foloseș te acel pointer pentru a accesa elementele array-ului. De exemplu,
#include<stdio.h>
void main()
{
int a[3] = {1, 2, 3};
int *p = a;
pentru (int i = 0; i < 3; i++)
{
printf("%d", *p);
p++;
}
return 0;
}
Ieşire
123
Sintaxă:
Array de Punctatoare în C
Când dorim să ne referim la mai multe variabile sau memorii de acelaș i tip de date într-un program C, folosim
o matrice de pointeri.
Acum, să presupunem că, odată ce citim toate numele angajaț ilor la întâmplare, vrem să sortăm toate.
numele angajaț ilor care lucrează în fabrica de cheesecake. Sortarea tuturor numelui angajaț ilor necesită
citirea, schimbarea ș i copierea unei cantităț i mari de date. Dar, deoarece am stocat toate numele angajaț ilor în
grupuri/array-uri, putem să ne referim direct la array-ul numelui angajaț ilor care lucrează la cheesecake
fabrica.
Să presupunem că dorim să construim un sistem închis, iar acest sistem foloseș te un alt tip de
termometru pentru măsurarea temperaturii. Acum, în acest caz, putem folosi un tablou pentru a păstra
adresa de memorie pentru fiecare senzor. Astfel, manipularea stării senzorului devine foarte uș oară.
Exemplu
Acum, deoarece este un tablou, poate interacț iona direct cu termopointul indexat în tablou. Astfel, ne
voi obț ine statutul primului senzor cu thermo[0], al doilea folosind thermo[1], ș i aș a mai departe.
O matrice de pointeri poate fi declarată exact aș a cum declarăm matricele de char, float, int etc. Sintaxa
pentru declararea unui tablou de indicatoare ar fi:
int *ary[55]
Aceasta este un array cu un total de 55 de pointeri. În cuvinte simple, acest array este capabil să deț ină
abordează un total de 55 de variabile întregi. Gândeș te-te la asta - ary[0] va ț ine adresa unui
variabila întreagă, atunci ary[1] va deț ine adresa celeilalte variabile întregi ș i aș a mai departe.
#include <stdio.h>
void swap(int *a, int *b);
int principala()
{
int m = 10, n = 20;
printf("m = %d\n", m);
printf("n = %d\n\n", n);
swap(&m, &n); //trecerea adresei lui m ș i n la funcț ia swap
printf("După schimbare: ");
printf("m = %d\n", m);
printf("n = %d", n);
return 0;
}
/*
punctatoarele 'a' ș i 'b' deț in ș i
indică adresa lui 'm' ș i 'n'
*/
void schimba(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
m = 10
n = 20
După schimbare:
m = 20
10
Funcț ii care returnează variabile de tip Pointer
O funcț ie poate returna, de asemenea, un pointer către funcț ia apelantă. În acest caz, trebuie să fii atent, deoarece
variabilele locale ale funcț iei nu trăiesc în afara funcț iei. Ele au domeniu doar în interiorul funcț iei.
Aș adar, dacă returnezi un pointer conectat la o variabilă locală, acel pointer va indica spre nimic
când se termină funcț ia.
Gestionarea fiș ierelor
Există momente când rezultatul generat de un program după compilare ș i rulare nu serveș te nevoilor noastre.
scopul intenț ionat. În astfel de cazuri, s-ar putea să dorim să verificăm ieș irea programului de mai multe ori. Acum, compilând ș i
rularea aceluiaș i program de mai multe ori devine o sarcină plictisitoare pentru orice programator. Exact aici vine fiș ierul
manipularea devine utilă.
Să vedem câteva motive pentru care gestionarea fiș ierelor face programarea mai uș oară pentru toată lumea:
• Reutilizabilitate: Gestionarea fiș ierelor ne permite să păstrăm informaț iile/datele generate după ce rulăm programul.
• Economiseș te timp: Unele programe ar putea necesita o cantitate mare de input din partea utilizatorilor lor. În astfel de cazuri, fiș ierul
gestionarea îț i permite să accesezi uș or o parte a unui cod folosind comenzi individuale.
• Capacitate de stocare lăudabilă: Atunci când stocaț i date în fiș iere, puteț i lăsa în urmă grija de a stoca totul.
informaț iile în masă în orice program.
• Portabilitate: Conț inuturile disponibile într-un fiș ier pot fi transferate în altul fără nicio pierdere de date.
sistemul computerizat. Acest lucru economiseș te mult efort ș i minimizează riscul de codare greș ită.
Fiș ierele binare sunt create cu extensia .bin într-un program ș i depăș esc dezavantajul fiș ierelor text în
un program din moment ce oamenii nu pot să-l citească; numai maș inile pot. Astfel, informaț ia devine mult mai sigură. Astfel,
fiș ierele binare sunt cele mai sigure în ceea ce priveș te stocarea fiș ierelor de date într-un program C.
folosit pentru a deschide un fiș ier existent sau un fiș ier nou fopen()
a fost utilizat pentru a seta pointerul fiș ierului la poziț ia fiș ierului dorită fseek()
a fost utilizat pentru a citi un întreg din fiș ierul dat fgetw()
setează un pointer de fiș ier destinat la începutul fiș ierului în sine rewind()
Notă: Este important să ș tim că trebuie să declarăm un pointer de tip fiș ier atunci când lucrăm cu diverse fiș iere într-un
program. Acest lucru ajută la stabilirea unei comunicări directe între un program ș i fiș iere.
Iată cum poț i face asta:
FILE *fpointer;
Dintre toate operaț iile/funț iile menț ionate mai sus, să discutăm despre câteva dintre operaț iile de bază pe care le efectuăm în
limba C.
• Aici, dacă presupunem că fiș ierul – [Link] nu există cu adevărat în locaț ia E:\myprogram.
Aici, am folosit modul „w”. Astfel, prima funcț ie va crea un fiș ier nou cu numele
[Link] ș i apoi deschideț i-l pentru scriere (deoarece am folosit modul "w").
• „w” se referă la modul de scriere. Acesta permite unui programator să suprascrie/editeze ș i să creeze conț inutul într-un
fiș ier de program.
• Acum, haideț i să ne uităm la al doilea fiș ier binar [Link] care este prezent în E:\myprogram
locaț ie. Astfel, a doua funcț ie de aici va deschide fiș ierul (care există deja) pentru citire în modul "rb"
mod binar.
• „rb” se referă la modul de citire. Acesta permite doar citirea unui fiș ier, dar nu ș i suprascrierea lui. Astfel, va permite doar
citeș te acest fiș ier disponibil în program.
Să aruncăm o privire la câteva moduri de deschidere folosite în programele C:
r Deschide un fiș ier pentru a citi conț inutul. În cazul în care fiș ierul nu există în
dacă locaț ia este invalidă, atunci fopen() va returna NULL.
rb Deschide un fiș ier pentru a citi conț inutul în binar În cazul în care fiș ierul nu există în
mod. dacă locaț ia nu este găsită, atunci fopen() va returna NULL.
w Deschide un fiș ier pentru a scrie conț inutul. În cazul în care fiș ierul există, conț inutul său este
suprascris.
În cazul în care fiș ierul nu există în
locaț ie, atunci va crea un nou fiș ier.
wb Deschide un fiș ier pentru a scrie conț inutul în format binar În cazul în care fiș ierul există, atunci conț inutul său
mod. va fi suprascris.
În cazul în care fiș ierul nu există în
locaț ie, atunci va crea un fiș ier nou.
a Deschide un fiș ier pentru a adăuga conț inut. În cazul în care fiș ierul nu există în
locaț ie, atunci va crea un nou fiș ier.
Asta înseamnă că datele programului sunt adăugate la
sfârș itul fiș ierului într-un program.
ab Deschide un fiș ier pentru a adăuga conț inut în binar În cazul în care fiș ierul nu există în
mod. locaț ie, atunci va crea un nou fiș ier.
Asta înseamnă că datele programului sunt adăugate la
sfârș itul fiș ierului într-un program în mod binar.
r+ Deschide un fiș ier pentru a scrie ș i a citi În cazul în care fiș ierul nu există în
conț inut. dacă locaț ia este invalidă, atunci fopen() va returna NULL.
rb+ Deschide un fiș ier atât pentru scriere, cât ș i pentru citire În cazul în care fiș ierul nu există în
conț inut în mod binar. locaț ia, atunci fopen() va returna NULL.
w+ Deschide un fiș ier atât pentru scriere, cât ș i pentru citire. În cazul în care fiș ierul există, conț inutul său este
suprascrise.
În caz că fiș ierul nu există în
locaț ia, atunci va crea un fiș ier nou.
wb+ Deschide un fiș ier atât pentru scriere, cât ș i pentru citire În cazul în care fiș ierul există, conț inutul său este
conț inut în modul binar. suprascris.
În cazul în care fiș ierul nu există în
locaț ie, atunci va crea un fiș ier nou.
a+ Deschide un fiș ier atât pentru adăugare, cât ș i pentru citire În cazul în care fiș ierul nu există în
conț inut. locaț ie, atunci va crea un fiș ier nou.
ab+ Deschide un fiș ier atât pentru adăugare cât ș i pentru citire În cazul în care fiș ierul nu există în
conț inut în modul binar. locaț ie, atunci va crea un fiș ier nou.
ieș ire(1);
}
printf("Vă rugăm să introduceț i valoarea: ");
scanf("%d",&val);
fprintf(fptr, "%d", val);
închide(fptr);
return 0;
}
Programul menț ionat aici ar lua numărul dat ș i l-ar stoca în fiș ierul [Link].
Odată ce compilăm acest program ș i îl rulăm pe sistem, vom putea asista la un fiș ier text [Link]
creat pe unitatea C a calculatorului nostru! De asemenea, când deschidem acest fiș ier, atunci vom putea vedea ce număr întreg avem
introduse ca input în timpul codării.
iesire(1);
}
fscanf(fptr,"%d", &val);
printf("Valoarea integerului n este=%d", val);
fclose(fptr);
return 0;
}
Programul dat aici va citi numărul întreg pe care l-am introdus în fiș ierul [Link] ș i apoi va imprima
integer ca ieș ire pe ecranul computerului.
În cazul în care ai reuș it să creezi fiș ierul cu ajutorul Exemplului 1, atunci rularea programului în
Exemplul 2 va genera întregul pe care l-aț i introdus.
De asemenea, poț i folosi alte funcț ii precum fputc(), fgetchar() etc., într-un mod similar în program.
Întrebări
Ce este manipularea fiș ierelor în C?
Manipularea fiș ierelor se referă la metoda de stocare a datelor în programul C sub formă de ieș ire sau intrare care ar putea avea
a fost generat în timpul rulării unui program C într-un fiș ier de date, adică, un fiș ier binar sau un fiș ier text pentru analiza viitoare ș i
referinț ă în acel program.
Există momente când ieș irea generată de un program după compilare ș i rulare nu ne serveș te.
scopul intenț ionat. În astfel de cazuri, s-ar putea să dorim să verificăm ieș irea programului de mai multe ori. Acum, compilarea ș i
rularea aceluiaș i program de mai multe ori devine o sarcină plictisitoare pentru orice programator. Aici intervine exact fiș ierul
gestionarea devine utilă.