Differences

This shows you the differences between two versions of the page.

Link to this comparison view

programare-ca:laboratoare:lab03 [2012/09/27 11:16]
emil.racec
— (current)
Line 1: Line 1:
-===== Instructiunile limbajului C. ===== 
  
-**Responsabili:​** 
-  * [[emil.racec@gmail.com|Emil Racec (2012)]] 
-  * [[octavian.rinciog@gmail.com|Octavian Rînciog (2010)]] 
- 
-==== Obiective ==== 
- 
-În urma parcurgerii acestui laborator studentul va fi capabil să: 
-  * scrie programe C utilizând structuri condiţionale si de repetiţie 
- 
-==== Noţiuni teoretice ==== 
- 
-=== Instrucţiuni condiţionale === 
- 
-== If-else == 
- 
-''​if...else''​ este cea mai simplă instrucţiune condiţională. Poate fi folosită în mai multe forme: 
- 
-<code c> 
-if( condiţie ) 
-{ 
-  // instrucţiuni 
-  //... 
-} 
-</​code>​ 
- 
-<code c> 
-if( condiţie ) 
-{ 
-  //​instrucţiuni 
-  //... 
-} 
-else 
-{ 
-  //alte instrucţiuni 
-  //... 
-} 
-</​code>​ 
- 
-<code c> 
-if( condiţie1 ) 
-{ 
-  ... 
-} 
-else if( condiţie2 ) 
-{ 
-  ... 
-} 
-  ... 
-else if( condiţieN ) 
-{ 
-  ... 
-} 
-</​code>​ 
- 
-Instrucţiunea evaluează expresia ''​condiţie''​ şi execută instrucţiunile dintre acolade doar dacă rezultatul este nenul. În varianta cu ''​else'',​ pentru rezultat nul este executat blocul de instrucţiuni aflat după ''​else''​. 
- 
-În al treilea caz, sunt evaluate pe rând condiţiile şi este executat blocul corespunzător primei condiţii adevărate. Un exemplu de folosire este: 
- 
-<code c> 
-if( a == b ) 
-  printf( "​Numerele sunt egale" ); 
-else 
-  if( a > b ) 
-    printf( "A este mai mare" ); 
-</​code>​ 
- 
-== Switch == 
- 
-''​switch''​ este o instrucţiune menită să simplifice structurile condiţionale cu mai multe condiţii. 
- 
-<code c> 
-switch( expresie ) 
-{ 
-case constanta1: 
-  //​instrucţiuni1 
-case constanta2: 
-  //​instrucţiuni2 
-... 
-default: 
-  //​instrucţiuni 
-} 
-</​code>​ 
- 
-Valoarea ''​expresie''​ este evaluată la un tip intreg, apoi această valoare este comparată cu fiecare constantă; este rulat blocul de instrucţiuni al valorii găsite. În caz ca numărul nu este egal cu nici una dintre constante, este executat blocul aflat după ''​default''​. 
- 
-<note important>​ 
-După executarea ultimei instrucţiuni dintr-un bloc ''​case'',​ execuţia nu continua după blocul ''​switch'',​ ci la inceputul următorului bloc ''​case //​constantă//''​ sau ''​default''​. Pentru a ieşi din blocul ''​switch'',​ se foloseşte instrucţiunea ''​break''​. 
-</​note>​ 
- 
-<code c> 
-int main() 
-{ 
-  char c; 
-  printf("​Alegeţi o opţiune:​\n\t[a] afişare\n\t[s] ştergere\n\t[e] ieşire\n"​);​ 
-  scanf("​%c",​ &c); 
-    printf("​Aţi ales: "); 
-  
-  switch(c) 
-  { 
-    case '​a':​ 
-      printf("​afişare"​);​ 
-      break; 
-  
-    case '​s':​ 
-      printf("​ştergere"​);​ 
-      break; 
-  
-    case '​e':​ 
-      printf("​ieşire"​);​ 
-      break; 
-  
-    default: 
-      printf("​O opţiune inexistentă"​);​ 
-      break; 
-  } 
-  return 0; 
-} 
-</​code>​ 
- 
-<code c> 
-int main( ) 
-{ 
-  int n, n2; 
-  printf( "​Introduceţi o valoare între 0 şi 5:" ); 
-  scanf( "​%d",​ &n ); 
-  n2 = 1; 
-  switch( n ) 
-  { 
-    case 5: 
-      n2 *= 2; 
-      /* fără break, continuă la următoarea instrucţiune */ 
-    case 4: 
-      n2 *= 2; 
-    case 3: 
-      n2 *= 2; 
-    case 2: 
-      n2 *= 2; 
-    case 1: 
-      n2 *= 2; 
-    case 0: 
-      printf( "2 la puterea %d este %d\n", n, n2 ); 
-      break; 
-  
-    default: 
-      printf( "​Valoare invalidă\n"​ ); 
-  } 
-  return 0; 
-} 
-</​code>​ 
- 
-=== Instrucţiuni de repetiţie === 
- 
-== while == 
- 
-''​while''​ execută un bloc de instrucţiuni atâta timp cât o anumită condiţie este adevărată. Forma generală a unui ciclu while este: 
- 
-<code c> 
-while (expresie) 
-{ 
-  //​instrucţiuni 
-} 
-</​code>​ 
- 
-Câtă vreme ''​expresie''​ are o valoare nenulă, instrucţiunile din blocul de după ''​while''​ sunt executate. Expresia este reevaluată după fiecare ciclu. Un astfel de ciclu poate să se execute o dată, de mai multe ori sau niciodată, în funcţie de valoarea la care se evaluează expresia. 
- 
-== do ... while == 
- 
-''​do ... while''​ este o instrucţiune repetitivă similara cu cea precedentă,​ singura diferenţa fiind că expresia este evaluată după executarea instrucţiunilor,​ nu înainte. Astfel, blocul va fi executat cel puţin o dată. 
- 
-<code c> 
-do 
-{ 
-  //​instrucţiuni 
-} while (expresie); 
-</​code>​ 
- 
-== for == 
- 
-''​for''​ reprezintă o formă mai simplă de a scrie un while însotit de o expresie iniţiala şi de o expresie de incrementare. Forma sa este: 
- 
-<code c> 
-for( expresie1 ; expresie2 ; expresie3 ) 
-{ 
-  //​instrucţiuni 
-} 
-</​code>​ 
- 
-Secvenţa de cod de mai sus este echivalentă cu: 
- 
-<code c> 
-expresie1 
-while (expresie2) 
-{ 
-  instrucţiuni 
-  expresie3 
-} 
-</​code>​ 
- 
-În cazul instrucţiunii ''​for'',​ oricare dintre cele 3 expresii poate lipsi. Lipsa expresiei condiţionale este echivalentă cu o buclă infinită, cum ar fi: 
- 
-<code c> 
-for( ; ; ) 
-{ 
-  /* instrucţiunile de aici sunt intr-o buclă infinită */ 
-} 
-</​code>​ 
- 
-<note important>​ 
-În acest caz, ieşirea din buclă trebuie făcută explicit, cu ajutorul instrucţiunii ''​break''​. 
-</​note>​ 
- 
-Exemplul următor prezintă un ciclu cu funcţionalitate identică (tipărirea primelor 10 numere naturale), folosind cele 3 instrucţiuni repetitive: 
- 
-<code c> 
-int main() 
-{ 
-  short i; 
-  printf("​Ciclu for\n"​);​ 
-  
-  for (i=1;​i<​=10;​i++) 
-    printf("​i=%d\n",​ i); 
-  
-  printf("​Ciclu while\n"​);​ 
-  i=1; 
-  while (i <= 10) 
-  { 
-    printf("​i=%d\n",​ i); 
-    i++; 
-  } 
-  
-  printf("​Ciclu do while\n"​);​ 
-  i=0; 
-  do 
-  { 
-    i++; 
-    printf("​i=%d\n",​ i); 
-  } while(i < 10); 
-} 
-</​code>​ 
- 
-În exemplu nu am mai pus acolade la instrucţiunea executată de for. Pentru blocuri de o singură instrucţiune,​ nu este nevoie sa folosim acoladele. 
- 
-=== Instrucţiuni speciale === 
- 
-== break == 
- 
-''​break'',​ pe lângă utilizarea descrisă la instrucţiunea switch, poate fi folosită pentru a ieşi forţat dintr-o instrucţiune de repetiţie. Secventa următoare este echivalentă cu cele de mai sus: 
- 
-<code c> 
-i = 0; 
-for( ; ; ) 
-{ 
-  i++; 
-  if( i > 10 ) 
-    break; /* ieşire forţată din bucla */ 
-    printf( “i=%d\n”,​ i ); 
-} 
-</​code>​ 
- 
-== continue == 
- 
-''​continue''​ forţează terminarea iteraţiei curente a buclei si trecerea la iteraţia următoare. În cazul instrucţiunii ''​for'',​ acest lucru presupune executarea instrucţiunii de incrementare;​ apoi se evaluează condiţia de continuare a buclei. Exemplul următor demonstrează implementarea unei bucle infinite cu ajutorul instrucţiunii ''​continue'':​ 
- 
-<code c> 
-for( i = 0 ; i < 10 ; ) 
-{ 
-  if( i == 0 ) 
-    continue; 
-  i++; 
-} 
-</​code>​ 
- 
-== return == 
- 
-''​return''​ este instrucţiunea de terminare a funcţiei curente. Aceasta poate fi apelată in forma ''​return'';​ în cazul funcţiilor care returnează ''​void''​ şi în forma ''​return //​rezultat//'';​ pentru funcţiile care întorc o valoare. 
- 
-== goto == 
- 
-''​goto''​ este o instrucţiune de salt a execuţiei. Instrucţiunea primeşte ca parametru o etichetă; următoarea instrucţiune executată după ''​goto''​ este cea de la eticheta dată. 
- 
-<code c> 
-int main( ) 
-{ 
-  goto et;  
-  printf( “Asta nu apare la executie\n” ); 
-  
-et: 
-  printf( “Asta apare la rulare\n” ); 
-  return 0; 
-} 
-</​code>​ 
- 
-<note important>​ 
-În majoritatea cazurilor, utilizarea instrucţiunii ''​goto''​ nu este recomandată şi poate fi evitată folosind alte instrucţiuni de control şi funcţii. Programele care folosesc această instrucţiune pentru a sări între secvenţe îndepărtate de cod sunt dificil de depanat şi analizat. 
-</​note>​ 
- 
-==== Exerciţii de Laborator ==== 
- 
-  - Se citeşte de la tastatură un număr întreg si pozitiv N. Să se scrie un program care determină care număr cuprins intre 2 si N are suma divizorilor nebanali maximă (adică printre divizori nu sunt considerate numerele 1 si N). Dacă există mai multe asemenea numere se va afişa numai primul dintre ele.\\ **Exemplu** <​code>​ 
-N=100 
-96 are suma divizorilor 155 
-</​code>​ 
-  - De la tastatură se introduc mai multe numere întregi si pozitive, terminate printr-un număr negativ. După fiecare număr introdus, se va afişa lista divizorilor lui nebanali sau textul PRIM. La sfârşit se va afişa numărul de numere prime găsite.\\ **Exemplu** <​code>​35 
-5 7 
-36 
-2 3 4 6 9 12 18 
-17 
-PRIM 
-2 
-PRIM 
-12 
-2 3 4 6 
-25 
-5 
-53 
-PRIM 
--4 
-S-au găsit 3 numere prime. 
-</​code>​ 
-  - Fie funcţia ''​f:​[u,​v] − > [min,​max],​f(x) = a * x2 + b * x + c''​ , în care a, b, c, u si v sunt date. Determinaţi min si max, apoi rezolvaţi ecuaţia f(x)=0 în mulţimea numerelor reale. Afişaţi doar rădăcinile din intervalul ''​[u,​v]''​. 
-  - Scrieţi un program care să convertească numere din baza 2 în baza 10 şi invers. Numerele se introduc de la tastatură până la intâlnirea unui număr negativ. Pentru fiecare număr introdus, se va afişa pe o linie rezultatul. 
-  - Scrieţi un program care verifică dacă un număr citit de la tastatură este palindrom. Un număr se consideră palindrom dacă citit invers este identic cu numărul iniţial. 
-  - De la tastatură se introduc N(fiind dat şi el de la tastatură) numere citite pe rând. Găsiţi cel mai mare divizor comun al acestor N numere, fără a folosi vectori. 
programare-ca/laboratoare/lab03.1348733763.txt.gz · Last modified: 2012/09/27 11:16 by emil.racec
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0