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

Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

  • Upload
    others

  • View
    11

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

1

Laborator Informatică Aplicată în Fizică

Prof.dr. Vasile Chiş

Bibliografie

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

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

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

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

4. B. W.Kernighan, D.M. Ritchie, The C Programming Language, Prentice Hall, Inc., 1988 5. 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/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

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/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

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/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

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/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

5

Page 6: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

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>

void main()

{

float nr,pz,mnr;

long int pi,c,r;

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

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

printf("Introduceti numarul: ");

scanf("%f",&nr);

//se determina bitul de semn, modulul, partea intreaga si zecimala

if(nr>=0)

s[31]=0;

else s[31]=1;

mnr=fabs(nr);//modulul numarului

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

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

//transformarea in binar a partii intregi

i=0;

do

{

c=pi/2;

r=pi-c*2;

pibin[i]=r;

i++;

pi=c;

}

while(pi>0);

nbpi=i;//nr de biti ai partii intregi

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

//se adauga bitii partii intregi la mantisa numarului

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

s[22-i]=pibin[expon-1-i];

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

//transformarea in binar a exponentului

i=0;

do

{

c=EXP/2;

r=EXP-c*2;

se[i]=r;

i++;

EXP=c;

}

while(EXP>0);

// scrierea bitilor exponentului

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;

//transformarea in binar a partii zecimale

Page 7: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

7

i=1;

do

{

pzbin[i]=floor(2*pz);

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

i++;

//Stabilirea conditiei de inchiere: 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;

}

while(!cond);

k=i-1;

//adaugarea bitilor partii zecimale

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

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

//setarea pe zero a bitilor nefolositi

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

s[i]=0;

//tiparirea sirului de biti in reprezentarea IEEE

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

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

//printf("|");

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

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

//printf("|");

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

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

}

Page 8: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

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/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

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/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

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/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

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/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

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(-x

2)

#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/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

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/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

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

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/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

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/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

16

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();

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

Page 17: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

17

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);

}

else

Page 18: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

18

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();

}

else

Page 19: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

19

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 20: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

20

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();

paralela_v2();sterge_variante();

Page 21: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

21

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);

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

Page 22: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

22

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);

}

void paralela_v2()

Page 23: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

23

{

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);

k++;

Page 24: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

24

}

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);

}

}

void scrie_var1()

Page 25: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

25

{

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 26: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

26

}

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);

setcolor(RED);

Page 27: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

27

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 28: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

28

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 binar

#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 )

{

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

program\n");

while(!_kbhit());

Page 29: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

29

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 30: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

30

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 cc // 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 cc cca[100];

float dist[100];

};

int main()

{

int i,j,ij,ndist;

float xx,yy,zz;

struct mol m1;

m1.N=3;

m1.Z[1]=8; m1.Z[2]=1; m1.Z[3]=1;

m1.cca[1].x=0; m1.cca[1].y=0; m1.cca[1].z=0.11755;

m1.cca[2].x=0; m1.cca[2].y=0.759; m1.cca[2].z=-0.47;

m1.cca[3].x=0; m1.cca[3].y=-0.759; m1.cca[3].z=-0.47;

/* 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("Matricea distantelor:\n");

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

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

{

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

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

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

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

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

printf("\n[%d,%d]= %6.3f",i,j,m1.dist[ij]);

}

return 0;

}

Un exemplu de output al acestui program este:

Page 31: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

31

Matricea distanţelor va fi tipărită sub forma:

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");

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");

Page 32: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

32

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: ");

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

Page 33: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

33

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 34: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

34

Programul 2

Page 35: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

35

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 36: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

36

//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 37: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

37

}

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 38: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

38

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".

//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;

//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));

Page 39: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

39

//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

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);

Page 40: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

40

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 41: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

41

4.5 cosx

3

cosx

3

x

4

x

10 5 0 5 102

0

2

4

6

8

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

//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()

{

double a,b,I;

int m;

a=0;

Page 42: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

42

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();

}

Page 43: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

43

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 44: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

44

//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 45: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

45

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 46: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

46

{

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 47: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

47

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 48: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

48

Exemple output:

Page 49: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

49

Tipuri de proiecte Energia oscilatorului armonic

Simularea figurilor de interferenta şi difracţie

Simularea ciocnirii elastice

Page 50: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

50

Simularea mişcării planetelor sistemului solar

Grafica în fizica - PhysGraph

Page 51: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

51

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 52: Laborator Informatică Aplicată în Fizică Prof.dr. Vasile Chişvasile.chis/cursuri/info/Chis_laborator_IAF.pdf · ale unui număr real b. Proiectaţi algoritmul şi scrieţi codul

52

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)