This shows you the differences between two versions of the page.
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. |