Simulare stiinte ale naturii

Subiectul I

1. b

2.

a) 3 4 6 8 9 15

b) 7 6 6

8 7 7

c)

citeste n,a,b

(numere naturale nenule, a ≤n, b ≤n)

ok<-0

-pentru x<-1,n executa

| -daca x%a=0 si x%b≠0 sau

| | x%a≠0 si x%b=0

| | scrie x, ' '

| | ok<-1

| |_

|_

-daca ok=0 atunci

| scrie 0

|_

d)

Varianta C++

#include <iostream>

using namespace std;

int main()

{

cout << "Hello world!" << endl;

unsigned int a,b,n,ok,x;

cin>>n>>a>>b;

ok=0;

x=1;

while(x<=n)

{

if((x%a==0&&x%b!=0)||(x%a!=0&&x%b==0))

{cout<<x<<" ";

ok=1;

}

x=x+1;

}

if(ok==0)

cout<<0;

return 0;

}

Varianta C

#include <stdio.h>

#include <stdlib.h>

int main()

{

printf("Hello world!\n");

unsigned int a,b,n,ok,x;

scanf("%u%u%u",&n,&a,&b);

ok=0;

x=1;

while(x<=n)

{

if((x%a==0&&x%b!=0)||(x%a!=0&&x%b==0))

{printf("%u ",x);

ok=1;

}

x=x+1;

}

if(ok==0)

printf("0");

return 0;

}

Subiectul II

1. d

2. a

3.

Varianta C++

cout<<an<<endl;

if(carburant=='M' || carburant=='B')

cout<<"rezervor clasic";

else

cout<<"adaptor GPL";

Varianta C

printf("%d\n",an);

if(carburant=='M' || carburant=='B')

printf("rezervor clasic");

else

printf("adaptor GPL");

4.

a)

citeste n (numar natural,n≥10)

i<-0

nr<-0

- cat timp n≠0

| -daca n%10=i

| | nr<nr+1

| |_

|

| n<-n/10

| i<-i+1

| _

scrie nr

b) "n" - variabila citita de la tastatura

"i" - variabila care cuantifica numarul de ordine al pozitiei cifrei din numarul "n"

"nr" - variabila contorizeaza numărul de cifre ale lui "n" care sunt egale cu pozițiile pe care le ocupă în scrierea acestuia.

date intrare: n

date iesire: nr

Subiectul III

1. b

2. p=1.;

for(i=1;i<=10;i++)

{ cin>>x; | scanf(”%d”,&x);

p=p*x;

}

3.

Varianta C++

#include <iostream>

using namespace std;

int main()

{

cout << "Hello world!" << endl;

int i,n;

cout<<"n=";cin>>n;

int a[2*n];

a[0]=1;

for(i=1;i<=2*n-1;i=i+2)

{cout<<"a["<<i<<"]=";

cin>>a[i];

}

for(i=2;i<2*n-1;i=i+2)

a[i]=a[i-1]+a[i+1];

for(i=0;i<=2*n-1;i++)

cout<<a[i]<<" ";

return 0;

}

Varianta C

#include <stdio.h>

#include <stdlib.h>

int main()

{

printf("Hello world!\n");

int *a,i,n;

printf("n=");scanf("%d,&n);

a=(int*)malloc(n*sizeof(int));

if(a==NULL)

{

printf("Eroare la alocare dinamica");

exit(1);

}

a[0]=1;

for(i=1;i<=2*n-1;i=i+2)

{printf("a[%d]=",i);

scanf("%d",&a[i]);

}

for(i=2;i<2*n-1;i=i+2)

a[i]=a[i-1]+a[i+1];

for(i=0;i<=2*n-1;i++)

printf("%d ",&a[i]);

free(a);

return 0;

}

4.

b)

Varianta C++

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

cout << "Hello world!" << endl;

ifstream f("bac.in");

int i,j,m,n,x,t1=0,t2=0,k=-1;

f>>m>>n;

int a[n],b[m];

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

{f>>x;

if(x%2==0)

{

a[t1]=x;

t1++;

}

}

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

{f>>x;

if(x%2==0)

{

b[t2]=x;

t2++;

}

}

// inceput algoritm interclasare

i=0;j=0;

int s[t1+t2];

while((i<t1)&&(j<t2))

{k++;

if(a[i]<b[j])

{

s[k]=a[i];

i++;

}

else

{

s[k]=b[j];

j++;

}

}

while(i<t1)

{k++;

s[k]=a[i];

i++;

}

while(j<=t2)

{k++;

s[k]=b[j];

j++;

}

// sfarsit algoritm interclasare

for(i=k-1;i>=0;i--)

cout<<s[i]<<" ";

if(t1==0&&t2==0)

cout<<"nu exista";

f.close();

return 0;

}

Varianta C

#include <stdio.h>

#include <stdlib.h>

int main()

{

printf("Hello world!\n");

int *a,*b,i,j,m,n,x,t1=0,t2=0,k=-1;

FILE *f;

f=fopen("bac.in","r");

if(f==NULL)

{

printf("Eroare la deschiderea fisierului.");

exit(EXIT_FAILURE);

}

fscanf(f,"%d%d",&m,&n);

a=(int*)malloc(m*sizeof(int));

if(a==NULL)

{

printf("Eroare la alocare dinamica");

exit(1);

}

b=(int*)malloc(n*sizeof(int));

if(b==NULL)

{

printf("Eroare la alocare dinamica");

exit(1);

}

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

{

fscanf(f,"%d",&x);

if(x%2==0)

{

a[t1]=x;

t1++;

}

}

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

{

fscanf(f,"%d",&x);

if(x%2==0)

{

b[t2]=x;

t2++;

}

}

// inceput algoritm interclasare

i=0;j=0;

int *s;

s=(int*)malloc((t1+t2)*sizeof(int));

if(s==NULL)

{

printf("Eroare la alocare dinamica");

exit(1);

}

while((i<t1)&&(j<t2))

{k++;

if(a[i]<b[j])

{

s[k]=a[i];

i++;

}

else

{

s[k]=b[j];

j++;

}

}

while(i<t1)

{k++;

s[k]=a[i];

i++;

}

while(j<=t2)

{k++;

s[k]=b[j];

j++;

}

// sfarsit algoritm interclasare

for(i=k-1;i>=0;i--)

printf("%d ",s[i]);

if(t1==0&&t2==0)

printf("nu exista");

free(a);

free(b);

free(s);

fclose(f);

return 0;

}

a)

Cu ajutorul variabilei "x" am citit numerele din fisier. Am declarat doua tablouri "a" si "b" fiecare cu cel mult "n" respectiv "m" elemente. Aceste tablouri vor contine doar numerele pare din fisier. "t1" si "t2" reprezinta numarul de elemente ale tablourilor "a" respectiv "b". In caz ca nu exista elemente pare in fisier, valorilor variabilelor "t1" si "t2" declarate la inceput cu 0 vor ramane 0. In acest caz afisam mesajul "nu exista". Vom forma un sir "s" de dimensiune maxima "t1+t2" sortat crescator. Acesta va contine elementele din tablourile "a" si "b". Pentru aceasta vom folosi algortimul de interclasare. Afisam tabloul "s" de la sfarsit la inceput.

Programul este eficient deoarece: foloseste tablouri de dimensiune minima,.este liniar, parcurge o singura data fisierul, este de tipul O(n).

In cazul variantei C, gestionarea memoriei este si mai eficienta datorita alocarii dinamice a memoriei si a eliberarii acesteia la sfarsitul programului.