<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ro">
	<id>http://wiki.dcae.pub.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lflueratoru</id>
	<title>WikiLabs - Contribuții utilizator [ro]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.dcae.pub.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lflueratoru"/>
	<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php/Special:Contribu%C8%9Bii/Lflueratoru"/>
	<updated>2026-05-24T17:01:05Z</updated>
	<subtitle>Contribuții utilizator</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_13&amp;diff=5072</id>
		<title>PC Laborator 13</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_13&amp;diff=5072"/>
		<updated>2017-01-11T20:44:17Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil să:&lt;br /&gt;
* să lucreze cu fișiere text: deschidere, citire, scriere, închidere&lt;br /&gt;
* să înțeleagă modul de funcționare al fișierelor binare&lt;br /&gt;
&lt;br /&gt;
== Informații generale ==&lt;br /&gt;
Datele pot fi stocate temporar în memoria internă, dar la închiderea programului acestea se vor pierde. Pentru suportul acestui dezavantaj se poate folosi noțiunea de fișier, desigur stocat in memoria externă. Memoria externă furnizează o capacitate de stocare mult mai mare decât memoria internă, nu este volatilă, deci nu-şi pierde conţinutul la o eventuală întrerupere, dar are ca principal dezavantaj viteza de transfer a datelor redusă.&lt;br /&gt;
&lt;br /&gt;
Prelucrarea unui fişier presupune asocierea acestuia cu un canal de I/E (numit flux sau &amp;#039;&amp;#039;&amp;#039;stream&amp;#039;&amp;#039;&amp;#039;).(vezi [[PC Laborator 3#Stream-urile standard ale unui proces|PC Laborator 3]]).&lt;br /&gt;
&lt;br /&gt;
Limbajul C permite operarea cu fişiere:&lt;br /&gt;
&lt;br /&gt;
*text   - fişier ce conţine o succesiune de linii&lt;br /&gt;
*binare - fişier conţine o succesiune de octeti, fără o structură.&lt;br /&gt;
&lt;br /&gt;
*&amp;quot;b&amp;quot;	- specifică fişier de tip binar&lt;br /&gt;
*&amp;quot;t&amp;quot;	- specifică fişier de tip text (implicit)&lt;br /&gt;
&lt;br /&gt;
== Operații cu fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a avea acces la informaţiile dintr-un fişier, se realizează următoarele operaţii: &lt;br /&gt;
* deschiderea fişierului &lt;br /&gt;
* citirea/scrierea conţinutului fişierului&lt;br /&gt;
* închiderea fisierului &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observatie:&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Operaţiile cu fişierele se realizează prin intermediul unui set de funcţii din &lt;br /&gt;
biblioteca standard de intrare/ieşire (I/O), deci este necasară includerea fişierului header &amp;#039;&amp;#039;&amp;#039;stdio.h&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Atunci când intenționăm să lucrăm cu fişiere este necesar să ne definim un pointer către o structură de tipul FILE.&lt;br /&gt;
O structură de tipul FILE este o structură de control a streamurilor.&lt;br /&gt;
Această structură păstrează informaţii cum ar fi adresa de început, poziţia indicatorului de fişier, poziţia indicatorului de sfârşit a fişierului și altele.&lt;br /&gt;
Pentru a se putea utiliza un fişier, este necesară folosirea unui pointer. Acesta este un pointer către anumite informaţii&lt;br /&gt;
despre fişierul respectiv – nume, starea şi poziţia în care se află poinetrul de fişier.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE * fisier; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Deschiderea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
Fişierele necesită a fi inițializate, le trebuie asociat un fişier fizic de pe dispozitivul de stocare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fopen(const char *nume_fișier, const char *mod);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:FILE -returnează un pointer la fișier&lt;br /&gt;
:nume_fișiere -se specifică numele sau calea acestuia&lt;br /&gt;
:mod -se specifică modul de deschidere al fișierului&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Moduri de deschidere al fișierelor:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;r&amp;quot;	- (read only), permite deschiderea doar pentru citirea conținutului&lt;br /&gt;
* &amp;quot;w&amp;quot;	- (write), crează un nou fişier în care se pot scrie date. Dacă exista deja un fișier cu acest nume, conținutul va fi sters&lt;br /&gt;
* &amp;quot;a&amp;quot;	- (append), deschide pentru scriere într-un fişier existent (scrierea se va face în continuare) -adăugare-&lt;br /&gt;
* &amp;quot;r+&amp;quot;  - deschide un fişier pentru actualizarea datelor, permite atât scriere cât şi citire&lt;br /&gt;
* &amp;quot;w+&amp;quot;  - crează un fişier nou în care se vor putea scrie cât şi citi date. &lt;br /&gt;
* &amp;quot;a+&amp;quot;  - deschide un fişier pentru adăugare de date cât şipentru citire. Operațiile de scriere vor fi efectuate în continuarea datelor existente&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Dacă operaţia de deschidere eşuează, funcţia returnează valoarea NULL. Dacă deschiderea&lt;br /&gt;
reuşeşte, funcţia returnează o valoare de tip FILE *.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fisier;&lt;br /&gt;
fisier = fopen(&amp;quot;exemplu.txt&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (fisier == NULL) {&lt;br /&gt;
    printf(&amp;quot;Fisierul nu poate fi creat.&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
    printf(&amp;quot;Fisierul a fost creat&amp;quot;);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În acest mod se confirmă și crearea corectă a fișierului, fiind o practică recomandată.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Închiderea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
După ce sunt folosite, fişierele trebuie închise. Atunci când execuţia programului se încheie cu succes &lt;br /&gt;
(fie prin încheierea execuţiei funcţiei main (), fie prin apelarea funcţiei exit() ), toate fişierele&lt;br /&gt;
deschise în momenul respectiv sunt automat închise.&lt;br /&gt;
Închiderea unui fişier se face cu funcţia fclose ().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fclose(FILE *fisier) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Funcţia fclose() returnează 0 dacă operaţia de închidere a fişierului s-a realizat cu succes şi EOF dacă a intervenit o eroare.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fisier;&lt;br /&gt;
fisier = fopen(&amp;quot;/work/pc/F/group1/ion/lab13/test.txt&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (fisier == NULL) {&lt;br /&gt;
    printf(&amp;quot;Fisierul nu a putut fi creat&amp;quot;);&lt;br /&gt;
} else { &lt;br /&gt;
    //... &lt;br /&gt;
    fclose(fisier); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parcurgerea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
Orice fişier, odată deschis, are asociat un cursor care indică poziţia curentă în fişierul respectiv (inițial această poziție este la începutul fişierului). Funcţiile de scriere şi citire din fişiere operează începand de la poziţia curentă a cursorului.&lt;br /&gt;
Totodată, orice operaţie de scriere sau citire avansează automat acest cursor cu numărul de octeţi citiţi/scrişi.&lt;br /&gt;
&lt;br /&gt;
Poziția curent este dată de funcția ftell():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int ftell(FILE *fisier) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poziţionarea cursorului pe o anumita poziţie se poate face folosind funcţia fseek():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fseek(FILE *fisier, long pozitie, int referinta) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În termeni uzuali se folosește long offset, int whence. Offset fiind numărul de octeți peste care se deplasează, iar whence poziția cursorului&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whence poate avea una din cele trei valori posibile:&lt;br /&gt;
*SEEK_SET = 0 - Căutarea se face de la începutul fişierului&lt;br /&gt;
*SEEK_CUR = 1 - Căutare din poziţia curentă&lt;br /&gt;
*SEEK_END = 2 - Căutare de la sfârşitul fişierului&lt;br /&gt;
&lt;br /&gt;
=== Citirea şi scrierea în/din fişiere ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
În cazul în care se lucrează cu fişiere text se folosesc în mod uzual următoarele funcţii:&lt;br /&gt;
*scriere: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fputs()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf()&amp;lt;/code&amp;gt;&lt;br /&gt;
*citire:  &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fgets()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Funcţiile &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf()&amp;lt;/code&amp;gt; funcţionează identic cu funcţiile &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;scanf()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;printf()&amp;lt;/code&amp;gt;, cu deosebirea că citirea respectiv scrierea operează asupra unui fişier specificat ca prim parametru:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fprintf(FILE *f, const char *format, ...);&lt;br /&gt;
int fscanf(FILE *f, const char *format, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcţiile recomandate pentru lucrul cu fişiere binare sunt urmatoarele:&lt;br /&gt;
*scriere: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fwrite()&amp;lt;/code&amp;gt;&lt;br /&gt;
*citire:  &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fread()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
size_t fread(void *ptr, size_t noct, size_t nr, FILE *f);&lt;br /&gt;
size_t fwrite(void *ptr, size_t noct, size_t nr, FILE *f); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exerciții ===&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care citește de la tastatură un text de mai multe linii și îl scrie într-un fișier text.&lt;br /&gt;
#Să se scrie un program care citește un fișier text și îl afișeză linie cu linie.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_13&amp;diff=5071</id>
		<title>PC Laborator 13</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_13&amp;diff=5071"/>
		<updated>2017-01-11T20:42:32Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Citirea şi scrierea în/din fişiere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil să:&lt;br /&gt;
* să lucreze cu fișiere text: deschidere, citire, scriere, închidere&lt;br /&gt;
* să înțeleagă modul de funcționare al fișierelor binare&lt;br /&gt;
&lt;br /&gt;
== Informații generale ==&lt;br /&gt;
Datele pot fi stocate temporar în memoria internă, dar la închiderea programului acestea se vor pierde. Pentru suportul acestui dezavantaj se poate folosi noțiunea de fișier, desigur stocat in memoria externă. Memoria externă furnizează o capacitate de stocare mult mai mare decât memoria internă, nu este volatilă, deci nu-şi pierde conţinutul la o eventuală întrerupere, dar are ca principal dezavantaj viteza de transfer a datelor redusă.&lt;br /&gt;
&lt;br /&gt;
Prelucrarea unui fişier presupune asocierea acestuia cu un canal de I/E (numit flux sau &amp;#039;&amp;#039;&amp;#039;stream&amp;#039;&amp;#039;&amp;#039;).(vezi [[PC Laborator 3#Stream-urile standard ale unui proces|PC Laborator 3]]).&lt;br /&gt;
&lt;br /&gt;
Limbajul C permite operarea cu fişiere:&lt;br /&gt;
&lt;br /&gt;
*text   - fişier ce conţine o succesiune de linii&lt;br /&gt;
*binare - fişier conţine o succesiune de octeti, fără o structură.&lt;br /&gt;
&lt;br /&gt;
*&amp;quot;b&amp;quot;	- specifică fişier de tip binar&lt;br /&gt;
*&amp;quot;t&amp;quot;	- specifică fişier de tip text (implicit)&lt;br /&gt;
&lt;br /&gt;
== Operații cu fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a avea acces la informaţiile dintr-un fişier, se realizează următoarele operaţii: &lt;br /&gt;
* deschiderea fişierului &lt;br /&gt;
* citirea/scrierea conţinutului fişierului&lt;br /&gt;
* închiderea fisierului &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observatie:&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Operaţiile cu fişierele se realizează prin intermediul unui set de funcţii din &lt;br /&gt;
biblioteca standard de intrare/ieşire (I/O), deci este necasară includerea fişierului header &amp;#039;&amp;#039;&amp;#039;stdio.h&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Atunci când intenționăm să lucrăm cu fişiere este necesar să ne definim un pointer către o structură de tipul FILE.&lt;br /&gt;
O structură de tipul FILE este o structură de control a streamurilor.&lt;br /&gt;
Această structură păstrează informaţii cum ar fi adresa de început, poziţia indicatorului de fişier, poziţia indicatorului de sfârşit a fişierului și altele.&lt;br /&gt;
Pentru a se putea utiliza un fişier, este necesară folosirea unui pointer. Acesta este un pointer către anumite informaţii&lt;br /&gt;
despre fişierul respectiv – nume, starea şi poziţia în care se află poinetrul de fişier.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE * fisier; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Deschiderea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
Fişierele necesită a fi inițializate, le trebuie asociat un fişier fizic de pe dispozitivul de stocare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fopen(const char *nume_fișier, const char *mod);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:FILE -returnează un pointer la fișier&lt;br /&gt;
:nume_fișiere -se specifică numele sau calea acestuia&lt;br /&gt;
:mod -se specifică modul de deschidere al fișierului&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Moduri de deschidere al fișierelor:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;r&amp;quot;	- (read only), permite deschiderea doar pentru citirea conținutului&lt;br /&gt;
* &amp;quot;w&amp;quot;	- (write), crează un nou fişier în care se pot scrie date. Dacă exista deja un fișier cu acest nume, conținutul va fi sters&lt;br /&gt;
* &amp;quot;a&amp;quot;	- (append), deschide pentru scriere într-un fişier existent (scrierea se va face în continuare) -adăugare-&lt;br /&gt;
* &amp;quot;r+&amp;quot;  - deschide un fişier pentru actualizarea datelor, permite atât scriere cât şi citire&lt;br /&gt;
* &amp;quot;w+&amp;quot;  - crează un fişier nou în care se vor putea scrie cât şi citi date. &lt;br /&gt;
* &amp;quot;a+&amp;quot;  - deschide un fişier pentru adăugare de date cât şipentru citire. Operațiile de scriere vor fi efectuate în continuarea datelor existente&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Dacă operaţia de deschidere eşuează, funcţia returnează valoarea NULL. Dacă deschiderea&lt;br /&gt;
reuşeşte, funcţia returnează o valoare de tip FILE *.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fisier;&lt;br /&gt;
fisier = fopen(&amp;quot;exemplu.txt&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (fisier == NULL) {&lt;br /&gt;
    printf(&amp;quot;Fisierul nu poate fi creat.&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
    printf(&amp;quot;Fisierul a fost creat&amp;quot;);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În acest mod se confirmă și crearea corectă a fișierului, fiind o practică recomandată.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Închiderea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
După ce sunt folosite, fişierele trebuie închise. Atunci când execuţia programului se încheie cu succes &lt;br /&gt;
(fie prin încheierea execuţiei funcţiei main (), fie prin apelarea funcţiei exit() ), toate fişierele&lt;br /&gt;
deschise în momenul respectiv sunt automat închise.&lt;br /&gt;
Închiderea unui fişier se face cu funcţia fclose ().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fclose(FILE *fisier) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Funcţia fclose() returnează 0 dacă operaţia de închidere a fişierului s-a realizat cu succes şi EOF dacă a intervenit o eroare.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fisier;&lt;br /&gt;
fisier = fopen(&amp;quot;/work/pc/F/group1/ion/lab13/test.txt&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (fisier == NULL) {&lt;br /&gt;
    printf(&amp;quot;Fisierul nu a putut fi creat&amp;quot;);&lt;br /&gt;
} else { &lt;br /&gt;
    //... &lt;br /&gt;
    fclose(fisier); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parcurgerea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
Orice fişier, odată deschis, are asociat un cursor care indică poziţia curentă în fişierul respectiv (inițial această poziție este la începutul fişierului). Funcţiile de scriere şi citire din fişiere operează începand de la poziţia curentă a cursorului.&lt;br /&gt;
Totodată, orice operaţie de scriere sau citire avansează automat acest cursor cu numărul de octeţi citiţi/scrişi.&lt;br /&gt;
&lt;br /&gt;
Poziția curent este dată de funcția ftell():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int ftell(FILE *fisier) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poziţionarea cursorului pe o anumita poziţie se poate face folosind funcţia fseek():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fseek(FILE *fisier, long pozitie, int referinta) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În termeni uzuali se folosește long offset, int whence. Offset fiind numărul de octeți peste care se deplasează, iar whence poziția cursorului&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whence poate avea una din cele trei valori posibile:&lt;br /&gt;
*SEEK_SET = 0 - Căutarea se face de la începutul fişierului&lt;br /&gt;
*SEEK_CUR = 1 - Căutare din poziţia curentă&lt;br /&gt;
*SEEK_END = 2 - Căutare de la sfârşitul fişierului&lt;br /&gt;
&lt;br /&gt;
=== Citirea şi scrierea în/din fişiere ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
În cazul în care se lucrează cu fişiere text se folosesc în mod uzual următoarele funcţii:&lt;br /&gt;
*scriere: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fputs()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf()&amp;lt;/code&amp;gt;&lt;br /&gt;
*citire:  &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fgets()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Funcţiile &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf()&amp;lt;/code&amp;gt; funcţionează identic cu funcţiile &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;scanf()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;printf()&amp;lt;/code&amp;gt;, cu deosebirea că citirea respectiv scrierea operează asupra unui fişier specificat ca prim parametru:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fprintf(FILE *f, const char *format, ...);&lt;br /&gt;
int fscanf(FILE *f, const char *format, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcţiile recomandate pentru lucrul cu fişiere binare sunt urmatoarele:&lt;br /&gt;
*scriere: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fwrite()&amp;lt;/code&amp;gt;&lt;br /&gt;
*citire:  &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fread()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
size_t fread(void *ptr, size_t noct, size_t nr, FILE *f);&lt;br /&gt;
size_t fwrite(void *ptr, size_t noct, size_t nr, FILE *f); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exerciții ===&lt;br /&gt;
&lt;br /&gt;
#Să se scrie programul care citește de la tastatură un text de mai multe linii și îl scrie într-un fișier text.&lt;br /&gt;
#Să se scrie programul care citește un fișier text și îl afișeză linie cu linie.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_13&amp;diff=5070</id>
		<title>PC Laborator 13</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_13&amp;diff=5070"/>
		<updated>2017-01-11T20:42:13Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Citirea şi scrierea în/din fişiere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil să:&lt;br /&gt;
* să lucreze cu fișiere text: deschidere, citire, scriere, închidere&lt;br /&gt;
* să înțeleagă modul de funcționare al fișierelor binare&lt;br /&gt;
&lt;br /&gt;
== Informații generale ==&lt;br /&gt;
Datele pot fi stocate temporar în memoria internă, dar la închiderea programului acestea se vor pierde. Pentru suportul acestui dezavantaj se poate folosi noțiunea de fișier, desigur stocat in memoria externă. Memoria externă furnizează o capacitate de stocare mult mai mare decât memoria internă, nu este volatilă, deci nu-şi pierde conţinutul la o eventuală întrerupere, dar are ca principal dezavantaj viteza de transfer a datelor redusă.&lt;br /&gt;
&lt;br /&gt;
Prelucrarea unui fişier presupune asocierea acestuia cu un canal de I/E (numit flux sau &amp;#039;&amp;#039;&amp;#039;stream&amp;#039;&amp;#039;&amp;#039;).(vezi [[PC Laborator 3#Stream-urile standard ale unui proces|PC Laborator 3]]).&lt;br /&gt;
&lt;br /&gt;
Limbajul C permite operarea cu fişiere:&lt;br /&gt;
&lt;br /&gt;
*text   - fişier ce conţine o succesiune de linii&lt;br /&gt;
*binare - fişier conţine o succesiune de octeti, fără o structură.&lt;br /&gt;
&lt;br /&gt;
*&amp;quot;b&amp;quot;	- specifică fişier de tip binar&lt;br /&gt;
*&amp;quot;t&amp;quot;	- specifică fişier de tip text (implicit)&lt;br /&gt;
&lt;br /&gt;
== Operații cu fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a avea acces la informaţiile dintr-un fişier, se realizează următoarele operaţii: &lt;br /&gt;
* deschiderea fişierului &lt;br /&gt;
* citirea/scrierea conţinutului fişierului&lt;br /&gt;
* închiderea fisierului &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observatie:&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Operaţiile cu fişierele se realizează prin intermediul unui set de funcţii din &lt;br /&gt;
biblioteca standard de intrare/ieşire (I/O), deci este necasară includerea fişierului header &amp;#039;&amp;#039;&amp;#039;stdio.h&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Atunci când intenționăm să lucrăm cu fişiere este necesar să ne definim un pointer către o structură de tipul FILE.&lt;br /&gt;
O structură de tipul FILE este o structură de control a streamurilor.&lt;br /&gt;
Această structură păstrează informaţii cum ar fi adresa de început, poziţia indicatorului de fişier, poziţia indicatorului de sfârşit a fişierului și altele.&lt;br /&gt;
Pentru a se putea utiliza un fişier, este necesară folosirea unui pointer. Acesta este un pointer către anumite informaţii&lt;br /&gt;
despre fişierul respectiv – nume, starea şi poziţia în care se află poinetrul de fişier.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE * fisier; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Deschiderea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
Fişierele necesită a fi inițializate, le trebuie asociat un fişier fizic de pe dispozitivul de stocare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fopen(const char *nume_fișier, const char *mod);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:FILE -returnează un pointer la fișier&lt;br /&gt;
:nume_fișiere -se specifică numele sau calea acestuia&lt;br /&gt;
:mod -se specifică modul de deschidere al fișierului&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Moduri de deschidere al fișierelor:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;r&amp;quot;	- (read only), permite deschiderea doar pentru citirea conținutului&lt;br /&gt;
* &amp;quot;w&amp;quot;	- (write), crează un nou fişier în care se pot scrie date. Dacă exista deja un fișier cu acest nume, conținutul va fi sters&lt;br /&gt;
* &amp;quot;a&amp;quot;	- (append), deschide pentru scriere într-un fişier existent (scrierea se va face în continuare) -adăugare-&lt;br /&gt;
* &amp;quot;r+&amp;quot;  - deschide un fişier pentru actualizarea datelor, permite atât scriere cât şi citire&lt;br /&gt;
* &amp;quot;w+&amp;quot;  - crează un fişier nou în care se vor putea scrie cât şi citi date. &lt;br /&gt;
* &amp;quot;a+&amp;quot;  - deschide un fişier pentru adăugare de date cât şipentru citire. Operațiile de scriere vor fi efectuate în continuarea datelor existente&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Dacă operaţia de deschidere eşuează, funcţia returnează valoarea NULL. Dacă deschiderea&lt;br /&gt;
reuşeşte, funcţia returnează o valoare de tip FILE *.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fisier;&lt;br /&gt;
fisier = fopen(&amp;quot;exemplu.txt&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (fisier == NULL) {&lt;br /&gt;
    printf(&amp;quot;Fisierul nu poate fi creat.&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
    printf(&amp;quot;Fisierul a fost creat&amp;quot;);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În acest mod se confirmă și crearea corectă a fișierului, fiind o practică recomandată.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Închiderea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
După ce sunt folosite, fişierele trebuie închise. Atunci când execuţia programului se încheie cu succes &lt;br /&gt;
(fie prin încheierea execuţiei funcţiei main (), fie prin apelarea funcţiei exit() ), toate fişierele&lt;br /&gt;
deschise în momenul respectiv sunt automat închise.&lt;br /&gt;
Închiderea unui fişier se face cu funcţia fclose ().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fclose(FILE *fisier) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Funcţia fclose() returnează 0 dacă operaţia de închidere a fişierului s-a realizat cu succes şi EOF dacă a intervenit o eroare.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fisier;&lt;br /&gt;
fisier = fopen(&amp;quot;/work/pc/F/group1/ion/lab13/test.txt&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (fisier == NULL) {&lt;br /&gt;
    printf(&amp;quot;Fisierul nu a putut fi creat&amp;quot;);&lt;br /&gt;
} else { &lt;br /&gt;
    //... &lt;br /&gt;
    fclose(fisier); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parcurgerea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
Orice fişier, odată deschis, are asociat un cursor care indică poziţia curentă în fişierul respectiv (inițial această poziție este la începutul fişierului). Funcţiile de scriere şi citire din fişiere operează începand de la poziţia curentă a cursorului.&lt;br /&gt;
Totodată, orice operaţie de scriere sau citire avansează automat acest cursor cu numărul de octeţi citiţi/scrişi.&lt;br /&gt;
&lt;br /&gt;
Poziția curent este dată de funcția ftell():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int ftell(FILE *fisier) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poziţionarea cursorului pe o anumita poziţie se poate face folosind funcţia fseek():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fseek(FILE *fisier, long pozitie, int referinta) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În termeni uzuali se folosește long offset, int whence. Offset fiind numărul de octeți peste care se deplasează, iar whence poziția cursorului&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whence poate avea una din cele trei valori posibile:&lt;br /&gt;
*SEEK_SET = 0 - Căutarea se face de la începutul fişierului&lt;br /&gt;
*SEEK_CUR = 1 - Căutare din poziţia curentă&lt;br /&gt;
*SEEK_END = 2 - Căutare de la sfârşitul fişierului&lt;br /&gt;
&lt;br /&gt;
=== Citirea şi scrierea în/din fişiere ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
În cazul în care se lucrează cu fişiere text se folosesc în mod uzual următoarele funcţii:&lt;br /&gt;
*scriere: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fputs()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf()&amp;lt;/code&amp;gt;&lt;br /&gt;
*citire:  &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fgets()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Funcţiile &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf()&amp;lt;/code&amp;gt; funcţionează identic cu funcţiile &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;scanf()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;printf()&amp;lt;/code&amp;gt;, cu deosebirea că citirea respectiv scrierea operează asupra unui fişier specificat ca prim parametru:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fprintf(FILE *f, const char *format, ...);&lt;br /&gt;
int fscanf(FILE *f, const char *format, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcţiile recomandate pentru lucrul cu fişiere binare sunt urmatoarele:&lt;br /&gt;
*scriere: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fwrite()&amp;lt;/code&amp;gt;&lt;br /&gt;
*citire:  &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fread()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
size_t fread (void *ptr, size_t noct, size_t nr, FILE *f);&lt;br /&gt;
size_t fwrite (void *ptr, size_t noct, size_t nr, FILE *f); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exerciții ===&lt;br /&gt;
&lt;br /&gt;
#Să se scrie programul care citește de la tastatură un text de mai multe linii și îl scrie într-un fișier text.&lt;br /&gt;
#Să se scrie programul care citește un fișier text și îl afișeză linie cu linie.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_13&amp;diff=5069</id>
		<title>PC Laborator 13</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_13&amp;diff=5069"/>
		<updated>2017-01-11T20:35:42Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Operații cu fișiere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil să:&lt;br /&gt;
* să lucreze cu fișiere text: deschidere, citire, scriere, închidere&lt;br /&gt;
* să înțeleagă modul de funcționare al fișierelor binare&lt;br /&gt;
&lt;br /&gt;
== Informații generale ==&lt;br /&gt;
Datele pot fi stocate temporar în memoria internă, dar la închiderea programului acestea se vor pierde. Pentru suportul acestui dezavantaj se poate folosi noțiunea de fișier, desigur stocat in memoria externă. Memoria externă furnizează o capacitate de stocare mult mai mare decât memoria internă, nu este volatilă, deci nu-şi pierde conţinutul la o eventuală întrerupere, dar are ca principal dezavantaj viteza de transfer a datelor redusă.&lt;br /&gt;
&lt;br /&gt;
Prelucrarea unui fişier presupune asocierea acestuia cu un canal de I/E (numit flux sau &amp;#039;&amp;#039;&amp;#039;stream&amp;#039;&amp;#039;&amp;#039;).(vezi [[PC Laborator 3#Stream-urile standard ale unui proces|PC Laborator 3]]).&lt;br /&gt;
&lt;br /&gt;
Limbajul C permite operarea cu fişiere:&lt;br /&gt;
&lt;br /&gt;
*text   - fişier ce conţine o succesiune de linii&lt;br /&gt;
*binare - fişier conţine o succesiune de octeti, fără o structură.&lt;br /&gt;
&lt;br /&gt;
*&amp;quot;b&amp;quot;	- specifică fişier de tip binar&lt;br /&gt;
*&amp;quot;t&amp;quot;	- specifică fişier de tip text (implicit)&lt;br /&gt;
&lt;br /&gt;
== Operații cu fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a avea acces la informaţiile dintr-un fişier, se realizează următoarele operaţii: &lt;br /&gt;
* deschiderea fişierului &lt;br /&gt;
* citirea/scrierea conţinutului fişierului&lt;br /&gt;
* închiderea fisierului &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observatie:&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Operaţiile cu fişierele se realizează prin intermediul unui set de funcţii din &lt;br /&gt;
biblioteca standard de intrare/ieşire (I/O), deci este necasară includerea fişierului header &amp;#039;&amp;#039;&amp;#039;stdio.h&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Atunci când intenționăm să lucrăm cu fişiere este necesar să ne definim un pointer către o structură de tipul FILE.&lt;br /&gt;
O structură de tipul FILE este o structură de control a streamurilor.&lt;br /&gt;
Această structură păstrează informaţii cum ar fi adresa de început, poziţia indicatorului de fişier, poziţia indicatorului de sfârşit a fişierului și altele.&lt;br /&gt;
Pentru a se putea utiliza un fişier, este necesară folosirea unui pointer. Acesta este un pointer către anumite informaţii&lt;br /&gt;
despre fişierul respectiv – nume, starea şi poziţia în care se află poinetrul de fişier.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE * fisier; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Deschiderea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
Fişierele necesită a fi inițializate, le trebuie asociat un fişier fizic de pe dispozitivul de stocare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fopen(const char *nume_fișier, const char *mod);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:FILE -returnează un pointer la fișier&lt;br /&gt;
:nume_fișiere -se specifică numele sau calea acestuia&lt;br /&gt;
:mod -se specifică modul de deschidere al fișierului&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Moduri de deschidere al fișierelor:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;r&amp;quot;	- (read only), permite deschiderea doar pentru citirea conținutului&lt;br /&gt;
* &amp;quot;w&amp;quot;	- (write), crează un nou fişier în care se pot scrie date. Dacă exista deja un fișier cu acest nume, conținutul va fi sters&lt;br /&gt;
* &amp;quot;a&amp;quot;	- (append), deschide pentru scriere într-un fişier existent (scrierea se va face în continuare) -adăugare-&lt;br /&gt;
* &amp;quot;r+&amp;quot;  - deschide un fişier pentru actualizarea datelor, permite atât scriere cât şi citire&lt;br /&gt;
* &amp;quot;w+&amp;quot;  - crează un fişier nou în care se vor putea scrie cât şi citi date. &lt;br /&gt;
* &amp;quot;a+&amp;quot;  - deschide un fişier pentru adăugare de date cât şipentru citire. Operațiile de scriere vor fi efectuate în continuarea datelor existente&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Dacă operaţia de deschidere eşuează, funcţia returnează valoarea NULL. Dacă deschiderea&lt;br /&gt;
reuşeşte, funcţia returnează o valoare de tip FILE *.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fisier;&lt;br /&gt;
fisier = fopen(&amp;quot;exemplu.txt&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (fisier == NULL) {&lt;br /&gt;
    printf(&amp;quot;Fisierul nu poate fi creat.&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
    printf(&amp;quot;Fisierul a fost creat&amp;quot;);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În acest mod se confirmă și crearea corectă a fișierului, fiind o practică recomandată.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Închiderea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
După ce sunt folosite, fişierele trebuie închise. Atunci când execuţia programului se încheie cu succes &lt;br /&gt;
(fie prin încheierea execuţiei funcţiei main (), fie prin apelarea funcţiei exit() ), toate fişierele&lt;br /&gt;
deschise în momenul respectiv sunt automat închise.&lt;br /&gt;
Închiderea unui fişier se face cu funcţia fclose ().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fclose(FILE *fisier) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Funcţia fclose() returnează 0 dacă operaţia de închidere a fişierului s-a realizat cu succes şi EOF dacă a intervenit o eroare.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fisier;&lt;br /&gt;
fisier = fopen(&amp;quot;/work/pc/F/group1/ion/lab13/test.txt&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (fisier == NULL) {&lt;br /&gt;
    printf(&amp;quot;Fisierul nu a putut fi creat&amp;quot;);&lt;br /&gt;
} else { &lt;br /&gt;
    //... &lt;br /&gt;
    fclose(fisier); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parcurgerea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
Orice fişier, odată deschis, are asociat un cursor care indică poziţia curentă în fişierul respectiv (inițial această poziție este la începutul fişierului). Funcţiile de scriere şi citire din fişiere operează începand de la poziţia curentă a cursorului.&lt;br /&gt;
Totodată, orice operaţie de scriere sau citire avansează automat acest cursor cu numărul de octeţi citiţi/scrişi.&lt;br /&gt;
&lt;br /&gt;
Poziția curent este dată de funcția ftell():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int ftell(FILE *fisier) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poziţionarea cursorului pe o anumita poziţie se poate face folosind funcţia fseek():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fseek(FILE *fisier, long pozitie, int referinta) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În termeni uzuali se folosește long offset, int whence. Offset fiind numărul de octeți peste care se deplasează, iar whence poziția cursorului&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whence poate avea una din cele trei valori posibile:&lt;br /&gt;
*SEEK_SET = 0 - Căutarea se face de la începutul fişierului&lt;br /&gt;
*SEEK_CUR = 1 - Căutare din poziţia curentă&lt;br /&gt;
*SEEK_END = 2 - Căutare de la sfârşitul fişierului&lt;br /&gt;
&lt;br /&gt;
=== Citirea şi scrierea în/din fişiere ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
În cazul în care se lucrează cu fişiere text se folosesc în mod uzual următoarele funcţii:&lt;br /&gt;
*scriere: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fputs()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf()&amp;lt;/code&amp;gt;&lt;br /&gt;
*citire:  &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fgets()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Funcţiile &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf()&amp;lt;/code&amp;gt; funcţionează identic cu funcţiile &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;scanf()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;printf()&amp;lt;/code&amp;gt;, cu deosebirea că citirea respectiv scrierea se face operează asupra unui fişier specificat ca prim parametru:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fprintf(FILE *f, const char *format, ...);&lt;br /&gt;
int fscanf(FILE *f, const char *format, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcţiile recomandate pentru lucrul cu fişiere binare sunt urmatoarele:&lt;br /&gt;
*scriere: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fwrite()&amp;lt;/code&amp;gt;&lt;br /&gt;
*citire:  &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fread()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
size_t fread (void *ptr,size_t noct,size_t nr,FILE *f);&lt;br /&gt;
size_t fwrite (void *ptr,size_t noct,size_t nr,FILE *f); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exerciții ===&lt;br /&gt;
&lt;br /&gt;
#Să se scrie programul care citește de la tastatură un text de mai multe linii și îl scrie într-un fișier text.&lt;br /&gt;
#Să se scrie programul care citește un fișier text și îl afișeză linie cu linie.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_13&amp;diff=5068</id>
		<title>PC Laborator 13</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_13&amp;diff=5068"/>
		<updated>2017-01-11T20:29:38Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Informații generale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil să:&lt;br /&gt;
* să lucreze cu fișiere text: deschidere, citire, scriere, închidere&lt;br /&gt;
* să înțeleagă modul de funcționare al fișierelor binare&lt;br /&gt;
&lt;br /&gt;
== Informații generale ==&lt;br /&gt;
Datele pot fi stocate temporar în memoria internă, dar la închiderea programului acestea se vor pierde. Pentru suportul acestui dezavantaj se poate folosi noțiunea de fișier, desigur stocat in memoria externă. Memoria externă furnizează o capacitate de stocare mult mai mare decât memoria internă, nu este volatilă, deci nu-şi pierde conţinutul la o eventuală întrerupere, dar are ca principal dezavantaj viteza de transfer a datelor redusă.&lt;br /&gt;
&lt;br /&gt;
Prelucrarea unui fişier presupune asocierea acestuia cu un canal de I/E (numit flux sau &amp;#039;&amp;#039;&amp;#039;stream&amp;#039;&amp;#039;&amp;#039;).(vezi [[PC Laborator 3#Stream-urile standard ale unui proces|PC Laborator 3]]).&lt;br /&gt;
&lt;br /&gt;
Limbajul C permite operarea cu fişiere:&lt;br /&gt;
&lt;br /&gt;
*text   - fişier ce conţine o succesiune de linii&lt;br /&gt;
*binare - fişier conţine o succesiune de octeti, fără o structură.&lt;br /&gt;
&lt;br /&gt;
*&amp;quot;b&amp;quot;	- specifică fişier de tip binar&lt;br /&gt;
*&amp;quot;t&amp;quot;	- specifică fişier de tip text (implicit)&lt;br /&gt;
&lt;br /&gt;
== Operații cu fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a avea acces la informaţiile dintr-un fişier, se realizează următoarele operaţii: &lt;br /&gt;
* deschiderea fişierului &lt;br /&gt;
* citirea/scrierea conţinutului fişierului&lt;br /&gt;
* închiderea fisierului &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observatie:&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Operaţiile cu fişierele se realizează prin intermediul unui set de funcţii din &lt;br /&gt;
biblioteca standard de intrare/ieşire (I/O), deci este necasară includerea fişierului header &amp;#039;&amp;#039;&amp;#039;stdio.h&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Atunci când intenționăm să lucrăm cu fişiere este necesar să ne definim un pointer către o structură de tipul FILE.&lt;br /&gt;
O structură de tipul FILE este o structură de control a streamurilor.&lt;br /&gt;
Această structură păstrează informaţii cum ar fi adresa de început, poziţia indicatorului de fişier, poziţia indicatorului de sfârşit a fişierului și altele.&lt;br /&gt;
Pentru a se putea utiliza un fişier, este necesară folosirea unui pointer. Acesta este un pointer către anumite informaţii&lt;br /&gt;
despre fişierul respectiv – nume, starea şi poziţia în care se află poinetrul de fişier.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE * fisier; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Deschiderea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
Fişierele necesită a fi inițializate, le trebuie asociat un fişier fizic de pe dispozitivul de stocare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fopen(const char *nume_fișier, const char *mod);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:FILE -returnează un pointer la fișier&lt;br /&gt;
:nume_fișiere -se specifică numele sau calea acestuia&lt;br /&gt;
:mod -se specifică modul de deschidere al fișierului&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Moduri de deschidere al fișierelor:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;r&amp;quot;	- (read only), permite deschiderea doar pentru citirea conținutului&lt;br /&gt;
* &amp;quot;w&amp;quot;	- (write), crează un nou fişier în care se pot scrie date. Dacă exista deja un fișier cu acest nume,conținutul va fi sters&lt;br /&gt;
* &amp;quot;a&amp;quot;	- (append), deschide pentru scriere într-un fişier existent (scrierea se va face în continuare)-adăugare-&lt;br /&gt;
* &amp;quot;r+&amp;quot;  - deschide un fişier pentru actualizarea datelor,permite atât scriere cât şi citire&lt;br /&gt;
* &amp;quot;w+&amp;quot;  - crează un fişier nou în care se vor putea scrie cât şi citi date. &lt;br /&gt;
* &amp;quot;a+&amp;quot;  - deschide un fişier pentru adăugare de date cât şipentru citire. Operațiile de scriere vor fi efectuate în continuarea datelor existente&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Dacă operaţia de deschidere eşuează, funcţia returnează valoarea NULL. Dacă deschiderea&lt;br /&gt;
reuşeşte, funcţia returnează o valoare de tip FILE *.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fisier;&lt;br /&gt;
fisier = fopen (&amp;quot;exemplu.txt&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (fisier == NULL){&lt;br /&gt;
    printf (&amp;quot;Fisierul nu poate fi creat.&amp;quot;);&lt;br /&gt;
}else{&lt;br /&gt;
    printf (&amp;quot;Fisierul a fost creat&amp;quot;);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În acest mod se confirmă și crearea corectă a fișierului, fiind o practică recomandată&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Închiderea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
După ce sunt folosite, fişierele trebuie închise. Atunci când execuţia programului se încheie cu succes &lt;br /&gt;
(fie prin încheierea execuţiei funcţiei main (), fie prin apelarea funcţiei exit() ), toate fişierele&lt;br /&gt;
deschise în momenul respectiv sunt automat închise.&lt;br /&gt;
Închiderea unui fişier se face cu funcţia fclose ().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fclose (FILE *fisier) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Funcţia fclose () returnează 0 dacă operaţia de închidere a fişierului s-a realizat cu succes şi EOF dacă a intervenit o eroare.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fisier;&lt;br /&gt;
fisier=fopen(&amp;quot;/work/pc/F/group1/ion/lab13/test.txt&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (fisier==NULL){&lt;br /&gt;
    printf(&amp;quot;Fisierul nu a putut fi creat&amp;quot;);&lt;br /&gt;
}else{ &lt;br /&gt;
    //... &lt;br /&gt;
    fclose(fisier); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parcurgerea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
Orice fişier, odată deschis, are asociat un cursor care indică poziţia curentă în fişierul respectiv (inițial această poziție este la începutul fişierului). Funcţiile de scriere şi citire din fişiere operează începand de la poziţia curentă a cursorului.&lt;br /&gt;
Totodată, orice operaţie de scriere sau citire avansează automat acest cursor cu numărul de octeţi citiţi/scrişi.&lt;br /&gt;
&lt;br /&gt;
Poziția curent este dată de funcția ftell():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int ftell (FILE *fisier) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poziţionarea cursorului pe o anumita poziţie se poate face folosind funcţia fseek():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fseek (FILE *fisier, long pozitie, int referinta) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În termeni uzuali se folosește long offset, int whence.Offset fiind numărul de octeți peste care se deplasează,iar whence poziția cursorului&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whence poate avea una din cele trei valori posibile:&lt;br /&gt;
*SEEK_SET = 0 - Căutarea se face de la începutul fişierului&lt;br /&gt;
*SEEK_CUR = 1 - Căutare din poziţia curentă&lt;br /&gt;
*SEEK_END = 2 - Căutare de la sfârşitul fişierului&lt;br /&gt;
&lt;br /&gt;
=== Citirea şi scrierea în/din fişiere ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
În cazul în care se lucrează cu fişiere text se folosesc în mod uzual următoarele funcţii:&lt;br /&gt;
*scriere: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fputs()&amp;lt;/code&amp;gt; () şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf()&amp;lt;/code&amp;gt;&lt;br /&gt;
*citire:  &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fgets()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Funcţiile &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf()&amp;lt;/code&amp;gt; funcţionează identic cu funcţiile &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;scanf()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;printf()&amp;lt;/code&amp;gt;, cu deosebirea că citirea respectiv scrierea se face operează asupra unui fişier specificat ca prim parametru:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fprintf(FILE *f, const char *format, ...);&lt;br /&gt;
int fscanf(FILE *f, const char *format, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcţiile recomandate pentru lucrul cu fişiere binare sunt urmatoarele:&lt;br /&gt;
*scriere: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fwrite()&amp;lt;/code&amp;gt;&lt;br /&gt;
*citire:  &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fread()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
size_t fread (void *ptr,size_t noct,size_t nr,FILE *f);&lt;br /&gt;
size_t fwrite (void *ptr,size_t noct,size_t nr,FILE *f); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exerciții ===&lt;br /&gt;
&lt;br /&gt;
#Să se scrie programul care citește de la tastatură un text de mai multe linii și îl scrie într-un fișier text.&lt;br /&gt;
#Să se scrie programul care citește un fișier text și îl afișeză linie cu linie.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_13&amp;diff=5067</id>
		<title>PC Laborator 13</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_13&amp;diff=5067"/>
		<updated>2017-01-11T20:28:51Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Obiective */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil să:&lt;br /&gt;
* să lucreze cu fișiere text: deschidere, citire, scriere, închidere&lt;br /&gt;
* să înțeleagă modul de funcționare al fișierelor binare&lt;br /&gt;
&lt;br /&gt;
== Informații generale ==&lt;br /&gt;
Datele pot fi stocate temporar în memoria internă,dar la închiderea programului acestea se vor pierde. Pentru suportul acestui dezavantaj se poate folosii noțiunea de fișier,desigur stocat in memoria externă. Memoria externă furnizează o capacitate de stocare mult mai mare decât memoria internă, nu este volatilă deci nu-şi pierde conţinutul la o eventuală întrerupere, dar are ca principal dezavantaj viteza de transfer a datelor redusă.&lt;br /&gt;
&lt;br /&gt;
Prelucrarea unui fişier presupune asocierea acestuia cu un canal de I/E (numit flux sau &amp;#039;&amp;#039;&amp;#039;stream&amp;#039;&amp;#039;&amp;#039;).(vezi [[PC Laborator 3#Stream-urile standard ale unui proces|PC Laborator 3]]).&lt;br /&gt;
&lt;br /&gt;
Limbajul C permite operarea cu fişiere:&lt;br /&gt;
&lt;br /&gt;
*text   - fişier ce conţine o succesiune de linii&lt;br /&gt;
*binare - fişier conţine o succesiune de octeti, fără o structură.&lt;br /&gt;
&lt;br /&gt;
*&amp;quot;b&amp;quot;	- specifică fişier de tip binar&lt;br /&gt;
*&amp;quot;t&amp;quot;	- specifică fişier de tip text (implicit)&lt;br /&gt;
&lt;br /&gt;
== Operații cu fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a avea acces la informaţiile dintr-un fişier, se realizează următoarele operaţii: &lt;br /&gt;
* deschiderea fişierului &lt;br /&gt;
* citirea/scrierea conţinutului fişierului&lt;br /&gt;
* închiderea fisierului &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observatie:&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Operaţiile cu fişierele se realizează prin intermediul unui set de funcţii din &lt;br /&gt;
biblioteca standard de intrare/ieşire (I/O), deci este necasară includerea fişierului header &amp;#039;&amp;#039;&amp;#039;stdio.h&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Atunci când intenționăm să lucrăm cu fişiere este necesar să ne definim un pointer către o structură de tipul FILE.&lt;br /&gt;
O structură de tipul FILE este o structură de control a streamurilor.&lt;br /&gt;
Această structură păstrează informaţii cum ar fi adresa de început, poziţia indicatorului de fişier, poziţia indicatorului de sfârşit a fişierului și altele.&lt;br /&gt;
Pentru a se putea utiliza un fişier, este necesară folosirea unui pointer. Acesta este un pointer către anumite informaţii&lt;br /&gt;
despre fişierul respectiv – nume, starea şi poziţia în care se află poinetrul de fişier.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE * fisier; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Deschiderea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
Fişierele necesită a fi inițializate, le trebuie asociat un fişier fizic de pe dispozitivul de stocare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fopen(const char *nume_fișier, const char *mod);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:FILE -returnează un pointer la fișier&lt;br /&gt;
:nume_fișiere -se specifică numele sau calea acestuia&lt;br /&gt;
:mod -se specifică modul de deschidere al fișierului&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Moduri de deschidere al fișierelor:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;r&amp;quot;	- (read only), permite deschiderea doar pentru citirea conținutului&lt;br /&gt;
* &amp;quot;w&amp;quot;	- (write), crează un nou fişier în care se pot scrie date. Dacă exista deja un fișier cu acest nume,conținutul va fi sters&lt;br /&gt;
* &amp;quot;a&amp;quot;	- (append), deschide pentru scriere într-un fişier existent (scrierea se va face în continuare)-adăugare-&lt;br /&gt;
* &amp;quot;r+&amp;quot;  - deschide un fişier pentru actualizarea datelor,permite atât scriere cât şi citire&lt;br /&gt;
* &amp;quot;w+&amp;quot;  - crează un fişier nou în care se vor putea scrie cât şi citi date. &lt;br /&gt;
* &amp;quot;a+&amp;quot;  - deschide un fişier pentru adăugare de date cât şipentru citire. Operațiile de scriere vor fi efectuate în continuarea datelor existente&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Dacă operaţia de deschidere eşuează, funcţia returnează valoarea NULL. Dacă deschiderea&lt;br /&gt;
reuşeşte, funcţia returnează o valoare de tip FILE *.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fisier;&lt;br /&gt;
fisier = fopen (&amp;quot;exemplu.txt&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (fisier == NULL){&lt;br /&gt;
    printf (&amp;quot;Fisierul nu poate fi creat.&amp;quot;);&lt;br /&gt;
}else{&lt;br /&gt;
    printf (&amp;quot;Fisierul a fost creat&amp;quot;);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În acest mod se confirmă și crearea corectă a fișierului, fiind o practică recomandată&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Închiderea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
După ce sunt folosite, fişierele trebuie închise. Atunci când execuţia programului se încheie cu succes &lt;br /&gt;
(fie prin încheierea execuţiei funcţiei main (), fie prin apelarea funcţiei exit() ), toate fişierele&lt;br /&gt;
deschise în momenul respectiv sunt automat închise.&lt;br /&gt;
Închiderea unui fişier se face cu funcţia fclose ().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fclose (FILE *fisier) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Funcţia fclose () returnează 0 dacă operaţia de închidere a fişierului s-a realizat cu succes şi EOF dacă a intervenit o eroare.&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
FILE *fisier;&lt;br /&gt;
fisier=fopen(&amp;quot;/work/pc/F/group1/ion/lab13/test.txt&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (fisier==NULL){&lt;br /&gt;
    printf(&amp;quot;Fisierul nu a putut fi creat&amp;quot;);&lt;br /&gt;
}else{ &lt;br /&gt;
    //... &lt;br /&gt;
    fclose(fisier); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parcurgerea fișierelor ===&lt;br /&gt;
&lt;br /&gt;
Orice fişier, odată deschis, are asociat un cursor care indică poziţia curentă în fişierul respectiv (inițial această poziție este la începutul fişierului). Funcţiile de scriere şi citire din fişiere operează începand de la poziţia curentă a cursorului.&lt;br /&gt;
Totodată, orice operaţie de scriere sau citire avansează automat acest cursor cu numărul de octeţi citiţi/scrişi.&lt;br /&gt;
&lt;br /&gt;
Poziția curent este dată de funcția ftell():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int ftell (FILE *fisier) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poziţionarea cursorului pe o anumita poziţie se poate face folosind funcţia fseek():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fseek (FILE *fisier, long pozitie, int referinta) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În termeni uzuali se folosește long offset, int whence.Offset fiind numărul de octeți peste care se deplasează,iar whence poziția cursorului&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whence poate avea una din cele trei valori posibile:&lt;br /&gt;
*SEEK_SET = 0 - Căutarea se face de la începutul fişierului&lt;br /&gt;
*SEEK_CUR = 1 - Căutare din poziţia curentă&lt;br /&gt;
*SEEK_END = 2 - Căutare de la sfârşitul fişierului&lt;br /&gt;
&lt;br /&gt;
=== Citirea şi scrierea în/din fişiere ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
În cazul în care se lucrează cu fişiere text se folosesc în mod uzual următoarele funcţii:&lt;br /&gt;
*scriere: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fputs()&amp;lt;/code&amp;gt; () şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf()&amp;lt;/code&amp;gt;&lt;br /&gt;
*citire:  &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fgets()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Funcţiile &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf()&amp;lt;/code&amp;gt; funcţionează identic cu funcţiile &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;scanf()&amp;lt;/code&amp;gt; şi &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;printf()&amp;lt;/code&amp;gt;, cu deosebirea că citirea respectiv scrierea se face operează asupra unui fişier specificat ca prim parametru:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int fprintf(FILE *f, const char *format, ...);&lt;br /&gt;
int fscanf(FILE *f, const char *format, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcţiile recomandate pentru lucrul cu fişiere binare sunt urmatoarele:&lt;br /&gt;
*scriere: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fwrite()&amp;lt;/code&amp;gt;&lt;br /&gt;
*citire:  &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fread()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
size_t fread (void *ptr,size_t noct,size_t nr,FILE *f);&lt;br /&gt;
size_t fwrite (void *ptr,size_t noct,size_t nr,FILE *f); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exerciții ===&lt;br /&gt;
&lt;br /&gt;
#Să se scrie programul care citește de la tastatură un text de mai multe linii și îl scrie într-un fișier text.&lt;br /&gt;
#Să se scrie programul care citește un fișier text și îl afișeză linie cu linie.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_12&amp;diff=5021</id>
		<title>PC Laborator 12</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_12&amp;diff=5021"/>
		<updated>2016-12-21T18:31:49Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Evitarea pierderilor de memorie - valgrind */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
&lt;br /&gt;
La sfârșitul acestui laborator studenții vor fi capabili:&lt;br /&gt;
* să definească și să utilizeze tipuri de date pointer;&lt;br /&gt;
* să folosească pointeri pentru a putea modifica variabilele trimise ca argumente unor funcții;&lt;br /&gt;
* să aloce, să folosească și să elibereze memorie HEAP, în mod dinamic;&lt;br /&gt;
* să utilizeze aritmetica pointerilor pentru a itera peste elemente de la adrese consecutive de memorie; &lt;br /&gt;
* să utilizeze &amp;lt;code&amp;gt;valgrind&amp;lt;/code&amp;gt; pentru a diagnostica pierderile de memorie.&lt;br /&gt;
&lt;br /&gt;
= Tipuri de date pointer =&lt;br /&gt;
&lt;br /&gt;
 Un &amp;#039;&amp;#039;&amp;#039;pointer&amp;#039;&amp;#039;&amp;#039; reprezintă o variabilă care stochează o adresă în memoria dedicată aplicației. Tipul variabilei de tip pointer specifică tipul datei care poate fi citit de la adresa respectivă.&lt;br /&gt;
&lt;br /&gt;
O variabilă de tip pointer se definește în felul următor:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tip_data&amp;gt; * &amp;lt;nume_variabila&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Spre exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int * pa;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variabila de tip pointer &amp;lt;code&amp;gt;pa&amp;lt;/code&amp;gt; nu memorează un întreg, ci o adresă în memorie, iar de la adresa respectivă se poate citi un întreg. Acest lucru se numește indirectare simplă. În plus, deoarece tipul pointer este în sine un tip de dată, și în definiția unui pointer &amp;lt;tip_data&amp;gt; poate fi un pointer, aceasta permite următoarele construcții:&lt;br /&gt;
* &amp;lt;code&amp;gt;int * pa;&amp;lt;/code&amp;gt; - variabilă ce stochează o adresă de unde se poate citi un întreg (indirectare simplă);&lt;br /&gt;
* &amp;lt;code&amp;gt;int ** pa;&amp;lt;/code&amp;gt; - variabilă ce stochează o adresă de unde se poate citi o adresă de unde se poate citi un întreg (dublă indirectare);&lt;br /&gt;
* &amp;lt;code&amp;gt;int *** pa;&amp;lt;/code&amp;gt; - variabilă ce stochează o adresă de unde se poate citi o adresă de unde se poate citi o adresă de unde se poate citi un întreg (triplă indirectare);&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Regulă:&amp;lt;/span&amp;gt; Orice variabilă este stocată în memorie și deci are o adresă în memorie.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În C există un tip de dată pointer care poate memora o adresă fără a ști ce date se află la adresa respectivă. Acest tip de pointer este &amp;lt;code&amp;gt;void*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Dimensiunea tipului de date pointer ==&lt;br /&gt;
&lt;br /&gt;
Conform regulii de mai sus, și variabilele de tip pointer ocupă loc în memorie, deci au dimensiune, în octeți. Un pointer nu oferă informații legate de dimensiunea ocupată de datele de la adresa respectivă, ci doar adresa de unde începe zona ocupată. Din moment ce un pointer memorează doar o adresă, dimensiunea variabilelor de tip pointer nu depinde decât de dimensiunea spațiului de memorie. Astfel, pentru procesoare și sisteme de operare pe 32 de biți, o variabilă de tip pointer va avea 32 de biți, iar pe procesoare și sisteme de operare pe 64 de biți, o variabilă de tip pointer va avea 64 de biți.&lt;br /&gt;
&lt;br /&gt;
== Adresa unei variabile ==&lt;br /&gt;
&lt;br /&gt;
Operatorul care permite aflarea adresei unde este stocată o variabilă este ampersand (&amp;amp;). Acesta este un operator unar ce se plasează înaintea unei variabile iar rezultatul evaluării sale este adresa unde este stocată variabila respectivă. Această adresă poate fi stocată într-o altă variabilă de tipul corespunzător. Altfel spus, pentru o variabilă de tip &amp;#039;&amp;#039;tip_data&amp;#039;&amp;#039;, adresa acesteia se poate stoca într-o variabilă de tip &amp;#039;&amp;#039;tip_data *&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float floatValue;&lt;br /&gt;
float * floatAddress = &amp;amp;floatValue;&lt;br /&gt;
&lt;br /&gt;
int intValue;&lt;br /&gt;
int * intAddress = &amp;amp;intValue;&lt;br /&gt;
int ** intPointerAddress = &amp;amp;intAddress;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Adresa NULL ==&lt;br /&gt;
&lt;br /&gt;
Pentru orice aplicație, adresa 0 din spațiul ei de memorie este rezervată. Aceasta nu poate fi nici scrisă și nici citită. Această adresa poartă numele de &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;. Orice variabilă de tip pointer poate lua valoarea &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;, lucru care de obicei specifică faptul că de fapt variabila pointer nu stochează o adresă validă.&lt;br /&gt;
&lt;br /&gt;
 Constanta &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039; este definită în fișierul header &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;stdlib.h&amp;lt;/code&amp;gt; (Standard Library).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    char * charPointer = NULL;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Valoarea de la o adresă ==&lt;br /&gt;
&lt;br /&gt;
Având o variabilă de tip pointer, valoarea stocată în memorie la adresa respectivă se poate afla folosind caracterul steluță (*), numit și operator de indirectare. Acesta este un operator unar ce se plasează înaintea unei variabile de tip pointer iar rezultatul evaluării sale este valoarea din memorie de la adresa stocată în variabila respectivă. Această valoare poate fi stocată într-o altă variabilă de tipul corespunzător. Altfel spus, pentru o variabilă pointer de tip &amp;#039;&amp;#039;tip_data *&amp;#039;&amp;#039;, valoarea de la adresa stocată de pointerul respectiv se poate memora într-o altă variabilă de tip &amp;#039;&amp;#039;tip_data&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float floatValue;&lt;br /&gt;
float * floatAddress = &amp;amp;floatValue;&lt;br /&gt;
float anotherFloatValue = *floatAddress;&lt;br /&gt;
&lt;br /&gt;
int intValue;&lt;br /&gt;
int * intAddress = &amp;amp;intValue;&lt;br /&gt;
int ** intPointerAddress = &amp;amp;intAddress;&lt;br /&gt;
int * anotherintAddress = *intPointerAddress;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Accesarea valorii de la o adresă se numește dereferențiere. Dereferențierea unei adrese care nu face parte din spațiul de memorie al aplicației sau dereferențierea lui &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039; va avea ca efect oprirea imediată a programului printr-un &amp;#039;&amp;#039;Segmentation fault.&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Nu confundați steluța utilizată la definirea unui pointer cu operatorul de indirectare/ dereferențiere. Aceștia sunt la fel de diferiți cum este și operatorul de inmulțire față de cel de indirectare.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Utilitatea variabilelor de tip pointer =&lt;br /&gt;
&lt;br /&gt;
Pointerii în C au două roluri foarte importante:&lt;br /&gt;
# Alocarea dinamică de memorie în HEAP&lt;br /&gt;
# Modificarea variabilelor parametri ale unor funcții astfel încât modificarea să se păstreze în afara funcției&lt;br /&gt;
&lt;br /&gt;
== Alocarea dinamică de memorie ==&lt;br /&gt;
&lt;br /&gt;
Memoria alocată unei aplicații de către sistemul de operare este împărțită în mai multe secțiuni, dintre care importante pentru stocarea de date sunt:&lt;br /&gt;
&lt;br /&gt;
* Segmentele BSS și Data - reprezintă memoria alocată pentru variabilele statice (globale), care există de la începutul până la încheierea programului, fără posibilitate de eliberare;&lt;br /&gt;
* Stiva (Stack) - zona de memorie în care se alocă contextele funcțiilor apelate în timpul execuției programului și în care se alocă argumentele și variabilele locale are funcțiilor; această zonă este alocată la intrarea în funcție și este eliberată la ieșirea din funcție;&lt;br /&gt;
* HEAP - zonă de memorie în care se pot aloca dinamic, de către programator, blocuri de memorie ce pot fi folosite în program până la eliberarea acestora de către programator.&lt;br /&gt;
&lt;br /&gt;
Alocarea și dezalocarea memoriei în heap se fac folosind următoarele funcții:&lt;br /&gt;
* &amp;lt;code&amp;gt;void * malloc(unsigned size)&amp;lt;/code&amp;gt; - alocă &amp;#039;&amp;#039;size&amp;#039;&amp;#039; octeți într-o zonă continuă din HEAP și întoarce adresa de memorie unde începe zona respectivă; dacă alocarea eșuează (nu exită suficientă memorie într-o zonă continuă în HEAP), funcția va întoarce &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;; alocarea nu șterge conținutul memoriei respective;&lt;br /&gt;
* &amp;lt;code&amp;gt;void * calloc(unsigned elements, unsigned elementSize)&amp;lt;/code&amp;gt; - alocă &amp;#039;&amp;#039;elements&amp;#039;&amp;#039; elemente de &amp;#039;&amp;#039;elementSize&amp;#039;&amp;#039; octeți fiecare într-o zonă continuă din HEAP și întoarce adresa de memorie unde începe zona respectivă; dacă alocarea eșuează (nu exită suficientă memorie într-o zonă continuă în HEAP), funcția va întoarce &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;; alocarea șterge tot conținutul memoriei respective, scriind 0 la fiecare locație;&lt;br /&gt;
* &amp;lt;code&amp;gt;void free (void *)&amp;lt;/code&amp;gt; - dezalocă o zonă de memorie alocată în prealabil cu &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;calloc&amp;lt;/code&amp;gt;; apelul succesiv de două sau mai multe ori a funcției &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt; pentru aceeași zonă de memorie sau apelul ei pentru o adresă care nu a fost alocată în prealabil va avea ca efect oprirea imediată a programului cu eroare (&amp;#039;&amp;#039;double free or corruption&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
Toate aceste funcții sunt definite în fișierul header &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;stdlib.h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int * intPointer;&lt;br /&gt;
    short * shortPointer;&lt;br /&gt;
&lt;br /&gt;
    intPointer = (int*) malloc(sizeof(int));&lt;br /&gt;
    shortPointer = (short*) calloc(1, sizeof(short));&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Valoarea din zona alocata pentru int este: %d\n&amp;quot;, *intPointer);&lt;br /&gt;
    printf(&amp;quot;Valoarea din zona alocata pentru short este: %hd\n&amp;quot;, *shortPointer);&lt;br /&gt;
&lt;br /&gt;
    free(intPointer);&lt;br /&gt;
    free(shortPointer);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Deoarece funcțiile &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;calloc&amp;lt;/code&amp;gt; au doar rolul de a aloca memorie, fără să știe care este scopul utilizării acestei memorii, ele întorc un pointer de tip &amp;lt;code&amp;gt;void *&amp;lt;/code&amp;gt;. Astfel, pentru a putea stoca adresa într-un alt tip de pointer (de exemplu &amp;lt;code&amp;gt;int *&amp;lt;/code&amp;gt;), ea trebuie convertită la tipul de date corect. Aceasta este explicația prezenței operatorului de cast din fața apelului funcțiilor &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;calloc&amp;lt;/code&amp;gt; din codul de mai sus.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aritmetica pointerilor ==&lt;br /&gt;
&lt;br /&gt;
Când se alocă memorie in HEAP, rareori se alocă pentru un singur element, de cele mai multe ori se alocă pentru un număr mare de elemente de același fel. Ca exemplu, dacă vrem să stocăm o imagine High Definition, ne trebuie o zonă de memorie care să poată memora informație de culoare pentru 1920 * 1080 de pixeli, fiecare pixel având informație de culoare pentru roșu, verde și albastru (RGB). Fiecare din aceste componente de culoare se stochează pe un octet ca valoare întreagă fără semn (unsigned char). Prin urmare, pentru un frame se vor aloca 1920 * 1080 * 3 octeți = 6220800, aproape 6 MB. Această memorie se alocă întotdeauna într-o zonă continuă de către funcțiile &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;calloc&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    unsigned char * frame;&lt;br /&gt;
    frame = (unsigned char*) malloc(1920 * 1080 * 3 * sizeof(unsigned char));&lt;br /&gt;
    //... use frame&lt;br /&gt;
&lt;br /&gt;
    free (frame);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deoarece pointer-ul nu memorează decât adresa de început a zonei de memorie, există posibilitatea de a modifica adresa pentru a accesa elementele ulterioare. În acest scop, variabilele de tip pointer suportă doar operații aritmetice de adunare sau scădere, nu și de înmulțire sau împărțire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Incrementarea unui pointer nu crește adresa cu 1, ci cu dimensiunea tipului de dată al pointer-ului. Deci pentru un &amp;lt;code&amp;gt;int * p;&amp;lt;/code&amp;gt;, linia &amp;lt;code&amp;gt;p++;&amp;lt;/code&amp;gt; va incrementa adresa cu 4 (sizeof(int)):&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int * pointer;&lt;br /&gt;
    pointer = (int*) malloc(10 * sizeof(int));&lt;br /&gt;
    printf(&amp;quot;The pointer address is: %p\n&amp;quot;, pointer);&lt;br /&gt;
    printf(&amp;quot;The pointer address + 1 is: %p\n&amp;quot;, pointer + 1);&lt;br /&gt;
    free (pointer);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție &amp;lt;/span&amp;gt; ca prin operații pe pointeri să nu depășiți zona de memorie alocată.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pointerii și vectorii ==&lt;br /&gt;
&lt;br /&gt;
Memoria alocată pentru mai multe elemente de același fel reprezintă de fapt un vector de elemente de acel tip. Astfel aflăm că de fapt vectorii și pointerii, în multe situații se pot folosi interschimbabil.&lt;br /&gt;
&lt;br /&gt;
 Când se definește un vector, numele vectorului reprezintă un pointer la adresa de unde începe zona lui de memorie, adică adresa unde este memorat elementul de la indexul 0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int array[10];&lt;br /&gt;
    array[0] = 13;&lt;br /&gt;
    printf(&amp;quot;The array pointer address is: %p\n&amp;quot;, array);&lt;br /&gt;
    printf(&amp;quot;The value at address %p is %d\n&amp;quot;, array, *array);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Dereferențierea unui pointer indexat cu o valoare este echivalentă cu folosirea operatorului de acces la vector: &amp;lt;code&amp;gt;*(v + k)&amp;lt;/code&amp;gt; == &amp;lt;code&amp;gt;v[k]&amp;lt;/code&amp;gt;, unde &amp;#039;&amp;#039;&amp;#039;v&amp;#039;&amp;#039;&amp;#039; este un pointer (sau vector) iar &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039; este un întreg.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; highlight=&amp;quot;14,18&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    int arraySize;&lt;br /&gt;
    printf(&amp;quot;size = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;arraySize);&lt;br /&gt;
&lt;br /&gt;
    int * heapArray;&lt;br /&gt;
    heapArray = (int*) malloc(arraySize * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    int i;&lt;br /&gt;
    for(i = 0; i &amp;lt; arraySize; i++) {&lt;br /&gt;
        printf(&amp;quot;heapArray[%d] = &amp;quot;, i);&lt;br /&gt;
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;heapArray[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for(i = 0; i &amp;lt; arraySize; i++) {&lt;br /&gt;
        printf(&amp;quot;heapArray[%d] = %d\n&amp;quot;, i, *(heapArray + i));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    free (heapArray);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pointerii și structurile ==&lt;br /&gt;
&lt;br /&gt;
Ca orice tip de dată, și variabilele de tip structură ocupă loc în memorie și deci pot exista pointeri de tip structură:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct Test {&lt;br /&gt;
    int intField;&lt;br /&gt;
    float floatField;&lt;br /&gt;
    char charField;&lt;br /&gt;
    char charArrayField[100];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    struct Test testStructVar;&lt;br /&gt;
    struct Test * structPointer = &amp;amp;testStructVar;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Având un pointer la o structură, accesul la câmpuri se poate face în două moduri:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Dereferențierea pointerului pentru a obține &amp;quot;valoarea&amp;quot; structurii și apoi utilizarea operatorului &amp;quot;.&amp;quot; pentru accesul la membri:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; highlight=&amp;quot;12&amp;quot;&amp;gt;&lt;br /&gt;
struct Test {&lt;br /&gt;
    int intField;&lt;br /&gt;
    float floatField;&lt;br /&gt;
    char charField;&lt;br /&gt;
    char charArrayField[100];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    struct Test testStructVar;&lt;br /&gt;
    struct Test * structPointer = &amp;amp;testStructVar;&lt;br /&gt;
&lt;br /&gt;
    *structPointer.intField = 10;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Accesul la membrii unei structuri accesate printr-un pointer este atât de popular și des întâlnit în C încât există un operator special care permite accesul la câmpuri fără dereferențiere. Acest operator este săgeata &amp;quot;-&amp;gt;&amp;quot;: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; highlight=&amp;quot;13,14&amp;quot;&amp;gt;&lt;br /&gt;
struct Test {&lt;br /&gt;
    int intField;&lt;br /&gt;
    float floatField;&lt;br /&gt;
    char charField;&lt;br /&gt;
    char charArrayField[100];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    struct Test testStructVar;&lt;br /&gt;
    struct Test * structPointer = &amp;amp;testStructVar;&lt;br /&gt;
&lt;br /&gt;
    *structPointer.intField = 10;&lt;br /&gt;
    structPointer-&amp;gt;floatField = 4.3;&lt;br /&gt;
    structPointer-&amp;gt;charField = &amp;#039;B&amp;#039;;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alocarea memoriei în HEAP pentru structuri se face identic cu alocarea pentru tipurile primitive de date:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; highlight=&amp;quot;10, 14&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
struct Test {&lt;br /&gt;
    int intField;&lt;br /&gt;
    float floatField;&lt;br /&gt;
    char charField;&lt;br /&gt;
    char charArrayField[100];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    struct Test * structPointer = (struct Test*) malloc(sizeof(struct Test));&lt;br /&gt;
&lt;br /&gt;
    // use structPointer&lt;br /&gt;
&lt;br /&gt;
    free(structPointer);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Adrese ca argumente de funcție ==&lt;br /&gt;
&lt;br /&gt;
Știm deja că în C argumentele funcțiilor sunt pass-by-value, asta înseamnă că funcției i se transmite valoarea dintr-o variabilă, nu variabila în sine. Astfel, dacă o variabilă este folosită ca argument la apelul unei funcții, modificarea argumentului în funcție nu se propagă și spre variabila sursă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void divideByTwo(int arg) {&lt;br /&gt;
    printf(&amp;quot;Argument before division = %d\n&amp;quot;, arg);&lt;br /&gt;
    arg /= 2;&lt;br /&gt;
    printf(&amp;quot;Argument after division = %d\n&amp;quot;, arg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int var = 10;&lt;br /&gt;
    divideByTwo(var);&lt;br /&gt;
    printf(&amp;quot;Variabile after function call = %d\n&amp;quot;, var);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Există o soluție pentru a permite propagarea modificării spre variabila sursă, și anume în loc de a trimite ca argument funcției variabila, se transmite adresa variabilei. Asta permite funcției să scrie direct în memoria alocată pentru variabilă și deci să-i modifice valoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void divideByTwo(int *arg) {&lt;br /&gt;
    printf(&amp;quot;Argument before division = %d\n&amp;quot;, *arg);&lt;br /&gt;
    *arg /= 2;&lt;br /&gt;
    printf(&amp;quot;Argument after division = %d\n&amp;quot;, *arg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int var = 10;&lt;br /&gt;
    divideByTwo(&amp;amp;var);&lt;br /&gt;
    printf(&amp;quot;Variabile after function call = %d\n&amp;quot;, var);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Evitarea pierderilor de memorie - &amp;lt;code&amp;gt;valgrind&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pierderile de memorie (memory leaks) apar atunci când programatorul alocă memorie, dar uită să o elibereze. Aceasta este o problemă foarte delicată pentru că aplicația va continua să aloce până când va depăși limitele permise și sistemul de operare va opri procesul forțat. Chiar și dacă nu se ajunge acolo, ocuparea de cantități mari de memorie va face ca tot sistemul să se miște din ce în ce mai greu (vezi versiunile vechi de Firefox):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    char * buffer = (char*) malloc(100 * sizeof(char));&lt;br /&gt;
    buffer = NULL;&lt;br /&gt;
    printf(&amp;quot;Done!\n&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai sus este alocat un buffer de 100 de bytes, iar adresa către zona respectivă se pierde când pointerului buffer i se atribuie valoarea &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;. Astfel, acea memorie nu mai poate fi nici accesată și nici eliberată. Cu toate acestea, programul compilează și rulează fără probleme. Pentru a verifica că nu există pierderi de memorie, se poate folosi programul &amp;lt;code&amp;gt;valgrind&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-weight: bold&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;rhobincu@IronMan&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/work/pc/test $&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; valgrind --leak-check=full ./test&lt;br /&gt;
 ==6076== Memcheck, a memory error detector&lt;br /&gt;
 ==6076== Copyright (C) 2002-2013, and GNU GPL&amp;#039;d, by Julian Seward et al.&lt;br /&gt;
 ==6076== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info&lt;br /&gt;
 ==6076== Command: ./test&lt;br /&gt;
 ==6076== &lt;br /&gt;
 Done!&lt;br /&gt;
 ==6076== &lt;br /&gt;
 ==6076== HEAP SUMMARY:&lt;br /&gt;
 ==6076==     in use at exit: 100 bytes in 1 blocks&lt;br /&gt;
 ==6076==   total heap usage: 1 allocs, 0 frees, 100 bytes allocated&lt;br /&gt;
 ==6076== &lt;br /&gt;
 ==6076== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1&lt;br /&gt;
 ==6076==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)&lt;br /&gt;
 ==6076==    by 0x40058E: main (test.c:5)&lt;br /&gt;
 ==6076== &lt;br /&gt;
 ==6076== LEAK SUMMARY:&lt;br /&gt;
 ==6076==    definitely lost: 100 bytes in 1 blocks&lt;br /&gt;
 ==6076==    indirectly lost: 0 bytes in 0 blocks&lt;br /&gt;
 ==6076==      possibly lost: 0 bytes in 0 blocks&lt;br /&gt;
 ==6076==    still reachable: 0 bytes in 0 blocks&lt;br /&gt;
 ==6076==         suppressed: 0 bytes in 0 blocks&lt;br /&gt;
 ==6076== &lt;br /&gt;
 ==6076== For counts of detected and suppressed errors, rerun with: -v&lt;br /&gt;
 ==6076== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Observație: &amp;lt;/span&amp;gt; Ca valgrind să poată afișa numărul liniei și fișierul sursă unde apare eroarea, codul trebuie compilat cu simboluri de debug (-g).&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru un cod corect, ieșirea lui &amp;#039;&amp;#039;&amp;#039;valgrind&amp;#039;&amp;#039;&amp;#039; este:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    char * buffer = (char*) malloc(100 * sizeof(char));&lt;br /&gt;
    free(buffer);&lt;br /&gt;
    buffer = NULL;&lt;br /&gt;
    printf(&amp;quot;Done!\n&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-weight: bold&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;rhobincu@IronMan&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/work/pc/test $&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; valgrind --leak-check=full ./test&lt;br /&gt;
 ==6244== Memcheck, a memory error detector&lt;br /&gt;
 ==6244== Copyright (C) 2002-2013, and GNU GPL&amp;#039;d, by Julian Seward et al.&lt;br /&gt;
 ==6244== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info&lt;br /&gt;
 ==6244== Command: ./test&lt;br /&gt;
 ==6244== &lt;br /&gt;
 Done!&lt;br /&gt;
 ==6244== &lt;br /&gt;
 ==6244== HEAP SUMMARY:&lt;br /&gt;
 ==6244==     in use at exit: 0 bytes in 0 blocks&lt;br /&gt;
 ==6244==   total heap usage: 1 allocs, 1 frees, 100 bytes allocated&lt;br /&gt;
 ==6244== &lt;br /&gt;
 ==6244== All heap blocks were freed -- no leaks are possible&lt;br /&gt;
 ==6244== &lt;br /&gt;
 ==6244== For counts of detected and suppressed errors, rerun with: -v&lt;br /&gt;
 ==6244== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Realizați o funcție &amp;lt;code&amp;gt;char * allocateString(unsigned size)&amp;lt;/code&amp;gt; care să aloce în HEAP o zonă de memorie care să poată stoca un sir de caractere de dimensiunea &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; și să întoarcă adresa de unde începe zona respectivă. HINT: nu uitați de caracterul pentru final de șir.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Citiți de la tastatură o lungime de șir &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; apoi folosind funcția de mai sus, alocați memorie pentru stocarea unui șir de acea dimensiune. Citiți apoi de la tastatură și memorați un șir de caractere pe care să-l afișați ulterior în consolă folosind funcția &amp;lt;code&amp;gt;puts&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Pentru programul de mai sus, realizați o funcție &amp;lt;code&amp;gt;void printString(char * string)&amp;lt;/code&amp;gt; care să afișeze pe ecran șirul de caractere, folosind exclusiv funcția &amp;lt;code&amp;gt;putchar&amp;lt;/code&amp;gt; și fără a folosi operatorul de indexare a vectorilor ([]). Verificați că această funcție afișează același lucru ca funcția &amp;lt;code&amp;gt;puts&amp;lt;/code&amp;gt;. HINT: Utilizați operatorul de dereferențiere și aritmetica pointerilor.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Realizați o funcție &amp;lt;code&amp;gt;compute&amp;lt;/code&amp;gt; de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; care să calculeze suma și produsul a două valori de tip &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; astfel încât funcția apelantă să le poată utiliza.  Testați funcția într-un program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Găsiți și eliminați pierderile de memorie din codul de mai jos:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFFER_SIZE 100&lt;br /&gt;
&lt;br /&gt;
struct Buffer {&lt;br /&gt;
    unsigned size;&lt;br /&gt;
    char * string;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Buffer * createBuffer(unsigned size) {&lt;br /&gt;
    struct Buffer * newBuffer = (struct Buffer*) malloc (sizeof(struct Buffer));&lt;br /&gt;
    newBuffer-&amp;gt;size = size;&lt;br /&gt;
    newBuffer-&amp;gt;string = (char*) malloc(size * sizeof(char));&lt;br /&gt;
    return newBuffer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct Buffer * reverseWord(struct Buffer * buffer) {&lt;br /&gt;
    struct Buffer * newBuffer = createBuffer(buffer-&amp;gt;size);&lt;br /&gt;
    int i;&lt;br /&gt;
    for(i = 0; i &amp;lt; strlen(buffer-&amp;gt;string); i++) {&lt;br /&gt;
        *(newBuffer-&amp;gt;string + i) = buffer-&amp;gt;string[strlen(buffer-&amp;gt;string) - 1 - i];&lt;br /&gt;
    }&lt;br /&gt;
    newBuffer-&amp;gt;string[strlen(buffer-&amp;gt;string)] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
    return newBuffer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    unsigned wordCount;&lt;br /&gt;
    printf(&amp;quot;How many words? &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%u&amp;quot;, &amp;amp;wordCount);&lt;br /&gt;
&lt;br /&gt;
    unsigned i;&lt;br /&gt;
    for(i = 0; i &amp;lt; wordCount; i++) {&lt;br /&gt;
        struct Buffer * buffer = createBuffer(BUFFER_SIZE);&lt;br /&gt;
        scanf(&amp;quot;%s&amp;quot;, buffer-&amp;gt;string);&lt;br /&gt;
        buffer = reverseWord(buffer);&lt;br /&gt;
        printf(&amp;quot;Reversed is: %s\n&amp;quot;, buffer-&amp;gt;string);&lt;br /&gt;
        free(buffer);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_12&amp;diff=5020</id>
		<title>PC Laborator 12</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_12&amp;diff=5020"/>
		<updated>2016-12-21T18:29:13Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Utilitatea variabilelor de tip pointer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
&lt;br /&gt;
La sfârșitul acestui laborator studenții vor fi capabili:&lt;br /&gt;
* să definească și să utilizeze tipuri de date pointer;&lt;br /&gt;
* să folosească pointeri pentru a putea modifica variabilele trimise ca argumente unor funcții;&lt;br /&gt;
* să aloce, să folosească și să elibereze memorie HEAP, în mod dinamic;&lt;br /&gt;
* să utilizeze aritmetica pointerilor pentru a itera peste elemente de la adrese consecutive de memorie; &lt;br /&gt;
* să utilizeze &amp;lt;code&amp;gt;valgrind&amp;lt;/code&amp;gt; pentru a diagnostica pierderile de memorie.&lt;br /&gt;
&lt;br /&gt;
= Tipuri de date pointer =&lt;br /&gt;
&lt;br /&gt;
 Un &amp;#039;&amp;#039;&amp;#039;pointer&amp;#039;&amp;#039;&amp;#039; reprezintă o variabilă care stochează o adresă în memoria dedicată aplicației. Tipul variabilei de tip pointer specifică tipul datei care poate fi citit de la adresa respectivă.&lt;br /&gt;
&lt;br /&gt;
O variabilă de tip pointer se definește în felul următor:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tip_data&amp;gt; * &amp;lt;nume_variabila&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Spre exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int * pa;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variabila de tip pointer &amp;lt;code&amp;gt;pa&amp;lt;/code&amp;gt; nu memorează un întreg, ci o adresă în memorie, iar de la adresa respectivă se poate citi un întreg. Acest lucru se numește indirectare simplă. În plus, deoarece tipul pointer este în sine un tip de dată, și în definiția unui pointer &amp;lt;tip_data&amp;gt; poate fi un pointer, aceasta permite următoarele construcții:&lt;br /&gt;
* &amp;lt;code&amp;gt;int * pa;&amp;lt;/code&amp;gt; - variabilă ce stochează o adresă de unde se poate citi un întreg (indirectare simplă);&lt;br /&gt;
* &amp;lt;code&amp;gt;int ** pa;&amp;lt;/code&amp;gt; - variabilă ce stochează o adresă de unde se poate citi o adresă de unde se poate citi un întreg (dublă indirectare);&lt;br /&gt;
* &amp;lt;code&amp;gt;int *** pa;&amp;lt;/code&amp;gt; - variabilă ce stochează o adresă de unde se poate citi o adresă de unde se poate citi o adresă de unde se poate citi un întreg (triplă indirectare);&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Regulă:&amp;lt;/span&amp;gt; Orice variabilă este stocată în memorie și deci are o adresă în memorie.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În C există un tip de dată pointer care poate memora o adresă fără a ști ce date se află la adresa respectivă. Acest tip de pointer este &amp;lt;code&amp;gt;void*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Dimensiunea tipului de date pointer ==&lt;br /&gt;
&lt;br /&gt;
Conform regulii de mai sus, și variabilele de tip pointer ocupă loc în memorie, deci au dimensiune, în octeți. Un pointer nu oferă informații legate de dimensiunea ocupată de datele de la adresa respectivă, ci doar adresa de unde începe zona ocupată. Din moment ce un pointer memorează doar o adresă, dimensiunea variabilelor de tip pointer nu depinde decât de dimensiunea spațiului de memorie. Astfel, pentru procesoare și sisteme de operare pe 32 de biți, o variabilă de tip pointer va avea 32 de biți, iar pe procesoare și sisteme de operare pe 64 de biți, o variabilă de tip pointer va avea 64 de biți.&lt;br /&gt;
&lt;br /&gt;
== Adresa unei variabile ==&lt;br /&gt;
&lt;br /&gt;
Operatorul care permite aflarea adresei unde este stocată o variabilă este ampersand (&amp;amp;). Acesta este un operator unar ce se plasează înaintea unei variabile iar rezultatul evaluării sale este adresa unde este stocată variabila respectivă. Această adresă poate fi stocată într-o altă variabilă de tipul corespunzător. Altfel spus, pentru o variabilă de tip &amp;#039;&amp;#039;tip_data&amp;#039;&amp;#039;, adresa acesteia se poate stoca într-o variabilă de tip &amp;#039;&amp;#039;tip_data *&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float floatValue;&lt;br /&gt;
float * floatAddress = &amp;amp;floatValue;&lt;br /&gt;
&lt;br /&gt;
int intValue;&lt;br /&gt;
int * intAddress = &amp;amp;intValue;&lt;br /&gt;
int ** intPointerAddress = &amp;amp;intAddress;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Adresa NULL ==&lt;br /&gt;
&lt;br /&gt;
Pentru orice aplicație, adresa 0 din spațiul ei de memorie este rezervată. Aceasta nu poate fi nici scrisă și nici citită. Această adresa poartă numele de &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;. Orice variabilă de tip pointer poate lua valoarea &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;, lucru care de obicei specifică faptul că de fapt variabila pointer nu stochează o adresă validă.&lt;br /&gt;
&lt;br /&gt;
 Constanta &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039; este definită în fișierul header &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;stdlib.h&amp;lt;/code&amp;gt; (Standard Library).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    char * charPointer = NULL;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Valoarea de la o adresă ==&lt;br /&gt;
&lt;br /&gt;
Având o variabilă de tip pointer, valoarea stocată în memorie la adresa respectivă se poate afla folosind caracterul steluță (*), numit și operator de indirectare. Acesta este un operator unar ce se plasează înaintea unei variabile de tip pointer iar rezultatul evaluării sale este valoarea din memorie de la adresa stocată în variabila respectivă. Această valoare poate fi stocată într-o altă variabilă de tipul corespunzător. Altfel spus, pentru o variabilă pointer de tip &amp;#039;&amp;#039;tip_data *&amp;#039;&amp;#039;, valoarea de la adresa stocată de pointerul respectiv se poate memora într-o altă variabilă de tip &amp;#039;&amp;#039;tip_data&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float floatValue;&lt;br /&gt;
float * floatAddress = &amp;amp;floatValue;&lt;br /&gt;
float anotherFloatValue = *floatAddress;&lt;br /&gt;
&lt;br /&gt;
int intValue;&lt;br /&gt;
int * intAddress = &amp;amp;intValue;&lt;br /&gt;
int ** intPointerAddress = &amp;amp;intAddress;&lt;br /&gt;
int * anotherintAddress = *intPointerAddress;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Accesarea valorii de la o adresă se numește dereferențiere. Dereferențierea unei adrese care nu face parte din spațiul de memorie al aplicației sau dereferențierea lui &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039; va avea ca efect oprirea imediată a programului printr-un &amp;#039;&amp;#039;Segmentation fault.&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Nu confundați steluța utilizată la definirea unui pointer cu operatorul de indirectare/ dereferențiere. Aceștia sunt la fel de diferiți cum este și operatorul de inmulțire față de cel de indirectare.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Utilitatea variabilelor de tip pointer =&lt;br /&gt;
&lt;br /&gt;
Pointerii în C au două roluri foarte importante:&lt;br /&gt;
# Alocarea dinamică de memorie în HEAP&lt;br /&gt;
# Modificarea variabilelor parametri ale unor funcții astfel încât modificarea să se păstreze în afara funcției&lt;br /&gt;
&lt;br /&gt;
== Alocarea dinamică de memorie ==&lt;br /&gt;
&lt;br /&gt;
Memoria alocată unei aplicații de către sistemul de operare este împărțită în mai multe secțiuni, dintre care importante pentru stocarea de date sunt:&lt;br /&gt;
&lt;br /&gt;
* Segmentele BSS și Data - reprezintă memoria alocată pentru variabilele statice (globale), care există de la începutul până la încheierea programului, fără posibilitate de eliberare;&lt;br /&gt;
* Stiva (Stack) - zona de memorie în care se alocă contextele funcțiilor apelate în timpul execuției programului și în care se alocă argumentele și variabilele locale are funcțiilor; această zonă este alocată la intrarea în funcție și este eliberată la ieșirea din funcție;&lt;br /&gt;
* HEAP - zonă de memorie în care se pot aloca dinamic, de către programator, blocuri de memorie ce pot fi folosite în program până la eliberarea acestora de către programator.&lt;br /&gt;
&lt;br /&gt;
Alocarea și dezalocarea memoriei în heap se fac folosind următoarele funcții:&lt;br /&gt;
* &amp;lt;code&amp;gt;void * malloc(unsigned size)&amp;lt;/code&amp;gt; - alocă &amp;#039;&amp;#039;size&amp;#039;&amp;#039; octeți într-o zonă continuă din HEAP și întoarce adresa de memorie unde începe zona respectivă; dacă alocarea eșuează (nu exită suficientă memorie într-o zonă continuă în HEAP), funcția va întoarce &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;; alocarea nu șterge conținutul memoriei respective;&lt;br /&gt;
* &amp;lt;code&amp;gt;void * calloc(unsigned elements, unsigned elementSize)&amp;lt;/code&amp;gt; - alocă &amp;#039;&amp;#039;elements&amp;#039;&amp;#039; elemente de &amp;#039;&amp;#039;elementSize&amp;#039;&amp;#039; octeți fiecare într-o zonă continuă din HEAP și întoarce adresa de memorie unde începe zona respectivă; dacă alocarea eșuează (nu exită suficientă memorie într-o zonă continuă în HEAP), funcția va întoarce &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;; alocarea șterge tot conținutul memoriei respective, scriind 0 la fiecare locație;&lt;br /&gt;
* &amp;lt;code&amp;gt;void free (void *)&amp;lt;/code&amp;gt; - dezalocă o zonă de memorie alocată în prealabil cu &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;calloc&amp;lt;/code&amp;gt;; apelul succesiv de două sau mai multe ori a funcției &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt; pentru aceeași zonă de memorie sau apelul ei pentru o adresă care nu a fost alocată în prealabil va avea ca efect oprirea imediată a programului cu eroare (&amp;#039;&amp;#039;double free or corruption&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
Toate aceste funcții sunt definite în fișierul header &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;stdlib.h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int * intPointer;&lt;br /&gt;
    short * shortPointer;&lt;br /&gt;
&lt;br /&gt;
    intPointer = (int*) malloc(sizeof(int));&lt;br /&gt;
    shortPointer = (short*) calloc(1, sizeof(short));&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Valoarea din zona alocata pentru int este: %d\n&amp;quot;, *intPointer);&lt;br /&gt;
    printf(&amp;quot;Valoarea din zona alocata pentru short este: %hd\n&amp;quot;, *shortPointer);&lt;br /&gt;
&lt;br /&gt;
    free(intPointer);&lt;br /&gt;
    free(shortPointer);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Deoarece funcțiile &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;calloc&amp;lt;/code&amp;gt; au doar rolul de a aloca memorie, fără să știe care este scopul utilizării acestei memorii, ele întorc un pointer de tip &amp;lt;code&amp;gt;void *&amp;lt;/code&amp;gt;. Astfel, pentru a putea stoca adresa într-un alt tip de pointer (de exemplu &amp;lt;code&amp;gt;int *&amp;lt;/code&amp;gt;), ea trebuie convertită la tipul de date corect. Aceasta este explicația prezenței operatorului de cast din fața apelului funcțiilor &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;calloc&amp;lt;/code&amp;gt; din codul de mai sus.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aritmetica pointerilor ==&lt;br /&gt;
&lt;br /&gt;
Când se alocă memorie in HEAP, rareori se alocă pentru un singur element, de cele mai multe ori se alocă pentru un număr mare de elemente de același fel. Ca exemplu, dacă vrem să stocăm o imagine High Definition, ne trebuie o zonă de memorie care să poată memora informație de culoare pentru 1920 * 1080 de pixeli, fiecare pixel având informație de culoare pentru roșu, verde și albastru (RGB). Fiecare din aceste componente de culoare se stochează pe un octet ca valoare întreagă fără semn (unsigned char). Prin urmare, pentru un frame se vor aloca 1920 * 1080 * 3 octeți = 6220800, aproape 6 MB. Această memorie se alocă întotdeauna într-o zonă continuă de către funcțiile &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;calloc&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    unsigned char * frame;&lt;br /&gt;
    frame = (unsigned char*) malloc(1920 * 1080 * 3 * sizeof(unsigned char));&lt;br /&gt;
    //... use frame&lt;br /&gt;
&lt;br /&gt;
    free (frame);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deoarece pointer-ul nu memorează decât adresa de început a zonei de memorie, există posibilitatea de a modifica adresa pentru a accesa elementele ulterioare. În acest scop, variabilele de tip pointer suportă doar operații aritmetice de adunare sau scădere, nu și de înmulțire sau împărțire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Incrementarea unui pointer nu crește adresa cu 1, ci cu dimensiunea tipului de dată al pointer-ului. Deci pentru un &amp;lt;code&amp;gt;int * p;&amp;lt;/code&amp;gt;, linia &amp;lt;code&amp;gt;p++;&amp;lt;/code&amp;gt; va incrementa adresa cu 4 (sizeof(int)):&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int * pointer;&lt;br /&gt;
    pointer = (int*) malloc(10 * sizeof(int));&lt;br /&gt;
    printf(&amp;quot;The pointer address is: %p\n&amp;quot;, pointer);&lt;br /&gt;
    printf(&amp;quot;The pointer address + 1 is: %p\n&amp;quot;, pointer + 1);&lt;br /&gt;
    free (pointer);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție &amp;lt;/span&amp;gt; ca prin operații pe pointeri să nu depășiți zona de memorie alocată.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pointerii și vectorii ==&lt;br /&gt;
&lt;br /&gt;
Memoria alocată pentru mai multe elemente de același fel reprezintă de fapt un vector de elemente de acel tip. Astfel aflăm că de fapt vectorii și pointerii, în multe situații se pot folosi interschimbabil.&lt;br /&gt;
&lt;br /&gt;
 Când se definește un vector, numele vectorului reprezintă un pointer la adresa de unde începe zona lui de memorie, adică adresa unde este memorat elementul de la indexul 0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int array[10];&lt;br /&gt;
    array[0] = 13;&lt;br /&gt;
    printf(&amp;quot;The array pointer address is: %p\n&amp;quot;, array);&lt;br /&gt;
    printf(&amp;quot;The value at address %p is %d\n&amp;quot;, array, *array);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Dereferențierea unui pointer indexat cu o valoare este echivalentă cu folosirea operatorului de acces la vector: &amp;lt;code&amp;gt;*(v + k)&amp;lt;/code&amp;gt; == &amp;lt;code&amp;gt;v[k]&amp;lt;/code&amp;gt;, unde &amp;#039;&amp;#039;&amp;#039;v&amp;#039;&amp;#039;&amp;#039; este un pointer (sau vector) iar &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039; este un întreg.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; highlight=&amp;quot;14,18&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    int arraySize;&lt;br /&gt;
    printf(&amp;quot;size = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;arraySize);&lt;br /&gt;
&lt;br /&gt;
    int * heapArray;&lt;br /&gt;
    heapArray = (int*) malloc(arraySize * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    int i;&lt;br /&gt;
    for(i = 0; i &amp;lt; arraySize; i++) {&lt;br /&gt;
        printf(&amp;quot;heapArray[%d] = &amp;quot;, i);&lt;br /&gt;
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;heapArray[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for(i = 0; i &amp;lt; arraySize; i++) {&lt;br /&gt;
        printf(&amp;quot;heapArray[%d] = %d\n&amp;quot;, i, *(heapArray + i));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    free (heapArray);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pointerii și structurile ==&lt;br /&gt;
&lt;br /&gt;
Ca orice tip de dată, și variabilele de tip structură ocupă loc în memorie și deci pot exista pointeri de tip structură:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct Test {&lt;br /&gt;
    int intField;&lt;br /&gt;
    float floatField;&lt;br /&gt;
    char charField;&lt;br /&gt;
    char charArrayField[100];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    struct Test testStructVar;&lt;br /&gt;
    struct Test * structPointer = &amp;amp;testStructVar;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Având un pointer la o structură, accesul la câmpuri se poate face în două moduri:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Dereferențierea pointerului pentru a obține &amp;quot;valoarea&amp;quot; structurii și apoi utilizarea operatorului &amp;quot;.&amp;quot; pentru accesul la membri:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; highlight=&amp;quot;12&amp;quot;&amp;gt;&lt;br /&gt;
struct Test {&lt;br /&gt;
    int intField;&lt;br /&gt;
    float floatField;&lt;br /&gt;
    char charField;&lt;br /&gt;
    char charArrayField[100];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    struct Test testStructVar;&lt;br /&gt;
    struct Test * structPointer = &amp;amp;testStructVar;&lt;br /&gt;
&lt;br /&gt;
    *structPointer.intField = 10;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Accesul la membrii unei structuri accesate printr-un pointer este atât de popular și des întâlnit în C încât există un operator special care permite accesul la câmpuri fără dereferențiere. Acest operator este săgeata &amp;quot;-&amp;gt;&amp;quot;: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; highlight=&amp;quot;13,14&amp;quot;&amp;gt;&lt;br /&gt;
struct Test {&lt;br /&gt;
    int intField;&lt;br /&gt;
    float floatField;&lt;br /&gt;
    char charField;&lt;br /&gt;
    char charArrayField[100];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    struct Test testStructVar;&lt;br /&gt;
    struct Test * structPointer = &amp;amp;testStructVar;&lt;br /&gt;
&lt;br /&gt;
    *structPointer.intField = 10;&lt;br /&gt;
    structPointer-&amp;gt;floatField = 4.3;&lt;br /&gt;
    structPointer-&amp;gt;charField = &amp;#039;B&amp;#039;;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alocarea memoriei în HEAP pentru structuri se face identic cu alocarea pentru tipurile primitive de date:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; highlight=&amp;quot;10, 14&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
struct Test {&lt;br /&gt;
    int intField;&lt;br /&gt;
    float floatField;&lt;br /&gt;
    char charField;&lt;br /&gt;
    char charArrayField[100];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    struct Test * structPointer = (struct Test*) malloc(sizeof(struct Test));&lt;br /&gt;
&lt;br /&gt;
    // use structPointer&lt;br /&gt;
&lt;br /&gt;
    free(structPointer);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Adrese ca argumente de funcție ==&lt;br /&gt;
&lt;br /&gt;
Știm deja că în C argumentele funcțiilor sunt pass-by-value, asta înseamnă că funcției i se transmite valoarea dintr-o variabilă, nu variabila în sine. Astfel, dacă o variabilă este folosită ca argument la apelul unei funcții, modificarea argumentului în funcție nu se propagă și spre variabila sursă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void divideByTwo(int arg) {&lt;br /&gt;
    printf(&amp;quot;Argument before division = %d\n&amp;quot;, arg);&lt;br /&gt;
    arg /= 2;&lt;br /&gt;
    printf(&amp;quot;Argument after division = %d\n&amp;quot;, arg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int var = 10;&lt;br /&gt;
    divideByTwo(var);&lt;br /&gt;
    printf(&amp;quot;Variabile after function call = %d\n&amp;quot;, var);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Există o soluție pentru a permite propagarea modificării spre variabila sursă, și anume în loc de a trimite ca argument funcției variabila, se transmite adresa variabilei. Asta permite funcției să scrie direct în memoria alocată pentru variabilă și deci să-i modifice valoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void divideByTwo(int *arg) {&lt;br /&gt;
    printf(&amp;quot;Argument before division = %d\n&amp;quot;, *arg);&lt;br /&gt;
    *arg /= 2;&lt;br /&gt;
    printf(&amp;quot;Argument after division = %d\n&amp;quot;, *arg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int var = 10;&lt;br /&gt;
    divideByTwo(&amp;amp;var);&lt;br /&gt;
    printf(&amp;quot;Variabile after function call = %d\n&amp;quot;, var);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Evitarea pierderilor de memorie - &amp;lt;code&amp;gt;valgrind&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pierderile de memorie (memory leaks) apar atunci când programatorul alocă memorie dar uită să o elibereze. Aceasta este o problemă foarte delicată pentru că aplicația va continua să aloce până când va depăși limitele permise și sistemul de operare va opri procesul forțat. Chiar și dacă nu se ajunge acolo, ocuparea de cantități mari de memorie va face ca tot sistemul să se miște din ce în ce mai greu (vezi versiunile vechi de Firefox):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    char * buffer = (char*) malloc(100 * sizeof(char));&lt;br /&gt;
    buffer = NULL;&lt;br /&gt;
    printf(&amp;quot;Done!\n&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai sus este alocat un buffer de 100 de bytes iar adresa către zona respectivă se pierde când pointerului buffer i se atribuie valoarea &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;. Astfel, acea memorie nu mai poate fi nici accesată și nici eliberată. Cu toate acestea, programul compilează și rulează fără probleme. Pentru a verifica că nu există pierderi de memorie, se poate folosi programul &amp;lt;code&amp;gt;valgind&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-weight: bold&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;rhobincu@IronMan&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/work/pc/test $&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; valgrind --leak-check=full ./test&lt;br /&gt;
 ==6076== Memcheck, a memory error detector&lt;br /&gt;
 ==6076== Copyright (C) 2002-2013, and GNU GPL&amp;#039;d, by Julian Seward et al.&lt;br /&gt;
 ==6076== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info&lt;br /&gt;
 ==6076== Command: ./test&lt;br /&gt;
 ==6076== &lt;br /&gt;
 Done!&lt;br /&gt;
 ==6076== &lt;br /&gt;
 ==6076== HEAP SUMMARY:&lt;br /&gt;
 ==6076==     in use at exit: 100 bytes in 1 blocks&lt;br /&gt;
 ==6076==   total heap usage: 1 allocs, 0 frees, 100 bytes allocated&lt;br /&gt;
 ==6076== &lt;br /&gt;
 ==6076== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1&lt;br /&gt;
 ==6076==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)&lt;br /&gt;
 ==6076==    by 0x40058E: main (test.c:5)&lt;br /&gt;
 ==6076== &lt;br /&gt;
 ==6076== LEAK SUMMARY:&lt;br /&gt;
 ==6076==    definitely lost: 100 bytes in 1 blocks&lt;br /&gt;
 ==6076==    indirectly lost: 0 bytes in 0 blocks&lt;br /&gt;
 ==6076==      possibly lost: 0 bytes in 0 blocks&lt;br /&gt;
 ==6076==    still reachable: 0 bytes in 0 blocks&lt;br /&gt;
 ==6076==         suppressed: 0 bytes in 0 blocks&lt;br /&gt;
 ==6076== &lt;br /&gt;
 ==6076== For counts of detected and suppressed errors, rerun with: -v&lt;br /&gt;
 ==6076== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Observație: &amp;lt;/span&amp;gt; Ca valgrind să poată afișa numărul liniei și fișierul sursă unde apare eroarea, codul trebuie compilat cu simboluri de debug (-g).&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru un cod corect, ieșirea lui &amp;#039;&amp;#039;&amp;#039;valgrind&amp;#039;&amp;#039;&amp;#039; este:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    char * buffer = (char*) malloc(100 * sizeof(char));&lt;br /&gt;
    free(buffer);&lt;br /&gt;
    buffer = NULL;&lt;br /&gt;
    printf(&amp;quot;Done!\n&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-weight: bold&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;rhobincu@IronMan&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/work/pc/test $&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; valgrind --leak-check=full ./test&lt;br /&gt;
 ==6244== Memcheck, a memory error detector&lt;br /&gt;
 ==6244== Copyright (C) 2002-2013, and GNU GPL&amp;#039;d, by Julian Seward et al.&lt;br /&gt;
 ==6244== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info&lt;br /&gt;
 ==6244== Command: ./test&lt;br /&gt;
 ==6244== &lt;br /&gt;
 Done!&lt;br /&gt;
 ==6244== &lt;br /&gt;
 ==6244== HEAP SUMMARY:&lt;br /&gt;
 ==6244==     in use at exit: 0 bytes in 0 blocks&lt;br /&gt;
 ==6244==   total heap usage: 1 allocs, 1 frees, 100 bytes allocated&lt;br /&gt;
 ==6244== &lt;br /&gt;
 ==6244== All heap blocks were freed -- no leaks are possible&lt;br /&gt;
 ==6244== &lt;br /&gt;
 ==6244== For counts of detected and suppressed errors, rerun with: -v&lt;br /&gt;
 ==6244== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Realizați o funcție &amp;lt;code&amp;gt;char * allocateString(unsigned size)&amp;lt;/code&amp;gt; care să aloce în HEAP o zonă de memorie care să poată stoca un sir de caractere de dimensiunea &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; și să întoarcă adresa de unde începe zona respectivă. HINT: nu uitați de caracterul pentru final de șir.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Citiți de la tastatură o lungime de șir &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; apoi folosind funcția de mai sus, alocați memorie pentru stocarea unui șir de acea dimensiune. Citiți apoi de la tastatură și memorați un șir de caractere pe care să-l afișați ulterior în consolă folosind funcția &amp;lt;code&amp;gt;puts&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Pentru programul de mai sus, realizați o funcție &amp;lt;code&amp;gt;void printString(char * string)&amp;lt;/code&amp;gt; care să afișeze pe ecran șirul de caractere, folosind exclusiv funcția &amp;lt;code&amp;gt;putchar&amp;lt;/code&amp;gt; și fără a folosi operatorul de indexare a vectorilor ([]). Verificați că această funcție afișează același lucru ca funcția &amp;lt;code&amp;gt;puts&amp;lt;/code&amp;gt;. HINT: Utilizați operatorul de dereferențiere și aritmetica pointerilor.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Realizați o funcție &amp;lt;code&amp;gt;compute&amp;lt;/code&amp;gt; de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; care să calculeze suma și produsul a două valori de tip &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; astfel încât funcția apelantă să le poată utiliza.  Testați funcția într-un program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Găsiți și eliminați pierderile de memorie din codul de mai jos:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFFER_SIZE 100&lt;br /&gt;
&lt;br /&gt;
struct Buffer {&lt;br /&gt;
    unsigned size;&lt;br /&gt;
    char * string;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Buffer * createBuffer(unsigned size) {&lt;br /&gt;
    struct Buffer * newBuffer = (struct Buffer*) malloc (sizeof(struct Buffer));&lt;br /&gt;
    newBuffer-&amp;gt;size = size;&lt;br /&gt;
    newBuffer-&amp;gt;string = (char*) malloc(size * sizeof(char));&lt;br /&gt;
    return newBuffer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct Buffer * reverseWord(struct Buffer * buffer) {&lt;br /&gt;
    struct Buffer * newBuffer = createBuffer(buffer-&amp;gt;size);&lt;br /&gt;
    int i;&lt;br /&gt;
    for(i = 0; i &amp;lt; strlen(buffer-&amp;gt;string); i++) {&lt;br /&gt;
        *(newBuffer-&amp;gt;string + i) = buffer-&amp;gt;string[strlen(buffer-&amp;gt;string) - 1 - i];&lt;br /&gt;
    }&lt;br /&gt;
    newBuffer-&amp;gt;string[strlen(buffer-&amp;gt;string)] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
    return newBuffer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    unsigned wordCount;&lt;br /&gt;
    printf(&amp;quot;How many words? &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%u&amp;quot;, &amp;amp;wordCount);&lt;br /&gt;
&lt;br /&gt;
    unsigned i;&lt;br /&gt;
    for(i = 0; i &amp;lt; wordCount; i++) {&lt;br /&gt;
        struct Buffer * buffer = createBuffer(BUFFER_SIZE);&lt;br /&gt;
        scanf(&amp;quot;%s&amp;quot;, buffer-&amp;gt;string);&lt;br /&gt;
        buffer = reverseWord(buffer);&lt;br /&gt;
        printf(&amp;quot;Reversed is: %s\n&amp;quot;, buffer-&amp;gt;string);&lt;br /&gt;
        free(buffer);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_12&amp;diff=5019</id>
		<title>PC Laborator 12</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_12&amp;diff=5019"/>
		<updated>2016-12-21T18:22:33Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Tipuri de date pointer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
&lt;br /&gt;
La sfârșitul acestui laborator studenții vor fi capabili:&lt;br /&gt;
* să definească și să utilizeze tipuri de date pointer;&lt;br /&gt;
* să folosească pointeri pentru a putea modifica variabilele trimise ca argumente unor funcții;&lt;br /&gt;
* să aloce, să folosească și să elibereze memorie HEAP, în mod dinamic;&lt;br /&gt;
* să utilizeze aritmetica pointerilor pentru a itera peste elemente de la adrese consecutive de memorie; &lt;br /&gt;
* să utilizeze &amp;lt;code&amp;gt;valgrind&amp;lt;/code&amp;gt; pentru a diagnostica pierderile de memorie.&lt;br /&gt;
&lt;br /&gt;
= Tipuri de date pointer =&lt;br /&gt;
&lt;br /&gt;
 Un &amp;#039;&amp;#039;&amp;#039;pointer&amp;#039;&amp;#039;&amp;#039; reprezintă o variabilă care stochează o adresă în memoria dedicată aplicației. Tipul variabilei de tip pointer specifică tipul datei care poate fi citit de la adresa respectivă.&lt;br /&gt;
&lt;br /&gt;
O variabilă de tip pointer se definește în felul următor:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tip_data&amp;gt; * &amp;lt;nume_variabila&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Spre exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int * pa;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variabila de tip pointer &amp;lt;code&amp;gt;pa&amp;lt;/code&amp;gt; nu memorează un întreg, ci o adresă în memorie, iar de la adresa respectivă se poate citi un întreg. Acest lucru se numește indirectare simplă. În plus, deoarece tipul pointer este în sine un tip de dată, și în definiția unui pointer &amp;lt;tip_data&amp;gt; poate fi un pointer, aceasta permite următoarele construcții:&lt;br /&gt;
* &amp;lt;code&amp;gt;int * pa;&amp;lt;/code&amp;gt; - variabilă ce stochează o adresă de unde se poate citi un întreg (indirectare simplă);&lt;br /&gt;
* &amp;lt;code&amp;gt;int ** pa;&amp;lt;/code&amp;gt; - variabilă ce stochează o adresă de unde se poate citi o adresă de unde se poate citi un întreg (dublă indirectare);&lt;br /&gt;
* &amp;lt;code&amp;gt;int *** pa;&amp;lt;/code&amp;gt; - variabilă ce stochează o adresă de unde se poate citi o adresă de unde se poate citi o adresă de unde se poate citi un întreg (triplă indirectare);&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Regulă:&amp;lt;/span&amp;gt; Orice variabilă este stocată în memorie și deci are o adresă în memorie.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În C există un tip de dată pointer care poate memora o adresă fără a ști ce date se află la adresa respectivă. Acest tip de pointer este &amp;lt;code&amp;gt;void*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Dimensiunea tipului de date pointer ==&lt;br /&gt;
&lt;br /&gt;
Conform regulii de mai sus, și variabilele de tip pointer ocupă loc în memorie, deci au dimensiune, în octeți. Un pointer nu oferă informații legate de dimensiunea ocupată de datele de la adresa respectivă, ci doar adresa de unde începe zona ocupată. Din moment ce un pointer memorează doar o adresă, dimensiunea variabilelor de tip pointer nu depinde decât de dimensiunea spațiului de memorie. Astfel, pentru procesoare și sisteme de operare pe 32 de biți, o variabilă de tip pointer va avea 32 de biți, iar pe procesoare și sisteme de operare pe 64 de biți, o variabilă de tip pointer va avea 64 de biți.&lt;br /&gt;
&lt;br /&gt;
== Adresa unei variabile ==&lt;br /&gt;
&lt;br /&gt;
Operatorul care permite aflarea adresei unde este stocată o variabilă este ampersand (&amp;amp;). Acesta este un operator unar ce se plasează înaintea unei variabile iar rezultatul evaluării sale este adresa unde este stocată variabila respectivă. Această adresă poate fi stocată într-o altă variabilă de tipul corespunzător. Altfel spus, pentru o variabilă de tip &amp;#039;&amp;#039;tip_data&amp;#039;&amp;#039;, adresa acesteia se poate stoca într-o variabilă de tip &amp;#039;&amp;#039;tip_data *&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float floatValue;&lt;br /&gt;
float * floatAddress = &amp;amp;floatValue;&lt;br /&gt;
&lt;br /&gt;
int intValue;&lt;br /&gt;
int * intAddress = &amp;amp;intValue;&lt;br /&gt;
int ** intPointerAddress = &amp;amp;intAddress;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Adresa NULL ==&lt;br /&gt;
&lt;br /&gt;
Pentru orice aplicație, adresa 0 din spațiul ei de memorie este rezervată. Aceasta nu poate fi nici scrisă și nici citită. Această adresa poartă numele de &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;. Orice variabilă de tip pointer poate lua valoarea &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;, lucru care de obicei specifică faptul că de fapt variabila pointer nu stochează o adresă validă.&lt;br /&gt;
&lt;br /&gt;
 Constanta &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039; este definită în fișierul header &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;stdlib.h&amp;lt;/code&amp;gt; (Standard Library).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    char * charPointer = NULL;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Valoarea de la o adresă ==&lt;br /&gt;
&lt;br /&gt;
Având o variabilă de tip pointer, valoarea stocată în memorie la adresa respectivă se poate afla folosind caracterul steluță (*), numit și operator de indirectare. Acesta este un operator unar ce se plasează înaintea unei variabile de tip pointer iar rezultatul evaluării sale este valoarea din memorie de la adresa stocată în variabila respectivă. Această valoare poate fi stocată într-o altă variabilă de tipul corespunzător. Altfel spus, pentru o variabilă pointer de tip &amp;#039;&amp;#039;tip_data *&amp;#039;&amp;#039;, valoarea de la adresa stocată de pointerul respectiv se poate memora într-o altă variabilă de tip &amp;#039;&amp;#039;tip_data&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float floatValue;&lt;br /&gt;
float * floatAddress = &amp;amp;floatValue;&lt;br /&gt;
float anotherFloatValue = *floatAddress;&lt;br /&gt;
&lt;br /&gt;
int intValue;&lt;br /&gt;
int * intAddress = &amp;amp;intValue;&lt;br /&gt;
int ** intPointerAddress = &amp;amp;intAddress;&lt;br /&gt;
int * anotherintAddress = *intPointerAddress;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Accesarea valorii de la o adresă se numește dereferențiere. Dereferențierea unei adrese care nu face parte din spațiul de memorie al aplicației sau dereferențierea lui &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039; va avea ca efect oprirea imediată a programului printr-un &amp;#039;&amp;#039;Segmentation fault.&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Nu confundați steluța utilizată la definirea unui pointer cu operatorul de indirectare/ dereferențiere. Aceștia sunt la fel de diferiți cum este și operatorul de inmulțire față de cel de indirectare.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Utilitatea variabilelor de tip pointer =&lt;br /&gt;
&lt;br /&gt;
Pointerii în C au două roluri foarte importante:&lt;br /&gt;
# Alocarea dinamică de memorie în HEAP&lt;br /&gt;
# Modificarea variabilelor parametri ale unor funcții astfel încât modificarea să se păstreze în afara funcției&lt;br /&gt;
&lt;br /&gt;
== Alocarea dinamică de memorie ==&lt;br /&gt;
&lt;br /&gt;
Memoria alocată unei aplicații de către sistemul de operare este împărțită în mai multe secțiuni, din care importante pentru stocarea de date sunt:&lt;br /&gt;
&lt;br /&gt;
* Segmentele BSS și Data - reprezintă memoria alocată pentru variabilele statice (globale), care există de la începutul până la încheierea programului, fără posibilitate de eliberare;&lt;br /&gt;
* Stiva (Stack) - zona de memorie în care se alocă contextele funcțiilor apelate în timpul execuției programului și în care se alocă argumentele și variabilele locale are funcțiilor; această zonă este alocată la intrarea în funcție și este eliberată la ieșirea din funcție;&lt;br /&gt;
* HEAP - zonă de memorie în care se pot aloca dinamic, de către programator, blocuri de memorie ce pot fi folosite în program până la eliberarea acestora de către programator.&lt;br /&gt;
&lt;br /&gt;
Alocarea și dezalocarea memoriei în heap se face folosind următoarele funcții:&lt;br /&gt;
* &amp;lt;code&amp;gt;void * malloc(unsigned size)&amp;lt;/code&amp;gt; - alocă &amp;#039;&amp;#039;size&amp;#039;&amp;#039; octeți într-o zonă continuă din HEAP și întoarce adresa de memorie unde începe zona respectivă; dacă alocarea eșuează (nu exită suficientă memorie într-o zonă continuă în HEAP), funcția va întoarce &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;; alocarea nu șterge conținutul memoriei respective;&lt;br /&gt;
* &amp;lt;code&amp;gt;void * calloc(unsigned elements, unsigned elementSize)&amp;lt;/code&amp;gt; - alocă &amp;#039;&amp;#039;elements&amp;#039;&amp;#039; elemente de &amp;#039;&amp;#039;elementSize&amp;#039;&amp;#039; octeți fiecare într-o zonă continuă din HEAP și întoarce adresa de memorie unde începe zona respectivă; dacă alocarea eșuează (nu exită suficientă memorie într-o zonă continuă în HEAP), funcția va întoarce &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;; alocarea șterge tot conținutul memoriei respective, scriind 0 la fiecare locație;&lt;br /&gt;
* &amp;lt;code&amp;gt;void free (void *)&amp;lt;/code&amp;gt; - dezalocă o zonă de memorie alocată în prealabil cu &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;calloc&amp;lt;/code&amp;gt;; apelul succesiv de două sau mai multe ori a funcției &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt; pentru aceeași zonă de memorie sau apelul ei pentru o adresă care nu a fost alocată în prealabil va avea ca efect oprirea imediată a programului cu eroare (&amp;#039;&amp;#039;double free or corruption&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
Toate aceste funcții sunt definite în fișierul header &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;stdlib.h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int * intPointer;&lt;br /&gt;
    short * shortPointer;&lt;br /&gt;
&lt;br /&gt;
    intPointer = (int*) malloc(sizeof(int));&lt;br /&gt;
    shortPointer = (short*) calloc(1, sizeof(short));&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Valoarea din zona alocata pentru int este: %d\n&amp;quot;, *intPointer);&lt;br /&gt;
    printf(&amp;quot;Valoarea din zona alocata pentru short este: %hd\n&amp;quot;, *shortPointer);&lt;br /&gt;
&lt;br /&gt;
    free(intPointer);&lt;br /&gt;
    free(shortPointer);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Deoarece funcțiile &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;calloc&amp;lt;/code&amp;gt; au doar rolul de a aloca memorie, fără să știe care este scopul utilizării acestei memorii, ele întorc un pointer de tip &amp;lt;code&amp;gt;void *&amp;lt;/code&amp;gt;. Astfel, pentru a putea stoca adresa într-un alt tip de pointer (de exemplu &amp;lt;code&amp;gt;int *&amp;lt;/code&amp;gt;), ea trebuie convertită la tipul de date corect. Aceasta este explicația prezenței operatorului de cast din fața apelului funcțiilor &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;calloc&amp;lt;/code&amp;gt; din codul de mai sus.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aritmetica pointerilor ==&lt;br /&gt;
&lt;br /&gt;
Când se alocă memorie in HEAP, rareori se alocă pentru un singur element, de cele mai multe ori se alocă pentru un număr mare de elemente de același fel. Ca exemplu, dacă vrem să stocăm o imagine High Definition, ne trebuie o zonă de memorie care să poată memora informație de culoare pentru 1920 * 1080 de pixeli, fiecare pixel având informație de culoare pentru roșu, verde și albastru (RGB). Fiecare din aceste componente de culoare se stochează pe un octet ca valoare întreagă fără semn (unsigned char). Prin urmare pentru un frame se vor aloca 1920 * 1080 * 3 octeți = 6220800, aproape 6 MB. Această memorie se alocă întotdeauna într-o zonă continuă de către funcțiile &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;calloc&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    unsigned char * frame;&lt;br /&gt;
    frame = (unsigned char*) malloc(1920 * 1080 * 3 * sizeof(unsigned char));&lt;br /&gt;
    //... use frame&lt;br /&gt;
&lt;br /&gt;
    free (frame);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deoarece pointer-ul nu memorează decât adresa de început a zonei de memorie, există posibilitatea de a modifica adresa pentru a accesa elementele ulterioare. În acest scop, variabilele de tip pointer suportă doar operații aritmetice de adunare sau scădere, nu și de înmulțire sau împărțire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Incrementarea unui pointer nu crește adresa cu 1, ci cu dimensiunea tipului de dată al pointer-ului. Deci pentru un &amp;lt;code&amp;gt;int * p;&amp;lt;/code&amp;gt;, linia &amp;lt;code&amp;gt;p++;&amp;lt;/code&amp;gt; va incrementa adresa cu 4 (sizeof(int)):&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int * pointer;&lt;br /&gt;
    pointer = (int*) malloc(10 * sizeof(int));&lt;br /&gt;
    printf(&amp;quot;The pointer address is: %p\n&amp;quot;, pointer);&lt;br /&gt;
    printf(&amp;quot;The pointer address + 1 is: %p\n&amp;quot;, pointer + 1);&lt;br /&gt;
    free (pointer);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție &amp;lt;/span&amp;gt; ca prin operații pe pointeri să nu depășiți zona de memorie alocată.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pointerii și vectorii ==&lt;br /&gt;
&lt;br /&gt;
Memoria alocată pentru mai multe elemente de același fel reprezintă de fapt un vector de elemente de acel tip. Astfel aflăm că de fapt vectorii și pointerii, în multe situații se pot folosi interschimbabil.&lt;br /&gt;
&lt;br /&gt;
 Când se definește un vector, numele vectorului reprezintă un pointer la adresa de unde începe zona lui de memorie, adică adresa unde este memorat elementul de la indexul 0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int array[10];&lt;br /&gt;
    array[0] = 13;&lt;br /&gt;
    printf(&amp;quot;The array pointer address is: %p\n&amp;quot;, array);&lt;br /&gt;
    printf(&amp;quot;The value at address %p is %d\n&amp;quot;, array, *array);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Dereferențierea unui pointer indexat cu o valoare este echivalentă cu folosirea operatorului de acces la vector: &amp;lt;code&amp;gt;*(v + k)&amp;lt;/code&amp;gt; == &amp;lt;code&amp;gt;v[k]&amp;lt;/code&amp;gt;, unde &amp;#039;&amp;#039;&amp;#039;v&amp;#039;&amp;#039;&amp;#039; este un pointer (sau vector) iar &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039; este un întreg.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; highlight=&amp;quot;14,18&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    int arraySize;&lt;br /&gt;
    printf(&amp;quot;size = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;arraySize);&lt;br /&gt;
&lt;br /&gt;
    int * heapArray;&lt;br /&gt;
    heapArray = (int*) malloc(arraySize * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    int i;&lt;br /&gt;
    for(i = 0; i &amp;lt; arraySize; i++) {&lt;br /&gt;
        printf(&amp;quot;heapArray[%d] = &amp;quot;, i);&lt;br /&gt;
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;heapArray[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for(i = 0; i &amp;lt; arraySize; i++) {&lt;br /&gt;
        printf(&amp;quot;heapArray[%d] = %d\n&amp;quot;, i, *(heapArray + i));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    free (heapArray);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pointerii și structurile ==&lt;br /&gt;
&lt;br /&gt;
Ca orice tip de dată, și variabilele de tip structură ocupă loc în memorie și deci pot exista pointeri de tip structură:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct Test {&lt;br /&gt;
    int intField;&lt;br /&gt;
    float floatField;&lt;br /&gt;
    char charField;&lt;br /&gt;
    char charArrayField[100];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    struct Test testStructVar;&lt;br /&gt;
    struct Test * structPointer = &amp;amp;testStructVar;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Având un pointer la o structură, accesul la câmpuri se poate face în două moduri:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Dereferențierea pointerului pentru a obține &amp;quot;valoarea&amp;quot; structurii și apoi utilizarea operatorului &amp;quot;.&amp;quot; pentru accesul la membrii:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; highlight=&amp;quot;12&amp;quot;&amp;gt;&lt;br /&gt;
struct Test {&lt;br /&gt;
    int intField;&lt;br /&gt;
    float floatField;&lt;br /&gt;
    char charField;&lt;br /&gt;
    char charArrayField[100];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    struct Test testStructVar;&lt;br /&gt;
    struct Test * structPointer = &amp;amp;testStructVar;&lt;br /&gt;
&lt;br /&gt;
    *structPointer.intField = 10;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Accesul la membrii unei structuri accesate printr-un pointer este atât de popular și des întâlnit în C încât există un operator special care permite accesul la câmpuri fără dereferențiere. Acest operator este săgeata &amp;quot;-&amp;gt;&amp;quot;: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; highlight=&amp;quot;13,14&amp;quot;&amp;gt;&lt;br /&gt;
struct Test {&lt;br /&gt;
    int intField;&lt;br /&gt;
    float floatField;&lt;br /&gt;
    char charField;&lt;br /&gt;
    char charArrayField[100];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    struct Test testStructVar;&lt;br /&gt;
    struct Test * structPointer = &amp;amp;testStructVar;&lt;br /&gt;
&lt;br /&gt;
    *structPointer.intField = 10;&lt;br /&gt;
    structPointer-&amp;gt;floatField = 4.3;&lt;br /&gt;
    structPointer-&amp;gt;charField = &amp;#039;B&amp;#039;;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alocarea memoriei în HEAP pentru structuri se face identic cu alocarea pentru tipurile primitive de date:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; highlight=&amp;quot;10, 14&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
struct Test {&lt;br /&gt;
    int intField;&lt;br /&gt;
    float floatField;&lt;br /&gt;
    char charField;&lt;br /&gt;
    char charArrayField[100];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    struct Test * structPointer = (struct Test*) malloc(sizeof(struct Test));&lt;br /&gt;
&lt;br /&gt;
    // use structPointer&lt;br /&gt;
&lt;br /&gt;
    free(structPointer);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Adrese ca argumente de funcție ==&lt;br /&gt;
&lt;br /&gt;
Știm deja că în C, argumentele funcțiilor sunt pass-by-value, asta înseamnă că funcției i se transmite valoarea dintr-o variabilă, nu variabila în sine. Astfel, dacă o variabilă este folosită ca argument la apelul unei funcții, modificarea argumentului în funcție nu se propagă și spre variabila sursă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void divideByTwo(int arg) {&lt;br /&gt;
    printf(&amp;quot;Argument before division = %d\n&amp;quot;, arg);&lt;br /&gt;
    arg /= 2;&lt;br /&gt;
    printf(&amp;quot;Argument after division = %d\n&amp;quot;, arg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int var = 10;&lt;br /&gt;
    divideByTwo(var);&lt;br /&gt;
    printf(&amp;quot;Variabile after function call = %d\n&amp;quot;, var);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Există o soluție pentru a permite propagarea modificării spre variabila sursă, și anume în loc de a trimite ca argument funcției variabila, se transmite adresa variabilei. Asta permite funcției să scrie direct în memoria alocată pentru variabilă și deci să-i modifice valoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void divideByTwo(int *arg) {&lt;br /&gt;
    printf(&amp;quot;Argument before division = %d\n&amp;quot;, *arg);&lt;br /&gt;
    *arg /= 2;&lt;br /&gt;
    printf(&amp;quot;Argument after division = %d\n&amp;quot;, *arg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int var = 10;&lt;br /&gt;
    divideByTwo(&amp;amp;var);&lt;br /&gt;
    printf(&amp;quot;Variabile after function call = %d\n&amp;quot;, var);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Evitarea pierderilor de memorie - &amp;lt;code&amp;gt;valgrind&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pierderile de memorie (memory leaks) apar atunci când programatorul alocă memorie dar uită să o elibereze. Aceasta este o problemă foarte delicată pentru că aplicația va continua să aloce până când va depăși limitele permise și sistemul de operare va opri procesul forțat. Chiar și dacă nu se ajunge acolo, ocuparea de cantități mari de memorie va face ca tot sistemul să se miște din ce în ce mai greu (vezi versiunile vechi de Firefox):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    char * buffer = (char*) malloc(100 * sizeof(char));&lt;br /&gt;
    buffer = NULL;&lt;br /&gt;
    printf(&amp;quot;Done!\n&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai sus este alocat un buffer de 100 de bytes iar adresa către zona respectivă se pierde când pointerului buffer i se atribuie valoarea &amp;#039;&amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&amp;#039;. Astfel, acea memorie nu mai poate fi nici accesată și nici eliberată. Cu toate acestea, programul compilează și rulează fără probleme. Pentru a verifica că nu există pierderi de memorie, se poate folosi programul &amp;lt;code&amp;gt;valgind&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-weight: bold&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;rhobincu@IronMan&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/work/pc/test $&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; valgrind --leak-check=full ./test&lt;br /&gt;
 ==6076== Memcheck, a memory error detector&lt;br /&gt;
 ==6076== Copyright (C) 2002-2013, and GNU GPL&amp;#039;d, by Julian Seward et al.&lt;br /&gt;
 ==6076== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info&lt;br /&gt;
 ==6076== Command: ./test&lt;br /&gt;
 ==6076== &lt;br /&gt;
 Done!&lt;br /&gt;
 ==6076== &lt;br /&gt;
 ==6076== HEAP SUMMARY:&lt;br /&gt;
 ==6076==     in use at exit: 100 bytes in 1 blocks&lt;br /&gt;
 ==6076==   total heap usage: 1 allocs, 0 frees, 100 bytes allocated&lt;br /&gt;
 ==6076== &lt;br /&gt;
 ==6076== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1&lt;br /&gt;
 ==6076==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)&lt;br /&gt;
 ==6076==    by 0x40058E: main (test.c:5)&lt;br /&gt;
 ==6076== &lt;br /&gt;
 ==6076== LEAK SUMMARY:&lt;br /&gt;
 ==6076==    definitely lost: 100 bytes in 1 blocks&lt;br /&gt;
 ==6076==    indirectly lost: 0 bytes in 0 blocks&lt;br /&gt;
 ==6076==      possibly lost: 0 bytes in 0 blocks&lt;br /&gt;
 ==6076==    still reachable: 0 bytes in 0 blocks&lt;br /&gt;
 ==6076==         suppressed: 0 bytes in 0 blocks&lt;br /&gt;
 ==6076== &lt;br /&gt;
 ==6076== For counts of detected and suppressed errors, rerun with: -v&lt;br /&gt;
 ==6076== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Observație: &amp;lt;/span&amp;gt; Ca valgrind să poată afișa numărul liniei și fișierul sursă unde apare eroarea, codul trebuie compilat cu simboluri de debug (-g).&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru un cod corect, ieșirea lui &amp;#039;&amp;#039;&amp;#039;valgrind&amp;#039;&amp;#039;&amp;#039; este:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    char * buffer = (char*) malloc(100 * sizeof(char));&lt;br /&gt;
    free(buffer);&lt;br /&gt;
    buffer = NULL;&lt;br /&gt;
    printf(&amp;quot;Done!\n&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-weight: bold&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;rhobincu@IronMan&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/work/pc/test $&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; valgrind --leak-check=full ./test&lt;br /&gt;
 ==6244== Memcheck, a memory error detector&lt;br /&gt;
 ==6244== Copyright (C) 2002-2013, and GNU GPL&amp;#039;d, by Julian Seward et al.&lt;br /&gt;
 ==6244== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info&lt;br /&gt;
 ==6244== Command: ./test&lt;br /&gt;
 ==6244== &lt;br /&gt;
 Done!&lt;br /&gt;
 ==6244== &lt;br /&gt;
 ==6244== HEAP SUMMARY:&lt;br /&gt;
 ==6244==     in use at exit: 0 bytes in 0 blocks&lt;br /&gt;
 ==6244==   total heap usage: 1 allocs, 1 frees, 100 bytes allocated&lt;br /&gt;
 ==6244== &lt;br /&gt;
 ==6244== All heap blocks were freed -- no leaks are possible&lt;br /&gt;
 ==6244== &lt;br /&gt;
 ==6244== For counts of detected and suppressed errors, rerun with: -v&lt;br /&gt;
 ==6244== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Realizați o funcție &amp;lt;code&amp;gt;char * allocateString(unsigned size)&amp;lt;/code&amp;gt; care să aloce în HEAP o zonă de memorie care să poată stoca un sir de caractere de dimensiunea &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; și să întoarcă adresa de unde începe zona respectivă. HINT: nu uitați de caracterul pentru final de șir.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Citiți de la tastatură o lungime de șir &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; apoi folosind funcția de mai sus, alocați memorie pentru stocarea unui șir de acea dimensiune. Citiți apoi de la tastatură și memorați un șir de caractere pe care să-l afișați ulterior în consolă folosind funcția &amp;lt;code&amp;gt;puts&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Pentru programul de mai sus, realizați o funcție &amp;lt;code&amp;gt;void printString(char * string)&amp;lt;/code&amp;gt; care să afișeze pe ecran șirul de caractere, folosind exclusiv funcția &amp;lt;code&amp;gt;putchar&amp;lt;/code&amp;gt; și fără a folosi operatorul de indexare a vectorilor ([]). Verificați că această funcție afișează același lucru ca funcția &amp;lt;code&amp;gt;puts&amp;lt;/code&amp;gt;. HINT: Utilizați operatorul de dereferențiere și aritmetica pointerilor.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Realizați o funcție &amp;lt;code&amp;gt;compute&amp;lt;/code&amp;gt; de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; care să calculeze suma și produsul a două valori de tip &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; astfel încât funcția apelantă să le poată utiliza.  Testați funcția într-un program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Găsiți și eliminați pierderile de memorie din codul de mai jos:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFFER_SIZE 100&lt;br /&gt;
&lt;br /&gt;
struct Buffer {&lt;br /&gt;
    unsigned size;&lt;br /&gt;
    char * string;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Buffer * createBuffer(unsigned size) {&lt;br /&gt;
    struct Buffer * newBuffer = (struct Buffer*) malloc (sizeof(struct Buffer));&lt;br /&gt;
    newBuffer-&amp;gt;size = size;&lt;br /&gt;
    newBuffer-&amp;gt;string = (char*) malloc(size * sizeof(char));&lt;br /&gt;
    return newBuffer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct Buffer * reverseWord(struct Buffer * buffer) {&lt;br /&gt;
    struct Buffer * newBuffer = createBuffer(buffer-&amp;gt;size);&lt;br /&gt;
    int i;&lt;br /&gt;
    for(i = 0; i &amp;lt; strlen(buffer-&amp;gt;string); i++) {&lt;br /&gt;
        *(newBuffer-&amp;gt;string + i) = buffer-&amp;gt;string[strlen(buffer-&amp;gt;string) - 1 - i];&lt;br /&gt;
    }&lt;br /&gt;
    newBuffer-&amp;gt;string[strlen(buffer-&amp;gt;string)] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
    return newBuffer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    unsigned wordCount;&lt;br /&gt;
    printf(&amp;quot;How many words? &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%u&amp;quot;, &amp;amp;wordCount);&lt;br /&gt;
&lt;br /&gt;
    unsigned i;&lt;br /&gt;
    for(i = 0; i &amp;lt; wordCount; i++) {&lt;br /&gt;
        struct Buffer * buffer = createBuffer(BUFFER_SIZE);&lt;br /&gt;
        scanf(&amp;quot;%s&amp;quot;, buffer-&amp;gt;string);&lt;br /&gt;
        buffer = reverseWord(buffer);&lt;br /&gt;
        printf(&amp;quot;Reversed is: %s\n&amp;quot;, buffer-&amp;gt;string);&lt;br /&gt;
        free(buffer);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_10&amp;diff=5007</id>
		<title>PC Laborator 10</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_10&amp;diff=5007"/>
		<updated>2016-12-14T16:35:03Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Exemplu de depanare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La sfârșitul acestui laborator studenții vor fi capabili:&lt;br /&gt;
* să înțeleagă funcționarea funcțiilor recursive;&lt;br /&gt;
* să implementeze și să apeleze funcții recursive;&lt;br /&gt;
* să folosească tool-ul de depanare GDB.&lt;br /&gt;
&lt;br /&gt;
== Funcții recursive ==&lt;br /&gt;
Un obiect se definește în mod recursiv dacă în cadrul definiției sale există o referire la el însuși.&amp;lt;br&amp;gt;&lt;br /&gt;
Recursivitatea este un procedeu de programare în care o funcție se apelează pe ea însăși; o funcție care se auto-apelează poartă numele de funcție recursivă. O metodă de a înțelege mai ușor funcțiile recursive este imaginarea unui proces în execuție în care una dintre instrucțiuni este repetarea procesul în sine. O metodă și mai ușoară de a înțelege acest concept este compararea funcțiilor recursive cu [https://ro.wikipedia.org/wiki/Matrio%C8%99ka papușile Matrioska], unde o păpușă conține în interiorul său una sau mai multe păpuși de același fel, excepție făcând ultima păpușă, cea mai mică dintre ele, care este goală.&amp;lt;br&amp;gt;&lt;br /&gt;
Recursivitatea se folosește și în matematică - un exemplu ar fi șirul lui Fibonacci, care se folosește de ultimii doi termeni din șir pentru a afla termenul curent. Utilitatea recursivității, atât în matematică, cât și în cadrul programării, provine din posibilitatea de a defini un set infinit de termeni sau obiecte folosind o singură relație.&amp;lt;br&amp;gt;&lt;br /&gt;
Recursivitatea diferă de structurile iterative, deși ambele concepte presupun execuția repetată a unei porțiuni de cod. În cadrul execuției unei funcții recursive se verifică o condiție a cărei nerealizare duce la o altă execuție a funcției, fără a termina execuția curentă care va fi suspendată. În momentul satisfacerii condiției se revine la execuția curentă, fiecare apel suspendat fiind reluat și încheiat, în ordine invers cronologică.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Orice apel recursiv al unei funcții trebuie condiționat de o decizie care să împiedice apelarea funcției în buclă infinită.&amp;lt;/div&amp;gt;&lt;br /&gt;
Recursivitatea poate fi de două feluri:&lt;br /&gt;
* recursivitate directă (în care o funcție conține o referință către ea însăși);&lt;br /&gt;
* recursivitate indirectă (în care o funcție X conține o referință către o funcție Y, funcția Y conținând la rândul ei o referință către funcția X).&amp;lt;br&amp;gt;&lt;br /&gt;
=== Exemplu de recursivitate directă ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int factorial(int n) {&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
        return 0;&lt;br /&gt;
    } else if (n == 0) {&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    int rez;&lt;br /&gt;
    rez = n * factorial(n - 1);&lt;br /&gt;
    return rez;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Exemplu de recursivitate indirectă ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int factorial(int n) {&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
        return 0;&lt;br /&gt;
    } else if (n == 0) {&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    int rez;&lt;br /&gt;
    rez = inmul_fact(n, n - 1);&lt;br /&gt;
    return rez;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inmul_fact(int a, int b) {&lt;br /&gt;
    int prod;&lt;br /&gt;
    prod = a * factorial(b);&lt;br /&gt;
    return prod;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tool-ul de depanare GDB ==&lt;br /&gt;
Depanatorul GNU, cunoscut drept GDB (GNU debugger), este depanatorul standard pentru sistemul de software GNU.&amp;lt;br&amp;gt;&lt;br /&gt;
Scopul unui depanator precum GDB este de a permite utilizatorului să vadă ce se întâmplă în interiorul unui alt program în timp ce acesta se execută sau ce s-a întâmplat cu programul în momentul în care acesta a dat crash.&amp;lt;br&amp;gt;&lt;br /&gt;
GDB este capabil de a face 4 mari categorii de operații (și alte tipuri de operații ce duc la îndeplinirea celor 4):&lt;br /&gt;
* să pornească programul, specificând orice ar putea interveni în buna funcționare a acestuia;&lt;br /&gt;
* să facă programul să se oprească din execuție în anumite condiții specificate de utilizator;&lt;br /&gt;
* să examineze ce s-a întâmplat în momentul opririi programului;&lt;br /&gt;
* să schimbe anumite lucruri în program pentru a putea corecta efectele unui bug și a investiga urmările altuia.&amp;lt;br&amp;gt;&lt;br /&gt;
Odată pornit, GDB citește comenzi din terminal până la întâlnirea comenzii de ieșire &amp;quot;quit&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pentru a putea folosi debugger-ul, la generarea fișierului executabil trebuie folosită opțiunea &amp;#039;&amp;#039;&amp;#039;-g&amp;#039;&amp;#039;&amp;#039;, care adaugă simboluri de debug în executabil, fără de care depanarea nu este posibilă. (vezi [http://wiki.dcae.pub.ro/index.php/PC_Laborator_1 Laboratorul 1])&amp;lt;/div&amp;gt;&lt;br /&gt;
Exemplul unei comenzi de compilare în vederea depanării:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gcc -g hello.c -o hello&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Comenzi specifice GDB ===&lt;br /&gt;
Cea mai folosită modalitate de a porni tool-ul de depanare este de a scrie &amp;#039;&amp;#039;&amp;#039;gdb&amp;#039;&amp;#039;&amp;#039; în terminal, urmat de numele executabilului ce se dorește a fi depanat.&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gdb hello&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
O parte din comenzile cele mai utilizate ale GDB sunt următoarele (pentru lista completă studiați pagina de manual GDB - man gdb):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opțiune !! Efect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;break&amp;lt;/code&amp;gt; [nume_fișier:] nume_funcție &amp;lt;br&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;break&amp;lt;/code&amp;gt; [nume_fișier:] număr_linie || Setează un breakpoint (punct de întrerupere) la începutul funcției &amp;#039;&amp;#039;nume_funcție&amp;#039;&amp;#039; sau la linia specificată prin &amp;#039;&amp;#039;număr_linie&amp;#039;&amp;#039; din fișierul specificat prin &amp;#039;&amp;#039;nume_fișier&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;run&amp;lt;/code&amp;gt; [listă_argumente] || Pornește programul în execuție (cu lista de argumente, dacă au fost specificate).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;bt&amp;lt;/code&amp;gt; || Backtrace: afișează stiva de program.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;print&amp;lt;/code&amp;gt; expresie || Afișează valoarea unei expresii (valoarea stocată într-o variabilă, valoarea returnată de o funcție etc.).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;c&amp;lt;/code&amp;gt; || Continuă execuția programului (după ce a fost oprit, spre exemplu după un breakpoint).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;next&amp;lt;/code&amp;gt; || Execută următoarea linie de program (după oprire), sărind peste orice apel de funcție care se găsește în această linie.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;list&amp;lt;/code&amp;gt; [nume_fișier:] nume_funcție || Afișează liniile de cod ale programului din vecinătatea locului unde este oprit acum.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;step&amp;lt;/code&amp;gt; || Execută următoarea linie de program (după oprire), intrând în orice funcție apelată de acea linie.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;help&amp;lt;/code&amp;gt; [nume] || Afișează informații despre comanda GDB &amp;#039;&amp;#039;nume&amp;#039;&amp;#039; sau informații generale despre utilizarea GDB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;quit&amp;lt;/code&amp;gt; || Iese din GDB.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Cele mai multe dintre aceste comenzi pot fi apelate doar prin prima literă a numelui lor. &amp;lt;/div&amp;gt;&lt;br /&gt;
Spre exemplu, următoarea comandă:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
este identică cu:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Dacă se apasă pe enter fără a scrie o comandă, se repetă ultima comandă specificată.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu de depanare ===&lt;br /&gt;
Se dă fișierul sursă &amp;#039;&amp;#039;suma_fact.c&amp;#039;&amp;#039;, care conține următoarele instrucțiuni:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
unsigned int factorial(int n) {&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    int i;&lt;br /&gt;
    unsigned int fact = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= n; i++){&lt;br /&gt;
        fact *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return fact;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n, i;&lt;br /&gt;
    do {&lt;br /&gt;
        printf(&amp;quot;Introduceti un numar natural mai mic sau egal cu 8: &amp;quot;);&lt;br /&gt;
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    } while (n &amp;lt; 0 || n &amp;gt; 8);&lt;br /&gt;
    unsigned int suma = 0;&lt;br /&gt;
    for (i = 0; i &amp;lt;= n; i++) {&lt;br /&gt;
        suma += factorial(i);&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;%u\n&amp;quot;, suma);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Programul își propune să calculeze suma factorialelor de la 0 la n, unde n este introdus de la tastatură. Dacă rulăm programul vom obține ca rezultat numărul &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;, indiferent de ce a fost introdus de la tastatură. Ne propunem să descoperim bug-ul folosind GDB.&amp;lt;br&amp;gt;&lt;br /&gt;
Compilăm sursa, adăugând simboluri de debug în executabil, după care lansăm în execuție debugger-ul:&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gcc -g suma_fact.c -o suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gdb suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Comanda de mai sus lansează în execuție numai debugger-ul, nu și programul &amp;#039;&amp;#039;suma_fact&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Putem observa că am pornit debugger-ul prin faptul că fiecare rând nou din linia de comandă începe acum astfel:&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Punem un &amp;#039;&amp;#039;breakpoint&amp;#039;&amp;#039; la linia 20, unde se citește valoarea lui n:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) b 20&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Breakpoint 1 at 0x80484c2: file suma_fact.c, line 20.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Pornim programul în interiorul debugger-ului:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) run&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Starting program: /home/student/Desktop/suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Breakpoint 1, main () at suma_fact.c:20&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;20	        scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Trecem mai departe și introducem o valoare pentru n:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Introduceti un numar natural mai mic sau egal cu 8: 6 &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;21	    }while(n&amp;lt;0 || n&amp;gt;8);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Vom parcurge programul pas cu pas până la apelarea funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;22	    unsigned int suma = 0;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;23	    for(i=0; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;24	        suma += factorial(i);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;factorial (n=0) at suma_fact.c:4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;4	    if(n==0){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;5	        return 1;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;13	}&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;main () at suma_fact.c:23&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;23	    for(i=0; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;24	        suma += factorial(i);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;factorial (n=1) at suma_fact.c:4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;4	    if(n==0){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;8	    unsigned int fact=0;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;9	    for(i=1; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;10	        fact *= i;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;9	    for(i=1; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;12	    return fact;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) print fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;$1 = 0&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Observăm că valoarea returnată de funcția &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039; pentru orice număr nenul este &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;. Acest lucru se datorează inițializării variabilei &amp;#039;&amp;#039;fact&amp;#039;&amp;#039; cu valoarea &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; la începutul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;. Putem ieși din debugger pentru a modifica linia 8 din fișierul sursă suma_fact.c:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) q&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;A debugging session is active.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;  	Inferior 1 [process 4279] will be killed.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Quit anyway? (y or n) y &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Pentru a putea intra în interiorul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039; este absolut necesar să se folosească comanda &amp;#039;&amp;#039;&amp;#039;step&amp;#039;&amp;#039;&amp;#039; și nu comanda &amp;#039;&amp;#039;&amp;#039;next&amp;#039;&amp;#039;&amp;#039; care ar trece peste acea linie 24 fără a intra în corpul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;Să se citească de la tastatură un număr întreg fără semn n. Să se implementeze o funcție recursivă care returnează suma primelor n numere naturale și să se afișeze rezultatul apelării acestei funcții.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți o funcție recursivă care șterge dintr-un vector elementul de pe o anumită poziție; funcția primește ca parametri vectorul, numărul de elemente din vector și poziția elementului ce urmează a fi șters.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească de la tastatură un număr întreg fără semn n. Să se implementeze o funcție recursivă care calculează termenul de pe o poziție dată din șirul lui Fibonacci și să se afișeze primii n termeni, știind că șirul lui Fibonacci este definit astfel:&lt;br /&gt;
* F(0) = 0;&lt;br /&gt;
* F(1) = 1;&lt;br /&gt;
* F(i) = F(i-1) + F(i-2), pentru i&amp;gt;=2.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți o funcție recursivă care calculează 2 la puterea n, unde n este un număr întreg fără semn introdus de la tastatură.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți o funcție recursivă care descompune un număr întreg fără semn n într-o sumă de puteri ale lui 2. Afișați această descompunere.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți o funcție recursivă care descompune un număr întreg fără semn n într-o sumă de termeni din șirul lui Fibonacci. Afișați termenii din care este compus numărul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_10&amp;diff=5006</id>
		<title>PC Laborator 10</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_10&amp;diff=5006"/>
		<updated>2016-12-14T16:32:49Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Funcții recursive */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La sfârșitul acestui laborator studenții vor fi capabili:&lt;br /&gt;
* să înțeleagă funcționarea funcțiilor recursive;&lt;br /&gt;
* să implementeze și să apeleze funcții recursive;&lt;br /&gt;
* să folosească tool-ul de depanare GDB.&lt;br /&gt;
&lt;br /&gt;
== Funcții recursive ==&lt;br /&gt;
Un obiect se definește în mod recursiv dacă în cadrul definiției sale există o referire la el însuși.&amp;lt;br&amp;gt;&lt;br /&gt;
Recursivitatea este un procedeu de programare în care o funcție se apelează pe ea însăși; o funcție care se auto-apelează poartă numele de funcție recursivă. O metodă de a înțelege mai ușor funcțiile recursive este imaginarea unui proces în execuție în care una dintre instrucțiuni este repetarea procesul în sine. O metodă și mai ușoară de a înțelege acest concept este compararea funcțiilor recursive cu [https://ro.wikipedia.org/wiki/Matrio%C8%99ka papușile Matrioska], unde o păpușă conține în interiorul său una sau mai multe păpuși de același fel, excepție făcând ultima păpușă, cea mai mică dintre ele, care este goală.&amp;lt;br&amp;gt;&lt;br /&gt;
Recursivitatea se folosește și în matematică - un exemplu ar fi șirul lui Fibonacci, care se folosește de ultimii doi termeni din șir pentru a afla termenul curent. Utilitatea recursivității, atât în matematică, cât și în cadrul programării, provine din posibilitatea de a defini un set infinit de termeni sau obiecte folosind o singură relație.&amp;lt;br&amp;gt;&lt;br /&gt;
Recursivitatea diferă de structurile iterative, deși ambele concepte presupun execuția repetată a unei porțiuni de cod. În cadrul execuției unei funcții recursive se verifică o condiție a cărei nerealizare duce la o altă execuție a funcției, fără a termina execuția curentă care va fi suspendată. În momentul satisfacerii condiției se revine la execuția curentă, fiecare apel suspendat fiind reluat și încheiat, în ordine invers cronologică.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Orice apel recursiv al unei funcții trebuie condiționat de o decizie care să împiedice apelarea funcției în buclă infinită.&amp;lt;/div&amp;gt;&lt;br /&gt;
Recursivitatea poate fi de două feluri:&lt;br /&gt;
* recursivitate directă (în care o funcție conține o referință către ea însăși);&lt;br /&gt;
* recursivitate indirectă (în care o funcție X conține o referință către o funcție Y, funcția Y conținând la rândul ei o referință către funcția X).&amp;lt;br&amp;gt;&lt;br /&gt;
=== Exemplu de recursivitate directă ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int factorial(int n) {&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
        return 0;&lt;br /&gt;
    } else if (n == 0) {&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    int rez;&lt;br /&gt;
    rez = n * factorial(n - 1);&lt;br /&gt;
    return rez;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Exemplu de recursivitate indirectă ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int factorial(int n) {&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
        return 0;&lt;br /&gt;
    } else if (n == 0) {&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    int rez;&lt;br /&gt;
    rez = inmul_fact(n, n - 1);&lt;br /&gt;
    return rez;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inmul_fact(int a, int b) {&lt;br /&gt;
    int prod;&lt;br /&gt;
    prod = a * factorial(b);&lt;br /&gt;
    return prod;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tool-ul de depanare GDB ==&lt;br /&gt;
Depanatorul GNU, cunoscut drept GDB (GNU debugger), este depanatorul standard pentru sistemul de software GNU.&amp;lt;br&amp;gt;&lt;br /&gt;
Scopul unui depanator precum GDB este de a permite utilizatorului să vadă ce se întâmplă în interiorul unui alt program în timp ce acesta se execută sau ce s-a întâmplat cu programul în momentul în care acesta a dat crash.&amp;lt;br&amp;gt;&lt;br /&gt;
GDB este capabil de a face 4 mari categorii de operații (și alte tipuri de operații ce duc la îndeplinirea celor 4):&lt;br /&gt;
* să pornească programul, specificând orice ar putea interveni în buna funcționare a acestuia;&lt;br /&gt;
* să facă programul să se oprească din execuție în anumite condiții specificate de utilizator;&lt;br /&gt;
* să examineze ce s-a întâmplat în momentul opririi programului;&lt;br /&gt;
* să schimbe anumite lucruri în program pentru a putea corecta efectele unui bug și a investiga urmările altuia.&amp;lt;br&amp;gt;&lt;br /&gt;
Odată pornit, GDB citește comenzi din terminal până la întâlnirea comenzii de ieșire &amp;quot;quit&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pentru a putea folosi debugger-ul, la generarea fișierului executabil trebuie folosită opțiunea &amp;#039;&amp;#039;&amp;#039;-g&amp;#039;&amp;#039;&amp;#039;, care adaugă simboluri de debug în executabil, fără de care depanarea nu este posibilă. (vezi [http://wiki.dcae.pub.ro/index.php/PC_Laborator_1 Laboratorul 1])&amp;lt;/div&amp;gt;&lt;br /&gt;
Exemplul unei comenzi de compilare în vederea depanării:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gcc -g hello.c -o hello&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Comenzi specifice GDB ===&lt;br /&gt;
Cea mai folosită modalitate de a porni tool-ul de depanare este de a scrie &amp;#039;&amp;#039;&amp;#039;gdb&amp;#039;&amp;#039;&amp;#039; în terminal, urmat de numele executabilului ce se dorește a fi depanat.&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gdb hello&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
O parte din comenzile cele mai utilizate ale GDB sunt următoarele (pentru lista completă studiați pagina de manual GDB - man gdb):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opțiune !! Efect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;break&amp;lt;/code&amp;gt; [nume_fișier:] nume_funcție &amp;lt;br&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;break&amp;lt;/code&amp;gt; [nume_fișier:] număr_linie || Setează un breakpoint (punct de întrerupere) la începutul funcției &amp;#039;&amp;#039;nume_funcție&amp;#039;&amp;#039; sau la linia specificată prin &amp;#039;&amp;#039;număr_linie&amp;#039;&amp;#039; din fișierul specificat prin &amp;#039;&amp;#039;nume_fișier&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;run&amp;lt;/code&amp;gt; [listă_argumente] || Pornește programul în execuție (cu lista de argumente, dacă au fost specificate).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;bt&amp;lt;/code&amp;gt; || Backtrace: afișează stiva de program.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;print&amp;lt;/code&amp;gt; expresie || Afișează valoarea unei expresii (valoarea stocată într-o variabilă, valoarea returnată de o funcție etc.).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;c&amp;lt;/code&amp;gt; || Continuă execuția programului (după ce a fost oprit, spre exemplu după un breakpoint).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;next&amp;lt;/code&amp;gt; || Execută următoarea linie de program (după oprire), sărind peste orice apel de funcție care se găsește în această linie.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;list&amp;lt;/code&amp;gt; [nume_fișier:] nume_funcție || Afișează liniile de cod ale programului din vecinătatea locului unde este oprit acum.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;step&amp;lt;/code&amp;gt; || Execută următoarea linie de program (după oprire), intrând în orice funcție apelată de acea linie.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;help&amp;lt;/code&amp;gt; [nume] || Afișează informații despre comanda GDB &amp;#039;&amp;#039;nume&amp;#039;&amp;#039; sau informații generale despre utilizarea GDB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;quit&amp;lt;/code&amp;gt; || Iese din GDB.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Cele mai multe dintre aceste comenzi pot fi apelate doar prin prima literă a numelui lor. &amp;lt;/div&amp;gt;&lt;br /&gt;
Spre exemplu, următoarea comandă:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
este identică cu:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Dacă se apasă pe enter fără a scrie o comandă, se repetă ultima comandă specificată.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu de depanare ===&lt;br /&gt;
Se dă fișierul sursă &amp;#039;&amp;#039;suma_fact.c&amp;#039;&amp;#039;, care conține următoarele instrucțiuni:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
unsigned int factorial(int n){&lt;br /&gt;
    if(n==0){&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    int i;&lt;br /&gt;
    unsigned int fact=0;&lt;br /&gt;
    for(i=1; i&amp;lt;=n; i++){&lt;br /&gt;
        fact *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return fact;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int n, i;&lt;br /&gt;
    do{&lt;br /&gt;
        printf(&amp;quot;Introduceti un numar natural mai mic sau egal cu 8: &amp;quot;);&lt;br /&gt;
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    }while(n&amp;lt;0 || n&amp;gt;8);&lt;br /&gt;
    unsigned int suma = 0;&lt;br /&gt;
    for(i=0; i&amp;lt;=n; i++){&lt;br /&gt;
        suma += factorial(i);&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;%u\n&amp;quot;, suma);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Programul își propune să calculeze suma factorialelor de la 0 la n, unde n este introdus de la tastatură. Dacă rulăm programul vom obține ca rezultat numărul &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;, indiferent de ce a fost introdus de la tastatură. Ne propunem să descoperim bug-ul folosind GDB.&amp;lt;br&amp;gt;&lt;br /&gt;
Compilăm sursa, adăugând simboluri de debug în executabil, după care lansăm în execuție debugger-ul:&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gcc -g suma_fact.c -o suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gdb suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Comanda de mai sus lansează în execuție numai debugger-ul, nu și programul &amp;#039;&amp;#039;suma_fact&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Putem observa că am pornit debugger-ul prin faptul că fiecare rând nou din linia de comandă începe acum astfel:&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Punem un &amp;#039;&amp;#039;breakpoint&amp;#039;&amp;#039; la linia 20, unde se citește valoarea lui n:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) b 20&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Breakpoint 1 at 0x80484c2: file suma_fact.c, line 20.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Pornim programul în interiorul debugger-ului:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) run&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Starting program: /home/student/Desktop/suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Breakpoint 1, main () at suma_fact.c:20&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;20	        scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Trecem mai departe și introducem o valoare pentru n:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Introduceti un numar natural mai mic sau egal cu 8: 6 &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;21	    }while(n&amp;lt;0 || n&amp;gt;8);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Vom parcurge programul pas cu pas până la apelarea funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;22	    unsigned int suma = 0;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;23	    for(i=0; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;24	        suma += factorial(i);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;factorial (n=0) at suma_fact.c:4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;4	    if(n==0){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;5	        return 1;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;13	}&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;main () at suma_fact.c:23&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;23	    for(i=0; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;24	        suma += factorial(i);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;factorial (n=1) at suma_fact.c:4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;4	    if(n==0){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;8	    unsigned int fact=0;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;9	    for(i=1; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;10	        fact *= i;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;9	    for(i=1; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;12	    return fact;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) print fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;$1 = 0&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Observăm că valoarea returnată de funcția &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039; pentru orice număr nenul este &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;. Acest lucru se datorează inițializării variabilei &amp;#039;&amp;#039;fact&amp;#039;&amp;#039; cu valoarea &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; la începutul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;. Putem ieși din debugger pentru a modifica linia 8 din fișierul sursă suma_fact.c:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) q&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;A debugging session is active.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;  	Inferior 1 [process 4279] will be killed.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Quit anyway? (y or n) y &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Pentru a putea intra în interiorul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039; este absolut necesar să se folosească comanda &amp;#039;&amp;#039;&amp;#039;step&amp;#039;&amp;#039;&amp;#039; și nu comanda &amp;#039;&amp;#039;&amp;#039;next&amp;#039;&amp;#039;&amp;#039; care ar trece peste acea linie 24 fără a intra în corpul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;Să se citească de la tastatură un număr întreg fără semn n. Să se implementeze o funcție recursivă care returnează suma primelor n numere naturale și să se afișeze rezultatul apelării acestei funcții.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți o funcție recursivă care șterge dintr-un vector elementul de pe o anumită poziție; funcția primește ca parametri vectorul, numărul de elemente din vector și poziția elementului ce urmează a fi șters.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească de la tastatură un număr întreg fără semn n. Să se implementeze o funcție recursivă care calculează termenul de pe o poziție dată din șirul lui Fibonacci și să se afișeze primii n termeni, știind că șirul lui Fibonacci este definit astfel:&lt;br /&gt;
* F(0) = 0;&lt;br /&gt;
* F(1) = 1;&lt;br /&gt;
* F(i) = F(i-1) + F(i-2), pentru i&amp;gt;=2.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți o funcție recursivă care calculează 2 la puterea n, unde n este un număr întreg fără semn introdus de la tastatură.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți o funcție recursivă care descompune un număr întreg fără semn n într-o sumă de puteri ale lui 2. Afișați această descompunere.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți o funcție recursivă care descompune un număr întreg fără semn n într-o sumă de termeni din șirul lui Fibonacci. Afișați termenii din care este compus numărul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=5001</id>
		<title>PC Laborator 9</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=5001"/>
		<updated>2016-12-06T21:45:20Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
  &lt;br /&gt;
În urma acestui laborator, studentul va fi capabil: &lt;br /&gt;
* să înțeleagă conceptul de funcție;&lt;br /&gt;
* să definească funcții, sub formă de prototip și implementare;&lt;br /&gt;
* să apeleze funcții;&lt;br /&gt;
* să utilizeze corect cuvintele cheie &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Funcții =&lt;br /&gt;
&lt;br /&gt;
Funcțiile sunt secțiuni ale unui program care se pot apela de mai multe ori, care pot modifica starea programului (prin modificarea variabilelor sau operații de IO - citire și scriere de date) și care pot întoarce un rezultat.&lt;br /&gt;
&lt;br /&gt;
== Definirea/ Declararea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
O funcție în C este &amp;lt;span style=&amp;quot;color: black; font-weight: bold&amp;quot;&amp;gt;declarată&amp;lt;/span&amp;gt; în următorul fel:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie(lista_tip_argumente);&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; definește tipul de date din care face parte valoarea returnată de funcție; dacă funcția nu întoarce nici o valoare (este folosit exclusiv pentru modificarea stării programului sau pentru IO), atunci se mai numește și procedură, iar tipul returnat este &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_functie&amp;lt;/code&amp;gt; reprezintă numele funcției care este folosit ulterior pentru apelul ei, și care respectă aceleași reguli ca orice identificator generic din C: poate conține exclusiv cifre, litere mici și mari, caracterul underscore (_), și nu poate începe cu cifră;&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_tip_argumente&amp;lt;/code&amp;gt; reprezintă o listă de tipuri de date, separate prin virgulă, din care fac parte argumentele funcției; această listă poate fi goală (dacă funcția nu are argumente).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O declarație de funcție se numește și &amp;lt;span style=&amp;quot;color: blue; font-weight: bold&amp;quot;&amp;gt;prototip&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de declarații de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max(float, float);&lt;br /&gt;
int inc(int);&lt;br /&gt;
void print(char[]);&lt;br /&gt;
int getAge();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
Implementarea (definirea) unei funcții în C se face în felul următor:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie(lista_argumente) {&lt;br /&gt;
     statement_1&lt;br /&gt;
     statement_2&lt;br /&gt;
     ...&lt;br /&gt;
     statement_n&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; reprezintă tipul returnat al funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_funcție&amp;lt;/code&amp;gt; reprezintă numele funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_argumente&amp;lt;/code&amp;gt; reprezintă o listă de definiții de variabile (de forma &amp;quot;tip_data nume_variabilă&amp;quot;) care sunt argumentele funcției; această listă poate fi goală;&lt;br /&gt;
* &amp;lt;code&amp;gt;statement_...&amp;lt;/code&amp;gt; reprezintă una sau mai multe instructiuni (&amp;#039;&amp;#039;statement&amp;#039;&amp;#039;) C care implementează comportamentul funcției și care se execută de fiecare dată când se apelează funcția; corpul unei funcții poate fi gol (poate să nu conțină nici un statement), dar atunci apelul ei nu are nici un efect; dacă funcția nu este de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, atunci obligatoriu ultima instrucțiune executată din funcție trebuie să fie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, care setează valoarea întoarsă de funcție.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de implementări (definiri) de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max(float a, float b) {&lt;br /&gt;
    if (a &amp;gt;= b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inc(int value) {&lt;br /&gt;
    return value + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print(char string[]) {&lt;br /&gt;
    printf(&amp;quot;%s&amp;quot;, string);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int getAge() {&lt;br /&gt;
    return 20;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observații ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție nu este accesibilă/ apelabilă până nu este declarată în program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Nu pot exista mai multe funcții cu același prototip.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție poate avea o singură definiție/implementare și oricâte declarații.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție declarată și ne-implementată (ne-definită) poate fi apelată, și fișierul va compila cu succes, dar linker-ul nu va reuși să creeze fișierul executabil. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int inc(int);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;n + 1 = %d\n&amp;quot;, inc(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Implementarea unei funcții ține loc implicit și de declarație, dacă aceasta nu există deja.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oprește execuția funcției, indiferent dacă mai există sau nu instrucțiuni după &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; poate fi folosit și în funcții &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar urmat doar de punct și virgulă (;) și are ca efect ieșirea imediată din funcție. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printIfNotZero(int value) {&lt;br /&gt;
    if (value == 0) return;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S-a apelat functia printIfNotZero cu valoarea %d.\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printIfNotZero(1);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    printIfNotZero(2);&lt;br /&gt;
    printIfNotZero(3);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;În C, argumentele unei funcții sunt &amp;quot;pass-by-value&amp;quot;, în sensul că ele conțin valorile variabilelor cu care se apelează funcția, nu se identifică cu aceste variabile. Altfel spus, modificarea unui argument al funcției nu se propagă în afara funcției. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void inc(int value) {&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la intrare, value este %d\n&amp;quot;, value);&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la iesire, value este %d\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 3;&lt;br /&gt;
    printf(&amp;quot;Inainte de &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    inc(n);&lt;br /&gt;
    printf(&amp;quot;După &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programe din mai multe fișiere =&lt;br /&gt;
&lt;br /&gt;
Programele complexe pot fi sparte în mai multe fișiere. În general, prin convenție, într-un fișier se scriu funcții care au legătură între ele, în sensul că sunt folosite pentru aceeași funcționalitate (de exemplu, funcții pentru criptare, sau funcții pentru IO, sau funcții pentru operații matematice, etc.). Pentru că aceste funcții pot teoretic fi folosite în multiple alte funcții din alte fișiere, sistemul cel mai des întâlnit pentru separarea acestor funcții este următorul:&lt;br /&gt;
* prototipurile funcțiilor se scriu într-un fișier cu extensia .h (header), iar acest fișier header este inclus acolo unde aceste funcții sunt apelate; aceste fișiere header trebuie obligatoriu să aibă gardă de dublă incluziune.&lt;br /&gt;
* implementările funcțiilor se scriu într-un fișier sursă .c, care include header-ul de mai sus, și care este compilat separat într-un object file.&lt;br /&gt;
* toate fișierele obiect se link-editează apoi într-un fișier executabil.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CUSTOM_MATH_H&lt;br /&gt;
#define CUSTOM_MATH_H&lt;br /&gt;
&lt;br /&gt;
long long factorial (int);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
long long factorial (int n) {&lt;br /&gt;
    long long result = 1;&lt;br /&gt;
    int i;&lt;br /&gt;
    if (n &amp;lt; 0) return 0;&lt;br /&gt;
    for (i = 2; i &amp;lt; n; i++) {&lt;br /&gt;
        result *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;main.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;%d! = %d\n&amp;quot;, n, factorial(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a obține executabilul pentru exemplul de mai sus, se compilează fiecare fișier sursă într-un object file:&lt;br /&gt;
 gcc -c custom_math.c -o custom_math.o&lt;br /&gt;
 gcc -c main.c -o main.o&lt;br /&gt;
&lt;br /&gt;
Apoi, se link-editează cele două surse împreună într-un executabil:&lt;br /&gt;
 gcc custom_math.o main.o -o main&lt;br /&gt;
&lt;br /&gt;
== Makefile pentru compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
C_FILES=custom_math.c main.c&lt;br /&gt;
OBJ_FILES=$(C_FILES:.c=.o)&lt;br /&gt;
&lt;br /&gt;
main: $(OBJ_FILES)&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
%.o: %.c&lt;br /&gt;
	gcc -c $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clear&lt;br /&gt;
clear:&lt;br /&gt;
	rm -rf main $(OBJ_FILES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt; definește o variabilă care conține o listă cu fișierele sursă ce se doresc compilate.&lt;br /&gt;
# &amp;lt;code&amp;gt;OBJ_FILES&amp;lt;/code&amp;gt; reprezintă tot lista cu fișierele sursă, dar în care extensia .c se transformă în .o (astfel, se obține lista cu fișierele obiect necesare pentru compilare).&lt;br /&gt;
# Executabilul &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; depinde de toate fișierele obiect și se generează prin apelul lui &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regula &amp;lt;code&amp;gt;%.o: %.c&amp;lt;/code&amp;gt; este o regulă template care spune că dacă este necesară generarea unui fișier obiect, acesta depinde de un fișier cu același nume dar cu extensia .c, și se generează folosind tot un apel la &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a compila și alte surse în acest Makefile, tot ce este necesar este să le adăugați la lista &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
# Scrieți un program care să implementeze trei funcții:&lt;br /&gt;
#* &amp;lt;code&amp;gt;readTempCelsius&amp;lt;/code&amp;gt; care să citească și să întoarcă un număr în virgulă reprezentând o temperatură în grade Celsius;&lt;br /&gt;
#* &amp;lt;code&amp;gt;celsius2fahrenheit&amp;lt;/code&amp;gt; care să convertească un argument din grade Celsius în grade Fahrenheit;&lt;br /&gt;
#* &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să folosească celelalte două funcții pentru a converti o temperatură citită, din grade Celsius în Fahrenheit.&lt;br /&gt;
# Scrieți o funcție care să calculeze determinantul unei matrici de 3x3 sau mai simplu de 2x2. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să primească ca argumente o matrice de numere întregi, dimensiunile ei și un număr întreg reprezentând o coloană, și să întoarcă suma numerelor de pe coloana respectivă. Funcția va afișa un mesaj și va întoarce 0 daca coloana nu există în matrice. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să determine dacă un cuvânt este palindrom. Scrieți apoi un program care să citească cuvinte de la tastatură până când cuvântul introdus are lungimea 0. Pentru fiecare cuvânt introdus se va specifica dacă este sau nu palindrom.&lt;br /&gt;
#Scrieți o funcție care să compare doi vectori de caractere. Funcția primește doi vectori de caractere și are un rezultat întreg. &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;HINT: asemenea funcției strcmp&amp;lt;/font&amp;gt;. Funcția ce trebuie realizată întoarce:&lt;br /&gt;
#*număr pozitiv dacă primul șir e mai mare&lt;br /&gt;
#*număr negativ dacă primul sir e mai mic&lt;br /&gt;
#*zero dacă sunt egale&lt;br /&gt;
#Scrieți o funcție &amp;lt;code&amp;gt;sortare&amp;lt;/code&amp;gt; care primește ca și argumente un întreg sort si un vector v. Funcția modifică elementele vectorului în funcție de întregul sort, astfel numere mai mari ca sort vor fi plasate la începutul vectorului.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=5000</id>
		<title>PC Laborator 9</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=5000"/>
		<updated>2016-12-06T20:56:49Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Funcții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
  &lt;br /&gt;
În urma acestui laborator, studentul va fi capabil: &lt;br /&gt;
* să înțeleagă conceptul de funcție;&lt;br /&gt;
* să definească funcții, sub formă de prototip și implementare;&lt;br /&gt;
* să apeleze funcții;&lt;br /&gt;
* să utilizeze corect cuvintele cheie &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Funcții =&lt;br /&gt;
&lt;br /&gt;
Funcțiile sunt secțiuni ale unui program care se pot apela de mai multe ori, care pot modifica starea programului (prin modificarea variabilelor sau operații de IO - citire și scriere de date) și care pot întoarce un rezultat.&lt;br /&gt;
&lt;br /&gt;
== Definirea/ Declararea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
O funcție în C este &amp;lt;span style=&amp;quot;color: black; font-weight: bold&amp;quot;&amp;gt;declarată&amp;lt;/span&amp;gt; în următorul fel:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie(lista_tip_argumente);&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; definește tipul de date din care face parte valoarea returnată de funcție; dacă funcția nu întoarce nici o valoare (este folosit exclusiv pentru modificarea stării programului sau pentru IO), atunci se mai numește și procedură, iar tipul returnat este &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_functie&amp;lt;/code&amp;gt; reprezintă numele funcției care este folosit ulterior pentru apelul ei, și care respectă aceleași reguli ca orice identificator generic din C: poate conține exclusiv cifre, litere mici și mari, caracterul underscore (_), și nu poate începe cu cifră;&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_tip_argumente&amp;lt;/code&amp;gt; reprezintă o listă de tipuri de date, separate prin virgulă, din care fac parte argumentele funcției; această listă poate fi goală (dacă funcția nu are argumente).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O declarație de funcție se numește și &amp;lt;span style=&amp;quot;color: blue; font-weight: bold&amp;quot;&amp;gt;prototip&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de declarații de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max(float, float);&lt;br /&gt;
int inc(int);&lt;br /&gt;
void print(char[]);&lt;br /&gt;
int getAge();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
Implementarea (definirea) unei funcții în C se face în felul următor:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie(lista_argumente) {&lt;br /&gt;
     statement_1&lt;br /&gt;
     statement_2&lt;br /&gt;
     ...&lt;br /&gt;
     statement_n&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; reprezintă tipul returnat al funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_funcție&amp;lt;/code&amp;gt; reprezintă numele funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_argumente&amp;lt;/code&amp;gt; reprezintă o listă de definiții de variabile (de forma &amp;quot;tip_data nume_variabilă&amp;quot;) care sunt argumentele funcției; această listă poate fi goală;&lt;br /&gt;
* &amp;lt;code&amp;gt;statement_...&amp;lt;/code&amp;gt; reprezintă una sau mai multe instructiuni (&amp;#039;&amp;#039;statement&amp;#039;&amp;#039;) C care implementează comportamentul funcției și care se execută de fiecare dată când se apelează funcția; corpul unei funcții poate fi gol (poate să nu conțină nici un statement), dar atunci apelul ei nu are nici un efect; dacă funcția nu este de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, atunci obligatoriu ultima instrucțiune executată din funcție trebuie să fie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, care setează valoarea întoarsă de funcție.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de implementări (definiri) de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max(float a, float b) {&lt;br /&gt;
    if (a &amp;gt;= b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inc(int value) {&lt;br /&gt;
    return value + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print(char string[]) {&lt;br /&gt;
    printf(&amp;quot;%s&amp;quot;, string);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int getAge() {&lt;br /&gt;
    return 20;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observații ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție nu este accesibilă/ apelabilă până nu este declarată în program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Nu pot exista mai multe funcții cu același prototip.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție poate avea o singură definiție/implementare și oricâte declarații.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție declarată și ne-implementată (ne-definită) poate fi apelată, și fișierul va compila cu succes, dar linker-ul nu va reuși să creeze fișierul executabil. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int inc(int);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;n + 1 = %d\n&amp;quot;, inc(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Implementarea unei funcții ține loc implicit și de declarație, dacă aceasta nu există deja.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oprește execuția funcției, indiferent dacă mai există sau nu instrucțiuni după &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; poate fi folosit și în funcții &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar urmat doar de punct și virgulă (;) și are ca efect ieșirea imediată din funcție. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printIfNotZero(int value) {&lt;br /&gt;
    if (value == 0) return;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S-a apelat functia printIfNotZero cu valoarea %d.\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printIfNotZero(1);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    printIfNotZero(2);&lt;br /&gt;
    printIfNotZero(3);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;În C, argumentele unei funcții sunt &amp;quot;pass-by-value&amp;quot;, în sensul că ele conțin valorile variabilelor cu care se apelează funcția, nu se identifică cu aceste variabile. Altfel spus, modificarea unui argument al funcției nu se propagă în afara funcției. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void inc(int value) {&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la intrare, value este %d\n&amp;quot;, value);&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la iesire, value este %d\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 3;&lt;br /&gt;
    printf(&amp;quot;Inainte de &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    inc(n);&lt;br /&gt;
    printf(&amp;quot;După &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programe din mai multe fișiere =&lt;br /&gt;
&lt;br /&gt;
Programele complexe pot fi sparte în mai multe fișiere. În general, prin convenție, într-un fișier se scriu funcții care au legătură între ele, în sensul că sunt folosite pentru aceeași funcționalitate (de exemplu, funcții pentru criptare, sau funcții pentru IO, sau funcții pentru operații matematice, etc.). Pentru că aceste funcții pot teoretic fi folosite în multiple alte funcții din alte fișiere, sistemul cel mai des întâlnit pentru separarea acestor funcții este următorul:&lt;br /&gt;
* prototipurile funcțiilor se scriu într-un fișier cu extensia .h (header), iar acest fișier header este inclus acolo unde aceste funcții sunt apelate; aceste fișiere header trebuie obligatoriu să aibă gardă de dublă incluziune.&lt;br /&gt;
* implementările funcțiilor se scriu într-un fișier sursă .c, care include header-ul de mai sus, și care este compilat separat într-un object file.&lt;br /&gt;
* toate fișierele obiect se link-editează apoi într-un fișier executabil.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CUSTOM_MATH_H&lt;br /&gt;
#define CUSTOM_MATH_H&lt;br /&gt;
&lt;br /&gt;
long long factorial (int);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
long long factorial (int n) {&lt;br /&gt;
    long long result = 1;&lt;br /&gt;
    int i;&lt;br /&gt;
    if (n &amp;lt; 0) return 0;&lt;br /&gt;
    for (i = 2; i &amp;lt; n; i++) {&lt;br /&gt;
        result *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;main.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;%d! = %d\n&amp;quot;, n, factorial(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a obține executabilul pentru exemplul de mai sus, se compilează fiecare fișier sursă într-un object file:&lt;br /&gt;
 gcc -c custom_math.c -o custom_math.o&lt;br /&gt;
 gcc -c main.c -o main.o&lt;br /&gt;
&lt;br /&gt;
Apoi, se link-editează cele două surse împreună într-un executabil:&lt;br /&gt;
 gcc custom_math.o main.o -o main&lt;br /&gt;
&lt;br /&gt;
== Makefile pentru compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
C_FILES=custom_math.c main.c&lt;br /&gt;
OBJ_FILES=$(C_FILES:.c=.o)&lt;br /&gt;
&lt;br /&gt;
main: $(OBJ_FILES)&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
%.o: %.c&lt;br /&gt;
	gcc -c $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clear&lt;br /&gt;
clear:&lt;br /&gt;
	rm -rf main $(OBJ_FILES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt; definește o variabilă care conține o listă cu fișierele sursă ce se doresc compilate.&lt;br /&gt;
# &amp;lt;code&amp;gt;OBJ_FILES&amp;lt;/code&amp;gt; reprezintă tot lista cu fișierele sursă, dar în care extensia .c se transformă în .o (astfel, se obține lista cu fișierele obiect necesare pentru compilare).&lt;br /&gt;
# Executabilul &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; depinde de toate fișierele obiect și se generează prin apelul lui &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regula &amp;lt;code&amp;gt;%.o: %.c&amp;lt;/code&amp;gt; este o regulă template care spune că dacă este necesară generarea unui fișier obiect, acesta depinde de un fișier cu același nume dar cu extensia .c, și se generează folosind tot un apel la &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a compila și alte surse în acest Makefile, tot ce este necesar este să le adăugați la lista &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
# Scrieți un program care să implementeze trei funcții:&lt;br /&gt;
#* &amp;lt;code&amp;gt;readTempCelsius&amp;lt;/code&amp;gt; care să citească și să întoarcă un număr în virgulă reprezentând o temperatură în grade Celsius;&lt;br /&gt;
#* &amp;lt;code&amp;gt;celsius2fahrenheit&amp;lt;/code&amp;gt; care să convertească un argument din grade Celsius în grade Fahrenheit;&lt;br /&gt;
#* &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să folosească celelalte două funcții pentru a converti o temperatură citită, din grade Celsius în Fahrenheit.&lt;br /&gt;
# Scrieți o funcție care să calculeze determinantul unei matrici de 3x3 sau mai simplu de 2x2. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să primească ca argumente o matrice de numere întregi, dimensiunile ei și un număr întreg reprezentând o coloană, și să întoarcă suma numerelor de pe coloana respectivă. Funcția va afișa un mesaj și va întoarce 0 daca coloana nu există în matrice. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să determine dacă un cuvânt este palindrom. Scrieți apoi un program care să citească cuvinte de la tastatură până când cuvântul introdus are lungimea 0. Pentru fiecare cuvânt introdus se va specifica dacă este sau nu palindrom.&lt;br /&gt;
#Scrieți o funcție care să compare doi vectori de caractere.Funcția primește doi vectori de caractere și are un rezultat întreg.&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;HINT: asemenea funcției strcmp &amp;lt;/font&amp;gt;.Funcția ce trebuie realizată întoarce:&lt;br /&gt;
#*număr pozitiv dacă primul șir e mai mare&lt;br /&gt;
#*număr negativ dacă primul sir e mai mic&lt;br /&gt;
#*zero dacă sunt egale&lt;br /&gt;
#Scrieți o funcție &amp;lt;code&amp;gt;sortare&amp;lt;/code&amp;gt; care primește ca și argumente un întreg sort si un vector v. Funcția modifică elementele vectorului în funcție de întregul sort,astfel numere mai mari ca sort vor fi plasate la începutul vectorului.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4984</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4984"/>
		<updated>2016-11-23T20:59:35Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Compararea  a doua șiruri de caractere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
&lt;br /&gt;
[[Fișier:ascii_table.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; marchează sfârșitul șirului, iar acolo se oprește numărarea.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Citirea șirului caracter cu caracter, până la întâlnirea caracterului cu codul ASCII 10 (newline - \n), moment în care se scrie caracterul de sfârșit de șir (null terminator - \0):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
    scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere[i]);&lt;br /&gt;
    /* 10 este codul ascii pentru \n, adica enter */&lt;br /&gt;
    if (sir_de_caractere[i] == 10) {&lt;br /&gt;
        sir_de_caractere[i] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul caracter alb - spațiu, tab sau newline):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3.  Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%[^\n]&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul newline pe care nu îl va consuma din stream - acesta va trebui eliminat manual cu apel de &amp;lt;code&amp;gt;getchar()&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%[^\n]&amp;quot;, sir_de_caractere);&lt;br /&gt;
getchar();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Se folosește &amp;lt;code&amp;gt;fgets&amp;lt;/code&amp;gt; (atenție, acestă funcție va citi maxim MAX_SIZE - 1 caractere de la tastatură, sau până la întâlnirea lui \n, în care situație caracterul \n va fi adăugat în șir):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
fgets(sir_de_caractere, MAX_SIZE, stdin);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:&lt;br /&gt;
  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE]; &lt;br /&gt;
scanf(&amp;quot;%s&amp;quot;,sir_de_caractere); // citire sir de caractere&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE &amp;amp;&amp;amp; sir_de_caractere [i] != &amp;#039;\0&amp;#039;; i++) {&lt;br /&gt;
    printf (&amp;quot;%c&amp;quot;, sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr(sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy(destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen(sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat(destinatie, sursa); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen(sursa) + strlen(destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp(sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* un număr negativ - dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 - dacă cele două șiruri sunt identice; &lt;br /&gt;
* un număr pozitiv - dacă sir2 este înainte din punct de vedere alfabetic.&lt;br /&gt;
&lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len = strlen(str1);&lt;br /&gt;
	size = sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
   char str1[10], str2[10], str3[20];&lt;br /&gt;
   int i, poz;&lt;br /&gt;
   printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
   printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
		str3[i] = str1[i];&lt;br /&gt;
		poz=i;&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
		str3[poz+i] = str2[i];&lt;br /&gt;
		str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple fgets &amp;amp; puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    fgets(nume, 30, stdin);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care citește de la tastatură un cuvânt.Să se afișeze cuvintele ce se obțin prin eliminarea succesiva a primei si ultimei litere din cuvântul citit.&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4983</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4983"/>
		<updated>2016-11-23T20:35:05Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Compararea  a doua șiruri de caractere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
&lt;br /&gt;
[[Fișier:ascii_table.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; marchează sfârșitul șirului, iar acolo se oprește numărarea.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Citirea șirului caracter cu caracter, până la întâlnirea caracterului cu codul ASCII 10 (newline - \n), moment în care se scrie caracterul de sfârșit de șir (null terminator - \0):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
    scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere[i]);&lt;br /&gt;
    /* 10 este codul ascii pentru \n, adica enter */&lt;br /&gt;
    if (sir_de_caractere[i] == 10) {&lt;br /&gt;
        sir_de_caractere[i] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul caracter alb - spațiu, tab sau newline):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3.  Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%[^\n]&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul newline pe care nu îl va consuma din stream - acesta va trebui eliminat manual cu apel de &amp;lt;code&amp;gt;getchar()&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%[^\n]&amp;quot;, sir_de_caractere);&lt;br /&gt;
getchar();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Se folosește &amp;lt;code&amp;gt;fgets&amp;lt;/code&amp;gt; (atenție, acestă funcție va citi maxim MAX_SIZE - 1 caractere de la tastatură, sau până la întâlnirea lui \n, în care situație caracterul \n va fi adăugat în șir):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
fgets(sir_de_caractere, MAX_SIZE, stdin);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:&lt;br /&gt;
  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE]; &lt;br /&gt;
scanf(&amp;quot;%s&amp;quot;,sir_de_caractere); // citire sir de caractere&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE &amp;amp;&amp;amp; sir_de_caractere [i] != &amp;#039;\0&amp;#039;; i++) {&lt;br /&gt;
    printf (&amp;quot;%c&amp;quot;, sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr(sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy(destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen(sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat(destinatie, sursa); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen(sursa) + strlen(destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp(sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic.&lt;br /&gt;
&lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len = strlen(str1);&lt;br /&gt;
	size = sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
   char str1[10], str2[10], str3[20];&lt;br /&gt;
   int i, poz;&lt;br /&gt;
   printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
   printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
		str3[i] = str1[i];&lt;br /&gt;
		poz=i;&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
		str3[poz+i] = str2[i];&lt;br /&gt;
		str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple fgets &amp;amp; puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    fgets(nume, 30, stdin);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care citește de la tastatură un cuvânt.Să se afișeze cuvintele ce se obțin prin eliminarea succesiva a primei si ultimei litere din cuvântul citit.&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4982</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4982"/>
		<updated>2016-11-23T20:34:51Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Concatenarea unor șiruri de caractere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
&lt;br /&gt;
[[Fișier:ascii_table.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; marchează sfârșitul șirului, iar acolo se oprește numărarea.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Citirea șirului caracter cu caracter, până la întâlnirea caracterului cu codul ASCII 10 (newline - \n), moment în care se scrie caracterul de sfârșit de șir (null terminator - \0):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
    scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere[i]);&lt;br /&gt;
    /* 10 este codul ascii pentru \n, adica enter */&lt;br /&gt;
    if (sir_de_caractere[i] == 10) {&lt;br /&gt;
        sir_de_caractere[i] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul caracter alb - spațiu, tab sau newline):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3.  Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%[^\n]&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul newline pe care nu îl va consuma din stream - acesta va trebui eliminat manual cu apel de &amp;lt;code&amp;gt;getchar()&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%[^\n]&amp;quot;, sir_de_caractere);&lt;br /&gt;
getchar();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Se folosește &amp;lt;code&amp;gt;fgets&amp;lt;/code&amp;gt; (atenție, acestă funcție va citi maxim MAX_SIZE - 1 caractere de la tastatură, sau până la întâlnirea lui \n, în care situație caracterul \n va fi adăugat în șir):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
fgets(sir_de_caractere, MAX_SIZE, stdin);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:&lt;br /&gt;
  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE]; &lt;br /&gt;
scanf(&amp;quot;%s&amp;quot;,sir_de_caractere); // citire sir de caractere&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE &amp;amp;&amp;amp; sir_de_caractere [i] != &amp;#039;\0&amp;#039;; i++) {&lt;br /&gt;
    printf (&amp;quot;%c&amp;quot;, sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr(sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy(destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen(sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat(destinatie, sursa); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen(sursa) + strlen(destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len = strlen(str1);&lt;br /&gt;
	size = sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
   char str1[10], str2[10], str3[20];&lt;br /&gt;
   int i, poz;&lt;br /&gt;
   printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
   printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
		str3[i] = str1[i];&lt;br /&gt;
		poz=i;&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
		str3[poz+i] = str2[i];&lt;br /&gt;
		str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple fgets &amp;amp; puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    fgets(nume, 30, stdin);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care citește de la tastatură un cuvânt.Să se afișeze cuvintele ce se obțin prin eliminarea succesiva a primei si ultimei litere din cuvântul citit.&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4981</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4981"/>
		<updated>2016-11-23T20:34:32Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Copierea unui șir de caractere  în altul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
&lt;br /&gt;
[[Fișier:ascii_table.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; marchează sfârșitul șirului, iar acolo se oprește numărarea.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Citirea șirului caracter cu caracter, până la întâlnirea caracterului cu codul ASCII 10 (newline - \n), moment în care se scrie caracterul de sfârșit de șir (null terminator - \0):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
    scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere[i]);&lt;br /&gt;
    /* 10 este codul ascii pentru \n, adica enter */&lt;br /&gt;
    if (sir_de_caractere[i] == 10) {&lt;br /&gt;
        sir_de_caractere[i] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul caracter alb - spațiu, tab sau newline):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3.  Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%[^\n]&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul newline pe care nu îl va consuma din stream - acesta va trebui eliminat manual cu apel de &amp;lt;code&amp;gt;getchar()&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%[^\n]&amp;quot;, sir_de_caractere);&lt;br /&gt;
getchar();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Se folosește &amp;lt;code&amp;gt;fgets&amp;lt;/code&amp;gt; (atenție, acestă funcție va citi maxim MAX_SIZE - 1 caractere de la tastatură, sau până la întâlnirea lui \n, în care situație caracterul \n va fi adăugat în șir):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
fgets(sir_de_caractere, MAX_SIZE, stdin);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:&lt;br /&gt;
  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE]; &lt;br /&gt;
scanf(&amp;quot;%s&amp;quot;,sir_de_caractere); // citire sir de caractere&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE &amp;amp;&amp;amp; sir_de_caractere [i] != &amp;#039;\0&amp;#039;; i++) {&lt;br /&gt;
    printf (&amp;quot;%c&amp;quot;, sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr(sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy(destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen(sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len = strlen(str1);&lt;br /&gt;
	size = sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
   char str1[10], str2[10], str3[20];&lt;br /&gt;
   int i, poz;&lt;br /&gt;
   printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
   printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
		str3[i] = str1[i];&lt;br /&gt;
		poz=i;&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
		str3[poz+i] = str2[i];&lt;br /&gt;
		str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple fgets &amp;amp; puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    fgets(nume, 30, stdin);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care citește de la tastatură un cuvânt.Să se afișeze cuvintele ce se obțin prin eliminarea succesiva a primei si ultimei litere din cuvântul citit.&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4980</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4980"/>
		<updated>2016-11-23T20:34:16Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Copierea unui șir de caractere  în altul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
&lt;br /&gt;
[[Fișier:ascii_table.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; marchează sfârșitul șirului, iar acolo se oprește numărarea.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Citirea șirului caracter cu caracter, până la întâlnirea caracterului cu codul ASCII 10 (newline - \n), moment în care se scrie caracterul de sfârșit de șir (null terminator - \0):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
    scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere[i]);&lt;br /&gt;
    /* 10 este codul ascii pentru \n, adica enter */&lt;br /&gt;
    if (sir_de_caractere[i] == 10) {&lt;br /&gt;
        sir_de_caractere[i] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul caracter alb - spațiu, tab sau newline):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3.  Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%[^\n]&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul newline pe care nu îl va consuma din stream - acesta va trebui eliminat manual cu apel de &amp;lt;code&amp;gt;getchar()&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%[^\n]&amp;quot;, sir_de_caractere);&lt;br /&gt;
getchar();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Se folosește &amp;lt;code&amp;gt;fgets&amp;lt;/code&amp;gt; (atenție, acestă funcție va citi maxim MAX_SIZE - 1 caractere de la tastatură, sau până la întâlnirea lui \n, în care situație caracterul \n va fi adăugat în șir):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
fgets(sir_de_caractere, MAX_SIZE, stdin);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:&lt;br /&gt;
  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE]; &lt;br /&gt;
scanf(&amp;quot;%s&amp;quot;,sir_de_caractere); // citire sir de caractere&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE &amp;amp;&amp;amp; sir_de_caractere [i] != &amp;#039;\0&amp;#039;; i++) {&lt;br /&gt;
    printf (&amp;quot;%c&amp;quot;, sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr(sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy(destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len = strlen(str1);&lt;br /&gt;
	size = sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
   char str1[10], str2[10], str3[20];&lt;br /&gt;
   int i, poz;&lt;br /&gt;
   printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
   printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
		str3[i] = str1[i];&lt;br /&gt;
		poz=i;&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
		str3[poz+i] = str2[i];&lt;br /&gt;
		str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple fgets &amp;amp; puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    fgets(nume, 30, stdin);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care citește de la tastatură un cuvânt.Să se afișeze cuvintele ce se obțin prin eliminarea succesiva a primei si ultimei litere din cuvântul citit.&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4979</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4979"/>
		<updated>2016-11-23T20:34:00Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Căutarea unui caracter într-un șir de caractere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
&lt;br /&gt;
[[Fișier:ascii_table.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; marchează sfârșitul șirului, iar acolo se oprește numărarea.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Citirea șirului caracter cu caracter, până la întâlnirea caracterului cu codul ASCII 10 (newline - \n), moment în care se scrie caracterul de sfârșit de șir (null terminator - \0):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
    scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere[i]);&lt;br /&gt;
    /* 10 este codul ascii pentru \n, adica enter */&lt;br /&gt;
    if (sir_de_caractere[i] == 10) {&lt;br /&gt;
        sir_de_caractere[i] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul caracter alb - spațiu, tab sau newline):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3.  Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%[^\n]&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul newline pe care nu îl va consuma din stream - acesta va trebui eliminat manual cu apel de &amp;lt;code&amp;gt;getchar()&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%[^\n]&amp;quot;, sir_de_caractere);&lt;br /&gt;
getchar();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Se folosește &amp;lt;code&amp;gt;fgets&amp;lt;/code&amp;gt; (atenție, acestă funcție va citi maxim MAX_SIZE - 1 caractere de la tastatură, sau până la întâlnirea lui \n, în care situație caracterul \n va fi adăugat în șir):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
fgets(sir_de_caractere, MAX_SIZE, stdin);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:&lt;br /&gt;
  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE]; &lt;br /&gt;
scanf(&amp;quot;%s&amp;quot;,sir_de_caractere); // citire sir de caractere&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE &amp;amp;&amp;amp; sir_de_caractere [i] != &amp;#039;\0&amp;#039;; i++) {&lt;br /&gt;
    printf (&amp;quot;%c&amp;quot;, sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr(sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len = strlen(str1);&lt;br /&gt;
	size = sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
   char str1[10], str2[10], str3[20];&lt;br /&gt;
   int i, poz;&lt;br /&gt;
   printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
   printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
		str3[i] = str1[i];&lt;br /&gt;
		poz=i;&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
		str3[poz+i] = str2[i];&lt;br /&gt;
		str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple fgets &amp;amp; puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    fgets(nume, 30, stdin);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care citește de la tastatură un cuvânt.Să se afișeze cuvintele ce se obțin prin eliminarea succesiva a primei si ultimei litere din cuvântul citit.&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4978</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4978"/>
		<updated>2016-11-23T20:33:22Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Concatenarea unor șiruri de caractere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
&lt;br /&gt;
[[Fișier:ascii_table.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; marchează sfârșitul șirului, iar acolo se oprește numărarea.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Citirea șirului caracter cu caracter, până la întâlnirea caracterului cu codul ASCII 10 (newline - \n), moment în care se scrie caracterul de sfârșit de șir (null terminator - \0):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
    scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere[i]);&lt;br /&gt;
    /* 10 este codul ascii pentru \n, adica enter */&lt;br /&gt;
    if (sir_de_caractere[i] == 10) {&lt;br /&gt;
        sir_de_caractere[i] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul caracter alb - spațiu, tab sau newline):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3.  Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%[^\n]&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul newline pe care nu îl va consuma din stream - acesta va trebui eliminat manual cu apel de &amp;lt;code&amp;gt;getchar()&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%[^\n]&amp;quot;, sir_de_caractere);&lt;br /&gt;
getchar();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Se folosește &amp;lt;code&amp;gt;fgets&amp;lt;/code&amp;gt; (atenție, acestă funcție va citi maxim MAX_SIZE - 1 caractere de la tastatură, sau până la întâlnirea lui \n, în care situație caracterul \n va fi adăugat în șir):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
fgets(sir_de_caractere, MAX_SIZE, stdin);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:&lt;br /&gt;
  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE]; &lt;br /&gt;
scanf(&amp;quot;%s&amp;quot;,sir_de_caractere); // citire sir de caractere&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE &amp;amp;&amp;amp; sir_de_caractere [i] != &amp;#039;\0&amp;#039;; i++) {&lt;br /&gt;
    printf (&amp;quot;%c&amp;quot;, sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len = strlen(str1);&lt;br /&gt;
	size = sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
   char str1[10], str2[10], str3[20];&lt;br /&gt;
   int i, poz;&lt;br /&gt;
   printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
   printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
		str3[i] = str1[i];&lt;br /&gt;
		poz=i;&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
		str3[poz+i] = str2[i];&lt;br /&gt;
		str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple fgets &amp;amp; puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    fgets(nume, 30, stdin);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care citește de la tastatură un cuvânt.Să se afișeze cuvintele ce se obțin prin eliminarea succesiva a primei si ultimei litere din cuvântul citit.&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4977</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=4977"/>
		<updated>2016-11-23T18:08:49Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Citirea unui șir de caractere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
&lt;br /&gt;
[[Fișier:ascii_table.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; marchează sfârșitul șirului, iar acolo se oprește numărarea.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Citirea șirului caracter cu caracter, până la întâlnirea caracterului cu codul ASCII 10 (newline - \n), moment în care se scrie caracterul de sfârșit de șir (null terminator - \0):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
    scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere[i]);&lt;br /&gt;
    /* 10 este codul ascii pentru \n, adica enter */&lt;br /&gt;
    if (sir_de_caractere[i] == 10) {&lt;br /&gt;
        sir_de_caractere[i] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul caracter alb - spațiu, tab sau newline):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3.  Se folosește &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; cu template-ul &amp;lt;code&amp;gt;%[^\n]&amp;lt;/code&amp;gt; (atenție, acest &amp;lt;code&amp;gt;scanf&amp;lt;/code&amp;gt; va citi exclusiv până la primul newline pe care nu îl va consuma din stream - acesta va trebui eliminat manual cu apel de &amp;lt;code&amp;gt;getchar()&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%[^\n]&amp;quot;, sir_de_caractere);&lt;br /&gt;
getchar();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Se folosește &amp;lt;code&amp;gt;fgets&amp;lt;/code&amp;gt; (atenție, acestă funcție va citi maxim MAX_SIZE - 1 caractere de la tastatură, sau până la întâlnirea lui \n, în care situație caracterul \n va fi adăugat în șir):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
fgets(sir_de_caractere, MAX_SIZE, stdin);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:&lt;br /&gt;
  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE]; &lt;br /&gt;
scanf(&amp;quot;%s&amp;quot;,sir_de_caractere); // citire sir de caractere&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE &amp;amp;&amp;amp; sir_de_caractere [i] != &amp;#039;\0&amp;#039;; i++) {&lt;br /&gt;
    printf (&amp;quot;%c&amp;quot;, sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len = strlen(str1);&lt;br /&gt;
	size = sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
   char str1[10], str2[10], str3[20];&lt;br /&gt;
   int i, poz;&lt;br /&gt;
   printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
   printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
		str3[i] = str1[i];&lt;br /&gt;
		poz=i;&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
		str3[poz+i] = str2[i];&lt;br /&gt;
		str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple fgets &amp;amp; puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    fgets(nume, 30, stdin);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care citește de la tastatură un cuvânt.Să se afișeze cuvintele ce se obțin prin eliminarea succesiva a primei si ultimei litere din cuvântul citit.&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4957</id>
		<title>PC Laborator 7</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4957"/>
		<updated>2016-11-16T16:32:22Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Citirea matricilor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil:&lt;br /&gt;
*să înteleagă modul de utilizare a tablourilor de memorie&lt;br /&gt;
*să declare şi să iniţializeze vectori/matrici&lt;br /&gt;
*să implementeze algoritmi simpli în lucru cu vectori pentru rezolvarea diverselor probleme&lt;br /&gt;
&lt;br /&gt;
== Tablouri ==&lt;br /&gt;
 Tabloul de memorie este o colecţie de date stocate în locaţii succesive din memorie. Toate elementele acestuia au acelaşi tip de dată numit de obicei tip de bază.&lt;br /&gt;
Tablourile pot fi :&lt;br /&gt;
&lt;br /&gt;
*vectori (tablouri unidimensionale): șiruri de valori&lt;br /&gt;
*matrici (tablouri bidimensionale): catalogul cu note&lt;br /&gt;
*multidimensionale: pixelii unei imagini în timp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vectori ===&lt;br /&gt;
&lt;br /&gt;
 Un vector reprezintă o colecție de date de acelaşi tip reprezentate sub forma unei linii.&lt;br /&gt;
&lt;br /&gt;
====Declarația unei variabile de tip vector====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_vector&amp;gt;[&amp;lt;număr_maxim_elemente&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Exemplu=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10]; /* astfel se alocă 10 locații de memorie consecutive de tip int, ce vor corespunde valorilor vectorului v */&lt;br /&gt;
float nume_vector[100]; /* vector de tip float cu 100 elemente */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Vectorii declarați astfel sunt denumiți statici (static arrays) deoarece numărul de elemente şi spaţiul de memorie ocupat sunt constante în timpul compilării (număr_maxim_elemente fiind o constantă).&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX 100&lt;br /&gt;
...&lt;br /&gt;
unsigned long nume_vector[MAX]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Recomandare: &amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Numărătoarea elementelor începe de la 0.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; int v[10]; // primul element va fi v[0],iar ultimul element v[9] &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul va determina dimensiunea vectorului din numărul elementelor din listă.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Un alt mod de declarare este:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10] = {1, 5, 6, 8, 6, 10, 22, 32, 34, 13};      // Toate elemente sunt initializate&lt;br /&gt;
float nume_vector[] = {1.2, 2.2, 6.1, -9.3};          // Compilatorul determina dimensiunea vectorului = 4&lt;br /&gt;
int vect[1000] = {0, 1, 2, 3, 5};                     // Sunt initializate doar primele 5 elemente,restul fiind completate automat cu zero&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
Cum deja am discutat, prima poziție dintr-un vector este v[0]. Presupunem un vector are N elemente, constatăm că ultimul element este v[N-1].  A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1]. Acest lucru este posibil prin:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
// instrucțiune v[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Se poate ingnora poziția zero,însă daca avem un vector de 100 elemente declararea uzuală ar fi int v[100];, gândim valorile de la v[0] la v[99]. Daca folosim numărarea de la 1, vom avea doar 99 de locații de memorie disponibile pentru cele 100 de valori. În acest caz declararea corecta ar fi  int v[101];.&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Modul de adresare ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Indici&lt;br /&gt;
! 0&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Valoare&lt;br /&gt;
| 12&lt;br /&gt;
| 33&lt;br /&gt;
| 120&lt;br /&gt;
| 460&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, v);     // v stochează adresa primul element&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, v[1]);  // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 int v[100], n, i; // vectorul a are maxim 100 de intregi &lt;br /&gt;
&lt;br /&gt;
 scanf(&amp;quot;%d&amp;quot;, &amp;amp;n); // citeste nr de elemente &lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;v[i]); // citire elemente &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   printf(&amp;quot;%d &amp;quot;, v[i]); // scrie elemente &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matrici ===&lt;br /&gt;
&lt;br /&gt;
 O matrice reprezintă o colecție de date de acelaşi tip, ce este structurată pe linii şi coloane.&lt;br /&gt;
 Datele sunt identificate prin indicele liniei şi respectiv indicele coloanei.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039; Un vector este un caz particular de matrice cu o singură linie.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Declarația unei matrici ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_matrice&amp;gt;[&amp;lt;număr_linii&amp;gt;][&amp;lt;număr_coloane&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplul 1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int matrice[5][10]; // o matrice de întregi cu 5 linii și 10 coloane care ocupă 5 * 10 * 4 = 200 octeți&lt;br /&gt;
&lt;br /&gt;
#define MAX 100&lt;br /&gt;
float a[MAX][MAX]; // în acest caz număr linii = număr coloane = 100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int mat[N][M];&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
    for (int j = 0; j &amp;lt; M; j++) {&lt;br /&gt;
        // instrucțiune mat[i][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Accesarea elementului de pe linia i şi coloana j se face cu mat[i][j];&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Adresarea matricilor ====&lt;br /&gt;
&lt;br /&gt;
Adresarea este similară cu cea a vectorilor, doar că în acest caz lucrăm cu două dimensiuni (2D)-matrici.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, mat[1][3]) // reprezintă valorea de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, &amp;amp;mat[1][3]) // reprezintă adresa de memorie a elementului de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int mat[10][10];&lt;br /&gt;
int i, j;&lt;br /&gt;
&lt;br /&gt;
for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
    for (j = 0; j &amp;lt; 10; j++) {&lt;br /&gt;
        printf(&amp;quot;v[%d][%d] = &amp;quot;, i, j);&lt;br /&gt;
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;mat[i][j]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tablouri multidimensionale ===&lt;br /&gt;
&lt;br /&gt;
Noţiunea generală de tablou cu mai multe dimensiuni se declară astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_tablou&amp;gt;[&amp;lt;dim_1&amp;gt;][&amp;lt;dim_2&amp;gt;]...[&amp;lt;dim_n&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int cub[3][3][3];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În acest caz 3 dimensiuni pot avea un sens fizic,însă tablourile cu mai mult de 3 dimensiuni pot să nu mai aibă un sens clar, ușor perceptibil.&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie v un vector cu N valori intregi. Să se numere cate valori sunt pare/impare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se insereze un nou element z in pozitia k, restul elementelor rămânând în aceeași ordine.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citesc 2 vectori de maxim 100 elemente întregi, apoi determina și afișează intersecția celor 2 vectori.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declarați și afișați o matrice unitate.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se scrie un program care citește de la tastatură o matrice de M întregi. Să se asigure că utilizatorul introduce valori doar între 0 și 9 și să se afișeze sub forma unui vector pe ecran elementele de deasupra diagonalei principale.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se se scrie un program ce permite citirea matrici A si B reale de dimensiune MxN. Să se calculeze matricea produs C și să se stocheze toate elementele matricii mai mari ca x într-un vector v. Să se afiseze vectorul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieti un program care citeşte de la tastatură un număr natural, n (2≤n≤20), şi construieşte în memorie tabloul bidimensional cu n linii şi n coloane, având proprietătile:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;toate elementele situate pe diagonala principală sunt nule;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;fiecare linie contine, începând cu diagonala principală, de la dreapta la stânga, un şir strict crescător de numere consecutive, iar începând cu diagonala principală, de la stânga la dreapta, tot un şir strict crescător de numere consecutive.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe&lt;br /&gt;
câte o linie a ecranului, cu elementele aflate pe aceeaşi linie separate prin&lt;br /&gt;
câte un spatiu.&lt;br /&gt;
Exemplu: dacă n=5 se afişează pe ecran tabloul alăturat.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
0 1 2 3 4&lt;br /&gt;
1 0 1 2 3&lt;br /&gt;
2 1 0 1 2&lt;br /&gt;
3 2 1 0 1&lt;br /&gt;
4 3 2 1 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se înlocuiască toate vocalele cu caracterul _ și să se afiseze cuvântul obținut.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se determine dacă este sau nu palindrom.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții pentru acasă==&lt;br /&gt;
&lt;br /&gt;
# Se consideră o matrice de dimenisiune NxM,numere intregi. Să se determine linia (liniile) cu cele mai multe elemente nenule.&lt;br /&gt;
# Se consideră o matrice A de NxN elemente, cu componentele numere întregi. Să se calculeze:&lt;br /&gt;
#* suma elementelor de pe diagonala principală&lt;br /&gt;
#* produsul elmentelor de pe diagonala secundară&lt;br /&gt;
#* minimul elementelor aflate deasupra, respectiv sub diagonala principală&lt;br /&gt;
# Se consideră o matrice de NxM elemente, cu componentele numere întregi. Se cere să se calculeze suma elementelor de pe marginea matricii.&lt;br /&gt;
# Să se construiască o matrice cu n linii şi m coloane care conţine pe prima coloană, de sus în jos, toate numerele naturale de la 1 la n, în ordine crescătoare, pe coloana a doua, de sus în jos, toate numerele naturale de la 2 la n+1, în ordine crescătoare, pe a treia coloană, de sus în jos, toate numerele naturale de la 3 la n+2, în ordine crescătoare, pe a patra coloană, de sus în jos, toate numerele naturale de la 4 la n+3, în ordine crescătoare şi aşa mai departe până la coloana m. Scrieţi programul care citeşte de la tastatură două valori naturale n și m (2&amp;lt;n&amp;lt;25, 2&amp;lt;m&amp;lt;25), construieşte matricea conform cerinţei şi o afişează pe ecran, pe linii, cu spaţii între elementele de pe fiecare linie. De exemplu, dacă se citeşte de la tastatură n=3 și m=5, se va construi şi se va afişa pe ecran matricea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
1 2 3 4 5&lt;br /&gt;
2 3 4 5 6&lt;br /&gt;
3 4 5 6 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4956</id>
		<title>PC Laborator 7</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4956"/>
		<updated>2016-11-16T16:31:13Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Parcurgerea matricilor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil:&lt;br /&gt;
*să înteleagă modul de utilizare a tablourilor de memorie&lt;br /&gt;
*să declare şi să iniţializeze vectori/matrici&lt;br /&gt;
*să implementeze algoritmi simpli în lucru cu vectori pentru rezolvarea diverselor probleme&lt;br /&gt;
&lt;br /&gt;
== Tablouri ==&lt;br /&gt;
 Tabloul de memorie este o colecţie de date stocate în locaţii succesive din memorie. Toate elementele acestuia au acelaşi tip de dată numit de obicei tip de bază.&lt;br /&gt;
Tablourile pot fi :&lt;br /&gt;
&lt;br /&gt;
*vectori (tablouri unidimensionale): șiruri de valori&lt;br /&gt;
*matrici (tablouri bidimensionale): catalogul cu note&lt;br /&gt;
*multidimensionale: pixelii unei imagini în timp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vectori ===&lt;br /&gt;
&lt;br /&gt;
 Un vector reprezintă o colecție de date de acelaşi tip reprezentate sub forma unei linii.&lt;br /&gt;
&lt;br /&gt;
====Declarația unei variabile de tip vector====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_vector&amp;gt;[&amp;lt;număr_maxim_elemente&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Exemplu=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10]; /* astfel se alocă 10 locații de memorie consecutive de tip int, ce vor corespunde valorilor vectorului v */&lt;br /&gt;
float nume_vector[100]; /* vector de tip float cu 100 elemente */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Vectorii declarați astfel sunt denumiți statici (static arrays) deoarece numărul de elemente şi spaţiul de memorie ocupat sunt constante în timpul compilării (număr_maxim_elemente fiind o constantă).&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX 100&lt;br /&gt;
...&lt;br /&gt;
unsigned long nume_vector[MAX]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Recomandare: &amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Numărătoarea elementelor începe de la 0.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; int v[10]; // primul element va fi v[0],iar ultimul element v[9] &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul va determina dimensiunea vectorului din numărul elementelor din listă.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Un alt mod de declarare este:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10] = {1, 5, 6, 8, 6, 10, 22, 32, 34, 13};      // Toate elemente sunt initializate&lt;br /&gt;
float nume_vector[] = {1.2, 2.2, 6.1, -9.3};          // Compilatorul determina dimensiunea vectorului = 4&lt;br /&gt;
int vect[1000] = {0, 1, 2, 3, 5};                     // Sunt initializate doar primele 5 elemente,restul fiind completate automat cu zero&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
Cum deja am discutat, prima poziție dintr-un vector este v[0]. Presupunem un vector are N elemente, constatăm că ultimul element este v[N-1].  A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1]. Acest lucru este posibil prin:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
// instrucțiune v[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Se poate ingnora poziția zero,însă daca avem un vector de 100 elemente declararea uzuală ar fi int v[100];, gândim valorile de la v[0] la v[99]. Daca folosim numărarea de la 1, vom avea doar 99 de locații de memorie disponibile pentru cele 100 de valori. În acest caz declararea corecta ar fi  int v[101];.&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Modul de adresare ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Indici&lt;br /&gt;
! 0&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Valoare&lt;br /&gt;
| 12&lt;br /&gt;
| 33&lt;br /&gt;
| 120&lt;br /&gt;
| 460&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, v);     // v stochează adresa primul element&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, v[1]);  // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 int v[100], n, i; // vectorul a are maxim 100 de intregi &lt;br /&gt;
&lt;br /&gt;
 scanf(&amp;quot;%d&amp;quot;, &amp;amp;n); // citeste nr de elemente &lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;v[i]); // citire elemente &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   printf(&amp;quot;%d &amp;quot;, v[i]); // scrie elemente &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matrici ===&lt;br /&gt;
&lt;br /&gt;
 O matrice reprezintă o colecție de date de acelaşi tip, ce este structurată pe linii şi coloane.&lt;br /&gt;
 Datele sunt identificate prin indicele liniei şi respectiv indicele coloanei.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039; Un vector este un caz particular de matrice cu o singură linie.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Declarația unei matrici ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_matrice&amp;gt;[&amp;lt;număr_linii&amp;gt;][&amp;lt;număr_coloane&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplul 1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int matrice[5][10]; // o matrice de întregi cu 5 linii și 10 coloane care ocupă 5 * 10 * 4 = 200 octeți&lt;br /&gt;
&lt;br /&gt;
#define MAX 100&lt;br /&gt;
float a[MAX][MAX]; // în acest caz număr linii = număr coloane = 100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int mat[N][M];&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
    for (int j = 0; j &amp;lt; M; j++) {&lt;br /&gt;
        // instrucțiune mat[i][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Accesarea elementului de pe linia i şi coloana j se face cu mat[i][j];&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Adresarea matricilor ====&lt;br /&gt;
&lt;br /&gt;
Adresarea este similară cu cea a vectorilor, doar că în acest caz lucrăm cu două dimensiuni (2D)-matrici.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, mat[1][3]) // reprezintă valorea de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, &amp;amp;mat[1][3]) // reprezintă adresa de memorie a elementului de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int mat[10][10], i, j;&lt;br /&gt;
    for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
        for (j = 0; j &amp;lt; 10; j++) {&lt;br /&gt;
           printf(&amp;quot;v[%d][%d]=&amp;quot;, i, j);&lt;br /&gt;
           scanf(&amp;quot;%d&amp;quot;, &amp;amp;mat[i][j]);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tablouri multidimensionale ===&lt;br /&gt;
&lt;br /&gt;
Noţiunea generală de tablou cu mai multe dimensiuni se declară astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_tablou&amp;gt;[&amp;lt;dim_1&amp;gt;][&amp;lt;dim_2&amp;gt;]...[&amp;lt;dim_n&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int cub[3][3][3];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În acest caz 3 dimensiuni pot avea un sens fizic,însă tablourile cu mai mult de 3 dimensiuni pot să nu mai aibă un sens clar, ușor perceptibil.&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie v un vector cu N valori intregi. Să se numere cate valori sunt pare/impare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se insereze un nou element z in pozitia k, restul elementelor rămânând în aceeași ordine.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citesc 2 vectori de maxim 100 elemente întregi, apoi determina și afișează intersecția celor 2 vectori.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declarați și afișați o matrice unitate.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se scrie un program care citește de la tastatură o matrice de M întregi. Să se asigure că utilizatorul introduce valori doar între 0 și 9 și să se afișeze sub forma unui vector pe ecran elementele de deasupra diagonalei principale.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se se scrie un program ce permite citirea matrici A si B reale de dimensiune MxN. Să se calculeze matricea produs C și să se stocheze toate elementele matricii mai mari ca x într-un vector v. Să se afiseze vectorul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieti un program care citeşte de la tastatură un număr natural, n (2≤n≤20), şi construieşte în memorie tabloul bidimensional cu n linii şi n coloane, având proprietătile:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;toate elementele situate pe diagonala principală sunt nule;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;fiecare linie contine, începând cu diagonala principală, de la dreapta la stânga, un şir strict crescător de numere consecutive, iar începând cu diagonala principală, de la stânga la dreapta, tot un şir strict crescător de numere consecutive.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe&lt;br /&gt;
câte o linie a ecranului, cu elementele aflate pe aceeaşi linie separate prin&lt;br /&gt;
câte un spatiu.&lt;br /&gt;
Exemplu: dacă n=5 se afişează pe ecran tabloul alăturat.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
0 1 2 3 4&lt;br /&gt;
1 0 1 2 3&lt;br /&gt;
2 1 0 1 2&lt;br /&gt;
3 2 1 0 1&lt;br /&gt;
4 3 2 1 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se înlocuiască toate vocalele cu caracterul _ și să se afiseze cuvântul obținut.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se determine dacă este sau nu palindrom.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții pentru acasă==&lt;br /&gt;
&lt;br /&gt;
# Se consideră o matrice de dimenisiune NxM,numere intregi. Să se determine linia (liniile) cu cele mai multe elemente nenule.&lt;br /&gt;
# Se consideră o matrice A de NxN elemente, cu componentele numere întregi. Să se calculeze:&lt;br /&gt;
#* suma elementelor de pe diagonala principală&lt;br /&gt;
#* produsul elmentelor de pe diagonala secundară&lt;br /&gt;
#* minimul elementelor aflate deasupra, respectiv sub diagonala principală&lt;br /&gt;
# Se consideră o matrice de NxM elemente, cu componentele numere întregi. Se cere să se calculeze suma elementelor de pe marginea matricii.&lt;br /&gt;
# Să se construiască o matrice cu n linii şi m coloane care conţine pe prima coloană, de sus în jos, toate numerele naturale de la 1 la n, în ordine crescătoare, pe coloana a doua, de sus în jos, toate numerele naturale de la 2 la n+1, în ordine crescătoare, pe a treia coloană, de sus în jos, toate numerele naturale de la 3 la n+2, în ordine crescătoare, pe a patra coloană, de sus în jos, toate numerele naturale de la 4 la n+3, în ordine crescătoare şi aşa mai departe până la coloana m. Scrieţi programul care citeşte de la tastatură două valori naturale n și m (2&amp;lt;n&amp;lt;25, 2&amp;lt;m&amp;lt;25), construieşte matricea conform cerinţei şi o afişează pe ecran, pe linii, cu spaţii între elementele de pe fiecare linie. De exemplu, dacă se citeşte de la tastatură n=3 și m=5, se va construi şi se va afişa pe ecran matricea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
1 2 3 4 5&lt;br /&gt;
2 3 4 5 6&lt;br /&gt;
3 4 5 6 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4955</id>
		<title>PC Laborator 7</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4955"/>
		<updated>2016-11-16T16:30:31Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Citirea vectorilor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil:&lt;br /&gt;
*să înteleagă modul de utilizare a tablourilor de memorie&lt;br /&gt;
*să declare şi să iniţializeze vectori/matrici&lt;br /&gt;
*să implementeze algoritmi simpli în lucru cu vectori pentru rezolvarea diverselor probleme&lt;br /&gt;
&lt;br /&gt;
== Tablouri ==&lt;br /&gt;
 Tabloul de memorie este o colecţie de date stocate în locaţii succesive din memorie. Toate elementele acestuia au acelaşi tip de dată numit de obicei tip de bază.&lt;br /&gt;
Tablourile pot fi :&lt;br /&gt;
&lt;br /&gt;
*vectori (tablouri unidimensionale): șiruri de valori&lt;br /&gt;
*matrici (tablouri bidimensionale): catalogul cu note&lt;br /&gt;
*multidimensionale: pixelii unei imagini în timp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vectori ===&lt;br /&gt;
&lt;br /&gt;
 Un vector reprezintă o colecție de date de acelaşi tip reprezentate sub forma unei linii.&lt;br /&gt;
&lt;br /&gt;
====Declarația unei variabile de tip vector====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_vector&amp;gt;[&amp;lt;număr_maxim_elemente&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Exemplu=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10]; /* astfel se alocă 10 locații de memorie consecutive de tip int, ce vor corespunde valorilor vectorului v */&lt;br /&gt;
float nume_vector[100]; /* vector de tip float cu 100 elemente */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Vectorii declarați astfel sunt denumiți statici (static arrays) deoarece numărul de elemente şi spaţiul de memorie ocupat sunt constante în timpul compilării (număr_maxim_elemente fiind o constantă).&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX 100&lt;br /&gt;
...&lt;br /&gt;
unsigned long nume_vector[MAX]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Recomandare: &amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Numărătoarea elementelor începe de la 0.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; int v[10]; // primul element va fi v[0],iar ultimul element v[9] &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul va determina dimensiunea vectorului din numărul elementelor din listă.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Un alt mod de declarare este:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10] = {1, 5, 6, 8, 6, 10, 22, 32, 34, 13};      // Toate elemente sunt initializate&lt;br /&gt;
float nume_vector[] = {1.2, 2.2, 6.1, -9.3};          // Compilatorul determina dimensiunea vectorului = 4&lt;br /&gt;
int vect[1000] = {0, 1, 2, 3, 5};                     // Sunt initializate doar primele 5 elemente,restul fiind completate automat cu zero&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
Cum deja am discutat, prima poziție dintr-un vector este v[0]. Presupunem un vector are N elemente, constatăm că ultimul element este v[N-1].  A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1]. Acest lucru este posibil prin:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
// instrucțiune v[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Se poate ingnora poziția zero,însă daca avem un vector de 100 elemente declararea uzuală ar fi int v[100];, gândim valorile de la v[0] la v[99]. Daca folosim numărarea de la 1, vom avea doar 99 de locații de memorie disponibile pentru cele 100 de valori. În acest caz declararea corecta ar fi  int v[101];.&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Modul de adresare ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Indici&lt;br /&gt;
! 0&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Valoare&lt;br /&gt;
| 12&lt;br /&gt;
| 33&lt;br /&gt;
| 120&lt;br /&gt;
| 460&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, v);     // v stochează adresa primul element&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, v[1]);  // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 int v[100], n, i; // vectorul a are maxim 100 de intregi &lt;br /&gt;
&lt;br /&gt;
 scanf(&amp;quot;%d&amp;quot;, &amp;amp;n); // citeste nr de elemente &lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;v[i]); // citire elemente &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   printf(&amp;quot;%d &amp;quot;, v[i]); // scrie elemente &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matrici ===&lt;br /&gt;
&lt;br /&gt;
 O matrice reprezintă o colecție de date de acelaşi tip, ce este structurată pe linii şi coloane.&lt;br /&gt;
 Datele sunt identificate prin indicele liniei şi respectiv indicele coloanei.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039; Un vector este un caz particular de matrice cu o singură linie.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Declarația unei matrici ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_matrice&amp;gt;[&amp;lt;număr_linii&amp;gt;][&amp;lt;număr_coloane&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplul 1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int matrice[5][10]; // o matrice de întregi cu 5 linii și 10 coloane care ocupă 5 * 10 * 4 = 200 octeți&lt;br /&gt;
&lt;br /&gt;
#define MAX 100&lt;br /&gt;
float a[MAX][MAX]; // în acest caz număr linii = număr coloane = 100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int mat[N][M];&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
        for (int j = 0; j &amp;lt; M; j++) {&lt;br /&gt;
           // instrucțiune mat[i][j];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Accesarea elementului de pe linia i şi coloana j se face cu mat[i][j];&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Adresarea matricilor ====&lt;br /&gt;
&lt;br /&gt;
Adresarea este similară cu cea a vectorilor, doar că în acest caz lucrăm cu două dimensiuni (2D)-matrici.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, mat[1][3]) // reprezintă valorea de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, &amp;amp;mat[1][3]) // reprezintă adresa de memorie a elementului de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int mat[10][10], i, j;&lt;br /&gt;
    for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
        for (j = 0; j &amp;lt; 10; j++) {&lt;br /&gt;
           printf(&amp;quot;v[%d][%d]=&amp;quot;, i, j);&lt;br /&gt;
           scanf(&amp;quot;%d&amp;quot;, &amp;amp;mat[i][j]);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tablouri multidimensionale ===&lt;br /&gt;
&lt;br /&gt;
Noţiunea generală de tablou cu mai multe dimensiuni se declară astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_tablou&amp;gt;[&amp;lt;dim_1&amp;gt;][&amp;lt;dim_2&amp;gt;]...[&amp;lt;dim_n&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int cub[3][3][3];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În acest caz 3 dimensiuni pot avea un sens fizic,însă tablourile cu mai mult de 3 dimensiuni pot să nu mai aibă un sens clar, ușor perceptibil.&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie v un vector cu N valori intregi. Să se numere cate valori sunt pare/impare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se insereze un nou element z in pozitia k, restul elementelor rămânând în aceeași ordine.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citesc 2 vectori de maxim 100 elemente întregi, apoi determina și afișează intersecția celor 2 vectori.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declarați și afișați o matrice unitate.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se scrie un program care citește de la tastatură o matrice de M întregi. Să se asigure că utilizatorul introduce valori doar între 0 și 9 și să se afișeze sub forma unui vector pe ecran elementele de deasupra diagonalei principale.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se se scrie un program ce permite citirea matrici A si B reale de dimensiune MxN. Să se calculeze matricea produs C și să se stocheze toate elementele matricii mai mari ca x într-un vector v. Să se afiseze vectorul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieti un program care citeşte de la tastatură un număr natural, n (2≤n≤20), şi construieşte în memorie tabloul bidimensional cu n linii şi n coloane, având proprietătile:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;toate elementele situate pe diagonala principală sunt nule;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;fiecare linie contine, începând cu diagonala principală, de la dreapta la stânga, un şir strict crescător de numere consecutive, iar începând cu diagonala principală, de la stânga la dreapta, tot un şir strict crescător de numere consecutive.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe&lt;br /&gt;
câte o linie a ecranului, cu elementele aflate pe aceeaşi linie separate prin&lt;br /&gt;
câte un spatiu.&lt;br /&gt;
Exemplu: dacă n=5 se afişează pe ecran tabloul alăturat.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
0 1 2 3 4&lt;br /&gt;
1 0 1 2 3&lt;br /&gt;
2 1 0 1 2&lt;br /&gt;
3 2 1 0 1&lt;br /&gt;
4 3 2 1 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se înlocuiască toate vocalele cu caracterul _ și să se afiseze cuvântul obținut.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se determine dacă este sau nu palindrom.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții pentru acasă==&lt;br /&gt;
&lt;br /&gt;
# Se consideră o matrice de dimenisiune NxM,numere intregi. Să se determine linia (liniile) cu cele mai multe elemente nenule.&lt;br /&gt;
# Se consideră o matrice A de NxN elemente, cu componentele numere întregi. Să se calculeze:&lt;br /&gt;
#* suma elementelor de pe diagonala principală&lt;br /&gt;
#* produsul elmentelor de pe diagonala secundară&lt;br /&gt;
#* minimul elementelor aflate deasupra, respectiv sub diagonala principală&lt;br /&gt;
# Se consideră o matrice de NxM elemente, cu componentele numere întregi. Se cere să se calculeze suma elementelor de pe marginea matricii.&lt;br /&gt;
# Să se construiască o matrice cu n linii şi m coloane care conţine pe prima coloană, de sus în jos, toate numerele naturale de la 1 la n, în ordine crescătoare, pe coloana a doua, de sus în jos, toate numerele naturale de la 2 la n+1, în ordine crescătoare, pe a treia coloană, de sus în jos, toate numerele naturale de la 3 la n+2, în ordine crescătoare, pe a patra coloană, de sus în jos, toate numerele naturale de la 4 la n+3, în ordine crescătoare şi aşa mai departe până la coloana m. Scrieţi programul care citeşte de la tastatură două valori naturale n și m (2&amp;lt;n&amp;lt;25, 2&amp;lt;m&amp;lt;25), construieşte matricea conform cerinţei şi o afişează pe ecran, pe linii, cu spaţii între elementele de pe fiecare linie. De exemplu, dacă se citeşte de la tastatură n=3 și m=5, se va construi şi se va afişa pe ecran matricea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
1 2 3 4 5&lt;br /&gt;
2 3 4 5 6&lt;br /&gt;
3 4 5 6 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4954</id>
		<title>PC Laborator 7</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4954"/>
		<updated>2016-11-16T16:30:01Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Tablouri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil:&lt;br /&gt;
*să înteleagă modul de utilizare a tablourilor de memorie&lt;br /&gt;
*să declare şi să iniţializeze vectori/matrici&lt;br /&gt;
*să implementeze algoritmi simpli în lucru cu vectori pentru rezolvarea diverselor probleme&lt;br /&gt;
&lt;br /&gt;
== Tablouri ==&lt;br /&gt;
 Tabloul de memorie este o colecţie de date stocate în locaţii succesive din memorie. Toate elementele acestuia au acelaşi tip de dată numit de obicei tip de bază.&lt;br /&gt;
Tablourile pot fi :&lt;br /&gt;
&lt;br /&gt;
*vectori (tablouri unidimensionale): șiruri de valori&lt;br /&gt;
*matrici (tablouri bidimensionale): catalogul cu note&lt;br /&gt;
*multidimensionale: pixelii unei imagini în timp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vectori ===&lt;br /&gt;
&lt;br /&gt;
 Un vector reprezintă o colecție de date de acelaşi tip reprezentate sub forma unei linii.&lt;br /&gt;
&lt;br /&gt;
====Declarația unei variabile de tip vector====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_vector&amp;gt;[&amp;lt;număr_maxim_elemente&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Exemplu=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10]; /* astfel se alocă 10 locații de memorie consecutive de tip int, ce vor corespunde valorilor vectorului v */&lt;br /&gt;
float nume_vector[100]; /* vector de tip float cu 100 elemente */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Vectorii declarați astfel sunt denumiți statici (static arrays) deoarece numărul de elemente şi spaţiul de memorie ocupat sunt constante în timpul compilării (număr_maxim_elemente fiind o constantă).&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX 100&lt;br /&gt;
...&lt;br /&gt;
unsigned long nume_vector[MAX]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Recomandare: &amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Numărătoarea elementelor începe de la 0.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; int v[10]; // primul element va fi v[0],iar ultimul element v[9] &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul va determina dimensiunea vectorului din numărul elementelor din listă.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Un alt mod de declarare este:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10] = {1, 5, 6, 8, 6, 10, 22, 32, 34, 13};      // Toate elemente sunt initializate&lt;br /&gt;
float nume_vector[] = {1.2, 2.2, 6.1, -9.3};          // Compilatorul determina dimensiunea vectorului = 4&lt;br /&gt;
int vect[1000] = {0, 1, 2, 3, 5};                     // Sunt initializate doar primele 5 elemente,restul fiind completate automat cu zero&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
Cum deja am discutat, prima poziție dintr-un vector este v[0]. Presupunem un vector are N elemente, constatăm că ultimul element este v[N-1].  A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1]. Acest lucru este posibil prin:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
// instrucțiune v[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Se poate ingnora poziția zero,însă daca avem un vector de 100 elemente declararea uzuală ar fi int v[100];, gândim valorile de la v[0] la v[99]. Daca folosim numărarea de la 1, vom avea doar 99 de locații de memorie disponibile pentru cele 100 de valori. În acest caz declararea corecta ar fi  int v[101];.&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Modul de adresare ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Indici&lt;br /&gt;
! 0&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Valoare&lt;br /&gt;
| 12&lt;br /&gt;
| 33&lt;br /&gt;
| 120&lt;br /&gt;
| 460&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, v);     // v stochează adresa primul element&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, v[1]);  // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 int v[100], n, i; // vectorul a are maxim 100 de intregi &lt;br /&gt;
&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;n); // citeste nr de elemente &lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;v[i]); // citire elemente &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   printf(&amp;quot;%d &amp;quot;, v[i]); // scrie elemente &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matrici ===&lt;br /&gt;
&lt;br /&gt;
 O matrice reprezintă o colecție de date de acelaşi tip, ce este structurată pe linii şi coloane.&lt;br /&gt;
 Datele sunt identificate prin indicele liniei şi respectiv indicele coloanei.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039; Un vector este un caz particular de matrice cu o singură linie.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Declarația unei matrici ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_matrice&amp;gt;[&amp;lt;număr_linii&amp;gt;][&amp;lt;număr_coloane&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplul 1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int matrice[5][10]; // o matrice de întregi cu 5 linii și 10 coloane care ocupă 5 * 10 * 4 = 200 octeți&lt;br /&gt;
&lt;br /&gt;
#define MAX 100&lt;br /&gt;
float a[MAX][MAX]; // în acest caz număr linii = număr coloane = 100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int mat[N][M];&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
        for (int j = 0; j &amp;lt; M; j++) {&lt;br /&gt;
           // instrucțiune mat[i][j];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Accesarea elementului de pe linia i şi coloana j se face cu mat[i][j];&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Adresarea matricilor ====&lt;br /&gt;
&lt;br /&gt;
Adresarea este similară cu cea a vectorilor, doar că în acest caz lucrăm cu două dimensiuni (2D)-matrici.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, mat[1][3]) // reprezintă valorea de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, &amp;amp;mat[1][3]) // reprezintă adresa de memorie a elementului de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int mat[10][10], i, j;&lt;br /&gt;
    for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
        for (j = 0; j &amp;lt; 10; j++) {&lt;br /&gt;
           printf(&amp;quot;v[%d][%d]=&amp;quot;, i, j);&lt;br /&gt;
           scanf(&amp;quot;%d&amp;quot;, &amp;amp;mat[i][j]);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tablouri multidimensionale ===&lt;br /&gt;
&lt;br /&gt;
Noţiunea generală de tablou cu mai multe dimensiuni se declară astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_tablou&amp;gt;[&amp;lt;dim_1&amp;gt;][&amp;lt;dim_2&amp;gt;]...[&amp;lt;dim_n&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int cub[3][3][3];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În acest caz 3 dimensiuni pot avea un sens fizic,însă tablourile cu mai mult de 3 dimensiuni pot să nu mai aibă un sens clar, ușor perceptibil.&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie v un vector cu N valori intregi. Să se numere cate valori sunt pare/impare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se insereze un nou element z in pozitia k, restul elementelor rămânând în aceeași ordine.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citesc 2 vectori de maxim 100 elemente întregi, apoi determina și afișează intersecția celor 2 vectori.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declarați și afișați o matrice unitate.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se scrie un program care citește de la tastatură o matrice de M întregi. Să se asigure că utilizatorul introduce valori doar între 0 și 9 și să se afișeze sub forma unui vector pe ecran elementele de deasupra diagonalei principale.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se se scrie un program ce permite citirea matrici A si B reale de dimensiune MxN. Să se calculeze matricea produs C și să se stocheze toate elementele matricii mai mari ca x într-un vector v. Să se afiseze vectorul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieti un program care citeşte de la tastatură un număr natural, n (2≤n≤20), şi construieşte în memorie tabloul bidimensional cu n linii şi n coloane, având proprietătile:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;toate elementele situate pe diagonala principală sunt nule;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;fiecare linie contine, începând cu diagonala principală, de la dreapta la stânga, un şir strict crescător de numere consecutive, iar începând cu diagonala principală, de la stânga la dreapta, tot un şir strict crescător de numere consecutive.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe&lt;br /&gt;
câte o linie a ecranului, cu elementele aflate pe aceeaşi linie separate prin&lt;br /&gt;
câte un spatiu.&lt;br /&gt;
Exemplu: dacă n=5 se afişează pe ecran tabloul alăturat.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
0 1 2 3 4&lt;br /&gt;
1 0 1 2 3&lt;br /&gt;
2 1 0 1 2&lt;br /&gt;
3 2 1 0 1&lt;br /&gt;
4 3 2 1 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se înlocuiască toate vocalele cu caracterul _ și să se afiseze cuvântul obținut.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se determine dacă este sau nu palindrom.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții pentru acasă==&lt;br /&gt;
&lt;br /&gt;
# Se consideră o matrice de dimenisiune NxM,numere intregi. Să se determine linia (liniile) cu cele mai multe elemente nenule.&lt;br /&gt;
# Se consideră o matrice A de NxN elemente, cu componentele numere întregi. Să se calculeze:&lt;br /&gt;
#* suma elementelor de pe diagonala principală&lt;br /&gt;
#* produsul elmentelor de pe diagonala secundară&lt;br /&gt;
#* minimul elementelor aflate deasupra, respectiv sub diagonala principală&lt;br /&gt;
# Se consideră o matrice de NxM elemente, cu componentele numere întregi. Se cere să se calculeze suma elementelor de pe marginea matricii.&lt;br /&gt;
# Să se construiască o matrice cu n linii şi m coloane care conţine pe prima coloană, de sus în jos, toate numerele naturale de la 1 la n, în ordine crescătoare, pe coloana a doua, de sus în jos, toate numerele naturale de la 2 la n+1, în ordine crescătoare, pe a treia coloană, de sus în jos, toate numerele naturale de la 3 la n+2, în ordine crescătoare, pe a patra coloană, de sus în jos, toate numerele naturale de la 4 la n+3, în ordine crescătoare şi aşa mai departe până la coloana m. Scrieţi programul care citeşte de la tastatură două valori naturale n și m (2&amp;lt;n&amp;lt;25, 2&amp;lt;m&amp;lt;25), construieşte matricea conform cerinţei şi o afişează pe ecran, pe linii, cu spaţii între elementele de pe fiecare linie. De exemplu, dacă se citeşte de la tastatură n=3 și m=5, se va construi şi se va afişa pe ecran matricea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
1 2 3 4 5&lt;br /&gt;
2 3 4 5 6&lt;br /&gt;
3 4 5 6 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4953</id>
		<title>PC Laborator 7</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4953"/>
		<updated>2016-11-16T16:23:22Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Exemplu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil:&lt;br /&gt;
*să înteleagă modul de utilizare a tablourilor de memorie&lt;br /&gt;
*să declare şi să iniţializeze vectori/matrici&lt;br /&gt;
*să implementeze algoritmi simpli în lucru cu vectori pentru rezolvarea diverselor probleme&lt;br /&gt;
&lt;br /&gt;
== Tablouri ==&lt;br /&gt;
 Tabloul de memorie este o colecţie de date stocate în locaţii succesive din memorie. Toate elementele acestuia au acelaşi tip de dată numit de obicei tip de bază.&lt;br /&gt;
Tablourile pot fi :&lt;br /&gt;
&lt;br /&gt;
*vectori (tablouri unidimensionale): șiruri de valori&lt;br /&gt;
*matrici (tablouri bidimensionale): catalogul cu note&lt;br /&gt;
*multidimensionale: pixelii unei imagini în timp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vectori ===&lt;br /&gt;
&lt;br /&gt;
 Un vector reprezintă o colecție de date de acelaşi tip reprezentate sub forma unei linii.&lt;br /&gt;
&lt;br /&gt;
====Declarația unei variabile de tip vector====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_vector&amp;gt;[&amp;lt;număr_maxim_elemente&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Exemplu=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10]; /* astfel se alocă 10 locații de memorie consecutive de tip int, ce vor corespunde valorilor vectorului v */&lt;br /&gt;
float nume_vector[100]; /* vector de tip float cu 100 elemente */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Vectorii declarați astfel sunt denumiți statici (static arrays) deoarece numărul de elemente şi spaţiul de memorie ocupat sunt constante în timpul compilării (număr_maxim_elemente fiind o constantă).&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX 100&lt;br /&gt;
...&lt;br /&gt;
unsigned long nume_vector[MAX]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Recomandare: &amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Numărătoarea elementelor începe de la 0.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; int v[10]; // primul element va fi v[0],iar ultimul element v[9] &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul va determina dimensiunea vectorului din numărul elementelor din listă.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Un alt mod de declarare este:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10] = {1, 5, 6, 8, 6, 10, 22, 32, 34, 13};      // Toate elemente sunt initializate&lt;br /&gt;
float nume_vector[] = {1.2, 2.2, 6.1, -9.3};          // Compilatorul determina dimensiunea vectorului = 4&lt;br /&gt;
int vect[1000] = {0, 1, 2, 3, 5};                     // Sunt initializate doar primele 5 elemente,restul fiind completate automat cu zero&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
Cum deja am discutat prima poziție dintr-un vector este v[0]. Presupunem un vector are N elemente, constatăm că ultimul element este v[N-1].  A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1]. Acest lucru este posibil prin:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for(i=0; i &amp;lt; N; i++)&lt;br /&gt;
// instrucțiune v[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Se poate ingnora poziția zero,însă daca avem un vector de 100 elemente declararea uzuală ar fi int v[100];, gândim valorile de la v[0] la v[99]. Daca folosim numărarea de la 1, vom avea doar 99 de locații de memorie disponibile pentru cele 100 de valori. În acest caz declararea corecta ar fi  int v[101];.&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Modul de adresare ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Indici&lt;br /&gt;
! 0&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Valoare&lt;br /&gt;
| 12&lt;br /&gt;
| 33&lt;br /&gt;
| 120&lt;br /&gt;
| 460&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,v);     // v stochează adresa primul element&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,v[1]);  // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 int v[100], n, i; // vectorul a are maxim 100 de intregi &lt;br /&gt;
&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;n); // citeste nr de elemente &lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;v[i]); // citire elemente &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   printf(&amp;quot;%d &amp;quot;, v[i]); // scrie elemente &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matrici ===&lt;br /&gt;
&lt;br /&gt;
 O matrice reprezintă o colecție de date de acelaşi tip,ce este structurată pe linii şi coloane.&lt;br /&gt;
 Datele sunt identificate prin indicele liniei şi respectiv indicele coloanei.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039; Un vector este un caz particular de matrice cu o singură linie.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Declarația unei matrici ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_matrice&amp;gt;[&amp;lt;număr_linii&amp;gt;][&amp;lt;număr_coloane&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplul 1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int matrice[5][10]; // o matrice de întregi cu 5 linii și 10 coloane care ocupă 5*10*4=200 octeți&lt;br /&gt;
&lt;br /&gt;
#define MAX 100&lt;br /&gt;
float a[MAX][MAX]; // în acest caz număr linii = număr coloane = 100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int mat[N][M];&lt;br /&gt;
    for (int i=0; i &amp;lt; N; i++) {&lt;br /&gt;
        for (int j=0; j &amp;lt; M; j++){&lt;br /&gt;
          // instrucțiune mat[i][j];&lt;br /&gt;
    }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Accesarea elementului de pe linia i şi coloana j se face cu mat[i][j];&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Adresarea matricilor ====&lt;br /&gt;
&lt;br /&gt;
Adresarea este similară cu cea a vectorilor,doar ca în acest caz lucrăm cu doua dimensiuni (2D)-matrici.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,mat[1][3]) // reprezintă valorea de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,&amp;amp;mat[1][3]) // reprezintă adresa de memorie a elementului de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int mat[10][10], i, j;&lt;br /&gt;
    for (i=0; i &amp;lt; 10; i++)&lt;br /&gt;
        for (j=0; j &amp;lt; 10; j++){&lt;br /&gt;
          printf(&amp;quot;v[%d][%d]=&amp;quot;, i, j);&lt;br /&gt;
           scanf(&amp;quot;%d&amp;quot;,&amp;amp;mat[i][j]);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tablouri multidimensionale ===&lt;br /&gt;
&lt;br /&gt;
Noţiunea generală de tablou cu mai multe dimensiuni, se declară astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_tablou&amp;gt;[&amp;lt;dim_1&amp;gt;][&amp;lt;dim_2&amp;gt;]...[&amp;lt;dim_n&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int cub[3][3][3];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În acest caz 3 dimensiuni pot avea un sens fizic,însă tablourile cu mai mult de 3 dimensiuni pot să nu mai aibă un sens clar,ușor perceptibil.&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie v un vector cu N valori intregi. Să se numere cate valori sunt pare/impare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se insereze un nou element z in pozitia k, restul elementelor rămânând în aceeași ordine.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citesc 2 vectori de maxim 100 elemente întregi, apoi determina și afișează intersecția celor 2 vectori.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declarați și afișați o matrice unitate.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se scrie un program care citește de la tastatură o matrice de M întregi. Să se asigure că utilizatorul introduce valori doar între 0 și 9 și să se afișeze sub forma unui vector pe ecran elementele de deasupra diagonalei principale.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se se scrie un program ce permite citirea matrici A si B reale de dimensiune MxN. Să se calculeze matricea produs C și să se stocheze toate elementele matricii mai mari ca x într-un vector v. Să se afiseze vectorul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieti un program care citeşte de la tastatură un număr natural, n (2≤n≤20), şi construieşte în memorie tabloul bidimensional cu n linii şi n coloane, având proprietătile:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;toate elementele situate pe diagonala principală sunt nule;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;fiecare linie contine, începând cu diagonala principală, de la dreapta la stânga, un şir strict crescător de numere consecutive, iar începând cu diagonala principală, de la stânga la dreapta, tot un şir strict crescător de numere consecutive.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe&lt;br /&gt;
câte o linie a ecranului, cu elementele aflate pe aceeaşi linie separate prin&lt;br /&gt;
câte un spatiu.&lt;br /&gt;
Exemplu: dacă n=5 se afişează pe ecran tabloul alăturat.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
0 1 2 3 4&lt;br /&gt;
1 0 1 2 3&lt;br /&gt;
2 1 0 1 2&lt;br /&gt;
3 2 1 0 1&lt;br /&gt;
4 3 2 1 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se înlocuiască toate vocalele cu caracterul _ și să se afiseze cuvântul obținut.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se determine dacă este sau nu palindrom.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții pentru acasă==&lt;br /&gt;
&lt;br /&gt;
# Se consideră o matrice de dimenisiune NxM,numere intregi. Să se determine linia (liniile) cu cele mai multe elemente nenule.&lt;br /&gt;
# Se consideră o matrice A de NxN elemente, cu componentele numere întregi. Să se calculeze:&lt;br /&gt;
#* suma elementelor de pe diagonala principală&lt;br /&gt;
#* produsul elmentelor de pe diagonala secundară&lt;br /&gt;
#* minimul elementelor aflate deasupra, respectiv sub diagonala principală&lt;br /&gt;
# Se consideră o matrice de NxM elemente, cu componentele numere întregi. Se cere să se calculeze suma elementelor de pe marginea matricii.&lt;br /&gt;
# Să se construiască o matrice cu n linii şi m coloane care conţine pe prima coloană, de sus în jos, toate numerele naturale de la 1 la n, în ordine crescătoare, pe coloana a doua, de sus în jos, toate numerele naturale de la 2 la n+1, în ordine crescătoare, pe a treia coloană, de sus în jos, toate numerele naturale de la 3 la n+2, în ordine crescătoare, pe a patra coloană, de sus în jos, toate numerele naturale de la 4 la n+3, în ordine crescătoare şi aşa mai departe până la coloana m. Scrieţi programul care citeşte de la tastatură două valori naturale n și m (2&amp;lt;n&amp;lt;25, 2&amp;lt;m&amp;lt;25), construieşte matricea conform cerinţei şi o afişează pe ecran, pe linii, cu spaţii între elementele de pe fiecare linie. De exemplu, dacă se citeşte de la tastatură n=3 și m=5, se va construi şi se va afişa pe ecran matricea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
1 2 3 4 5&lt;br /&gt;
2 3 4 5 6&lt;br /&gt;
3 4 5 6 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4952</id>
		<title>PC Laborator 7</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4952"/>
		<updated>2016-11-16T16:22:13Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Exemplu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil:&lt;br /&gt;
*să înteleagă modul de utilizare a tablourilor de memorie&lt;br /&gt;
*să declare şi să iniţializeze vectori/matrici&lt;br /&gt;
*să implementeze algoritmi simpli în lucru cu vectori pentru rezolvarea diverselor probleme&lt;br /&gt;
&lt;br /&gt;
== Tablouri ==&lt;br /&gt;
 Tabloul de memorie este o colecţie de date stocate în locaţii succesive din memorie. Toate elementele acestuia au acelaşi tip de dată numit de obicei tip de bază.&lt;br /&gt;
Tablourile pot fi :&lt;br /&gt;
&lt;br /&gt;
*vectori (tablouri unidimensionale): șiruri de valori&lt;br /&gt;
*matrici (tablouri bidimensionale): catalogul cu note&lt;br /&gt;
*multidimensionale: pixelii unei imagini în timp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vectori ===&lt;br /&gt;
&lt;br /&gt;
 Un vector reprezintă o colecție de date de acelaşi tip reprezentate sub forma unei linii.&lt;br /&gt;
&lt;br /&gt;
====Declarația unei variabile de tip vector====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_vector&amp;gt;[&amp;lt;număr_maxim_elemente&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Exemplu=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10]; /* astfel se alocă 10 locații de memorie consecutive de tip int, ce vor corespunde valorilor vectorului v */&lt;br /&gt;
float nume_vector[100]; /* vector de tip float cu 100 elemente */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Vectorii declarați astfel sunt denumiți statici (static arrays) deoarece numărul de elemente şi spaţiul de memorie ocupat sunt constante în timpul compilării (număr_maxim_elemente fiind o constantă).&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX 100&lt;br /&gt;
...&lt;br /&gt;
unsigned long nume_vector[MAX]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Recomandare: &amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Numărătoarea elementelor începe de la 0.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; int v[10]; // primul element va fi v[0],iar ultimul element v[9] &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul care va determina dimensiunea vectorului din numărul elementelor din listă.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Un alt mod de declarare este:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10] = {1, 5, 6, 8, 6, 10, 22, 32, 34, 13};      // Toate elemente sunt initializate&lt;br /&gt;
float nume_vector[] = {1.2, 2.2, 6.1, -9.3};          // Compilatorul determina dimensiunea vectorului=4&lt;br /&gt;
int vect[1000] = {0, 1, 2, 3, 5};                     // Sunt initializate doar primele 5 elemente,restul fiind completate automat cu zero&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
Cum deja am discutat prima poziție dintr-un vector este v[0]. Presupunem un vector are N elemente, constatăm că ultimul element este v[N-1].  A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1]. Acest lucru este posibil prin:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for(i=0; i &amp;lt; N; i++)&lt;br /&gt;
// instrucțiune v[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Se poate ingnora poziția zero,însă daca avem un vector de 100 elemente declararea uzuală ar fi int v[100];, gândim valorile de la v[0] la v[99]. Daca folosim numărarea de la 1, vom avea doar 99 de locații de memorie disponibile pentru cele 100 de valori. În acest caz declararea corecta ar fi  int v[101];.&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Modul de adresare ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Indici&lt;br /&gt;
! 0&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Valoare&lt;br /&gt;
| 12&lt;br /&gt;
| 33&lt;br /&gt;
| 120&lt;br /&gt;
| 460&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,v);     // v stochează adresa primul element&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,v[1]);  // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 int v[100], n, i; // vectorul a are maxim 100 de intregi &lt;br /&gt;
&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;n); // citeste nr de elemente &lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;v[i]); // citire elemente &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   printf(&amp;quot;%d &amp;quot;, v[i]); // scrie elemente &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matrici ===&lt;br /&gt;
&lt;br /&gt;
 O matrice reprezintă o colecție de date de acelaşi tip,ce este structurată pe linii şi coloane.&lt;br /&gt;
 Datele sunt identificate prin indicele liniei şi respectiv indicele coloanei.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039; Un vector este un caz particular de matrice cu o singură linie.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Declarația unei matrici ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_matrice&amp;gt;[&amp;lt;număr_linii&amp;gt;][&amp;lt;număr_coloane&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplul 1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int matrice[5][10]; // o matrice de întregi cu 5 linii și 10 coloane care ocupă 5*10*4=200 octeți&lt;br /&gt;
&lt;br /&gt;
#define MAX 100&lt;br /&gt;
float a[MAX][MAX]; // în acest caz număr linii = număr coloane = 100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int mat[N][M];&lt;br /&gt;
    for (int i=0; i &amp;lt; N; i++) {&lt;br /&gt;
        for (int j=0; j &amp;lt; M; j++){&lt;br /&gt;
          // instrucțiune mat[i][j];&lt;br /&gt;
    }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Accesarea elementului de pe linia i şi coloana j se face cu mat[i][j];&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Adresarea matricilor ====&lt;br /&gt;
&lt;br /&gt;
Adresarea este similară cu cea a vectorilor,doar ca în acest caz lucrăm cu doua dimensiuni (2D)-matrici.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,mat[1][3]) // reprezintă valorea de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,&amp;amp;mat[1][3]) // reprezintă adresa de memorie a elementului de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int mat[10][10], i, j;&lt;br /&gt;
    for (i=0; i &amp;lt; 10; i++)&lt;br /&gt;
        for (j=0; j &amp;lt; 10; j++){&lt;br /&gt;
          printf(&amp;quot;v[%d][%d]=&amp;quot;, i, j);&lt;br /&gt;
           scanf(&amp;quot;%d&amp;quot;,&amp;amp;mat[i][j]);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tablouri multidimensionale ===&lt;br /&gt;
&lt;br /&gt;
Noţiunea generală de tablou cu mai multe dimensiuni, se declară astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_tablou&amp;gt;[&amp;lt;dim_1&amp;gt;][&amp;lt;dim_2&amp;gt;]...[&amp;lt;dim_n&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int cub[3][3][3];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În acest caz 3 dimensiuni pot avea un sens fizic,însă tablourile cu mai mult de 3 dimensiuni pot să nu mai aibă un sens clar,ușor perceptibil.&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie v un vector cu N valori intregi. Să se numere cate valori sunt pare/impare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se insereze un nou element z in pozitia k, restul elementelor rămânând în aceeași ordine.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citesc 2 vectori de maxim 100 elemente întregi, apoi determina și afișează intersecția celor 2 vectori.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declarați și afișați o matrice unitate.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se scrie un program care citește de la tastatură o matrice de M întregi. Să se asigure că utilizatorul introduce valori doar între 0 și 9 și să se afișeze sub forma unui vector pe ecran elementele de deasupra diagonalei principale.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se se scrie un program ce permite citirea matrici A si B reale de dimensiune MxN. Să se calculeze matricea produs C și să se stocheze toate elementele matricii mai mari ca x într-un vector v. Să se afiseze vectorul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieti un program care citeşte de la tastatură un număr natural, n (2≤n≤20), şi construieşte în memorie tabloul bidimensional cu n linii şi n coloane, având proprietătile:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;toate elementele situate pe diagonala principală sunt nule;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;fiecare linie contine, începând cu diagonala principală, de la dreapta la stânga, un şir strict crescător de numere consecutive, iar începând cu diagonala principală, de la stânga la dreapta, tot un şir strict crescător de numere consecutive.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe&lt;br /&gt;
câte o linie a ecranului, cu elementele aflate pe aceeaşi linie separate prin&lt;br /&gt;
câte un spatiu.&lt;br /&gt;
Exemplu: dacă n=5 se afişează pe ecran tabloul alăturat.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
0 1 2 3 4&lt;br /&gt;
1 0 1 2 3&lt;br /&gt;
2 1 0 1 2&lt;br /&gt;
3 2 1 0 1&lt;br /&gt;
4 3 2 1 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se înlocuiască toate vocalele cu caracterul _ și să se afiseze cuvântul obținut.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se determine dacă este sau nu palindrom.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții pentru acasă==&lt;br /&gt;
&lt;br /&gt;
# Se consideră o matrice de dimenisiune NxM,numere intregi. Să se determine linia (liniile) cu cele mai multe elemente nenule.&lt;br /&gt;
# Se consideră o matrice A de NxN elemente, cu componentele numere întregi. Să se calculeze:&lt;br /&gt;
#* suma elementelor de pe diagonala principală&lt;br /&gt;
#* produsul elmentelor de pe diagonala secundară&lt;br /&gt;
#* minimul elementelor aflate deasupra, respectiv sub diagonala principală&lt;br /&gt;
# Se consideră o matrice de NxM elemente, cu componentele numere întregi. Se cere să se calculeze suma elementelor de pe marginea matricii.&lt;br /&gt;
# Să se construiască o matrice cu n linii şi m coloane care conţine pe prima coloană, de sus în jos, toate numerele naturale de la 1 la n, în ordine crescătoare, pe coloana a doua, de sus în jos, toate numerele naturale de la 2 la n+1, în ordine crescătoare, pe a treia coloană, de sus în jos, toate numerele naturale de la 3 la n+2, în ordine crescătoare, pe a patra coloană, de sus în jos, toate numerele naturale de la 4 la n+3, în ordine crescătoare şi aşa mai departe până la coloana m. Scrieţi programul care citeşte de la tastatură două valori naturale n și m (2&amp;lt;n&amp;lt;25, 2&amp;lt;m&amp;lt;25), construieşte matricea conform cerinţei şi o afişează pe ecran, pe linii, cu spaţii între elementele de pe fiecare linie. De exemplu, dacă se citeşte de la tastatură n=3 și m=5, se va construi şi se va afişa pe ecran matricea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
1 2 3 4 5&lt;br /&gt;
2 3 4 5 6&lt;br /&gt;
3 4 5 6 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4951</id>
		<title>PC Laborator 7</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=4951"/>
		<updated>2016-11-16T16:16:10Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Tablouri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil:&lt;br /&gt;
*să înteleagă modul de utilizare a tablourilor de memorie&lt;br /&gt;
*să declare şi să iniţializeze vectori/matrici&lt;br /&gt;
*să implementeze algoritmi simpli în lucru cu vectori pentru rezolvarea diverselor probleme&lt;br /&gt;
&lt;br /&gt;
== Tablouri ==&lt;br /&gt;
 Tabloul de memorie este o colecţie de date stocate în locaţii succesive din memorie. Toate elementele acestuia au acelaşi tip de dată numit de obicei tip de bază.&lt;br /&gt;
Tablourile pot fi :&lt;br /&gt;
&lt;br /&gt;
*vectori (tablouri unidimensionale): șiruri de valori&lt;br /&gt;
*matrici (tablouri bidimensionale): catalogul cu note&lt;br /&gt;
*multidimensionale: pixelii unei imagini în timp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vectori ===&lt;br /&gt;
&lt;br /&gt;
 Un vector reprezintă o colecție de date de acelaşi tip reprezentate sub forma unei linii.&lt;br /&gt;
&lt;br /&gt;
====Declarația unei variabile de tip vector====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_vector&amp;gt;[&amp;lt;număr_maxim_elemente&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Exemplu=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10]; /* astfel se alocă 10 locații de memorie consecutive de tip int, ce vor corespunde valorilor vectorului v */&lt;br /&gt;
float nume_vector[100]; /* vector de tip float cu 100 elemente */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Vectorii declarați astfel sunt denumiți statici (static arrays) deoarece numărul de elemente şi spaţiul de memorie ocupat este constant în timpul compilării. (număr_maxim_elemente fiind o constantă).&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX 100&lt;br /&gt;
...&lt;br /&gt;
unsigned long nume_vector[MAX]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Recomandare: &amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Numărătoarea elementelor începe de la 0.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; int v[10]; // primul element va fi v[0],iar ultimul element v[9] &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul care va determina dimensiunea vectorului din numărul elementelor din listă.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Un alt mod de declarare este:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10] = {1, 5, 6, 8, 6, 10, 22, 32, 34, 13};      // Toate elemente sunt initializate&lt;br /&gt;
float nume_vector[] = {1.2, 2.2, 6.1, -9.3};          // Compilatorul determina dimensiunea vectorului=4&lt;br /&gt;
int vect[1000] = {0, 1, 2, 3, 5};                     // Sunt initializate doar primele 5 elemente,restul fiind completate automat cu zero&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
Cum deja am discutat prima poziție dintr-un vector este v[0]. Presupunem un vector are N elemente, constatăm că ultimul element este v[N-1].  A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1]. Acest lucru este posibil prin:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for(i=0; i &amp;lt; N; i++)&lt;br /&gt;
// instrucțiune v[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Se poate ingnora poziția zero,însă daca avem un vector de 100 elemente declararea uzuală ar fi int v[100];, gândim valorile de la v[0] la v[99]. Daca folosim numărarea de la 1, vom avea doar 99 de locații de memorie disponibile pentru cele 100 de valori. În acest caz declararea corecta ar fi  int v[101];.&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Modul de adresare ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Indici&lt;br /&gt;
! 0&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Valoare&lt;br /&gt;
| 12&lt;br /&gt;
| 33&lt;br /&gt;
| 120&lt;br /&gt;
| 460&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,v);     // v stochează adresa primul element&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,v[1]);  // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 int v[100], n, i; // vectorul a are maxim 100 de intregi &lt;br /&gt;
&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;n); // citeste nr de elemente &lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;v[i]); // citire elemente &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   printf(&amp;quot;%d &amp;quot;, v[i]); // scrie elemente &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matrici ===&lt;br /&gt;
&lt;br /&gt;
 O matrice reprezintă o colecție de date de acelaşi tip,ce este structurată pe linii şi coloane.&lt;br /&gt;
 Datele sunt identificate prin indicele liniei şi respectiv indicele coloanei.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039; Un vector este un caz particular de matrice cu o singură linie.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Declarația unei matrici ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_matrice&amp;gt;[&amp;lt;număr_linii&amp;gt;][&amp;lt;număr_coloane&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplul 1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int matrice[5][10]; // o matrice de întregi cu 5 linii și 10 coloane care ocupă 5*10*4=200 octeți&lt;br /&gt;
&lt;br /&gt;
#define MAX 100&lt;br /&gt;
float a[MAX][MAX]; // în acest caz număr linii = număr coloane = 100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int mat[N][M];&lt;br /&gt;
    for (int i=0; i &amp;lt; N; i++) {&lt;br /&gt;
        for (int j=0; j &amp;lt; M; j++){&lt;br /&gt;
          // instrucțiune mat[i][j];&lt;br /&gt;
    }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Accesarea elementului de pe linia i şi coloana j se face cu mat[i][j];&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Adresarea matricilor ====&lt;br /&gt;
&lt;br /&gt;
Adresarea este similară cu cea a vectorilor,doar ca în acest caz lucrăm cu doua dimensiuni (2D)-matrici.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,mat[1][3]) // reprezintă valorea de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,&amp;amp;mat[1][3]) // reprezintă adresa de memorie a elementului de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int mat[10][10], i, j;&lt;br /&gt;
    for (i=0; i &amp;lt; 10; i++)&lt;br /&gt;
        for (j=0; j &amp;lt; 10; j++){&lt;br /&gt;
          printf(&amp;quot;v[%d][%d]=&amp;quot;, i, j);&lt;br /&gt;
           scanf(&amp;quot;%d&amp;quot;,&amp;amp;mat[i][j]);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tablouri multidimensionale ===&lt;br /&gt;
&lt;br /&gt;
Noţiunea generală de tablou cu mai multe dimensiuni, se declară astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_tablou&amp;gt;[&amp;lt;dim_1&amp;gt;][&amp;lt;dim_2&amp;gt;]...[&amp;lt;dim_n&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int cub[3][3][3];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În acest caz 3 dimensiuni pot avea un sens fizic,însă tablourile cu mai mult de 3 dimensiuni pot să nu mai aibă un sens clar,ușor perceptibil.&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie v un vector cu N valori intregi. Să se numere cate valori sunt pare/impare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se insereze un nou element z in pozitia k, restul elementelor rămânând în aceeași ordine.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citesc 2 vectori de maxim 100 elemente întregi, apoi determina și afișează intersecția celor 2 vectori.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Declarați și afișați o matrice unitate.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se scrie un program care citește de la tastatură o matrice de M întregi. Să se asigure că utilizatorul introduce valori doar între 0 și 9 și să se afișeze sub forma unui vector pe ecran elementele de deasupra diagonalei principale.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se se scrie un program ce permite citirea matrici A si B reale de dimensiune MxN. Să se calculeze matricea produs C și să se stocheze toate elementele matricii mai mari ca x într-un vector v. Să se afiseze vectorul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieti un program care citeşte de la tastatură un număr natural, n (2≤n≤20), şi construieşte în memorie tabloul bidimensional cu n linii şi n coloane, având proprietătile:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;toate elementele situate pe diagonala principală sunt nule;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;fiecare linie contine, începând cu diagonala principală, de la dreapta la stânga, un şir strict crescător de numere consecutive, iar începând cu diagonala principală, de la stânga la dreapta, tot un şir strict crescător de numere consecutive.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe&lt;br /&gt;
câte o linie a ecranului, cu elementele aflate pe aceeaşi linie separate prin&lt;br /&gt;
câte un spatiu.&lt;br /&gt;
Exemplu: dacă n=5 se afişează pe ecran tabloul alăturat.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
0 1 2 3 4&lt;br /&gt;
1 0 1 2 3&lt;br /&gt;
2 1 0 1 2&lt;br /&gt;
3 2 1 0 1&lt;br /&gt;
4 3 2 1 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se înlocuiască toate vocalele cu caracterul _ și să se afiseze cuvântul obținut.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citeste un cuvânt de maxim 20 de caractere de la tastatură, să se determine dacă este sau nu palindrom.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții pentru acasă==&lt;br /&gt;
&lt;br /&gt;
# Se consideră o matrice de dimenisiune NxM,numere intregi. Să se determine linia (liniile) cu cele mai multe elemente nenule.&lt;br /&gt;
# Se consideră o matrice A de NxN elemente, cu componentele numere întregi. Să se calculeze:&lt;br /&gt;
#* suma elementelor de pe diagonala principală&lt;br /&gt;
#* produsul elmentelor de pe diagonala secundară&lt;br /&gt;
#* minimul elementelor aflate deasupra, respectiv sub diagonala principală&lt;br /&gt;
# Se consideră o matrice de NxM elemente, cu componentele numere întregi. Se cere să se calculeze suma elementelor de pe marginea matricii.&lt;br /&gt;
# Să se construiască o matrice cu n linii şi m coloane care conţine pe prima coloană, de sus în jos, toate numerele naturale de la 1 la n, în ordine crescătoare, pe coloana a doua, de sus în jos, toate numerele naturale de la 2 la n+1, în ordine crescătoare, pe a treia coloană, de sus în jos, toate numerele naturale de la 3 la n+2, în ordine crescătoare, pe a patra coloană, de sus în jos, toate numerele naturale de la 4 la n+3, în ordine crescătoare şi aşa mai departe până la coloana m. Scrieţi programul care citeşte de la tastatură două valori naturale n și m (2&amp;lt;n&amp;lt;25, 2&amp;lt;m&amp;lt;25), construieşte matricea conform cerinţei şi o afişează pe ecran, pe linii, cu spaţii între elementele de pe fiecare linie. De exemplu, dacă se citeşte de la tastatură n=3 și m=5, se va construi şi se va afişa pe ecran matricea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
1 2 3 4 5&lt;br /&gt;
2 3 4 5 6&lt;br /&gt;
3 4 5 6 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_6&amp;diff=4899</id>
		<title>PC Laborator 6</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_6&amp;diff=4899"/>
		<updated>2016-11-08T19:49:36Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Structuri repetitive cu număr necunoscut de pași */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La sfârșitul acestui laborator studenții vor fi capabili:&lt;br /&gt;
* să înțeleagă funcționarea blocurilor repetitive;&lt;br /&gt;
* să conceapă programe care folosesc blocuri repetitive.&lt;br /&gt;
&lt;br /&gt;
== Structura repetitivă ==&lt;br /&gt;
Structura repetitivă, cunoscută și sub numele de loop sau buclă, reprezintă o bucată de cod care poate fi executată în mod repetat. Structurile repetitive trebuie sa aibă o condiție de continuare. La fiecare iterație a codului această condiție este verificată, iar în momentul în care condiția devine falsă se oprește execuția buclei și se trece mai departe în program.&lt;br /&gt;
Există 2 tipuri de structuri repetitive:&lt;br /&gt;
* structuri repetitive cu număr cunoscut de pași;&lt;br /&gt;
* structuri repetitive cu număr necunoscut de pași.&lt;br /&gt;
&lt;br /&gt;
=== Structuri repetitive cu număr cunoscut de pași ===&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;for&amp;#039;&amp;#039; creează o structură repetitivă cu număr cunoscut de pași. Sintaxa instrucțiunii &amp;#039;&amp;#039;for&amp;#039;&amp;#039; este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (inițializare contor; condiție logică; modificare contor)&lt;br /&gt;
        instrucțiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (inițializare contor; condiție logică; modificare contor){&lt;br /&gt;
        instrucțiune1;&lt;br /&gt;
        instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;for&amp;#039;&amp;#039; se parcurge conform schemei următoare:&amp;lt;br/&amp;gt;[[Fișier:For.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afisa acest program?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int x;&lt;br /&gt;
  for (x = 0; x &amp;lt; 10; x++) {&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, x);&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structuri repetitive cu număr necunoscut de pași ===&lt;br /&gt;
Există două instrucțiuni pentru a crea structuri repetitive cu număr necunoscut de pași:&lt;br /&gt;
* instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039;;&lt;br /&gt;
* instrucțiunea &amp;#039;&amp;#039;do..while&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
==== Instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039; ====&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039; verifică înainte de fiecare iterație condiția de intrare: dacă această condiție este îndeplinită se execută codul din corpul instrucțiunii, iar dacă nu se îndeplinește condiția se iese din această buclă. Sintaxa instrucțiunii este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
while (condiție)&lt;br /&gt;
        instrucțiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
while (condiție){&lt;br /&gt;
        instrucțiune1;&lt;br /&gt;
        instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Organigrama instrucțiunii &amp;#039;&amp;#039;while&amp;#039;&amp;#039; se regăsește în imaginea următoare:&amp;lt;br/&amp;gt;[[Fișier:While.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afișa următorul cod în urma execuției?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int x = 0;  &lt;br /&gt;
  while (x &amp;lt; 10) {&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, x);&lt;br /&gt;
    x++;       &lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Instrucțiunea &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; ====&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; verifică după fiecare iterație condiția de continuare. Sintaxa instrucțiunii &amp;quot;do while&amp;#039;&amp;#039; este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
      instrucțiune;&lt;br /&gt;
} while (condiție);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
      instrucțiune1;&lt;br /&gt;
      instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
} while (condiție);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Se observă că sintaxa instrucțiunii &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; este puțin diferită:&lt;br /&gt;
* indiferent de numărul de instrucțiuni din cadrul structurii repetitive, se folosesc acoladele;&lt;br /&gt;
* după condiția de continuitate se folosește obligatoriu semnul de punctuație &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; .&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Organigrama instrucțiunii &amp;#039;&amp;#039;do-while&amp;#039;&amp;#039; se regăsește în imaginea următoare:&amp;lt;br/&amp;gt;[[Fișier:Do_while.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Se observă că datorită faptului că se verifică abia la sfârșitul structurii condiția de continuitate, orice structură iterativă de tip &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; va fi executată întotdeauna cel puțin o dată.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce se va afișa în urma execuției?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int x;&lt;br /&gt;
  x = 0;&lt;br /&gt;
  do {&lt;br /&gt;
    printf(&amp;quot;Hello, world!\n&amp;quot;);&lt;br /&gt;
  } while (x != 0);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Pentru structurile repetitive există două cuvinte cheie de mare importanță: &amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; va ieși din bucla cea mai apropiată indiferent de condițiile de continuare ale acesteia. Utilitatea acestei instrucțiuni apare atunci când trebuie părăsită bucla în anumite circumstanțe.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039; oprește iterația curentă, face update contorului (în cazul buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) și continuă cu execuția structurii repetitive de la prima instrucțiune. Cu alte cuvinte, &amp;#039;&amp;#039;continue&amp;#039;&amp;#039; ignoră tot ceea ce urmează după el în cadrul buclei și trece la următoarea iterație a buclei.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afisa acest program?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
int main() {&lt;br /&gt;
   int a = 10;&lt;br /&gt;
   while (a &amp;lt; 20) {&lt;br /&gt;
      a++;&lt;br /&gt;
      if (a == 13) {&lt;br /&gt;
         continue;&lt;br /&gt;
      }&lt;br /&gt;
      printf(&amp;quot;value of a: %d\n&amp;quot;, a);&lt;br /&gt;
      if (a &amp;gt; 16) {&lt;br /&gt;
         break;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exerciții==&lt;br /&gt;
&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;Să se afișeze pe o linie toate literele în ordine alfabetică, scrise cu majuscule, și pe o altă linie toate literele în ordine invers alfabetică, scrise cu litere mici. Rezolvați exercițiul în 3 moduri (folosind toate tipurile de bucle).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n&amp;lt;20 de la tastatură. Afișați rezultatul operației n!.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn de la tastatură și să se verifice dacă acesta este palindrom.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se afișeze primele n numere impare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se citească apoi n numere întregi de la tastatură și să se afișeze suma numerelor pare introduse.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Refaceți exercițiul anterior în așa fel încât să folosiți instrucțiunea &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească de la tastatură o serie de numere întregi până la întâlnirea numărului 0. Să se afișeze apoi media aritmetică a acestor numere.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Verificați dacă un număr întreg fără semn introdus de la tastatură este prim.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se afișeze cmmdc și cmmmc a două numere întregi fără semn citite de la tastatură.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se afișeze primele n numere prime.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se convertească în baza 2.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se realizeze un joc în care un jucător introduce un număr între 1 și 100 de la tastatură, apoi alt jucător încearcă să-l ghicească. Calculatorul va oferi indicii (&amp;quot;prea mic&amp;quot;, &amp;quot;prea mare&amp;quot;), până la ghicirea numărului. La final se va afișa numărul de încercări de care a fost nevoie pentru a ghici numărul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_6&amp;diff=4898</id>
		<title>PC Laborator 6</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_6&amp;diff=4898"/>
		<updated>2016-11-08T19:48:05Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Instrucțiunea do while */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La sfârșitul acestui laborator studenții vor fi capabili:&lt;br /&gt;
* să înțeleagă funcționarea blocurilor repetitive;&lt;br /&gt;
* să conceapă programe care folosesc blocuri repetitive.&lt;br /&gt;
&lt;br /&gt;
== Structura repetitivă ==&lt;br /&gt;
Structura repetitivă, cunoscută și sub numele de loop sau buclă, reprezintă o bucată de cod care poate fi executată în mod repetat. Structurile repetitive trebuie sa aibă o condiție de continuare. La fiecare iterație a codului această condiție este verificată, iar în momentul în care condiția devine falsă se oprește execuția buclei și se trece mai departe în program.&lt;br /&gt;
Există 2 tipuri de structuri repetitive:&lt;br /&gt;
* structuri repetitive cu număr cunoscut de pași;&lt;br /&gt;
* structuri repetitive cu număr necunoscut de pași.&lt;br /&gt;
&lt;br /&gt;
=== Structuri repetitive cu număr cunoscut de pași ===&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;for&amp;#039;&amp;#039; creează o structură repetitivă cu număr cunoscut de pași. Sintaxa instrucțiunii &amp;#039;&amp;#039;for&amp;#039;&amp;#039; este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (inițializare contor; condiție logică; modificare contor)&lt;br /&gt;
        instrucțiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (inițializare contor; condiție logică; modificare contor){&lt;br /&gt;
        instrucțiune1;&lt;br /&gt;
        instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;for&amp;#039;&amp;#039; se parcurge conform schemei următoare:&amp;lt;br/&amp;gt;[[Fișier:For.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afisa acest program?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int x;&lt;br /&gt;
  for (x = 0; x &amp;lt; 10; x++) {&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, x);&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structuri repetitive cu număr necunoscut de pași ===&lt;br /&gt;
Există două instrucțiuni pentru a crea structuri repetitive cu număr necunoscut de pași:&lt;br /&gt;
* instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039;;&lt;br /&gt;
* instrucțiunea &amp;#039;&amp;#039;do..while&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
==== Instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039; ====&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039; verifică înainte de fiecare iterație condiția de intrare: dacă această condiție este îndeplinită se execută codul din corpul instrucțiunii, iar dacă nu se îndeplinește condiția se iese din această buclă. Sintaxa instrucțiunii este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
while (condiție)&lt;br /&gt;
        instrucțiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
while (condiție){&lt;br /&gt;
        instrucțiune1;&lt;br /&gt;
        instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Organigrama instrucțiunii &amp;#039;&amp;#039;while&amp;#039;&amp;#039; se regăsește în imaginea următoare:&amp;lt;br/&amp;gt;[[Fișier:While.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afișa următorul cod în urma execuției?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int x = 0;  &lt;br /&gt;
  while (x &amp;lt; 10){&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, x);&lt;br /&gt;
    x++;       &lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Instrucțiunea &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; ====&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; verifică după fiecare iterație condiția de continuare. Sintaxa instrucțiunii &amp;quot;do while&amp;#039;&amp;#039; este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
      instrucțiune;&lt;br /&gt;
} while (condiție);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
      instrucțiune1;&lt;br /&gt;
      instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
} while (condiție);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Se observă că sintaxa instrucțiunii &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; este puțin diferită:&lt;br /&gt;
* indiferent de numărul de instrucțiuni din cadrul structurii repetitive, se folosesc acoladele;&lt;br /&gt;
* după condiția de continuitate se folosește obligatoriu semnul de punctuație &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; .&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Organigrama instrucțiunii &amp;#039;&amp;#039;do-while&amp;#039;&amp;#039; se regăsește în imaginea următoare:&amp;lt;br/&amp;gt;[[Fișier:Do_while.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Se observă că datorită faptului că se verifică abia la sfârșitul structurii condiția de continuitate, orice structură iterativă de tip &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; va fi executată întotdeauna cel puțin o dată.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce se va afișa în urma execuției?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int x;&lt;br /&gt;
  x = 0;&lt;br /&gt;
  do {&lt;br /&gt;
    printf(&amp;quot;Hello, world!\n&amp;quot;);&lt;br /&gt;
  } while (x != 0);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Pentru structurile repetitive există două cuvinte cheie de mare importanță: &amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; va ieși din bucla cea mai apropiată indiferent de condițiile de continuare ale acesteia. Utilitatea acestei instrucțiuni apare atunci când trebuie părăsită bucla în anumite circumstanțe.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039; oprește iterația curentă, face update contorului (în cazul buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) și continuă cu execuția structurii repetitive de la prima instrucțiune. Cu alte cuvinte, &amp;#039;&amp;#039;continue&amp;#039;&amp;#039; ignoră tot ceea ce urmează după el în cadrul buclei și trece la următoarea iterație a buclei.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afisa acest program?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
int main() {&lt;br /&gt;
   int a = 10;&lt;br /&gt;
   while (a &amp;lt; 20) {&lt;br /&gt;
      a++;&lt;br /&gt;
      if (a == 13) {&lt;br /&gt;
         continue;&lt;br /&gt;
      }&lt;br /&gt;
      printf(&amp;quot;value of a: %d\n&amp;quot;, a);&lt;br /&gt;
      if (a &amp;gt; 16) {&lt;br /&gt;
         break;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exerciții==&lt;br /&gt;
&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;Să se afișeze pe o linie toate literele în ordine alfabetică, scrise cu majuscule, și pe o altă linie toate literele în ordine invers alfabetică, scrise cu litere mici. Rezolvați exercițiul în 3 moduri (folosind toate tipurile de bucle).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n&amp;lt;20 de la tastatură. Afișați rezultatul operației n!.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn de la tastatură și să se verifice dacă acesta este palindrom.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se afișeze primele n numere impare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se citească apoi n numere întregi de la tastatură și să se afișeze suma numerelor pare introduse.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Refaceți exercițiul anterior în așa fel încât să folosiți instrucțiunea &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească de la tastatură o serie de numere întregi până la întâlnirea numărului 0. Să se afișeze apoi media aritmetică a acestor numere.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Verificați dacă un număr întreg fără semn introdus de la tastatură este prim.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se afișeze cmmdc și cmmmc a două numere întregi fără semn citite de la tastatură.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se afișeze primele n numere prime.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se convertească în baza 2.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se realizeze un joc în care un jucător introduce un număr între 1 și 100 de la tastatură, apoi alt jucător încearcă să-l ghicească. Calculatorul va oferi indicii (&amp;quot;prea mic&amp;quot;, &amp;quot;prea mare&amp;quot;), până la ghicirea numărului. La final se va afișa numărul de încercări de care a fost nevoie pentru a ghici numărul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_6&amp;diff=4897</id>
		<title>PC Laborator 6</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_6&amp;diff=4897"/>
		<updated>2016-11-08T19:39:11Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Cuvintele cheie break și continue */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La sfârșitul acestui laborator studenții vor fi capabili:&lt;br /&gt;
* să înțeleagă funcționarea blocurilor repetitive;&lt;br /&gt;
* să conceapă programe care folosesc blocuri repetitive.&lt;br /&gt;
&lt;br /&gt;
== Structura repetitivă ==&lt;br /&gt;
Structura repetitivă, cunoscută și sub numele de loop sau buclă, reprezintă o bucată de cod care poate fi executată în mod repetat. Structurile repetitive trebuie sa aibă o condiție de continuare. La fiecare iterație a codului această condiție este verificată, iar în momentul în care condiția devine falsă se oprește execuția buclei și se trece mai departe în program.&lt;br /&gt;
Există 2 tipuri de structuri repetitive:&lt;br /&gt;
* structuri repetitive cu număr cunoscut de pași;&lt;br /&gt;
* structuri repetitive cu număr necunoscut de pași.&lt;br /&gt;
&lt;br /&gt;
=== Structuri repetitive cu număr cunoscut de pași ===&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;for&amp;#039;&amp;#039; creează o structură repetitivă cu număr cunoscut de pași. Sintaxa instrucțiunii &amp;#039;&amp;#039;for&amp;#039;&amp;#039; este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (inițializare contor; condiție logică; modificare contor)&lt;br /&gt;
        instrucțiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (inițializare contor; condiție logică; modificare contor){&lt;br /&gt;
        instrucțiune1;&lt;br /&gt;
        instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;for&amp;#039;&amp;#039; se parcurge conform schemei următoare:&amp;lt;br/&amp;gt;[[Fișier:For.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afisa acest program?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int x;&lt;br /&gt;
  for (x = 0; x &amp;lt; 10; x++) {&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, x);&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structuri repetitive cu număr necunoscut de pași ===&lt;br /&gt;
Există două instrucțiuni pentru a crea structuri repetitive cu număr necunoscut de pași:&lt;br /&gt;
* instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039;;&lt;br /&gt;
* instrucțiunea &amp;#039;&amp;#039;do..while&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
==== Instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039; ====&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039; verifică înainte de fiecare iterație condiția de intrare: dacă această condiție este îndeplinită se execută codul din corpul instrucțiunii, iar dacă nu se îndeplinește condiția se iese din această buclă. Sintaxa instrucțiunii este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
while (condiție)&lt;br /&gt;
        instrucțiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
while (condiție){&lt;br /&gt;
        instrucțiune1;&lt;br /&gt;
        instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Organigrama instrucțiunii &amp;#039;&amp;#039;while&amp;#039;&amp;#039; se regăsește în imaginea următoare:&amp;lt;br/&amp;gt;[[Fișier:While.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afișa următorul cod în urma execuției?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int x = 0;  &lt;br /&gt;
  while (x &amp;lt; 10){&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, x);&lt;br /&gt;
    x++;       &lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Instrucțiunea &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; ====&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; verifică după fiecare iterație condiția de continuare. Sintaxa instrucțiunii &amp;quot;do while&amp;#039;&amp;#039; este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
do{&lt;br /&gt;
      instrucțiune;&lt;br /&gt;
}while (condiție);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
do{&lt;br /&gt;
      instrucțiune1;&lt;br /&gt;
      instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
}while (condiție);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Se observă că sintaxa instrucțiunii &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; este puțin diferită:&lt;br /&gt;
* indiferent de numărul de instrucțiuni din cadrul structurii repetitive, se folosesc acoladele;&lt;br /&gt;
* după condiția de continuitate se folosește obligatoriu semnul de punctuație &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; .&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Organigrama instrucțiunii &amp;#039;&amp;#039;do-while&amp;#039;&amp;#039; se regăsește în imaginea următoare:&amp;lt;br/&amp;gt;[[Fișier:Do_while.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Se observă că datorită faptului că se verifică abia la sfârșitul structurii condiția de continuitate, orice structură iterativă de tip &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; va fi executată întotdeauna cel puțin o dată.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce se va afișa în urma execuției?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int x;&lt;br /&gt;
  x = 0;&lt;br /&gt;
  do {&lt;br /&gt;
    printf(&amp;quot;Hello, world!\n&amp;quot;);&lt;br /&gt;
  } while (x != 0);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Pentru structurile repetitive există două cuvinte cheie de mare importanță: &amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; va ieși din bucla cea mai apropiată indiferent de condițiile de continuare ale acesteia. Utilitatea acestei instrucțiuni apare atunci când trebuie părăsită bucla în anumite circumstanțe.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039; oprește iterația curentă, face update contorului (în cazul buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) și continuă cu execuția structurii repetitive de la prima instrucțiune. Cu alte cuvinte, &amp;#039;&amp;#039;continue&amp;#039;&amp;#039; ignoră tot ceea ce urmează după el în cadrul buclei și trece la următoarea iterație a buclei.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afisa acest program?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
int main() {&lt;br /&gt;
   int a = 10;&lt;br /&gt;
   while (a &amp;lt; 20) {&lt;br /&gt;
      a++;&lt;br /&gt;
      if (a == 13) {&lt;br /&gt;
         continue;&lt;br /&gt;
      }&lt;br /&gt;
      printf(&amp;quot;value of a: %d\n&amp;quot;, a);&lt;br /&gt;
      if (a &amp;gt; 16) {&lt;br /&gt;
         break;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exerciții==&lt;br /&gt;
&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;Să se afișeze pe o linie toate literele în ordine alfabetică, scrise cu majuscule, și pe o altă linie toate literele în ordine invers alfabetică, scrise cu litere mici. Rezolvați exercițiul în 3 moduri (folosind toate tipurile de bucle).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n&amp;lt;20 de la tastatură. Afișați rezultatul operației n!.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn de la tastatură și să se verifice dacă acesta este palindrom.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se afișeze primele n numere impare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se citească apoi n numere întregi de la tastatură și să se afișeze suma numerelor pare introduse.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Refaceți exercițiul anterior în așa fel încât să folosiți instrucțiunea &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească de la tastatură o serie de numere întregi până la întâlnirea numărului 0. Să se afișeze apoi media aritmetică a acestor numere.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Verificați dacă un număr întreg fără semn introdus de la tastatură este prim.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se afișeze cmmdc și cmmmc a două numere întregi fără semn citite de la tastatură.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se afișeze primele n numere prime.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se convertească în baza 2.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se realizeze un joc în care un jucător introduce un număr între 1 și 100 de la tastatură, apoi alt jucător încearcă să-l ghicească. Calculatorul va oferi indicii (&amp;quot;prea mic&amp;quot;, &amp;quot;prea mare&amp;quot;), până la ghicirea numărului. La final se va afișa numărul de încercări de care a fost nevoie pentru a ghici numărul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_6&amp;diff=4896</id>
		<title>PC Laborator 6</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_6&amp;diff=4896"/>
		<updated>2016-11-08T19:37:19Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Instrucțiunea do while */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La sfârșitul acestui laborator studenții vor fi capabili:&lt;br /&gt;
* să înțeleagă funcționarea blocurilor repetitive;&lt;br /&gt;
* să conceapă programe care folosesc blocuri repetitive.&lt;br /&gt;
&lt;br /&gt;
== Structura repetitivă ==&lt;br /&gt;
Structura repetitivă, cunoscută și sub numele de loop sau buclă, reprezintă o bucată de cod care poate fi executată în mod repetat. Structurile repetitive trebuie sa aibă o condiție de continuare. La fiecare iterație a codului această condiție este verificată, iar în momentul în care condiția devine falsă se oprește execuția buclei și se trece mai departe în program.&lt;br /&gt;
Există 2 tipuri de structuri repetitive:&lt;br /&gt;
* structuri repetitive cu număr cunoscut de pași;&lt;br /&gt;
* structuri repetitive cu număr necunoscut de pași.&lt;br /&gt;
&lt;br /&gt;
=== Structuri repetitive cu număr cunoscut de pași ===&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;for&amp;#039;&amp;#039; creează o structură repetitivă cu număr cunoscut de pași. Sintaxa instrucțiunii &amp;#039;&amp;#039;for&amp;#039;&amp;#039; este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (inițializare contor; condiție logică; modificare contor)&lt;br /&gt;
        instrucțiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (inițializare contor; condiție logică; modificare contor){&lt;br /&gt;
        instrucțiune1;&lt;br /&gt;
        instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;for&amp;#039;&amp;#039; se parcurge conform schemei următoare:&amp;lt;br/&amp;gt;[[Fișier:For.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afisa acest program?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int x;&lt;br /&gt;
  for (x = 0; x &amp;lt; 10; x++) {&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, x);&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structuri repetitive cu număr necunoscut de pași ===&lt;br /&gt;
Există două instrucțiuni pentru a crea structuri repetitive cu număr necunoscut de pași:&lt;br /&gt;
* instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039;;&lt;br /&gt;
* instrucțiunea &amp;#039;&amp;#039;do..while&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
==== Instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039; ====&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039; verifică înainte de fiecare iterație condiția de intrare: dacă această condiție este îndeplinită se execută codul din corpul instrucțiunii, iar dacă nu se îndeplinește condiția se iese din această buclă. Sintaxa instrucțiunii este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
while (condiție)&lt;br /&gt;
        instrucțiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
while (condiție){&lt;br /&gt;
        instrucțiune1;&lt;br /&gt;
        instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Organigrama instrucțiunii &amp;#039;&amp;#039;while&amp;#039;&amp;#039; se regăsește în imaginea următoare:&amp;lt;br/&amp;gt;[[Fișier:While.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afișa următorul cod în urma execuției?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int x = 0;  &lt;br /&gt;
  while (x &amp;lt; 10){&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, x);&lt;br /&gt;
    x++;       &lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Instrucțiunea &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; ====&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; verifică după fiecare iterație condiția de continuare. Sintaxa instrucțiunii &amp;quot;do while&amp;#039;&amp;#039; este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
do{&lt;br /&gt;
      instrucțiune;&lt;br /&gt;
}while (condiție);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
do{&lt;br /&gt;
      instrucțiune1;&lt;br /&gt;
      instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
}while (condiție);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Se observă că sintaxa instrucțiunii &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; este puțin diferită:&lt;br /&gt;
* indiferent de numărul de instrucțiuni din cadrul structurii repetitive, se folosesc acoladele;&lt;br /&gt;
* după condiția de continuitate se folosește obligatoriu semnul de punctuație &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; .&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Organigrama instrucțiunii &amp;#039;&amp;#039;do-while&amp;#039;&amp;#039; se regăsește în imaginea următoare:&amp;lt;br/&amp;gt;[[Fișier:Do_while.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Se observă că datorită faptului că se verifică abia la sfârșitul structurii condiția de continuitate, orice structură iterativă de tip &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; va fi executată întotdeauna cel puțin o dată.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce se va afișa în urma execuției?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int x;&lt;br /&gt;
  x = 0;&lt;br /&gt;
  do {&lt;br /&gt;
    printf(&amp;quot;Hello, world!\n&amp;quot;);&lt;br /&gt;
  } while (x != 0);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Pentru structurile repetitive există două cuvinte cheie de mare importanță: &amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; va ieși din bucla cea mai apropiată indiferent de condițiile de continuare ale acesteia. Utilitatea acestei instrucțiuni apare atunci când trebuie părăsită bucla în anumite circumstanțe.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039; oprește iterația curentă, face update contorului (în cazul buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) și continuă cu execuția structurii repetitive de la prima instrucțiune. Cu alte cuvinte, &amp;#039;&amp;#039;continue&amp;#039;&amp;#039; ignoră tot ceea ce urmează după el în cadrul buclei și trece la următoarea iterație a buclei.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afisa acest program?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
int main () {&lt;br /&gt;
   int a = 10;&lt;br /&gt;
   while( a &amp;lt; 20 ) {&lt;br /&gt;
      a++;&lt;br /&gt;
      if( a == 13) {&lt;br /&gt;
         continue;&lt;br /&gt;
      }&lt;br /&gt;
      printf(&amp;quot;value of a: %d\n&amp;quot;, a);&lt;br /&gt;
      if( a &amp;gt; 16) {&lt;br /&gt;
         break;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exerciții==&lt;br /&gt;
&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;Să se afișeze pe o linie toate literele în ordine alfabetică, scrise cu majuscule, și pe o altă linie toate literele în ordine invers alfabetică, scrise cu litere mici. Rezolvați exercițiul în 3 moduri (folosind toate tipurile de bucle).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n&amp;lt;20 de la tastatură. Afișați rezultatul operației n!.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn de la tastatură și să se verifice dacă acesta este palindrom.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se afișeze primele n numere impare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se citească apoi n numere întregi de la tastatură și să se afișeze suma numerelor pare introduse.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Refaceți exercițiul anterior în așa fel încât să folosiți instrucțiunea &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească de la tastatură o serie de numere întregi până la întâlnirea numărului 0. Să se afișeze apoi media aritmetică a acestor numere.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Verificați dacă un număr întreg fără semn introdus de la tastatură este prim.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se afișeze cmmdc și cmmmc a două numere întregi fără semn citite de la tastatură.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se afișeze primele n numere prime.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se convertească în baza 2.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se realizeze un joc în care un jucător introduce un număr între 1 și 100 de la tastatură, apoi alt jucător încearcă să-l ghicească. Calculatorul va oferi indicii (&amp;quot;prea mic&amp;quot;, &amp;quot;prea mare&amp;quot;), până la ghicirea numărului. La final se va afișa numărul de încercări de care a fost nevoie pentru a ghici numărul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_6&amp;diff=4895</id>
		<title>PC Laborator 6</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_6&amp;diff=4895"/>
		<updated>2016-11-08T19:34:27Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Structuri repetitive cu număr cunoscut de pași */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La sfârșitul acestui laborator studenții vor fi capabili:&lt;br /&gt;
* să înțeleagă funcționarea blocurilor repetitive;&lt;br /&gt;
* să conceapă programe care folosesc blocuri repetitive.&lt;br /&gt;
&lt;br /&gt;
== Structura repetitivă ==&lt;br /&gt;
Structura repetitivă, cunoscută și sub numele de loop sau buclă, reprezintă o bucată de cod care poate fi executată în mod repetat. Structurile repetitive trebuie sa aibă o condiție de continuare. La fiecare iterație a codului această condiție este verificată, iar în momentul în care condiția devine falsă se oprește execuția buclei și se trece mai departe în program.&lt;br /&gt;
Există 2 tipuri de structuri repetitive:&lt;br /&gt;
* structuri repetitive cu număr cunoscut de pași;&lt;br /&gt;
* structuri repetitive cu număr necunoscut de pași.&lt;br /&gt;
&lt;br /&gt;
=== Structuri repetitive cu număr cunoscut de pași ===&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;for&amp;#039;&amp;#039; creează o structură repetitivă cu număr cunoscut de pași. Sintaxa instrucțiunii &amp;#039;&amp;#039;for&amp;#039;&amp;#039; este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (inițializare contor; condiție logică; modificare contor)&lt;br /&gt;
        instrucțiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for (inițializare contor; condiție logică; modificare contor){&lt;br /&gt;
        instrucțiune1;&lt;br /&gt;
        instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;for&amp;#039;&amp;#039; se parcurge conform schemei următoare:&amp;lt;br/&amp;gt;[[Fișier:For.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afisa acest program?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int x;&lt;br /&gt;
  for (x = 0; x &amp;lt; 10; x++) {&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, x);&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structuri repetitive cu număr necunoscut de pași ===&lt;br /&gt;
Există două instrucțiuni pentru a crea structuri repetitive cu număr necunoscut de pași:&lt;br /&gt;
* instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039;;&lt;br /&gt;
* instrucțiunea &amp;#039;&amp;#039;do..while&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
==== Instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039; ====&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;while&amp;#039;&amp;#039; verifică înainte de fiecare iterație condiția de intrare: dacă această condiție este îndeplinită se execută codul din corpul instrucțiunii, iar dacă nu se îndeplinește condiția se iese din această buclă. Sintaxa instrucțiunii este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
while (condiție)&lt;br /&gt;
        instrucțiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
while (condiție){&lt;br /&gt;
        instrucțiune1;&lt;br /&gt;
        instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Organigrama instrucțiunii &amp;#039;&amp;#039;while&amp;#039;&amp;#039; se regăsește în imaginea următoare:&amp;lt;br/&amp;gt;[[Fișier:While.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afișa următorul cod în urma execuției?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int x = 0;  &lt;br /&gt;
  while (x &amp;lt; 10){&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, x);&lt;br /&gt;
    x++;       &lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Instrucțiunea &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; ====&lt;br /&gt;
Instrucțiunea &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; verifică după fiecare iterație condiția de continuare. Sintaxa instrucțiunii &amp;quot;do while&amp;#039;&amp;#039; este următoarea:&amp;lt;br/&amp;gt;&lt;br /&gt;
a)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
do{&lt;br /&gt;
      instrucțiune;&lt;br /&gt;
}while (condiție);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
do{&lt;br /&gt;
      instrucțiune1;&lt;br /&gt;
      instrucțiune2;&lt;br /&gt;
..............................&lt;br /&gt;
}while (condiție);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Se observă că sintaxa instrucțiunii &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; este puțin diferită:&lt;br /&gt;
* indiferent de numărul de instrucțiuni din cadrul structurii repetitive, se folosesc acoladele;&lt;br /&gt;
* după condiția de continuitate se folosește obligatoriu semnul de punctuație &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; .&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Organigrama instrucțiunii &amp;#039;&amp;#039;do-while&amp;#039;&amp;#039; se regăsește în imaginea următoare:&amp;lt;br/&amp;gt;[[Fișier:Do_while.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Se observă că datorită faptului că se verifică abia la sfârșitul structurii condiția de continuitate, orice structură iterativă de tip &amp;#039;&amp;#039;do while&amp;#039;&amp;#039; va fi executată întotdeauna cel puțin o dată.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce se va afișa în urma execuției?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int x;&lt;br /&gt;
  x = 0;&lt;br /&gt;
  do{&lt;br /&gt;
    printf( &amp;quot;Hello, world!\n&amp;quot; );&lt;br /&gt;
  }while (x != 0);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Pentru structurile repetitive există două cuvinte cheie de mare importanță: &amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;break&amp;#039;&amp;#039;&amp;#039; va ieși din bucla cea mai apropiată indiferent de condițiile de continuare ale acesteia. Utilitatea acestei instrucțiuni apare atunci când trebuie părăsită bucla în anumite circumstanțe.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039; oprește iterația curentă, face update contorului (în cazul buclei &amp;#039;&amp;#039;for&amp;#039;&amp;#039;) și continuă cu execuția structurii repetitive de la prima instrucțiune. Cu alte cuvinte, &amp;#039;&amp;#039;continue&amp;#039;&amp;#039; ignoră tot ceea ce urmează după el în cadrul buclei și trece la următoarea iterație a buclei.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ce va afisa acest program?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
int main () {&lt;br /&gt;
   int a = 10;&lt;br /&gt;
   while( a &amp;lt; 20 ) {&lt;br /&gt;
      a++;&lt;br /&gt;
      if( a == 13) {&lt;br /&gt;
         continue;&lt;br /&gt;
      }&lt;br /&gt;
      printf(&amp;quot;value of a: %d\n&amp;quot;, a);&lt;br /&gt;
      if( a &amp;gt; 16) {&lt;br /&gt;
         break;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exerciții==&lt;br /&gt;
&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;Să se afișeze pe o linie toate literele în ordine alfabetică, scrise cu majuscule, și pe o altă linie toate literele în ordine invers alfabetică, scrise cu litere mici. Rezolvați exercițiul în 3 moduri (folosind toate tipurile de bucle).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n&amp;lt;20 de la tastatură. Afișați rezultatul operației n!.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn de la tastatură și să se verifice dacă acesta este palindrom.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se afișeze primele n numere impare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se citească apoi n numere întregi de la tastatură și să se afișeze suma numerelor pare introduse.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Refaceți exercițiul anterior în așa fel încât să folosiți instrucțiunea &amp;#039;&amp;#039;&amp;#039;continue&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească de la tastatură o serie de numere întregi până la întâlnirea numărului 0. Să se afișeze apoi media aritmetică a acestor numere.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Verificați dacă un număr întreg fără semn introdus de la tastatură este prim.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se afișeze cmmdc și cmmmc a două numere întregi fără semn citite de la tastatură.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se afișeze primele n numere prime.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se citească un număr întreg fără semn n de la tastatură. Să se convertească în baza 2.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Să se realizeze un joc în care un jucător introduce un număr între 1 și 100 de la tastatură, apoi alt jucător încearcă să-l ghicească. Calculatorul va oferi indicii (&amp;quot;prea mic&amp;quot;, &amp;quot;prea mare&amp;quot;), până la ghicirea numărului. La final se va afișa numărul de încercări de care a fost nevoie pentru a ghici numărul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=4880</id>
		<title>PC Laborator 5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=4880"/>
		<updated>2016-11-02T18:08:10Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
* 	 înțeleagă cum funcționează o structură decizională; &lt;br /&gt;
* 	 scrie programe în C folosind construcții decizionale. &lt;br /&gt;
  &lt;br /&gt;
== Structura decizională == &lt;br /&gt;
  &lt;br /&gt;
Se întâmplă adesea ca evoluția unui program să depindă de o anumită condiție. Ea poate lua însă diverse forme, rolul programatorului fiind să conducă execuția programului pe calea corectă, ținând cont de acea condiție logică. Apare astfel structura decizionala if, care ramifică evoluția programului în funcție de valoarea de adevăr  a condiției testate.  &lt;br /&gt;
  &lt;br /&gt;
=== 	 Schema logică === &lt;br /&gt;
Prima etapă din parcurgerea unei structuri decizionale de tipul if-else o reprezintă testarea condiției logice. în cazul în care aceasta este evaluată ca adevărată se execută instructiunea1, cea asociată ramurii if. în cazul în care condiția logică este evaluată ca falsă se execută instructiunea2, cea asociată ramurii else. După executarea instrucțiunii asociate, structura if-else se încheie și programul se continuă cu linia următoare blocului decizional.&lt;br /&gt;
 &lt;br /&gt;
[[Fișier:structura_decizionala.png]]&lt;br /&gt;
&lt;br /&gt;
=== Sintaxă generală ===&lt;br /&gt;
a)	&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie) instructiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie) {&lt;br /&gt;
	 instructiune1;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	 instructiune2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
c)	&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie1) {&lt;br /&gt;
	instructiune 1;&lt;br /&gt;
}&lt;br /&gt;
else if (conditie2) {&lt;br /&gt;
	instructiune 2;&lt;br /&gt;
}&lt;br /&gt;
else if (conditie 3) {&lt;br /&gt;
	instructiune3;&lt;br /&gt;
}&lt;br /&gt;
................................&lt;br /&gt;
else {&lt;br /&gt;
	instructiune;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asocierea ramurilor if-else===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; în cazul în care un if are mai multe ramuri, un else se asociază celui mai apropiat if.&amp;lt;/div&amp;gt; &lt;br /&gt;
Această observație ne conduce la următoarele două cazuri: &lt;br /&gt;
  &lt;br /&gt;
* 	 dacă nu există blocuri de instrucțiuni, un else este legat de if-ul imediat anterior; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; 5) &lt;br /&gt;
    if (b &amp;gt; a) &lt;br /&gt;
	printf (&amp;quot;b este mai mare ca a&amp;quot;);&lt;br /&gt;
    else &lt;br /&gt;
	printf (&amp;quot;b este mai mic sau egal cu a&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*	dacă există blocuri de instrucțiuni, un else este legat de ultimul if fără pereche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; 5) {&lt;br /&gt;
    if (b &amp;gt; a)&lt;br /&gt;
        printf (&amp;quot;b este mai mare ca a&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else &lt;br /&gt;
    printf (&amp;quot;a nu este mai mare ca 5&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ce va afișa acest program prost indentat? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int number = 4; &lt;br /&gt;
double alpha = -1.0; &lt;br /&gt;
if (number &amp;gt; 0) &lt;br /&gt;
	if (alpha &amp;gt; 0)&lt;br /&gt;
		printf( &amp;quot;Here I am!\n&amp;quot;);&lt;br /&gt;
else &lt;br /&gt;
	printf( &amp;quot;No, I’m here!\n&amp;quot;); &lt;br /&gt;
printf(&amp;quot;No, actually, I’m here!\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Evaluarea expresiilor logice == &lt;br /&gt;
  &lt;br /&gt;
Am stabilit deja că o condiție logică, prin valoarea ei de adevăr, ramifică evoluția programului. &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Adevărat în C înseamnă orice rezultat diferit de 0 (nul) al unei evaluări, în timp ce despre fals vorbim când o expresie este evaluată la 0 (nul). &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
În C, condiția  poate avea mai multe reprezentări, după cum urmează &lt;br /&gt;
  &lt;br /&gt;
=== Operandul === &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Verificați că un număr citit de la tastatură poate fi numitorul unei fracții.&lt;br /&gt;
&lt;br /&gt;
=== Operația cu operatori relaționali (==, !=, &amp;lt;=, &amp;lt;, &amp;gt;, &amp;gt;=) === &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Asociați o valoare variabilei cost în funcție de valoarea variabilei distance după cum urmează: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; |distance&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; |cost&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Intre 0 si 100&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 5.50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | Peste 100, dar mai putin de 500&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8.00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Peste 500, dar nu mai mult de 1000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 10.50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1000 sau mai mult&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 13.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Operația cu operatori logici (&amp;amp;&amp;amp;, ||, !) === &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Folosind operatori logici, aduceți următoarea structură decizională la forma cea mai simplă: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (doesSignificantWork) { &lt;br /&gt;
	if (makesBreakthrough) &lt;br /&gt;
		nobelPrizeCandidate = true; &lt;br /&gt;
	else&lt;br /&gt;
		nobelPrizeCandidate = false; &lt;br /&gt;
} &lt;br /&gt;
else if (!doesSignificantWork) {&lt;br /&gt;
	nobelPrizeCandidate = false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;bool&amp;#039;&amp;#039;&amp;#039;, ca și valorile &amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;false&amp;#039;&amp;#039;&amp;#039;, au fost introduse în standardul C99, deci dacă doriți să-l folosiți codul trebuie compilat cu &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;--std=c99&amp;lt;/code&amp;gt; ca argument al compilatorului (gcc).&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a putea lucra cu operatorii logici, este necesar să ne reamintim modul în care aceștia operează. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Tabelul operatorilor logici&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | a&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | b&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | !a&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | a &amp;amp;&amp;amp; b&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | a ll b&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1 &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; În tabel remarcăm că operatorul logic &amp;#039;&amp;#039;&amp;#039;SI ( &amp;amp;&amp;amp; )&amp;#039;&amp;#039;&amp;#039; întoarce 1 dacă și numai dacă ambele expresii, &amp;#039;&amp;#039;a&amp;#039;&amp;#039; și &amp;#039;&amp;#039;b&amp;#039;&amp;#039; în cazul nostru, întorc o valoare nenulă. în orice alt caz, operatorul &amp;#039;&amp;#039;&amp;#039;SI&amp;#039;&amp;#039;&amp;#039; întoarce 0. Așadar, pentru a optimiza timpul de execuție a programului, expresia a doua, &amp;#039;&amp;#039;b&amp;#039;&amp;#039; în cazul nostru, va fi evaluată dacă și numai dacă prima expresie, &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, a întors o valoare nenulă. &lt;br /&gt;
În mod asemănător lucrează și operatorul &amp;#039;&amp;#039;&amp;#039;SAU ( || )&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5, b = 10;&lt;br /&gt;
    if (++a || ++b) {&lt;br /&gt;
         printf(&amp;quot;%d  %d&amp;quot;, a, b);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
         printf(&amp;quot;Wayne Rooney&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alternative la if-else ==&lt;br /&gt;
&lt;br /&gt;
=== Operatorul condițional (  ?  :  ) === &lt;br /&gt;
Singurul operator ternar din C, operatorul condițional funcționează asemenea unui if cu o singură ramură de tip else if. Sintaxa operatorului condițional este următoarea: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
(conditie) ? (expresie1) : (expresie2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aşadar, blocul decizional&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; b)&lt;br /&gt;
	printf (&amp;quot;a este mai mare decat b&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
	printf (&amp;quot;a este mai mic sau egal cu b&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
poate fi înlocuit astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(a &amp;gt; b ? &amp;quot;a este mai mare decat b&amp;quot; : &amp;quot;a este mai mic sau egal cu b&amp;quot;);&lt;br /&gt;
//sau&lt;br /&gt;
(a &amp;gt; b) ? ( printf (&amp;quot;a este mai mare decat b&amp;quot;)) : ( printf (&amp;quot;a este mai mic sau egal cu b&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Deși prima variantă este cea recunoscută ca fiind corectă, remarcăm că și a două variantă se comportă la fel ca prima. Asta se datorează modului în care funcționează operatorul condițional: el cere ca ambele expresii, &amp;#039;&amp;#039;expresie1&amp;#039;&amp;#039; și &amp;#039;&amp;#039;expresie2&amp;#039;&amp;#039;, să întoarcă &amp;quot;valori&amp;quot;. A doua variantă funcționează deoarece funcția &amp;#039;&amp;#039;printf()&amp;#039;&amp;#039; întoarce întotdeauna o [http://www.tutorialspoint.com/c_standard_library/c_function_printf.htm valoare].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structura decizională switch-case === &lt;br /&gt;
Această instrucțiune de decizie este similară unui if cu mai multe ramuri de tip else-if. Sintaxa este următoarea: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
switch (variabilaTestata)	{&lt;br /&gt;
	case valoare1:	 instructiune1;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
	case valoare2:	 instructiune2;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
	case valoare3:	 instructiune3;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
.........................................................................&lt;br /&gt;
	default:		instructiune;&lt;br /&gt;
				&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Valorile &amp;#039;&amp;#039;valoare1&amp;#039;&amp;#039;, &amp;#039;&amp;#039;valoare2&amp;#039;&amp;#039; etc. sunt proprii tipului de dată întreg, la fel ca &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039;. Ne reamintim însă că întreg nu înseamnă doar variabile de tip &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039;, astfel că &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; poate fi de tip &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; instrucțiunea &amp;#039;&amp;#039;break&amp;#039;&amp;#039; este opțională. Modul  care  switch-case funcționează este următorul: &lt;br /&gt;
&amp;lt;ol type=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;i&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; structura switch-case se încheie și se sare pe linia urmatoare întregului bloc decizional;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă nu există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; execuția se continuă până se întalnește un &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; sau până când se încheie structura switch-case. Până la acel moment se vor executa toate instrucțiunile întâlnite pe parcurs (&amp;#039;&amp;#039;instructiune2, instructiune3&amp;#039;&amp;#039; etc.);&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; nu este egală cu niciuna dintre valorile &amp;#039;&amp;#039;valoare1, valoare2&amp;#039;&amp;#039; etc atunci se execută &amp;#039;&amp;#039;instructiune&amp;#039;&amp;#039;, asociată etichetei default.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica echivalența dintre if-else și switch-case, rezolvați folosind ambele structuri decizionale următoarea problemă:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Un microbist vrea să afle situația Grupei F de calificare la EURO2016. Astfel, el va introduce o cifră pentru a vedea ce &amp;quot;națională&amp;quot; ocupă acel loc. Folosind următoarea listă, informați-l corect pe suporter.  &lt;br /&gt;
&lt;br /&gt;
1.	Irlanda de Nord&lt;br /&gt;
2.	România&lt;br /&gt;
3.	Ungaria&lt;br /&gt;
4.	Finlanda&lt;br /&gt;
5.	Insulele Feroe&lt;br /&gt;
6.	Grecia&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 100;&lt;br /&gt;
    if (a &amp;gt; 10) {&lt;br /&gt;
         printf(&amp;quot;Tiberiu Soare &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (a &amp;gt; 20) {&lt;br /&gt;
         printf(&amp;quot;Horia Andreescu &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (a &amp;gt; 30) {&lt;br /&gt;
         printf(&amp;quot;Iosif Ion Prunner &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Ştiind că un student primește 350 lei/lună dacă are media cel puțin 8.50, 450 lei/lună pentru o medie mai mare sau egală cu 9.50 și 600 lei/lună dacă are media cel puțin 9.70, scrieți un program prin care studentul să afle ce bursă urmează să primească (media va fi citită de la tastatură). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int m = 5, n = 10, q = 20;&lt;br /&gt;
    if (q / n * m)&lt;br /&gt;
         printf(&amp;quot;Bill Gates &amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
         printf(&amp;quot;Amancio Ortega &amp;quot;);&lt;br /&gt;
         printf(&amp;quot;Carlos Slim Helu &amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți un program care citește de la tastatură notele unui elev la limba română, matematică și informatică și afișează dacă elevul a promovat sau nu bacalaureatul. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie a și b două numere întregi citite de la tastatură. Scrieți un algoritm care să verifice dacă a si b sunt numere consecutive.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citesc de la tastatură 3 numere reprezentând lungimea cele 3 laturi ale unui triunghi. Să se afișeze dacă triunghiul este dreptunghic.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citește de la tastatură un număr întreg fără semn de 8 biți. Să se afișeze dacă numărul este sau nu un palindrom (dacă are aceeași valoare citit și de la stânga la dreapta si de la dreapta la stanga; de exemplu 101, sau 242).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_4&amp;diff=4879</id>
		<title>PC Laborator 4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_4&amp;diff=4879"/>
		<updated>2016-11-02T16:16:32Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Exemplu operator AND */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Familiarizarea cu noțiunile de bază ale limbajului C: tipuri de date, operatori, dar și folosirea corectă a acestora.&lt;br /&gt;
&lt;br /&gt;
== Tipuri de date ==&lt;br /&gt;
&lt;br /&gt;
Tipurile de date fundamentale ale limbajului C sunt: caractere (char), întregi (int), numere reale&lt;br /&gt;
reprezentate în virgulă mobilă cu simplă precizie (float), numere reale reprezentate în virgulă mobilă&lt;br /&gt;
cu dublă precizie (double).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Tipuri fundamentale&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Tip&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Număr de biți&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Domeniu&lt;br /&gt;
|-&lt;br /&gt;
| char&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -128 ... +127&lt;br /&gt;
|-&lt;br /&gt;
| int&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | min. 16&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -32,768 ... +32,767 &lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 32&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Precizie 6 zecimale&lt;br /&gt;
|-&lt;br /&gt;
| double&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 64&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Precizie 10 zecimale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Tipurile fundamentale pot fi precedate de diferiţi modificatori. Un &amp;#039;&amp;#039;&amp;#039;modificator&amp;#039;&amp;#039;&amp;#039; se utilizează pentru a adapta cât mai convenabil tipul de bază la situație.&lt;br /&gt;
&lt;br /&gt;
=== Tipuri reale(float,double) și virgulă mobilă ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Principalul dezavantaj al reprezentării în virgulă fixă este faptul că, dacă un număr nu mai încape în spaţiul de biţi rezervat, se pierd cifrele cele mai semnificative.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un număr este reprezentat în virgulă mobilă printr-un cuvant de n biți conținând semn, mantisă și exponent sub următoarea formă:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Mantisa.jpg]]&lt;br /&gt;
&lt;br /&gt;
Unde s este bitul de semn al numarului, cu aceeași convenție ca pentru numere in virgulă fixa(s=0 numar pozitiv si s=1 numar negativ),&lt;br /&gt;
m este mantisa numarului, reprezentând cifrele semnificative, iar e este exponentul (puterea la care trebuie ridicata o valoare)&lt;br /&gt;
&lt;br /&gt;
Valoarea numarului real reprezentat in virgula mobila este data de expresia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; valoare=(-1)^s*m*(baza)^e &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Mantisa trebuie să îndeplinească condiția: 1 &amp;gt; m &amp;gt;= 1/baza &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modificatori ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;signed&amp;#039;&amp;#039;&amp;#039; (implicit) - tip de dată cu semn, utilizabil excusiv pentru numere întregi, face ca intervalul de definiție să fie între [-2&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;:2&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;-1]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned&amp;#039;&amp;#039;&amp;#039; - tip de dată fără semn, utilizabil excusiv pentru numere întregi, face ca intervalul de definiție să fie între [0:2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;-1]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;long&amp;#039;&amp;#039;&amp;#039; - de obicei, dublează domeniul de definiție a unui tip de dată; de exemplu un &amp;#039;&amp;#039;&amp;#039;long int&amp;#039;&amp;#039;&amp;#039; va avea 64 de biți în loc de 32; este aplicabil doar pentru &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;float&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;short&amp;#039;&amp;#039;&amp;#039; - de obicei, înjumătățește domeniul de definiție pentru &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039;, adică rezultatul este un tip de dată pe 16 biți.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Folosirea modificatorilor&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Tip&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Număr de biți&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Domeniu&lt;br /&gt;
|-&lt;br /&gt;
| unsigned char&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 ... 255&lt;br /&gt;
|-&lt;br /&gt;
| unsigned long int&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 64&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 .. 18,446,744,073,709,551,615 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Diferenţa dintre întregii signed şi unsigned constă în interpretarea diferită a bitului semnificativ (adică cel mai din stânga). &lt;br /&gt;
 Pentru un întreg signed, se va considera bitul semnificativ ca fiind bit de semn. &lt;br /&gt;
 Dacă acest bit este 0 atunci numărul este pozitiv iar dacă este 1 atunci este negativ.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Bit-ul reprezintă cea mai mică unitate de informaţie dintr-un calculator. Denumirea de bit provine de la „binary digit” adică număr binar. Sistemul binar este un sistem de numeraţie unde totul se reprezintă doar cu 1 şi 0.&lt;br /&gt;
Simbolul pentru un bit este &amp;quot;b&amp;quot;,a nu se confunda cu byte &amp;quot;B&amp;quot; care reprezintă o grupare de 8 biți.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipuri de date de dimensiune fixă în standardul C99 ==&lt;br /&gt;
&lt;br /&gt;
Deoarece există situații când numărul de biți pentru un anumit tip de dată este extrem de important, iar acest număr diferă între procesoare și compilatoare, standardul C99 a introdus următoarele tipuri de date, de dimensiune fixă, care se găsesc în header-ul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;stdint.h&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Tipuri de dimensiune fixă&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Tip&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Numar de biti&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Domeniu&lt;br /&gt;
|-&lt;br /&gt;
| int8_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -128 .. +127&lt;br /&gt;
|-&lt;br /&gt;
| uint8_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 .. 255&lt;br /&gt;
|-&lt;br /&gt;
| int16_t&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 16&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -32,768 ... +32,767&lt;br /&gt;
|-&lt;br /&gt;
| uint16_t&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 16&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 ... +65,535 &lt;br /&gt;
|-&lt;br /&gt;
| int32_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 32&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -2,147,483,648 .. 2,147,483,647&lt;br /&gt;
|-&lt;br /&gt;
| uint32_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 32&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 .. 4,294,967,295&lt;br /&gt;
|-&lt;br /&gt;
| int64_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 64&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807&lt;br /&gt;
|-&lt;br /&gt;
| uint64_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 64&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 .. 18,446,744,073,709,551,615&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Recomandare:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Utilizați tipurile de date de dimensiune fixă pentru valorile numerice întregi, tipul de date &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039; pentru a stoca un caracter și tipurile &amp;#039;&amp;#039;&amp;#039;float&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;double&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;long double&amp;#039;&amp;#039;&amp;#039; pentru valorile numerice fracționare.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operatori ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Operatorii aritmetici&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* +  adunarea &lt;br /&gt;
* -  scăderea &lt;br /&gt;
* *  înmulţirea &lt;br /&gt;
* /  împărţirea (rezultatul împărţirii pentru numere reale, câtul împărţirii pentru numere întregi)&lt;br /&gt;
* %  modulo (restul împărţirii a două numere întregi)&lt;br /&gt;
* ++ incrementarea (mărirea unei valori cu o unitate)&lt;br /&gt;
* -- decrementarea (micşorarea unei valori cu o unitate)&lt;br /&gt;
&lt;br /&gt;
Operatorii de incrementare/decrementare sunt folosiţi pentru creșterea/micşorarea unei valori cu o unitate.&lt;br /&gt;
 a++ / ++a - incrementare&lt;br /&gt;
 a-- / --a - decrementare&lt;br /&gt;
De asemenea se pot folosi instrucțiuni de pre sau post incrementare/decrementare.&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;POST-incrementare: x = a++;&amp;#039;&amp;#039;&amp;#039; &amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
x = a; &lt;br /&gt;
a = a + 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;PRE-incremenatare: x = ++a;&amp;#039;&amp;#039;&amp;#039; &amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
a = a + 1;&lt;br /&gt;
x = a;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Operatori relaţionali şi logici&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;gt; - mai mare&lt;br /&gt;
* &amp;gt;= -mai mare egal&lt;br /&gt;
* &amp;lt;  -mai mic&lt;br /&gt;
* &amp;lt;= -mai mic egal&lt;br /&gt;
* ==  -egal&lt;br /&gt;
* != -diferit&lt;br /&gt;
* &amp;amp;&amp;amp; -si&lt;br /&gt;
* || -sau&lt;br /&gt;
* !  -negare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemplu operatori relaționari și logici===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
int main(){&lt;br /&gt;
    int a = 2, b = 6, c = 0, result;&lt;br /&gt;
 &lt;br /&gt;
    result = !(a &amp;lt; c) &amp;amp;&amp;amp; (a &amp;lt; b) || (b &amp;lt;=c);&lt;br /&gt;
 &lt;br /&gt;
    printf(&amp;quot;result is %d\n&amp;quot;, result);&lt;br /&gt;
    return 0;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In exemplul de mai sus tineti cont de [http://www.robotics.ucv.ro/flexform/aplicatii/m1/Ion%20Petre%20-%20Utilizarea%20interfetei%20seriale/Cpp/precedenta-oper.html precedenta operatorilor].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Operatori la nivel de bit&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Avem şase operatori la nivel de bit,aceștia se aplică tipurilor char,int,long signed/unsigned,iar rezultatul este un întreg.&lt;br /&gt;
Operatorii la nivel de bit sunt următorii.&lt;br /&gt;
* &amp;amp; - AND (şi logic)&lt;br /&gt;
* | - OR (sau logic)&lt;br /&gt;
* ^ - XOR (sau exclusiv)&lt;br /&gt;
* &amp;lt;&amp;lt; - deplasare la stânga&lt;br /&gt;
* &amp;gt;&amp;gt; - deplasare la dreapta&lt;br /&gt;
* ~ - negare la nivel de bit&lt;br /&gt;
&lt;br /&gt;
==== Tabele de adevăr ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operator !! Tabel de adevăr !! Operator !! Tabel de adevăr !! Operator !! Tabel de adevăr&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;AND&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A AND B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;OR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A OR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;XOR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A XOR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Exemplu operator AND ===&lt;br /&gt;
Dorim să aflăm valoarea bitului de pe poziția 2 a numarului 20.Pentru a afla valorea acestui bit se poate realiza operația AND (&amp;amp;) între numărul dorit și un alt număr binar care are doar pe poziția dorită valoarea 1 (în cazul nostru poziția 2),astfel dacă rezultatul este diferit de 0 atunci inițial am avut bitul 1, respectiv 0 dacă bitul a fost 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
int main() {&lt;br /&gt;
   int a = 20;  /*  1 0 1 0 0 */&lt;br /&gt;
   int b = 4;   /*  0 0 1 0 0 */&lt;br /&gt;
 &lt;br /&gt;
    if (a &amp;amp; b) {/*  0 0 1 0 0*/&lt;br /&gt;
        printf(&amp;quot;Rezultatul este diferit de 0\n&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        printf(&amp;quot;Rezultatul are valoarea 0\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu operator de deplasare &amp;lt;&amp;lt; ===&lt;br /&gt;
Operatorii de deplasare (&amp;lt;&amp;lt; şi &amp;gt;&amp;gt;) realizează deplasarea biţilor din operandul stâng cu atâtea&lt;br /&gt;
poziţii câte sunt indicate de operandul drept.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int a = 255;  /* 0000 0000 1111 1111*/&lt;br /&gt;
a = a &amp;lt;&amp;lt; 3;   /* 0000 0111 1111 1000*/ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Deplasarea la stânga (&amp;lt;&amp;lt;) completează la dreapta cu 0, deci biţii din stânga se vor pierde.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu operator de negare ~ ===&lt;br /&gt;
Operatorul de negare realizează complementarea biților,biții de 0 se pun 1, iar biții de 1 se pun 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int a = 2200;  /* 1000 1001 1000*/&lt;br /&gt;
a = ~a;        /* 0110 0110 0111*/ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Scrieți un program care să citească un număr în virgulă mobilă de la tastatură și să se afișeze, pe linii diferite, în hexazecimal, semnul, mantisa și exponentul. Notă: pentru a putea efectua operații pe biți, operanzii trebuie să fie de tip întreg. Astfel, pentru a interpreta un număr în virgulă mobilă ca secvență de biți, variabila trebuie sa fie de tip int, iar citirea să se facă cu template-ul &amp;quot;%f&amp;quot;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Scrieți un program care să citească de la tastatură un număr întreg fără semn pe 8 biți (în bază 10) și să-l afișeze pe ecran în baza doi, folosind operatori de shiftare și mascare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Citiți de la tastatură un număr întreg cu semn, pe 32 de biți, apoi negați-l aritmetic și afișați valoarea, fără să folosiți operatorului unar &amp;quot;-&amp;quot; (folosind regulile convenției complement față de 2).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Scrieți un program care să citească un număr întreg pozitiv pe 8 biți de la tastatură, să numere și să afișeze câți biți de 1 și câți biți 0 are reprezentarea lui binară.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Citiți de la tastatură un număr întreg n, calculați și afișați suma numerelor de la 0 la n.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Citiți o valoare de temperatură în grade Celsius, și afișați pe ecran valoarea acelei temperaturi în Kelvin și grade Fahrenheit. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Fie o matrice de 8 linii și 10 coloane, cu elementele numerotate de la 0 (elementul din stânga sus) la 79 (elementul din dreapta jos):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  0  1  2  3  4  5  6  7  8  9&lt;br /&gt;
 10 11 12 13 14 15 16 17 18 19&lt;br /&gt;
 ...&lt;br /&gt;
 70 71 72 73 74 75 76 77 78 79&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dându-se de la tastatură un index n între 0 si 79, să se afișeze pe ce linie și pe ce coloană este indexul respectiv.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Dându-se un număr întreg de la tastatură, să se afișeze 0 dacă numărul este impar și 1 dacă este par.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Dându-se un număr întreg de la tastatură, să se afișeze restul împărțirii numărului la 16, folosind doar operații pe biți.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;dificil&amp;lt;/code&amp;gt; Folosind doar operații pe biți (fără construcții condiționale), să se calculeze modulul unui număr întreg pe 32 de biți, introdus de la tastatură.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=4871</id>
		<title>PC Laborator 5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=4871"/>
		<updated>2016-11-01T12:42:16Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Asocierea ramurilor if-else */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
* 	 înțeleagă cum funcționează o structură decizională; &lt;br /&gt;
* 	 scrie programe în C folosind construcții decizionale. &lt;br /&gt;
  &lt;br /&gt;
== Structura decizională == &lt;br /&gt;
  &lt;br /&gt;
Se întâmplă adesea ca evoluția unui program să depindă de o anumită condiție. Ea poate lua însă diverse forme, rolul programatorului fiind să conducă execuția programului pe calea corectă, ținând cont de acea condiție logică. Apare astfel structura decizionala if, care ramifică evoluția programului în funcție de valoarea de adevăr  a condiției testate.  &lt;br /&gt;
  &lt;br /&gt;
=== 	 Schema logică === &lt;br /&gt;
Prima etapă din parcurgerea unei structuri decizionale de tipul if-else o reprezintă testarea condiției logice. în cazul în care aceasta este evaluată ca adevărată se execută instructiunea1, cea asociată ramurii if. în cazul în care condiția logică este evaluată ca falsă se execută instructiunea2, cea asociată ramurii else. După executarea instrucțiunii asociate, structura if-else se încheie și programul se continuă cu linia următoare blocului decizional.&lt;br /&gt;
 &lt;br /&gt;
[[Fișier:structura_decizionala.png]]&lt;br /&gt;
&lt;br /&gt;
=== Sintaxă generală ===&lt;br /&gt;
a)	&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie) instructiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie) {&lt;br /&gt;
	 instructiune1;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	 instructiune2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
c)	&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie1) {&lt;br /&gt;
	instructiune 1;&lt;br /&gt;
}&lt;br /&gt;
else if (conditie2) {&lt;br /&gt;
	instructiune 2;&lt;br /&gt;
}&lt;br /&gt;
else if (conditie 3) {&lt;br /&gt;
	instructiune3;&lt;br /&gt;
}&lt;br /&gt;
................................&lt;br /&gt;
else {&lt;br /&gt;
	instructiune;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asocierea ramurilor if-else===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; în cazul în care un if are mai multe ramuri, un else se asociază celui mai apropiat if.&amp;lt;/div&amp;gt; &lt;br /&gt;
Această observație ne conduce la următoarele două cazuri: &lt;br /&gt;
  &lt;br /&gt;
* 	 dacă nu există blocuri de instrucțiuni, un else este legat de if-ul imediat anterior; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; 5) &lt;br /&gt;
    if (b &amp;gt; a) &lt;br /&gt;
	printf (&amp;quot;b este mai mare ca a&amp;quot;);&lt;br /&gt;
    else &lt;br /&gt;
	printf (&amp;quot;b este mai mic sau egal cu a&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*	dacă există blocuri de instrucțiuni, un else este legat de ultimul if fără pereche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; 5) {&lt;br /&gt;
    if (b &amp;gt; a)&lt;br /&gt;
        printf (&amp;quot;b este mai mare ca a&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else &lt;br /&gt;
    printf (&amp;quot;a nu este mai mare ca 5&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ce va afișa acest program prost indentat? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int number = 4; &lt;br /&gt;
double alpha = -1.0; &lt;br /&gt;
if (number &amp;gt; 0) &lt;br /&gt;
	if (alpha &amp;gt; 0)&lt;br /&gt;
		printf( &amp;quot;Here I am!\n&amp;quot;);&lt;br /&gt;
else &lt;br /&gt;
	printf( &amp;quot;No, I’m here!\n&amp;quot;); &lt;br /&gt;
printf(&amp;quot;No, actually, I’m here!\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Evaluarea expresiilor logice == &lt;br /&gt;
  &lt;br /&gt;
Am stabilit deja că o condiție logică, prin valoarea ei de adevăr, ramifică evoluția programului. &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Adevărat în C înseamnă orice rezultat diferit de 0 (nul) al unei evaluări, în timp ce despre fals vorbim când o expresie este evaluată la 0 (nul). &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
În C, condiția  poate avea mai multe reprezentări, după cum urmează &lt;br /&gt;
  &lt;br /&gt;
=== Operandul === &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Verificați că un număr citit de la tastatură poate fi numitorul unei fracții.&lt;br /&gt;
&lt;br /&gt;
=== Operația cu operatori relaționali (==, !=, &amp;lt;=, &amp;lt;, &amp;gt;, &amp;gt;=) === &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Asociați o valoare variabilei cost în funcție de valoarea variabilei distance după cum urmează: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; |distance&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; |cost&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Intre 0 si 100&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 5.50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | Peste 100, dar mai putin de 500&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8.00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Peste 500, dar nu mai mult de 1000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 10.50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1000 sau mai mult&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 13.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Operația cu operatori logici (&amp;amp;&amp;amp;, ||, !) === &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Folosind operatori logici, aduceți următoarea structură decizională la forma cea mai simplă: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (doesSignificantWork) { &lt;br /&gt;
	if (makesBreakthrough) &lt;br /&gt;
		nobelPrizeCandidate = true; &lt;br /&gt;
	else&lt;br /&gt;
		nobelPrizeCandidate = false; &lt;br /&gt;
} &lt;br /&gt;
else if (!doesSignificantWork) {&lt;br /&gt;
	nobelPrizeCandidate = false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;bool&amp;#039;&amp;#039;&amp;#039;, ca și valorile &amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;false&amp;#039;&amp;#039;&amp;#039;, au fost introduse în standardul C99, deci dacă doriți să-l folosiți codul trebuie compilat cu &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;--std=c99&amp;lt;/code&amp;gt; ca argument al compilatorului (gcc).&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a putea lucra cu operatorii logici, este necesar să ne reamintim modul în care aceștia operează. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Tabelul operatorilor logici&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | a&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | b&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | !a&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | a &amp;amp;&amp;amp; b&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | a ll b&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1 &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; În tabel remarcăm că operatorul logic &amp;#039;&amp;#039;&amp;#039;SI ( &amp;amp;&amp;amp; )&amp;#039;&amp;#039;&amp;#039; întoarce 1 dacă și numai dacă ambele expresii, &amp;#039;&amp;#039;a&amp;#039;&amp;#039; și &amp;#039;&amp;#039;b&amp;#039;&amp;#039; în cazul nostru, întorc o valoare nenulă. în orice alt caz, operatorul &amp;#039;&amp;#039;&amp;#039;SI&amp;#039;&amp;#039;&amp;#039; întoarce 0. Așadar, pentru a optimiza timpul de execuție a programului, expresia a doua, &amp;#039;&amp;#039;b&amp;#039;&amp;#039; în cazul nostru, va fi evaluată dacă și numai dacă prima expresie, &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, a întors o valoare nenulă. &lt;br /&gt;
În mod asemănător lucrează și operatorul &amp;#039;&amp;#039;&amp;#039;SAU ( || )&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5, b = 10;&lt;br /&gt;
    if (++a || ++b) {&lt;br /&gt;
         printf(&amp;quot;%d  %d&amp;quot;, a, b);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
         printf(&amp;quot;Wayne Rooney&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alternative la if-else ==&lt;br /&gt;
&lt;br /&gt;
=== Operatorul condițional (  ?  :  ) === &lt;br /&gt;
Singurul operator ternar din C, operatorul condițional funcționează asemenea unui if cu o singură ramură de tip else if. Sintaxa operatorului condițional este următoarea: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
(conditie) ? (expresie1) : (expresie2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aşadar, blocul decizional&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; b)&lt;br /&gt;
	printf (&amp;quot;a este mai mare decat b&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
	printf (&amp;quot;a este mai mic sau egal cu b&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
poate fi înlocuit astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(a &amp;gt; b ? &amp;quot;a este mai mare decat b&amp;quot; : &amp;quot;a este mai mic sau egal cu b&amp;quot;);&lt;br /&gt;
//sau&lt;br /&gt;
(a &amp;gt; b) ? ( printf (&amp;quot;a este mai mare decat b&amp;quot;)) : ( printf (&amp;quot;a este mai mic sau egal cu b&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Deși prima variantă este cea recunoscută ca fiind corectă, remarcăm că și a două variantă se comportă la fel ca prima. Asta se datorează modului în care funcționează operatorul condițional: el cere ca ambele expresii, &amp;#039;&amp;#039;expresie1&amp;#039;&amp;#039; și &amp;#039;&amp;#039;expresie2&amp;#039;&amp;#039;, să întoarcă &amp;quot;valori&amp;quot;. A doua variantă funcționează deoarece funcția &amp;#039;&amp;#039;printf()&amp;#039;&amp;#039; întoarce întotdeauna o [http://www.tutorialspoint.com/c_standard_library/c_function_printf.htm valoare].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structura decizională switch-case === &lt;br /&gt;
Această instrucțiune de decizie este similară unui if cu mai multe ramuri de tip else-if. Sintaxa este următoarea: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
switch (variabilaTestata)	{&lt;br /&gt;
	case valoare1:	 instructiune1;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
	case valoare2:	 instructiune2;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
	case valoare3:	 instructiune3;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
.........................................................................&lt;br /&gt;
	default:		instructiune;&lt;br /&gt;
				&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Valorile &amp;#039;&amp;#039;valoare1&amp;#039;&amp;#039;, &amp;#039;&amp;#039;valoare2&amp;#039;&amp;#039; etc. sunt proprii tipului de dată întreg, la fel ca &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039;. Ne reamintim însă că întreg nu înseamnă doar variabile de tip &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039;, astfel că &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; poate fi de tip &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; instrucțiunea &amp;#039;&amp;#039;break&amp;#039;&amp;#039; este opțională. Modul  care  switch-case funcționează este următorul: &lt;br /&gt;
&amp;lt;ol type=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;i&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; structura switch-case se încheie și se sare pe linia urmatoare întregului bloc decizional;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă nu există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; execuția se continuă până se întalnește un &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; sau până când se încheie structura switch-case. Până la acel moment se vor executa toate instrucțiunile întâlnite pe parcurs (&amp;#039;&amp;#039;instructiune2, instructiune3&amp;#039;&amp;#039; etc.);&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; nu este egală cu niciuna dintre valorile &amp;#039;&amp;#039;valoare1, valoare2&amp;#039;&amp;#039; etc atunci se execută &amp;#039;&amp;#039;instructiune&amp;#039;&amp;#039;, asociată etichetei default.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica echivalența dintre if-else și switch-case, rezolvați folosind ambele structuri decizionale următoarea problemă:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Un microbist vrea să afle situația Grupei F de calificare la EURO2016. Astfel, el va introduce o cifră pentru a vedea ce &amp;quot;națională&amp;quot; ocupă acel loc. Folosind următoarea listă, informați-l corect pe suporter.  &lt;br /&gt;
&lt;br /&gt;
1.	Irlanda de Nord&lt;br /&gt;
2.	România&lt;br /&gt;
3.	Ungaria&lt;br /&gt;
4.	Finlanda&lt;br /&gt;
5.	Insulele Feroe&lt;br /&gt;
6.	Grecia&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 100;&lt;br /&gt;
    if (a &amp;gt; 10) {&lt;br /&gt;
         printf(&amp;quot;Tiberiu Soare &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (a &amp;gt; 20) {&lt;br /&gt;
         printf(&amp;quot;Horia Andreescu &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (a &amp;gt; 30) {&lt;br /&gt;
           printf(&amp;quot;Iosif Ion Prunner &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Ştiind că un student primește 350 lei/lună dacă are media cel puțin 8.50, 450 lei/lună pentru o medie mai mare sau egală cu 9.50 și 600 lei/lună dacă are media cel puțin 9.70, scrieți un program prin care studentul să afle ce bursă urmează să primească (media va fi citită de la tastatură). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int m = 5, n = 10, q = 20;&lt;br /&gt;
    if (q / n * m)&lt;br /&gt;
         printf(&amp;quot;Bill Gates &amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
         printf(&amp;quot;Amancio Ortega &amp;quot;);&lt;br /&gt;
         printf(&amp;quot;Carlos Slim Helu &amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți un program care citește de la tastatură notele unui elev la limba română, matematică și informatică și afișează dacă elevul a promovat sau nu bacalaureatul. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie a și b două numere întregi citite de la tastatură. Scrieți un algoritm care să verifice dacă a si b sunt numere consecutive.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citesc de la tastatură 3 numere reprezentând lungimea cele 3 laturi ale unui triunghi. Să se afișeze dacă triunghiul este dreptunghic.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citește de la tastatură un număr întreg fără semn de 8 biți. Să se afișeze dacă numărul este sau nu un palindrom (dacă are aceeași valoare citit și de la stânga la dreapta si de la dreapta la stanga; de exemplu 101, sau 242).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=4870</id>
		<title>PC Laborator 5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=4870"/>
		<updated>2016-11-01T12:38:39Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Operația cu operatori logici (&amp;amp;&amp;amp;, ||, !) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
* 	 înțeleagă cum funcționează o structură decizională; &lt;br /&gt;
* 	 scrie programe în C folosind construcții decizionale. &lt;br /&gt;
  &lt;br /&gt;
== Structura decizională == &lt;br /&gt;
  &lt;br /&gt;
Se întâmplă adesea ca evoluția unui program să depindă de o anumită condiție. Ea poate lua însă diverse forme, rolul programatorului fiind să conducă execuția programului pe calea corectă, ținând cont de acea condiție logică. Apare astfel structura decizionala if, care ramifică evoluția programului în funcție de valoarea de adevăr  a condiției testate.  &lt;br /&gt;
  &lt;br /&gt;
=== 	 Schema logică === &lt;br /&gt;
Prima etapă din parcurgerea unei structuri decizionale de tipul if-else o reprezintă testarea condiției logice. în cazul în care aceasta este evaluată ca adevărată se execută instructiunea1, cea asociată ramurii if. în cazul în care condiția logică este evaluată ca falsă se execută instructiunea2, cea asociată ramurii else. După executarea instrucțiunii asociate, structura if-else se încheie și programul se continuă cu linia următoare blocului decizional.&lt;br /&gt;
 &lt;br /&gt;
[[Fișier:structura_decizionala.png]]&lt;br /&gt;
&lt;br /&gt;
=== Sintaxă generală ===&lt;br /&gt;
a)	&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie) instructiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie) {&lt;br /&gt;
	 instructiune1;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	 instructiune2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
c)	&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie1) {&lt;br /&gt;
	instructiune 1;&lt;br /&gt;
}&lt;br /&gt;
else if (conditie2) {&lt;br /&gt;
	instructiune 2;&lt;br /&gt;
}&lt;br /&gt;
else if (conditie 3) {&lt;br /&gt;
	instructiune3;&lt;br /&gt;
}&lt;br /&gt;
................................&lt;br /&gt;
else {&lt;br /&gt;
	instructiune;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asocierea ramurilor if-else===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; în cazul în care un if are mai multe ramuri, un else se asociază celui mai apropiat if.&amp;lt;/div&amp;gt; &lt;br /&gt;
Această observație ne conduce la următoarele două cazuri: &lt;br /&gt;
  &lt;br /&gt;
* 	 dacă nu există blocuri de instrucțiuni, un else este legat de if-ul imediat anterior; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; 5) &lt;br /&gt;
    if (b &amp;gt; a) &lt;br /&gt;
	printf (&amp;quot;b este mai mare ca a&amp;quot;);&lt;br /&gt;
    else &lt;br /&gt;
	printf (&amp;quot;b este mai mic sau egal cu a&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*	dacă există blocuri de instrucțiuni, un else este legat de ultimul if fără pereche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; 5) {&lt;br /&gt;
	if (b &amp;gt; a)&lt;br /&gt;
	      	printf (&amp;quot;b este mai mare ca a&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
else &lt;br /&gt;
    printf (&amp;quot;a nu este mai mare ca 5&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ce va afișa acest program prost indentat? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int number = 4; &lt;br /&gt;
double alpha = -1.0; &lt;br /&gt;
if (number &amp;gt; 0) &lt;br /&gt;
	if (alpha &amp;gt; 0)&lt;br /&gt;
		printf( &amp;quot;Here I am!\n&amp;quot;);&lt;br /&gt;
else &lt;br /&gt;
	printf( &amp;quot;No, I’m here!\n&amp;quot;); &lt;br /&gt;
printf(&amp;quot;No, actually, I’m here!\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Evaluarea expresiilor logice == &lt;br /&gt;
  &lt;br /&gt;
Am stabilit deja că o condiție logică, prin valoarea ei de adevăr, ramifică evoluția programului. &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Adevărat în C înseamnă orice rezultat diferit de 0 (nul) al unei evaluări, în timp ce despre fals vorbim când o expresie este evaluată la 0 (nul). &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
În C, condiția  poate avea mai multe reprezentări, după cum urmează &lt;br /&gt;
  &lt;br /&gt;
=== Operandul === &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Verificați că un număr citit de la tastatură poate fi numitorul unei fracții.&lt;br /&gt;
&lt;br /&gt;
=== Operația cu operatori relaționali (==, !=, &amp;lt;=, &amp;lt;, &amp;gt;, &amp;gt;=) === &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Asociați o valoare variabilei cost în funcție de valoarea variabilei distance după cum urmează: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; |distance&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; |cost&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Intre 0 si 100&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 5.50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | Peste 100, dar mai putin de 500&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8.00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Peste 500, dar nu mai mult de 1000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 10.50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1000 sau mai mult&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 13.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Operația cu operatori logici (&amp;amp;&amp;amp;, ||, !) === &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Folosind operatori logici, aduceți următoarea structură decizională la forma cea mai simplă: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (doesSignificantWork) { &lt;br /&gt;
	if (makesBreakthrough) &lt;br /&gt;
		nobelPrizeCandidate = true; &lt;br /&gt;
	else&lt;br /&gt;
		nobelPrizeCandidate = false; &lt;br /&gt;
} &lt;br /&gt;
else if (!doesSignificantWork) {&lt;br /&gt;
	nobelPrizeCandidate = false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;bool&amp;#039;&amp;#039;&amp;#039;, ca și valorile &amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;false&amp;#039;&amp;#039;&amp;#039;, au fost introduse în standardul C99, deci dacă doriți să-l folosiți codul trebuie compilat cu &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;--std=c99&amp;lt;/code&amp;gt; ca argument al compilatorului (gcc).&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a putea lucra cu operatorii logici, este necesar să ne reamintim modul în care aceștia operează. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Tabelul operatorilor logici&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | a&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | b&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | !a&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | a &amp;amp;&amp;amp; b&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | a ll b&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1 &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; În tabel remarcăm că operatorul logic &amp;#039;&amp;#039;&amp;#039;SI ( &amp;amp;&amp;amp; )&amp;#039;&amp;#039;&amp;#039; întoarce 1 dacă și numai dacă ambele expresii, &amp;#039;&amp;#039;a&amp;#039;&amp;#039; și &amp;#039;&amp;#039;b&amp;#039;&amp;#039; în cazul nostru, întorc o valoare nenulă. în orice alt caz, operatorul &amp;#039;&amp;#039;&amp;#039;SI&amp;#039;&amp;#039;&amp;#039; întoarce 0. Așadar, pentru a optimiza timpul de execuție a programului, expresia a doua, &amp;#039;&amp;#039;b&amp;#039;&amp;#039; în cazul nostru, va fi evaluată dacă și numai dacă prima expresie, &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, a întors o valoare nenulă. &lt;br /&gt;
În mod asemănător lucrează și operatorul &amp;#039;&amp;#039;&amp;#039;SAU ( || )&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5, b = 10;&lt;br /&gt;
    if (++a || ++b) {&lt;br /&gt;
         printf(&amp;quot;%d  %d&amp;quot;, a, b);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
         printf(&amp;quot;Wayne Rooney&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alternative la if-else ==&lt;br /&gt;
&lt;br /&gt;
=== Operatorul condițional (  ?  :  ) === &lt;br /&gt;
Singurul operator ternar din C, operatorul condițional funcționează asemenea unui if cu o singură ramură de tip else if. Sintaxa operatorului condițional este următoarea: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
(conditie) ? (expresie1) : (expresie2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aşadar, blocul decizional&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; b)&lt;br /&gt;
	printf (&amp;quot;a este mai mare decat b&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
	printf (&amp;quot;a este mai mic sau egal cu b&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
poate fi înlocuit astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(a &amp;gt; b ? &amp;quot;a este mai mare decat b&amp;quot; : &amp;quot;a este mai mic sau egal cu b&amp;quot;);&lt;br /&gt;
//sau&lt;br /&gt;
(a &amp;gt; b) ? ( printf (&amp;quot;a este mai mare decat b&amp;quot;)) : ( printf (&amp;quot;a este mai mic sau egal cu b&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Deși prima variantă este cea recunoscută ca fiind corectă, remarcăm că și a două variantă se comportă la fel ca prima. Asta se datorează modului în care funcționează operatorul condițional: el cere ca ambele expresii, &amp;#039;&amp;#039;expresie1&amp;#039;&amp;#039; și &amp;#039;&amp;#039;expresie2&amp;#039;&amp;#039;, să întoarcă &amp;quot;valori&amp;quot;. A doua variantă funcționează deoarece funcția &amp;#039;&amp;#039;printf()&amp;#039;&amp;#039; întoarce întotdeauna o [http://www.tutorialspoint.com/c_standard_library/c_function_printf.htm valoare].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structura decizională switch-case === &lt;br /&gt;
Această instrucțiune de decizie este similară unui if cu mai multe ramuri de tip else-if. Sintaxa este următoarea: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
switch (variabilaTestata)	{&lt;br /&gt;
	case valoare1:	 instructiune1;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
	case valoare2:	 instructiune2;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
	case valoare3:	 instructiune3;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
.........................................................................&lt;br /&gt;
	default:		instructiune;&lt;br /&gt;
				&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Valorile &amp;#039;&amp;#039;valoare1&amp;#039;&amp;#039;, &amp;#039;&amp;#039;valoare2&amp;#039;&amp;#039; etc. sunt proprii tipului de dată întreg, la fel ca &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039;. Ne reamintim însă că întreg nu înseamnă doar variabile de tip &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039;, astfel că &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; poate fi de tip &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; instrucțiunea &amp;#039;&amp;#039;break&amp;#039;&amp;#039; este opțională. Modul  care  switch-case funcționează este următorul: &lt;br /&gt;
&amp;lt;ol type=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;i&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; structura switch-case se încheie și se sare pe linia urmatoare întregului bloc decizional;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă nu există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; execuția se continuă până se întalnește un &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; sau până când se încheie structura switch-case. Până la acel moment se vor executa toate instrucțiunile întâlnite pe parcurs (&amp;#039;&amp;#039;instructiune2, instructiune3&amp;#039;&amp;#039; etc.);&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; nu este egală cu niciuna dintre valorile &amp;#039;&amp;#039;valoare1, valoare2&amp;#039;&amp;#039; etc atunci se execută &amp;#039;&amp;#039;instructiune&amp;#039;&amp;#039;, asociată etichetei default.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica echivalența dintre if-else și switch-case, rezolvați folosind ambele structuri decizionale următoarea problemă:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Un microbist vrea să afle situația Grupei F de calificare la EURO2016. Astfel, el va introduce o cifră pentru a vedea ce &amp;quot;națională&amp;quot; ocupă acel loc. Folosind următoarea listă, informați-l corect pe suporter.  &lt;br /&gt;
&lt;br /&gt;
1.	Irlanda de Nord&lt;br /&gt;
2.	România&lt;br /&gt;
3.	Ungaria&lt;br /&gt;
4.	Finlanda&lt;br /&gt;
5.	Insulele Feroe&lt;br /&gt;
6.	Grecia&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 100;&lt;br /&gt;
    if (a &amp;gt; 10) {&lt;br /&gt;
         printf(&amp;quot;Tiberiu Soare &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (a &amp;gt; 20) {&lt;br /&gt;
         printf(&amp;quot;Horia Andreescu &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (a &amp;gt; 30) {&lt;br /&gt;
           printf(&amp;quot;Iosif Ion Prunner &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Ştiind că un student primește 350 lei/lună dacă are media cel puțin 8.50, 450 lei/lună pentru o medie mai mare sau egală cu 9.50 și 600 lei/lună dacă are media cel puțin 9.70, scrieți un program prin care studentul să afle ce bursă urmează să primească (media va fi citită de la tastatură). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int m = 5, n = 10, q = 20;&lt;br /&gt;
    if (q / n * m)&lt;br /&gt;
         printf(&amp;quot;Bill Gates &amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
         printf(&amp;quot;Amancio Ortega &amp;quot;);&lt;br /&gt;
         printf(&amp;quot;Carlos Slim Helu &amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți un program care citește de la tastatură notele unui elev la limba română, matematică și informatică și afișează dacă elevul a promovat sau nu bacalaureatul. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie a și b două numere întregi citite de la tastatură. Scrieți un algoritm care să verifice dacă a si b sunt numere consecutive.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citesc de la tastatură 3 numere reprezentând lungimea cele 3 laturi ale unui triunghi. Să se afișeze dacă triunghiul este dreptunghic.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citește de la tastatură un număr întreg fără semn de 8 biți. Să se afișeze dacă numărul este sau nu un palindrom (dacă are aceeași valoare citit și de la stânga la dreapta si de la dreapta la stanga; de exemplu 101, sau 242).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=4869</id>
		<title>PC Laborator 5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=4869"/>
		<updated>2016-11-01T12:37:56Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
* 	 înțeleagă cum funcționează o structură decizională; &lt;br /&gt;
* 	 scrie programe în C folosind construcții decizionale. &lt;br /&gt;
  &lt;br /&gt;
== Structura decizională == &lt;br /&gt;
  &lt;br /&gt;
Se întâmplă adesea ca evoluția unui program să depindă de o anumită condiție. Ea poate lua însă diverse forme, rolul programatorului fiind să conducă execuția programului pe calea corectă, ținând cont de acea condiție logică. Apare astfel structura decizionala if, care ramifică evoluția programului în funcție de valoarea de adevăr  a condiției testate.  &lt;br /&gt;
  &lt;br /&gt;
=== 	 Schema logică === &lt;br /&gt;
Prima etapă din parcurgerea unei structuri decizionale de tipul if-else o reprezintă testarea condiției logice. în cazul în care aceasta este evaluată ca adevărată se execută instructiunea1, cea asociată ramurii if. în cazul în care condiția logică este evaluată ca falsă se execută instructiunea2, cea asociată ramurii else. După executarea instrucțiunii asociate, structura if-else se încheie și programul se continuă cu linia următoare blocului decizional.&lt;br /&gt;
 &lt;br /&gt;
[[Fișier:structura_decizionala.png]]&lt;br /&gt;
&lt;br /&gt;
=== Sintaxă generală ===&lt;br /&gt;
a)	&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie) instructiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie) {&lt;br /&gt;
	 instructiune1;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	 instructiune2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
c)	&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie1) {&lt;br /&gt;
	instructiune 1;&lt;br /&gt;
}&lt;br /&gt;
else if (conditie2) {&lt;br /&gt;
	instructiune 2;&lt;br /&gt;
}&lt;br /&gt;
else if (conditie 3) {&lt;br /&gt;
	instructiune3;&lt;br /&gt;
}&lt;br /&gt;
................................&lt;br /&gt;
else {&lt;br /&gt;
	instructiune;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asocierea ramurilor if-else===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; în cazul în care un if are mai multe ramuri, un else se asociază celui mai apropiat if.&amp;lt;/div&amp;gt; &lt;br /&gt;
Această observație ne conduce la următoarele două cazuri: &lt;br /&gt;
  &lt;br /&gt;
* 	 dacă nu există blocuri de instrucțiuni, un else este legat de if-ul imediat anterior; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; 5) &lt;br /&gt;
    if (b &amp;gt; a) &lt;br /&gt;
	printf (&amp;quot;b este mai mare ca a&amp;quot;);&lt;br /&gt;
    else &lt;br /&gt;
	printf (&amp;quot;b este mai mic sau egal cu a&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*	dacă există blocuri de instrucțiuni, un else este legat de ultimul if fără pereche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; 5) {&lt;br /&gt;
	if (b &amp;gt; a)&lt;br /&gt;
	      	printf (&amp;quot;b este mai mare ca a&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
else &lt;br /&gt;
    printf (&amp;quot;a nu este mai mare ca 5&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ce va afișa acest program prost indentat? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int number = 4; &lt;br /&gt;
double alpha = -1.0; &lt;br /&gt;
if (number &amp;gt; 0) &lt;br /&gt;
	if (alpha &amp;gt; 0)&lt;br /&gt;
		printf( &amp;quot;Here I am!\n&amp;quot;);&lt;br /&gt;
else &lt;br /&gt;
	printf( &amp;quot;No, I’m here!\n&amp;quot;); &lt;br /&gt;
printf(&amp;quot;No, actually, I’m here!\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Evaluarea expresiilor logice == &lt;br /&gt;
  &lt;br /&gt;
Am stabilit deja că o condiție logică, prin valoarea ei de adevăr, ramifică evoluția programului. &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Adevărat în C înseamnă orice rezultat diferit de 0 (nul) al unei evaluări, în timp ce despre fals vorbim când o expresie este evaluată la 0 (nul). &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
În C, condiția  poate avea mai multe reprezentări, după cum urmează &lt;br /&gt;
  &lt;br /&gt;
=== Operandul === &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Verificați că un număr citit de la tastatură poate fi numitorul unei fracții.&lt;br /&gt;
&lt;br /&gt;
=== Operația cu operatori relaționali (==, !=, &amp;lt;=, &amp;lt;, &amp;gt;, &amp;gt;=) === &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Asociați o valoare variabilei cost în funcție de valoarea variabilei distance după cum urmează: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; |distance&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; |cost&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Intre 0 si 100&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 5.50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | Peste 100, dar mai putin de 500&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8.00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Peste 500, dar nu mai mult de 1000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 10.50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1000 sau mai mult&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 13.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Operația cu operatori logici (&amp;amp;&amp;amp;, ||, !) === &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Folosind operatori logici, aduceți următoarea structură decizională la forma cea mai simplă: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (doesSignificantWork) { &lt;br /&gt;
	if (makesBreakthrough) &lt;br /&gt;
		nobelPrizeCandidate = true; &lt;br /&gt;
	else&lt;br /&gt;
		 nobelPrizeCandidate = false; &lt;br /&gt;
} &lt;br /&gt;
else if (!doesSignificantWork) {&lt;br /&gt;
	nobelPrizeCandidate = false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;bool&amp;#039;&amp;#039;&amp;#039;, ca și valorile &amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;false&amp;#039;&amp;#039;&amp;#039;, au fost introduse în standardul C99, deci dacă doriți să-l folosiți codul trebuie compilat cu &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;--std=c99&amp;lt;/code&amp;gt; ca argument al compilatorului (gcc).&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a putea lucra cu operatorii logici, este necesar să ne reamintim modul în care aceștia operează. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Tabelul operatorilor logici&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | a&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | b&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | !a&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | a &amp;amp;&amp;amp; b&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | a ll b&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1 &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; În tabel remarcăm că operatorul logic &amp;#039;&amp;#039;&amp;#039;SI ( &amp;amp;&amp;amp; )&amp;#039;&amp;#039;&amp;#039; întoarce 1 dacă și numai dacă ambele expresii, &amp;#039;&amp;#039;a&amp;#039;&amp;#039; și &amp;#039;&amp;#039;b&amp;#039;&amp;#039; în cazul nostru, întorc o valoare nenulă. în orice alt caz, operatorul &amp;#039;&amp;#039;&amp;#039;SI&amp;#039;&amp;#039;&amp;#039; întoarce 0. Așadar, pentru a optimiza timpul de execuție a programului, expresia a doua, &amp;#039;&amp;#039;b&amp;#039;&amp;#039; în cazul nostru, va fi evaluată dacă și numai dacă prima expresie, &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, a întors o valoare nenulă. &lt;br /&gt;
În mod asemănător lucrează și operatorul &amp;#039;&amp;#039;&amp;#039;SAU ( || )&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5, b = 10;&lt;br /&gt;
    if(++a || ++b) {&lt;br /&gt;
         printf(&amp;quot;%d  %d&amp;quot;, a, b);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
         printf(&amp;quot;Wayne Rooney&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alternative la if-else ==&lt;br /&gt;
&lt;br /&gt;
=== Operatorul condițional (  ?  :  ) === &lt;br /&gt;
Singurul operator ternar din C, operatorul condițional funcționează asemenea unui if cu o singură ramură de tip else if. Sintaxa operatorului condițional este următoarea: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
(conditie) ? (expresie1) : (expresie2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aşadar, blocul decizional&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; b)&lt;br /&gt;
	printf (&amp;quot;a este mai mare decat b&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
	printf (&amp;quot;a este mai mic sau egal cu b&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
poate fi înlocuit astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(a &amp;gt; b ? &amp;quot;a este mai mare decat b&amp;quot; : &amp;quot;a este mai mic sau egal cu b&amp;quot;);&lt;br /&gt;
//sau&lt;br /&gt;
(a &amp;gt; b) ? ( printf (&amp;quot;a este mai mare decat b&amp;quot;)) : ( printf (&amp;quot;a este mai mic sau egal cu b&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Deși prima variantă este cea recunoscută ca fiind corectă, remarcăm că și a două variantă se comportă la fel ca prima. Asta se datorează modului în care funcționează operatorul condițional: el cere ca ambele expresii, &amp;#039;&amp;#039;expresie1&amp;#039;&amp;#039; și &amp;#039;&amp;#039;expresie2&amp;#039;&amp;#039;, să întoarcă &amp;quot;valori&amp;quot;. A doua variantă funcționează deoarece funcția &amp;#039;&amp;#039;printf()&amp;#039;&amp;#039; întoarce întotdeauna o [http://www.tutorialspoint.com/c_standard_library/c_function_printf.htm valoare].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structura decizională switch-case === &lt;br /&gt;
Această instrucțiune de decizie este similară unui if cu mai multe ramuri de tip else-if. Sintaxa este următoarea: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
switch (variabilaTestata)	{&lt;br /&gt;
	case valoare1:	 instructiune1;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
	case valoare2:	 instructiune2;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
	case valoare3:	 instructiune3;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
.........................................................................&lt;br /&gt;
	default:		instructiune;&lt;br /&gt;
				&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Valorile &amp;#039;&amp;#039;valoare1&amp;#039;&amp;#039;, &amp;#039;&amp;#039;valoare2&amp;#039;&amp;#039; etc. sunt proprii tipului de dată întreg, la fel ca &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039;. Ne reamintim însă că întreg nu înseamnă doar variabile de tip &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039;, astfel că &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; poate fi de tip &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; instrucțiunea &amp;#039;&amp;#039;break&amp;#039;&amp;#039; este opțională. Modul  care  switch-case funcționează este următorul: &lt;br /&gt;
&amp;lt;ol type=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;i&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; structura switch-case se încheie și se sare pe linia urmatoare întregului bloc decizional;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă nu există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; execuția se continuă până se întalnește un &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; sau până când se încheie structura switch-case. Până la acel moment se vor executa toate instrucțiunile întâlnite pe parcurs (&amp;#039;&amp;#039;instructiune2, instructiune3&amp;#039;&amp;#039; etc.);&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; nu este egală cu niciuna dintre valorile &amp;#039;&amp;#039;valoare1, valoare2&amp;#039;&amp;#039; etc atunci se execută &amp;#039;&amp;#039;instructiune&amp;#039;&amp;#039;, asociată etichetei default.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica echivalența dintre if-else și switch-case, rezolvați folosind ambele structuri decizionale următoarea problemă:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Un microbist vrea să afle situația Grupei F de calificare la EURO2016. Astfel, el va introduce o cifră pentru a vedea ce &amp;quot;națională&amp;quot; ocupă acel loc. Folosind următoarea listă, informați-l corect pe suporter.  &lt;br /&gt;
&lt;br /&gt;
1.	Irlanda de Nord&lt;br /&gt;
2.	România&lt;br /&gt;
3.	Ungaria&lt;br /&gt;
4.	Finlanda&lt;br /&gt;
5.	Insulele Feroe&lt;br /&gt;
6.	Grecia&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 100;&lt;br /&gt;
    if (a &amp;gt; 10) {&lt;br /&gt;
         printf(&amp;quot;Tiberiu Soare &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (a &amp;gt; 20) {&lt;br /&gt;
         printf(&amp;quot;Horia Andreescu &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (a &amp;gt; 30) {&lt;br /&gt;
           printf(&amp;quot;Iosif Ion Prunner &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Ştiind că un student primește 350 lei/lună dacă are media cel puțin 8.50, 450 lei/lună pentru o medie mai mare sau egală cu 9.50 și 600 lei/lună dacă are media cel puțin 9.70, scrieți un program prin care studentul să afle ce bursă urmează să primească (media va fi citită de la tastatură). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int m = 5, n = 10, q = 20;&lt;br /&gt;
    if (q / n * m)&lt;br /&gt;
         printf(&amp;quot;Bill Gates &amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
         printf(&amp;quot;Amancio Ortega &amp;quot;);&lt;br /&gt;
         printf(&amp;quot;Carlos Slim Helu &amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți un program care citește de la tastatură notele unui elev la limba română, matematică și informatică și afișează dacă elevul a promovat sau nu bacalaureatul. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie a și b două numere întregi citite de la tastatură. Scrieți un algoritm care să verifice dacă a si b sunt numere consecutive.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citesc de la tastatură 3 numere reprezentând lungimea cele 3 laturi ale unui triunghi. Să se afișeze dacă triunghiul este dreptunghic.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citește de la tastatură un număr întreg fără semn de 8 biți. Să se afișeze dacă numărul este sau nu un palindrom (dacă are aceeași valoare citit și de la stânga la dreapta si de la dreapta la stanga; de exemplu 101, sau 242).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=4868</id>
		<title>PC Laborator 5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=4868"/>
		<updated>2016-11-01T12:34:02Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Operatorul condițional (  ?  :  ) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
* 	 înțeleagă cum funcționează o structură decizională; &lt;br /&gt;
* 	 scrie programe în C folosind construcții decizionale. &lt;br /&gt;
  &lt;br /&gt;
== Structura decizională == &lt;br /&gt;
  &lt;br /&gt;
Se întâmplă adesea ca evoluția unui program să depindă de o anumită condiție. Ea poate lua însă diverse forme, rolul programatorului fiind să conducă execuția programului pe calea corectă, ținând cont de acea condiție logică. Apare astfel structura decizionala if, care ramifică evoluția programului în funcție de valoarea de adevăr  a condiției testate.  &lt;br /&gt;
  &lt;br /&gt;
=== 	 Schema logică === &lt;br /&gt;
Prima etapă din parcurgerea unei structuri decizionale de tipul if-else o reprezintă testarea condiției logice. în cazul în care aceasta este evaluată ca adevărată se execută instructiunea1, cea asociată ramurii if. în cazul în care condiția logică este evaluată ca falsă se execută instructiunea2, cea asociată ramurii else. După executarea instrucțiunii asociate, structura if-else se încheie și programul se continuă cu linia următoare blocului decizional.&lt;br /&gt;
 &lt;br /&gt;
[[Fișier:structura_decizionala.png]]&lt;br /&gt;
&lt;br /&gt;
=== Sintaxă generală ===&lt;br /&gt;
a)	&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie) instructiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie) {&lt;br /&gt;
	 instructiune1;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	 instructiune2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
c)	&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie1) {&lt;br /&gt;
	instructiune 1;&lt;br /&gt;
}&lt;br /&gt;
else if (conditie2) {&lt;br /&gt;
	instructiune 2;&lt;br /&gt;
}&lt;br /&gt;
else if (conditie 3) {&lt;br /&gt;
	instructiune3;&lt;br /&gt;
}&lt;br /&gt;
................................&lt;br /&gt;
else {&lt;br /&gt;
	instructiune;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asocierea ramurilor if-else===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; în cazul în care un if are mai multe ramuri, un else se asociază celui mai apropiat if.&amp;lt;/div&amp;gt; &lt;br /&gt;
Această observație ne conduce la următoarele două cazuri: &lt;br /&gt;
  &lt;br /&gt;
* 	 dacă nu există blocuri de instrucțiuni, un else este legat de if-ul imediat anterior; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; 5) &lt;br /&gt;
    if (b &amp;gt; a) &lt;br /&gt;
	printf (&amp;quot;b este mai mare ca a&amp;quot;);&lt;br /&gt;
    else &lt;br /&gt;
	printf (&amp;quot;b este mai mic sau egal cu a&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*	dacă există blocuri de instrucțiuni, un else este legat de ultimul if fără pereche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; 5) {&lt;br /&gt;
	if (b &amp;gt; a)&lt;br /&gt;
	      	printf (&amp;quot;b este mai mare ca a&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
else &lt;br /&gt;
    printf (&amp;quot;a nu este mai mare ca 5&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ce va afișa acest program prost indentat? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int number = 4; &lt;br /&gt;
double alpha = -1.0; &lt;br /&gt;
if (number &amp;gt; 0) &lt;br /&gt;
	if (alpha &amp;gt; 0)&lt;br /&gt;
		printf( &amp;quot;Here I am!\n&amp;quot;);&lt;br /&gt;
else &lt;br /&gt;
	printf( &amp;quot;No, I’m here!\n&amp;quot;); &lt;br /&gt;
printf(&amp;quot;No, actually, I’m here!\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Evaluarea expresiilor logice == &lt;br /&gt;
  &lt;br /&gt;
Am stabilit deja că o condiție logică, prin valoarea ei de adevăr, ramifică evoluția programului. &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Adevărat în C înseamnă orice rezultat diferit de 0 (nul) al unei evaluări, în timp ce despre fals vorbim când o expresie este evaluată la 0 (nul). &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
În C, condiția  poate avea mai multe reprezentări, după cum urmează &lt;br /&gt;
  &lt;br /&gt;
=== Operandul === &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Verificați că un număr citit de la tastatură poate fi numitorul unei fracții.&lt;br /&gt;
&lt;br /&gt;
=== Operația cu operatori relaționali (==, !=, &amp;lt;=, &amp;lt;, &amp;gt;, &amp;gt;=) === &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Asociați o valoare variabilei cost în funcție de valoarea variabilei distance după cum urmează: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; |distance&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; |cost&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Intre 0 si 100&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 5.50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | Peste 100, dar mai putin de 500&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8.00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Peste 500, dar nu mai mult de 1000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 10.50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1000 sau mai mult&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 13.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Operația cu operatori logici (&amp;amp;&amp;amp;, ||, !) === &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Folosind operatori logici, aduceți următoarea structură decizională la forma cea mai simplă: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (doesSignificantWork) { &lt;br /&gt;
	if (makesBreakthrough) &lt;br /&gt;
		nobelPrizeCandidate = true; &lt;br /&gt;
	else&lt;br /&gt;
		 nobelPrizeCandidate = false; &lt;br /&gt;
} &lt;br /&gt;
else if (!doesSignificantWork) {&lt;br /&gt;
	nobelPrizeCandidate = false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;bool&amp;#039;&amp;#039;&amp;#039;, ca și valorile &amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;false&amp;#039;&amp;#039;&amp;#039;, au fost introduse în standardul C99, deci dacă doriți să-l folosiți codul trebuie compilat cu &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;--std=c99&amp;lt;/code&amp;gt; ca argument al compilatorului (gcc).&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a putea lucra cu operatorii logici, este necesar să ne reamintim modul în care aceștia operează. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Tabelul operatorilor logici&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | a&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | b&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | !a&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | a &amp;amp;&amp;amp; b&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | a ll b&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1 &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; În tabel remarcăm că operatorul logic &amp;#039;&amp;#039;&amp;#039;SI ( &amp;amp;&amp;amp; )&amp;#039;&amp;#039;&amp;#039; întoarce 1 dacă și numai dacă ambele expresii, &amp;#039;&amp;#039;a&amp;#039;&amp;#039; și &amp;#039;&amp;#039;b&amp;#039;&amp;#039; în cazul nostru, întorc o valoare nenulă. în orice alt caz, operatorul &amp;#039;&amp;#039;&amp;#039;SI&amp;#039;&amp;#039;&amp;#039; întoarce 0. Așadar, pentru a optimiza timpul de execuție a programului, expresia a doua, &amp;#039;&amp;#039;b&amp;#039;&amp;#039; în cazul nostru, va fi evaluată dacă și numai dacă prima expresie, &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, a întors o valoare nenulă. &lt;br /&gt;
În mod asemănător lucrează și operatorul &amp;#039;&amp;#039;&amp;#039;SAU ( || )&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5, b = 10;&lt;br /&gt;
    if(++a || ++b) {&lt;br /&gt;
         printf(&amp;quot;%d  %d&amp;quot;, a, b);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
         printf(&amp;quot;Wayne Rooney&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alternative la if-else ==&lt;br /&gt;
&lt;br /&gt;
=== Operatorul condițional (  ?  :  ) === &lt;br /&gt;
Singurul operator ternar din C, operatorul condițional funcționează asemenea unui if cu o singură ramură de tip else if. Sintaxa operatorului condițional este următoarea: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
(conditie) ? (expresie1) : (expresie2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aşadar, blocul decizional&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; b)&lt;br /&gt;
	printf (&amp;quot;a este mai mare decat b&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
	printf (&amp;quot;a este mai mic sau egal cu b&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
poate fi înlocuit astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(a &amp;gt; b ? &amp;quot;a este mai mare decat b&amp;quot; : &amp;quot;a este mai mic sau egal cu b&amp;quot;);&lt;br /&gt;
//sau&lt;br /&gt;
(a &amp;gt; b) ? ( printf (&amp;quot;a este mai mare decat b&amp;quot;)) : ( printf (&amp;quot;a este mai mic sau egal cu b&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Deși prima variantă este cea recunoscută ca fiind corectă, remarcăm că și a două variantă se comportă la fel ca prima. Asta se datorează modului în care funcționează operatorul condițional: el cere ca ambele expresii, &amp;#039;&amp;#039;expresie1&amp;#039;&amp;#039; și &amp;#039;&amp;#039;expresie2&amp;#039;&amp;#039;, să întoarcă &amp;quot;valori&amp;quot;. A doua variantă funcționează deoarece funcția &amp;#039;&amp;#039;printf()&amp;#039;&amp;#039; întoarce întotdeauna o [http://www.tutorialspoint.com/c_standard_library/c_function_printf.htm valoare].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structura decizională switch-case === &lt;br /&gt;
Această instrucțiune de decizie este similară unui if cu mai multe ramuri de tip else-if. Sintaxa este următoarea: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
switch (variabilaTestata)	{&lt;br /&gt;
	case valoare1:	 instructiune1;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
	case valoare2:	 instructiune2;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
	case valoare3:	 instructiune3;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
.........................................................................&lt;br /&gt;
	default:		instructiune;&lt;br /&gt;
				&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Valorile &amp;#039;&amp;#039;valoare1&amp;#039;&amp;#039;, &amp;#039;&amp;#039;valoare2&amp;#039;&amp;#039; etc. sunt proprii tipului de dată întreg, la fel ca &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039;. Ne reamintim însă că întreg nu înseamnă doar variabile de tip &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039;, astfel că &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; poate fi de tip &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; instrucțiunea &amp;#039;&amp;#039;break&amp;#039;&amp;#039; este opțională. Modul  care  switch-case funcționează este următorul: &lt;br /&gt;
&amp;lt;ol type=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;i&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; structura switch-case se încheie și se sare pe linia urmatoare întregului bloc decizional;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă nu există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; execuția se continuă până se întalnește un &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; sau până când se încheie structura switch-case. Până la acel moment se vor executa toate instrucțiunile întâlnite pe parcurs (&amp;#039;&amp;#039;instructiune2, instructiune3&amp;#039;&amp;#039; etc.);&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; nu este egală cu niciuna dintre valorile &amp;#039;&amp;#039;valoare1, valoare2&amp;#039;&amp;#039; etc atunci se execută &amp;#039;&amp;#039;instructiune&amp;#039;&amp;#039;, asociată etichetei default.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica echivalența dintre if-else și switch-case, rezolvați folosind ambele structuri decizionale următoarea problemă:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Un microbist vrea să afle situația Grupei F de calificare la EURO2016. Astfel, el va introduce o cifră pentru a vedea ce &amp;quot;națională&amp;quot; ocupă acel loc. Folosind următoarea listă, informați-l corect pe suporter.  &lt;br /&gt;
&lt;br /&gt;
1.	Irlanda de Nord&lt;br /&gt;
2.	România&lt;br /&gt;
3.	Ungaria&lt;br /&gt;
4.	Finlanda&lt;br /&gt;
5.	Insulele Feroe&lt;br /&gt;
6.	Grecia&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    int a=100;&lt;br /&gt;
    if(a&amp;gt;10) {&lt;br /&gt;
         printf(&amp;quot;Tiberiu Soare &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if(a&amp;gt;20) {&lt;br /&gt;
         printf(&amp;quot;Horia Andreescu &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if(a&amp;gt;30) {&lt;br /&gt;
           printf(&amp;quot;Iosif Ion Prunner &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Ştiind că un student primește 350 lei/lună dacă are media cel puțin 8.50, 450 lei/lună pentru o medie mai mare sau egală cu 9.50 și 600 lei/lună dacă are media cel puțin 9.70, scrieți un program prin care studentul să afle ce bursă urmează să primească (media va fi citită de la tastatură). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    int m=5,n=10,q=20;&lt;br /&gt;
    if(q/n*m)&lt;br /&gt;
         printf(&amp;quot;Bill Gates &amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
         printf(&amp;quot;Amancio Ortega &amp;quot;);&lt;br /&gt;
         printf(&amp;quot;Carlos Slim Helu &amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți un program care citește de la tastatură notele unui elev la limba română, matematică și informatică și afișează dacă elevul a promovat sau nu bacalaureatul. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie a și b două numere întregi citite de la tastatură. Scrieți un algoritm care să verifice dacă a si b sunt numere consecutive.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citesc de la tastatură 3 numere reprezentând lungimea cele 3 laturi ale unui triunghi. Să se afișeze dacă triunghiul este dreptunghic.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citește de la tastatură un număr întreg fără semn de 8 biți. Să se afișeze dacă numărul este sau nu un palindrom (dacă are aceeași valoare citit și de la stânga la dreapta si de la dreapta la stanga; de exemplu 101, sau 242).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=4867</id>
		<title>PC Laborator 5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=4867"/>
		<updated>2016-11-01T12:33:11Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Operația cu operatori logici (&amp;amp;&amp;amp;, ||, !) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
* 	 înțeleagă cum funcționează o structură decizională; &lt;br /&gt;
* 	 scrie programe în C folosind construcții decizionale. &lt;br /&gt;
  &lt;br /&gt;
== Structura decizională == &lt;br /&gt;
  &lt;br /&gt;
Se întâmplă adesea ca evoluția unui program să depindă de o anumită condiție. Ea poate lua însă diverse forme, rolul programatorului fiind să conducă execuția programului pe calea corectă, ținând cont de acea condiție logică. Apare astfel structura decizionala if, care ramifică evoluția programului în funcție de valoarea de adevăr  a condiției testate.  &lt;br /&gt;
  &lt;br /&gt;
=== 	 Schema logică === &lt;br /&gt;
Prima etapă din parcurgerea unei structuri decizionale de tipul if-else o reprezintă testarea condiției logice. în cazul în care aceasta este evaluată ca adevărată se execută instructiunea1, cea asociată ramurii if. în cazul în care condiția logică este evaluată ca falsă se execută instructiunea2, cea asociată ramurii else. După executarea instrucțiunii asociate, structura if-else se încheie și programul se continuă cu linia următoare blocului decizional.&lt;br /&gt;
 &lt;br /&gt;
[[Fișier:structura_decizionala.png]]&lt;br /&gt;
&lt;br /&gt;
=== Sintaxă generală ===&lt;br /&gt;
a)	&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie) instructiune;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
b)&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie) {&lt;br /&gt;
	 instructiune1;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	 instructiune2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
c)	&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (conditie1) {&lt;br /&gt;
	instructiune 1;&lt;br /&gt;
}&lt;br /&gt;
else if (conditie2) {&lt;br /&gt;
	instructiune 2;&lt;br /&gt;
}&lt;br /&gt;
else if (conditie 3) {&lt;br /&gt;
	instructiune3;&lt;br /&gt;
}&lt;br /&gt;
................................&lt;br /&gt;
else {&lt;br /&gt;
	instructiune;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asocierea ramurilor if-else===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; în cazul în care un if are mai multe ramuri, un else se asociază celui mai apropiat if.&amp;lt;/div&amp;gt; &lt;br /&gt;
Această observație ne conduce la următoarele două cazuri: &lt;br /&gt;
  &lt;br /&gt;
* 	 dacă nu există blocuri de instrucțiuni, un else este legat de if-ul imediat anterior; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; 5) &lt;br /&gt;
    if (b &amp;gt; a) &lt;br /&gt;
	printf (&amp;quot;b este mai mare ca a&amp;quot;);&lt;br /&gt;
    else &lt;br /&gt;
	printf (&amp;quot;b este mai mic sau egal cu a&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*	dacă există blocuri de instrucțiuni, un else este legat de ultimul if fără pereche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a &amp;gt; 5) {&lt;br /&gt;
	if (b &amp;gt; a)&lt;br /&gt;
	      	printf (&amp;quot;b este mai mare ca a&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
else &lt;br /&gt;
    printf (&amp;quot;a nu este mai mare ca 5&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ce va afișa acest program prost indentat? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int number = 4; &lt;br /&gt;
double alpha = -1.0; &lt;br /&gt;
if (number &amp;gt; 0) &lt;br /&gt;
	if (alpha &amp;gt; 0)&lt;br /&gt;
		printf( &amp;quot;Here I am!\n&amp;quot;);&lt;br /&gt;
else &lt;br /&gt;
	printf( &amp;quot;No, I’m here!\n&amp;quot;); &lt;br /&gt;
printf(&amp;quot;No, actually, I’m here!\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Evaluarea expresiilor logice == &lt;br /&gt;
  &lt;br /&gt;
Am stabilit deja că o condiție logică, prin valoarea ei de adevăr, ramifică evoluția programului. &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Adevărat în C înseamnă orice rezultat diferit de 0 (nul) al unei evaluări, în timp ce despre fals vorbim când o expresie este evaluată la 0 (nul). &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
În C, condiția  poate avea mai multe reprezentări, după cum urmează &lt;br /&gt;
  &lt;br /&gt;
=== Operandul === &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Verificați că un număr citit de la tastatură poate fi numitorul unei fracții.&lt;br /&gt;
&lt;br /&gt;
=== Operația cu operatori relaționali (==, !=, &amp;lt;=, &amp;lt;, &amp;gt;, &amp;gt;=) === &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Asociați o valoare variabilei cost în funcție de valoarea variabilei distance după cum urmează: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; |distance&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; |cost&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Intre 0 si 100&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 5.50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | Peste 100, dar mai putin de 500&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8.00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Peste 500, dar nu mai mult de 1000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 10.50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1000 sau mai mult&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 13.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Operația cu operatori logici (&amp;amp;&amp;amp;, ||, !) === &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Folosind operatori logici, aduceți următoarea structură decizională la forma cea mai simplă: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (doesSignificantWork) { &lt;br /&gt;
	if (makesBreakthrough) &lt;br /&gt;
		nobelPrizeCandidate = true; &lt;br /&gt;
	else&lt;br /&gt;
		 nobelPrizeCandidate = false; &lt;br /&gt;
} &lt;br /&gt;
else if (!doesSignificantWork) {&lt;br /&gt;
	nobelPrizeCandidate = false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;bool&amp;#039;&amp;#039;&amp;#039;, ca și valorile &amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;false&amp;#039;&amp;#039;&amp;#039;, au fost introduse în standardul C99, deci dacă doriți să-l folosiți codul trebuie compilat cu &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;--std=c99&amp;lt;/code&amp;gt; ca argument al compilatorului (gcc).&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a putea lucra cu operatorii logici, este necesar să ne reamintim modul în care aceștia operează. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Tabelul operatorilor logici&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | a&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | b&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | !a&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | a &amp;amp;&amp;amp; b&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | a ll b&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 1 &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot;  | 1&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; În tabel remarcăm că operatorul logic &amp;#039;&amp;#039;&amp;#039;SI ( &amp;amp;&amp;amp; )&amp;#039;&amp;#039;&amp;#039; întoarce 1 dacă și numai dacă ambele expresii, &amp;#039;&amp;#039;a&amp;#039;&amp;#039; și &amp;#039;&amp;#039;b&amp;#039;&amp;#039; în cazul nostru, întorc o valoare nenulă. în orice alt caz, operatorul &amp;#039;&amp;#039;&amp;#039;SI&amp;#039;&amp;#039;&amp;#039; întoarce 0. Așadar, pentru a optimiza timpul de execuție a programului, expresia a doua, &amp;#039;&amp;#039;b&amp;#039;&amp;#039; în cazul nostru, va fi evaluată dacă și numai dacă prima expresie, &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, a întors o valoare nenulă. &lt;br /&gt;
În mod asemănător lucrează și operatorul &amp;#039;&amp;#039;&amp;#039;SAU ( || )&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5, b = 10;&lt;br /&gt;
    if(++a || ++b) {&lt;br /&gt;
         printf(&amp;quot;%d  %d&amp;quot;, a, b);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
         printf(&amp;quot;Wayne Rooney&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alternative la if-else ==&lt;br /&gt;
&lt;br /&gt;
=== Operatorul condițional (  ?  :  ) === &lt;br /&gt;
Singurul operator ternar din C, operatorul condițional funcționează asemenea unui if cu o singură ramură de tip else if. Sintaxa operatorului condițional este următoarea: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
(conditie) ? (expresie1) : (expresie2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aşadar, blocul decizional&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
if (a&amp;gt;b)&lt;br /&gt;
	printf (&amp;quot;a este mai mare decat b&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
	printf (&amp;quot;a este mai mic sau egal cu b&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
poate fi înlocuit astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(a &amp;gt; b ? &amp;quot;a este mai mare decat b&amp;quot; : &amp;quot;a este mai mic sau egal cu b&amp;quot;);&lt;br /&gt;
//sau&lt;br /&gt;
(a&amp;gt;b) ? ( printf (&amp;quot;a este mai mare decat b&amp;quot;)) : ( printf (&amp;quot;a este mai mic sau egal cu b&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Deși prima variantă este cea recunoscută ca fiind corectă, remarcăm că și a două variantă se comportă la fel ca prima. Asta se datorează modului în care funcționează operatorul condițional: el cere ca ambele expresii, &amp;#039;&amp;#039;expresie1&amp;#039;&amp;#039; și &amp;#039;&amp;#039;expresie2&amp;#039;&amp;#039;, să întoarcă &amp;quot;valori&amp;quot;. A doua variantă funcționează deoarece funcția &amp;#039;&amp;#039;printf()&amp;#039;&amp;#039; întoarce întotdeauna o [http://www.tutorialspoint.com/c_standard_library/c_function_printf.htm valoare].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structura decizională switch-case === &lt;br /&gt;
Această instrucțiune de decizie este similară unui if cu mai multe ramuri de tip else-if. Sintaxa este următoarea: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
switch (variabilaTestata)	{&lt;br /&gt;
	case valoare1:	 instructiune1;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
	case valoare2:	 instructiune2;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
	case valoare3:	 instructiune3;&lt;br /&gt;
				 [break;]&lt;br /&gt;
				&lt;br /&gt;
.........................................................................&lt;br /&gt;
	default:		instructiune;&lt;br /&gt;
				&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Valorile &amp;#039;&amp;#039;valoare1&amp;#039;&amp;#039;, &amp;#039;&amp;#039;valoare2&amp;#039;&amp;#039; etc. sunt proprii tipului de dată întreg, la fel ca &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039;. Ne reamintim însă că întreg nu înseamnă doar variabile de tip &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039;, astfel că &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; poate fi de tip &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; instrucțiunea &amp;#039;&amp;#039;break&amp;#039;&amp;#039; este opțională. Modul  care  switch-case funcționează este următorul: &lt;br /&gt;
&amp;lt;ol type=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;i&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; structura switch-case se încheie și se sare pe linia urmatoare întregului bloc decizional;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă nu există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; execuția se continuă până se întalnește un &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; sau până când se încheie structura switch-case. Până la acel moment se vor executa toate instrucțiunile întâlnite pe parcurs (&amp;#039;&amp;#039;instructiune2, instructiune3&amp;#039;&amp;#039; etc.);&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dacă valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; nu este egală cu niciuna dintre valorile &amp;#039;&amp;#039;valoare1, valoare2&amp;#039;&amp;#039; etc atunci se execută &amp;#039;&amp;#039;instructiune&amp;#039;&amp;#039;, asociată etichetei default.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica echivalența dintre if-else și switch-case, rezolvați folosind ambele structuri decizionale următoarea problemă:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Un microbist vrea să afle situația Grupei F de calificare la EURO2016. Astfel, el va introduce o cifră pentru a vedea ce &amp;quot;națională&amp;quot; ocupă acel loc. Folosind următoarea listă, informați-l corect pe suporter.  &lt;br /&gt;
&lt;br /&gt;
1.	Irlanda de Nord&lt;br /&gt;
2.	România&lt;br /&gt;
3.	Ungaria&lt;br /&gt;
4.	Finlanda&lt;br /&gt;
5.	Insulele Feroe&lt;br /&gt;
6.	Grecia&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    int a=100;&lt;br /&gt;
    if(a&amp;gt;10) {&lt;br /&gt;
         printf(&amp;quot;Tiberiu Soare &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if(a&amp;gt;20) {&lt;br /&gt;
         printf(&amp;quot;Horia Andreescu &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if(a&amp;gt;30) {&lt;br /&gt;
           printf(&amp;quot;Iosif Ion Prunner &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Ştiind că un student primește 350 lei/lună dacă are media cel puțin 8.50, 450 lei/lună pentru o medie mai mare sau egală cu 9.50 și 600 lei/lună dacă are media cel puțin 9.70, scrieți un program prin care studentul să afle ce bursă urmează să primească (media va fi citită de la tastatură). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    int m=5,n=10,q=20;&lt;br /&gt;
    if(q/n*m)&lt;br /&gt;
         printf(&amp;quot;Bill Gates &amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
         printf(&amp;quot;Amancio Ortega &amp;quot;);&lt;br /&gt;
         printf(&amp;quot;Carlos Slim Helu &amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Scrieți un program care citește de la tastatură notele unui elev la limba română, matematică și informatică și afișează dacă elevul a promovat sau nu bacalaureatul. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie a și b două numere întregi citite de la tastatură. Scrieți un algoritm care să verifice dacă a si b sunt numere consecutive.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citesc de la tastatură 3 numere reprezentând lungimea cele 3 laturi ale unui triunghi. Să se afișeze dacă triunghiul este dreptunghic.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Se citește de la tastatură un număr întreg fără semn de 8 biți. Să se afișeze dacă numărul este sau nu un palindrom (dacă are aceeași valoare citit și de la stânga la dreapta si de la dreapta la stanga; de exemplu 101, sau 242).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_4&amp;diff=4839</id>
		<title>PC Laborator 4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_4&amp;diff=4839"/>
		<updated>2016-10-26T15:33:39Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Tipuri de date */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Familiarizarea cu noțiunile de bază ale limbajului C: tipuri de date, operatori, dar și folosirea corectă a acestora.&lt;br /&gt;
&lt;br /&gt;
== Tipuri de date ==&lt;br /&gt;
&lt;br /&gt;
Tipurile de date fundamentale ale limbajului C sunt: caractere (char), întregi (int), numere reale&lt;br /&gt;
reprezentate în virgulă mobilă cu simplă precizie (float), numere reale reprezentate în virgulă mobilă&lt;br /&gt;
cu dublă precizie (double).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Tipuri fundamentale&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Tip&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Număr de biți&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Domeniu&lt;br /&gt;
|-&lt;br /&gt;
| char&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -128 ... +127&lt;br /&gt;
|-&lt;br /&gt;
| int&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | min. 16&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -32,768 ... +32,767 &lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 32&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Precizie 6 zecimale&lt;br /&gt;
|-&lt;br /&gt;
| double&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 64&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Precizie 10 zecimale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Tipurile fundamentale pot fi precedate de diferiţi modificatori. Un &amp;#039;&amp;#039;&amp;#039;modificator&amp;#039;&amp;#039;&amp;#039; se utilizează pentru a adapta cât mai convenabil tipul de bază la situație.&lt;br /&gt;
&lt;br /&gt;
=== Tipuri reale(float,double) și virgulă mobilă ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Principalul dezavantaj al reprezentării în virgulă fixă este faptul că, dacă un număr nu mai încape în spaţiul de biţi rezervat, se pierd cifrele cele mai semnificative.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un număr este reprezentat în virgulă mobilă printr-un cuvant de n biți conținând semn, mantisă și exponent sub următoarea formă:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Mantisa.jpg]]&lt;br /&gt;
&lt;br /&gt;
Unde s este bitul de semn al numarului, cu aceeași convenție ca pentru numere in virgulă fixa(s=0 numar pozitiv si s=1 numar negativ),&lt;br /&gt;
m este mantisa numarului, reprezentând cifrele semnificative, iar e este exponentul (puterea la care trebuie ridicata o valoare)&lt;br /&gt;
&lt;br /&gt;
Valoarea numarului real reprezentat in virgula mobila este data de expresia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; valoare=(-1)^s*m*(baza)^e &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Mantisa trebuie să îndeplinească condiția: 1 &amp;gt; m &amp;gt;= 1/baza &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modificatori ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;signed&amp;#039;&amp;#039;&amp;#039; (implicit) - tip de dată cu semn, utilizabil excusiv pentru numere întregi, face ca intervalul de definiție să fie între [-2&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;:2&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;-1]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned&amp;#039;&amp;#039;&amp;#039; - tip de dată fără semn, utilizabil excusiv pentru numere întregi, face ca intervalul de definiție să fie între [0:2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;-1]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;long&amp;#039;&amp;#039;&amp;#039; - de obicei, dublează domeniul de definiție a unui tip de dată; de exemplu un &amp;#039;&amp;#039;&amp;#039;long int&amp;#039;&amp;#039;&amp;#039; va avea 64 de biți în loc de 32; este aplicabil doar pentru &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;float&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;short&amp;#039;&amp;#039;&amp;#039; - de obicei, înjumătățește domeniul de definiție pentru &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039;, adică rezultatul este un tip de dată pe 16 biți.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Folosirea modificatorilor&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Tip&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Număr de biți&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Domeniu&lt;br /&gt;
|-&lt;br /&gt;
| unsigned char&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 ... 255&lt;br /&gt;
|-&lt;br /&gt;
| unsigned long int&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 64&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 .. 18,446,744,073,709,551,615 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Diferenţa dintre întregii signed şi unsigned constă în interpretarea diferită a bitului semnificativ (adică cel mai din stânga). &lt;br /&gt;
 Pentru un întreg signed, se va considera bitul semnificativ ca fiind bit de semn. &lt;br /&gt;
 Dacă acest bit este 0 atunci numărul este pozitiv iar dacă este 1 atunci este negativ.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Bit-ul reprezintă cea mai mică unitate de informaţie dintr-un calculator. Denumirea de bit provine de la „binary digit” adică număr binar. Sistemul binar este un sistem de numeraţie unde totul se reprezintă doar cu 1 şi 0.&lt;br /&gt;
Simbolul pentru un bit este &amp;quot;b&amp;quot;,a nu se confunda cu byte &amp;quot;B&amp;quot; care reprezintă o grupare de 8 biți.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipuri de date de dimensiune fixă în standardul C99 ==&lt;br /&gt;
&lt;br /&gt;
Deoarece există situații când numărul de biți pentru un anumit tip de dată este extrem de important, iar acest număr diferă între procesoare și compilatoare, standardul C99 a introdus următoarele tipuri de date, de dimensiune fixă, care se găsesc în header-ul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;stdint.h&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Tipuri de dimensiune fixă&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Tip&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Numar de biti&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Domeniu&lt;br /&gt;
|-&lt;br /&gt;
| int8_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -128 .. +127&lt;br /&gt;
|-&lt;br /&gt;
| uint8_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 .. 255&lt;br /&gt;
|-&lt;br /&gt;
| int16_t&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 16&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -32,768 ... +32,767&lt;br /&gt;
|-&lt;br /&gt;
| uint16_t&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 16&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 ... +65,535 &lt;br /&gt;
|-&lt;br /&gt;
| int32_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 32&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -2,147,483,648 .. 2,147,483,647&lt;br /&gt;
|-&lt;br /&gt;
| uint32_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 32&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 .. 4,294,967,295&lt;br /&gt;
|-&lt;br /&gt;
| int64_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 64&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807&lt;br /&gt;
|-&lt;br /&gt;
| uint64_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 64&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 .. 18,446,744,073,709,551,615&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Recomandare:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Utilizați tipurile de date de dimensiune fixă pentru valorile numerice întregi, tipul de date &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039; pentru a stoca un caracter și tipurile &amp;#039;&amp;#039;&amp;#039;float&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;double&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;long double&amp;#039;&amp;#039;&amp;#039; pentru valorile numerice fracționare.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operatori ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Operatorii aritmetici&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* +  adunarea &lt;br /&gt;
* -  scăderea &lt;br /&gt;
* *  înmulţirea &lt;br /&gt;
* /  împărţirea (rezultatul împărţirii pentru numere reale, câtul împărţirii pentru numere întregi)&lt;br /&gt;
* %  modulo (restul împărţirii a două numere întregi)&lt;br /&gt;
* ++ incrementarea (mărirea unei valori cu o unitate)&lt;br /&gt;
* -- decrementarea (micşorarea unei valori cu o unitate)&lt;br /&gt;
&lt;br /&gt;
Operatorii de incrementare/decrementare sunt folosiţi pentru creșterea/micşorarea unei valori cu o unitate.&lt;br /&gt;
 a++ / ++a - incrementare&lt;br /&gt;
 a-- / --a - decrementare&lt;br /&gt;
De asemenea se pot folosi instrucțiuni de pre sau post incrementare/decrementare.&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;POST-incrementare: x = a++;&amp;#039;&amp;#039;&amp;#039; &amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
x = a; &lt;br /&gt;
a = a + 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;PRE-incremenatare: x = ++a;&amp;#039;&amp;#039;&amp;#039; &amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
a = a + 1;&lt;br /&gt;
x = a;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Operatori relaţionali şi logici&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;gt; - mai mare&lt;br /&gt;
* &amp;gt;= -mai mare egal&lt;br /&gt;
* &amp;lt;  -mai mic&lt;br /&gt;
* &amp;lt;= -mai mic egal&lt;br /&gt;
* ==  -egal&lt;br /&gt;
* != -diferit&lt;br /&gt;
* &amp;amp;&amp;amp; -si&lt;br /&gt;
* || -sau&lt;br /&gt;
* !  -negare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemplu operatori relaționari și logici===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
int main(){&lt;br /&gt;
    int a = 2, b = 6, c = 0, result;&lt;br /&gt;
 &lt;br /&gt;
    result = !(a &amp;lt; c) &amp;amp;&amp;amp; (a &amp;lt; b) || (b &amp;lt;=c);&lt;br /&gt;
 &lt;br /&gt;
    printf(&amp;quot;result is %d\n&amp;quot;, result);&lt;br /&gt;
    return 0;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In exemplul de mai sus tineti cont de [http://www.robotics.ucv.ro/flexform/aplicatii/m1/Ion%20Petre%20-%20Utilizarea%20interfetei%20seriale/Cpp/precedenta-oper.html precedenta operatorilor].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Operatori la nivel de bit&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Avem şase operatori la nivel de bit,aceștia se aplică tipurilor char,int,long signed/unsigned,iar rezultatul este un întreg.&lt;br /&gt;
Operatorii la nivel de bit sunt următorii.&lt;br /&gt;
* &amp;amp; - AND (şi logic)&lt;br /&gt;
* | - OR (sau logic)&lt;br /&gt;
* ^ - XOR (sau exclusiv)&lt;br /&gt;
* &amp;lt;&amp;lt; - deplasare la stânga&lt;br /&gt;
* &amp;gt;&amp;gt; - deplasare la dreapta&lt;br /&gt;
* ~ - negare la nivel de bit&lt;br /&gt;
&lt;br /&gt;
==== Tabele de adevăr ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operator !! Tabel de adevăr !! Operator !! Tabel de adevăr !! Operator !! Tabel de adevăr&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;AND&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A AND B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;OR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A OR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;XOR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A XOR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Exemplu operator AND ===&lt;br /&gt;
Dorim să aflăm valoarea bitului de pe poziția 2 a numarului 20.Pentru a afla valorea acestui bit se poate realiza operația AND (&amp;amp;) între numărul dorit și un alt număr binar care are doar pe poziția dorită valoarea 1 (în cazul nostru poziția 2),astfel dacă rezultatul este diferit de 0 atunci inițial am avut bitul 1, respectiv 0 dacă bitul a fost 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
int main(){&lt;br /&gt;
   int a=20;  /*  1 0 1 0 0 */&lt;br /&gt;
   int b=4;   /*  0 0 1 0 0 */&lt;br /&gt;
 &lt;br /&gt;
    if(a &amp;amp; b){/*  0 0 1 0 0*/&lt;br /&gt;
        printf(&amp;quot;Rezultatul este diferit de 0\n&amp;quot;);&lt;br /&gt;
    }else{&lt;br /&gt;
        printf(&amp;quot;Rezultatul are valoarea 0\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu operator de deplasare &amp;lt;&amp;lt; ===&lt;br /&gt;
Operatorii de deplasare (&amp;lt;&amp;lt; şi &amp;gt;&amp;gt;) realizează deplasarea biţilor din operandul stâng cu atâtea&lt;br /&gt;
poziţii câte sunt indicate de operandul drept.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int a = 255;  /* 0000 0000 1111 1111*/&lt;br /&gt;
a = a &amp;lt;&amp;lt; 3;   /* 0000 0111 1111 1000*/ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Deplasarea la stânga (&amp;lt;&amp;lt;) completează la dreapta cu 0, deci biţii din stânga se vor pierde.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu operator de negare ~ ===&lt;br /&gt;
Operatorul de negare realizează complementarea biților,biții de 0 se pun 1, iar biții de 1 se pun 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int a = 2200;  /* 1000 1001 1000*/&lt;br /&gt;
a = ~a;        /* 0110 0110 0111*/ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Scrieți un program care să citească un număr în virgulă mobilă de la tastatură și să se afișeze, pe linii diferite, în hexazecimal, semnul, mantisa și exponentul. Notă: pentru a putea efectua operații pe biți, operanzii trebuie să fie de tip întreg. Astfel, pentru a interpreta un număr în virgulă mobilă ca secvență de biți, variabila trebuie sa fie de tip int, iar citirea să se facă cu template-ul &amp;quot;%f&amp;quot;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Scrieți un program care să citească de la tastatură un număr întreg fără semn pe 8 biți (în bază 10) și să-l afișeze pe ecran în baza doi, folosind operatori de shiftare și mascare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Citiți de la tastatură un număr întreg cu semn, pe 32 de biți, apoi negați-l aritmetic și afișați valoarea, fără să folosiți operatorului unar &amp;quot;-&amp;quot; (folosind regulile convenției complement față de 2).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Scrieți un program care să citească un număr întreg pozitiv pe 8 biți de la tastatură, să numere și să afișeze câți biți de 1 și câți biți 0 are reprezentarea lui binară.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Citiți de la tastatură un număr întreg n, calculați și afișați suma numerelor de la 0 la n.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Citiți o valoare de temperatură în grade Celsius, și afișați pe ecran valoarea acelei temperaturi în Kelvin și grade Fahrenheit. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Fie o matrice de 8 linii și 10 coloane, cu elementele numerotate de la 0 (elementul din stânga sus) la 79 (elementul din dreapta jos):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  0  1  2  3  4  5  6  7  8  9&lt;br /&gt;
 10 11 12 13 14 15 16 17 18 19&lt;br /&gt;
 ...&lt;br /&gt;
 70 71 72 73 74 75 76 77 78 79&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dându-se de la tastatură un index n între 0 si 79, să se afișeze pe ce linie și pe ce coloană este indexul respectiv.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Dându-se un număr întreg de la tastatură, să se afișeze 0 dacă numărul este impar și 1 dacă este par.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Dându-se un număr întreg de la tastatură, să se afișeze restul împărțirii numărului la 16, folosind doar operații pe biți.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;dificil&amp;lt;/code&amp;gt; Folosind doar operații pe biți (fără construcții condiționale), să se calculeze modulul unui număr întreg pe 32 de biți, introdus de la tastatură.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_4&amp;diff=4838</id>
		<title>PC Laborator 4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_4&amp;diff=4838"/>
		<updated>2016-10-26T15:31:31Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Tipuri de date de dimensiune fixă în standardul C99 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Familiarizarea cu noțiunile de bază ale limbajului C: tipuri de date, operatori, dar și folosirea corectă a acestora.&lt;br /&gt;
&lt;br /&gt;
== Tipuri de date ==&lt;br /&gt;
&lt;br /&gt;
Tipurile de date fundamentale ale limbajului C sunt: caractere (char), întregi (int), numere reale&lt;br /&gt;
reprezentate în virgulă mobilă cu simplă precizie (float), numere reale reprezentate în virgulă mobilă&lt;br /&gt;
cu dublă precizie (double).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Tipuri fundamentale&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Tip&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Număr de biți&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Domeniu&lt;br /&gt;
|-&lt;br /&gt;
| char&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -128 ... +127&lt;br /&gt;
|-&lt;br /&gt;
| int&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 16&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -32,768 ... +32,767 &lt;br /&gt;
|-&lt;br /&gt;
| float&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 32&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Precizie 6 zecimale&lt;br /&gt;
|-&lt;br /&gt;
| double&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 64&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Precizie 10 zecimale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Tipurile fundamentale pot fi precedate de diferiţi modificatori. Un &amp;#039;&amp;#039;&amp;#039;modificator&amp;#039;&amp;#039;&amp;#039; se utilizează pentru a adapta cât mai convenabil tipul de bază la situație.&lt;br /&gt;
&lt;br /&gt;
=== Tipuri reale(float,double) și virgulă mobilă ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Principalul dezavantaj al reprezentării în virgulă fixă este faptul că, dacă un număr nu mai încape în spaţiul de biţi rezervat, se pierd cifrele cele mai semnificative.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un număr este reprezentat în virgulă mobilă printr-un cuvant de n biți conținând semn, mantisă și exponent sub următoarea formă:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Mantisa.jpg]]&lt;br /&gt;
&lt;br /&gt;
Unde s este bitul de semn al numarului, cu aceeași convenție ca pentru numere in virgulă fixa(s=0 numar pozitiv si s=1 numar negativ),&lt;br /&gt;
m este mantisa numarului, reprezentând cifrele semnificative, iar e este exponentul (puterea la care trebuie ridicata o valoare)&lt;br /&gt;
&lt;br /&gt;
Valoarea numarului real reprezentat in virgula mobila este data de expresia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; valoare=(-1)^s*m*(baza)^e &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Mantisa trebuie să îndeplinească condiția: 1 &amp;gt; m &amp;gt;= 1/baza &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modificatori ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;signed&amp;#039;&amp;#039;&amp;#039; (implicit) - tip de dată cu semn, utilizabil excusiv pentru numere întregi, face ca intervalul de definiție să fie între [-2&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;:2&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;-1]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned&amp;#039;&amp;#039;&amp;#039; - tip de dată fără semn, utilizabil excusiv pentru numere întregi, face ca intervalul de definiție să fie între [0:2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;-1]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;long&amp;#039;&amp;#039;&amp;#039; - de obicei, dublează domeniul de definiție a unui tip de dată; de exemplu un &amp;#039;&amp;#039;&amp;#039;long int&amp;#039;&amp;#039;&amp;#039; va avea 64 de biți în loc de 32; este aplicabil doar pentru &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;float&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;short&amp;#039;&amp;#039;&amp;#039; - de obicei, înjumătățește domeniul de definiție pentru &amp;#039;&amp;#039;&amp;#039;int&amp;#039;&amp;#039;&amp;#039;, adică rezultatul este un tip de dată pe 16 biți.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Folosirea modificatorilor&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Tip&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Număr de biți&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Domeniu&lt;br /&gt;
|-&lt;br /&gt;
| unsigned char&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 ... 255&lt;br /&gt;
|-&lt;br /&gt;
| unsigned long int&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 64&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 .. 18,446,744,073,709,551,615 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Diferenţa dintre întregii signed şi unsigned constă în interpretarea diferită a bitului semnificativ (adică cel mai din stânga). &lt;br /&gt;
 Pentru un întreg signed, se va considera bitul semnificativ ca fiind bit de semn. &lt;br /&gt;
 Dacă acest bit este 0 atunci numărul este pozitiv iar dacă este 1 atunci este negativ.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Bit-ul reprezintă cea mai mică unitate de informaţie dintr-un calculator. Denumirea de bit provine de la „binary digit” adică număr binar. Sistemul binar este un sistem de numeraţie unde totul se reprezintă doar cu 1 şi 0.&lt;br /&gt;
Simbolul pentru un bit este &amp;quot;b&amp;quot;,a nu se confunda cu byte &amp;quot;B&amp;quot; care reprezintă o grupare de 8 biți.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipuri de date de dimensiune fixă în standardul C99 ==&lt;br /&gt;
&lt;br /&gt;
Deoarece există situații când numărul de biți pentru un anumit tip de dată este extrem de important, iar acest număr diferă între procesoare și compilatoare, standardul C99 a introdus următoarele tipuri de date, de dimensiune fixă, care se găsesc în header-ul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;stdint.h&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Tipuri de dimensiune fixă&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Tip&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Numar de biti&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Domeniu&lt;br /&gt;
|-&lt;br /&gt;
| int8_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -128 .. +127&lt;br /&gt;
|-&lt;br /&gt;
| uint8_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 .. 255&lt;br /&gt;
|-&lt;br /&gt;
| int16_t&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 16&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -32,768 ... +32,767&lt;br /&gt;
|-&lt;br /&gt;
| uint16_t&lt;br /&gt;
| style=&amp;quot;text-align: center&amp;quot; | 16&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 ... +65,535 &lt;br /&gt;
|-&lt;br /&gt;
| int32_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 32&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -2,147,483,648 .. 2,147,483,647&lt;br /&gt;
|-&lt;br /&gt;
| uint32_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 32&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 .. 4,294,967,295&lt;br /&gt;
|-&lt;br /&gt;
| int64_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 64&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | -9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807&lt;br /&gt;
|-&lt;br /&gt;
| uint64_t&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 64&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 .. 18,446,744,073,709,551,615&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Recomandare:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Utilizați tipurile de date de dimensiune fixă pentru valorile numerice întregi, tipul de date &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039; pentru a stoca un caracter și tipurile &amp;#039;&amp;#039;&amp;#039;float&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;double&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;long double&amp;#039;&amp;#039;&amp;#039; pentru valorile numerice fracționare.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operatori ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Operatorii aritmetici&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* +  adunarea &lt;br /&gt;
* -  scăderea &lt;br /&gt;
* *  înmulţirea &lt;br /&gt;
* /  împărţirea (rezultatul împărţirii pentru numere reale, câtul împărţirii pentru numere întregi)&lt;br /&gt;
* %  modulo (restul împărţirii a două numere întregi)&lt;br /&gt;
* ++ incrementarea (mărirea unei valori cu o unitate)&lt;br /&gt;
* -- decrementarea (micşorarea unei valori cu o unitate)&lt;br /&gt;
&lt;br /&gt;
Operatorii de incrementare/decrementare sunt folosiţi pentru creșterea/micşorarea unei valori cu o unitate.&lt;br /&gt;
 a++ / ++a - incrementare&lt;br /&gt;
 a-- / --a - decrementare&lt;br /&gt;
De asemenea se pot folosi instrucțiuni de pre sau post incrementare/decrementare.&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;POST-incrementare: x = a++;&amp;#039;&amp;#039;&amp;#039; &amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
x = a; &lt;br /&gt;
a = a + 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;PRE-incremenatare: x = ++a;&amp;#039;&amp;#039;&amp;#039; &amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
a = a + 1;&lt;br /&gt;
x = a;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Operatori relaţionali şi logici&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;gt; - mai mare&lt;br /&gt;
* &amp;gt;= -mai mare egal&lt;br /&gt;
* &amp;lt;  -mai mic&lt;br /&gt;
* &amp;lt;= -mai mic egal&lt;br /&gt;
* ==  -egal&lt;br /&gt;
* != -diferit&lt;br /&gt;
* &amp;amp;&amp;amp; -si&lt;br /&gt;
* || -sau&lt;br /&gt;
* !  -negare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemplu operatori relaționari și logici===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
int main(){&lt;br /&gt;
    int a = 2, b = 6, c = 0, result;&lt;br /&gt;
 &lt;br /&gt;
    result = !(a &amp;lt; c) &amp;amp;&amp;amp; (a &amp;lt; b) || (b &amp;lt;=c);&lt;br /&gt;
 &lt;br /&gt;
    printf(&amp;quot;result is %d\n&amp;quot;, result);&lt;br /&gt;
    return 0;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In exemplul de mai sus tineti cont de [http://www.robotics.ucv.ro/flexform/aplicatii/m1/Ion%20Petre%20-%20Utilizarea%20interfetei%20seriale/Cpp/precedenta-oper.html precedenta operatorilor].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Operatori la nivel de bit&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Avem şase operatori la nivel de bit,aceștia se aplică tipurilor char,int,long signed/unsigned,iar rezultatul este un întreg.&lt;br /&gt;
Operatorii la nivel de bit sunt următorii.&lt;br /&gt;
* &amp;amp; - AND (şi logic)&lt;br /&gt;
* | - OR (sau logic)&lt;br /&gt;
* ^ - XOR (sau exclusiv)&lt;br /&gt;
* &amp;lt;&amp;lt; - deplasare la stânga&lt;br /&gt;
* &amp;gt;&amp;gt; - deplasare la dreapta&lt;br /&gt;
* ~ - negare la nivel de bit&lt;br /&gt;
&lt;br /&gt;
==== Tabele de adevăr ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operator !! Tabel de adevăr !! Operator !! Tabel de adevăr !! Operator !! Tabel de adevăr&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;AND&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A AND B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;OR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A OR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;XOR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A XOR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Exemplu operator AND ===&lt;br /&gt;
Dorim să aflăm valoarea bitului de pe poziția 2 a numarului 20.Pentru a afla valorea acestui bit se poate realiza operația AND (&amp;amp;) între numărul dorit și un alt număr binar care are doar pe poziția dorită valoarea 1 (în cazul nostru poziția 2),astfel dacă rezultatul este diferit de 0 atunci inițial am avut bitul 1, respectiv 0 dacă bitul a fost 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
int main(){&lt;br /&gt;
   int a=20;  /*  1 0 1 0 0 */&lt;br /&gt;
   int b=4;   /*  0 0 1 0 0 */&lt;br /&gt;
 &lt;br /&gt;
    if(a &amp;amp; b){/*  0 0 1 0 0*/&lt;br /&gt;
        printf(&amp;quot;Rezultatul este diferit de 0\n&amp;quot;);&lt;br /&gt;
    }else{&lt;br /&gt;
        printf(&amp;quot;Rezultatul are valoarea 0\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu operator de deplasare &amp;lt;&amp;lt; ===&lt;br /&gt;
Operatorii de deplasare (&amp;lt;&amp;lt; şi &amp;gt;&amp;gt;) realizează deplasarea biţilor din operandul stâng cu atâtea&lt;br /&gt;
poziţii câte sunt indicate de operandul drept.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int a = 255;  /* 0000 0000 1111 1111*/&lt;br /&gt;
a = a &amp;lt;&amp;lt; 3;   /* 0000 0111 1111 1000*/ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Deplasarea la stânga (&amp;lt;&amp;lt;) completează la dreapta cu 0, deci biţii din stânga se vor pierde.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu operator de negare ~ ===&lt;br /&gt;
Operatorul de negare realizează complementarea biților,biții de 0 se pun 1, iar biții de 1 se pun 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int a = 2200;  /* 1000 1001 1000*/&lt;br /&gt;
a = ~a;        /* 0110 0110 0111*/ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Scrieți un program care să citească un număr în virgulă mobilă de la tastatură și să se afișeze, pe linii diferite, în hexazecimal, semnul, mantisa și exponentul. Notă: pentru a putea efectua operații pe biți, operanzii trebuie să fie de tip întreg. Astfel, pentru a interpreta un număr în virgulă mobilă ca secvență de biți, variabila trebuie sa fie de tip int, iar citirea să se facă cu template-ul &amp;quot;%f&amp;quot;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Scrieți un program care să citească de la tastatură un număr întreg fără semn pe 8 biți (în bază 10) și să-l afișeze pe ecran în baza doi, folosind operatori de shiftare și mascare.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Citiți de la tastatură un număr întreg cu semn, pe 32 de biți, apoi negați-l aritmetic și afișați valoarea, fără să folosiți operatorului unar &amp;quot;-&amp;quot; (folosind regulile convenției complement față de 2).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Scrieți un program care să citească un număr întreg pozitiv pe 8 biți de la tastatură, să numere și să afișeze câți biți de 1 și câți biți 0 are reprezentarea lui binară.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Citiți de la tastatură un număr întreg n, calculați și afișați suma numerelor de la 0 la n.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Citiți o valoare de temperatură în grade Celsius, și afișați pe ecran valoarea acelei temperaturi în Kelvin și grade Fahrenheit. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Fie o matrice de 8 linii și 10 coloane, cu elementele numerotate de la 0 (elementul din stânga sus) la 79 (elementul din dreapta jos):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  0  1  2  3  4  5  6  7  8  9&lt;br /&gt;
 10 11 12 13 14 15 16 17 18 19&lt;br /&gt;
 ...&lt;br /&gt;
 70 71 72 73 74 75 76 77 78 79&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dându-se de la tastatură un index n între 0 si 79, să se afișeze pe ce linie și pe ce coloană este indexul respectiv.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Dându-se un număr întreg de la tastatură, să se afișeze 0 dacă numărul este impar și 1 dacă este par.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Dându-se un număr întreg de la tastatură, să se afișeze restul împărțirii numărului la 16, folosind doar operații pe biți.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;dificil&amp;lt;/code&amp;gt; Folosind doar operații pe biți (fără construcții condiționale), să se calculeze modulul unui număr întreg pe 32 de biți, introdus de la tastatură.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_3&amp;diff=4804</id>
		<title>PC Laborator 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_3&amp;diff=4804"/>
		<updated>2016-10-19T13:42:05Z</updated>

		<summary type="html">&lt;p&gt;Lflueratoru: /* Exemplu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
&lt;br /&gt;
În urma parcurgerii acestui laborator studentul va fi capabil:&lt;br /&gt;
* să utilizeze stream-urile standard ale unui proces în Linux și în programe C;&lt;br /&gt;
* să înțeleagă funcționalitatea preprocesorului și să folosească directive de preprocesare;&lt;br /&gt;
&lt;br /&gt;
= [https://en.wikipedia.org/wiki/Standard_streams Stream-urile standard] ale unui proces =&lt;br /&gt;
&lt;br /&gt;
[[Fișier:standard_streams.png]]&lt;br /&gt;
&lt;br /&gt;
După cum se poate observa în schema de mai sus, un proces care rulează într-un sistem de operare dispune de trei stream-uri de intrare ieșire implicite:&lt;br /&gt;
* Stream-ul standard de intrare (&amp;#039;&amp;#039;&amp;#039;stdin&amp;#039;&amp;#039;&amp;#039;) - este utilizat pentru a introduce date în proces și este implicit atașat tastaturii;&lt;br /&gt;
* Stream-ul standard de ieșire (&amp;#039;&amp;#039;&amp;#039;stdout&amp;#039;&amp;#039;&amp;#039;) - este utilizat pentru a extrage rezultate ale execuției procesului și este implicit atașat consolei;&lt;br /&gt;
* Stream-ul standard de eroare (&amp;#039;&amp;#039;&amp;#039;stderr&amp;#039;&amp;#039;&amp;#039;) - este tradițional utilizat pentru a extrage informații legate de erorile apărute în execuția procesului și este implicit atașat consolei;&lt;br /&gt;
&lt;br /&gt;
Se observă că ambele stream-uri de ieșire sunt implicit trimise către consolă, unde utilizatorul procesului le poate vedea. Motivul pentru care sunt două este acela că aceste stream-uri pot fi redirectate către alte procese sau către fișiere, astfel se poate face o separare simplă și rapidă a mesajelor de eroare, în scopul depanării programului.&lt;br /&gt;
&lt;br /&gt;
Toate aceste stream-uri sunt formatate pe octet (byte). În cele mai multe din cazuri, acești bytes reprezintă caractere codate [https://en.wikipedia.org/wiki/ASCII ASCII].&lt;br /&gt;
&lt;br /&gt;
== Scrierea pe &amp;#039;&amp;#039;&amp;#039;stdout&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
Pentru a scrie pe stream-ul standard de ieșire se folosește generic funcția &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf&amp;lt;/code&amp;gt; este definită în header-ul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;stdio.h&amp;lt;/code&amp;gt; (standard input/output) și este implimentată în biblioteca standard a limbajului C. Pentru scrierea pe stream-ul standard de ieșire, se folosește în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
fprintf(stdout, &amp;quot;[format]&amp;quot;, val1, val2, ...); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Observație:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Deoarece scrierea pe stream-ul standard de ieșire este atât de utilizată, s-a creat o funcție specială pentru aceasta, numită &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;printf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(&amp;quot;[format]&amp;quot;, val1, val2, ...); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Formatul reprezintă modelul de date pe care îl dorim afișat în consolă.&lt;br /&gt;
&lt;br /&gt;
Specificatorul de format pentru &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf&amp;lt;/code&amp;gt;, respectiv &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;printf&amp;lt;/code&amp;gt; urmează următorul prototip:&lt;br /&gt;
&lt;br /&gt;
 %[flags][width][.precision][length]specifier &lt;br /&gt;
&lt;br /&gt;
unde caracterul &amp;#039;&amp;#039;specifier&amp;#039;&amp;#039; de la sfârșit este componenta cea mai importantă deoarece definește ce caractere sunt extrase din stream, interpretarea lor, și tipul de date corect al argumentului corespunzător:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;#039;&amp;#039;specifier&amp;#039;&amp;#039; !! Afișare !! Exemplu&lt;br /&gt;
|-&lt;br /&gt;
|i, d	|| întreg decimal cu semn || -694&lt;br /&gt;
|-&lt;br /&gt;
|u	|| întreg decimal fără semn || 1659&lt;br /&gt;
|-&lt;br /&gt;
|o	|| întreg în baza 8 || 254&lt;br /&gt;
|-&lt;br /&gt;
|x	|| întreg în baza 16 (litere mici) || 1af43&lt;br /&gt;
|-&lt;br /&gt;
|X	|| întreg în baza 16 (litere mari) || 1AF43&lt;br /&gt;
|-&lt;br /&gt;
|f	|| număr în virgulă mobilă || 23.65&lt;br /&gt;
|-&lt;br /&gt;
|e	|| număr în virgulă mobilă, notație științifică (mantisa - exponent), litere mici || 3.9265e+2&lt;br /&gt;
|-&lt;br /&gt;
|E	|| număr în virgulă mobilă, notație științifică (mantisa - exponent), litere mari || 3.9265E+2&lt;br /&gt;
|-&lt;br /&gt;
|g	|| număr în virgulă mobilă, cea mai scurtă reprezentare (%f sau %e) || 23.65&lt;br /&gt;
|-&lt;br /&gt;
|G	|| număr în virgulă mobilă, cea mai scurtă reprezentare (%F sau %E) || 23.65&lt;br /&gt;
|-&lt;br /&gt;
|a	|| număr în virgulă mobilă în baza 16, litere mici || -0xc.90fep-2&lt;br /&gt;
|-&lt;br /&gt;
|A	|| număr în virgulă mobilă în baza 16, litere mari || -0xc.90FEP-2&lt;br /&gt;
|-&lt;br /&gt;
|c	|| caracter || a&lt;br /&gt;
|-&lt;br /&gt;
|s	|| șir de caracere || castravete&lt;br /&gt;
|-&lt;br /&gt;
|p	|| adresă în memorie (pointer)	|| 00000000b8000000&lt;br /&gt;
|-&lt;br /&gt;
|n	|| nu se printează nimic || numărul de caractere citit până în momentul curent este stocat în variabila specificată&lt;br /&gt;
|-&lt;br /&gt;
|%	|| %	||Un caracter % urmat de alt caracter % afișează un singur %.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Specificatorul de format poate conține și sub-specificatori: &amp;#039;&amp;#039;flags&amp;#039;&amp;#039;, &amp;#039;&amp;#039;width&amp;#039;&amp;#039;, &amp;#039;&amp;#039;.precision&amp;#039;&amp;#039; și &amp;#039;&amp;#039;modifiers&amp;#039;&amp;#039; (în această ordine), care sunt opționale și respectă următoarele reguli:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;#039;&amp;#039;flag&amp;#039;&amp;#039; !! Descriere &lt;br /&gt;
|-&lt;br /&gt;
| -	|| Aliniere la stânga cu dimensiunea dată de câmpul &amp;#039;&amp;#039;width&amp;#039;&amp;#039; (implicit aliniera este la dreapta). Vezi descrierea lui &amp;#039;&amp;#039;width&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
| +	|| Forțează printarea unui semn (+ sau -), chiar și pentru valori pozitive (implicit se afișează semnul doar pentru numere negative).&lt;br /&gt;
|-&lt;br /&gt;
| (spațiu) || Dacă semnul nu se afișează, în locul lui se inserează un spațiu.&lt;br /&gt;
|-&lt;br /&gt;
| # || Folosit cu o, x, sau X, printează 0, 0x sau respectiv 0X în fața valorii, pentru numere diferite de 0. Folosit cu a, A, e, E, f, g sau G, forțează printarea punctului decimal, chiar dacă după el nu mai urmează alte cifre. Implicit, dacă după punct nu mai urmează alte cifre (numărul este întreg), punctul nu se mai afișează.&lt;br /&gt;
|-&lt;br /&gt;
| 0	|| Când se specifică o dimensiune (&amp;#039;&amp;#039;width&amp;#039;&amp;#039;), numărul se completează la stânga cu 0 în loc de spațiu. Vezi descrierea lui &amp;#039;&amp;#039;width&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;#039;&amp;#039;width&amp;#039;&amp;#039; !! Descriere &lt;br /&gt;
|-&lt;br /&gt;
| (număr) || Numărul minim de caractere care trebuie scrise. Dacă lungimea numărului este mai mică decât această valoare, el este completat cu spații. Dacă lungimea este mai mare, numărul este afișat în întregime.&lt;br /&gt;
|-&lt;br /&gt;
| *	|| Valoarea &amp;#039;&amp;#039;width&amp;#039;&amp;#039; nu este specificată în string-ul &amp;#039;&amp;#039;format&amp;#039;&amp;#039;, ci într-un argument suplimentar al funcției, care precede argumentul ce trebuie formatat.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;#039;&amp;#039;.precision&amp;#039;&amp;#039; !! Descriere &lt;br /&gt;
|-&lt;br /&gt;
| (număr) || Pentru valori întregi (d, i, o, u, x, X), &amp;#039;&amp;#039;precision&amp;#039;&amp;#039; specifică numărul minim de cifre care trebuie afișate. Dacă numărul ce trebuie afișat este mai scurt decât această valoare, rezultatul este completat la stânga cu cifra 0. Dacă numărul este mai lung, el este afișat în întregime. O precizie 0 înseamnă că pentru valoarea 0 nu se va afișa nimic. Pentru specificatorii a, A, e, E, f și F, aceasta este numărul de cifre ce a fi afișat după punct (implicit valoarea aceasta este 6). Pentru specificatorii g și G, acesta este numărul maxim de cifre semnificative ce trebuie afișat. Pentru s, acesta este numărul maxim de caractere ce trebuie afișat. Implicit toate caracterele sunt afișate, până la întâlnirea unui terminator de string. Dacă punctul este scris fără o valoare pentru precizie, aceasta se consideră implicit 0.&lt;br /&gt;
|-&lt;br /&gt;
| *	|| Valoarea &amp;#039;&amp;#039;precision&amp;#039;&amp;#039; nu este specificată în string-ul &amp;#039;&amp;#039;format&amp;#039;&amp;#039;, ci într-un argument suplimentar al funcției, care precede argumentul ce trebuie formatat.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Specificatorul &amp;#039;&amp;#039;length&amp;#039;&amp;#039; modifică dimensunea tipului de date. Tabelul următor arată tipurile folosite pentru a interpreta argumentele corespunzătoare, cu și fără specificatorul &amp;#039;&amp;#039;length&amp;#039;&amp;#039; (dacă un alt tip este folosit, se realizează promovarea sau conversia tipului, dacă este posibil):&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th colspan=&amp;quot;7&amp;quot;&amp;gt;specifiers&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;i&amp;gt;length&amp;lt;/i&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;tt&amp;gt;d i&amp;lt;/tt&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;tt&amp;gt;u o x X&amp;lt;/tt&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;tt&amp;gt;f F e E g G a A&amp;lt;/tt&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;tt&amp;gt;c&amp;lt;/tt&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;tt&amp;gt;p&amp;lt;/tt&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;i&amp;gt;(none)&amp;lt;/i&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;unsigned int&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;char*&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;void*&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;int*&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: yellow;&amp;quot;&amp;gt;&amp;lt;td&amp;gt;&amp;lt;tt&amp;gt;hh&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;signed char&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;unsigned char&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;signed char*&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;tt&amp;gt;h&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;short int&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;unsigned short int&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;short int*&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;tt&amp;gt;l&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;long int&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;unsigned long int&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;wint_t&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;wchar_t*&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;long int*&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: yellow;&amp;quot;&amp;gt;&amp;lt;td&amp;gt;&amp;lt;tt&amp;gt;ll&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;long long int&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;unsigned long long int&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;long long int*&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: yellow;&amp;quot;&amp;gt;&amp;lt;td&amp;gt;&amp;lt;tt&amp;gt;j&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;intmax_t&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;uintmax_t&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;intmax_t*&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: yellow;&amp;quot;&amp;gt;&amp;lt;td&amp;gt;&amp;lt;tt&amp;gt;z&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;size_t&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;size_t&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;size_t*&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: yellow;&amp;quot;&amp;gt;&amp;lt;td&amp;gt;&amp;lt;tt&amp;gt;t&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;ptrdiff_t&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;ptrdiff_t&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;ptrdiff_t*&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;tt&amp;gt;L&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;yes&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;long double&amp;lt;/tt&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Observație:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Tabelele de mai sus pot fi înțelese abia după parcurgerea cursurilor și laboratoarelor legate de tipuri și dimensiuni de date. Ele vor fi folosite pe parcursul cursului drept referință și nu trebuie memorate.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Observație:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Rândurile marcate cu galben au fost introduse în standardul C99.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scrierea pe &amp;#039;&amp;#039;&amp;#039;stderr&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
Scrierea pe stream-ul standard de eroare se face identic cu scrierea pe &amp;#039;&amp;#039;&amp;#039;stdout&amp;#039;&amp;#039;&amp;#039;, specificând numele streamului ca prim argument al funcției &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
fprintf(stderr, &amp;quot;[format]&amp;quot;, val1, val2, ...); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Observație:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Nu se poate folosi funcția &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;printf&amp;lt;/code&amp;gt; pentru scrierea pe stream-ul standard de eroare.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Citirea din &amp;#039;&amp;#039;&amp;#039;stdin&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
Pentru a citi de pe stream-ul standard de intrare se folosește generic funcția &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf&amp;lt;/code&amp;gt; este definită în header-ul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;stdio.h&amp;lt;/code&amp;gt; (standard input/output) și se folosește în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
fscanf(stdin, &amp;quot;[format]&amp;quot;, val1, val2, ...); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Observație:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Deoarece citirea de pe stream-ul standard este atât de utilizată, s-a creat o funcție specială pentru aceasta, numită &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;scanf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
scanf(&amp;quot;[format]&amp;quot;, val1, val2, ...); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Formatul reprezintă modelul de date pe care ne așteptăm să-l primim de la tastatură. Acesta este un șir de caractere unde fiecare caracter este tratat în următorul fel:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;caracter alb&amp;#039;&amp;#039;&amp;#039; - se va citi și ignora din stream orice caractere albe până la întâlnirea unui caracter care nu este alb (caracerele albe includ spații, linie nouă, caractere tab); un singur caracter alb în format validează oricâte caractere albe extrase din stream (inclusiv nici unul).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;caracter care nu este alb, exceptând specificatorul de format (%)&amp;#039;&amp;#039;&amp;#039; - orice caracter care nu este alb (spațiu, linie nouă sau tab) sau care nu face parte dintr-un specificator de format (care începe cu %) face ca următorul caracter să fie citit din stream, comparat cu acest caracter din format, iar dacă sunt identice, ele sunt ignorate și se continuă cu următorul caracter; dacă nu sunt identice, &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf&amp;lt;/code&amp;gt; se va opri cu eroare;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;specificator de format&amp;#039;&amp;#039;&amp;#039; - o secvență care începe cu caracterul &amp;quot;la sută&amp;quot; (%) indică un specificator de format, utilizat pentru a indica tipul și formatul unei date care trebuie citită și stocată într-una din variabilele specificate în apelul lui &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Specificatorul de format pentru &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf&amp;lt;/code&amp;gt; urmează următorul prototip:&lt;br /&gt;
&lt;br /&gt;
 %[*][width][length]specifier &lt;br /&gt;
&lt;br /&gt;
unde caracterul &amp;#039;&amp;#039;specifier&amp;#039;&amp;#039; de la sfârșit este componenta cea mai importantă deoarece definește ce caractere sunt extrase din stream, interpretarea lor, și tipul de date corect al argumentului corespunzător:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;#039;&amp;#039;specifier&amp;#039;&amp;#039; !! Descriere !! Caractere extrase din stream&lt;br /&gt;
|-&lt;br /&gt;
|i, u	|| întreg	|| Orice număr de cifre, opțional precedate de un semn (+ sau -). Baza zece este considerată implicit (0-9), dar un 0 ca prefix marchează baza ca fiind opt (0-7), iar &amp;quot;0x&amp;quot; ca prefix marchează baza șaisprezece (0-f).&lt;br /&gt;
|-&lt;br /&gt;
|d	|| întreg în baza 10 || Orice număr de cifre decimale (0-9), opțional precedate de un semn (+ sau -).&lt;br /&gt;
|-&lt;br /&gt;
|o	|| întreg în baza 8 || Orice număr de cifre octale (0-7), opțional precedate de un semn (+ sau -).&lt;br /&gt;
|-&lt;br /&gt;
|x	|| întreg în baza 16 || Orice număr de cifre hexazecimale (0-7, a-f, A-F), opțional precedate de &amp;quot;0x&amp;quot; sau &amp;quot;0X&amp;quot;, și totul opțional precedat de un semn (+ sau -).&lt;br /&gt;
|-&lt;br /&gt;
|f, e, g, a (C99)	|| număr în virgulă mobilă || O serie de cifre decimale, conținând opțional un punct decimal, opțional precedat de un semn (+ sau -), opțional urmat de un caracter e sau E, și un întreg în baza 10. În standardul C99 se acceptă și numere în virgulă mobilă în baza hexazecimală, precedate de 0x sau 0X.&lt;br /&gt;
|-&lt;br /&gt;
|c	|| caracter || Următorul caracter. Dacă &amp;#039;&amp;#039;&amp;#039;width&amp;#039;&amp;#039;&amp;#039; este specificat, se vor citi exact &amp;#039;&amp;#039;&amp;#039;width&amp;#039;&amp;#039;&amp;#039; caractere și vor fi stocate în locații succesive în vectorul primit ca argument. Nu este adăugat terminator de șir la final.&lt;br /&gt;
|-&lt;br /&gt;
|s	|| șir de caractere	||Orice număr de caractere care nu sunt albe, oprindu-se la primul caracter alb înlâlnit. Este automat adăugat terminator de șir la final.&lt;br /&gt;
|-&lt;br /&gt;
|p	|| adresă în memorie	||O secvență de caractere reprezentând o adresă în memorie. Formatul folosit depinde de sistem și de implementarea bibliotecii, dar este identic cu cel folosit de formatul %p în &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fprintf&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|[characters]	|| set de caractere	|| Orice număr de caractere dintre cele specificate între parantezele drepte. O liniuță (-) care nu este pe prima poziție între paranteze poate produce comportamente nedefinite în unele implementări de bibliotecă standard.&lt;br /&gt;
|-&lt;br /&gt;
|[^characters]	|| set de caractere negat	|| Orice număr de caractere care nu sunt specificate între parantezele drepte.&lt;br /&gt;
|-&lt;br /&gt;
|n	|| număr caractere citite || Nu este consumat nimic din stream. Numărul de caractere citit până în momentul curent este stocat în variabila specificată.&lt;br /&gt;
|-&lt;br /&gt;
|%	|| %	||Un caracter % urmat de alt caracter % consumă un singur % din stream.&lt;br /&gt;
|}&lt;br /&gt;
În afară de n, cel puțin un caracter va fi consumat din stream de către oricare alt specificator. Altfel, operația eșuează și citirea se încheie în acel punct.&lt;br /&gt;
&lt;br /&gt;
Specificatorul de format poate conține de asemenea și sub-specificatori: steluță (*), &amp;#039;&amp;#039;&amp;#039;width&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;length&amp;#039;&amp;#039;&amp;#039; (în această ordine), care sunt opționale și respectă următoarele specificații:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! sub-specifcator !! Descriere&lt;br /&gt;
|-&lt;br /&gt;
| *	|| O steluță ca sub-specifiator indică faptul că data citită nu este stocată într-o variabilă ci este ignorată.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;width&amp;#039;&amp;#039;	|| Specifică numărul maxim de caractere ce vor fi citite din stream de operația curentă.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;length&amp;#039;&amp;#039;	|| Unul din hh, h, l, ll, j, z, t, L. Acest caracter modifică tipul de date așteptat ca argument. Comportamentul acestora este identic cu cel definit la capitolul [[#Scrierea pe stdout]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Variabilele care nu sunt de tip vector sau pointer și sunt folosite în apelul funcției &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;fscanf&amp;lt;/code&amp;gt; pentru a stoca date din stream, trebuie obligatoriu precedate de operatorul &amp;amp;. Explicația pentru această regulă va fi prezentată în cursul legat de pointeri și adrese de memorie.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Scrieți următorul program într-un fișier numit &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;exemplu_stdin.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int integerValue;&lt;br /&gt;
    fprintf(stdout, &amp;quot;Introduceti o valoare numerica: &amp;quot;);&lt;br /&gt;
    fscanf(stdin, &amp;quot;%d&amp;quot;, &amp;amp;integerValue);&lt;br /&gt;
    printf(&amp;quot;Valoarea introdusa este %d\n&amp;quot;, integerValue);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Citiți de la tastatură două numere întregi și afișați suma lor pe stream-ul standard de ieșire (operatorul pentru sumă este +).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Citiți de la tastatură trei numere întregi și afișați produsul lor pe stream-ul standard de eroare (operatorul pentru produs este *).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Citiți de la tastatură patru numere fracționare. Primele 3 sunt coeficienții unui polinom de gradul II. Al patrulea este valoarea unui punct în care se calculează valoarea polinomului. Afișați rezultatul cu două zecimale pe stream-ul standard de ieșire. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Fie următoarea funcție: &amp;lt;code&amp;gt;f(x) = (3.6 * e&amp;lt;sup&amp;gt;x&amp;lt;/sup&amp;gt; + cos(2*x)) / (x + 1)&amp;lt;/code&amp;gt;. Scrieți un program care să citească o valoarea fracționară de la tastatură, să calculeze valoarea funcției în punctul respectiv și sa afișeze rezultatul pe stream-ul standard de eroare în format științific. Observație: pentru a utiliza funcțiile cos și exp (exponențială), trebuie să adăugați programului vostru, pe prima linie, directiva &amp;lt;code&amp;gt;#include &amp;lt;math.h&amp;gt;&amp;lt;/code&amp;gt; și să compilați programul adăugând comenzii de compliare flag-ul &amp;lt;code&amp;gt;-lm&amp;lt;/code&amp;gt;. Pentru a calcula e&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; se folosește funcția exp: &amp;lt;code&amp;gt;exp(2)&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= [https://en.wikipedia.org/wiki/C_preprocessor Preprocesorul C] =&lt;br /&gt;
&lt;br /&gt;
Preprocesarea unui fișier cu cod C este prima etapă din lanțul de &amp;#039;&amp;#039;build&amp;#039;&amp;#039;, și reprezintă, așa cum îi spune și numele, o etapă de dinainte de procesarea (compilarea) efectivă. Motivul pentru care se realizează această etapă inițială este faptul că prin preprocesarea codului se pot elimina secțiuni din program care ori nu sunt necesare, ori nu sunt compilabile pe un anumit procesor sau sistem de operare. Spre exemplu, pentru a folosi o interfață serială, în sistemul de operare Windows, și compilatorul Visual Studio, există un tip de date care se numește &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;HANDLE&amp;lt;/code&amp;gt;. Acest tip de date nu există în Linux, aici fiind înlocuit simplu cu &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;int&amp;lt;/code&amp;gt;. În acest caz, compilarea unui program care folosește &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;HANDLE&amp;lt;/code&amp;gt; pe Linux va eșua cu eroare. Aici intervin directivele de preprocesare, după cum vom vedea în continuare.&lt;br /&gt;
&lt;br /&gt;
În acest laborator se va discuta despre:&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#include&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#undef&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifdef&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifndef&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#else&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#endif&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Directiva &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#include&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Probabil &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#include&amp;lt;/code&amp;gt; este cea mai frecvent utilizată directivă de preprocesare, dar și cea mai ușor de înțeles. Efectiv, preprocesorul caută fișierul specificat între paranteze unghiulare sau ghilimele în lista de directoare dintr-o listă cunoscută și apoi înlocuiește directiva &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#include&amp;lt;/code&amp;gt; cu conținutul fișierului respectiv.&lt;br /&gt;
&lt;br /&gt;
=== Exemplu ===&lt;br /&gt;
&lt;br /&gt;
* Scrieți un fișier nou într-un editor de text care să conțină următorul cod:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Salvați fișierul cu numele &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;test_preprocessor.c&amp;lt;/code&amp;gt; în directorul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;~/work/&amp;#039;&amp;#039;prenume_nume&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Scrieți un fișier &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;Makefile&amp;lt;/code&amp;gt; cu o singură rețetă care să producă un fișier numit &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;processed.c&amp;lt;/code&amp;gt; din fișierul de mai sus, apelând compilatorul C (gcc) cu fanionul corespunzător pentru a face doar preprocesare (vezi [[PC Laborator 1#Generarea fișierului executabil|PC Laborator 1]]).&lt;br /&gt;
* Ce diferențe există între fișierul original și fișierul preprocesat?&lt;br /&gt;
* Scrieți un nou fișier numit &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;header_file.h&amp;lt;/code&amp;gt;, care să conțină următorul text:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// This is the start of the header file&lt;br /&gt;
int variable;&lt;br /&gt;
// This is the end of the header file&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Modificați fișierul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;test_preprocesor.c&amp;lt;/code&amp;gt; prin înserția pe prima linie a unei directive &amp;#039;&amp;#039;&amp;#039;include&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;header_file.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Rulați din nou comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt;. Observați mesajul de eroare: fișierul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;header_file.h&amp;lt;/code&amp;gt; nu este găsit de preprocesor, cu toate că este în directorul curent.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Fișierele antet (header) sunt căutate doar în anumite căi predefinite în compilator (de exemplu &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;/usr/include&amp;lt;/code&amp;gt;). Pentru a face preprocesorul să caute și în alte directoare, calea până la acestea trebuie specificată la compilare, folosind fanionul &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-I&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
* Adăugați comenzii de compilare din &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;Makefile&amp;lt;/code&amp;gt; următorul fanion: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-I.&amp;lt;/code&amp;gt; Asta va spune compilatorului (care mai departe va spune preprocesorului) să caută fișiere antet și în directorul curent (.)&lt;br /&gt;
* Rulați din nou comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt;. &lt;br /&gt;
* Afișați conținutul celor două fișiere C. Ce diferențe observați?&lt;br /&gt;
&lt;br /&gt;
== Directivele &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#undef&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Directiva &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define&amp;lt;/code&amp;gt; este utilizată pentru a defini &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-uri de preprocesor. Acestea se folosesc în trei feluri distincte:&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define &amp;#039;&amp;#039;token&amp;#039;&amp;#039; &amp;#039;&amp;#039;value&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; - este definit &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul &amp;#039;&amp;#039;token&amp;#039;&amp;#039; existența acestuia putând fi testată cu directivele &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifdef&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifndef&amp;lt;/code&amp;gt;; dacă &amp;#039;&amp;#039;token&amp;#039;&amp;#039; este utilizat în program, după definirea lui, el va fi înlocuit cu &amp;#039;&amp;#039;value&amp;#039;&amp;#039; (efectiv, această operație este identică cu un &amp;quot;Search and Replace&amp;quot; dintr-un editor de text, unde &amp;#039;&amp;#039;token&amp;#039;&amp;#039; este înlocuit cu &amp;#039;&amp;#039;value&amp;#039;&amp;#039;.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define PI 3.1415&lt;br /&gt;
&lt;br /&gt;
float a = 2 * PI;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define &amp;#039;&amp;#039;token&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; - este definit &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul &amp;#039;&amp;#039;token&amp;#039;&amp;#039;, existența acestuia putând fi testată cu directivele &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifdef&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifndef&amp;lt;/code&amp;gt;; dacă &amp;#039;&amp;#039;token&amp;#039;&amp;#039; este utilizat în program, după definirea lui, va fi șters de peste tot unde apare (este de fapt cazul de mai sus unde &amp;#039;&amp;#039;value&amp;#039;&amp;#039; este de fapt un string de lungime zero).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#define DEBUG&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
    printf(&amp;quot;Debug is ON!\n&amp;quot;);&lt;br /&gt;
#endif&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define &amp;#039;&amp;#039;token(arg1,arg2,..) expression&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; - este definit &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul &amp;#039;&amp;#039;token&amp;#039;&amp;#039;, existența acestuia putând fi testată cu directivele &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifdef&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifndef&amp;lt;/code&amp;gt;; &amp;#039;&amp;#039;token&amp;#039;&amp;#039; este utilizat în program ca o funcție, iar el va fi înlocuit de &amp;#039;&amp;#039;expression&amp;#039;&amp;#039;, în care &amp;#039;&amp;#039;arg1,arg2,...&amp;#039;&amp;#039; vor fi înlocuite cu valorile din program.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#define MAX(a,b) (a &amp;lt; b ? b : a)&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    printf(&amp;quot;Value is %d!\n&amp;quot;, MAX(4,5)); // Replaced to: printf(&amp;quot;Value is %d!\n&amp;quot;, (4 &amp;lt; 5 ? 5 : 4));&lt;br /&gt;
//  printf(&amp;quot;Value is %d!\n&amp;quot;, MAX(4 + 1, 5 + 1)); // Replaced to: printf(&amp;quot;Value is %d!\n&amp;quot;, (4 + 1 &amp;lt; 5 + 1 ? 5 + 1 : 4 + 1));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; O greșeală frecventă în definirea macrourilor este adăugarea unui caracter ; la sfârșitul liniei. Acesta se va înlocui și el în momentul în care &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul se expandează în text:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#define PI 3.1415;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    float f = PI * 2; // Replaced to: float f = 3.1415; * 2; &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Se vede imediat că sintaxa este greșită și compilatorul va genera o eroare.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a anula definiția unui &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;, se folosește directiva &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#undef&amp;lt;/code&amp;gt; astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#undef PI&lt;br /&gt;
#undef DEBUG&lt;br /&gt;
#undef MAX&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu ===&lt;br /&gt;
&lt;br /&gt;
* Modificați fișierul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;test_preprocessor.c&amp;lt;/code&amp;gt; în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define PI 3.1415&lt;br /&gt;
#define INC(x) (x + 1)&lt;br /&gt;
#define DEBUG&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    printf(&amp;quot;PI is %f\n&amp;quot;, PI);&lt;br /&gt;
    printf(&amp;quot;%d comes after 4\n&amp;quot;, INC(4));&lt;br /&gt;
&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
    printf(&amp;quot;This runs in debug mode\n&amp;quot;);&lt;br /&gt;
#else&lt;br /&gt;
    printf(&amp;quot;This runs in release mode\n&amp;quot;);&lt;br /&gt;
#endif&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Rulați comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt; în consolă.&lt;br /&gt;
* Afișați cele două fișiere .c. Observați diferențele.&lt;br /&gt;
&lt;br /&gt;
== Directivele &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#ifndef&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#define&amp;lt;/code&amp;gt; pe post de gardă pentru dublă incluziune ==&lt;br /&gt;
&lt;br /&gt;
Luând ca punct de plecare [[#Exemplu|primul exemplu]] de la directiva &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;#include&amp;lt;/code&amp;gt;, oare ce se întâmplă dacă header-ul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;header_file.h&amp;lt;/code&amp;gt; este inclus de două ori?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;quot;header_file.h&amp;quot;&lt;br /&gt;
#include &amp;quot;header_file.h&amp;quot;&lt;br /&gt;
int main(){&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Răspunsul este simplu, preprocesorul va înlocui ambele linii cu conținutul fișierului, lucru care va face ca variabila &amp;#039;&amp;#039;&amp;#039;variable&amp;#039;&amp;#039;&amp;#039; să fie definită de două ori, lucru care sintactic greșit în C. Sigur, nimeni nu va include în mod voit un header de două ori, dar este posibil ca indirect lucrul acesta să se întâmple. Spre exemplu, dacă în fișierul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;header_file.h&amp;lt;/code&amp;gt; este inclus  &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;stdio.h&amp;lt;/code&amp;gt;, iar în &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;test_preprocessor.c&amp;lt;/code&amp;gt; sunt incluse și &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;header_file.h&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;stdio.h&amp;lt;/code&amp;gt;. În această situație, &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;stdio.h&amp;lt;/code&amp;gt; ajunge să fie inclus de două ori. Pentru a evita problemele apărute în această situație, se folosește garda de incluziune ([https://en.wikipedia.org/wiki/Include_guard include guard]). Aceasta se adaugă în fiecare fișier header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot; line&amp;gt;&lt;br /&gt;
#ifndef _HEADER_FILE_H_&lt;br /&gt;
#define _HEADER_FILE_H_&lt;br /&gt;
&lt;br /&gt;
// This is the start of the header file&lt;br /&gt;
int variable;&lt;br /&gt;
// This is the end of the header file&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Includerea acestui fișier de către preprocesor se realizează acum în următoarea secvență:&lt;br /&gt;
# Prima directivă include din fișerul sursă C va copia conținutul fișierului de mai sus în locul unde este inclus (test_preprocesor.c, linia 1).&lt;br /&gt;
# Directiva ifndef verifică dacă &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul _HEADER_FILE_H_ &amp;#039;&amp;#039;nu&amp;#039;&amp;#039; este definit (header_file.h, linia 1).&lt;br /&gt;
# Deoarece nu este definit, tot textul dintre ifndef și endif se păstrează (header_file.h, liniile 2-7).&lt;br /&gt;
# Prima linie din text-ul păstrat este o directivă define care definește  &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul_HEADER_FILE_H (header_file.h, linia 2).&lt;br /&gt;
# A doua directivă include din fișerul sursă C va copia conținutul fișierului de mai sus în locul unde este inclus (test_preprocesor.c, linia 2).&lt;br /&gt;
# Directiva ifndef verifică dacă &amp;#039;&amp;#039;&amp;#039;macro&amp;#039;&amp;#039;&amp;#039;-ul _HEADER_FILE_H_ &amp;#039;&amp;#039;nu&amp;#039;&amp;#039; este definit (header_file.h, linia 1).&lt;br /&gt;
# Deoarece el acum ESTE definit în cadrul include-ului anterior, tot textul dintre ifndef și endif se elimină (header_file.h, liniile 2-7).&lt;br /&gt;
&lt;br /&gt;
=== Alternativă la &amp;#039;&amp;#039;&amp;#039;include guards&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;#pragma once&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
Problema cu &amp;#039;&amp;#039;&amp;#039;include guards&amp;#039;&amp;#039;&amp;#039; este că pe lângă faptul ca este o construcție complicată care are nevoie de linii adăugate în fișierul header și la început și la sfârșit, numele macro-ului definit se poate repeta accidental în două sau mai multe fișiere, în această situație neincluzându-se decât primul din aceste fișiere.&lt;br /&gt;
&lt;br /&gt;
O alternativă non-standard dar suportată de majoritatea compilatoarelor (inclusiv C++) este utilizarea directivei &amp;lt;code style=&amp;quot;color: #00AA00&amp;quot;&amp;gt;#pragma once&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot; line&amp;gt;&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
// This is the start of the header file&lt;br /&gt;
int variable;&lt;br /&gt;
// This is the end of the header file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu ===&lt;br /&gt;
&lt;br /&gt;
* Modificați fișierul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;test_preprocessor.c&amp;lt;/code&amp;gt; pentru a include header-ul &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;header_file.h&amp;lt;/code&amp;gt; de două ori, conform exemplului de mai sus.&lt;br /&gt;
* Rulați comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt; și confirmați dubla declarare a variabilei &amp;#039;&amp;#039;&amp;#039;variable&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Adăugați gardă de incluziune fișierului header, conform exemplului de mai sus.&lt;br /&gt;
* Rulați comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt; și confirmați că variabila &amp;#039;&amp;#039;&amp;#039;variable&amp;#039;&amp;#039;&amp;#039; este declarată o singură dată.&lt;br /&gt;
* Înlocuiți garda de incluziune cu &amp;lt;code style=&amp;quot;color: #00AA00&amp;quot;&amp;gt;#pragma once&amp;lt;/code&amp;gt;&lt;br /&gt;
* Rulați comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt; și confirmați că variabila &amp;#039;&amp;#039;&amp;#039;variable&amp;#039;&amp;#039;&amp;#039; este declarată o singură dată.&lt;/div&gt;</summary>
		<author><name>Lflueratoru</name></author>
	</entry>
</feed>