[PROBLEME C++ rezolvate]

Problema: se cer primele 200 numere naturale  prime 


#include<iostream.h>


#include<conio.h>

int j,n,i,s;

int main()

{n=0;i=1;cout<<i<<endl;n++; cout<<i<<endl; n++;

while (n<200)

{s=0;i++;for (j=2;j<i/2;j++)if(i%j==0)s=1;

if (s==0) cout <<i<<endl; n++;} getch ();


return 0;

}

Tema : scrieti numerele naturale intr-un fisier separate prin spatii
INDICATIE : # include<fstream.h> la inceput 
                      in program ofstream g("iesire.txt");
                      ...................................................
                      g<<i<<"             ";//e instructiunea ce face efectiv scrierea 

Subiectul nr. 1 Fişierul atestat.in conţine două linii. Pe prima linie este scris un număr natural nenul n,(5<n<30). Pe cea de-a doua linie a fişierului sunt scrise n numere naturale separate prin câte un spaţiu, formate fiecare din cel mult 4 cifre,  reprezentând un şir de n numere naturale nenule. Cel puţin unul din cele n numere din şir este număr impar.


Să se scrie un program, în limbajul Pascal/C/C++, care:

a)     afişează pe ecran, în linie, separate printr-un spaţiu, toate numerele impare din şir;

b)     prin intermediul unui subprogram, afişează pe următoarea linie a ecranului, separate prin câte un spaţiu, numărul cifrelor fiecărui element din şirul dat;

c)      scrie în fişierul atestat.out cel mai mare divizor comun al elementului minim şi cel maxim din şir. Exemplu:

atestat.in
Date de ieşire:
6
1232 543 98 233 242 33
a)
b)

c)
543 233 33
4 3 2 3 3 2
Fişierul atestat.out conţine:
11

REZOLVAREA

#include <iostream>

#include<fstream>

using namespace std;

fstream f("atestat.in");

ofstream g("atestat.out");

int n,a[10],i,maxim,minim;

void cerintaa()

{

       f>>n;

       for (i=0;i<n;i++)

        {f>>a[i]; if(a[i]%2==1) cout<<a[i]<<"    ";cout<<endl;}

}

void cerintab()

{ int j,b;//j var locala initializata cu 0

    for(i=0;i<n;i++){b=a[i];j=0;while(b>0){b=b/10;j++;} cout<<j<<"  "; }

}

void cerintac()

{

    maxim=a[0];minim=a[n-1]; //initializam max si min in mod formal

    for(i=0;i<n;i++) if(a[i]>maxim) maxim=a[i];

    for(i=0;i<n;i++)  if(a[i]<minim) minim=a[i];

    while(maxim!=minim) {if(maxim>minim) maxim=maxim-minim;

                         if(maxim<minim) minim=minim-maxim;

                     }

                     g<<minim<<"   este cmmdc ";

}

int main()

{

    cerintaa();cerintab();cerintac();f.close();g.close();

    return 0;

}


Subiectul nr. 2


Fişierul atestat.in conţine două linii. Pe prima linie este scris un număr natural nenul n,(5<n<30). Pe cea de-a doua linie a fişierului sunt scrise n numere naturale separate prin câte un spaţiu, formate fiecare din cel mult 4 cifre,  reprezentând un şir de n numere naturale. Cel puţin unul din cele n numere din şir are cifra unităţilor mai mare decât numărul 5.


Să se scrie un program, în limbajul Pascal/C/C++, care:


a)     afişează pe ecran, în linie, separate printr-un spaţiu, toate numerele care au ultima cifră mai mare decât numărul 5;


b)     prin intermediul unui subprogram, afişează pe următoarea linie a ecranului, numărul apariţiilor elementului maxim din şir;


c)     scrie în fişierul atestat.out, separate prin câte un spaţiu, toate  numerele prime din şirul dat. Un număr natural este prim dacă are exact doi divizori distincţi (numărul 1 şi numărul în sine). Dacă nu există numere prime se va scrie pe prima linie a fişierului mesajul “NU EXISTA NUMERE PRIME”. Exemplu:


atestat.in
Date de ieşire:
6
128 2715 17 1009 61 2715
a)
b)

c)
128 17 1009
2
Fişierul atestat.out conţine:
17 1009 61


#include<fstream>
#include<iostream>
using namespace std;
int n,a[10],i;
fstream f("atestat.in");
ofstream g("atestat.out");
void cerintaa()
{
f>>n;
for(i=0;i<n;i++) { f>>a[i];
                                  if(a[i]%10>5) cout<<a[i]<<"  ";
                                 }
cout<<endl;
}
void cerintab()
{
int max=a[0];
for(i=1;i<n;i++) if(a[i]>max) max=a[i];
int j=0;
for(i=0;i<n;i++) if(a[i]==max) j++;
cout<<"numarul de aparitii ale maximului este "<<j;
}
void cerintac()
{
int j,l,s=0;
for(i=0;i<n;i++) { l=0; for(j=2;j<a[i]/2;j++)   if (a[i]%j==0) l++;
                                  if(l==0) {g<<a[i]<<"  ";s=1;}
                            }
if(s==0) g<<"NU EXISTA NUMERE PRIME";
}
int main()
{
cerintaa();cerintab();cerintac(); f.close();g.close();return 0;
}



Subiectul nr. 3 Fişierul atestat.in conţine două linii. Pe prima linie este scris un număr natural nenul n,(5<n<30). Pe cea de-a doua linie a fişierului sunt scrise n numere naturale separate prin câte un spaţiu, formate fiecare din cel mult 4 şi cel puţin 2 cifre, reprezentând un şir de n numere naturale. Cel puţin unul din cele n numere este format din 2 cifre. Să se scrie un program, în limbajul Pascal/C/C++, care: 


a)     afişează pe ecran, în linie, separate printr-un spaţiu, toate numerele formate din două cifre;


b)     prin intermediul unui subprogram, afişează pe următoarea linie a ecranului, mesajul “DA” dacă suma numerelor din şir este cuprinsă în intervalul [a,b]sau “NU” în caz contrar. Cele două numere naturale a şi b, a<b, sunt citite de la tastatură;


c)scrie în fişierul atestat.out pe linii diferite, numerele din şir care au proprietatea ca printre numerele precedente să existe  cel puţin un număr strict mai mic decât valoarea lor. Dacă nu există astfel de numere se va scrie pe prima linie a fişierului mesajul “NU EXISTA ASTFEL DE NUMERE”.Exemplu:


atestat.in
Date de ieşire:
6
364 35 32 472 46 1222
Se citesc de la tastatură
a=100 
b=1000
a)
b)

c)
35 32 46
NU
Fişierul atestat.out conţine:
472
46 1222


#include <iostream>
#include<fstream>
using namespace std;
fstream f("atestat.in");
ofstream g("atesatat.out");
int s,ar[10],n,i;
void cerintaa()
{
    f>>n;
    for(i=0;i<n;i++) { f>>ar[i];
                                  if((ar[i]>=10)&&(ar[i]<=99)) cout<<ar[i]<<"  ";
                                 }
cout<<endl;
}

void cerintab()
{   int a,b,suma=0;
    cout<<"dati a ";cin>>a;
    cout<<"dati b mai mare decat a ";cin>>b;
    for(i=0;i<n;i++) suma=suma+ar[i];
    if((suma>=a)&&(suma<=b)) cout<<"DA";else cout<<"NU";


}

void cerintac()
{  s=0;
    int j,cnt=0;
    for(i=1;i<n;i++) {for(j=0;j<n-1;j++){cnt=0; if(ar[i]>ar[j]&&(j<i)) {
            if(cnt==0)
        g<<ar[i]<<" ";g<<endl;s=1;cnt++;}}
    if(s==0)g<<"NU EXISTA ASTFEL DE NUMERE";
}
}
int main()
{

    cerintaa();
    cerintab();
    cerintac();

    return 0;
}

TEMA : de rescris la sub 3 cerintac pt a ca programul are o usoara eroare
In atestat.out afiseaza :
NU EXISTA ASTFEL DE NUMERENU EXISTA ASTFEL DE NUMERE472
472
472
46
46
1222
1222
1222
1222
1222




SUBIECTUL 4
Fişierul atestat.in conţine două linii. Pe prima linie sunt  scrise trei numere naturale nenule, separate prin câte un spațiu: n,(5<n<30), p≤9, k≤9 (k<p). Pe cea de-a două linie a fişierului sunt scrise n numere naturale separate prin câte un spaţiu, reprezentând un şir de numere formate fiecare din cel mult 4 cifre.



Să se scrie un program în limbajul Pascal/C/C++, care:

a)     afişează pe ecran, în linie, separate printr-un spaţiu, toate numerele din șir care împărţite la p dau restul k;

b)     prin intermediul unui subprogram, afişează pe ecran, separate printr-un spațiu, numărul cifrelor pare din scrierea numerelor din șirul dat;

c)     verifică dacă toate elementele din șir sunt distincte două câte două şi afișează  în fişierul atestat.out un mesaj corespunzător: ELEMENTELE SUNT DISTINCTEsau ELEMENTELE NU SUNT DISTINCTE- în caz contrar.



Exemplu:

atestat.in
Date de ieşire:
7 5 3
2643 541 97 238 242 33 4682 
a)
b)

c)
2643 238 33
3 1 0 2 3 0 4
Fişierul atestat.out conţine:
ELEMENTELE SUNT DISTINCTE

REZOLVAREA
#include <iostream>
#include<fstream>
using namespace std;
fstream f("atestat.in");
ofstream g("atestat.out");
int i,j,p,n,k,a[10];
void cerintab()
{
    int nr,c;
    for(i=0;i<n;i++){c=a[i];nr=0;
    while (c>0)
    {
      if((c%10)%2== 0 ) nr++;
      c=c/10;
    }
    cout<<nr<<" ";
    }
}
int main()
{
    f>>n;f>>p;f>>k;
    for(i=0;i<n;i++){f>>a[i];if(a[i]%p==k) cout<<a[i]<<" ";}
    cout<<endl;
    cerintab();
    int s=0;
    for(i=0;i<n;i++)for(j=0;j<n;j++)if((i!=j)&&(a[i]==a[j]))s=1;
    if(s==0) g<<"ELEMENTELE SUNT DISTINCTE";
    else g<<"ELEMENTELE NU SUNT DISTINCTE";
    return 0;
}
    
  ------------------------------------------------------------------------------------------------

SUBIECTUL 5 TEMĂ


Fişierul atestat.in conţine două linii. Pe prima linie este scris un număr natural nenul n, (5<n<30). Pe cea de-a două linie a fişierului sunt scrise n numere naturale separate prin câte un spaţiu, reprezentând un şir de numere formate fiecare din cel mult 4 cifre.




Să se scrie un program, în limbajul Pascal/C/C++, care:





a)     afişează pe ecran, în linie, separate printr-un spaţiu, toate cifrele de rang 2 din scrierea numerelor; dacă numerele sunt formate dintr-o singură cifră se va afişa valoarea zero; 



b)     prin intermediul unui subprogram, afişează pe ecran prima poziție pe care se găsește elementul minim în șir;

c)     scrie în fişierul atestat.out, separate prin câte un spaţiu, toate numerele prime care au exact 3 cifre, din șirul dat. Un număr natural este prim dacă are exact doi divizori: numărul 1 și numărul în sine. Dacă nu există numere prime cu trei cifre se va scrie pe prima linie a fişierului mesajul “NU EXISTĂ NUMERE PRIME DE TREI CIFRE”.



Exemplu:

atestat.in
Date de ieşire:
7
239 1541 163 8 1531 19 23
a)
b)

c)
3 4 6 0 3 1 2
4
Fişierul atestat.out conţine:
239 163
------------------------------------------------------------------------------------------------------------------------
PROBLEMA 6
SE CERE SA SE INVERSEZE UN NUMAR


INVERSAREA UNUI NUMAR





#include <iostream>

#include <fstream>

using namespace std;

int a,b,i;

fstream f("intrare.txt");

ofstream g ("iesire.txt");

int main()

{

    f>>a;

    b=0;

    while (a>0)

    {

       b=b*10+a%10;

       a=a/10;

    }

    g<<b;



    cout << "a inversat=" << b<<endl;

    return 0;

}

  
INVERSAREA UNUI SIR





#include <iostream>

#include<string.h>

using namespace std;

int n,i;

char s[20],x;

int main()

{

   cout<<"s=";

   cin>>s;

n=strlen(s);

cout<<n;

for(i=0;i<n/2;i++)

     { x=s[i];

        s[i]=s[n-i-1];

        s[n-i-1]=x;

     }

cout<<"sir inv="<< s ;

       return 0;

}

   

RETINE CIFRELE PARE CU INVERSAREA ACESTORA








#include <iostream>


#include <fstream>


using namespace std;


int a,b,i;


fstream f("intrare.txt");

ofstream g ("iesire.txt");

int main()

{

    f>>a;

    b=0;

    while (a>0)

    {

        if((a%10)%2==0)

       b=b*10+a%10;

       a=a/10;

    }

    g<<b;



    cout << "a inversat fara a retine cifrele impare=" << b<<endl;

    return 0;

}


SE CERE SA SE INVERSEZE UN NUMAR CITIT DIN INTRARE.TXT





#include <iostream>

#include <fstream>

using namespace std;

int c,a,b,i;

fstream f("intrare.txt");

ofstream g("iesire.txt");

int main()

{

    f>>a;

    b=0;

    while (a>0)

    {

        if((a%10)%2==0)

       b=a%10+b*10;

       a=a/10;

    }

     while (b>0)

    {

         c=b%10+c*10;

       b=b/10;

    }



    g<<c;



    cout << "a neinversat,fara cifrele impare=" << c<<endl;

    return 0;

}

 La această problemă se cere să o testati fară a mai pune si instructiunile marcate . Ce observati dacă în loc de g<<c punem in program g<<b ?


ELIMINAREA SPATIILOR UNUI SIR

 CODUL ASCII pt SPACE este 32 ( la fel cu nr ce se adauga pt a transforma o cod de litera mare in cod de litera mica )

#include<fstream>
#include<cstring>
#include<iostream>
using namespace std;
int j,n=80 ,i;//presupunem ca avem 80 de catractere pe rand
char s[200],*d;
std::string input;
int main()
{
ofstream g("b.out");
ifstream f("a.in");
f.getline(s,n);
n=strlen(s);cout<<n;
for(i=0;i<n;i++)  if(s[i]==char(32)) {for(j=i+1;j<n;j++) s[j-1]=s[j] ;n--; }
g<<s;f.close();g.close();
return 0;
}
EXEMPLU
a.in   “manual de informatica”

b.out  “manualdeinformatica”


NUMAR PALINDROM


N este palindrom daca citit de la dreapta la stanga coincide cu citirea de la stanga la dreapta (pt algoritmii de arhivare e util sa retina numai o parte a informatiei- jumatatea din stanga sau jumatatea din dreapta )
exemplu 121 , 3443 
a[0] e 1,a[1] e 2 , a[2] e 0
j va fi indicele maxim , cu 1 mai mic decat nr de elemente ( daca avem 3 cifre j  este 2 )
Algoritmul va trece cifrele nr n in vectorul a
va compara prima cifra cu ultima a[0] cu a[j]
apoi a[1] cu a[j-1]
pana ajungem la cifra  j/2(daca j e impar se compara cu ea insasi si daca e par cu cifra a[j/2+1])
#include<iostream>
using namespace std;
int n ,a[10],i,j;
int main()
{
cout<<"n=";cin>>n;
j=-1;
while(n>0) { j++;a[j]=n%10;n=n/10;}
int s=0;
for(i=0;i<=j/2;i++) if(a[i]!=a[j-1]) s=1;
if (s==1) cout<<"e palindrom";
return 0;
}

OBSERVATIE :

Codul subliniat mai sus se poate inlocui cu a[++j]  in prima subliniere si la a doua cu s

TRECEREA IN BAZA 2

#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<cstdio>
#include<conio.h>
using  namespace std;
int main()
{ int n,n1,aux,nr;
  string s; int i;
//n e numarul , nr e rezultatul , 2-baza, n1-catul la imp la 2 ,
//aux-e nr scris invers
aux=nr=0;cout<<"n=";cin>>n;n1=n;cout<<endl;
do
{
 aux=aux*10+n1%2; cout<<n1%2<<endl;n1=n1/2;} while(n1!=0);
 cout<<"se va citi de jos in sus";
return 0;
}


TRANSFORMAREA DIN LITERE MICI IN LITERE MARI A LITERELOR UNUI SIR

#include<iostream.h>
#include<string.h>
char s[10];
int main()
{
int i;
cout<<"dati textul cu litere mici";
cin>>s;
for(i=0;i<strlen(s);i++)  s[i]=s[i]-32;
cout<<s; return 0;
}