Documente Academic
Documente Profesional
Documente Cultură
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
struct coord
{
int x;
int y;
};
struct coord p[2];
struct drpt
{
struct coord pss;
struct coord pdj;
};
struct drpt dr, *psdr=&dr;
double d,A;
int x[2]={30,60},y[2]={30,70};
// x si y sunt doi vectori care contin coordonatele x si respectiv y ale
celor // doua puncte
FILE *f;
int i,*pi;
f=fopen("d:\\date.inp","wb");
if(!f)
{
printf("\nEroare la deschiderea fisierului!\n");
exit(1);
}
for(i=0;i<2;i++)
{
//se definesc cele doua puncte si se scriu valorile corespunzatoare in
fisier
p[i].x=x[i];
p[i].y=y[i];
fwrite(&p[i],sizeof(p[i]),1,f);
}
fclose(f);
f=fopen("d:\\date.inp","rb");
fseek(f,0,0);
for(i=0;i<2;i++)
{
//se deschide fisierul si se citesc coordonatele punctelor
fseek(f,0,1);
fread(psdr,sizeof(drpt),1,f);
}
fclose(f);
d=sqrt((dr.pdj.x-dr.pss.x)*(dr.pdj.x-dr.pss.x)+(dr.pdj.y-
dr.pss.y)*(dr.pdj.y-dr.pss.y));
printf("\nDistanta dintre cele doua puncte este: %g",d);
A=fabs((dr.pdj.x-dr.pss.x))*fabs((dr.pss.y-dr.pdj.y));
printf("\nAria dreptunghiului este A= %g",A);
while(!_kbhit());
return 0;
}
Mai jos sunt date ca exemplu două programe: primul crează 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 caută în baza de date creată cu primul program un student după numărul său matricol,
permite actualizarea notelor studentului respectiv şi calcularea mediei ponderate pentru acel student.
//=========================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>
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");
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>
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
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);
Exerciţiu
1. Modificaţi programul 2 astfel încât să se ceară continuarea căutării unui anumit student
pană când utilizatorul doreşte întreruperea acestui proces, iar când căutarea încetează să se
tipărească într-un fişier text datele corespunzătoare fiecărui student. De asemenea, adăugaţi
la structura datest încă un membru care să reprezinte media studentului.
2. Scrieţi un program care să caute într-o bază de date un articol după numele său, iar în cazul
în care este găsit să-i actualizeze cel puţin una dintre componentele sale.
// Calculul matricii distantelor dintre atomii unei molecule triatomice
//(molecula de apa)
#include <stdio.h>
#include <math.h>
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;
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;
}
Folosiţi pentru testare exemplul de fişier de intrare dat mai jos, corespunzător moleculei de apă.