laborator informatică aplicată în fizică prof.dr. vasile...

59
1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chiş Bibliografie 1. T.A. Beu, Calcul numeric în C, Editura Albastră, Cluj-Napoca, 1999 2. T.A. Beu, Introduction to Numerical Programming: A Practical Guide for Scientists and Engineers Using Python and C/C++, CRC Press, 2014 3. D. Ciurchea, V. Chiş, Prelucrarea datelor experimentale, Litografia UBB, Cluj-Napoca, 1995 4. B. Demşoreanu, Metode numerice cu aplicaţii în fizică, Univ. de Vest din Timişoara, 2001 5. B. W.Kernighan, D.M. Ritchie, The C Programming Language, Prentice Hall, Inc., 1988 6. L. Negrescu, Limbajele C şi C++ pentru începători, Ed.Microinformatica, Cluj, 1994

Upload: others

Post on 08-Feb-2020

6 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

1

Laborator Informatică Aplicată în Fizică

Prof.dr. Vasile Chiş

Bibliografie

1. T.A. Beu, Calcul numeric în C, Editura Albastră, Cluj-Napoca, 1999

2. T.A. Beu, Introduction to Numerical Programming: A Practical Guide for Scientists and

Engineers Using Python and C/C++, CRC Press, 2014

3. D. Ciurchea, V. Chiş, Prelucrarea datelor experimentale, Litografia UBB, Cluj-Napoca, 1995

4. B. Demşoreanu, Metode numerice cu aplicaţii în fizică, Univ. de Vest din Timişoara, 2001

5. B. W.Kernighan, D.M. Ritchie, The C Programming Language, Prentice Hall, Inc., 1988 6. L. Negrescu, Limbajele C şi C++ pentru începători, Ed.Microinformatica, Cluj, 1994

Page 2: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

2

Laborator 1

Tema: Algoritmi 1: descrierea algoritmilor în limbaj pseudocod şi prin scheme logice: şiruri de

numere

Cerinţe:

a. Proiectaţi un algoritm pentru determinarea numărului de cifre ale unui număr natural

b. Proiectaţi un algoritm pentru determinarea tuturor numerelor prime <=n

c. Proiectaţi un algoritm pentru descompunerea unui număr întreg în factori primi

d. *Proiectaţi un algoritm pentru generarea aleatoare a unui şir de n elemente reale şi ordonarea

şirului rezultat folosind metoda bulelor.

Page 3: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

3

Laborator 2

Tema: Algoritmi 2: descrierea algoritmilor prin scheme logice

Cerinţe:

a. Proiectaţi un algoritm pentru calculul sumei a două polinoame

b. Proiectaţi un algoritm pentru calculul valorii xn cu n întreg şi x real

c. Proiectaţi un algoritm pentru determinarea produsului a două matrici

d. Proiectaţi un algoritm pentru calculul elementelor mişcării unui corp aruncat sub un unghi α faţă

de orizontală

e. *Proiectaţi un algoritm pentru testarea condiţiilor de suprascriere a unui fişier

Page 4: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

4

Laborator 3

Tema: Baze de numeraţie: sistemul de numeraţia binar, octal şi hexazecimal; transformarea

valorilor întregi între diferite sisteme de numeraţie; calculul în sistemele de numeraţie binar, octal

şi hexazecimal; calculul cu adresele locaţiilor de memorie

Cerinţe:

a. Proiectaţi algoritmul şi scrieţi codul sursă pentru determinarea numărului de cifre zecimale

ale unui număr real

b. Proiectaţi algoritmul şi scrieţi codul sursă pentru transformarea numerelor reale in binar

(standardul IEEE)

//Determina numarul de cifre zecimale ale unui numar real

//si construieste un sir cu aceste cifre

#include <iostream.h>

#include <stdio.h>

#include <math.h>

#include <conio.h>

int main()

{

double x;

int i,nrc,sir[100],cif;

printf("\nProgramul determina numarul de cifre zecimale ale unui

numar real\n");

printf("si construieste un sir avand ca elemente cifrele zecimale ale

numarului dat\n");

do

{

printf("\nIntroduceti un numar real:\t");

fflush(stdin);

}

while(scanf("%lf",&x)!=1);

i=0; // contor pentru sirul care va contine cifrele zecimale ale

numarului real

do

{

//determina cifra actuala

cif=(int) (10*(x-floor(x)));

sir[i]=cif;

x=x*10.0;

i++;

}

while((x-floor(x))>1e-6);

//sau x!=floor(x))

nrc=i;

printf("\nNumarul are %d cifre zecimale, iar sirul format din cifrele

sale este:\n",nrc);

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

cout<< sir[i]<<" ";

while(!_kbhit());

return 0;

}

Page 5: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

5

Page 6: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

6

//Reprezentarea numerelor reale in virgula flotanta, simpla precizie, standardul IEEE

/*

Exemplu: reprezentarea numãrului -10.375

1. Numãrul pozitiv se transformã în binar si se obtine: 1010.011

2. Se scrie numãrul obþinut în binar sub formã normalizatã: 1.010011·2^3

3. Se determinã valoarea exponentului: 3+127=130

4. Se transformã noul exponent în binar: (130)_10=(10000010)_2

5. Se determinã bitul de semn al mantisei: 1

6. Se scrie numãrul: 11000001001001100000000000000000

*/

#include <stdio.h>

#include <math.h>

#include <conio.h>

int s[32],se[8],sm[23],pibin[20],pzbin[25],pzbin2[25];

int main()

{

float nr,pz,mnr;

long int pi,c,r;

int i,nbpi,nbe,expon,EXP,k,nmax,cond,ncpz;

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

s[i]=0;

printf("Introduceti numarul: ");

scanf("%f",&nr);

//se determina bitul de semn

if(nr>=0)

s[31]=0;

else s[31]=1;

mnr=fabs(nr);//modulul numarului

pi=floor(mnr);//partea intreaga a numarului

//printf("\npi= %d",pi);

pz=mnr-pi;//partea fractionara a numarului

//printf("\npz= %f",pz);

//transformarea in binar a partii intregi

i=0; //printf("\nPartea intreaga in binar: ");

do

{

c=pi/2;

r=pi-c*2;

pibin[i]=r; //printf("%d",pibin[i]);

i++;

pi=c;

}

while(pi>0);

nbpi=i;//nr de biti ai partii intregi //printf("\nnbpi= %d",nbpi);

expon=nbpi-1;//exponentul in scrierea normalizata cu mantisa nenula

//se adauga bitii partii intregi la mantisa numarului ////printf("\nexpon = %d\n",expon);

//transformarea in binar a partii zecimale

i=1;//printf("\nPZ in binar: ");

do

{

pzbin[i]=floor(2*pz); //printf("%d",pzbin[i]);

pz=2*pz-floor(2*pz);

i++;

//Stabilirea conditiei de incheiere: fie f=0, fie s-a

// ajuns la numarul de cifre impus

if(pz==0.0)

cond=1;

else

if(i==nmax)

cond=1;

else cond=0;

Page 7: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

7

}

while(!cond);

ncpz=i-1;//nr de cifre ale partii zecimale //printf("\nncpz= %d",ncpz);

int kk=0;//contor pentru a determina a cata cifra este nenula pt. un nr. cu modul < 1

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

if(pzbin[i]==1)

{

kk=-i;

break;

} //printf("\nkk= %d",kk);

EXP=expon+127; //EXP=exponentul + caracteristica reprezentarii

if(nr>-1&&nr<1)

EXP=EXP+kk;//printf("\nEXP= %d",EXP);

//transformarea in binar a EXP //printf("\nEXP: ");

i=0;

do

{

c=EXP/2;

r=EXP-c*2;

se[i]=r;//sirul de biti ai EXPONENTULUI

i++;

EXP=c;

}

while(EXP>0);

nbe=i;//nr. de biti necesari pentru exponent

for(k=0;k<nbe;k++)

s[k+23]=se[k];

for(k=nbe;k<8;k++)

s[k+23]=0;

if(mnr>=1)

{

//adaugarea bitilor partii intregi si a partii zecimale la mantisa numarului

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

{

s[22-i]=pibin[expon-1-i]; // printf("%d",s[22-i]);

}

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

s[23-expon-i]=pzbin[i];

//setarea pe zero a bitilor nefolositi !! nu e necesara deoarece sirul a fost declarat global

//for(i=0;i<23-expon-k;i++)

//s[i]=0;

}

else

{//cazul valorilor cu modul <1

//printf("\nNoua parte zecimala a numarului:\n");

for(i=1;i<=ncpz-abs(kk);i++)

{

pzbin2[i]=pzbin[i+abs(kk)]; //printf("%d",pzbin2[i]);

}

for(i=22,k=0;i>22-(ncpz-abs(kk));i--)

s[i]=pzbin2[++k];

}

//tiparirea sirului de biti in reprezentarea IEEE

printf("\nNumarul %g in format IEEE este:\n",nr);

printf("%d|",s[31]);

for(i=30;i>=23;i--)

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

printf("|");

for(i=22;i>=0;i--)

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

while(!_kbhit());

return 0;

}

Page 8: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

8

Laborator 4

Tema: Mediul integrat Dev C++: deschiderea fişierelor; editarea programelor sursă; compilarea

programelor sursă; rularea programelor în C; bibliotecile limbajului C; erori şi atenţionări la

compilare; depanarea programelor

Cerinţe:

a. Scrieţi un program de evaluare a unui polinom într-un punct pe baza metodei lui Horner

b. Scrieţi un program pentru determinarea tuturor polinoamelor Legendre până la un ordin n

dat, după relaţia de recurenţă:

,....4,3,2)()1()()12(1

)(21

nxPnxPxnn

xPnnn

#include <stdio.h>

#include <conio.h>

int main()

{

// Determina coeficientii polinomului Legendre de

// un grad oarecare n

int n,j,k,i,r;

float L[15][15];

float b[2],p[15],k1,k2;

printf("\nOrdinul maxim: n=");

scanf("%d",&n);

L[0][0]=1; L[1][0]=0; L[1][1]=1;//L - matrice care va contine coeficientii

polinoamelor pana la ordinul n

b[0]=0; b[1]=1; // coeficientii polinomului x

for(r=2;r<=n;r++)

{

k1=(float)(2*r-1)/r;

k2=(float)(r-1)/r;

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

p[i]=0;

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

{

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

p[i+j]=p[i+j]+L[r-1][i]*b[j];

}

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

p[i]=k1*p[i];

for(i=0;i<=r-2;i++)

L[r][i]=p[i]-k2*L[r-2][i];

L[r][r-1]=p[r-1];

L[r][r]=p[r];

}

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

{

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

printf("%g\t",L[i][j]); printf("\n");

}

while(!_kbhit());

return 0;

}

Page 9: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

9

Laborator 5

Tema: Funcţii de intrare/ieşire: citirea datelor de la tastatură şi scrierea datelor la ieşirea

standard; alte funcţii de intrare ieşire

Cerinţe:

a. Scrieţi un program care să determine numărul de caractere, numărul de cuvinte şi

numărul de linii ale unui text introdus de la tastatură.

b. Scrieţi un program pentru conversia unui şir de caractere numerice într-o valoare

întreagă.

#include <stdio.h>

#include <conio.h>

void main()

{

int nl,nc,ncuv,c,stare;

nc=ncuv=nl=0;

stare=0;

while((c=getchar())!=EOF)

{

++nc;

if(c=='\n')

++nl;

if(c==' '||c=='\n'||c=='\t')

stare=0;

else

if(stare==0)

{

stare=1;

++ncuv;

}

}

printf("%d %d %d\n",nc,ncuv,nl);

getch();

}

//Converteste un sir de caractere numerice intr-un numar

#include <stdio.h>

#include <string.h>

#include <ctype.h>

#include <math.h>

double sirnr(char sir[]);

void main()

{

char sir[20];

float v;

printf("Programul converteste un sir de cifre, inclusiv punctul zecimal\nintr-un numar");

printf(" Sirul poate fi precedat de spatii albe.");

printf("\n\nIntroduceti sirul de caractere: ");

gets(sir);

v=sirnr(sir);

printf("\nv= %g",v);

}

// sirnr: converteste un sir intr-un numar

double sirnr(char sir[25])

{

double val,p,v;

Page 10: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

10

int i,s,ncz;

// se ignora spatiile albe

i=0;

while(isspace(sir[i]))

i++;

//se determina semnul numarului si se sare peste semn daca exista

if(sir[i]=='-')

{ s=-1;i++;}

else

if(sir[i]=='+')

{ s=1; i++;}

else

s=1;

//se determina valoarea partii intregi a numarului

//se porneste cu val =0 si de fiecare data cand se gaseste o cifra

//val se inmulteste cu 10 si se adauga valoarea cifrei gasite

val=0.0;

for(;isdigit(sir[i]);i++)

val=10.0*val+(sir[i]-'0');

//se sare peste punctul zecimal

if(sir[i]=='.')

i++;

//determina nr. de cifre al partii zecimale

//si actualizeaza valoarea lui val ca si cum si cifrele zecimale

// ar fi cifre ale partii intregi

//in final, val va fi impartita la

//10^(nr cifre zecimale)

ncz=0;

// p=1.0;

for(;isdigit(sir[i]);i++)

{

val=10.0*val+(sir[i]-'0');

ncz++;

}

//se determina valoarea numarului rezultat prin convertirea sirului

//de caractere

//exemplu: -12.345 = -12345/10^(3)

v=s*val/pow(10,ncz);

return v;

}

Page 11: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

11

Laborator 6

Tema: Expresii, operatori şi operanzi în C: efectul operatorilor aritmetici, logici şi a operatorilor pe

biţi; prioritatea operatorilor; evaluarea expresiilor;

Cerinţe:

a. Scrieţi un program pentru testarea operatorilor logici pe biţi

b. Scrieţi un program pentru evaluarea funcţiilor sin(x), cos(x) şi exp(-x2) prin dezvoltare în serii

Taylor.

//Program exemplu: testarea operatorilor logici pe biţi

#include <stdio.h>

void binar(unsigned int v)

{

long int i,s[100],j,r,c,dim;

double val;

j=0;

do

{

c=v/2;

r=v%2;

s[j]=r;

j++;

v=c;

}

while(c>0);

val=0;

for(dim=j-1;dim>=0;dim--)

val=10.0*val+(s[dim]);

printf("%016.0lf",val);

}

void main()

{

long int a,b,c,i,o1,o2,rez;

printf("Program pentru testarea operatorilor logici pe biti:\n");

printf("Introduceti o1: ");

scanf("%ld",&o1);

printf("Introduceti o2: ");scanf("%ld",&o2);

binar(o1);

printf("\to1= %ld\n",o1);

binar(o2);

printf("\to2= %ld\n",o2);

//Testarea operatorului &

rez=o1&o2;

binar(rez);

printf("\to1&o2= %ld\n",rez);

//Testarea operatorului |

rez=o1|o2;

binar(rez);

printf("\to1|o2= %ld\n",rez);

//Testarea operatorului ^

rez=o1^o2;

binar(rez);

printf("\to1^o2= %ld\n",rez);

//Testarea operatorului <<

printf("\n");

binar(o1);

printf("\to1= %d\n",o1);

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

{

Page 12: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

12

binar(o1<<i);

printf("\to1<<%ld= %ld\n",i,o1 << i);

}

//Testarea operatorului <<=

printf("\n");

binar(o2);

printf("\to2= %ld\n",o2);

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

{

binar(o2<<=i);

printf("\to2<<=%ld= %ld\n",i,o2);

}

//Testarea operatorului >>

binar(o1);

printf("\to1= %ld\n",o1);

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

{

binar(o1>>i);

printf("\to1>>%ld= %ld\n",i,o1 >> i);

}

//Testarea operatorului ~

printf("\n");

binar(o1);

printf("\to1= %ld\n",o1);

b=~o1;

binar(b);

printf("\t~o1= %ld\n",b);

}

// Calculul funcţiei exp(-x2)

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <math.h>

int main()

{

double x,elax,t,s;

int k;

printf("\nIntroduceti x: ");

scanf("%lf",&x);

k=0;t=1;s=1;

do

{

k++;

// tv=tn;

t=t*(-1)*x*x/k;

s=s+t;

}

while(t!=0);

printf("E la -%lf^2 = %lf",x,s);

printf("\nFunctia exp(x): %lg",exp(-x*x));

while(!_kbhit());

return 0;

}

//calculul functiei cos

#include<stdio.h>

#include<conio.h>

#include<math.h>

Page 13: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

13

double fact(long int v)

{

long int i;

double f=1.0;

for(i=2;i<=v;i++)

f*=i;

return f;

}

void main()

{

long double t,s,sv,x,xr,pi;

long int k;

s=1.0;

k=0;

printf("\nx= ");

scanf("%Lf",&x);

pi=4*atan(1.0);

xr=x*pi/180.0;

do

{

k++;

sv=s;

s+=pow(-1,k)*pow(xr,2*k)/fact(2*k);

}

while(s!=sv);

if(fabs(s)<fabs(1e-10))

s=0.0;

printf("\ncos(%Lg)= %Lg",x,s);

printf("\nrad(2)/2= %g",sqrt(2)/2);

getch();

}

Page 14: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

14

Laborator 7

Tema: Instrucţiuni C: instrucţiunea for, while şi do-while, instrucţiunea switch, break, continue,

goto

Cerinţe:

a. Scrieţi un program pentru transformarea unei matrici într-un şir

b. Scrieţi un program pentru transformarea unei valori întregi din zecimal în binar cu masca pentru

biţi, pentru valori întregi cu semn reprezentate pe 16 biţi

c. Scrieţi un program pentru simularea unui calculator cu următoarele operaţii: +, -, *, /, factorial,

radical, ridicare la putere, modulo, exp(x), ln(), fără folosirea funcţiilor din biblioteca math.h

Determinarea indicelui elementelor unui şir în care sunt păstrate elementele unei matrici

A(nxn) în secvenţa a11, a12, ... , a21, ... ann.

a. Indexarea liniilor şi coloanelor matricii, precum şi a elementelor şirului se face de

la 1

1. Matrice pătratică

k=ij=n(i-1)+j

2. Matrice triunghiulară

k=ij=n(i-1)+j-i(i-1)/2

Ultimul termen ţine cont de eliminarea elementelor de sub diagonala principală

b. Indexarea liniilor şi coloanelor matricii, precum şi a elementelor şirului se face de

la 0

1. Matrice pătratică

k=ij=n·i+j

2. Matrice triunghiulară

k=ij=n·i+j-i(i+1)/2

Ultimul termen ţine cont de eliminarea elementelor de sub diagonala principală

Page 15: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

15

//transforma o matrice intr-un sir

#include <iostream>

#include <stdlib.h>

#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])

{

int a[5][5],s[25],i,j,k,m,n;

m=3;n=3;

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

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

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

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

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

{

k=n*i+j;

s[k]=a[i][j];

printf("\n%d %d %d",i,j,k);

}

for(k=0;k<n*m;k++)

printf("\n%d",s[k]);

return 0;

}

// Transformarea in binar cu masca pentru biti

//pentru valori intregi cu semn reprezentate pe 16 biti

#include <stdio.h>

#include<stdlib.h>

#define nrbiti 16

void main ()

{

int n,j,bit;

int MASK = -32768; // (-32768)_10=(1000000000000000)_2

printf ("Introduceti un nr < 32768: ");

scanf ("%d", &n);

if (n > 32768)

{

printf ("Nr. prea mare\n");

exit(1);

}

printf ("Valoare in binar: ");

for (j = 0; j < nrbiti; j++) //j contorizeaza deplasarea spre dreapta a bitilor lui n

{ // va trebui facut un numar de 16 deplasari (j intre 0 si 15, inclusiv)

// pana cand ultimul bit al lui n ajunge pe pozitia de index 15 a mastii

bit = n & MASK; //bit este diferit de zero numai cand bitul de pe pozitia nrbiti-1

printf ("%1d",bit/MASK); // (incepand de la zero) a lui n este 1

n <<= 1; // de fapt, bit va fi fie 0 fie -32768

} // 1 din %1d nu este necesar deoarece bit/MASK va fi 0 sau 1

printf ("\n%d",6<<2);

}

Page 16: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

16

//Calculator cu 10 operatii

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<math.h>

int ok=1,p,i;

double fact(int n)

{

//functia factorial

double f;

if(n<0)

{

printf("Eroare! Input invalid - numar negativ.\n");

ok=0;

system("Pause");

exit(1);

}

else

{

for(f=1,i=2;i<=n;i++)

f=f*i;

}

return f;

}

int rip (int a, int b)

//restul impartirii intregi

{

int d;

do {

d=a-b;

a=d; }

while(a>=b);

return d;

}

double radical(double x)

// radical - metoda Newton

{

double rxv, rxn;

rxn=x/2.0;

do

{rxv=rxn;

rxn=0.5*(rxv+x/rxv);

} while ((rxn-rxv)!=0);

return rxn;

}

double f(double x)

//functie pentru calculul ln(v)=integrala de la 1 la v din 1/x dx

{

return 1/x;

}

double simpson(double a, double b, int m, double (*)(double x))

//functie pentru calculul integralelor prin metoda Simpson

{

double h,s1,s2,I;

int i;

if(a==b) return 0;

m=2*m;

h=(b-a)/m;

s1=0.0;

s2=0.0;

Page 17: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

17

for(i=1;i<=m/2;i++)

{

s1+=f(a+(2*i-1)*h);

if(i<m/2)

s2+=f(a+2*i*h);

}

I=(h/3)*(f(a)+f(b)+4*s1+2*s2);

return I;

}

double ln(double x)

//functie ln(x)

{

double lnx;

lnx=simpson(1,x,5000000,f);

return lnx;

}

double expx(double x)

//functie exp(x)

{

int k=0;

double t = 1.0, s = 1.0;

do {

k++;

t*=x/k;

s+=t;

} while (t!=0);

return s;

}

double xlay(double a, double b)

//functie x^y cu x si y reale

{

return expx(b*ln(a));

}

int main()

{

char oper;

double op1, op2, rez = 1;

printf("Operatii posibile:\n- + - Adunare\n- - - Scadere\n- * - Inmultire\n- / -

Impartire");

printf("\n- ! - Factorial\n- # - Radical\n- ^ - Ridicare la putere\n- %% - Impartire

intreaga\n");

printf("- @ - exp(x)\n- l - Logaritm natural\n");

printf("\nTastati o expresie de forma: operand1 operatie operand2: \n");

if (scanf("%lf%c%lf", &op1, &oper, &op2) != 3)

{

printf("\nExpresie eronata!\n");

exit(1);

}

switch (oper){

case '+':

rez = op1 + op2;

printf("\n%lg + %lg = %.14lf\n",op1,op2,rez);

break;

case '-':

rez = op1 - op2;

printf("\n%lg - %lg = %.14lf\n",op1,op2,rez);

break;

Page 18: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

18

case '*':

rez = op1 * op2;

printf("\n%lg * %lg = %.14lf\n",op1,op2,rez);

break;

case '/':

if (op2 == 0)

{

printf("Eroare! Divizor nul.\n");

rez = 0;

ok = 0;

}

else

{

rez = op1 / op2;

printf("\n%lg / %lg = %.14lf\n",op1,op2,rez);

}

break;

case'!':

rez=fact((int)(op1));

printf("\n%lg! = %lg\n",op1,rez);

break;

case'l':

if(op1<=0)

{printf("Eroare! Argument invalid (numar negativ sau 0).\n");

ok=0;}

else {

rez=ln(op1);

printf("\nln(%lg) = %.14lf\n",op1,rez);

}

break;

case '#':

if (op1 < 0) {

printf("Eroare! Argument invalid (numar negativ).\n");

ok = 0;

}

else {

rez = radical(op1);

printf("\nRadical(%lg) = %.14lf\n",op1,rez);

}

break;

case '^':

rez=xlay(op1,op2);

printf("\n%lg ^ %lg = %.14lf\n",op1,op2,rez);

break;

case '%':

rez = rip((int)(op1),(int)(op2));

printf("\n%lg %% %lg = %g\n",op1,op2,rez);

break;

case '@':

rez = expx(op1);

printf("\nexp(%lg) = %.14lf\n",op1,rez);

break;

default:

printf("Operator ilegal!\n");

rez = 0;

ok = 0;

}

system("pause");

return 0;

}

Page 19: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

19

Laborator 8

Funcţii în C: construirea funcţiilor în C; parametri formali şi argumente; apelul funcţiilor prin

valoare

Cerinţe:

a. Scrieţi un program pentru adunarea a doi vectori. Folosiţi grafica Dev-C++ pentru

reprezentarea grafică a vectorilor.

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<graphics.h>

#include<dos.h>

#include<string.h>

#include <math.h>

#include <conio.h>

void atent();

void rco();

void rinco();

void optinco();

void u0();

void upi();

void paralela_v1();

void paralela_v2();

void rezultanta();

void sterge_variante();

void scrie_var1();

void scrie_var2();

void scrie_var3();

void rez_0();

void grid();

void v1ac();

void v1bc();

void v1cc();

void v1dc();

void v1ec();

void v2cc();

void v3ac();

float m1,m2,u,mr,pi,nsr;

float m1p,m2p,o,intmax,modmax,dx,dy;

float ct;

char strm1[10],strm2[10],strmore[20],strunghi[20],opt;

int maxx,maxy,m1px,m1py,m2px,m2py,mrpx,mrpy,color,maxcolor,yor,ns,k,iopt;

int db[8]={1,161,227,161,227,181,1,181};

int dd[8]={1,201,227,201,227,241,1,241};

int de[8]={1,241,227,241,227,271,1,271};

int dc2[8]={1,191,227,191,227,211,1,211};

int da3[8]={1,151,227,151,227,171,1,171};

struct punct

{

int x;

int y;

} o1,o2,v1,v2,or,vr;

int main()

{

clrscr();

Page 20: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

20

printf("\n\n\n\n\n\n\t\t\t\tPROGRAM PENTRU");

printf("\n\n\n\n\t\tA D U N A R E A A D O I V E C T O R I");

printf("\n\n\n\n\n\n\n\t\t\tApasa orice tasta pentru a incepe !\n\n\n\n\n\t\t\t\t\t");

getch();

clrscr();

randomize();

// o=0.0;

o=(int)(10.0+80.0*random(101)/100.0);

gotoxy(10,2);printf("Modulul primului vector: ");scanf("%f",&m1);

gotoxy(10,3);printf("Modulul celui de-al doilea vector: ");scanf("%f",&m2);

gotoxy(10,4);printf("Unghiul dintre cei doi vectori: ");scanf("%f",&u);

int gdriver = DETECT, gmode, errorcode;

initgraph(&gdriver, &gmode, "c:\\borlandc\\bgi");

errorcode = graphresult();

if (errorcode != grOk)

{

printf("Eroare la initializarea grafica: %s\n", grapherrormsg(errorcode));

printf("Apasa orice tasta pentru oprire");

getch();

exit(1);

}

gcvt(m1,6,strm1);

gcvt(m2,6,strm2);

gcvt(u,6,strunghi);

pi=4*atan(1.0);

u=u*pi/180.0;

if(u>2*pi) u=u-2*pi;

o=o*pi/180.0;

mr=sqrt(m1*m1+m2*m2+2*m1*m2*(cos(o)*cos(u+o)+sin(u+o)*sin(o)));

if(mr<1.e-5) mr=0.0;

gcvt(mr,6,strmore);

intmax=m1>m2?m1:m2;

modmax=intmax>mr?intmax:mr; //modulul maxim

ct=195/modmax; //coef. de tansformare in pixeli a modulelor vectorilor

m1p=m1*ct;m2p=m2*ct;

m1px=(int)(m1p*cos(o));m1py=(int)(-m1p*sin(o));

m2px=(int)(m2p*cos(o+u));m2py=(int)(-m2p*sin(o+u));

mrpx=m1px+m2px;mrpy=m1py+m2py;

maxx=getmaxx();maxy=getmaxy();

o1.x=o2.x=or.x=(maxx+220)/2;

o1.y=o2.y=or.y=(maxy+1)/2;

v1.x=o1.x+(int)(m1px);v1.y=o1.y+(int)(m1py);

v2.x=o2.x+(int)(m2px);v2.y=o2.y+(int)(m2py);

vr.x=or.x+(int)(mrpx);vr.y=or.y+(int)(mrpy);

maxcolor=getmaxcolor();

settextstyle(SMALL_FONT,HORIZ_DIR,4);

setcolor(YELLOW);

outtextxy(10,5,"Modulul primului vector: ");

outtextxy(250,5,strm1);outtextxy(285,5,"unitati");

setcolor(LIGHTBLUE);

outtextxy(10,15,"Modulul celui de-al doilea vector: ");

outtextxy(250,15,strm2);outtextxy(285,15,"unitati");

setcolor(LIGHTGREEN);

outtextxy(10,25,"Unghiul dintre cei doi vectori:");

outtextxy(250,25,strunghi);outtextxy(285,25,"grade");

setcolor(YELLOW);

rectangle(230,40,getmaxx()-10,440);

grid();

if((u==0)||(u==2*pi))

{

setlinestyle(SOLID_LINE, 1, 3);

setcolor(YELLOW);

line(o1.x,o1.y,v1.x,v1.y);

setcolor(BLUE);

line(2+o2.x,2+o2.y,2+v2.x,2+v2.y);

}

Page 21: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

21

else

if(u==pi)

{

setlinestyle(SOLID_LINE, 1, 3);

setcolor(YELLOW);

line(o1.x,o1.y,v1.x,v1.y);

setcolor(BLUE);

line(o2.x,o2.y,v2.x,v2.y);

}

else

{

setlinestyle(SOLID_LINE, 1, 3);

setcolor(YELLOW);

line(o1.x,o1.y,v1.x,v1.y);

setcolor(BLUE);

line(o2.x,o2.y,v2.x,v2.y);

}

settextstyle(SMALL_FONT, HORIZ_DIR, 4);

setcolor(WHITE);

outtextxy(1,120,"Cum se procedeaza in continuare ?");

outtextxy(1,130,"Alegeti una dintre variante: ");

scrie_var1();

do

{

fflush(stdin);

opt=getch();

iopt=(int)(opt);

if(iopt<97)

{ iopt+=32;

opt=char(iopt);

}

switch(opt){

case 'a': { rinco();

if((u!=0)&&(u!=2*pi)&&(u!=pi))

{

outtextxy(1,295,"Varianta corecta este b");

v1bc();

atent();

flushall();

paralela_v1();sterge_variante();

}

else

if((u==0)||(u==2*pi))

{

outtextxy(1,295,"Varianta corecta este d");

v1dc();

atent();flushall();

u0();

}

else

if(u==pi)

{

outtextxy(1,295,"Varianta corecta este e");

v1ec();

atent(); flushall();upi();

}

break;

}

case 'b': {

if((u!=0)&&(u!=2*pi)&&(u!=pi))

{

rco();paralela_v1();sterge_variante();

}

Page 22: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

22

else

if((u==0)||(u==2*pi))

{

rinco();

outtextxy(1,295,"Varianta corecta este d");

v1dc();

atent(); flushall(); u0();

}

else

if(u==pi)

{

rinco();

outtextxy(1,295,"Varianta corecta este e");

v1ec();

atent(); flushall(); upi();

}

break;

}

case 'c':{

rinco();

if((u!=0)&&(u!=2*pi)&&(u!=pi))

{

outtextxy(1,295,"Varianta corecta este b");

v1bc();

atent(); flushall(); paralela_v1();sterge_variante();

}

else

if((u==0)||(u==2*pi))

{

outtextxy(1,295,"Varianta corecta este d");

v1dc();

atent(); flushall(); u0();

}

else

if(u==pi)

{

outtextxy(1,295,"Varianta corecta este e");

v1ec();

atent(); flushall(); upi();

}

break;

}

case 'd': {

if((u==0)||(u==2*pi))

{

rco();

u0();

}

else

if(u==pi)

{

rinco();

outtextxy(1,295,"Varianta corecta este e");

v1ec();

atent(); flushall(); upi();

}

else

{

rinco();

outtextxy(1,295,"Varianta corecta este b");

v1bc();

Page 23: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

23

atent(); flushall(); paralela_v1();sterge_variante();

}

break;

}

case 'e': {

if(u==pi)

{

rco();

upi();

}

else

if((u==0)||(u==2*pi))

{

rinco();

outtextxy(1,295,"Varianta corecta este d");

v1dc();

atent(); flushall(); u0();

}

else

{

rinco();

outtextxy(1,295,"Varianta corecta este b");

v1bc();

atent(); flushall(); paralela_v1();sterge_variante();

}

break;

}

default: {

optinco();

}

}

}

while((opt!='a')&&(opt!='b')&&(opt!='c')&&(opt!='d')&&(opt!='e'));

if((u!=0)&&(u!=2*pi)&&(u!=pi))

{

scrie_var2();

do

{

fflush(stdin);

opt=getch();

iopt=(int)(opt);

if(iopt<97)

{ iopt+=32;

opt=char(iopt);

}

switch(opt){

case 'a': { rinco();

outtextxy(1,295,"Varianta corecta este c");

v2cc();

atent(); flushall(); paralela_v2();sterge_variante();

break;

}

case 'b': { rinco();

outtextxy(1,295,"Varianta corecta este c");

v2cc();

atent(); flushall(); paralela_v2();sterge_variante();

break;

}

case 'c':{

rco();

Page 24: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

24

paralela_v2();sterge_variante();

break;

}

default: {

optinco();

}

}

}

while((opt!='a')&&(opt!='b')&&(opt!='c'));

}

if((u!=0)&&(u!=2*pi)&&(u!=pi))

{

scrie_var3();

do

{

fflush(stdin);

opt=getch();

iopt=(int)(opt);

if(iopt<97)

{iopt+=32;

opt=char(iopt);

}

switch(opt){

case 'a': { rco();

rezultanta();

break;

}

case 'b': { rinco();

outtextxy(1,295,"Varianta corecta este a");

v3ac();

atent(); flushall(); rezultanta();

break;

}

case 'c':{

rinco();

outtextxy(1,295,"Varianta corecta este a");

v3ac();

atent(); flushall(); rezultanta();

break;

}

default: {

optinco();

}

}

}

while((opt!='a')&&(opt!='b')&&(opt!='c'));

}

getch();

closegraph();

}

void rinco()

{

int k=1;

while(k<7)

{

settextstyle(SMALL_FONT, HORIZ_DIR,6);

Page 25: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

25

outtextxy(1,280,"Raspuns incorect !");

sound(100);delay(50);nosound();sound(200);delay(50);

nosound();

k++;

setcolor(k);

delay(50);nosound();

}

setcolor(MAGENTA);

}

void rco()

{

int k=1;

while(k<7)

{

settextstyle(SMALL_FONT, HORIZ_DIR,8);

outtextxy(1,280,"Raspuns corect!");

sound(800);delay(75);nosound();sound(1000);delay(75);

nosound();

k++;

setcolor(k);

delay(50);nosound();

}

}

void optinco()

{

int col;

setcolor(YELLOW);

outtextxy(1,310,"Optiune incorecta! Alegeti alta varianta");

sound(2000);delay(50);nosound();

delay(750);col=getcolor();setcolor(BLACK);

outtextxy(1,310,"Optiune incorecta! Alegeti alta varianta");

setcolor(col);

}

void paralela_v1()

{

float rap,min,max;

if(m1<m2)

{min=m1;

max=m2;

}

else

{

min=m2;

max=m1;

}

rap = max/min;

if(min==m1)

{

ns=(int)(rap)*9;

if((int)(rap)%2==0) ns-=1;

}

else

ns=9;

setlinestyle(SOLID_LINE, 1, 2);

setcolor(BLACK);

nsr=(float)(ns);

dx=(vr.x-v1.x)/nsr;

dy=(vr.y-v1.y)/nsr;

k=0;

do

{

line(v1.x+k*dx,v1.y+k*dy,v1.x+(k+1)*dx,v1.y+(k+1)*dy);

k+=2;

delay(400);

}

while(k<ns);

}

Page 26: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

26

void paralela_v2()

{

float rap,min,max;

if(m1<m2)

{min=m1;

max=m2;

}

else

{

min=m2;

max=m1;

}

rap = max/min;

if(min==m2)

{

ns=(int)(rap)*9;

if((int)(rap)%2==0) ns-=1;

}

else

ns=9;

setlinestyle(SOLID_LINE, 1, 2);

setcolor(BLACK);

nsr=(float)(ns);

dx=(vr.x-v2.x)/nsr;

dy=(vr.y-v2.y)/nsr;

k=0;

do

{

line(v2.x+k*dx,v2.y+k*dy,v2.x+(k+1)*dx,v2.y+(k+1)*dy);

k+=2;

delay(400);

}

while(k<ns);

}

void rezultanta()

{

setlinestyle(SOLID_LINE, 1, 3);

setcolor(RED);

dx=(vr.x-or.x)/nsr;

dy=(vr.y-or.y)/nsr;

k=0;

do

{

line(or.x+k*dx,or.y+k*dy,or.x+(k+1)*dx,or.y+(k+1)*dy);

k++;

delay(500);

}

while(k<ns);

settextstyle(SMALL_FONT,HORIZ_DIR,5);

//if(vr.y>or.y) yor=75; else yor=395;

for(color=1;color<=maxcolor;color++)

{

setcolor(color);

outtextxy(0,320,"Modulul rezultantei: ");

outtextxy(150,320,strmore);

delay(75);

}

setcolor(RED);

outtextxy(0,320,"Modulul rezultantei: ");

outtextxy(150,320,strmore);

setcolor(GREEN);

setlinestyle(SOLID_LINE, 1, 1);

rectangle(230,445,550,470);

k=1;

do

{

setcolor(k);

outtextxy(250,450,"APASA ORICE TASTA PENTRU INCHEIERE");

delay(100);

Page 27: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

27

k++;

}

while(!kbhit());

}

void u0()

{

setlinestyle(SOLID_LINE, 1, 3);

setcolor(RED);

line(or.x,4+or.y,vr.x,4+vr.y);

settextstyle(SMALL_FONT,HORIZ_DIR,5);

if(vr.y>or.y) yor=75; else yor=395;

for(color=1;color<=maxcolor;color++)

{

setcolor(color);

outtextxy(0,320,"Modulul rezultantei: ");

outtextxy(150,320,strmore);

delay(75);

}

setcolor(RED);

outtextxy(0,320,"Modulul rezultantei: ");

outtextxy(150,320,strmore);

setlinestyle(SOLID_LINE, 1, 1);

rectangle(230,445,550,470);

k=1;

do

{

setcolor(k);

outtextxy(250,450,"APASA ORICE TASTA PENTRU INCHEIERE");

delay(100);

k++;

}

while(!kbhit());

}

void upi()

{

setlinestyle(SOLID_LINE, 1, 3);

setcolor(RED);

line(or.x,1+or.y,vr.x,1+vr.y);

settextstyle(SMALL_FONT,HORIZ_DIR,5);

if(vr.y>or.y) yor=75; else yor=395;

for(color=1;color<=maxcolor;color++)

{

setcolor(color);

outtextxy(0,320,"Modulul rezultantei: ");

outtextxy(150,320,strmore);

delay(100);

}

setcolor(RED);

outtextxy(0,320,"Modulul rezultantei: ");

outtextxy(150,320,strmore);

setlinestyle(SOLID_LINE, 1, 1);

rectangle(230,445,550,470);

k=1;

do

{

setcolor(k);

outtextxy(250,450,"APASA ORICE TASTA PENTRU INCHEIERE");

k++;delay(100);

}

while(!kbhit());

}

void sterge_variante()

{

int i;

setcolor(BLACK);

delay(2000);

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

{

line(i,145,i,325);

line(228-i,145,228-i,325);

delay(10);

}

}

Page 28: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

28

void scrie_var1()

{

settextstyle(SMALL_FONT, HORIZ_DIR, 4);

setcolor(CYAN);

delay(200);

outtextxy(1,150,"a) Se unesc varfurile celor doi vectori");

delay(200);

outtextxy(1,160,"b) Se duce o paralela prin varful");

outtextxy(1,170," primului vector la cel de-al doilea");

delay(200);

outtextxy(1,180,"c) Se traseaza diagonala");

outtextxy(1,190," paralelogramului");

delay(200);

outtextxy(1,200,"d) Se traseaza vectorul cu originea in");

outtextxy(1,210," originea celor doi vectori si modu-");

outtextxy(1,220," lul egal cu suma modulelor celor ");

outtextxy(1,230," doi vectori, in sensul acestora");

delay(200);

outtextxy(1,240,"e) Se traseaza un vector cu modulul");

outtextxy(1,250," egal cu diferenta modulelor ");

outtextxy(1,260," in sensul vectorului de modul maxim");

gotoxy(1,270);

}

void scrie_var2()

{

settextstyle(SMALL_FONT, HORIZ_DIR, 4);

setcolor(CYAN);

delay(200);

outtextxy(1,150,"a) Se traseaza diagonala ");

outtextxy(1,160," paralelogramului");

delay(200);

outtextxy(1,170,"b) Se unesc varfurile celor");

outtextxy(1,180," doi vectori");

delay(200);

outtextxy(1,190,"c) Se duce o paralela prin varful");

outtextxy(1,200," celui de-al doilea vector la primul");

}

void scrie_var3()

{

settextstyle(SMALL_FONT, HORIZ_DIR, 4);

setcolor(CYAN);

delay(200);

outtextxy(1,150,"a) Se traseaza rezultanta care este");

outtextxy(1,160," diagonala paralelogramului");

delay(200);

outtextxy(1,170,"b) Se unesc varfurile celor");

outtextxy(1,180," doi vectori");

delay(200);

outtextxy(1,190,"c) Nu se face nimic");

}

void atent()

{

int k;

settextstyle(SMALL_FONT, HORIZ_DIR, 4);

// k=1;

// do

// {

setcolor(YELLOW);

outtextxy(1,330,"Citeste varianta corecta, apasa orice");

outtextxy(1,340,"tasta cand putem continua si apoi");

outtextxy(1,350,"URMARESTE ECRANUL DIN DREAPTA");

line(1,362,175,362);

// delay(100);

k++;

fflush(stdin);

//}

// while(!getch());

getch();

int i;

setcolor(BLACK);

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

{

line(1,280+i,225,280+i);

delay(10);flushall();

}

Page 29: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

29

}

void grid()

{

int j,i,maxx=getmaxx(),pas=15;

int poly[8];

poly[0] = 230;

poly[1] = 40;

poly[2] = maxx-10;

poly[3] = 40;

poly[4] = maxx - 10;

poly[5] = 440;

poly[6] = 230;

poly[7] = 440;

setfillstyle(SOLID_FILL, WHITE);

fillpoly(4, poly);

setlinestyle(USERBIT_LINE,1,1);

setcolor(CYAN);

for(i=234;i<maxx-10;i+=pas)

line(i,48,i,435);

setlinestyle(SOLID_LINE,1,1);

line(235,240,maxx-15,240);

line(230+(maxx-240)/2,45,230+(maxx-240)/2,435);

setcolor(BLACK);

settextstyle(DEFAULT_FONT,HORIZ_DIR,1);

outtextxy(maxx-20,245,"X");

outtextxy(220+(maxx-240)/2,45,"Y");

}

void v1bc()

{

setcolor(7);

setlinestyle(SOLID_LINE,1,1);

drawpoly(4,db);

setfillstyle(SOLID_FILL,7);

fillpoly(4,db);

setcolor(RED);

settextstyle(SMALL_FONT, HORIZ_DIR, 4);

outtextxy(1,160,"b) Se duce o paralela prin varful");

outtextxy(1,170," primului vector la cel de-al doilea");

}

void v1dc()

{

setcolor(7);

setlinestyle(SOLID_LINE,1,1);

drawpoly(4,dd);

setfillstyle(SOLID_FILL,7);

fillpoly(4,dd);

setcolor(RED);

settextstyle(SMALL_FONT, HORIZ_DIR, 4);

outtextxy(1,200,"d) Se traseaza vectorul cu originea in");

outtextxy(1,210," originea celor doi vectori si modu-");

outtextxy(1,220," lul egal cu suma modulelor celor ");

outtextxy(1,230," doi vectori, in sensul acestora");

}

void v1ec()

{

setcolor(7);

setlinestyle(SOLID_LINE,1,1);

drawpoly(4,de);

setfillstyle(SOLID_FILL,7);

fillpoly(4,de);

Page 30: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

30

setcolor(RED);

settextstyle(SMALL_FONT, HORIZ_DIR, 4);

outtextxy(1,240,"e) Se traseaza un vector cu modulul");

outtextxy(1,250," egal cu diferenta modulelor ");

outtextxy(1,260," in sensul vectorului de modul maxim");

}

void v2cc()

{

setcolor(7);

setlinestyle(SOLID_LINE,1,1);

drawpoly(4,dc2);

setfillstyle(SOLID_FILL,7);

fillpoly(4,dc2);

setcolor(RED);

settextstyle(SMALL_FONT, HORIZ_DIR, 4);

outtextxy(1,190,"c) Se duce o paralela prin varful");

outtextxy(1,200," celui de-al doilea vector la primul");

}

void v3ac()

{

setcolor(7);

setlinestyle(SOLID_LINE,1,1);

drawpoly(4,da3);

setfillstyle(SOLID_FILL,7);

fillpoly(4,da3);

setcolor(RED);

settextstyle(SMALL_FONT, HORIZ_DIR, 4);

outtextxy(1,150,"a) Se traseaza rezultanta care este");

outtextxy(1,160," diagonala paralelogramului");

}

Page 31: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

31

Laborator 9 Tema: Pointeri. Parametri în linia de comandă: declararea şi iniţializarea pointerilor; operaţii cu pointeri; apelul funcţiilor prin referinţă; programe cu parametri în linia de comandă Cerinţe:

a. Scrieţi un program pentru alocarea dinamică a memoriei necesare stocării unei matrici b. Scrieţi un program cu parametri în linia de comandă, pentru concatenarea a două fişiere c. Scrieţi un program cu parametri in linia de comanda pentru copierea unui fişier binary d. Scrieţi un program cu parametri in linia de comanda pentru tipărirea pe ecran a ultimelor n

linii ale unui fisier text (comanda "tail" din Linux). #include<stdio.h>

include<stdlib.h>

void main()

{

int n,i;

float *p,*p0;

printf("Introduceti dimensiunea tabloului: ");

scanf("%d",&n);

p = (float *)malloc(n*sizeof(float));

p0=p;

if (p==NULL)

{

printf("Eroare: Memorie nedisponibila\n");

exit(1);

}

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

{

*p=i;

printf("\n%X\t%g",p,*p);

p++;

}

free(p0);

}

//Program cu parametri in linia de comanda: concatenarea a doua fisiere

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <fstream>

int main(int argc, char *argv[])

{

FILE *f1, *f2, *f;

char c, nf1[20], nf2[20], nf[20];

int n;

n=argc;

if(n!=4)

{

printf("Parametri insuficienti sau prea multi!");

while(!_kbhit());

exit(1);

}

else

{

strcpy(nf1,argv[1]);

strcpy(nf2,argv[2]);

f1 = fopen(nf1,"r");

f2 = fopen(nf2,"r");

if( f1 == NULL || f2 == NULL )

{

Page 32: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

32

printf("Eroare la deschiderea fisierelor\nApasa orice tasta pentru iesire din

program\n");

while(!_kbhit());

exit(1);

}

strcpy(nf,argv[3]);

f = fopen(nf,"w");

if(!f)

{

printf("Eroare deschidere fisier\nApasa orice tasta pentru iesire din program\n");

while(!_kbhit());

exit(1);

}

while( ( c = fgetc(f1) )!=EOF)

fputc(c,f);

fclose(f1);

while( ( c = fgetc(f2) )!=EOF)

fputc(c,f);

fclose(f2);

fclose(f);

printf("Cele doua fisiere au fost concatenate in fisierul %s.\n",argv[3]);

}

while(!_kbhit());

return 0;

}

//Program cu parametri in linia de comanda pentru copierea unui fisier binar

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <fstream>

int main(int argc, char *argv[])

{

FILE *f1, *f2;

char c, nf1[20], nf2[20];

int n;

unsigned char byte;

n=argc;

if(n!=3)

{

printf("Parametri insuficienti sau prea multi!");

while(!_kbhit());

exit(1);

}

else

{

strcpy(nf1,argv[1]);

strcpy(nf2,argv[2]);

f1 = fopen(nf1,"rb");

f2 = fopen(nf2,"wb");

if(!f1)

{

printf("Eroare la deschiderea fisierului sursa\n");

while(!_kbhit());

exit(1);

}

while(!feof(f1))

{

fread(&byte,1,1,f1);

fwrite(&byte,1,1,f2);

}

fclose(f1);

fclose(f2);

printf("Fisierul %s a fost copiat cu succes in fisierul %s.\n",argv[1], argv[2]);

}

while(!_kbhit());

return 0;

}

Page 33: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

33

//Program cu parametric in linia de comandă pentru tipărirea pe monitor a ultimelor n linii

//dintr-un fişier text

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <fstream>

int main(int argc, char *argv[])

{

FILE *f;

char ch,rand[200];

int k,ntl=0,nl;//nl-nr lini acre trebuie tiparite, ntl - nr total de linii din fisier

if(argc!=3)

{

printf("Eroare: lansati aplicatia sub forma: %s <numefisier> <nr.linii>\n\a\a",argv[0]);

while(!_kbhit());

exit(1);

}

f=fopen(argv[1],"r");

if(!f) //verifica existenta fisierului

{

printf("Fisier inexistent!");

while(!_kbhit());

exit(1);

}

nl=atoi(argv[2]);

fseek(f,0,0);

ntl=0;//nr. total de linii

while(!feof(f))

if((ch=fgetc(f))=='\n')

ntl++;

fseek(f,0,0);

k=0;

while(!feof(f))

{

if((ch=fgetc(f))=='\n')

k++;

if(k==ntl-nl+1)

break;

}

printf("\nUltimele %d linii din fisierul %s sunt:\n",nl,argv[1]);

while(!feof(f))

{

printf("%s",fgets(rand,100,f));

}

return 0;

}

Page 34: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

34

Laborator 10 Tema: Managementul fişierelor în C - tipul FILE; deschiderea, închiderea, poziţionarea într-un fişier, citirea şi scrierea datelor în fişiere; ştergerea fişierelor Cerinţe:

a. Scrieţi un program care să calculeze matricea distanţelor dintre atomii unei molecule b. Scrieţi două programe: primul sa creeze o bază de date cu un anumit număr de studenţi,

pentru fiecare student fiind necesar: nume, prenume, număr matricol, un număr de cinci cursuri, fiecare curs cu un titlu şi un număr de credite. Al doilea program să caute în baza de date creată cu primul program un student după numărul său matricol, să permită actualizarea notelor studentului respectiv şi calcularea mediei ponderate pentru acel student.

// Calculul matricii distantelor dintre atomii unei molecule triatomice

//(molecula de apa)

#include <stdio.h>

#include <math.h>

struct ca // coordonatele x, y, z ale unui atom al moleculei

{

float x,y,z;

};

struct mol

{

unsigned int N; //nr. de atomi ai moleculei

unsigned int Z[100]; // vector care contine numerele atomice

struct ca cca[100];

float dist[100];

};

int main()

{

FILE *f;

float x[10],y[10],z[10], EN,s,xx,yy,zz;

int i,j,n,Z[10],ijm,ij,ndist;

struct mol m;

f=fopen("mol.inp","r");

n=1;

while(!feof(f))

if(fscanf(f,"%d %f %f %f",&Z[n],&x[n],&y[n],&z[n])==4)

n++;

fclose(f);

printf("Nr. atomi: %d\n",n-1);

m.N=n-1;

for(i=1;i<=m.N;i++)

{

m.Z[i]=Z[i];

m.cca[i].x=x[i]; m.cca[i].y=y[i]; m.cca[i].z=z[i];

}

/* ndist este N(N+1)/2 daca se tine cont si de distantele ii, respectiv N(N-1)/2 daca acestea

nu se retin.

Indicele ij al sirului care va contine distantele (numai matricea simetrica) este ij=N(i-1)+j-

i(i-1)/2. Ultimul termen din expresia lui ij tine cont de eliminarea elementelor de sub

diagonala principala.

*/

printf("\nMatricea distantelor:\n");

for(i=1;i<=m.N;i++)

for(j=i;j<=m.N;j++)

{

ij=m.N*(i-1)+j-(int)(i*(i-1)/2);

xx=(m.cca[i].x-m.cca[j].x)*(m.cca[i].x-m.cca[j].x);

yy=(m.cca[i].y-m.cca[j].y)*(m.cca[i].y-m.cca[j].y);

zz=(m.cca[i].z-m.cca[j].z)*(m.cca[i].z-m.cca[j].z);

m.dist[ij]=sqrt(xx+yy+zz);

}

printf(" ");

for(i=1;i<=m.N;i++)

Page 35: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

35

printf("\t %d",i);

for(i=1;i<=m.N;i++)

{

printf("\n");

printf("%4d%4d",i,m.Z[i]);

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

{

ij=m.N*(i-1)+j-(int)(i*(i-1)/2);

printf("\t%f",m.dist[ij]);

}

}

return 0;

}

Un exemplu de output al acestui program este:

Folosiţi pentru testare exemplul de fişier de intrare dat mai jos, corespunzător moleculei de

apă.

//=========================Program 1===========================

//Creaza o baza de date (in fisierul studenti.dat) cu date despre studenti

#include <stdio.h>

#include <math.h>

#include <string.h>

#include <stdlib.h>

struct crs //structura care contine datele referitoare la un anumit curs

{

char tc[20];

int credit;

int nota;

};

struct datest //structura care contine datele unui student

{

char nume[20],prenume[20];

int nm;

struct crs curs[6]; //doar 5 cursuri dar se face indexarea de la 1

};

struct datest stud[20],unst;

int main()

{

char num[20],pre[20];

int i,nm,nrst;

FILE *f;

if((f=fopen("d:\\studenti.dat","wb"))==NULL)

{

printf("Eroare la deschiderea fisierului!");

exit(1);

}

// Crearea bazei de date cu un anumit numar de studenti

printf("\nCati studenti vor fi adaugati in baza de date? ");

scanf("%d",&nrst);

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

{

fflush(stdin);

if(i!=1) printf("\n");

Page 36: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

36

printf("Student: %d\n",i);

printf("------------------------------------------------");

printf("\nNume:\t\t");gets(num);strcpy(stud[i].nume,num);

printf("Prenume:\t");gets(pre);strcpy(stud[i].prenume,pre);

printf("Nr. matricol:\t");scanf("%d",&nm);stud[i].nm=nm;

strcpy(stud[i].curs[1].tc,"c1");

stud[i].curs[1].credit=5;

strcpy(stud[i].curs[2].tc,"c2");

stud[i].curs[2].credit=6;

strcpy(stud[i].curs[3].tc,"c3");

stud[i].curs[3].credit=7;

strcpy(stud[i].curs[4].tc,"c4");

stud[i].curs[4].credit=8;

strcpy(stud[i].curs[5].tc,"c5");

stud[i].curs[5].credit=9;

fflush(stdin);

fwrite(&stud[i],sizeof(unst),1,f);

}

fclose(f);

return 0;

}

Exerciţiu

Modificaţi programul de mai sus astfel încât numele studenţilor să fie preluate dintr-un

fişier text, iar titlul cursurilor şi numărul de credite asociat fiecărui curs să fie citite

dintr-un alt fişier text.

//======================Program 2==============================

//Cauta intr-o baza de date (in fisierul studenti.dat) un student cu numarul

//matricol introdus de la tastatura si actualizeaza notele studentului

//calculeaza media ponderata a studentului gasit

#include <stdio.h>

#include <math.h>

#include <string.h>

#include <stdlib.h>

struct crs //structura care contine datele referitoare la un anumit curs

{

char tc[20];

int credit;

int nota;

};

struct datest ////structura care contine datele unui student

{

char nume[20],prenume[20];

int nm;

struct crs curs[6];//sunt doar 5 cursuri indexate de la 1 la 5!!!

};

struct datest stud[20],unst,*ps=&unst;

int main()

{

char num[20],pre[20];

int i,nm,nrst=0,cod,gasit,dimstr,nota,nrc=5,ni;

float med,sc,scn;

FILE *f;

if((f=fopen("d:\\studenti.dat","r+b"))==NULL)

{

printf("Eroare la deschiderea fisierului!");

exit(1);

}

dimstr=sizeof(unst);

/*se determina nr. de studenti pentru care exista date in fisier

adica numarul de inregistrari din fisier*/

while(!feof(f))

{

ni=fread(ps,dimstr,1,f);

//ni este valoarea returnata de functia fread

//adica nr. de blocuri citite

if(ni)

nrst++;

}

printf("\n\nIntroduceti nr. matricol al studentului: ");

Page 37: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

37

scanf("%d",&cod);

//cauta studentul cu nr. matricol introdus

//dimstr folosita pentru saltul peste o inregistrare in fisier

i=1;

gasit=0; //devine nenul cand ind=cod

while(i<=nrst)

{

fseek(f,i*dimstr-dimstr,0);

ps=&unst;

fread(ps,dimstr,1,f);

if(unst.nm==cod)

{

printf("\nDatele studentului:\n");

printf("\nNume:\t\t\t%s",unst.nume); //se foloseste nume calificat

printf("\nPrenume:\t\t%s",ps->prenume); //se foloseste pointer

printf("\nNr. matricol:\t\t%d",ps->nm);

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

printf("\n%s\t%d\t%d",unst.curs[i].tc,unst.curs[i].credit,unst.curs[i].nota);

gasit=1;

i=nrst+1; // se evita cautarea in continuare

}

i++ ;//se trece la urmatoarea inregistrare

}

if(!gasit)

printf("Acest student nu exista in baza de date!");

else

{

//se scriu datele studentului gasit si se actualizeaza notele acestuia

printf("\n\n\n%d\t%s\t%s\n",ps->nm,ps->nume,ps->prenume);

printf("\nCurs\t\tCredite\t\tNota\n");

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

{

printf("%s\t\t%d\t\t",unst.curs[i].tc,unst.curs[i].credit);

scanf("%d",&nota);

unst.curs[i].nota=nota;

}

fseek(f,-dimstr,1);

//repozitionare in fisier intre citire si scriere

//in plus, se tine cont de faptul ca la fiecare citire, pointerul de fisier

//a avansat cu o inregistrare

fwrite(ps,sizeof(unst),1,f);

//calculeaza media ponderata a studentului

sc=0;scn=0;

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

{

sc=sc+unst.curs[i].credit;

scn=scn+unst.curs[i].credit*unst.curs[i].nota;

}

med=scn/sc;

med=med-0.0049;//pentru ca numarul rotunjit la 2 cifre sa fie egal

//cu media cu 2 cifre

printf("\nMedia: %6.2f",med);

}

fclose(f);

return 0;

}

Exemple de output ale acestor programe:

Programul 1:

Page 38: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

38

Programul 2

Page 39: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

39

Laborator 11 Tema: Rezolvarea ecuaţiilor algebrice şi transcendente: metoda bisecţiei, metoda Newton, metoda aproximaţiilor succesive Cerinţe:

a. Scrieţi programul corespunzător metodei Newton, cu funcţie b. Scrieţi programul corespunzător metodei bisecţiei, cu funcţie şi cu grafica

// Metoda Newton

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <conio.h>

double f(double x)

{

return 4.5*cos(x/3)*cos(x/3)-x/4;

}

double newton(double (*) (double), double x0)

{

double p=1.0,eps,x,df;

int k;

//Calculul preciziei masinii si a valorii eps

do

p=p/2.0;

while(p+1.0!=1.0);

eps=pow(p,1/3.0);

printf("p= %.20lf\teps= %.20lf",p,eps);

//Calculul solutiei

x=x0;

k=0;

do

{

k++;

x0=x;

//calculul numeric al derivatei prin CDM

df=(f(x+eps)-f(x-eps))/2/eps;

//evitarea cazului in care df este zero

if(df==0)

df=eps;

//actualizarea solutiei

x=x0-f(x)/df;

printf("\nIteratia: %d: x= %15.12lf",k,x);

if(k>20)

{

printf("\nNu converge!");

while(!_kbhit());

exit(1);

}

}

while(x!=x0);

printf("\nSolutia ecuatiei este %15.12lf\nNr. de iteratii: %d",x,k);

return x;

}

int main ()

{

double x0,x;

int k;

printf("Solutia initiala: x0= ");

scanf("%lf",&x0);

newton(f,x0);

while(!_kbhit());

return 0;

}

Page 40: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

40

//metoda bisectiei cu grafica

#include <stdio.h>

#include <conio.h>

#include <dos.h>

#include<graphics.h>

#include<stdlib.h>

#include<math.h>

#define A 3

#define B 4

#define eps 1e-8

int color,maxcolor;

double f(double x)

{

return 4.5*cos(x/3)*cos(x/3)-x/4;

}

double bisect(double inf, double sup, double (*pf)(double))

{

double c,sol,c0;

double atr,btr;

int k,infpix,suppix,c0pix,cpix,iter;

char

strinf[25],strsup[25],striter[25];

atr=550/(sup-inf);

btr=(50*sup-600*inf)/(sup-inf);

c0=(inf+sup)/2.0;

c0pix=atr*c0+btr;

setcolor(LIGHTBLUE);

line(c0pix,7,c0pix,13);

//delay(250);

setcolor(LIGHTGREEN);

line(50,10,600,10);

line(50,10,50,5);

line(600,10,600,5);

gcvt(inf,6,strinf);

gcvt(sup,6,strsup);

settextstyle(10,HORIZ_DIR,1);

outtextxy(5,2,strinf);

outtextxy(610,2,strsup);

if((*pf)(inf)==0) return inf;

if((*pf)(sup)==0) return sup;

if((*pf)(inf)*(*pf)(sup)>0)

{

printf("\n\a\aNu exista sol sau exista sol. multiple");

getch();

exit(1);

}

k=10;

iter=0;

do

{

iter++;

c=(inf+sup)/2.0;

if((*pf)(c)==0) return c;

if((*pf)(inf)*(*pf)(c)<0)

sup=c;

else

inf=c;

infpix=inf*atr+btr;

suppix=sup*atr+btr;

cpix=(infpix+suppix)/2;

if(k<420)

{

k+=25;

delay(10);

line(infpix,k,suppix,k);delay(20);

setcolor(LIGHTBLUE);

line(cpix,k-3,cpix,k+3);

setcolor(LIGHTGREEN);

gcvt(inf,6,strinf);

gcvt(sup,6,strsup);

outtextxy(5,k-8,strinf);

outtextxy(605,k-8,strsup);

}

Page 41: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

41

}

while(fabs((*pf)(c)) >= eps);

sol=c;

/* for(color=1;color<=-1+getmaxcolor();color+=2)

{

setcolor(color);

line(atr*sol+btr,k,atr*sol+btr,2);

delay(200);

}

setcolor(LIGHTBLUE);

line(atr*sol+btr,k,atr*sol+btr,2);

*/

gcvt(iter,5,striter);

setcolor(LIGHTRED);

settextstyle(4,HORIZ_DIR,1);

outtextxy(20,500,"Nr. Iteratii: ");

outtextxy(270,500,striter);

return c;

}

int main()

{

double s;

char soltext[25];

/*

int gdriver = DETECT, gmode, errorcode;

initgraph(&gdriver, &gmode, "c:\\borlandc\\bgi");

errorcode = graphresult();

if (errorcode != grOk)

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

exit(1);

}

*/

initwindow(760,550,"Metoda bisectiei");

setcolor(LIGHTGREEN);

s=bisect(A,B,f);

setcolor(LIGHTBLUE);

gcvt(s,7,soltext);

maxcolor=getmaxcolor();

settextstyle(4,HORIZ_DIR,1);

for(color=1;color<=maxcolor;color++)

{

setcolor(color);

outtextxy(20,480,"Solutia finala este ");

outtextxy(270,480,soltext);

delay(50);

}

setcolor(LIGHTRED);

outtextxy(20,480,"Solutia finala este:");

outtextxy(270,480,soltext);

getch();

closegraph();

}

Page 42: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

42

Laborator 12 Tema: Fitarea datelor: Fitarea datelor prin metoda celor mai mici pătrate; regresia liniară Cerinţe:

a. Scrieţi un program pentru modelarea datelor experimentale corespunzătoare lucrării de laborator "Potenţiometrul compensator".

b. Scrieţi un program pentru generarea datelor corespunzătoare variaţiei numărului de nuclee radioactive pentru un anumit izotop. Alteraţi datele calculate exact cu valori aleatoare în intervalul [-2.5%Ni - +2.5%Ni].

//regresia liniara

#include <stdio.h>

#include <conio.h>

#include <dos.h>

#include <graphics.h>

#include<stdlib.h>

#include<math.h>

int main()

{

FILE *f;

int n,i,xpmin,xpmax,ypmin,ypmax,xr,yr;

float x,y,xd[50],yd[50],xdmin,xdmax,ydmin,ydmax;

float Sx,Sy,Sxx,Sxy,a,b,S,era,erb;

float ymed, s1,s2,R2;

float ax,bx,ay,by;

int xp[50],yp[50];

char nf[20],stra[15], strb[15];

printf("Numele fisierului de intrare: ");

gets(nf);

f=fopen(nf,"r");

if(!f)

{

printf("\nFisier inexistent!");

getch();

exit(1);

}

i=0;

Sx=Sy=Sxx=Sxy=0;

while(!feof(f))

{

if(fscanf(f,"%f%f",&x,&y)==2)

{

xd[i]=x;

yd[i]=y;

i++;

Sx+=x;

Sy+=y;

Sxx+=x*x;

Sxy+=x*y;

}

}

n=i;

a=(n*Sxy-Sx*Sy)/(n*Sxx-Sx*Sx);

b=(Sy-a*Sx)/n;

fclose(f);

f=fopen(nf,"r");

s1=s2=0;

ymed=Sy/n;

while(!feof(f))

{

if(fscanf(f,"%f %f",&x,&y)==2)

{

s1+=(a*x+b-y)*(a*x+b-y);

s2+=(ymed-y)*(ymed-y);

}

}

R2=1-s1/s2;

Page 43: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

43

//Calculul erorii parametrilor de fit

S=sqrt(s1/(n-2));

era=S*sqrt(n/(n*Sxx-Sx*Sx));

erb=S*sqrt(Sxx/(n*Sxx-Sx*Sx));

//Tiparirea rezultatelor

printf("===================================================\n");

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

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

printf("\n%10.2f\t%10.2f",xd[i],yd[i]);

printf("\n\nParametrii de fit sunt:\na= %7.3f\tb= %7.3f\n",a,b);

printf("\nCoeficientul de corelare: R2= %g\n",R2);

printf("\nErorile coeficientilor de fit:\nEr_a= %10.6f\tEr_b= %10.6f\n",era,erb);

printf("\na= %12.6f\t+/- %12.6f\n",a,era);

printf("b= %12.6f\t+/- %12.6f\n",b,erb);

printf("===================================================\n");

fclose(f);

xdmin=xdmax=xd[0];

ydmin=ydmax=yd[0];

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

{

if(xd[i]>xdmax)

xdmax=xd[i];

else

if(xd[i]<xdmin)

xdmin=xd[i];

if(yd[i]>ydmax)

ydmax=yd[i];

else

if(yd[i]<ydmin)

ydmin=yd[i];

}

//Dimensiunile ferestrei de afisare si coeficientii de scalare

xpmin=160;xpmax=440;

ypmin=85;ypmax=365;

ax=(xpmax-xpmin)/(xdmax-xdmin);

bx=xpmin-ax*xdmin;

ay=(ypmax-ypmin)/(ydmin-ydmax);

by=ypmax-ay*ydmin;

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

{

xp[i]=(int)(ax*xd[i]+bx);

yp[i]=(int)(ay*yd[i]+by);

}

initwindow(1000,500,"Regresia liniara",5,5);

xpmax=getmaxx();

ypmax=getmaxy();

xr=4;yr=4;

//setcolor(0);

/*BLACK 0 BLUE 1 GREEN 2 CYAN 3 RED 4 MAGENTA 5 BROWN 6

LIGHTGRAY 7 DARKGRAY 8 LIGHTBLUE 9 LIGHTGREEN 10

LIGHTCYAN 11 LIGHTRED 12 LIGHTMAGENTA 13 YELLOW 14 WHITE 15

*/

//for(i=0;i<=ypmax;i++)

// line(0,i,xpmax,i);

setcolor(GREEN);

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

rectangle(150+i,75+i,450-i,375-i);

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

{

fillellipse(xp[i], yp[i], xr, yr);

delay(100);

}

setcolor(YELLOW);

setlinestyle(0,0,2);

//Trasarea dreptei de regresie

line(xp[0],(int)(ay*(xd[0]*a+b)+by),xp[n-1],(int)(ay*(xd[n-1]*a+b)+by));

delay(500);

//Tiparirea informatiilor pe grafic

Page 44: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

44

settextstyle(4,HORIZ_DIR,1);

outtextxy(270,390,"I (mA)");

settextstyle(1,HORIZ_DIR,3);

outtextxy(150,10,"Regresia liniara");

settextstyle(6,HORIZ_DIR,1);

outtextxy(150,40,"Exemplu: potentiometrul compensator");

settextstyle(4,VERT_DIR,1);

outtextxy(120,270,"U (V)");

settextstyle(8,HORIZ_DIR,1);

outtextxy(460,200,"Functia de fit:");

outtextxy(460,230,"f(x) = ");

gcvt(a,2,stra);

gcvt(b,4,strb);

outtextxy(530,230,stra);

outtextxy(650,230,"x +");

outtextxy(700,230,strb);

gcvt(R2,4,stra);

outtextxy(460,260,"R^2 = ");

outtextxy(530,260,stra);

outtextxy(460,320,"E = ");

outtextxy(500,320,strb);

outtextxy(600,320,"+/-");

gcvt(erb,2,strb);

outtextxy(650,320,strb);

outtextxy(750,320,"V");

outtextxy(460,350,"r = ");

gcvt(-a,3,stra);

outtextxy(500,350,stra);

outtextxy(600,350,"+/-");

gcvt(era,2,stra);

outtextxy(650,350,stra);

outtextxy(740,350,"ohmi");

setcolor(RED);

rectangle(455,310,790,376);

while(!_kbhit());

closegraph();

return 0;

}

Page 45: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

45

//generare valori dezintegrare radioactiva, cu erori

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <stdlib.h>

#include <math.h>

#include <time.h>

int main()

{

FILE *f;

int i;

float t,N,t12,lam,pas,N0,dn;

char nf[20];

printf("Numele fisierului de iesire: ");

gets(nf);

printf("T1/2 = ");

scanf("%f",&t12);

lam=log(2.0)/t12;

printf("N0 = ");

scanf("%f",&N0);

srand(time(NULL));

f=fopen(nf,"w");

pas=t12/20;

t=0.;

N=N0;

dn=rand()/pow(2,15)*0.05*N-0.025*N;

N+=dn;

printf("%.3f\t%.6f\t%.6f\n",t,N,dn);

fprintf(f,"%.3f\t%.6f\t%.6f\n",t,N,dn);

while(t<=20*t12)

{

t=t+pas;

N=N0*exp(-lam*t);

dn=rand()/pow(2,15)*0.05*N-0.025*N;

N+=dn;

printf("%.3f\t%.6f\t%.6f\n",t,N,dn);

fprintf(f,"%.3f\t%.6f\t%.6f\n",t,N,dn);

}

fclose(f);

return 0;

}

Page 46: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

46

Page 47: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

47

Laborator 13 Tema: Integrarea funcţiilor: Integrarea funcţiilor prin metoda trapezelor şi metoda Simpson Cerinţe:

a. Scrieţi un program pentru calculul integralei unei funcţii folosind metoda trapezelor b. Scrieţi un program pentru calculul integralei unei funcţii folosind metoda lui Simpson c. Scrieţi un program pentru calculul ln(v), folosind metoda simpson pentru evaluarea

integralei funcţiei 1/x de la 1 la v //Metoda trapezelor

#include <stdio.h>

#include <conio.h>

float f(float x)

{

return 9-x*x;

}

int main()

{

int i,np;

float t,s=0,h,a,b,ls,li,vi;

printf("\nNr puncte ? ");scanf("%i",&np);

// li=0.0;ls=3.0;

printf("\nLimitele de integrare: ");

scanf("%f%f",&li,&ls);

h=(ls-li)/(np-1);

for (i=1;i<=np-1;i++)

{

a=li+(i-1)*h;

b=a+h;

t=(f(b)+f(a))*h/2.0;

s+=t;

}

vi=s;

printf("Valoarea integralei este: %f",vi);

getch();

return 0;

}

//Metoda trapezelor

#include<stdio.h>

#include<math.h>

double f(double x)

{

return 4.5*cos(x/3)*cos(x/3)-x/4;

}

double simpson(double a, double b, int m, double (*)(double x))

{

double h,s1,s2,I;

int i;

if(a==b) return 0; //cazul a=b

m=2*m; // asigura ca nr. de intervale este par

h=(b-a)/m; // calculul lungimii intervalelor

s1=0.0;

s2=0.0;

for(i=1;i<=m/2;i++) //calculul celor doua sume

{

s1+=f(a+(2*i-1)*h);

if(i<m/2)

s2+=f(a+2*i*h);

}

I=(h/3)*(f(a)+f(b)+4*s1+2*s2);

return I;

}

void main()

4.5 cosx

3

cosx

3

x

4

x

10 5 0 5 102

0

2

4

6

8

Page 48: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

48

{

double a,b,I;

int m;

a=0;

b=10;

printf("\nIntroduceti o valoare para pentru numarul de intervale m= ");

scanf("%d",&m);

I=simpson(a,b,m,f);

printf("\n\t I=%12.10f\n",I);

printf("\n exp(1)= %12.10f",exp(1)-exp(0)); //caz test

//getch();

}

#include<stdio.h>

#include<math.h>

#include<stdlib.h>

#include<conio.h>

//Program pentru calculul functiei ln() folosind metoda

//Simpson pentru evaluarea integralei functiei 1/x, de la 1 la v.

double unupex(double x)

{

return 1.0/x;

}

double simpson(double a, double b, int m, double (*)(double x))

{

double h,s1,s2,I;

int i;

if(a==b) return 0; //cazul a=b

m=2*m; // asigura ca nr. de intervale sa fie par

h=(b-a)/m; // calculul lungimii intervalelor

s1=0.0;

s2=0.0;

for(i=1;i<=m/2;i++) //calculul celor doua sume

{

s1+=unupex(a+(2*i-1)*h);

if(i<m/2)

s2+=unupex(a+2*i*h);

}

I=(h/3)*(unupex(a)+unupex(b)+4*s1+2*s2);

return I;

}

double lnint(double v)

{//Calculul ln(v) ca si integrala de la 1 la v din 1/x

double I;

long int m;

m=100000;

I=simpson(1,v,m,unupex);

return I;

}

int main()

{

double x,lnx;

printf("Programul calculeaza ln(x)");

printf("\nx= ");

scanf("%lf",&x);

if(x<=0)

{

printf("\nArgument invalid!");

exit(1);

}

lnx=lnint(x);

printf("\nln(%lg) = %.14lf",x,lnx);

printf("\nln(%lg) = %.14lf",x,log(x));//functia implementata in <math.h>

while(!_kbhit());

return 0;

Page 49: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

49

}

Laborator 14 Tema: Rezolvarea sistemelor de ecuaţii liniare prin metoda lui Gauss; Calculul determinantului şi inversei unei matrici Cerinţe:

a. Scrieţi un program pentru rezolvarea unui sistem de ecuaţii liniare prin metoda eliminării a lui Gauss

b. Scrieţi un program pentru calculul determinantului unei matrici şi a inversei acesteia Programul Gauss.cpp a fost scris pentru rezolvarea sistemelor de ecuaţii liniare prin metoda

lui Gauss. Programul pune la dispoziţia utilizatorului un meniu simplu, în mod text, cu 3

opţiuni, pe baza căruia se poate alege: rezolvarea unui sistem de ecuaţii, determinarea

inversei unei matrici sau calculul determinantului unei matrici. Execuţia programului continuă

numai dacă s-a ales una dintre opţiunile 1, 2 sau 3.

Calculele principale se realizează în funcţia gauss() care execută eliminarea Gaussiană în

următorii paşi: căutarea elementului pivot, de fapt a liniei care are în coloana k cel mai

mare element, interschimbarea liniilor, calculul elementelor matricii la fiecare eliminare şi

calculul determinantului matricii.

Alte funcţii pe care le conţine programul sunt:

matinv() – determină inversa matricii

citire_mat() – citeşte matricea de intrare

citire_tl() – citeşte matricea coloană a termenilor liberi

solutii() – calculează soluţiile sistemului liniar

verif() – verifică inversarea facând produsul dintre matricea iniţială

şi inversa determinată pentru a se vedea dacă se obţine matricea unitate

meniu() – permite alegerea uneia dintre cele trei opţiuni

Rezultatele execuţiei programului, adică matricea iniţială, matricea termenilor liberi (dacă

s-a ales rezolvarea unui sistem liniar), matricea inversă, produsul dintre matricea iniţială

şi inversă sau determinantul sunt tipărite pe ecran, dar sunt de asemenea tipărite şi în

fişierul gauss.rez, care se crează pe partiţia c:, în directorul rădăcină (fişierul

c:\gauss.rez).

Programul poate fi verificat pe următorul caz test:

Matricea sistemului:

1.00000 1.00000 1.00000 1.00000 1.00000

2.00000 3.00000 1.00000 5.00000 2.00000

-1.00000 1.00000 -5.00000 3.00000 6.00000

3.00000 1.00000 7.00000 -2.00000 -3.00000

2.00000 2.00000 2.00000 1.00000 -3.00000

Termenii liberi:

12.00000 35.00000 10.00000 12.00000 10.00000

Solutii:

x[0]= 1.00000

x[1]= 2.00000

x[2]= 3.00000

x[3]= 4.00000

x[4]= 2.00000

Matricea inversa este:

16.00000 -3.00000 -3.66667 -4.66667 0.66667

-12.50000 2.00000 3.41667 3.91667 0.08333

-4.50000 1.00000 0.91667 1.41667 -0.41667

2.00000 0.00000 -0.83333 -0.83333 -0.16667

0.00000 0.00000 0.16667 0.16667 -0.16667

Verificarea inversarii: AxA^-1

1 0 0 0 0

0 1 0 0 0

0 0 1 0 0

0 0 0 1 0

0 0 0 0 1

Determinantul matricii este: -12

Page 50: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

50

Page 51: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

51

//Program Gauss

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#include<conio.h>

#include <windows.h>

#define dm 10

//Defines gotoxy() for ANSI C compilers.

void gotoxy(short x, short y) {

COORD pos = {x, y};

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

}

// Constanta dm reprezinta dimensiunea maxima a matricii sistemului

double a[dm][dm],ain[dm][dm],inv[dm][dm],prod[dm][dm]; //matricea sistemului

double b[dm],x[dm],det=1.0,dtm; //b este matricea termenilor liberi

int n,opt; //n este dimensiunea actuala a matricii sistemului

FILE *f; //descriptorul fisierului in care se vor scrie toate rezultatele

void stop()

{

printf("\n\n====================================");

printf("\nApasa orice tasta pentru continuare.");

printf("\n====================================");

printf("\n\nRezultatele se gasesc si in fisierul: c:\\gauss.rez");

getch();

}

void meniu()

//permite selectarea unei optiuni din meniu si apoi calculul corespunzator

{

printf("\n=========================== M E T O D A G A U S S

=======================");

printf("\n\nPuteti alege intre:\n\t1) Rezolvarea unui sistem de ecuatii liniare");

printf("\n\t2) Determinarea inversei unei matrici\n\t3) Calculul determinantului unei

matrici");

do

{

fflush(stdin);

gotoxy(1,9);

printf("Optiunea: ");

gotoxy(12,9);

scanf("%d",&opt);

}

while(((opt!=1)&&(opt!=2))&&(opt!=3));

}

void verif()

//verifica inversarea matricii prin inmultirea acesteia cu inversa ei

//rezultatul trebuie sa fie matricea unitate

{

int i,j,k;

printf("\nVerificarea inversarii: AxA^-1");

fprintf(f,"\n\nVerificarea inversarii: AxA^-1\n");

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

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

{

prod[i][j]=0;

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

prod[i][j]+=ain[i][k]*inv[k][j];

}

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

{

printf("\n\t\t");

fprintf(f,"\n\t\t");

Page 52: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

52

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

{

if(fabs(prod[i][j])<1e-8)

prod[i][j]=0;

printf("%g\t",prod[i][j]);

fprintf(f,"%g\t",prod[i][j]);

}

}

}

void solutii()

//calculeaza solutiile sistemului liniar

{

int i,j;

double suma;

x[n-1]=b[n-1]/a[n-1][n-1];

for (j=n-2;j>=0;j--)

{

suma=0;

for(i=j+1;i<n;i++)

suma+=a[j][i]*x[i];

x[j]=(b[j]-suma)/a[j][j];

}

}

void tip_sol()

//tipareste solutiile sistemului

{

int i;

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

{

printf("\nx[%d]=%10.5lf",i,x[i]);

fprintf(f,"\nx[%d]=%10.5lf",i,x[i]);

}

}

void citire_mat()

//citeste matricea de intrare

{

int i,j;

gotoxy(1,10);

printf("Ordinul matricii sistemului: ");

scanf("%d",&n);

gotoxy(1,11);

printf("Matricea sistemului: ");

fprintf(f,"\nMatricea sistemului: \n");

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

{

fprintf(f,"\n");

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

{

gotoxy(7*j+1,i+12);

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

ain[i][j]=a[i][j];

fprintf(f,"%10.5lf",a[i][j]);

}

}

}

void citire_tl()

{

//citeste matricea termenilor liberi

int i;

fprintf(f,"\nTermenii liberi:\n");

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

Page 53: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

53

{

gotoxy(7*n+1,i+12);

scanf("%lf",&b[i]);

fprintf(f,"%10.5lf",b[i]);

}

}

double gauss()

{

//realizeaza eliminarea Gaussiana

double t,m;

int i,j,k,l;

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

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

a[i][j]=ain[i][j];

//Se cauta elementul pivot

//de fapt linia care are in coloana k cel mai mare element

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

{

l=k; // l este indexul liniei pivot

for (i=k+1;i<n;i++)

if (fabs(a[i][k])>fabs(a[k][k]))

l=i;

//Daca elementul pivot este intr-o alta linie decat cea curenta

// atunci se interschimba linia curenta cu cea in care se afla elem. pivot

if(l!=k)

{

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

{

t=a[k][j];a[k][j]=a[l][j];a[l][j]=t;

}

t=b[k];b[k]=b[l];b[l]=t;

det*=-1;

}

//Se calculeaza elementele matricii la eliminarea k

for(i=k+1;i<n;i++)

{

m=a[i][k]/a[k][k];

a[i][k]=0;

for(j=k+1;j<n;j++)

a[i][j]=a[i][j]-m*a[k][j];

b[i]=b[i]-m*b[k];

}

}

//Se calculeaza determinantul matricii

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

det*=a[i][i];

dtm=det;

return dtm;

}

int matinv()

//calculeaza inversa matricii

{

int p,j,i,k;

double suma,t[dm];

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

{

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

{

Page 54: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

54

if(j==p)

t[j]=1;

else

t[j]=0;

b[j]=t[j];

}

gauss();

solutii();

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

inv[k][p]=x[k];

}

printf("\nMatricea inversa este:");

fprintf(f,"\n\nMatricea inversa este:\n");

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

{

printf("\n");

fprintf(f,"\n");

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

{

printf(" %10.5lf",inv[i][j]);

fprintf(f," %10.5lf",inv[i][j]);

}

}

return 0;

}

//========================================================

int main()

{

double x[10],det,suma;

int i,j,k;

f=fopen("c:\\gauss.rez","w");

meniu();

if(opt==1)

{

citire_mat();

citire_tl();

gauss();

solutii();

tip_sol();

stop();

}

else

if(opt==2)

{

citire_mat();

matinv();

verif();

stop();

}

else

{

citire_mat();

gauss();

printf("\nDeterminantul matricii este: %lg",dtm);

fprintf(f,"\n\nDeterminantul matricii este: %lg",dtm);

stop();

}

fclose(f);

return 0;

}

Page 55: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

55

Exemple output:

Page 56: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

56

Tipuri de proiecte Energia oscilatorului armonic

Simularea figurilor de interferenta şi difracţie

Simularea ciocnirii elastice

Page 57: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

57

Simularea mişcării planetelor sistemului solar

Grafica în fizica - PhysGraph

Page 58: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

58

Linii de câmp electrostatic pentru diferite distribuţii de sarcină

Program //Largire cu functie Lorentziana #include<stdio.h> #include<math.h> const int np=1000; float eps[3]={2.0, 6,8}, A[3]={5,2,8}, en[np], ints[np]; float g=3.5, E,x,amp; float L(float E, float x) { //x este eps[i]; return amp*g*g/((E-x)*(E-x)+g*g); } int main() { FILE *f; float Emin,Emax,dE,y; int i,j; f=fopen("d:\\l31.dat","w"); for(i=0;i<np;i++) ints[i]=0; Emin=eps[0]-eps[0]/2; Emax=eps[2]+eps[0]/2; dE=(Emax-Emin)/(np-1); for(i=0;i<3;i++) { amp=A[i]; x=eps[i]; E=Emin; j=0; do {

Page 59: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/curs_lab/... · 2019-05-22 · 1 Laborator Informatică Aplicată în Fizică Prof.dr. Vasile

59

y=L(E,x); ints[j]+=y; j++; E=E+dE; } while(E<=Emax); } E=Emin; for(i=0;i<np;i++) { fprintf(f,"%f %f\n",E,ints[i]); E+=dE; } fclose(f); return 0; }

Spectru de absorbţie cu linie lărgită Lorentzian cu diferite HWHM

0 2 4 6 8 10

0

2

4

6

8

10

12

Ab

so

rptio

n (

a.u

.)

E(eV)