Sunteți pe pagina 1din 7

Program exemplu: se scrie un fişier binar cu coordonatele a două puncte.

Se citeşte apoi fişierul binar


şi se calculează distanţa dintre cele două puncte şi aria dreptunghiului definit de acestea.

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

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

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 Programul 2

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


Temă
Modificaţi programul de mai sus astfel încât datele corespunzătoare (numărul atomic şi
coordonatele atomilor să fie citite dintr-un fişier text, iar numărul de atomi să fie determinat din
numărul de linii din fişierul de input; fiecare linie va conţine următoarele date: Z x y z
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ă.

S-ar putea să vă placă și