Download - Culegere de Probleme Rezolvate in C C

Transcript
  • NECIU ILEANA

    CULEGERE DE PROBLEME REZOLVATE C/C++

    ISBN 978-606-577-575-6 Editura Sfntul Ierarh Nicolae 2011

  • 1

    Recomandare

    Cartea cu titlul Culegere de probleme rezolvate C/C++ pune n eviden importana pregtirii

    practice a elevilor din punct de vedere informatic. La finalizarea cursurilor liceale, elevii au de ntocmit i susinut o lucrare de specialitate, lucrare care s scoat n eviden nsuirea i aplicarea tuturor noiunilor

    teoretice i practice de informatic acumulate de-a lungul celor 4 ani colari. Totodat, pentru a promova proba digital din cadrul examenului de bacalaureat, elevii i dezvolt, n cadrul orelor de informatic, TIC, .a., competene digitale. Toate aptitudinile i abilitile de conducere a calculatorului deprinse de elevi se formeaz treptat, n timp, n urma unei activiti consecvente.

    Culegerea este bine structurat i aranjat, astfel nct, parcurgnd toate paginile, elevii s gseasc un sprijin real n rezolvarea tuturor problemelor informatice care pot apare n viaa liceal de zi

    cu zi i nu numai.

    Tocmai de aceea, autoarea i-a propus ca, prin cele 110 probleme enunate i rezolvate, elevii s aib o viziune de ansamblu asupra limbajelor de programare.

    Este o culegere util pentru elevii claselor de matematic-informatic, de aceea recomand cartea pentru publicare.

    18.05.2011

    Colegiul Tehnic Anghel Saligny Roiorii de Vede

    prof.gr.I dr.ing. Costache Florentina-Flori

  • 2

    Prefa

    Culegerea cuprinde probleme rezolvate n limbajul de programare C/C++ , probleme care au

    fost propuse la proba practic pentru examenul de atestat profesional la informatic n judeul

    Teleorman, de a lungul anilor 2006-2011 i se adreseaz tuturor elevilor de liceu, de la clasele de

    matematic-informatic.

    Culegerea se poate dovedi util att n pregatirea de zi cu zi la informatic, ct i n pregtirea

    pentru examenele de atestat profesional sau de bacalaureat.

    Toate programele din carte au fost verificate cu ajutorul mediului de programare Borland C.

    mi exprim sperana ca aceast lucrare s fie de un real folos celor interesai.

    Autoarea

  • 3

    ATESTAT 2006 TELEORMAN

    SUBIECTE C++

    1. S se calculeze:

    S= 1-1*2+1*2*3- (-1)n+1 *1*2**n #include #include #include main() {int s,p,i,n; coutn; s=0;p=1; for(i=1;i

  • 4

    #include #include main() {int i,j,n; coutn; for(i=n;i>=1;i--) {for(j=i;j>=1;j--) cout

  • 5

    #include #include main() {int i,j,n; coutn; for(i=1;i

  • 6

    {int x,y,z; coutx; couty; while((x!=12)&& (y!=12)) { cout

  • 7

    cin>>x; while(x!=0) {patrat=x*x;cout

  • 8

    {float x[100]; float y[100]; int n,i,s,a; coutn; for(i=1;i

  • 9

    coutn;min=0; for(i=1;i

  • 10

    int m,k,i,j,x,n=0; while(f.get(c,100)){ n=n+1;m=strlen(c); f.get();} m=m-m/2; cout

  • 11

    cin>>n; coutm; for(i=1;i

  • 12

    fstream g("fisier2.txt",ios::in); fstream n("fisier3.txt",ios::app); while(g>>resetiosflags(ios::skipws)>>ch) n

  • 13

    else j=j+1;} if(ok) {//cout

  • 14

    #include main() {fstream f("fractii.in",ios::in); fstream g("fractii.out",ios::out); int i,j,x,y; while(f>>i>>j) {x=i;y=j; while(x!=y) if(x>y)x=x-y; else y=y-x; if(x==1)g

  • 15

    {cout

  • 16

    if(s==x) {i=i+1; cout

  • 17

    char clasa; Nod*adr_urm;}; int n,i; Nod *v; void adaug(Nod*&v) {Nod *c=new Nod; cout=7) {cout

  • 18

    if((a[nod][k]==1)&& (s[k]==0))df(k);} int conex() {int gasit=0,i; df(1); for(i=1;i

  • 19

    ATESTAT 2009 TELEORMAN SUBIECTE C++

    26. S se afieze toate numerele ntregi, mai mici sau egale cu x, a cror sum a cifrelor este impar.

    #include #include void main() {int x,s,i,n; cout

  • 20

    {ninv=ninv*10+inv%10; inv=inv/10;} final=x*pow(10,nr-k+1)+c*pow(10,poz)+ninv; cout

  • 21

    {a3=a2+a1; v[i]=a3; a1=a2; a2=a3;} cout

  • 22

    gasit=0; for(i=1;i

  • 23

    if(x) cout

  • 24

    getch();}

    36. Se citete o matrice cu n linii i m coloane. S se memoreze ntr-un vector sumele elementelor de pe fiecare linie a matricei.

    #include #include void main() {int a[10][10],i,j,n,m,v[10],s; coutn; coutm; cout

  • 25

    coutn; s=0; for( i=1;i

  • 26

    cin>>x;} cout

  • 27

    43. S se determine toi divizorii primi ai unui numr natural dat.

    #include #include void main () { int n,i; coutn; i=2; while(n!=1) {if(n%i==0) {cout

  • 28

    ATESTAT 2010 TELEORMAN SUBIECTE C++

    44. Scriei un program Pascal/C++ care citete de la tastatur un cuvnt format din cel mult 20 de caractere, doar litere mici ale alfabetului englez. Programul determin transformarea cuvntului citit prin nlocuirea fiecrei vocale a cuvntului cu litera mare corespunztoare, restul literelor nemodificndu-se. Programul afieaz pe ecran cuvntul obinut. Se consider vocale literele din mulimea {a,e,i,o,u}.

    Exemplu: pentru cuvntul anotimp se va afia AnOtImp.

    #include #include #include #include void main() { char s[21], v[]="aeiou"; int i, n; cin.get(s,21); n=strlen(s); for(i=0;i

  • 29

    if(s[i-1]==' '&& s[i]!=' ') s[i]=toupper(s[i]); coutn; for(i=1;i

  • 30

    x=min; y=max; while (x!=y) if (x>y) x=x-y; else y=y-x; cout

  • 31

    if ( x[0]==0 && y[0]==0) cout

  • 32

    else cout

  • 33

    {int n,inv,ninv,k,k1; coutn; k=0;k1=0;inv=0;ninv=0; while(n) {if(n%2==0) inv=inv*10+n%10; else inv=inv*10; n=n/10;k=k+1;} while(inv) {ninv=ninv*10+inv%10; inv=inv/10;k1=k1+1;} if(k==k1) cout

  • 34

    56. S se afiseze al n-elea termen al irului lui Fibonacci, folosind o funcie recursiv. irul are primii 2 termeni egali cu 1 i fiecare din urmtorii termeni este egal cu suma dintre termenul precedent i termenul anteprecedent.

    #include #include int n; int fib(int n) {if(!n) return 0; else if(n==1)return 1; else return fib(n-1)+fib(n-2);} main() {coutn; cout

  • 35

    cin>>n; v[1]=n; j=2; for(int i=n/2;i>=2;i--) if(n%i==0) { v[j]=i; j++;} k=j; v[k]=1;s=0; for(int i=1; i

  • 36

    60. S se determine numrul total de descompuneri ale unui numr natural, care nu pot fi obinute una din alta prin permutarea termenilor.

    Ex: 4=1+1+1+1 4=1+1+2 4=1+3 4=2+2 4=4

    #include #include int sol[100],n,i,s; void back(int k) {if(s==n) {for(i=1;i

  • 37

    int dx[]={-2,-1,1,2,2,1,-1,-2}; int dy[]={1,2,2,1,-1,-2,-2,-1}; int t[100][100],st[100][2],i,j,n,xc,yc,xr,yr,k,lin,col; int solutie(int k) { int ok=0; for(j=1;j1&&st[k][0]==xc&&st[k][1]==yc&&ok==1) return 1; else return 0; } void tipar(int k) { cout

  • 38

    62. Se citete un numr ntreg de la tastatur. Scrieti o funcie care calculeaz numrul de cifre ale lui n. Folosind aceast funcie stabilii dac n se gsete n intervalul [100,10000).(Nu se va compara numarul n cu 100 i nici cu 10000).

    #include #include int numar (int n) {int x=0; while(n!=0) {x=x+1; n=n/10; } return x;} void main() {int n; coutn; if (numar (n)>=3 && numar (n)i>>j) a[i][j]=a[j][i]=1; f.close();} void df(int nod) {int k; s[nod]=1; for (k=1;k

  • 39

    {citire("graf.txt",a,n); df(1); if(gasit) cout

  • 40

    int st[20],n,k,a[10][10],i,j,m; int valid(int k) {for(int i=1;i

  • 41

    cin>>a[i][j]; cout

  • 42

    coutn; s=0; nr=n; while(nr) {s=s+nr%10; nr=nr/10;} x=n-s; if(x>=0) {cout

  • 43

    {nod* c; if(v==0) {v=new(nod); v->info=val; v->adr=0; sf=v;} else {c=new (nod); sf->adr=c; c->info=val; c->adr=0; sf=c;}} void listare(nod*v) {nod*c=v; while(c) {coutadr;} cout

  • 44

    nod* v;nod* sf; int i; void adaugare(nod*&v, nod*&sf, int val) {nod* c; if(v==0) {v=new(nod); v->info=val; v->adr=0; sf=v;} else {c=new (nod); sf->adr=c; c->info=val; c->adr=0; sf=c;}} void listare(nod*v) {nod*c=v; while(c) {coutadr; if (c->info%2==0)nr=nr+1; } while(c->adr!=0); cout

  • 45

    {int info; nod* adr;}; nod* v;nod* sf; int i; void adaugare(nod*&v, nod*&sf, int val) {nod* c; if(v==0) {v=new(nod); v->info=val; v->adr=0; sf=v;} else {c=new (nod); sf->adr=c; c->info=val; c->adr=0; sf=c;}} void listare(nod*v) {nod*c=v; while(c) {coutadr=c->adr; c->adr=d; if(d->adr==0)sf=d;} void sterg(nod* &v) {nod*man; man=v; v=v->adr; delete man;} main() { int n,p,val,val1; coutn; for(i=1;i>p; adaugare(v,sf,p);};

  • 46

    listare(v); coutval; coutval1; inserare_dupa(v,sf,val,val1); listare(v); coutinfo=val; c->adr=v; sf=c;}} void listare(nod*v) {nod*c=v;cout

  • 47

    { int n,p; coutn; for(i=1;iinfo=val; c->adr=v; v=c; }} void listare(nod*v) {nod*c=v; cout

  • 48

    int p; coutx; while(x!=0) {p=x%10; adaugare(v,sf,p); x=x/10;}; listare(v); getch();}

    75. Fiind dat o list liniar dublu nlnuit, s se determine maximul cheilor din list.

    #include #include struct Nod {int info; Nod *next,*back; }; Nod *prim, *ultim; void creare_lista() {Nod *c; c=new Nod; coutc->info; if(!prim) {prim=c; prim->next=0; prim->back=0; ultim=prim; } else {ultim->next=c; c->back=ultim; ultim=c; ultim->next=0; } } void listare_stanga_dreapta() {Nod *c; c=prim; while(c) {cout

  • 49

    void listare_dreapta_stanga() {Nod *c; c=ultim; while(c) {coutinfo>max)max=c->info; c=c->next;} return max; } void main() {int n,i; clrscr(); coutn; for(i=1;i

  • 50

    5=2+2+1 5=2+3 5=3+1+1 5=3+2 5=4+1 5=5

    #include #include int sol[100],n,i,s; void back(int k) {if(s==n) { fstream f("part.txt",ios::app); for(i=1;i

  • 51

    for(i=1;im2; if(m1!=n2) g

  • 52

    79. Se citesc de la tastatur dou cuvinte. S se scrie un program care verific dac unul este anagrama celuilalt. Un cuvnt este anagram pentru altul dac cele dou cuvinte conin aceleai litere de acelai numr de ori, dar nu neaprat n aceeai ordine.

    #include #include #include void sort(char *s) { char i,j,aux[30],cc; strcpy(aux,s); for (i=0;i

  • 53

    {if(s==suma) {fstream g("monede1.txt",ios::app); g

  • 54

    {sf->adr=c; sf=c;}} void sterg(nod*v) {nod*c=v; while(v) {v=v->adr; delete c; c=v;}} void afis(nod*v) {int i=0; while(v) {if(i) coutadr; } else if(c1->grad>c2->grad) {adaug(v,sf,c1->grad,c1->coef); c1=c1->adr;} else {adaug(v,sf,c2->grad,c2->coef); c2=c2->adr;} if(c1) while(c1) {adaug(v,sf,c1->grad,c1->coef); c1=c1->adr;} else while(c2) {adaug(v,sf,c2->grad,c2->coef); c2=c2->adr; } return v;}

  • 55

    nod *mulmonom(nod *v, int gr, float cf) {nod *vf=0; *sf; while(v) {adaug(vf,sf,v->grad+gr,v->coef*cf); v=v->adr; } return vf;} nod *mul(nod* v1, nod*v2) {nod*v=0; while(v2) {nod *vman=0, *vman1; vman=mulmonom(v1,v2->grad,v2->coef); vman1=v; v=adun(v,vman); sterg(vman); sterg(vman1); v2=v2->adr; } return v;} main() { char linie[100]; nod*p1,*p2,*vf=0,*sf; int gr1,gr2,gr; float cf; fstream f1("pol1.txt",ios::in); f1>>gr1; cout

  • 56

    p2=vf; afis(p2); f2.close(); nod*p=mul(p1,p2); fstream f3("pol3.txt",ios::out); int i=0; v=p; while(v) {if(i) f3

  • 57

    ATESTAT 2011 TELEORMAN SUBIECTE C++

    82. Se consider o matrice A cu m linii i n coloane ce contine numere ntregi. S se scrie un program care afieaz, pe o singur linie n fiierul text A.txt, elementele situate pe conturul matricei. Se pornete din poziia (1,1) i parcurgerea se va face n sensul acelor de ceasornic.

    #include #include #include void main() {int n,m,i,j,a[100][100]; coutn; coutm; for(i=1;ia[i][j]; for(i=1;i

  • 58

    cin>>a[i][j];} for(i=1;i

  • 59

    85. Se consider o matrice A cu m linii i n coloane de numere ntregi. S se introduc o nou linie la nceputul matricii. S se afieze matricea obinut n format corespunztor n fiierul A.txt.

    #include #include #include void main() {int n, m, i,j, a[100][100]; fstream f("A.txt",ios::out); coutm; coutn; for(i=1;i

  • 60

    float m; fstream f("B.txt",ios::out); coutn; for(i=1;i

  • 61

    88. S se scrie un subprogram recursiv care afieaz elementele situate pe poziii pare ntr-un vector ce conine numere ntregi. Elementele vor fi afiate fiecare pe cte un rnd i vor fi afiate n ordinea n care apar n vector. Dimensiunea vectorului i elementele acestuia se gsesc pe o linie n fiierul C.TXT

    #include #include #include ifstream f("C.txt"); void afis(int n, int v[100]) { if(n) { afis(n-2,v); coutv[i]; if(n%2!=0)n=n-1; afis(n,v); getch();}

    89. Fie A o matrice ptratic de dimensiune n(n>2) de numere reale. Cele doua diagonale mpart matricea n 4 regiuni(4 triunghiuri). S se verifice dac suma elementelor din interiorul triunghiului de sus este egal cu suma elementelor din interiorul triunghiului de jos. Dimensiunea matricei i elementele acesteia se gsesc n fisierul INTRARE.txt astfel: pe prima linie se gsete n, pe urmtoarele n linii se gseste cte o linie din matrice.

    #include #include #include ifstream f("INTRARE.txt"); void main() { int n,i,j, a[100][100],s1,s2; f>>n; for(i=1;ia[i][j]; for(i=1;i

  • 62

    cout

  • 63

    f.close(); }

    91. Se consider o matrice cu m linii i n coloane de numere ntregi. Dimensiunile matricei i elementele ei se gsesc n fiierul A.TXT astfel: pe prima linie se gsesc valorile m si n. Pe urmtoarele m linii se gsesc elementele celor m linii ale matricei. S se verifice dac exist n matrice dou linii identice i n caz afirmativ s se afieze numerele de ordine ale celor dou linii, iar n caz contrar s se afieze mesajul NU.

    #include #include void main() {int m,n,i,j,gasit,k,a[100][100]; coutm; coutn; for(i=1;i

  • 64

    f>>v[i]; for(i=1;i

  • 65

    94. Scriei un program C/C++ care citete din fisierul text BAC.TXT trei numere naturale x, y si k, (1y; f>>k; a=0; n=x; while ((n>=x)&&(n

  • 66

    int palindrom(int n) {int copie=n,oglindit,c; oglindit=0; while(n!=0) {c=n%10; oglindit=oglindit*10+c; n=n/10;} if (copie==oglindit) return 1; else return 0;} void main() {int n=0,p; p=0; fstream f("bac.txt",ios::in); fstream g("rez.txt",ios::out); while(!f.eof()) {f>>n; if(palindrom(n)) {g

  • 67

    nr=nr+1; p=p/10;} coutb>>c; f.close(); d=cmmdc(a,b); cout

  • 68

    99. Se citete de la tastatura un numr natural nenul n (n=1;d--) if(n%d==0) g

  • 69

    101. Scriei un program care citete un numr natural n>1 cu maximum 9 cifre din fiierul DATE.IN, i afieaz n fiierul DATE.OUT valoarea celui mai mic divizor prim a lui n, precum i puterea la care acest divizor apare n descompunerea n factori primi a numrului n. #include #include int n,p,c; void cmmd(int n) {int gasit=0,d=2; while((d>n; cmmd(n); g

  • 70

    n=n/10; } gp; x=strlen(s1)-1; y= strlen(s2)-1; for( int i=1;i

  • 71

    void main() { fstream f("bac.txt",ios::in); fstream g("ies.txt",ios::out); f>>n; for(int i=1;i

  • 72

    106. S se scrie un program care s numere cuvintele dintr-un text citit din fiierul cuvinte.txt. Textul conine cuvintele separate numai printr-un spaiu, fr semne de punctuaie, singurul semn de punctuaie este . de la sfritul textului. Numrul de cuvinte se va afia pe ecran.

    #include #include #include void main() { ifstream f("cuvinte.txt"); char s[100]; int k=1,n; f.getline(s,100);n=strlen(s); for(int i=0;i< n;i++) if(s[i]==' '&& s[i+1]!=' ') k++; cout

  • 73

    } for(int i=1;i

  • 74

    #include #include int n, a[100]; void citire () { int i; for(i=1;i>a[i]; } int div(int x) { int i, nr=0; for(i=2;i>n; citire(); for(i=1;imax) max=div(a[i]); for(i=1;i

  • 75

    } n=i; f.close(); } void maxim() { int b[50]; cout