Post on 14-Jan-2020
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
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.
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
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;
}
5
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
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]);
}
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;
}
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;
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;
}
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++)
{
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>
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();
}
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ă
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);
}
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");
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
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
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();
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();
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 !");
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()
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++;
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()
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();
}
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);
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");
}
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());
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;
}
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:
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");
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
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",¬a);
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:
34
Programul 2
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;
}
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);
}
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();
}
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));
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);
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;
}
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;
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();
}
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
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");
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++)
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++)
{
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;
}
48
Exemple output:
49
Tipuri de proiecte Energia oscilatorului armonic
Simularea figurilor de interferenta şi difracţie
Simularea ciocnirii elastice
50
Simularea mişcării planetelor sistemului solar
Grafica în fizica - PhysGraph
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 {
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)