<?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=Ccioflan</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=Ccioflan"/>
	<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php/Special:Contribu%C8%9Bii/Ccioflan"/>
	<updated>2026-05-14T16:14:12Z</updated>
	<subtitle>Contribuții utilizator</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Tutorial_Quartus_II&amp;diff=5256</id>
		<title>Tutorial Quartus II</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Tutorial_Quartus_II&amp;diff=5256"/>
		<updated>2017-03-10T09:36:20Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: /* 1. Crearea unui proiect */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Programarea plăcii experimentale DE1 cu ajutorul programului Quartus II (versiunea 13.0sp1)&lt;br /&gt;
&lt;br /&gt;
Exemplu: sinteza unui sumator pe 4 biți.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Pentru a deschide aplicația Quartus II puteți folosi:&lt;br /&gt;
&lt;br /&gt;
- shortcut-ul de pe ecran &lt;br /&gt;
&lt;br /&gt;
- fișierul executabil din locația de instalare&lt;br /&gt;
&lt;br /&gt;
- meniul de programe&lt;br /&gt;
&lt;br /&gt;
Etapele:&lt;br /&gt;
&lt;br /&gt;
=1. Crearea unui proiect=&lt;br /&gt;
Atunci când deschidem programul Quartus II apare un ecran de întâmpinare, unde avem opțiunea „Create new project”. Dacă nu vedem această fereastră, selectăm „New Project Wizard” din meniul File, sau selectăm File - New și apoi „New Quartus II Project”).&lt;br /&gt;
În ambele cazuri, se va deschide Wizard-ul care ne ajută să stabilim setările pentru noul proiect. Dacă apere un ecran de introducere, apăsăm Next (avem posibilitatea de a bifa “Don’t show this introduction again” pentru a trece peste acest pas pe viitor).&lt;br /&gt;
&lt;br /&gt;
==1.1. Numele și locația proiectului==&lt;br /&gt;
Primul pas: setarea locației proiectului (working directory) și denumirea proiectului. Proiectul se va salva intr-un director nou, creat de noi in directorul /home/student. Proiectul trebuie să aibe un nume, care este de obicei același cu entitatea top-level design (care se completează automat când scriem numele proiectului). Dacă în locația proiectului mai sunt și alte proiecte Quartus II, apare un ecran de avertizare.&lt;br /&gt;
Proiectul din acest tutorial se numește Adder și entitatea top-level design se numește tot Adder.&lt;br /&gt;
Veți folosi nume adecvate pentru proiectul pe care îl implementați.&lt;br /&gt;
&lt;br /&gt;
==1.2. Adăugarea unor fișiere==&lt;br /&gt;
Dacă în proiectul nostru vom folosi fișiere pe care le-am scris anterior, le putem adăuga de la început în proiect în această fereastră. Dacă nu doriți sa adăugați fișiere deja create proiectului vostru puteți apăsa Next pentru a trece la pasul următor. Se mai pot adăuga fișiere în proiect și ulterior din meniul Settings.&lt;br /&gt;
&lt;br /&gt;
==1.3. Selectarea dispozitivului==&lt;br /&gt;
În pasul următor (al treilea ecran din wizard) se selectează dispozitivul care va fi folosit pentru implementare. Selectați Cyclone II la Device Family. Din lista de dispozitive specifice selectati EP2C20F484C7. &lt;br /&gt;
(La Target device trebuie sa fie selectată opțiunea „Specific device selected in Available devices list”).&lt;br /&gt;
Apăsați apoi Next pentru a trece la pasul următor.&lt;br /&gt;
&lt;br /&gt;
==1.4. Selectarea simulatorului==&lt;br /&gt;
În pagina 4 din wizard vom menționa alte programe  pe care le folosim în proiectare (pentru sinteză, simulare, verificare). De exemplu, dacă vrem să folosim ModelSim, selectăm la Simulation ModelSim pentru Verilog HDL. Putem de asemenea să ne bazăm pe ce pune la dispoziție software-ul Quartus II și să trecem peste acest pas apăsând Next.&lt;br /&gt;
&lt;br /&gt;
După apăsarea butonului Next va apărea ultima fereastră din New Project Wizard în care este desfășurat un rezumat al opțiunilor alese pentru crearea proiectului. După apăsarea butonului Finish proiectul va fi creat.&lt;br /&gt;
&lt;br /&gt;
=2. Elaborarea fișierului sursă (entitatea top-level design)=&lt;br /&gt;
&lt;br /&gt;
Entitatea top-level design este un fișier Verilog sau o schemă. &lt;br /&gt;
 &lt;br /&gt;
Dacă ați scris deja fișierele și le-ați adăugat cu Add Files, treceți la etapa următoare. Dacă doriți să adăugați fișiere în această fază (și nu le-ați adăugat anterior), folosiți meniul Assignments -&amp;gt; Settings pentru a adăuga fișiere și apoi treceți la etapa următoare.&lt;br /&gt;
&lt;br /&gt;
In continuare se va explica modul de utilizarea al editorului de text Quartus II.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplu de implementare: vom implementa un sumator pentru numere binare pe 4 biți, care va fi numit Adder.v.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Atenție!&amp;#039;&amp;#039;&amp;#039; Modulul top-level trebuie să aibă numele specificat anterior, când s-a creat proiectul.&lt;br /&gt;
&lt;br /&gt;
Pentru a utiliza editorul Quartus II, selectați File -&amp;gt; New. &lt;br /&gt;
&lt;br /&gt;
Se va deschide o fereastră în care veți selecta Verilog HDL File, apăsați OK. Se va deschide editorul de text.&lt;br /&gt;
&lt;br /&gt;
Selectați File -&amp;gt; Save As pentru a putea alege numele fișierului. În fereastra care apare, veți scrie numele fișierului - pentru entitatea top level design este cel pe care l-ați ales anterior - și bifați “Add file to current project”. Apăsați Save. Fișierul va fi salvat în directorul proiectului.&lt;br /&gt;
&lt;br /&gt;
Intrati in editor și continuați prin a scrie codul Verilog. &lt;br /&gt;
&lt;br /&gt;
Exemplu: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
module Adder (&lt;br /&gt;
&lt;br /&gt;
			output [4:0] out,&lt;br /&gt;
&lt;br /&gt;
			input [3:0] in0,&lt;br /&gt;
&lt;br /&gt;
			input [3:0] in1);&lt;br /&gt;
&lt;br /&gt;
assign out = in0 + in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Salvați fișierul folosind File -&amp;gt; Save sau combinația de taste Ctrl-s. Pentru mai multe opțiuni ale editorului puteți accesa Tools-&amp;gt; Options -&amp;gt; Text Editor.&lt;br /&gt;
&lt;br /&gt;
=3. Compilarea=&lt;br /&gt;
&lt;br /&gt;
Selectați Start Compilation în meniul Processing sau apăsați butonul de compilare Start Compilation (cu simbolul folosit de obicei pentru Play) și așteptați rezultatul compilării.&lt;br /&gt;
&lt;br /&gt;
Ignorați mesajele de Warning (avertizări) care apar în timpul compilării - acestea se datorează faptului că nu am fixat anumiți parametri pentru implementare.&lt;br /&gt;
&lt;br /&gt;
Erorile posibile în această fază sunt în principal erori de sintaxă Verilog sau erori datorate faptului că am ales greșit numele modulului top-level. &lt;br /&gt;
&lt;br /&gt;
Pentru corectarea setărilor folositi meniul Settings. De exemplu, se poate modifica entitatea top-level design din meniul Assignments - Settings.&lt;br /&gt;
&lt;br /&gt;
=4. Configurarea pinilor de intrare/ieșire=&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adăugarea fișierului de constrângeri (Pin Assignments)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
În timpul compilării, compilatorul Quartus II alege pinii FPGA pe care vor fi conectate intrările și ieșirile circuitului nostru. &lt;br /&gt;
Placa DE1 are conexiunile deja făcute între pinii FPGA și alte componente de pe placă, prin urmare nu putem folosi decât anumiți pini, conform acestor conexiuni. &lt;br /&gt;
Pentru intrările circuitelor proiectate de noi putem folosi cele 10 comutatoare și cele butoane ale plăcii.&lt;br /&gt;
Pentru ieșiri putem folosi cele 18 leduri (10 leduri roșii și 8 leduri verzi) și afișajul 7 segmente.&lt;br /&gt;
&lt;br /&gt;
De exemplu, vom lega intrarea in0 la switch-urile SW0 - SW3, intrarea in1 la switch-urile SW4 - SW7 și ieșirea out la ledurile LEDR0 - LEDR4.&lt;br /&gt;
Consultați tabelul din documentația plăcii pentru corespondența pinilor.&lt;br /&gt;
&lt;br /&gt;
Asignarea pinilor se face folosind Assignment Editor sau Pin Planner. Selectați Assignments -&amp;gt; Assignment Editor. Se va deschide o fereastră ca cea din imaginea următoare:&lt;br /&gt;
&lt;br /&gt;
În acest editor, trebuie să scriem toate porturile circuitului și pinii la care le conectăm.&lt;br /&gt;
Este mai simplu să facem această asociere în Pin Planner, unde trebuie să modificăm doar coloana „Location”. Observați că modificările făcute în Pin Planner se salveză automat în Assignement Editor.&lt;br /&gt;
&lt;br /&gt;
Placa DE1 are asignări fixe de pini. Terminarea unui design poate ajuta utilizatorul prin folosirea acelorași asignări de pini pentru proiecte viitoare. Se poate încărca un fișieri de Pin Assignments selectând Assignments -&amp;gt; Import Assignments. (Se poate utiliza fișierul cu toate asignările pinilor de pe placa DE1 – DE1_pin_assignments.csv , editând denumirile). Salvați modificările.&lt;br /&gt;
După asignarea pinilor rezultatul va arăta ca în imaginea de mai jos:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Recompilați utilizând butonul Start Compilation și așteptați rezultatul compilării.&lt;br /&gt;
&lt;br /&gt;
=5. Programarea plăcii=&lt;br /&gt;
&lt;br /&gt;
Etapa de programare a plăcii FPGA se desfășoară în felul următor: &lt;br /&gt;
&lt;br /&gt;
Porniți placa folosind butonul roșu.&lt;br /&gt;
&lt;br /&gt;
Atenție: asigurați-vă în acest moment că placa este pornită (cablul de alimentare este conectat, cablul USB este conectat, butonul roșu apăsat, Switch-ul RUN/PROG este pe poziția RUN). &lt;br /&gt;
&lt;br /&gt;
Selectați Tools -&amp;gt; Programmer (sau apăsați pe butonul Programmer) pentru a ajunge la fereastra din figura următoare:&lt;br /&gt;
&lt;br /&gt;
În partea de sus, trebuie să aveți selectat USB-Blaster și Modul JTAG.&lt;br /&gt;
&lt;br /&gt;
Dacă USB-Blaster nu este selectat automat, apăsați pe butonul Hardware Setup și selectați USB-Blaster în fereastra care apare.&lt;br /&gt;
&lt;br /&gt;
Dacă nu apare nici un fișier în fereastră apăsați butonul Add File și selectați fișierul Adder.sof (Acest fișier este creat de compilator). Îl găsiți în folderul proiectului, în folderul Output Files.&lt;br /&gt;
&lt;br /&gt;
Asigurați-vă ca device-ul selectat este EP2C20F484 (în jumătatea de jos a ecranului).&lt;br /&gt;
&lt;br /&gt;
Acum puteți apăsa butonul Start și veți aștepta programarea plăcii. În colțul din dreapta sus al ferestrei aveți un indicator de progres.&lt;br /&gt;
&lt;br /&gt;
Erorile în această fază se pot datora faptului că nu ați setat corect dispozitul în proiect (se poate corecta această setare greșită în meniul Assignements/Device.&lt;br /&gt;
&lt;br /&gt;
După ce programarea a fost finalizată puteți testa funcționarea corectă circuitului utilizând Switch-urile SW0-SW7 și observând rezultatele sumatorului pe ledurile roșii LEDR0-LEDR4.&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=SDA_Lucrarea_5&amp;diff=4684</id>
		<title>SDA Lucrarea 5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=SDA_Lucrarea_5&amp;diff=4684"/>
		<updated>2016-05-12T21:22:01Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: /* Săptămâna 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;În acest laborator se vor implementa mulțimi cu funcții hash și arbori binari.&lt;br /&gt;
&lt;br /&gt;
= Mulțimea =&lt;br /&gt;
&lt;br /&gt;
 Mulțimea este o structură de date abstractă care stochează o colecție de elemente unice în care ordinea nu contează.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:set.png]]&lt;br /&gt;
&lt;br /&gt;
Mulțimea are următoarele proprietăți:&lt;br /&gt;
# Datele sunt plasate într-o ordine oarecare stabilită arbitrar de structură.&lt;br /&gt;
# Numărul de elemente ce poate fi stocat de structură este nelimitat.&lt;br /&gt;
# Elementele stocate în mulțime sunt de același fel.&lt;br /&gt;
# Mulțimea poate conține doar elemente unice, în baza unei funcții definite de egalitate. Altfel spus, dacă două elemente sunt egale din punctul de vedere al mulțimii, ele nu pot fi ambele conținute de mulțime.&lt;br /&gt;
&lt;br /&gt;
Mulțimea suportă următoarele operații de bază:&lt;br /&gt;
# Interogarea numărului de elemente din mulțime.&lt;br /&gt;
# Verificarea dacă mulțimea este goală.&lt;br /&gt;
# Adăugarea unui element în mulțime (&amp;#039;&amp;#039;put&amp;#039;&amp;#039;).&lt;br /&gt;
# Verificarea dacă un element există în mulțime (&amp;#039;&amp;#039;contains&amp;#039;&amp;#039;).&lt;br /&gt;
# Eliminarea unui element din mulțime (&amp;#039;&amp;#039;remove&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica egalitatea a două elemente vom defini o funcție &amp;lt;code&amp;gt;equals&amp;lt;/code&amp;gt; care va întoarce 1 dacă cele două argumente sunt egale și 0 dacă nu. Această funcție trebuie să existe pentru orice implementare de mulțime, atunci când elementele nu sunt valori ce pot fi comparate cu operatorul implicit ==:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia verifica daca valorile value1 si value2 sunt egale.&lt;br /&gt;
 * @param value1 prima valoare de comparat.&lt;br /&gt;
 * @param value2 a doua valoare de comparat.&lt;br /&gt;
 * @return 1 daca cele doua valori sunt egale si 0 in rest.&lt;br /&gt;
 */&lt;br /&gt;
char equals(T value1, T value2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea de mulțimi cu funcții hash  ==&lt;br /&gt;
&lt;br /&gt;
 O funcție hash este o funcție care ia ca argument un șir de bytes de orice dimensiune și întoarce un șir de bytes &lt;br /&gt;
 de dimensiune fixă ce poartă numele de valoare de hash, cod hash sau pur și simplu hash.&lt;br /&gt;
&lt;br /&gt;
Definiția unei funcții hash este strâns legată de definiția funcției &amp;lt;code&amp;gt;equals&amp;lt;/code&amp;gt; astfel încât dacă două elemente e1 și e2 sunt considerate egale (&amp;lt;code&amp;gt;equals(e1, e1) == 1&amp;lt;/code&amp;gt;), atunci obligatoriu &amp;lt;code&amp;gt;hash(e1) == hash(e2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Tipul de date și funcțiile de bază ===&lt;br /&gt;
&lt;br /&gt;
În continuare vom prezenta un exemplu de mulțime pentru elemente de tip &amp;quot;persoană&amp;quot; implementată cu funcții hash. În primul rând vom defini structura ce memorează datele legate de o persoană:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
    char firstName[30];&lt;br /&gt;
    char lastName[30];&lt;br /&gt;
    char idNumber[9]; // seria si numarul de buletin&lt;br /&gt;
    char address[255];&lt;br /&gt;
    char birthday[11];&lt;br /&gt;
    char cnp[14];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a implementa o funcție hash pentru variabilele de tip &amp;lt;code&amp;gt;struct Person&amp;lt;/code&amp;gt;, avem întâi nevoie să definim operația de egalitate. O persoană își poate schimba numele, buletinul și adresa, și pot exista mai multe persoane cu aceeași dată de naștere, dar ceea ce identifică clar o persoană este codul numeric personal (CNP). Deci vom defini funcția &amp;lt;code&amp;gt;equals&amp;lt;/code&amp;gt; să întoarcă 1 dacă cnp-urile celor două argumente de tip &amp;lt;code&amp;gt;struct Person&amp;lt;/code&amp;gt; sunt identice:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce 1 daca CNP-urile celor doua persoane sunt egale.&lt;br /&gt;
 * @param person1 prima persoana de comparat.&lt;br /&gt;
 * @param person2 a doua persoana de comparat.&lt;br /&gt;
 * @return 1 daca CNP-urile celor doua persoane sunt identice.&lt;br /&gt;
 */&lt;br /&gt;
char equals(struct Person person1, struct Person person2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mai departe definim funcția hash pentru o Persoană.&lt;br /&gt;
&lt;br /&gt;
 Pentru a putea implementa o mulțime cu funcții hash trebuie ca hash-ul maxim să fie o valoare rezonabilă pentru a putea aloca memorie cu dimensiunea valorii respective.&lt;br /&gt;
&lt;br /&gt;
Din motivul de mai sus, și pentru a micșora posibilitatea unei coliziuni de hash ce va micșora performanța structurii, ieșirea funcției hash va fi un număr între 0 și 999999 obținut din ultimele 6 cifre ale CNP-ului convertite din text în număr (pentru conversie puteți folosi funcția [http://www.cplusplus.com/reference/cstdlib/atoi/ atoi]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functie hash pentru structurile de tip Person.&lt;br /&gt;
 * @param person peroana pentru care se doreste codul hash.&lt;br /&gt;
 * @return codul hash al persoanei person&lt;br /&gt;
 */&lt;br /&gt;
unsigned hash(struct Person person);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În continuare vom utiliza pentru implementarea unui Hash Set o structură de date de tip secvență împlementată cu liste (LinkedList) și vom folosi funcțiile deja definite de la laboratoarele anterioare:&lt;br /&gt;
* [[Fișier:linkedList.h]]&lt;br /&gt;
* [[Fișier:linkedList.c]]&lt;br /&gt;
&lt;br /&gt;
=== Structura &amp;lt;code&amp;gt;HashSet&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Pentru stocarea datelor necesare mulțimii, definim următoarea structură:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAX_HASH 1000000&lt;br /&gt;
struct HashSet {&lt;br /&gt;
    struct LinkedList array[MAX_HASH]; // un vector de liste, una pentru fiecare valoare posibila de hash&lt;br /&gt;
    unsigned size; // numarul de elemente din multime&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crearea unui &amp;lt;code&amp;gt;HashSet&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Pentru crearea unui &amp;lt;code&amp;gt;HashSet&amp;lt;/code&amp;gt;, se definește următoarea funcție:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia creeaza un hashSet nou si intoarce adresa de memorie alocata.&lt;br /&gt;
 * @return un pointer la o structura de tip HashSet.&lt;br /&gt;
 */&lt;br /&gt;
struct HashSet * createHashSet();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru crearea unui &amp;lt;code&amp;gt;HashSet&amp;lt;/code&amp;gt; se urmează următorii pași:&lt;br /&gt;
# Se alocă memorie pentru un element de tip &amp;lt;code&amp;gt;struct HashSet&amp;lt;/code&amp;gt; folosind funcția corectă pentru reseta memoria la alocare (scrierea ei cu 0).&lt;br /&gt;
# Se inițializează &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; cu 0.&lt;br /&gt;
# Se întoarce adresa elementului de tip &amp;lt;code&amp;gt;struct HashSet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(MAX_HASH)&lt;br /&gt;
&lt;br /&gt;
=== Interogarea numărului de elemente din mulțime ===&lt;br /&gt;
&lt;br /&gt;
Pentru interogarea numărului de elemente din mulțime definim:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce numarul de elemente din multime.&lt;br /&gt;
 * @param set multimea a carei dimensiuni este ceruta.&lt;br /&gt;
 * @return numarul de elemente din multime.&lt;br /&gt;
 */&lt;br /&gt;
unsigned hashSetSize(struct HashSet * set);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcția va întoarce valoarea din câmpul &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; din structură.&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
&lt;br /&gt;
Pentru a afla dacă mulțimea este goală definim:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce 1 dacă mulțimea nu conține nici un element.&lt;br /&gt;
 * @param set multimea de interes.&lt;br /&gt;
 * @return 1 dacă mulțimea este goală, 0 în rest.&lt;br /&gt;
 */&lt;br /&gt;
char hashSetIsEmpty(struct HashSet * set);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcția va întoarce 1 dacă valoarea din câmpul &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; este 0.&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
&lt;br /&gt;
=== Adăugarea unui element în mulțime ===&lt;br /&gt;
&lt;br /&gt;
Pentru operația de adăugare se definește următoarea funcție:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia adauga elementul dat in multime daca acesta nu exista. Daca&lt;br /&gt;
 *  exista deja, functia nu are nici un efect.&lt;br /&gt;
 * @param set multimea in care trebuie adaugat elementul.&lt;br /&gt;
 * @param person elementul ce trebuie adaugta.&lt;br /&gt;
 */&lt;br /&gt;
void hashSetPut(struct HashSet * set, struct Person person);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adăugarea se realizează în felul următor:&lt;br /&gt;
# Se aplică funcția hash pe variabila &amp;lt;code&amp;gt;person&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Folosind valoarea obținută se accesează lista de pe poziția hash-ului din &amp;lt;code&amp;gt;array&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Se folosește funcția &amp;lt;code&amp;gt;linkedListSearch&amp;lt;/code&amp;gt; pentru a verifica dacă &amp;lt;code&amp;gt;person&amp;lt;/code&amp;gt; există în listă (funcția &amp;lt;code&amp;gt;linkedListSearch&amp;lt;/code&amp;gt; trebuie re-implementată pentru a se folosi de funcția &amp;lt;code&amp;gt;equals&amp;lt;/code&amp;gt; pentru compararea elementelor).&lt;br /&gt;
# Dacă valoarea întoarsă este -1 atunci &amp;lt;code&amp;gt;person&amp;lt;/code&amp;gt; se adaugă în listă și &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; se incrementează cu 1.&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(1) best case (fără coliziuni), O(1) average case pentru număr mai mic de 1000000 de persoane, O(n) worst case (același hash pentru poate persoanele).&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(1)&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; Deoarece vectorul &amp;lt;code&amp;gt;array&amp;lt;/code&amp;gt; conține variabile de tip &amp;lt;code&amp;gt;struct LinkedList&amp;lt;/code&amp;gt; și nu pointeri, pentru a folosi funcțiile definite în &amp;#039;&amp;#039;&amp;#039;linkedList.h&amp;#039;&amp;#039;&amp;#039; e necesară obținerea adresei variabilei de tip &amp;lt;code&amp;gt;struct LinkedList&amp;lt;/code&amp;gt; folosind operatorul &amp;amp;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Eliminarea unui element din mulțime ===&lt;br /&gt;
&lt;br /&gt;
Pentru operația de eliminare se definește următoarea funcție:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia elimina elementul dat din multime daca acesta exista. Daca&lt;br /&gt;
 *  nu exista, functia nu are nici un efect.&lt;br /&gt;
 * @param set multimea din care trebuie eliminat elementul.&lt;br /&gt;
 * @param person elementul ce trebuie eliminat.&lt;br /&gt;
 */&lt;br /&gt;
void hashSetRemove(struct HashSet * set, struct Person person);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eliminarea se realizează în felul următor:&lt;br /&gt;
# Se aplică funcția hash pe variabila &amp;lt;code&amp;gt;person&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Folosind valoarea obținută se accesează lista de pe poziția hash-ului din &amp;lt;code&amp;gt;array&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Se folosește funcția &amp;lt;code&amp;gt;linkedListSearch&amp;lt;/code&amp;gt; pentru a verifica dacă &amp;lt;code&amp;gt;person&amp;lt;/code&amp;gt; există în listă.&lt;br /&gt;
# Dacă valoarea întoarsă este diferită de -1 atunci se folosește funcția &amp;lt;code&amp;gt;linkedListDelete&amp;lt;/code&amp;gt; pentru a șterge elementul de pe poziția respectivă și size se decrementează cu 1.&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(1) best case (fără coliziuni), O(1) average case pentru număr mai mic de 1000000 de persoane, O(n) worst case (același hash pentru poate persoanele).&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
&lt;br /&gt;
=== Verificarea dacă un element există în mulțime ===&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica dacă un element există în mulțime, se definește următoarea funcție:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce 1 daca elementul specificat exista in multime.&lt;br /&gt;
 * @param set multimea in care se cauta elementul.&lt;br /&gt;
 * @param person elementul cautat.&lt;br /&gt;
 * @return 1 daca elementul exista in multime, 0 daca nu.&lt;br /&gt;
 */&lt;br /&gt;
char hashSetContains(struct HashSet * set, struct Person person);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verificarea unui element dacă este sau nu în mulțime se realizează în felul următor:&lt;br /&gt;
# Se aplică funcția hash pe variabila &amp;lt;code&amp;gt;person&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Folosind valoarea obținută se accesează lista de pe poziția hash-ului din &amp;lt;code&amp;gt;array&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Se folosește funcția &amp;lt;code&amp;gt;linkedListSearch&amp;lt;/code&amp;gt; pentru a verifica dacă &amp;lt;code&amp;gt;person&amp;lt;/code&amp;gt; există în listă.&lt;br /&gt;
# Dacă valoarea întoarsă este diferită de -1 atunci se întoarce 1, altfel se întoarce 0.&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(1) best case (fără coliziuni), O(1) average case pentru număr mai mic de 1000000 de persoane, O(n) worst case (același hash pentru poate persoanele).&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
&lt;br /&gt;
=== Ștergerea unui &amp;lt;code&amp;gt;HashSet&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Pentru dezalocarea unui &amp;lt;code&amp;gt;HashSet&amp;lt;/code&amp;gt;, se definește următoarea funcție:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia sterge hash set-ul specificat.&lt;br /&gt;
 * @param set hash set-ul ce trebuie sters.&lt;br /&gt;
 */&lt;br /&gt;
void deleteHashSet(struct HashSet * set);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru ștergerea unui &amp;lt;code&amp;gt;HashSet&amp;lt;/code&amp;gt; se urmează următorii pași:&lt;br /&gt;
# Se iterează peste tot &amp;lt;code&amp;gt;array&amp;lt;/code&amp;gt;-ul, ștergându-se toate nodurile din toate listele.&lt;br /&gt;
# Se șterge memoria alocată pentru structura de tip &amp;lt;code&amp;gt;HashSet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(MAX_HASH)&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
&lt;br /&gt;
== Implementarea mulțimilor cu arbori binari de căutare (Binary Search Trees - BST) ==&lt;br /&gt;
&lt;br /&gt;
 Pentru a putea plasa elemente într-o mulțime implementată cu arbori binari de căutare, pe mulțimea acestor elemente &lt;br /&gt;
 trebuie să existe definită o relație de ordine.&lt;br /&gt;
&lt;br /&gt;
 Mulțimile implementate cu arbori binari de căutare, în plus față proprietățile mulțimilor definite mai sus, garantează &lt;br /&gt;
 faptul că elementele sunt plasate în ordine în mulțime (Ordered Set).&lt;br /&gt;
&lt;br /&gt;
Din acest motiv trebuie definită o funcție care să compare două elemente. Vom numi această funcție &amp;lt;code&amp;gt;compare&amp;lt;/code&amp;gt; și se ca comporta similar cu funcția &amp;lt;code&amp;gt;strcmp&amp;lt;/code&amp;gt;: va întoarce o valoare pozitivă dacă primul element e mai mare, o valoare negativă dacă al doilea element e mai mare și 0 dacă elementele sunt egale:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Compara value1 cu value2 si intoarce o valoare corespunzătoare.&lt;br /&gt;
 * @param value1 prima valoare de comparat.&lt;br /&gt;
 * @param value2 a doua valoare de comparat.&lt;br /&gt;
 * @return o valoare pozitivă dacă primul element e mai mare, o &lt;br /&gt;
 *  valoare negativă dacă al doilea element e mai mare și 0 dacă&lt;br /&gt;
 *  elementele sunt egale.&lt;br /&gt;
 */&lt;br /&gt;
int compare(T value1, T value2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tipul de date și funcțiile de bază ===&lt;br /&gt;
&lt;br /&gt;
În continuare vom prezenta un exemplu de mulțime pentru elemente de tip &amp;quot;server&amp;quot; implementată cu arbori binari de căutare. În primul rând vom defini structura ce memorează datele legate de un server:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct Server {&lt;br /&gt;
    /* Numele server-ului in retea - sir de caractere */&lt;br /&gt;
    char hostname[30]; &lt;br /&gt;
    &lt;br /&gt;
    /* Adresa IP a server-ului o secvență de 4 valori numerice între 0 și 255 (ex: 192.168.1.10) */&lt;br /&gt;
    unsigned char ipv4[4];&lt;br /&gt;
&lt;br /&gt;
    /* Adresa hardware pentru adaptorul de retea - o secventa de 6 bytes, in hexa (ex: 60:57:18:6e:a8:e8). */&lt;br /&gt;
    char hardwareAddress[6];&lt;br /&gt;
&lt;br /&gt;
    /* Tipul procesorului - sir de caractere. */&lt;br /&gt;
    char cpuType[10];&lt;br /&gt;
&lt;br /&gt;
    /* Frecventa procesorului in Gigahertz. */&lt;br /&gt;
    float cpuFrequencyGhz;&lt;br /&gt;
&lt;br /&gt;
    /* Cantitatea de memorie RAM, in Gigabytes. */&lt;br /&gt;
    float ramMemoryGigaBytes;&lt;br /&gt;
&lt;br /&gt;
    /* Capacitatea discului, in Terabytes. */&lt;br /&gt;
    float diskCapacityTeraBytes;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a implementa o mulțime de servere folosind BST, avem întâi nevoie să definim funcția de comparare a două servere. Vom considera că din toate datele definite în structura de mai sus, cea care se schimbă cel mai greu este adresa fizică (hardware) a adaptorului de rețea care de cele mai multe ori este plasat pe placa de bază. Astfel, vom defini funcția compare astfel încât să compare cele două &amp;lt;code&amp;gt;hardwareAddress&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Compara server1 cu server2 si intoarce o valoare corespunzătoare.&lt;br /&gt;
 * @param server1 primul server de comparat.&lt;br /&gt;
 * @param server2 al doilea server de comparat.&lt;br /&gt;
 * @return o valoare pozitivă dacă primul server are o adresa hardware mai mare, o &lt;br /&gt;
 *  valoare negativă dacă al doilea server are o adresa hardware mai mare și 0 dacă&lt;br /&gt;
 *  adresele hardware sunt egale.&lt;br /&gt;
 */&lt;br /&gt;
int compare(struct Server server1, struct Server server1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structurile &amp;lt;code&amp;gt;TreeSet&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;TreeNode&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Pentru stocarea datelor necesare mulțimii, definim următoarele structuri:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct TreeNode {&lt;br /&gt;
    struct TreeNode * parent;&lt;br /&gt;
    struct TreeNode * left;&lt;br /&gt;
    struct TreeNode * right;&lt;br /&gt;
    struct Server value;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TreeSet {&lt;br /&gt;
    struct TreeNode * root;&lt;br /&gt;
    unsigned size;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Crearea unui &amp;lt;code&amp;gt;TreeSet&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Pentru a crea un &amp;lt;code&amp;gt;TreeSet&amp;lt;/code&amp;gt;, definim următoarea funcție:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia aloca memorie si intoarce un pointer la un nou TreeSet.&lt;br /&gt;
 * @return adresa noului TreeSet.&lt;br /&gt;
 */&lt;br /&gt;
struct TreeSet * createTreeSet();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcția trebuie să realizeze următorii pași:&lt;br /&gt;
# Se alocă memorie pentru un nou &amp;lt;code&amp;gt;struct TreeSet&amp;lt;/code&amp;gt; ce trebuie inițializată automat cu 0.&lt;br /&gt;
# Se întoarce adresa alocată.&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
&lt;br /&gt;
=== Interogarea numărului de elemente din mulțime ===&lt;br /&gt;
&lt;br /&gt;
Pentru interogarea numărului de elemente din mulțime definim:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce numarul de elemente din multime.&lt;br /&gt;
 * @param set multimea a carei dimensiuni este ceruta.&lt;br /&gt;
 * @return numarul de elemente din multime.&lt;br /&gt;
 */&lt;br /&gt;
unsigned treeSetSize(struct TreeSet * set);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcția va întoarce valoarea din câmpul &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; din structură.&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
&lt;br /&gt;
Pentru a afla dacă mulțimea este goală definim:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce 1 dacă mulțimea nu conține nici un element.&lt;br /&gt;
 * @param set multimea de interes.&lt;br /&gt;
 * @return 1 dacă mulțimea este goală, 0 în rest.&lt;br /&gt;
 */&lt;br /&gt;
char treeSetIsEmpty(struct TreeSet * set);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcția va întoarce 1 dacă valoarea din câmpul &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; este 0.&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
&lt;br /&gt;
=== Adăugarea unui element în mulțime ===&lt;br /&gt;
&lt;br /&gt;
Pentru operația de adăugare se definește următoarea funcție:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia adauga elementul dat in multime daca acesta nu exista. Daca&lt;br /&gt;
 *  exista deja, functia nu are nici un efect.&lt;br /&gt;
 * @param set multimea in care trebuie adaugat elementul.&lt;br /&gt;
 * @param server elementul ce trebuie adaugat.&lt;br /&gt;
 */&lt;br /&gt;
void treeSetPut(struct TreeSet * set, struct Server server);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adăugarea se realizează în felul următor:&lt;br /&gt;
# Dacă dimensiunea mulțimii este 0, se alocă memorie pentru un nod nou &amp;lt;code&amp;gt;newNode&amp;lt;/code&amp;gt; în care:&lt;br /&gt;
#* &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; va lua valoarea lui &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;left&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;right&amp;lt;/code&amp;gt; vor lua valoarea &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Câmpul &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; ia valoarea &amp;lt;code&amp;gt;newNode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; se incrementează și funcția se încheie.&lt;br /&gt;
# Altfel, se definește o variabilă de tip nod numită &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt; care se inițializează cu valoarea câmpului &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Într-o buclă infinită se realizează următorii pași:&lt;br /&gt;
## Dacă rezultatul funcției &amp;lt;code&amp;gt;compare&amp;lt;/code&amp;gt; cu argumentele &amp;lt;code&amp;gt;tmpNode-&amp;gt;value&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; este 0 (elementele sunt egale), funcția se încheie.&lt;br /&gt;
## Dacă rezultatul funcției &amp;lt;code&amp;gt;compare&amp;lt;/code&amp;gt; cu argumentele &amp;lt;code&amp;gt;tmpNode-&amp;gt;value&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; este mai mare ca 0 și &amp;lt;code&amp;gt;tmpNode-&amp;gt;left&amp;lt;/code&amp;gt; este diferit de &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, atunci &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt; ia valoarea &amp;lt;code&amp;gt;tmpNode-&amp;gt;left&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Dacă rezultatul funcției &amp;lt;code&amp;gt;compare&amp;lt;/code&amp;gt; cu argumentele &amp;lt;code&amp;gt;tmpNode-&amp;gt;value&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; este mai mare ca 0 și &amp;lt;code&amp;gt;tmpNode-&amp;gt;left&amp;lt;/code&amp;gt; este egal cu &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, atunci se alocă memorie pentru un nod &amp;lt;code&amp;gt;newNode&amp;lt;/code&amp;gt; nou după regula de la 1, &amp;lt;code&amp;gt;newNode-&amp;gt;parent&amp;lt;/code&amp;gt; ia valoarea lui &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tmpNode-&amp;gt;left&amp;lt;/code&amp;gt; ia valoarea lui &amp;lt;code&amp;gt;newNode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; se incrementează cu 1 și funcția se încheie.&lt;br /&gt;
## Dacă rezultatul funcției &amp;lt;code&amp;gt;compare&amp;lt;/code&amp;gt; cu argumentele &amp;lt;code&amp;gt;tmpNode-&amp;gt;value&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; este mai mică ca 0 și &amp;lt;code&amp;gt;tmpNode-&amp;gt;right&amp;lt;/code&amp;gt; este diferit de &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, atunci &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt; ia valoarea &amp;lt;code&amp;gt;tmpNode-&amp;gt;right&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Dacă rezultatul funcției &amp;lt;code&amp;gt;compare&amp;lt;/code&amp;gt; cu argumentele &amp;lt;code&amp;gt;tmpNode-&amp;gt;value&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; este mai mică ca 0 și &amp;lt;code&amp;gt;tmpNode-&amp;gt;right&amp;lt;/code&amp;gt; este egal cu &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, atunci se alocă memorie pentru un nod &amp;lt;code&amp;gt;newNode&amp;lt;/code&amp;gt; nou după regula de la 1, &amp;lt;code&amp;gt;newNode-&amp;gt;parent&amp;lt;/code&amp;gt; ia valoarea lui &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tmpNode-&amp;gt;right&amp;lt;/code&amp;gt; ia valoarea lui &amp;lt;code&amp;gt;newNode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; se incrementează cu 1 și funcția se încheie.&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(1) best case (element adăugat imediat sub rădăcină), O(log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;n) average case (arbore echilibrat), O(n) worst case (arbore dezechilibrat).&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
&lt;br /&gt;
=== Eliminarea unui element din mulțime ===&lt;br /&gt;
&lt;br /&gt;
Pentru operația de eliminare se definește următoarea funcție:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia elimina elementul dat din multime daca acesta exista. Daca&lt;br /&gt;
 *  nu exista, functia nu are nici un efect.&lt;br /&gt;
 * @param set multimea din care trebuie eliminat elementul.&lt;br /&gt;
 * @param server elementul ce trebuie eliminat.&lt;br /&gt;
 */&lt;br /&gt;
void treeSetRemove(struct TreeSet * set, struct Server server);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eliminarea se realizează în felul următor (o descriere în imagini poate fi găsită [http://www.algolist.net/Data_structures/Binary_search_tree/Removal aici] - nu încercați să folosiți codul de pe acea pagină deoarece structurile din platformă diferă și în plus limbajul este C++ și nu va compila):&lt;br /&gt;
# Folosind un pointer la nod &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt;, se folosește tehnica de la căutarea unui element în mulțime pentru a identifica nodul care memorează serverul &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt;. Dacă funcția ajunge la frunze fără a găsi server-ul căutat, funcția se încheie (server-ul nu există în mulțime). Altfel, &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt; va fi pointer la nodul ce trebuie eliminat. În plus, se va defini o variabilă de tip char &amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt; care la fiecare avansare în arbore va lua valoarea -1 dacă avansarea s-a făcut spre stânga și 1 dacă s-a făcut spre dreapta, astfel încât atunci când &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt; este pointer la nodul ce trebuie șters, &amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt; va fi 1 sau -1 în funcție de poziția nodului &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt; față de nodul părinte.&lt;br /&gt;
# Dacă &amp;lt;code&amp;gt;tmpNode-&amp;gt;left&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;tmpNode-&amp;gt;right&amp;lt;/code&amp;gt; sunt ambele &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; (nodul ce trebuie șters este frunză), atunci, dacă &amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt; este -1, &amp;lt;code&amp;gt;tmpNode-&amp;gt;parent-&amp;gt;left&amp;lt;/code&amp;gt; ia valoarea &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, altfel &amp;lt;code&amp;gt;tmpNode-&amp;gt;parent-&amp;gt;right&amp;lt;/code&amp;gt; ia valoarea &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, nodul &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt; este dezalocat, &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; se decrementează și funcția se încheie.&lt;br /&gt;
# Dacă &amp;lt;code&amp;gt;tmpNode-&amp;gt;left&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;tmpNode-&amp;gt;right&amp;lt;/code&amp;gt; este diferit de &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; (nodul are un singur copil), atunci, dacă &amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt; este -1, &amp;lt;code&amp;gt;tmpNode-&amp;gt;parent-&amp;gt;left&amp;lt;/code&amp;gt; ia valoarea &amp;lt;code&amp;gt;tmpNode-&amp;gt;right&amp;lt;/code&amp;gt;, altfel &amp;lt;code&amp;gt;tmpNode-&amp;gt;parent-&amp;gt;right&amp;lt;/code&amp;gt; ia valoarea &amp;lt;code&amp;gt;tmpNode-&amp;gt;right&amp;lt;/code&amp;gt;, nodul &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt; este dezalocat, &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; se decrementează și funcția se încheie.&lt;br /&gt;
# Dacă &amp;lt;code&amp;gt;tmpNode-&amp;gt;left&amp;lt;/code&amp;gt; este diferit de &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;tmpNode-&amp;gt;right&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; (nodul are un singur copil), atunci, dacă &amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt; este -1, &amp;lt;code&amp;gt;tmpNode-&amp;gt;parent-&amp;gt;left&amp;lt;/code&amp;gt; ia valoarea &amp;lt;code&amp;gt;tmpNode-&amp;gt;left&amp;lt;/code&amp;gt;, altfel &amp;lt;code&amp;gt;tmpNode-&amp;gt;parent-&amp;gt;right&amp;lt;/code&amp;gt; ia valoarea &amp;lt;code&amp;gt;tmpNode-&amp;gt;left&amp;lt;/code&amp;gt;, nodul &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt; este dezalocat, &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; se decrementează și funcția se încheie.&lt;br /&gt;
# Dacă &amp;lt;code&amp;gt;tmpNode-&amp;gt;left&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;tmpNode-&amp;gt;right&amp;lt;/code&amp;gt; sunt ambele diferite de &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; (nodul ce trebuie șters are doi copii), atunci:&lt;br /&gt;
#* Se foloște un al doilea pointer la nod numit &amp;lt;code&amp;gt;minSubtreeNode&amp;lt;/code&amp;gt; cu care se caută cea mai mică valoare din subarborele din dreapta nodului &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* &amp;lt;code&amp;gt;tmpNode-&amp;gt;value&amp;lt;/code&amp;gt; ia valoarea &amp;lt;code&amp;gt;minSubtreeNode-&amp;gt;value&amp;lt;/code&amp;gt; apoi se șterge &amp;lt;code&amp;gt;minSubtreeNode&amp;lt;/code&amp;gt; după aceleași reguli de mai sus.&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(1) best case (element găsit imediat sub rădăcină), O(log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;n) average case (arbore echilibrat), O(n) worst case (arbore dezechilibrat).&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
&lt;br /&gt;
=== Verificarea dacă un element există în mulțime ===&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica dacă un element există în mulțime, se definește următoarea funcție:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce 1 daca elementul specificat exista in multime.&lt;br /&gt;
 * @param set multimea in care se cauta elementul.&lt;br /&gt;
 * @param server elementul cautat.&lt;br /&gt;
 * @return 1 daca elementul exista in multime, 0 daca nu.&lt;br /&gt;
 */&lt;br /&gt;
char treeSetContains(struct TreeSet * set, struct Server server);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verificarea unui element dacă este sau nu în mulțime se realizează în felul următor:&lt;br /&gt;
# Se definește un pointer la nod numit &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt; care se inițializează cu valoarea lui &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Cât timp &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt; este diferit de &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* Dacă rezultatul funcției &amp;lt;code&amp;gt;compare&amp;lt;/code&amp;gt; cu argumentele &amp;lt;code&amp;gt;tmpNode-&amp;gt;value&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; este 0, se întoarce valoarea 1 (elementul a fost găsit).&lt;br /&gt;
#* Dacă rezultatul funcției &amp;lt;code&amp;gt;compare&amp;lt;/code&amp;gt; cu argumentele &amp;lt;code&amp;gt;tmpNode-&amp;gt;value&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; este pozitiv, &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt; ia valoarea lui &amp;lt;code&amp;gt;tmpNode-&amp;gt;left&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Dacă rezultatul funcției &amp;lt;code&amp;gt;compare&amp;lt;/code&amp;gt; cu argumentele &amp;lt;code&amp;gt;tmpNode-&amp;gt;value&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; este negativ, &amp;lt;code&amp;gt;tmpNode&amp;lt;/code&amp;gt; ia valoarea lui &amp;lt;code&amp;gt;tmpNode-&amp;gt;right&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Când s-a ieșit din buclă, se întoarce 0 (elementul nu a fost găsit).&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(1) best case (element găsit în rădăcină), O(log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;n) average case (arbore echilibrat), O(n) worst case (arbore dezechilibrat).&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
&lt;br /&gt;
=== Ștergerea unui &amp;lt;code&amp;gt;TreeSet&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Pentru dezalocarea unui &amp;lt;code&amp;gt;TreeSet&amp;lt;/code&amp;gt;, se definește următoarea funcție:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Functia sterge tree set-ul specificat.&lt;br /&gt;
 * @param set tree set-ul ce trebuie sters.&lt;br /&gt;
 */&lt;br /&gt;
void deleteTreeSet(struct TreeSet * set);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru ștergerea unui &amp;lt;code&amp;gt;TreeSet&amp;lt;/code&amp;gt; se urmează următorii pași:&lt;br /&gt;
# Se realizează o parcurgere în post-ordine (stânga-dreapta-rădăcină) și se șterg toate nodurile din arbore.&lt;br /&gt;
# Se șterge memoria alocată pentru structura de tip &amp;lt;code&amp;gt;TreeSet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;timp&amp;#039;&amp;#039;&amp;#039;: O(n)&lt;br /&gt;
* Complexitate în &amp;#039;&amp;#039;&amp;#039;spațiu&amp;#039;&amp;#039;&amp;#039;: O(1)&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
== Săptămâna 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Dându-se fișierele [[Fișier:linkedList.h]], [[Fișier:linkedList.c]] și header-ele &amp;lt;code&amp;gt;hashSet.h&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;person.h&amp;lt;/code&amp;gt; de mai jos, implementați toate funcțiile definite în două fișiere sursă numite &amp;lt;code&amp;gt;person.c&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;hashSet.c&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; &amp;lt;code&amp;gt;person.h&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef PERSON_H&lt;br /&gt;
#define PERSON_H&lt;br /&gt;
&lt;br /&gt;
struct Person {&lt;br /&gt;
    char firstName[30];&lt;br /&gt;
    char lastName[30];&lt;br /&gt;
    char idNumber[9]; // seria si numarul de buletin&lt;br /&gt;
    char address[255];&lt;br /&gt;
    char birthday[11];&lt;br /&gt;
    char cnp[14];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce 1 daca CNP-urile celor doua persoane sunt egale.&lt;br /&gt;
 * @param person1 prima persoana de comparat.&lt;br /&gt;
 * @param person2 a doua persoana de comparat.&lt;br /&gt;
 * @return 1 daca CNP-urile celor doua persoane sunt identice.&lt;br /&gt;
 */&lt;br /&gt;
char equals(struct Person person1, struct Person person2);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Functie hash pentru structurile de tip Person.&lt;br /&gt;
 * @param person peroana pentru care se doreste codul hash.&lt;br /&gt;
 * @return codul hash al persoanei person&lt;br /&gt;
 */&lt;br /&gt;
unsigned hash(struct Person person);&lt;br /&gt;
&lt;br /&gt;
#define T struct Person&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;
&amp;lt;li&amp;gt; &amp;lt;code&amp;gt;hashset.h&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef HASH_SET_H&lt;br /&gt;
#define HASH_SET_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;linkedList.h&amp;quot;&lt;br /&gt;
#include &amp;quot;person.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define MAX_HASH 1000000&lt;br /&gt;
&lt;br /&gt;
struct HashSet {&lt;br /&gt;
    struct LinkedList array[MAX_HASH]; // un vector de liste, una pentru fiecare valoare posibila de hash&lt;br /&gt;
    unsigned size; // numarul de elemente din multime&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia creeaza un hashSet nou si intoarce adresa de memorie alocata.&lt;br /&gt;
 * @return un pointer la o structura de tip HashSet.&lt;br /&gt;
 */&lt;br /&gt;
struct HashSet * createHashSet();&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce numarul de elemente din multime.&lt;br /&gt;
 * @param set multimea a carei dimensiuni este ceruta.&lt;br /&gt;
 * @return numarul de elemente din multime.&lt;br /&gt;
 */&lt;br /&gt;
unsigned hashSetSize(struct HashSet * set);&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce 1 dacă mulțimea nu conține nici un element.&lt;br /&gt;
 * @param set multimea de interes.&lt;br /&gt;
 * @return 1 dacă mulțimea este goală, 0 în rest.&lt;br /&gt;
 */&lt;br /&gt;
char hashSetIsEmpty(struct HashSet * set);&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia adauga elementul dat in multime daca acesta nu exista. Daca&lt;br /&gt;
 *  exista deja, functia nu are nici un efect.&lt;br /&gt;
 * @param set multimea in care trebuie adaugat elementul.&lt;br /&gt;
 * @param person elementul ce trebuie adaugta.&lt;br /&gt;
 */&lt;br /&gt;
void hashSetPut(struct HashSet * set, struct Person person);&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia elimina elementul dat din multime daca acesta exista. Daca&lt;br /&gt;
 *  nu exista, functia nu are nici un efect.&lt;br /&gt;
 * @param set multimea din care trebuie eliminat elementul.&lt;br /&gt;
 * @param person elementul ce trebuie eliminat.&lt;br /&gt;
 */&lt;br /&gt;
void hashSetRemove(struct HashSet * set, struct Person person);&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce 1 daca elementul specificat exista in multime.&lt;br /&gt;
 * @param set multimea in care se cauta elementul.&lt;br /&gt;
 * @param person elementul cautat.&lt;br /&gt;
 * @return 1 daca elementul exista in multime, 0 daca nu.&lt;br /&gt;
 */&lt;br /&gt;
char hashSetContains(struct HashSet * set, struct Person person);&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia sterge hash set-ul specificat.&lt;br /&gt;
 * @param set hash set-ul ce trebuie sters.&lt;br /&gt;
 */&lt;br /&gt;
void deleteHashSet(struct HashSet * set);&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;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Scrieți o altă sursă &amp;lt;code&amp;gt;main.c&amp;lt;/code&amp;gt; în care să definiți o funcție &amp;lt;code&amp;gt;struct Person readFromKeyboard()&amp;lt;/code&amp;gt; și o altă funcție &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să citească persoane de la tastatură până când numele introdus este egal cu &amp;quot;-&amp;quot; și care să afișeze câte persoane diferite au fost introduse.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Săptămâna 2 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Dându-se header-ele &amp;lt;code&amp;gt;treeSet.h&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;server.h&amp;lt;/code&amp;gt; de mai jos, implementați toate funcțiile definite în două fișiere sursă numite &amp;lt;code&amp;gt;server.c&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;treeSet.c&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; &amp;lt;code&amp;gt;server.h&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef SERVER_H&lt;br /&gt;
#define SERVER_H&lt;br /&gt;
&lt;br /&gt;
struct Server {&lt;br /&gt;
    /* Numele server-ului in retea - sir de caractere */&lt;br /&gt;
    char hostname[30]; &lt;br /&gt;
 &lt;br /&gt;
    /* Adresa IP a server-ului o secvență de 4 valori numerice între 0 și 255 (ex: 192.168.1.10) */&lt;br /&gt;
    unsigned char ipv4[4];&lt;br /&gt;
 &lt;br /&gt;
    /* Adresa hardware pentru adaptorul de retea - o secventa de 6 bytes, in hexa (ex: 60:57:18:6e:a8:e8). */&lt;br /&gt;
    char hardwareAddress[6];&lt;br /&gt;
 &lt;br /&gt;
    /* Tipul procesorului - sir de caractere. */&lt;br /&gt;
    char cpuType[10];&lt;br /&gt;
 &lt;br /&gt;
    /* Frecventa procesorului in Gigahertz. */&lt;br /&gt;
    float cpuFrequencyGhz;&lt;br /&gt;
 &lt;br /&gt;
    /* Cantitatea de memorie RAM, in Gigabytes. */&lt;br /&gt;
    float ramMemoryGigaBytes;&lt;br /&gt;
 &lt;br /&gt;
    /* Capacitatea discului, in Terabytes. */&lt;br /&gt;
    float diskCapacityTeraBytes;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Compara server1 cu server2 si intoarce o valoare corespunzătoare.&lt;br /&gt;
 * @param server1 primul server de comparat.&lt;br /&gt;
 * @param server2 al doilea server de comparat.&lt;br /&gt;
 * @return o valoare pozitivă dacă primul server are o adresa hardware mai mare, o &lt;br /&gt;
 *  valoare negativă dacă al doilea server are o adresa hardware mai mare și 0 dacă&lt;br /&gt;
 *  adresele hardware sunt egale.&lt;br /&gt;
 */&lt;br /&gt;
int compare(struct Server server1, struct Server server2);&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;
&amp;lt;li&amp;gt; &amp;lt;code&amp;gt;treeSet.h&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef TREE_SET_H&lt;br /&gt;
#define TREE_SET_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;server.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
struct TreeNode {&lt;br /&gt;
    struct TreeNode * parent;&lt;br /&gt;
    struct TreeNode * left;&lt;br /&gt;
    struct TreeNode * right;&lt;br /&gt;
    struct Server value;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct TreeSet {&lt;br /&gt;
    struct TreeNode * root;&lt;br /&gt;
    unsigned size;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia aloca memorie si intoarce un pointer la un nou TreeSet.&lt;br /&gt;
 * @return adresa noului TreeSet.&lt;br /&gt;
 */&lt;br /&gt;
struct TreeSet * createTreeSet();&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce numarul de elemente din multime.&lt;br /&gt;
 * @param set multimea a carei dimensiuni este ceruta.&lt;br /&gt;
 * @return numarul de elemente din multime.&lt;br /&gt;
 */&lt;br /&gt;
unsigned treeSetSize(struct TreeSet * set);&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce 1 dacă mulțimea nu conține nici un element.&lt;br /&gt;
 * @param set multimea de interes.&lt;br /&gt;
 * @return 1 dacă mulțimea este goală, 0 în rest.&lt;br /&gt;
 */&lt;br /&gt;
char treeSetIsEmpty(struct TreeSet * set);&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia adauga elementul dat in multime daca acesta nu exista. Daca&lt;br /&gt;
 *  exista deja, functia nu are nici un efect.&lt;br /&gt;
 * @param set multimea in care trebuie adaugat elementul.&lt;br /&gt;
 * @param server elementul ce trebuie adaugat.&lt;br /&gt;
 */&lt;br /&gt;
void treeSetPut(struct TreeSet * set, struct Server server);&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia elimina elementul dat din multime daca acesta exista. Daca&lt;br /&gt;
 *  nu exista, functia nu are nici un efect.&lt;br /&gt;
 * @param set multimea din care trebuie eliminat elementul.&lt;br /&gt;
 * @param server elementul ce trebuie eliminat.&lt;br /&gt;
 */&lt;br /&gt;
void treeSetRemove(struct TreeSet * set, struct Server server);&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia intoarce 1 daca elementul specificat exista in multime.&lt;br /&gt;
 * @param set multimea in care se cauta elementul.&lt;br /&gt;
 * @param server elementul cautat.&lt;br /&gt;
 * @return 1 daca elementul exista in multime, 0 daca nu.&lt;br /&gt;
 */&lt;br /&gt;
char treeSetContains(struct TreeSet * set, struct Server server);&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Functia sterge tree set-ul specificat.&lt;br /&gt;
 * @param set tree set-ul ce trebuie sters.&lt;br /&gt;
 */&lt;br /&gt;
void deleteTreeSet(struct TreeSet * set);&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;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Scrieți o altă sursă &amp;lt;code&amp;gt;main.c&amp;lt;/code&amp;gt; în care să definiți o funcție &amp;lt;code&amp;gt;struct Server readFromKeyboard()&amp;lt;/code&amp;gt; și o altă funcție &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să citească informații legate de servere de la tastatură până când &amp;#039;&amp;#039;hostname&amp;#039;&amp;#039;-ul introdus este egal cu &amp;quot;-&amp;quot; și care să afișeze câte servere diferite au fost introduse.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Seminar_5&amp;diff=4589</id>
		<title>CID Seminar 5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Seminar_5&amp;diff=4589"/>
		<updated>2016-04-21T05:11:43Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: /* Exerciţiul 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;În acest seminar veţi învăţa să descrieţi memorii de tip Random Access (RAM) și Read Only (ROM) folosind vectori de date în Verilog.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cuvinte cheie&amp;#039;&amp;#039;&amp;#039;: memorie, vector, RAM, ROM&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sintaxă Verilog&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;$readmemh&amp;#039;&amp;#039;, &amp;#039;&amp;#039;$readmemb&amp;#039;&amp;#039;, &amp;#039;&amp;#039;parameter&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Memoriile reprezintă structuri fizice de stocare de date, caracterizate prin două măsuri:&lt;br /&gt;
* numărul de cuvinte N;&lt;br /&gt;
* numărul de biți ai fiecărui cuvânt stocat, W;&lt;br /&gt;
Capacitatea de stocare este NxW biți.&lt;br /&gt;
&lt;br /&gt;
Astfel, veți întâlni deseori terminologia de memorie 1024x8b, ceea ce descrie o memorie cu o capacitate de 1024 de cuvinte a 8 biți fiecare. &lt;br /&gt;
&lt;br /&gt;
Memoriile pot fi clasificate în funcție de capacitatea lor de a suprascrie valorile stocate cu valori noi:&lt;br /&gt;
* memoriile Random-Access (RAM) permit și operații de suprascriere a conținutului cuvintelor stocate;&lt;br /&gt;
* memoriile Read-Only (ROM) permit doar citirea.&lt;br /&gt;
&lt;br /&gt;
De asemenea, memoriile pot fi clasificate în funcție de caracterul lor sincron sau asincron:&lt;br /&gt;
* asincron – citirea se face imediat ce se prezintă comanda;&lt;br /&gt;
* sincrone – toate operațiile sunt sincronizate de unul din fronturile semnalului de ceas.&lt;br /&gt;
Din considerente de implementare fizică, scrierea este întotdeauna sincronă.&lt;br /&gt;
&lt;br /&gt;
Orice memorie RAM are următorul set de semnale de interfață, care formează un &amp;#039;&amp;#039;&amp;#039;port&amp;#039;&amp;#039;&amp;#039; al memoriei:&lt;br /&gt;
* adresa – intrare – specifică indexul cuvântului pe care îl dorim accesat, pentru scriere sau citire;&lt;br /&gt;
* datele pentru scriere – intrare – datele care vor fi scrise la indexul specificat de adresă;&lt;br /&gt;
* datele citite – ieșire – datele care au fost citite de la indexul specificat de adresă;&lt;br /&gt;
* comanda de scriere – intrare – specifică dacă se dorește scriere sau citire;&lt;br /&gt;
* semnalul de ceas.&lt;br /&gt;
&lt;br /&gt;
În funcție de configurația portului de memorie, unele din aceste semnale pot lipsi. De exemplu, un port Write-Only nu va avea date citite. Asemănător, un port Read-Only nu va avea date pentru scriere. Un port Read-Write va avea toate aceste semnale. Adresa este semnalul care definește portul memorie, și nu poate lipsi.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații&amp;#039;&amp;#039;&amp;#039;: A nu se face confuzia între porturi ale unui modul Verilog și porturile unei memorii.&lt;br /&gt;
&lt;br /&gt;
==Exerciţiul 1==&lt;br /&gt;
&lt;br /&gt;
Să se descrie în Verilog o memorie RAM cu citire asincronă, de 128 de cuvinte de 8 biți, cu un singur port Read-Write. Se va simula funcționarea memoriei scriind în trei locații de memorie, apoi citind din cele trei locații de memorie și comparând valorile citite cu valorile scrise anterior.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explicaţie suplimentară&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se va folosi un vector de date în Verilog:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
reg [W-1:0] memory[0:N-1];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În acest exemplu am declarat un vector de date numit memory, care este format din cuvinte de W biți, și are N elemente. Elementele vectorului sunt accesate în următorul fel:&lt;br /&gt;
* memory[3] reprezintă elementul 4 al vectorului memory, element care are W biți;&lt;br /&gt;
* memory[3][0] reprezintă bitul zero al elementului 4 al vectorului memory.&lt;br /&gt;
&lt;br /&gt;
==Exerciţiul 2== &lt;br /&gt;
Să se implementeze o memorie RAM de 128 de cuvinte de 8 biţi cu două porturi: un port de scriere şi un port de citire sincronă. Să se testeze această memorie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explicaţie suplimentară&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a putea modifica dimensiunile unei memorii şi a refolosi codul Verilog putem declara ca parametri numărul de biţi de adresă, numărul de locaţii şi dimensiunea cuvântului. &lt;br /&gt;
Sintaxa este, de exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
	parameter adr_size = 7; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exerciţiul 3==&lt;br /&gt;
&lt;br /&gt;
Să se implementeze o memorie FIFO cu 32 locaţii a câte 4 biţi folosind memoria de la exerciţiul 2. Să se testeze funcţionarea acestei memorii, scriind şi citind succesiv diferite valori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explicaţie suplimentară&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Memoria FIFO (first-in-first-out) permite citirea datelor numai în ordinea în care au fost scrise. Operaţiile de scriere şi citire nu se fac la orice adresă, prin urmare o memorie FIFO nu are intrare de adresă.&lt;br /&gt;
&lt;br /&gt;
Porturile acestei memorii sunt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module memorie_fifo( &lt;br /&gt;
		input clock, rst, // semnal de ceas si reset&lt;br /&gt;
		input write_enable, // comanda de scriere&lt;br /&gt;
		read_enable, // comanda de citire&lt;br /&gt;
		input [word_width-1 : 0] data_in, // date de intrare, aici pe 4 biti&lt;br /&gt;
		output [word_width-1 : 0] data_out, // date de iesire, aici pe 4 biti&lt;br /&gt;
		output reg empty, // semnal de iesire care este activ cand memoria este goala&lt;br /&gt;
		           full, // semnal de iesire care este activ cand memoria este plina&lt;br /&gt;
		output reg [adr_size:0] fifo_counter 	//nr locatii folosite, maxim 32&lt;br /&gt;
&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exerciţiul 4==&lt;br /&gt;
&lt;br /&gt;
Să se iniţializeze conţinutul memoriei de la exerciţiul 3 cu ajutorul funcţiilor de sistem &amp;#039;&amp;#039;$readmemh()&amp;#039;&amp;#039; și &amp;#039;&amp;#039;$readmemb()&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explicatii suplimentare&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcțiile se folosesc conform următorului șablon:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
	$readmem[hb](&amp;quot;fișier de inițializare&amp;quot;,numele vectorului,adr1,adr2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcțiile citesc date în format hexazecimal sau binar din fisierul specificat, și le încarcă în vectorul specificat din modulul Verilog, începând de la adresa adr1 până la adresa adr2.&lt;br /&gt;
&lt;br /&gt;
Conținutul fișierului &amp;#039;&amp;#039;memorie.txt&amp;#039;&amp;#039; (32 de valori de 4 biți, in hexazecimal, una sub alta):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
a&lt;br /&gt;
f&lt;br /&gt;
...&lt;br /&gt;
b&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==TEMA==&lt;br /&gt;
&lt;br /&gt;
1. Să se modifice codul de la exerciţiul 1 pentru a implementa o memorie cu citire sincronă.&lt;br /&gt;
&lt;br /&gt;
2. Să se adauge memoriei descrise anterior (TEMA 1) un al doilea port de citire sincronă (Read-Only), şi să se simuleze citirea simultană din două locaţii diferite ale memoriei, prin cele două porturi, cât şi situaţia în care unul din porturi scrie în o locaţie de memorie în timp ce al doilea port citeşte din aceeaşi locaţie de memorie.&lt;br /&gt;
&lt;br /&gt;
3. Să se implementeze o memorie 512x8b folosind patru memorii 128x8b, conectate corespunzător.&lt;br /&gt;
&lt;br /&gt;
4. Să se implementeze o memorie 128x16b folosind două memorii 128x8b, conectate corespunzător.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Reguli de bună practică==&lt;br /&gt;
&lt;br /&gt;
Se vor grupa semnalele de interfață ale porturilor, și se vor denumi astfel încât să fie ușor identificabile ca fiind parte din portul respectiv (e.g., addrA, dataA, weA, addrB, dataB, weB)&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Input.txt&amp;diff=4508</id>
		<title>Fișier:Input.txt</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Input.txt&amp;diff=4508"/>
		<updated>2016-04-08T06:15:36Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Lab_Lucrarea_1&amp;diff=4408</id>
		<title>CID Lab Lucrarea 1</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Lab_Lucrarea_1&amp;diff=4408"/>
		<updated>2016-03-10T15:44:29Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: /* Submiterea Exercițiilor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Noțiuni și cunoștințe necesare ==&lt;br /&gt;
&lt;br /&gt;
* [[Introducere în sinteza pe FPGA. Xilinx ISE]]&lt;br /&gt;
* [[Tutorial Xilinx ISE (13.4)| Utilizarea programului de sinteză Xilinx ISE]]&lt;br /&gt;
* [[Introducere. Verilog HDL și ModelSim#Introducere în Circuite Digitale|Logică booleană și sisteme de numerație]]&lt;br /&gt;
* Noțiuni de sintaxă [[Verilog]]&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
Creați un proiect nou în Xilinx ISE, pentru dispozitivul FPGA de pe placa Nexys2. Creați un fișier sursă Verilog în cadrul proiectului, și copiați modulul următor în fisier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module OrGate(&lt;br /&gt;
	output out,&lt;br /&gt;
	input in1,&lt;br /&gt;
	input in2&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign out = in1 | in2;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creați un fișier de constrângeri și scrieți constrângerile necesare pentru ca intrările și ieșirile circuitului să fie conectate astfel:&lt;br /&gt;
* in1 conectat la SW0:  &amp;quot;NET in1 LOC=G18;&amp;quot;&lt;br /&gt;
* in2 conectat la SW7:  &amp;quot;NET in2 LOC=R17;&amp;quot;&lt;br /&gt;
* out conectat la LD3:  &amp;quot;NET out LOC=K14;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Implementați proiectul pe placa Nexys și observați funcționalitatea circuitului descris de proiectul Xilinx ISE.&lt;br /&gt;
&lt;br /&gt;
== Exercițiul 1 ==&lt;br /&gt;
&lt;br /&gt;
Realizați descrierea în Verilog a modulului cu intrările &amp;#039;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039; și ieșirea &amp;#039;&amp;#039;&amp;#039;q&amp;#039;&amp;#039;&amp;#039;, cu funcționalitatea conform schemei alăturate. Implementați circuitul pe placa Nexys2 conectând intrările a, b, c la SW2, SW4, respectiv SW6, iar ieșirea q la LD2.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:lab1_ex1.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Exercițiul 2 ==&lt;br /&gt;
&lt;br /&gt;
Realizați descrierea în Verilog a modulului cu intrările &amp;#039;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039; și ieșirea &amp;#039;&amp;#039;&amp;#039;q&amp;#039;&amp;#039;&amp;#039;, cu funcționalitatea conform schemei alăturate. Implementați circuitul pe placa Nexys2 conectând intrările a, b, c la SW3, SW4, respectiv SW7, iar ieșirea q la LD7.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:lab1_ex2.gif]]&lt;br /&gt;
&lt;br /&gt;
== Exercițiul 3 ==&lt;br /&gt;
&lt;br /&gt;
Realizați descrierea în Verilog a modulului cu intrările &amp;#039;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039; și ieșirea &amp;#039;&amp;#039;&amp;#039;q&amp;#039;&amp;#039;&amp;#039;, cu funcționalitatea conform schemei alăturate. Implementați circuitul pe placa Nexys2 conectând intrările a, b, c la SW1, SW6, respectiv SW7, iar ieșirea q la LD3.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:lab1_ex3.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Exercițiul 4 ==&lt;br /&gt;
&lt;br /&gt;
Realizați descrierea în Verilog a modulului cu intrările &amp;#039;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039; și ieșirea &amp;#039;&amp;#039;&amp;#039;q&amp;#039;&amp;#039;&amp;#039;, cu funcționalitatea conform schemei alăturate. Implementați circuitul pe placa Nexys2 conectând intrările a, b, c la SW3, SW4, respectiv SW5, iar ieșirea q la LD6.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:lab1_ex4.png]]&lt;br /&gt;
&lt;br /&gt;
== Exercițiul 5 ==&lt;br /&gt;
&lt;br /&gt;
Realizați descrierea în Verilog a modulului cu intrările &amp;#039;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039; și ieșirea &amp;#039;&amp;#039;&amp;#039;q&amp;#039;&amp;#039;&amp;#039;, cu funcționalitatea conform schemei alăturate. Implementați circuitul pe placa Nexys2 conectând intrările a, b, c la SW5, SW6, respectiv SW7, iar ieșirea q la LD4.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:lab1_ex5.png]]&lt;br /&gt;
&lt;br /&gt;
== Exercițiul 6 ==&lt;br /&gt;
&lt;br /&gt;
Realizați descrierea în Verilog a modulului cu intrările &amp;#039;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039; și ieșirea &amp;#039;&amp;#039;&amp;#039;q&amp;#039;&amp;#039;&amp;#039;, cu funcționalitatea conform schemei alăturate. Implementați circuitul pe placa Nexys2 conectând intrările a, b, c la SW5, SW4, respectiv SW1, iar ieșirea q la LD5.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:lab1_ex6.png]]&lt;br /&gt;
&lt;br /&gt;
== Submiterea Exercițiilor ==&lt;br /&gt;
&lt;br /&gt;
Se va rezolva un singur exercițiu, ce va fi selectat de cadrul didactic. Pentru notare, se vor submite următoarele fișiere, către adresa de e-mail indicată de cadrul didactic &amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt; și către adresa cid_lab_homework@dcae.pub.ro&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O arhivă &amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;zip&amp;lt;span&amp;gt; ce va conține:&lt;br /&gt;
*Un fișier Verilog cu extensia .v care conține descrierea Verilog a circuitului&lt;br /&gt;
*Un fișier de constrângeri, cu extensia .ucf&lt;br /&gt;
*Un fișier de tip proiect Xilinx ISE, cu extensia .xise&lt;br /&gt;
Atentie, arhiva va contine doar cele 3 fisiere (fara directoare).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Subiectul mesajului de e-mail trebuie să respecte formatul &amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;[Nume]_[Prenume]_[Grupa]_[Numărul Exercițiului]&amp;lt;/span&amp;gt;. De exemplu Petrica_Lucian_423B_2&lt;br /&gt;
&lt;br /&gt;
== Recomandări pentru cadrele didactice ==&lt;br /&gt;
&lt;br /&gt;
* Parcurgerea tutorialului [[Introducere în sinteza pe FPGA. Xilinx ISE]], răspunzându-se la întrebările studenților.&lt;br /&gt;
* Implementarea unui exemplu de proiect Xilinx ISE, parcurgându-se tutorialul [[Tutorial Xilinx ISE (13.4)|Xilinx ISE]].&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=POO_Lab_Lucrarea_5&amp;diff=4143</id>
		<title>POO Lab Lucrarea 5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=POO_Lab_Lucrarea_5&amp;diff=4143"/>
		<updated>2015-12-17T14:39:43Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: /* Cerințe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Noțiuni și cunoștințe necesare ==&lt;br /&gt;
&lt;br /&gt;
* [[Paradigma Obiect-Orientare; Clase și obiecte]]&lt;br /&gt;
* [[Noțiuni despre Java]]&lt;br /&gt;
* [[Realizarea și execuția unui program Java]]&lt;br /&gt;
* [[Sintaxa limbajului Java; Structura lexicală a unui program]]&lt;br /&gt;
* [[Convenții de programare]]&lt;br /&gt;
* [[Noțiuni avansate de programare obiect-orientată]]&lt;br /&gt;
* [[Java Application Programming Interface (API)]]&lt;br /&gt;
* [[Stream-uri de Input/Output]]&lt;br /&gt;
* [[Tratarea excepțiilor]]&lt;br /&gt;
* [[Serializarea obiectelor]]&lt;br /&gt;
* [[Socket-uri de rețea]]&lt;br /&gt;
* [[Programare concurentă - fire de execuție (Threads)]]&lt;br /&gt;
&lt;br /&gt;
== Cerințe ==&lt;br /&gt;
&lt;br /&gt;
# Modificați clasa &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.client.ClientPeer&amp;lt;/code&amp;gt; scrisă la tema anterioară, transformând-o într-un fir de execuție care în paralel cu firul principal de execuție, să citească obiecte de tip &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.structs.Message&amp;lt;/code&amp;gt; dinspre server și să le afișeze pe ecran. Acest thread, odată instanțiat, trebuie pornit de către clasa &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.client.TextClient&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Modificați clasa &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.ServerPeer&amp;lt;/code&amp;gt; scrisă la tema anterioară, transformând-o într-un fir de execuție. Acest fir nou de execuție trebuie să citească obiectele de tip &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.structs.Message&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.structs.PrivateMessage&amp;lt;/code&amp;gt; de la clientul asociat și să le distribuie corect la ceilalți clienți.&lt;br /&gt;
# Adăugați clasei &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.structs.Message&amp;lt;/code&amp;gt; o metodă getter publică pentru expeditor, numită &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;String getSender()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a putea retransmite mesajele celorlalți clienți, clasa &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.ServerPeer&amp;lt;/code&amp;gt; trebuie să aibă o metodă publică &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;void sendMessage(Message)&amp;lt;/code&amp;gt; care să serializeze obiectul primit ca argument către clientul conectat.&lt;br /&gt;
# Pentru a putea folosi clasa &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.Server&amp;lt;/code&amp;gt; să trimită mesajele clienților conectați, clasa &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.ServerPeer&amp;lt;/code&amp;gt; trebuie să aibă o referință la clasa &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.Server&amp;lt;/code&amp;gt;. Astfel, modificați constructorul clasei &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.ServerPeer&amp;lt;/code&amp;gt; astfel încât să aibă semnătura &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;ServerPeer(Server, Socket)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a putea trimite corect mesajele private, clasa &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.ServerPeer&amp;lt;/code&amp;gt; trebuie să aibă o metodă publică numită &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;String getUsername()&amp;lt;/code&amp;gt; care să întoarcă numele client-ului conectat la acel ServerPeer. Numele este stocat în clasă într-un câmp privat, care se actualizează la fiecare mesaj primit, extrăgând din mesaj numele expeditorului.&lt;br /&gt;
# Modificați clasa &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.Server&amp;lt;/code&amp;gt; scrisă la tema anterioară, astfel încât la conectarea unui client, aceasta să creeze un nou &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.ServerPeer&amp;lt;/code&amp;gt; pe care să-l pornească ca Thread, apoi să revină în metoda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;ServerSocket.accept()&amp;lt;/code&amp;gt;, așteptând o nouă conexiune.&lt;br /&gt;
# Clasa &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.Server&amp;lt;/code&amp;gt; trebuie acum să fie instanțiabilă. Adăugați un constructor care să ia ca argument port-ul TCP pe care server-ul sa asculte și numărul maxim de clienți posibili. În acest constructor trebuie instanțiat obiectul de tip &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;ServerSocket&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Bucla cu apelul metodei &amp;#039;&amp;#039;&amp;#039;accept&amp;#039;&amp;#039;&amp;#039; din &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.Server&amp;lt;/code&amp;gt; trebuie acum să fie mutată într-o metodă separată a clasei &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.Server&amp;lt;/code&amp;gt; numită &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;void listen()&amp;lt;/code&amp;gt;. &lt;br /&gt;
# În metoda &amp;#039;&amp;#039;&amp;#039;main&amp;#039;&amp;#039;&amp;#039; din &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.Server&amp;lt;/code&amp;gt; trebuie să rămână o instanțiere de obiect &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.config.ServerConfig&amp;lt;/code&amp;gt;, o instanțiere de obiect &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.Server&amp;lt;/code&amp;gt; și un apel de metodă &amp;#039;&amp;#039;&amp;#039;listen()&amp;#039;&amp;#039;&amp;#039;, cu blocurile &amp;#039;&amp;#039;&amp;#039;try-catch&amp;#039;&amp;#039;&amp;#039; necesare.&lt;br /&gt;
# Clasa &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.Server&amp;lt;/code&amp;gt; trebuie să mai conțină două metode, &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;void dispatch(Message)&amp;lt;/code&amp;gt; și &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;void removeClient(ServerPeer)&amp;lt;/code&amp;gt;. Prima este apelată de către obiectele de tip &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.ServerPeer&amp;lt;/code&amp;gt; cu mesajele primite de la clienți, și are rolul de a le trimite mai departe, către ceilalți clienți. A doua metodă este apelată când un client de deconectează (voit sau datorită unei erori), pentru a fi elimiat din listă.&lt;br /&gt;
# Server-ul nu trebuie să accepte o conexiune dacă numărul de clienți conectați este deja egal cu proprietatea MAX_CLIENTS citită din fișierul &amp;#039;&amp;#039;server.conf&amp;#039;&amp;#039; de către &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.server.config.ServerConfig&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Atenție care metode trebuie să fie sincronizate (pentru a trece testele, nu folosiți blocuri &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt;, ci declarați toată metoda sincronizată).&lt;br /&gt;
# Administrați excepțiile astfel încât dacă apare o eroare de conexiune, server-ul să fie robust și să continue să servească corect ceilalți clienți conectați și să poate accepta un client nou în locul clientului pierdut. &lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Obiectele de tip &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.structs.Message&amp;lt;/code&amp;gt; se trimit tuturor clienților conectați. Obiectele de tip &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;seriaf.poo.structs.PrivateMessage&amp;lt;/code&amp;gt; se trimit doar către expeditor și către destinatar.&lt;br /&gt;
* Clasa &amp;#039;&amp;#039;&amp;#039;Server&amp;#039;&amp;#039;&amp;#039; ar trebui să păstreze o listă cu toți clienții conectați (cu obiectele de tip &amp;#039;&amp;#039;&amp;#039;ServerPeer&amp;#039;&amp;#039;&amp;#039;). Pentru acest lucru vă puteți folosi de clasa [http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html java.util.ArrayList].&lt;br /&gt;
* Această listă trebuie să fie menținută în sensul că noii clienți trebuie adăugați, iar clienții deconectați trebuie eliminați.&lt;br /&gt;
* Pentru a verifica dacă un obiect e instanță a unei clase anume, puteți folosi operatorul &amp;#039;&amp;#039;&amp;#039;instanceof&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Object o = ois.readOject();&lt;br /&gt;
if(o instanceof String){&lt;br /&gt;
    String s = (String)o;&lt;br /&gt;
    System.out.print(s);&lt;br /&gt;
}else{&lt;br /&gt;
    System.out.print(&amp;quot;The object is not a String!&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3931</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=3931"/>
		<updated>2015-12-03T21:50:47Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: &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>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3774</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=3774"/>
		<updated>2015-11-21T12:04:02Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: Pagină nouă: == Obiective ==     în urma acestui laborator, studentul va fi capabil să:  *înțeleagă cum funcționează șirurile de caractere  *facă operații cu ș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;
î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; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &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;
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;
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;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. 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);&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;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&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;
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;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&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;
char sir_de_caractere[MAX_SIZE];&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;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_4&amp;diff=3635</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=3635"/>
		<updated>2015-10-30T09:15:22Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: /* Exerciții */&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; |Numar de biti&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; | -127 ... 128&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;
&lt;br /&gt;
* signed&lt;br /&gt;
* unsigned&lt;br /&gt;
* long&lt;br /&gt;
* short&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; |Numar de biti&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; | 16&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 ... 4,294,967,295 &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;
== 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 Celisus, ș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>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_4&amp;diff=3634</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=3634"/>
		<updated>2015-10-30T07:00:33Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: /* Operatori */&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; |Numar de biti&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; | -127 ... 128&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;
&lt;br /&gt;
* signed&lt;br /&gt;
* unsigned&lt;br /&gt;
* long&lt;br /&gt;
* short&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; |Numar de biti&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; | 16&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 ... 4,294,967,295 &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;
== 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 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 Celisus, ș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>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_4&amp;diff=3633</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=3633"/>
		<updated>2015-10-29T23:53:44Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: /* Operatori */&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; |Numar de biti&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; | -127 ... 128&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;
&lt;br /&gt;
* signed&lt;br /&gt;
* unsigned&lt;br /&gt;
* long&lt;br /&gt;
* short&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; |Numar de biti&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; | 16&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 0 ... 4,294,967,295 &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;
== 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;
=== 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;
&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 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 Celisus, ș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>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_1&amp;diff=3560</id>
		<title>PC Laborator 1</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_1&amp;diff=3560"/>
		<updated>2015-10-09T05:45:53Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: /* Bash */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
&lt;br /&gt;
În urma parcurgerii acestui laborator veți fi capabili:&lt;br /&gt;
&lt;br /&gt;
* să folosiți comenzi de bază în sistemul de operare Linux;&lt;br /&gt;
* să scrieți și compilați programe simple în limbajul C;&lt;br /&gt;
* să utilizați programul Make pentru a compila automat programele scrise.&lt;br /&gt;
&lt;br /&gt;
= Sistemul de operare [https://en.wikipedia.org/wiki/Linux Linux] - programe =&lt;br /&gt;
&lt;br /&gt;
Majoritatea utilizatorilor de Windows pornesc de la premisa că Linux este greu de folosit și că nu pot rula programele cu care sunt obișnuiți în Windows. Cu toate că există, într-adevăr unele aplicații care nu sunt portate și nu pot fi rulate în Linux (cum ar fi o mare parte din jocuri precum și unele platforme foarte specifice de simulare și sinteză), majoritatea aplicațiilor sunt disponibile în Linux. Următoarea listă prezintă alternative ale aplicațiilor tradiționale, care pot fi rulate în Linux:&lt;br /&gt;
&lt;br /&gt;
* browser web: Google Chromium Browser (Chrome), Mozilla Firefox&lt;br /&gt;
* player video: VLC Media PLayer&lt;br /&gt;
* editor foto: Inkscape, Gimp&lt;br /&gt;
* suită office: LibreOffice (alternativă la Microsoft Office), Microsoft Office 365 - online, Google Docs - online&lt;br /&gt;
* real time messenger: Pidgin&lt;br /&gt;
* medii de dezvoltare software: Netbeans, Eclipse, Code::Blocks, IntelliJ&lt;br /&gt;
* procesare de semnal: Matlab, Octave (alternativă la Matlab)&lt;br /&gt;
* sinteză și simulare de circuite digitale: Xilinx ISE, Xilinx Vivado&lt;br /&gt;
&lt;br /&gt;
Pentru anumite programe, este de asemenea posibilă rularea acestora într-un emulator de Windows, numit wine.&lt;br /&gt;
&lt;br /&gt;
== Instalare de programe ==&lt;br /&gt;
&lt;br /&gt;
Instalarea unui program in Linux se face foarte ușor, cu o singură comandă (dacă aplicația este în baza de date a distribuției). Spre exemplu, pentru a instala GNU Octave:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install -y octave&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; Pentru a putea instala o aplicație, este nevoie de acces de tip administrator de sistem. Acest lucru se poate face în două moduri: &lt;br /&gt;
* execuția unei comenzi de către un utilizator care are drept de administrator, folosind comanda &amp;#039;&amp;#039;&amp;#039;sudo&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* execuția comenzii de către utilizatorul &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;root&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt;, care este un cont cu acces nelimitat la toate resursele sistemului; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;ATENȚIE&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt;: Folosiți contul &amp;#039;&amp;#039;&amp;#039;root&amp;#039;&amp;#039;&amp;#039; doar pentru operații de administrare de sistem și deconectați-vă imediat ce ați terminat. Nu dați acces &amp;#039;&amp;#039;&amp;#039;root&amp;#039;&amp;#039;&amp;#039; decât persoanelor în care aveți încredere.   &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Linux [https://en.wikipedia.org/wiki/Bash_(Unix_shell) Bash] =&lt;br /&gt;
&lt;br /&gt;
Noțiunile legate de utilizarea și administrarea sistemului de operare Linux sunt necesare și obligatorii pentru un inginer electronist. În afară de faptul că Linux este un OS open-source stabil și sigur, atractivitatea lui vine în special din posibilitatea de a automatiza procese prin scrierea de scripturi în limbaje de scripting puternice și din faptul că este cel mai răspândit sistem de operare folosit pentru dispozitive embedded. În continuare se vor prezenta noțiuni și comenzi necesare pe parcursul laboratorului de Programarea Calculatoarelor.&lt;br /&gt;
&lt;br /&gt;
Pentru a obține informații legate de utilizarea unei comenzi, în terminalul (consola) Linux se poate da comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;man &amp;lt;comanda&amp;gt;&amp;lt;/code&amp;gt; pentru a deschide manualul la pagina comenzii respective. Odată deschis, se poate naviga cu săgețile sus/ jos și pagina se închide cu tasta &amp;#039;q&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Odată deschis terminalul, prompt-ul de comandă arată de cele mai multe ori în felul următor: &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;
Acesta este format din următoarele componente:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;student&amp;#039;&amp;#039;&amp;#039; reprezintă numele utilizatorului curent și este urmat de caracterul &amp;#039;@&amp;#039; (at);&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;pracsis01&amp;#039;&amp;#039;&amp;#039; reprezintă numele calculatorului (host name) și care ar trebui să fie unic în rețea; în lipsa acestuia va apărea &amp;#039;&amp;#039;&amp;#039;localhost&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;~/Desktop&amp;#039;&amp;#039;&amp;#039; reprezintă directorul curent și este urmat de caracterul &amp;#039;$&amp;#039;&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; Linux este &amp;#039;&amp;#039;&amp;#039;CASE-SENSITIVE&amp;#039;&amp;#039;&amp;#039;, asta înseamnă că se face diferența între literele mari și mici, și în cadrul comenzilor, și în cadrul numelor de fișiere/ directoare.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru un tutorial mai detaliat, ce descrie un număr mai mare de comenzi, puteți vizita http://linuxcommand.org/learning_the_shell.php&lt;br /&gt;
&lt;br /&gt;
== Structura de directoare in Linux ==&lt;br /&gt;
&lt;br /&gt;
Toate fișierele și directoarele în Linux sunt plasate într-o ierarhie de tip arbore, unde directorul din vârf se numește rădăcină (&amp;#039;&amp;#039;root&amp;#039;&amp;#039;) și este reprezentat prin caracterul &amp;#039;&amp;#039;slash&amp;#039;&amp;#039; (/). &lt;br /&gt;
&lt;br /&gt;
 Structura de directoare și fișiere în Linux este descrisă în detaliu [http://www.tecmint.com/linux-directory-structure-and-important-files-paths-explained/ aici].&lt;br /&gt;
&lt;br /&gt;
În cadrul laboratorului de PC, vom lucra în interiorul directorului personal al utilizatorului &amp;#039;&amp;#039;student&amp;#039;&amp;#039;, care este implicit &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;/home/student&amp;lt;/code&amp;gt; (&amp;#039;&amp;#039;slash&amp;#039;&amp;#039; este separatorul de cale în Linux, analog cu &amp;#039;&amp;#039;backslash&amp;#039;&amp;#039; din Windows).&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; Calea până la directorul personal este prescurată în Linux prin caracterul ~ . Astfel, &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;~&amp;lt;/code&amp;gt; este echivalent cu &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;/home/student&amp;lt;/code&amp;gt; iar &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop&amp;lt;/code&amp;gt; este echivalent cu &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;/home/student/Desktop&amp;lt;/code&amp;gt;. În plus, directorul personal al altor utilizatori poate fi construit folosind caracterul ~ și numele utilizatorului. De exemplu &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;~admin&amp;lt;/code&amp;gt; reprezintă calea până la directorul personal al utilizatorului &amp;#039;&amp;#039;admin&amp;#039;&amp;#039;: &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;/home/admin&amp;lt;/code&amp;gt;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instrucțiuni pentru lucrul cu sistemul de fișiere ==&lt;br /&gt;
&lt;br /&gt;
=== Navigare între directoare (cd) ===&lt;br /&gt;
&lt;br /&gt;
Navigarea către un director anume se face folosind comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;cd&amp;lt;/code&amp;gt; (Change Directory). Comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;cd&amp;lt;/code&amp;gt; poate fi folosită în următoarele moduri:&lt;br /&gt;
* navigarea către o cale absolută, care începe cu &amp;#039;&amp;#039;slash&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;~ $&amp;lt;/span&amp;gt; cd /home/student/Desktop&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;
* navigarea către o cale relativă, care nu începe cu &amp;#039;&amp;#039;slash&amp;#039;&amp;#039; și care depinde de directorul curent:&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;~ $&amp;lt;/span&amp;gt; cd Desktop&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;
* navigarea către directorul personal (home directory), prin apelarea comenzii fără alți parametri:&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; cd&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;~ $&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* navigarea către calea anterioară (util când e nevoie să alternați între două directoare), folosind parametrul &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-&amp;lt;/code&amp;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; cd&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;~ $&amp;lt;/span&amp;gt; cd -&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; cd -&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;~ $&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Această comandă va eșua dacă directorul specificat nu există, sau nu aveți acces la el sau la unul directoarele părinte.&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; Pentru a vă întoarce cu un nivel mai sus în ierarhia de directoare, se poate folosi ”..” în loc de numele directorului. De exemplu:&amp;lt;/div&amp;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; cd ../Desktop/../Desktop/../../student/Desktop&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;
&lt;br /&gt;
=== Aflarea directorului curent (pwd) ===&lt;br /&gt;
&lt;br /&gt;
Directorul curent se vede în mod normal în prompt, dar în cazul în care acest prompt nu este vizibil sau a fost modificat, sau directorul curent trebuie utilizat în cadrul unui script, comanda care îl afișează pe acesta pe ecran este &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;pwd&amp;lt;/code&amp;gt; (Print Working Directory).&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; pwd&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;/home/student/Desktop&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Crearea unui director (mkdir) ===&lt;br /&gt;
&lt;br /&gt;
Pentru a crea un director inexistent, se folosește comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;mkdir&amp;lt;/code&amp;gt; (MaKe DIRectory) specificând numele directorului care se vrea creat:&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;~ $&amp;lt;/span&amp;gt; mkdir work&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Această comandă poate eșua dacă nu aveți acces la directorul părinte, dacă directorul părinte nu există, sau dacă directorul care se dorește creat există deja. Pentru a crea un director în situația în care directorul părinte nu există, se poate utiliza fanionul &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-p&amp;lt;/code&amp;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; mkdir -p ~/work/pc/F/group1/ion/lab1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Ștergerea unui fisier sau recursiv, a unui director (rm) ===&lt;br /&gt;
&lt;br /&gt;
Pentru a șterge un fișier, un director gol, sau un director care conține alte fișiere sau subdirectoare, se poate folosi comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;rm&amp;lt;/code&amp;gt; (ReMove) cu diferite fanioane: &lt;br /&gt;
&lt;br /&gt;
* pentru a șterge un fișier:&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; rm program.c&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* pentru a șterge un director, se folosește fanionul -r:&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; mkdir test&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; rm test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   rm: cannot remove ‘test’: Is a directory&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; rm -r test&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;Atenție:&amp;#039;&amp;#039;&amp;#039; Flag-ul &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-r&amp;lt;/code&amp;gt; va șterge tot conținutul directorului, indiferent ce conține acesta, folosiți-l cu mare atenție.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea conținutului directorului curent (ls) ===&lt;br /&gt;
&lt;br /&gt;
Pentru a vedea conținutul directorului curent se poate utiliza comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;ls&amp;lt;/code&amp;gt; (LiSt):&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; ls&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   chromium-browser.desktop  C-Lion.desktop  netbeans-8.0.2.desktop Xilinx XPS 14.7.desktop&lt;br /&gt;
&lt;br /&gt;
Pentru a vedea detalii despre fiecare fișier sau director, se poate folosi flag-ul &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-l&amp;lt;/code&amp;gt;. Comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;ls -l&amp;lt;/code&amp;gt; este atât de utilizată încât în anumite distribuții (Debian/ Ubuntu) are un &amp;#039;&amp;#039;alias&amp;#039;&amp;#039;: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;ll&amp;lt;/code&amp;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; ls -l&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   total 44&lt;br /&gt;
   -rwxr-xr-x  1 student student 12591 Jun  2 16:44 chromium-browser.desktop&lt;br /&gt;
   -rwxr-xr-x  1 student student   136 Aug 20 16:59 C-Lion.desktop&lt;br /&gt;
   -rwxr-xr-x  1 student student   261 Jul  9 16:09 netbeans-8.0.2.desktop&lt;br /&gt;
   -rwxr-xr-x  1 student student   162 Aug 25 13:38 Xilinx XPS 14.7.desktop&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui fișier în consolă (cat) ===&lt;br /&gt;
&lt;br /&gt;
Pentru a vedea conținutul unui fișier text (cum ar fi o sursă C sau un makefile) fără a deschide fișierul pentru editare, se poate utiliza comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;cat&amp;lt;/code&amp;gt; (conCAT):&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; cat /etc/hostname&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;pracsis01&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Copiatul unui fișier sau director (cp) ===&lt;br /&gt;
&lt;br /&gt;
Pentru a copia un fișier sau director, se poate utiliza comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;cp&amp;lt;/code&amp;gt; (CoPy). În cea mai simplă formă, comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;cp&amp;lt;/code&amp;gt; are doi parametri: sursa și apoi destinația, obligatoriu în această ordine. Această comandă se poate folosi în mai multe feluri:&lt;br /&gt;
* copiatul unui fișier dintr-un director în altul:&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; cp /etc/hostname ~/Desktop/&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* copiatul unui fișier dintr-un director în directorul curent:&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; cp /etc/hostname .&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; În timp ce &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;..&amp;lt;/code&amp;gt; reprezintă directorul părinte, &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;.&amp;lt;/code&amp;gt; reprezintă directorul curent.&amp;lt;/div&amp;gt;&lt;br /&gt;
* copiatul unui fișier dintr-un director în altul, schimbându-i numele:&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; cp /etc/hostname ~/Desktop/myhostname&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* copiatul unui director, recursiv, în alt director (se folosește fanionul &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-r&amp;lt;/code&amp;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; cp -r ~/Desktop /tmp/.&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; Această comandă a copiat directorul Desktop al utilizatorului curent în directorul tmp din rădăcină.&amp;lt;/div&amp;gt;&lt;br /&gt;
* copiatul unui director, recursiv, în alt director (se folosește fanionul &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-r&amp;lt;/code&amp;gt;), schimbându-i numele:&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; cp -r ~/Desktop /tmp/MyDesktop&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Mutatul unui fișier sau director (mv) ===&lt;br /&gt;
&lt;br /&gt;
Pentru a muta un fișier sau director, se poate utiliza comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;mv&amp;lt;/code&amp;gt; (MoVe). Analog cu copy, în cea mai simplă formă, comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;mv&amp;lt;/code&amp;gt; are doi parametri: sursa și apoi destinația, obligatoriu în această ordine. Această comandă se poate folosi în mai multe feluri:&lt;br /&gt;
* mutatul unui fișier dintr-un director în altul:&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; mv /etc/hostname ~/Desktop/&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* mutatul unui fișier dintr-un director în directorul curent:&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; mv /etc/hostname .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* mutatul unui fișier dintr-un director în altul, schimbându-i numele:&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; mv /etc/hostname ~/Desktop/myhostname&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* mutatul unui director, recursiv, în alt director (se folosește fanionul &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-r&amp;lt;/code&amp;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; mv -r ~/Desktop /tmp/.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* mutatul unui director, recursiv, în alt director (se folosește fanionul &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-r&amp;lt;/code&amp;gt;), schimbându-i numele:&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; mv -r ~/Desktop /tmp/MyDesktop&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
= Scrierea, compilarea și executarea unui program în C =&lt;br /&gt;
&lt;br /&gt;
== Editarea fișierului sursă ==&lt;br /&gt;
&lt;br /&gt;
În cadrul laboratorului de PC, vom edita programele C într-un editor simplu de text, pentru a ne obișnui cu procesul de compilare și depanare a programelor. Editoarele de text care pot fi folosite sunt:&lt;br /&gt;
* în mod text (din consolă): nano, mcedit, vim&lt;br /&gt;
* în mod grafic: kate, gedit, notepad++&lt;br /&gt;
&lt;br /&gt;
Fișierele C sunt fișiere text în care se scrie programul.&lt;br /&gt;
&lt;br /&gt;
== Generarea fișierului executabil ==&lt;br /&gt;
&lt;br /&gt;
Din fișierul sursă, se genereaza fișierul executabil în mai multe etape, conform schemei de mai jos:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:c_executable_generation.svg]]&lt;br /&gt;
&lt;br /&gt;
Compilatorul de C pe care îl vom folosi se numește [https://gcc.gnu.org/ GNU Compiler Collection] (sau scurt, gcc). Acesta, de fapt, nu este doar compilator, ci este un toolchain complet pentru generarea de fișiere executabile din fișiere surse C. Acesta poate face doar o parte din, sau toate etapele din schema de mai sus, în funcție de fanioanele utilizate. O parte din fanioanele posibile pentru &amp;#039;&amp;#039;&amp;#039;gcc&amp;#039;&amp;#039;&amp;#039; sunt (pentru lista completă studiaţi pagina de manual pentru GCC - man gcc):&lt;br /&gt;
&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;-o&amp;lt;/code&amp;gt; nume_fișier || Numele fișierului de ieşire va fi nume_fişier. În cazul în care această opțiune nu este setată, se va folosi numele implicit (pentru fișiere executabile: a.out - pentru Linux).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-I&amp;lt;/code&amp;gt; cale_către_fișiere_antet || Caută fișiere antet și în calea specificată.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-L&amp;lt;/code&amp;gt; cale_către_biblioteci || Caută fișiere bibliotecă și în calea specificată.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-l&amp;lt;/code&amp;gt; nume_bibliotecă || Link-editează biblioteca nume_bibliotecă. &amp;#039;&amp;#039;&amp;#039;Atenție!!!&amp;#039;&amp;#039;&amp;#039; nume_bibliotecă nu este întotdeauna același cu numele fișierului antet prin care se include această bibliotecă. Spre exemplu, pentru includerea bibliotecii de funcții matematice, fișierul antet este math.h, iar biblioteca este m.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-W&amp;lt;/code&amp;gt; tip_warning || Afișează tipurile de avertismente specificate (Pentru mai multe detalii &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;man gcc&amp;lt;/code&amp;gt; sau &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;gcc –help&amp;lt;/code&amp;gt;). Cel mai folosit tip este all. Este indicat ca la compilarea cu &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-Wall&amp;lt;/code&amp;gt; să nu apară nici un fel de avertismente.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-c&amp;lt;/code&amp;gt; || Compilează și asamblează, dar nu link-editează. Generează fișiere obiect, cu extensia .o.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-S&amp;lt;/code&amp;gt; || Se oprește după faza de compilare, fară să asambleze. Rezultă cod assembler în fișiere cu extensia .s.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-E&amp;lt;/code&amp;gt; || Se oprește după faza de preprocesare, fară să compileze. Rezultă cod C în fișiere cu extensia .c.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-O&amp;lt;/code&amp;gt; [0-3] || Setează nivelul de optimizare, o valoare numerică între 0 și 3, 0 fiind fără optimizare (viteză de execuție minimă, dimensiune mare a executabilului, timp de compilare mic, cod ușor de depanat), iar 3 fiind optimizare maximă (viteză de execuție maximă, dimensiune mare a codului, mai mare decât la nivelul 2 datorită operațiunii de &amp;#039;&amp;#039;loop unrolling&amp;#039;&amp;#039;, timp de compilare mare, cod greu de depanat).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;-g&amp;lt;/code&amp;gt; || Adaugă simboluri de debug în executabil, fără de care depanarea nu este posibilă. Mai multe despre instrumentele de debug în laboratoarele următoare.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
În continuare vom prezenta cateva exemple:&lt;br /&gt;
* generarea directă a unui executabil numit &amp;#039;&amp;#039;&amp;#039;hello&amp;#039;&amp;#039;&amp;#039;, dintr-un singur fișier sursă, &amp;#039;&amp;#039;&amp;#039;hello.c&amp;#039;&amp;#039;&amp;#039;, utilizând biblioteca standard:&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 hello.c -o hello&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* generarea directă a unui executabil numit &amp;#039;&amp;#039;&amp;#039;hello&amp;#039;&amp;#039;&amp;#039;, dintr-un singur fișier sursă, &amp;#039;&amp;#039;&amp;#039;hello.c&amp;#039;&amp;#039;&amp;#039;, utilizând biblioteca standard și biblioteca &amp;#039;&amp;#039;&amp;#039;math&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; gcc hello.c -o hello -lm&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* generarea directă a unui executabil numit &amp;#039;&amp;#039;&amp;#039;hello&amp;#039;&amp;#039;&amp;#039;, din două fișiere sursă, &amp;#039;&amp;#039;&amp;#039;hello1.c&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;hello2.c&amp;#039;&amp;#039;&amp;#039;, utilizând biblioteca standard:&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 hello1.c hello2.c -o hello&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* generarea unui fișier obiect, numit &amp;#039;&amp;#039;&amp;#039;hello.o&amp;#039;&amp;#039;&amp;#039;, dintr-un fișier sursă numit &amp;#039;&amp;#039;&amp;#039;hello.c&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; gcc -c hello.c -o hello.o&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* generarea unui fișier obiect, numit &amp;#039;&amp;#039;&amp;#039;hello.o&amp;#039;&amp;#039;&amp;#039;, din două fișiere sursă, &amp;#039;&amp;#039;&amp;#039;hello1.c&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;hello2.c&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; gcc -c hello1.c hello2.c -o hello.o&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* generarea unui executabil numit &amp;#039;&amp;#039;&amp;#039;hello&amp;#039;&amp;#039;&amp;#039;, din două fișiere obiect, &amp;#039;&amp;#039;&amp;#039;hello1.o&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;hello2.o&amp;#039;&amp;#039;&amp;#039;, utilizând biblioteca standard și biblioteca &amp;#039;&amp;#039;&amp;#039;math&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; gcc hello1.o hello2.o -o hello -lm&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* generarea unui fișier cu cod de asamblare, numit &amp;#039;&amp;#039;&amp;#039;hello.s&amp;#039;&amp;#039;&amp;#039;, dintr-un fișier sursă numit &amp;#039;&amp;#039;&amp;#039;hello.c&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; gcc -S hello.c -o hello.s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* generarea unui fișier sursă preprocesat, numit &amp;#039;&amp;#039;&amp;#039;hello_pre.c&amp;#039;&amp;#039;&amp;#039;, dintr-un fișier sursă numit &amp;#039;&amp;#039;&amp;#039;hello.c&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; gcc -E hello.c -o hello_pre.c&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Executarea programului ==&lt;br /&gt;
&lt;br /&gt;
Pentru a executa un program sau script în consola Linux, numele fișierului se precede cu caracterele &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;./&amp;lt;/code&amp;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 hello.c -o hello&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; ./hello&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
= Compilarea automată a multiple surse - Makefiles =&lt;br /&gt;
&lt;br /&gt;
Dezvoltarea unei aplicații în limbajul C implică multe iterații de tip design - dezvoltare - depanare - integrare. La fiecare modificare a sursei, pentru a putea rula aplicația, codul trebuie recompilat. Odată cu creșterea numărului de linii de cod și a fișierelor sursă, timpul necesar operației de generare a executabilului (build) crește și el, până în punctul în care durează zeci de minute. Aceasta este în special o problemă când dezvoltarea se face pe microcontroler. Se evidențiază următoarele probleme:&lt;br /&gt;
* Dacă o sursă este modificată, ea trebuie recompilată prin rescrierea în consolă a comenzii de compilare. Această comandă poate fi foarte lungă, datorită multiplelor biblioteci și fanioane folosite, prin urmare este incomod de scris de fiecare dată. Este deci nevoie de o soluție pentru a predefini comanda de compilare și a o rula fără efort de fiecare dată.&lt;br /&gt;
* Dacă o aplicație este formată din multe fișiere sursă, compilarea tuturor acestor fișiere durează. În practică, se cere doar compilarea surselor care s-au modificat și apoi rularea operației de link-editare a fișierelor obiect în fișierul executabil (compilarea este operația care consumă cel mai mult timp din tot procesul de build). Este deci nevoie de un sistem care să detecteze care surse s-au modificat, apoi să le compileze strict pe acelea.&lt;br /&gt;
&lt;br /&gt;
Exisă mai multe sisteme de build care rezolvă aceste probleme, dar de departe cel mai folosit în practică este utilizarea aplicației &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt;, și configurarea acesteia prin Makefiles.&lt;br /&gt;
&lt;br /&gt;
== Anatomia unui Makefile - rețete de fișiere ==&lt;br /&gt;
&lt;br /&gt;
Scrierea unui Makefile este extrem de simplă și se bazează pe ideea de rețetă: pentru a genera un fișier &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;destination&amp;lt;/code&amp;gt;, este nevoie de unul sau mai multe fișiere sursă &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;sourceA, sourceB, sourceC, ...&amp;lt;/code&amp;gt; și de o comandă &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;command&amp;lt;/code&amp;gt; care să genereze fișierul A din B, C, D, ... Această rețetă se scrie într-un fișier cu numele &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;Makefile&amp;lt;/code&amp;gt; în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
destination: sourceA sourceB sourceC ...&lt;br /&gt;
  [tab]  command&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; Fișierele Makefile sunt sensibile la spații! Nu aveți voie să puneți linii goale decât între rețete, și nu aveți voie să plasați spații la începutul liniei. În plus, comenzile care trebuie rulate pentru generarea fișierului trebuie obligatoriu precedate de un caracter TAB, acesta nu se poate înlocui cu spații.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De exemplu, o rețetă care să genereze un executabil numit &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;hello&amp;lt;/code&amp;gt; dintr-o sursă C numită &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;hello.c&amp;lt;/code&amp;gt; se scrie în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
hello: hello.c&lt;br /&gt;
	gcc hello.c -o hello&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a face build-ul, se rulează simplu comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make&amp;lt;/code&amp;gt;, care va rula automat prima rețetă din fișier. Dacă vrem să specificăm care rețetă este rulată, atunci numele ei urmează comenzii &amp;#039;&amp;#039;&amp;#039;make&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make hello&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mai departe, dorim să mai definim o rețetă care să șteargă fișierele generate (să facă curat). Vom numi această rețetă &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;clean&amp;lt;/code&amp;gt;. Această rețetă nu generează un fișier (nu vrem să creăm un fișier numit &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;clean&amp;lt;/code&amp;gt;), astfel această rețetă este una falsă, care se declară PHONY:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
hello: hello.c&lt;br /&gt;
	gcc hello.c -o hello&lt;br /&gt;
&lt;br /&gt;
.PHONY: clean&lt;br /&gt;
clean:&lt;br /&gt;
	rm -f hello&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Putem acum oricând să ștergem fișierul generat rulând comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;make clean&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Regulile după care se execută o rețetă sunt următoarele:&lt;br /&gt;
# Dacă numele rețetei NU este un fișier generat de către comandă, atunci acel target e PHONY, cum este &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;clean&amp;lt;/code&amp;gt;. În cazul acesta, comanda se rulează de fiecare data cand se face rețeta.&lt;br /&gt;
# Dacă numele rețetei ESTE un fișier dar lista de surse lipseste, atunci comanda se ruleaza doar daca fișierul nu există.&lt;br /&gt;
# Dacă numele rețetei ESTE un fișier și lista de surse există, comanda se rulează doar dacă fișierul nu există SAU dacă oricare din surse e mai nouă decat fișierul.&lt;br /&gt;
# Dacă pentru oricare din sursele unei rețete există o altă rețetă care îl generează, atunci se rulează automat întâi acea rețetă, indiferent dacă sursa există sau nu. Dacă fișierul sursă NU există și nu există nici o rețetă care să îl genereze, atunci aplicația &amp;#039;&amp;#039;&amp;#039;make&amp;#039;&amp;#039;&amp;#039; va genera o eroare: &amp;#039;&amp;#039;&amp;#039;No rule to make target&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Optimizări ==&lt;br /&gt;
&lt;br /&gt;
Când se scrie o rețetă, numele fișierelor sursă și/ sau a fișierui destinație se poate schimba în timpul dezvoltării aplicației. Dacă numele acestora apare și în comenzile din rețetă, trebuie avut grija ca noile nume să fie modificate peste tot unde apar. De exemplu, dacă Makefile-ul de mai sus, dorim să modificăm numele sursei din &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;hello.c&amp;lt;/code&amp;gt; în &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;byebye.c&amp;lt;/code&amp;gt;, trebuie modificat în două locuri:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
hello: byebye.c&lt;br /&gt;
	gcc byebye.c -o hello&lt;br /&gt;
&lt;br /&gt;
.PHONY: clean&lt;br /&gt;
clean:&lt;br /&gt;
	rm -f hello&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Astfel, se poate face o optimizare. Există două scurtături care pot fi folosite pentru numele fișierului destinație (&amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;$@&amp;lt;/code&amp;gt;) și pentru lista de fișiere sursă (&amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;$^&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
hello: byebye.c&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clean&lt;br /&gt;
clean:&lt;br /&gt;
	rm -f hello&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un alt avantaj este acela că dacă executabilul &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;hello&amp;lt;/code&amp;gt; va trebui generat din două fișiere sursă, noul fișier nu trebuie adăugat decât în lista de surse, nu și în comandă, lista propagându-se automat datorită lui &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;$^&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
hello: byebye.c hello.c&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clean&lt;br /&gt;
clean:&lt;br /&gt;
	rm -f hello&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
== Bash == &lt;br /&gt;
&lt;br /&gt;
# Navigați până în directorul personal al user-ului &amp;#039;&amp;#039;student&amp;#039;&amp;#039;.&lt;br /&gt;
# Creați un director numit &amp;#039;&amp;#039;&amp;#039;work&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# În directorul &amp;#039;&amp;#039;&amp;#039;work&amp;#039;&amp;#039;&amp;#039; creați următoarele structuri de directoare:&lt;br /&gt;
#*  PC/seriaF/grupa&amp;#039;&amp;#039;N&amp;#039;&amp;#039;/&amp;#039;&amp;#039;nume&amp;#039;&amp;#039;/lab1&lt;br /&gt;
#*  PC/seriaF/grupa&amp;#039;&amp;#039;N&amp;#039;&amp;#039;/&amp;#039;&amp;#039;nume&amp;#039;&amp;#039;/lab2&lt;br /&gt;
# Schimbați directorul curent în /home/student/work/PC/seriaF/grupa&amp;#039;&amp;#039;N&amp;#039;&amp;#039;/&amp;#039;&amp;#039;nume&amp;#039;&amp;#039;/lab1.&lt;br /&gt;
# Dați comanda &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;echo Acesta este primul meu fisier text &amp;gt; test.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
# Vizualizați lista de fișiere din directorul curent.&lt;br /&gt;
# Vizualizați conținutul fișierului din directorul curent.&lt;br /&gt;
# Faceți o copie a fișierului &amp;#039;&amp;#039;&amp;#039;test.txt&amp;#039;&amp;#039;&amp;#039; numită &amp;#039;&amp;#039;&amp;#039;test2.txt&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Mutați fișierul &amp;#039;&amp;#039;&amp;#039;test2.txt&amp;#039;&amp;#039;&amp;#039; în directorul /home/student/work/PC/seriaF/grupa&amp;#039;&amp;#039;N&amp;#039;&amp;#039;/&amp;#039;&amp;#039;nume&amp;#039;&amp;#039;/lab2&lt;br /&gt;
# Schimbați directorul curent în /home/student/work/PC/seriaF/grupa&amp;#039;&amp;#039;N&amp;#039;&amp;#039;/&amp;#039;&amp;#039;nume&amp;#039;&amp;#039;/lab2.&lt;br /&gt;
# Vizualizați lista de fișiere din directorul curent.&lt;br /&gt;
# Vizualizați conținutul fișierului din directorul curent.&lt;br /&gt;
# Ștergeți directorul /home/student/work&lt;br /&gt;
&lt;br /&gt;
== GCC ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Deschideți un editor de text.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Scrieți într-un fișier nou următorul cod C &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;
    printf(&amp;quot;Hello PC Lab!\n&amp;quot;);&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;Salvați fișierul în directorul /home/student/work/PC/seriaF/grupa&amp;#039;&amp;#039;N&amp;#039;&amp;#039;/&amp;#039;&amp;#039;nume&amp;#039;&amp;#039;/lab1 cu numele &amp;#039;&amp;#039;&amp;#039;source.c&amp;#039;&amp;#039;&amp;#039; (directorul va trebui refăcut)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Navigați în consolă în directorul /home/student/work/PC/seriaF/grupa&amp;#039;&amp;#039;N&amp;#039;&amp;#039;/&amp;#039;&amp;#039;nume&amp;#039;&amp;#039;/lab1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Compilați fișierul sursă într-un executabil numit &amp;#039;&amp;#039;&amp;#039;main&amp;#039;&amp;#039;&amp;#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Executați programul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ștergeți fișierul &amp;#039;&amp;#039;&amp;#039;main&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Generați un fișier obiect, din fișierul &amp;#039;&amp;#039;&amp;#039;source.c&amp;#039;&amp;#039;&amp;#039;, numit &amp;#039;&amp;#039;&amp;#039;source.o&amp;#039;&amp;#039;&amp;#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Generați un executabil numit &amp;#039;&amp;#039;&amp;#039;main&amp;#039;&amp;#039;&amp;#039;, din fișierul obiect.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Executați programul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Generați un fișier cu cod asamblare, numit &amp;#039;&amp;#039;&amp;#039;source.s&amp;#039;&amp;#039;&amp;#039;, din fișierul sursă.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Afișați pe ecran conținutul fișierului &amp;#039;&amp;#039;&amp;#039;source.s&amp;#039;&amp;#039;&amp;#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Generați un fișier cu cod C preprocesat, numit &amp;#039;&amp;#039;&amp;#039;source_pre.c&amp;#039;&amp;#039;&amp;#039;, din fișierul sursă.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Afișați pe ecran conținutul fișierului &amp;#039;&amp;#039;&amp;#039;source_pre.c&amp;#039;&amp;#039;&amp;#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Afișați pe ecran conținutul fișierului &amp;#039;&amp;#039;&amp;#039;source.o&amp;#039;&amp;#039;&amp;#039;. Explicați comportamentul.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Makefiles ==&lt;br /&gt;
&lt;br /&gt;
# Scrieți un Makefile cu două rețete:&lt;br /&gt;
#* una care să genereze executabilul &amp;#039;&amp;#039;&amp;#039;main&amp;#039;&amp;#039;&amp;#039; din sursa &amp;#039;&amp;#039;&amp;#039;source.c&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#* una care să șteargă fișierul generat.&lt;br /&gt;
# Rulați comanda &amp;#039;&amp;#039;&amp;#039;make clean&amp;#039;&amp;#039;&amp;#039; și verificați că executabilul a fost șters.&lt;br /&gt;
# Rulați comanda &amp;#039;&amp;#039;&amp;#039;make&amp;#039;&amp;#039;&amp;#039;, verificați că programul a fost compilat și rulați-l.&lt;br /&gt;
# Rulați comanda &amp;#039;&amp;#039;&amp;#039;make&amp;#039;&amp;#039;&amp;#039; din nou. Ce observați?&lt;br /&gt;
# Modificați fișierul sursă ca în loc de &amp;#039;&amp;#039;&amp;#039;Hello PC Lab!&amp;#039;&amp;#039;&amp;#039; să afișeze pe ecran &amp;#039;&amp;#039;&amp;#039;Makefiles are awesome!&amp;#039;&amp;#039;&amp;#039; (nu uitați să salvați fișierul după modificare).&lt;br /&gt;
# Rulați din nou comanda &amp;#039;&amp;#039;&amp;#039;make&amp;#039;&amp;#039;&amp;#039; și apoi executați programul.&lt;br /&gt;
# Modificați &amp;#039;&amp;#039;&amp;#039;Makefile&amp;#039;&amp;#039;&amp;#039; astfel încât să genereze executabilul dintr-un fișier obiect, iar fișierul obiect să fie generat din fișierul sursă.&lt;br /&gt;
&lt;br /&gt;
= Exerciții pentru acasă =&lt;br /&gt;
&lt;br /&gt;
# Instalați Virtualbox și descărcați mașina virtuală conform instrucțiunilor de pe Moodle (dacă vă simțiti curajoși, puteți instala Linux direct pe calculator, [http://linux.about.com/od/howtos/ss/How-To-Dual-Boot-Windows-81-And-Linux-Mint.htm în paralel cu Windows], sau înlocuindu-l).&lt;br /&gt;
# Refaceți exercițiile din laborator pe propriul calculator.&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=3540</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=3540"/>
		<updated>2015-10-04T20:33:59Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: &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;
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;  | 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;
| 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;
|}&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;
void 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;
}&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;
&lt;br /&gt;
a)	se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
b)	dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&lt;br /&gt;
i.	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;&lt;br /&gt;
&lt;br /&gt;
ii.	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.);&lt;br /&gt;
&lt;br /&gt;
c) 	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.&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;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
1.	 Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void 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;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2.	 Ş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ă). &lt;br /&gt;
&lt;br /&gt;
3.	 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;
void 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;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5.	 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. &lt;br /&gt;
  &lt;br /&gt;
6. 	 Scrieți un program care afișează toate numerele pare de la 1 la un număr citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=3539</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=3539"/>
		<updated>2015-10-04T20:02:58Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: &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;
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;  | 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;
| 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;
|}&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;
void 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;
}&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) ? (instructiune1) : (instructiune2)&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;
(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;
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;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
a)	se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
b)	dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&lt;br /&gt;
i.	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;&lt;br /&gt;
&lt;br /&gt;
ii.	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.);&lt;br /&gt;
&lt;br /&gt;
c) 	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.&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;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
1.	 Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void 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;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2.	 Ş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ă). &lt;br /&gt;
&lt;br /&gt;
3.	 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;
void 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;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5.	 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. &lt;br /&gt;
  &lt;br /&gt;
6. 	 Scrieți un program care afișează toate numerele pare de la 1 la un număr citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=3538</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=3538"/>
		<updated>2015-10-04T19:43:48Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: &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;
&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 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;  | 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;
| 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;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&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) ? (instructiune1) : (instructiune2)&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;
(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;
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;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
a)	se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
b)	dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&lt;br /&gt;
i.	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;&lt;br /&gt;
&lt;br /&gt;
ii.	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.);&lt;br /&gt;
&lt;br /&gt;
c) 	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.&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;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
1.	 Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void 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;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2.	 Ş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ă). &lt;br /&gt;
&lt;br /&gt;
3.	 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;
void 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;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.	 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;
void 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;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5.	 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. &lt;br /&gt;
  &lt;br /&gt;
6. 	 Scrieți un program care afișează toate numerele pare de la 1 la un număr citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=3261</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=3261"/>
		<updated>2015-09-24T17:09:32Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: /* 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 decizionala == &lt;br /&gt;
  &lt;br /&gt;
Se întâmplă adesea ca evoluția unui program să depindă de un moment prezent. Acel moment prezent poate lua însă diverse forme, rolul programatorului fiind să conducă execuția programului pe calea corectă, pe baza unor condiții. 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 corpului 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;
else&lt;br /&gt;
	 instructiune2;&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;
else if (conditie2)&lt;br /&gt;
	instructiune 2;&lt;br /&gt;
else if (conditie 3)&lt;br /&gt;
	instructiune3;&lt;br /&gt;
................................&lt;br /&gt;
else&lt;br /&gt;
	instructiune;&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ă corpuri 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 5&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
	printf (&amp;quot;b este intre 5 si a&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*	dacă există corpuri 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 5&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;
== Condiția logică == &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;
! colspan=&amp;quot;2&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;
|-&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;
&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;
&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;Observație:&amp;#039;&amp;#039;&amp;#039;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;  | 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;
| 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;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&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) ? (instructiune1) : (instructiune2)&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;
(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;
&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;
&lt;br /&gt;
a)	se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
b)	dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&lt;br /&gt;
i.	dacă există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; structura switch-case se încheie și se sare pe linia urmatoare întregului corp decizional;&lt;br /&gt;
&lt;br /&gt;
ii.	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.);&lt;br /&gt;
&lt;br /&gt;
c) 	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.&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;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
1.	 Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void 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;
    else if(a&amp;gt;20)&lt;br /&gt;
         printf(&amp;quot;Horia Andreescu &amp;quot;);&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	Tiberiu Soare&lt;br /&gt;
b)	Horia Andreescu&lt;br /&gt;
c)	Tiberiu Soare&lt;br /&gt;
	Horia Andreescu&lt;br /&gt;
	Iosif Ion Prunner&lt;br /&gt;
d)	Compilation error: More than one conditions are true&lt;br /&gt;
e)	Niciuna dintre cele de mai sus.&lt;br /&gt;
&lt;br /&gt;
2.	 Ş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ă). &lt;br /&gt;
&lt;br /&gt;
3.	 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;
void 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;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	Bill Gates&lt;br /&gt;
b)	Amancio Ortega&lt;br /&gt;
	Carlos Slim Helu&lt;br /&gt;
c)	Run time error&lt;br /&gt;
d)	Compilation error&lt;br /&gt;
e)	Niciuna din cele de mai sus&lt;br /&gt;
&lt;br /&gt;
4.	 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;
void 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;
    else&lt;br /&gt;
         printf(&amp;quot;Wayne Rooney&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	5 10&lt;br /&gt;
b)	6 11&lt;br /&gt;
c)	6 10&lt;br /&gt;
d)	5 11&lt;br /&gt;
e)	Wayne Rooney&lt;br /&gt;
&lt;br /&gt;
5.	 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. &lt;br /&gt;
  &lt;br /&gt;
6. 	 Scrieți un program care afișează toate numerele pare de la 1 la un număr citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=3260</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=3260"/>
		<updated>2015-09-24T17:07:52Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: /* Condiția logică */&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 decizionala == &lt;br /&gt;
  &lt;br /&gt;
Se întâmplă adesea ca evoluția unui program să depindă de un moment prezent. Acel moment prezent poate lua însă diverse forme, rolul programatorului fiind să conducă execuția programului pe calea corectă, pe baza unor condiții. 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 corpului 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;
else&lt;br /&gt;
	 instructiune2;&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;
else if (conditie2)&lt;br /&gt;
	instructiune 2;&lt;br /&gt;
else if (conditie 3)&lt;br /&gt;
	instructiune3;&lt;br /&gt;
................................&lt;br /&gt;
else&lt;br /&gt;
	instructiune;&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ă corpuri 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 5&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
	printf (&amp;quot;b este intre 5 si a&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*	dacă există corpuri 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 5&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;
== Condiția logică == &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;
! colspan=&amp;quot;2&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;
|-&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;
&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;
&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;Observație:&amp;#039;&amp;#039;&amp;#039;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;  | 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;
| 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;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&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) ? (instructiune1) : (instructiune2)&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;
(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;
&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;
&lt;br /&gt;
a)	se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
b)	dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&lt;br /&gt;
i.	dacă există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; structura switch-case se încheie și se sare pe linia urmatoare întregului corp decizional;&lt;br /&gt;
&lt;br /&gt;
ii.	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.);&lt;br /&gt;
&lt;br /&gt;
c) 	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.&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;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
1.	 Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void main(){&lt;br /&gt;
    int a=100;&lt;br /&gt;
    if(a&amp;gt;10)&lt;br /&gt;
         printf(&amp;quot;Tiberiu Soare\n&amp;quot;);&lt;br /&gt;
    else if(a&amp;gt;20)&lt;br /&gt;
         printf(&amp;quot;Horia Andreescu\n&amp;quot;);&lt;br /&gt;
    else if(a&amp;gt;30)&lt;br /&gt;
           printf(&amp;quot;Iosif Ion Prunner\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	Tiberiu Soare&lt;br /&gt;
b)	Horia Andreescu&lt;br /&gt;
c)	Tiberiu Soare&lt;br /&gt;
	Horia Andreescu&lt;br /&gt;
	Iosif Ion Prunner&lt;br /&gt;
d)	Compilation error: More than one conditions are true&lt;br /&gt;
e)	Niciuna dintre cele de mai sus.&lt;br /&gt;
&lt;br /&gt;
2.	 Ş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ă). &lt;br /&gt;
&lt;br /&gt;
3.	 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;
void 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\n&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
         printf(&amp;quot;Amancio Ortega\n&amp;quot;);&lt;br /&gt;
         printf(&amp;quot;Carlos Slim Helu\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	Bill Gates&lt;br /&gt;
b)	Amancio Ortega&lt;br /&gt;
	Carlos Slim Helu&lt;br /&gt;
c)	Run time error&lt;br /&gt;
d)	Compilation error&lt;br /&gt;
e)	Niciuna din cele de mai sus&lt;br /&gt;
&lt;br /&gt;
4.	 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;
void 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;
    else&lt;br /&gt;
         printf(&amp;quot;Wayne Rooney&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	5 10&lt;br /&gt;
b)	6 11&lt;br /&gt;
c)	6 10&lt;br /&gt;
d)	5 11&lt;br /&gt;
e)	Wayne Rooney&lt;br /&gt;
&lt;br /&gt;
5.	 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. &lt;br /&gt;
  &lt;br /&gt;
6. 	 Scrieți un program care afișează toate numerele pare de la 1 la un număr citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=3258</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=3258"/>
		<updated>2015-09-24T17:06:30Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: /* Operația cu operatori relaționali (==, !=, , &amp;gt;=) */&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 decizionala == &lt;br /&gt;
  &lt;br /&gt;
Se întâmplă adesea ca evoluția unui program să depindă de un moment prezent. Acel moment prezent poate lua însă diverse forme, rolul programatorului fiind să conducă execuția programului pe calea corectă, pe baza unor condiții. 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 corpului 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;
else&lt;br /&gt;
	 instructiune2;&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;
else if (conditie2)&lt;br /&gt;
	instructiune 2;&lt;br /&gt;
else if (conditie 3)&lt;br /&gt;
	instructiune3;&lt;br /&gt;
................................&lt;br /&gt;
else&lt;br /&gt;
	instructiune;&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ă corpuri 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 5&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
	printf (&amp;quot;b este intre 5 si a&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*	dacă există corpuri 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 5&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;
== Condiția logică == &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;
! colspan=&amp;quot;2&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;
|-&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;
&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;
&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;Observație:&amp;#039;&amp;#039;&amp;#039;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;  | 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;
| 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;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;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) ? (instructiune1) : (instructiune2)&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;
(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;
&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;
&lt;br /&gt;
a)	se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
b)	dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&lt;br /&gt;
i.	dacă există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; structura switch-case se încheie și se sare pe linia urmatoare întregului corp decizional;&lt;br /&gt;
&lt;br /&gt;
ii.	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.);&lt;br /&gt;
&lt;br /&gt;
c) 	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.&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;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
1.	 Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void main(){&lt;br /&gt;
    int a=100;&lt;br /&gt;
    if(a&amp;gt;10)&lt;br /&gt;
         printf(&amp;quot;Tiberiu Soare\n&amp;quot;);&lt;br /&gt;
    else if(a&amp;gt;20)&lt;br /&gt;
         printf(&amp;quot;Horia Andreescu\n&amp;quot;);&lt;br /&gt;
    else if(a&amp;gt;30)&lt;br /&gt;
           printf(&amp;quot;Iosif Ion Prunner\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	Tiberiu Soare&lt;br /&gt;
b)	Horia Andreescu&lt;br /&gt;
c)	Tiberiu Soare&lt;br /&gt;
	Horia Andreescu&lt;br /&gt;
	Iosif Ion Prunner&lt;br /&gt;
d)	Compilation error: More than one conditions are true&lt;br /&gt;
e)	Niciuna dintre cele de mai sus.&lt;br /&gt;
&lt;br /&gt;
2.	 Ş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ă). &lt;br /&gt;
&lt;br /&gt;
3.	 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;
void 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\n&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
         printf(&amp;quot;Amancio Ortega\n&amp;quot;);&lt;br /&gt;
         printf(&amp;quot;Carlos Slim Helu\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	Bill Gates&lt;br /&gt;
b)	Amancio Ortega&lt;br /&gt;
	Carlos Slim Helu&lt;br /&gt;
c)	Run time error&lt;br /&gt;
d)	Compilation error&lt;br /&gt;
e)	Niciuna din cele de mai sus&lt;br /&gt;
&lt;br /&gt;
4.	 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;
void 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;
    else&lt;br /&gt;
         printf(&amp;quot;Wayne Rooney&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	5 10&lt;br /&gt;
b)	6 11&lt;br /&gt;
c)	6 10&lt;br /&gt;
d)	5 11&lt;br /&gt;
e)	Wayne Rooney&lt;br /&gt;
&lt;br /&gt;
5.	 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. &lt;br /&gt;
  &lt;br /&gt;
6. 	 Scrieți un program care afișează toate numerele pare de la 1 la un număr citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=3257</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=3257"/>
		<updated>2015-09-24T17:05:55Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: /* Operandul */&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 decizionala == &lt;br /&gt;
  &lt;br /&gt;
Se întâmplă adesea ca evoluția unui program să depindă de un moment prezent. Acel moment prezent poate lua însă diverse forme, rolul programatorului fiind să conducă execuția programului pe calea corectă, pe baza unor condiții. 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 corpului 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;
else&lt;br /&gt;
	 instructiune2;&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;
else if (conditie2)&lt;br /&gt;
	instructiune 2;&lt;br /&gt;
else if (conditie 3)&lt;br /&gt;
	instructiune3;&lt;br /&gt;
................................&lt;br /&gt;
else&lt;br /&gt;
	instructiune;&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ă corpuri 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 5&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
	printf (&amp;quot;b este intre 5 si a&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*	dacă există corpuri 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 5&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;
== Condiția logică == &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  funcție de valoarea variabilei distance după cum urmează: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&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;
|-&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;
&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;
&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;Observație:&amp;#039;&amp;#039;&amp;#039;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;  | 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;
| 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;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;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) ? (instructiune1) : (instructiune2)&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;
(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;
&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;
&lt;br /&gt;
a)	se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
b)	dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&lt;br /&gt;
i.	dacă există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; structura switch-case se încheie și se sare pe linia urmatoare întregului corp decizional;&lt;br /&gt;
&lt;br /&gt;
ii.	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.);&lt;br /&gt;
&lt;br /&gt;
c) 	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.&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;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
1.	 Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void main(){&lt;br /&gt;
    int a=100;&lt;br /&gt;
    if(a&amp;gt;10)&lt;br /&gt;
         printf(&amp;quot;Tiberiu Soare\n&amp;quot;);&lt;br /&gt;
    else if(a&amp;gt;20)&lt;br /&gt;
         printf(&amp;quot;Horia Andreescu\n&amp;quot;);&lt;br /&gt;
    else if(a&amp;gt;30)&lt;br /&gt;
           printf(&amp;quot;Iosif Ion Prunner\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	Tiberiu Soare&lt;br /&gt;
b)	Horia Andreescu&lt;br /&gt;
c)	Tiberiu Soare&lt;br /&gt;
	Horia Andreescu&lt;br /&gt;
	Iosif Ion Prunner&lt;br /&gt;
d)	Compilation error: More than one conditions are true&lt;br /&gt;
e)	Niciuna dintre cele de mai sus.&lt;br /&gt;
&lt;br /&gt;
2.	 Ş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ă). &lt;br /&gt;
&lt;br /&gt;
3.	 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;
void 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\n&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
         printf(&amp;quot;Amancio Ortega\n&amp;quot;);&lt;br /&gt;
         printf(&amp;quot;Carlos Slim Helu\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	Bill Gates&lt;br /&gt;
b)	Amancio Ortega&lt;br /&gt;
	Carlos Slim Helu&lt;br /&gt;
c)	Run time error&lt;br /&gt;
d)	Compilation error&lt;br /&gt;
e)	Niciuna din cele de mai sus&lt;br /&gt;
&lt;br /&gt;
4.	 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;
void 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;
    else&lt;br /&gt;
         printf(&amp;quot;Wayne Rooney&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	5 10&lt;br /&gt;
b)	6 11&lt;br /&gt;
c)	6 10&lt;br /&gt;
d)	5 11&lt;br /&gt;
e)	Wayne Rooney&lt;br /&gt;
&lt;br /&gt;
5.	 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. &lt;br /&gt;
  &lt;br /&gt;
6. 	 Scrieți un program care afișează toate numerele pare de la 1 la un număr citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_5&amp;diff=3256</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=3256"/>
		<updated>2015-09-24T17:03:58Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: Pagină nouă: == Obiective ==     în urma acestui laborator, studentul va fi capabil să:  * 	 înțeleagă cum funcționează o structură decizională;  * 	 scrie programe în C folosind cons...&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 decizionala == &lt;br /&gt;
  &lt;br /&gt;
Se întâmplă adesea ca evoluția unui program să depindă de un moment prezent. Acel moment prezent poate lua însă diverse forme, rolul programatorului fiind să conducă execuția programului pe calea corectă, pe baza unor condiții. 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 corpului 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;
else&lt;br /&gt;
	 instructiune2;&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;
else if (conditie2)&lt;br /&gt;
	instructiune 2;&lt;br /&gt;
else if (conditie 3)&lt;br /&gt;
	instructiune3;&lt;br /&gt;
................................&lt;br /&gt;
else&lt;br /&gt;
	instructiune;&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ă corpuri 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 5&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
	printf (&amp;quot;b este intre 5 si a&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*	dacă există corpuri 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 5&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;
== Condiția logică == &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  un număr citit de la  poate  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  funcție de valoarea variabilei distance după cum urmează: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&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;
|-&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;
&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;
&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;Observație:&amp;#039;&amp;#039;&amp;#039;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;  | 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;
| 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;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;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) ? (instructiune1) : (instructiune2)&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;
(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;
&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;
&lt;br /&gt;
a)	se compară valoarea variabilei &amp;#039;&amp;#039;variabilaTestata&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;valoarea1&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
b)	dacă cele două sunt egale, se execută &amp;#039;&amp;#039;instructiune1&amp;#039;&amp;#039;. Apoi există două cazuri:&lt;br /&gt;
&lt;br /&gt;
i.	dacă există &amp;#039;&amp;#039;break;&amp;#039;&amp;#039; structura switch-case se încheie și se sare pe linia urmatoare întregului corp decizional;&lt;br /&gt;
&lt;br /&gt;
ii.	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.);&lt;br /&gt;
&lt;br /&gt;
c) 	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.&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;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
1.	 Ce va afișa următorul program? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void main(){&lt;br /&gt;
    int a=100;&lt;br /&gt;
    if(a&amp;gt;10)&lt;br /&gt;
         printf(&amp;quot;Tiberiu Soare\n&amp;quot;);&lt;br /&gt;
    else if(a&amp;gt;20)&lt;br /&gt;
         printf(&amp;quot;Horia Andreescu\n&amp;quot;);&lt;br /&gt;
    else if(a&amp;gt;30)&lt;br /&gt;
           printf(&amp;quot;Iosif Ion Prunner\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	Tiberiu Soare&lt;br /&gt;
b)	Horia Andreescu&lt;br /&gt;
c)	Tiberiu Soare&lt;br /&gt;
	Horia Andreescu&lt;br /&gt;
	Iosif Ion Prunner&lt;br /&gt;
d)	Compilation error: More than one conditions are true&lt;br /&gt;
e)	Niciuna dintre cele de mai sus.&lt;br /&gt;
&lt;br /&gt;
2.	 Ş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ă). &lt;br /&gt;
&lt;br /&gt;
3.	 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;
void 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\n&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
         printf(&amp;quot;Amancio Ortega\n&amp;quot;);&lt;br /&gt;
         printf(&amp;quot;Carlos Slim Helu\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	Bill Gates&lt;br /&gt;
b)	Amancio Ortega&lt;br /&gt;
	Carlos Slim Helu&lt;br /&gt;
c)	Run time error&lt;br /&gt;
d)	Compilation error&lt;br /&gt;
e)	Niciuna din cele de mai sus&lt;br /&gt;
&lt;br /&gt;
4.	 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;
void 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;
    else&lt;br /&gt;
         printf(&amp;quot;Wayne Rooney&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
a)	5 10&lt;br /&gt;
b)	6 11&lt;br /&gt;
c)	6 10&lt;br /&gt;
d)	5 11&lt;br /&gt;
e)	Wayne Rooney&lt;br /&gt;
&lt;br /&gt;
5.	 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. &lt;br /&gt;
  &lt;br /&gt;
6. 	 Scrieți un program care afișează toate numerele pare de la 1 la un număr citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Structura_decizionala.png&amp;diff=3250</id>
		<title>Fișier:Structura decizionala.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Structura_decizionala.png&amp;diff=3250"/>
		<updated>2015-09-24T15:30:15Z</updated>

		<summary type="html">&lt;p&gt;Ccioflan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ccioflan</name></author>
	</entry>
</feed>