34 0 450KB
Caiet de laborator pentru clasa a IX-a
1
CUPRINS CAP.1 FUNCŢII DE CITIRE/SCRIERE.........................................................................2 1.1 Funcţii de citire/scriere pentru caractere şi şiruri de caractere.......................................2 A. Probleme rezolvate...............................................................................................................2 B. Probleme propuse.................................................................................................................4 1.2 Funcţiile de citire/scriere cu format....................................................................................5 A. Probleme rezolvate...............................................................................................................5 B. Probleme propuse.................................................................................................................9 CAP.2 OPERATORII LIMBAJULUI C........................................................................11 A. Probleme rezolvate.............................................................................................................11 B. Probleme propuse...............................................................................................................22 CAP.3 STRUCTURI DE CONTROL...........................................................................26 3.1 Structura secvenţială şi alternativă...................................................................................26 A. Probleme rezolvate.............................................................................................................26 B. Probleme propuse...............................................................................................................29 3.2 Structura repetitivă (iterativă)..........................................................................................31 A. Probleme rezolvate.............................................................................................................31 B. Probleme propuse...............................................................................................................69 CAP.4 TABLOURI..................................................................................................... 74 4.1 Tablouri unidimensionale (vectori)...................................................................................74 A. Probleme rezolvate.............................................................................................................74 B. Probleme propuse.............................................................................................................106
2
Caiet de laborator pentru clasa a IX-a
Cap.1 Funcţii de citire/scriere 1.1 Funcţii de citire/scriere pentru caractere şi şiruri de caractere A. Probleme rezolvate
Caiet de laborator clasa a IX-a
3
1. Citiţi fără ecou un caracter imprimabil sau alb, tastat la terminalul standard şi apoi afişaţi-l pe ecranul acestuia. #include void main() { int c; clrscr(); //caracterul citit fără ecou se memorează în c c=getch(); //se afişează caracterul; pe ecran apare o singură //dată putch(c); getch(); } 2. Citiţi cu ecou un caracter imprimabil sau alb şi afişaţi-l pe ecran precedat de un spaţiu. #include void main() { int c; clrscr(); c=getche(); //citirea caracterului cu ecou putch(‘ ‘); //afişarea spaţiului care îl precede putch(c); //afişarea caracterului getch(); } 3. Citiţi un caracter alb sau imprimabil folosind macrourile getchar şi putchar . #include #include void main() { int c; clrscr(); c=getchar(); //citirea bufferată a caracterului putchar(c); //afişarea caracterului getch(); } 4. Citiţi cu ecou o litera mică şi afişaţi-o ca literă mare . #include void main() { int lit; clrscr(); lit=getche(); //citirea literei cu ecou //transformarea în literă mare şi afişarea putch(lit-‘a’+’A’); getch(); } Observaţie: Dacă caracterului citit nu este o literă mică, programul anterior nu poate afişa o literă mare ci un caracter ASCII care are codul obţinut după calculul anterior. 5. Rezolvaţi problema anterioară folosind macrourile getchar şi putchar . #include #include void main() { clrscr(); putchar(getchar()-‘a’+’A’); getch(); } 6. Citiţi de la terminalul standard o succesiune de caractere imprimabile şi reafişaţi-o pe ecran, după ce l-aţi şters . #include #include
Caiet de laborator clasa a IX-a
4
void main() { char tab[255]; clrscr(); gets(tab); //citeşte şirul de caractere clrscr(); //curăţă ecranul puts(tab); //reafişează şirul de caractere getch(); } Observaţie: Rulaţi acest program pentru şiruri care conţin caractere albe (blancuri şi tab-uri) şi studiaţi comportamentul funcţiei gets() pentru astfel de şiruri. 7. Să se afişeze pe câte un rând fiecare cuvânt al textului : INVAT LIMBAJUL C. #include #include void main() { clrscr(); puts(“INVAT”); puts(“LIMBAJUL”); puts(“C”); getch(); } Observaţie: Reamintim că funcţia puts() scrie un caracter newline după şirul pe care îl are drept argument, mutând cursorul la începutul liniei următoare.
B. Probleme propuse 1. Citiţi cu ecou un caracter imprimabil sau alb, tastat la terminalul standard şi apoi afişaţi-l pe ecran. 2. Citiţi cu ecou o literă mare şi apoi afişaţi-o ca literă mică. 3. Rezolvaţi problema anterioară folosind macrourile getchar() şi putchar(). 4. Rezolvaţi problemele A.3 şi A.4 fără a folosi o variabilă intermediară în care să memoraţi caracterul citit. 5. Scrieţi un program care să citescă un caracter de control(ex.F1,F2) şi afişaţi “imaginea” acestuia. Studiaţi modul în care trebuie utilizată funcţia getch() pentru aceste caractere. 6. Scrieţi un program care să se afişeze antetul de mai jos : linia 1 Notele la disciplina linia 4 LIMBAJUL C linia 6 8 Noiembrie 2000 linia 10 Nr.crt. Nume Prenume Nota unde : - cuvântul "Notele" se afişează începând cu coloana 15 din linia 1 - cuvântul "LIMBAJUL" se afişează începând cu coloana 30 din linia 4 - data calendaristică se afişează începând tot cu coloana 30 din linia 6 - in linia 10 , cuvintele încep după cum urmează : Nr.crt. începe în coloana 2 Nume începe în coloana 18 Prenume începe în coloana 37 Nota începe în coloana 50
1.2 Funcţiile de citire/scriere cu format A. Probleme rezolvate 1. Citiţi un caracter şi afişaţi-l pe ecran precedat de un spaţiu . #include #include void main() { char c; clrscr(); scanf("%c",&c); //citirea caracterului
Caiet de laborator clasa a IX-a
}
5
printf("%2c",c); //afişarea pe un câmp de lungime 2 getch();
2. Citiţi un caracter şi afişaţi-l pe ecran precedat şi urmat de câte un asterisc. #include #include void main() { char c; clrscr(); scanf("%c",&c); //citirea caracterului printf("*%c*",c); //afişarea in formatul cerut getch(); } 3. Citiţi un caracter şi afişaţi-l într-un câmp de 3 caractere, aliniat la dreapta, câmpul fiind precedat şi urmat de câte un asterisc. #include #include void main() { char c; clrscr(); scanf("%c",&c); //citirea caracterului //afişarea pe un câmp de lungime 3 şi //încadrat de asterisc printf("*%3c*",c); getch(); } 4. Citiţi o cifră zecimală ca şi caracter şi afişaţi-o precedată de 3 zerouri nesemnificative . #include #include void main() { char c; clrscr(); scanf("%c",&c); //citirea unui caracter //afişarea caracterului precedat de 3 zerouri printf("000%c",c); getch(); } 5. Citiţi un şir de maxim 50 de caractere şi afişaţi-l pe ecran pe o linie nouă. #include #include void main() { char t[51]; clrscr(); scanf("%s",t); //citirea şirului printf("\n%s",t); //afişarea pe o linie nouă getch(); } 6. Citiţi un număr întreg de 4 cifre şi afişaţi-l pe ecran folosind următorii specificatori de format : %d, %o, %x, %X, %7d, %-7d, %07d. Câmpul va fi precedat şi urmat de un asterisc. Analizaţi valoarea afişată pentru fiecare specificator în parte şi justificaţi-o teoretic. #include #include void main() { int i; clrscr(); scanf("%4d",&i); //citirea unui întreg de 4 cifre
6
Caiet de laborator clasa a IX-a printf("*%d*\n",i); printf("*%o*\n",i); printf("*%x*\n",i); printf("*%X*\n",i); printf("*%7d*\n",i); printf("*%-7d*\n",i); printf("*%07d*\n",i); getch();
} 7. Citiţi un caracter şi scrieţi-l pe o linie nouă urmat de codul său ASCII . #include #include void main() { char car; clrscr(); scanf("%d",&car); //citirea caracterului printf("caracterul: %c are codul ASCII: %d\n",car,car); getch(); } Observaţie: Reamintim că în limbajul C tipul char este tratat ca un întreg scurt. Specificatorul %c va trata valoarea ca pe un caracter, în timp ce specificatorul %d ca pe un întreg, adică va afişa codul său ASCII. 8. Citiţi o literă mare şi afişaţi-o ca literă mică . #include #include void main() { char c; clrscr(); scanf("%c",&c); //citirea caracterului //afişarea ca literă mică printf("%c\n",c-'A'+'a'); getch(); } 9. Citiţi numele şi prenumele unei persoane de la tastatură şi apoi afişaţi datele respective pe o linie nouă separate printr-un tabulator. Se presupune că atât numele cât şi prenumele nu depăşesc fiecare 50 de caractere şi se separă prin caractere albe la tastare . #include #include void main() { char nume[51] ; char prenume[51]; clrscr(); //citirea celor două şiruri de caractere scanf("%s%s",nume,prenume); //afişarea lor separate prin tab printf("%s\t%s\n",nume,prenume); getch(); } Observaţie: Reamintim că, în lipsa unui scanset adecvat, funcţia scanf() nu poate citi şiruri de caractere ce conţin spaţii. Astfel, primul specificator %s va citi caracterele tastate până la primul spaţiu şi le va stoca în variabila nume. Deasemenea, funcţia scanf() lucrează în mod bufferat, adică preia datele nu direct de la tastatură ci din zona tampon (buffer-ul) asociată acesteia. Bufferul de intrare se goleşte atunci când se citesc toate caracterele până la întâlnirea caracterului newline (generat la apăsarea tastei Enter). Astfel, al doilea specificator %s va citi restul caracterelor aflate în buffer după spaţiu şi le va stoca în variabila prenume. Această citire se face corect numai dacă datele de intrare sunt tastate conform cerinţelor din program (pe aceeaşi linie separate prin spaţii).
Caiet de laborator clasa a IX-a
7
10. Citiţi un întreg zecimal de cel mult 4 cifre şi afişaţi-l ca întreg în baza 10, 8 şi 16. Cele trei numere vor fi afişate pe o linie nouă separate printr-un tabulator. #include #include void main() { int n; clrscr(); //citirea unui întreg de 4 cifre scanf("%4d",&n); //afişarea valorii în cele 3 baze printf("%d\t%o\t%x\n",n,n,n); getch(); } 11. Citiţi 4 cifre zecimale şi afişaţi-le precedate de câte un spaţiu fiecare . #include #include void main() { int i1,i2,i3,i4; clrscr(); //citirea a patru întregi de câte o cifră fiecare scanf("%1d %1d %1d %1d",&i1,&i2,&i3,&i4); //afişarea valorilor precedate de spatii printf("%2d%2d%2d%2d",i1,i2,i3,i4); getch(); } 12. Citiţi o dată calendaristică tastată sub forma zzllaa (două cifre pentru zi, două cifre pentru lună şi două pentru an). Afişaţi data respectivă sub forma 19aallzz. #include #include void main() { int zi,luna,an; clrscr(); //citirea celor 3 întregi de câte două cifre //fiecare scanf(“%2d%2d%2d”,&zi,&luna,&an); //afişarea celor 3 întregi precedaţi de 19, pe câte //un câmp de 2 caractere cadrat la dreapta şi //completat cu zerouri printf(“19%02d%02d%02d\n”,an,luna,zi); getch(); }
B. Probleme propuse 1. Citiţi un caracter şi afişaţi-l într-un câmp de 3 caractere cadrat la stânga, câmpul fiind precedat şi urmat de câte un asterisc . 2. Pentru o dată calendaristică se introduce de la tastatură un şir care are forma: "zz.ll.aa". Scrieţi un program care citeşte o dată în acest format şi apoi afişează pe câte o linie ziua, luna şi anul citite. 3. Citiţi un text de 16 caractere şi afişaţi-l pe ecran, pe câte o linie nouă, folosind următorii specificatori de format : %s, %20s, %-20s, %10s, %10.5s, %-10.5s. Câmpul în care se afişează textul este precedat şi urmat de un asterisc. 4. Citiţi un număr întreg cu maxim 9 cifre şi afişaţi-l pe ecran folosind specificatorii de format : %ld, %lo, %lx, %lX, %15ld, %-15ld, %015ld. Câmpul va fi precedat şi urmat de un asterisc. 5. Citiţi inversul lui PI cu 14 zecimale (0.31830988618379) şi afişaţi-l folosind următorii specificatori de format : %.15f, %.14f, %.13f, %.12f, %.11f, %.10f, %f, %.15e, %.14e, %.13e,
Caiet de laborator clasa a IX-a
8
6. 7. 8. 9. 10. 11. 12.
%.12e, %.11e, %.10e, %e. Pe fiecare linie se vor tipări câte trei valori separate prin câte două spaţii. Citiţi numărul 1234567890 şi afişaţi-l cu exponent . Afişaţi numărul float f=123.672 folosind specificatorii : %10f, %10.1f, %10.0f, %e, %.1Ef, %g, %10.1g, %10.0g, fiecare valoare pe câte o linie , câmpul fiind precedat şi urmat de un asterisc. Citiţi un întreg zecimal de cel mult 9 cifre şi afişaţi-l ca întreg în baza 10, 8 si 16 . Cele trei valori vor fi afişate pe o linie nouă separate printr-un tabulator . Citiţi 4 cifre zecimale şi afişaţi-le urmate fiecare de câte un zero. Citiţi o succesiune de 4 cifre care reprezintă o zi din luna octombrie pe primele două cifre şi anul pe ultimile două (zzaa). Afişaţi data calendaristică respectivă sub forma : 19aa Octombrie zz . Scrieţi un program care, utilizând un scanset adecvat, să permită citirea şi afişarea şirurilor de caractere care conţin spaţii. Scrieţi un program care, utilizând un scanset adecvat, să permită citirea şirurilor de caractere care nu conţin cifre zecimale, respectiv litere mici.
Caiet de laborator clasa a IX-a
9
Cap.2 Operatorii limbajului C A. Probleme rezolvate 1. Ţinând seama de regulile de precedenţă pentru calculul expresiilor, indicaţi rezultatele pe care le afişează programul următor, explicaţi obţinerea acestor rezultate şi apoi verificaţi rulând programul. #include #include void main() { int x=2, y=7, z,u; clrscr(); u=x*(y-2)%3; printf("\n u=%d",u); z=u+=x*=y; printf("\n x=%d\ty=%d\tu=%d\tz=%d",x,y,u,z); x=-y*z%3+u; printf("\n x=%d",x); z=(x-y)*(u-x); printf("\n z=%d",z); getch(); } Rezolvare: Pentru prima expresie, mai întâi se efectuează scăderea, întrucât parantezele au prioritate mai mare; se obţine valoarea 5; operaţiile de înmulţire şi împărţire cu rest au aceeaşi precedenţă şi se efectuează de la stânga la dreapta; se înmulţeşte x cu 5 şi după aceea se face împărţirea lui 10 cu 3, restul obţinut fiind 1. În a doua expresie operatorii cu atribuiri se evaluează de la dreapta la stânga; mai întâi se înmulţeşte x cu y, x devenind 14 ; mai apoi se adună la u valoarea lui x, u devenind 15; în final valoarea lui u este atribuită lui z care devine astfel egal cu 15. În a treia expresie operatorul unar minus schimbă semnul lui y întrucât are o precedenţă mai mare decât toate celelalte operaţii; se execută de la stânga spre dreapta înmulţirea şi împărţirea cu rest obţinându-se zero; ultima operaţie înainte de atribuire este adunarea; după atribuire x devine 15. În ultima expresie se evaluează parantezele de la stânga la dreapta, x-y şi apoi u-x, apoi înmulţirea şi ultima operaţie este atribuirea, rezultatul fiind zero. Se afişează : u=1; x=14 y=7 u=15 z=15; x=15; z=0 2. Având în vedere modul de evaluare a expresiilor de atribuire, să se indice rezultatele afişate de programul următor, să se explice aceste rezultate şi apoi să se verifice rulând programul. #include #include void main() { int a=1, b=2, c=3, d=4; clrscr(); d/=(a*=(b+=c)%3)-10; //1 printf("\n a=%d b=%d c=%d d=%d",a,b,c,d); a=1 , b=2, c=3, d=4; d/=a*=b+=c%3-10; //2 printf("\n a=%d b=%d c=%d d=%d",a,b,c,d); getch(); } Rezolvare: Pentru prima instrucţiune, se execută întâi b=b+c şi b devine 5, apoi b%3=2, apoi a=a*2 şi a devine 2, apoi d=d/(2-10)=d/(- 8)=0. Valorile afişate sunt: a=2 b=5 c=3 d=0. Pentru a doua instrucţiune, se execută mai întâi b=b+c%3-10=2+0-10 şi b devine –8, apoi a=a*(-8) şi a devine –8, apoi d=d/(- 8) şi d devine 0. Variabila c rămâne 3 şi se afişează: a=- 8 b=- 8 c=3 d=0
10
Caiet de laborator clasa a IX-a
3. Programul următor ilustrează modalităţile de utilizare a operatorilor unari +,-,++,-- şi a operatorilor binari + şi -. Precizaţi rezultatele afişate de program, explicaţi aceste rezultate şi apoi verificaţi-le rulând programul. #include #include void main() { int a=1, b=10; clrscr(); printf("\n a+++b=%d",a+++b); //1 printf(" a=%d b=%d",a,b); a=1, b=10; printf("\n a+ ++b=%d",a+ ++b); //2 printf(" a=%d b=%d",a,b); a=1, b=10; printf("\n a +++b=%d",a +++b); //3 printf(" a=%d b=%d",a,b); a=1, b=10; printf("\n a+++ b=%d",a+++ b); //4 printf(" a=%d b=%d",a,b); a=1, b=10; printf("\n a++ +b=%d",a++ +b); //5 printf("\n a++-b=%d",a++-b); //6 printf(" a=%d b=%d",a,b); a=1, b=10; printf("\n a---b=%d", a---b); //7 printf(" a=%d b=%d",a,b); a=1, b=10; printf("\n a+++++b=%d", a+ + + + +b); //8 printf(" a=%d b=%d",a,b); a=1, b=10; printf("\n a++ + ++b=%d", a++ + ++b); //9 printf(" a=%d b=%d",a,b); getch(); } Rezolvare: Aceşti operatori se grupează de la stânga la dreapta. Instrucţiunea (1), execută a+b, apoi a++ (postincrementare) şi se afişează: a+++b=11 a=2 b=10 Instrucţiunea (2) preincrementează b (operatorul de preincrementare este legat explicit de b) şi apoi a+b. Se afişează: a+ ++b=12 a=1 b=11 Instrucţiunea (3), pentru că cei trei operatori + sunt legaţi de b, face gruparea lor de la stânga la dreapta astfel încât se calculează a+b şi apoi se postincrementează a ( ca la instrucţiunea 1). Se afişează: a +++b=11 a=2 b=10 Instrucţiunea (4) lucrează exact ca (3), cei trei operatori + fiind legaţi de a. Se afişează: a+++ b=11 a=2 b=10 Instrucţiunea (5) se execută la fel ca (3) şi (4) operatorul de postincrementare fiind scris explicit, legat de a şi separat prin spaţiu de operatorul binar de adunare. Se afişează: a++ +b=11 Instrucţiunea (6) lucrează cu valorile obţinute după instrucţiunea (5), adică a=2 şi b=10. Se execută întâi a-b, apoi a se postincrementează. Se afişează: a++-b=-8 a=3 b=10 Instrucţiunea (7) lucrează ca instrucţiunea (1), dar cu operatori de scădere şi postdecrementare. Întâi se execută a-b, apoi a--. Se afişează: a---b=-9 a=0 b=10 În cazul instrucţiunii (8), compilatorul nu poate stabili care operatori sunt de incrementare şi care de adunare. Îi execută de la stânga la dreapta sub forma a+(+(+(+ (+b))))=a+b. Cele două variabile nu îşi schimbă valoarea şi se afişează:
Caiet de laborator clasa a IX-a
11
a+++++b=11 a=1 b=10 În cazul instrucţiunii (9) operatorii de pre şi postincrementare sunt legaţi explicit de variabile şi separaţi prin spaţii de operatorul binar de adunare. Se execută în ordine ++b, a+b, a++ şi se afişează: a++ + ++b=12 a=2 b=11 4. Să se arate care sunt rezultatele pe care le afişează programul de mai jos şi să se argumenteze aceste rezultate pe baza regulilor de precedenţă. Să se verifice apoi rezultatele rulând programul. #include #include void main() { int x=3, y=7, z=9; clrscr(); printf("\n %d", x>y&&y>z); printf("\n %d", x3 e)-~i g)~-!im)~01&i b)i4 c)ua