A elaborat: Gușan Veronica Semnătura: __________
PROIECT DE PROGRAME NR. 6. STRUCTURI. FIŞIERE BINARE. FIŞIERE PROIECT
I. Formularea problemei
Tema: Grupa de studenți
De efectuat următoarele operaţii:
1. De organizat datele iniţiale în formă de structură.
2. Operaţii de actualizare:
a. De înscris datele iniţiale într-un fişier binar dintr-un fișier text (de la tastatură).
b. De adăugat date în fişier.
c. De afişat conţinutul fişierului iniţial / intermediar / final.
3. Operaţii de serviciu:
a. De aranjat datele din fişier în ordinea descrescătoare a mediilor.
b. De aranjat datele din fişier în ordinea alfabetică.
c. De aranjat datele din fişier alfabetic după medii.
4. Operaţii de listare – de afişat 3-5 liste tematice.
5. De organizat definirea funcţiilor în fişiere-sursă separate, utilizând fişierul proiect.
II. Indicaţii metodice
Se introduce iniţial un set de articole ( 5), apoi se adaugă date (în total, cel puţin 50 articole). Programul
trebuie să fie universal, adică trebuie să se obţină rezultatul pentru orice date iniţiale. De scris funcţii de
înscriere, adăugare, afişare, modificare, aranjare şi prelucrare a datelor din (în) fişierul binar.
III. Studiu preliminar
Fișierul text din care se va citi și prelucra informația este pregătit preventiv.
IV. Programul
[Link]
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
using namespace std;
void Creare();
void Afisare(char nume[], char mesaj[]);
void Adaugare();
void Aranjare_Med_Alpha();
void Aranjare_Media();
void Aranjare_Alpha();
void Lista1();
void Lista2(char gru[]);
void Lista3(char sir[]);
int main()
{
int opt;
char grupa[6], sir[31];
1
do
{
system("cls");
system("color F0");
cout << "-------- Proiect Nr.6 elaborat de Gusan Veronica! --------" << endl;
cout << "\nTema: Grupa de stdudenti" << endl;
cout << "\n 1. Transcriere fisier text -> fisier binar.";
cout << "\n 2. Afisarea fisierului.";
cout << "\n 3. Adaugarea datelor in fisier.";
cout << "\n 4. Aranjarea datelor in ordinea descrescatoare a mediilor .";
cout << "\n 5. Aranjarea datelor in ordine alfabetica.";
cout << "\n 6. Aranjarea datelor dupa 2 campuri.";
cout << "\n 7. Afisarea studentilor cu media mare de 9.";
cout << "\n 8. Afisarea studentilor dintr-o grupa.";
cout << "\n 9. Cautarea studentilor numele carora au acelasi inceput.";
cout << "\n 0. STOP";
cout << "\n \t Alege (de la 0 la 9) ->";
cin >> opt;
switch(opt)
{
case 1: Creare(); break;
case 2: Afisare("[Link]", "initiala"); break;
case 3:
cout << "\n Introdu datele unui nou student in formatul: \n ID Nume Prenume Data nasterii
Grupa Sem Notele\n\n";
Adaugare();
Afisare("[Link]", "modificata");
break;
case 4:
Aranjare_Media();
Afisare("[Link]", "ordonata ");
break;
case 5:
Aranjare_Alpha();
Afisare("[Link]", "ordonata ");
break;
case 6:
Aranjare_Med_Alpha();
Afisare("[Link]", "ordonata ");
break;
case 7: Lista1(); break;
case 8:
cout << "Ce grupa va intereseaza? ";
fflush(stdin);
gets(grupa);
Lista2(grupa);
break;
case 9:
cout << "Dati inceputul numelui: ";
fflush(stdin);
gets(sir);
Lista3(sir); break;
}
}
2
while (opt);
}
[Link]
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include "studentgv.h"
using namespace std;
void Aranjare_Media()
{
FILE *f, *g;
Student st[100], temp;
int nr = 0;
f = fopen("[Link]", "rb");
int i, j = 0, change;
//citesc din fisier in tabel
while(fread(&st[nr], sizeof(Student), 1, f) > 0)
nr++;
do
{
change = 0;
j++;
for(i = 0; i < nr-j; i++)
if(st[i].med < st[i+1].med)
{
temp = st[i];
st[i] = st[i+1];
st[i+1] = temp;
change = 1;
}
}
while(change);
fclose(f);
g = fopen("[Link]", "wb");
for(i = 0; i < nr; i++)
{
fwrite(&st[i], sizeof(Student), 1, g);
}
fclose(g);
cout << "\nDatele sunt aranjate dupa medie! \n";
getch();
}
void Aranjare_Alpha()
{
FILE *f, *g;
Student st[100], temp;
int nr = 0;
3
f = fopen("[Link]", "rb");
int i, j = 0, change;
while(fread(&st[nr], sizeof(Student), 1, f) > 0)
nr++;
do
{
change = 0;
j++;
for(i = 0; i < nr-j; i++)
if(stricmp(st[i].nume,st[i+1].nume) > 0)
{
temp = st[i];
st[i] = st[i+1];
st[i+1] = temp;
change = 1;
}
}
while(change);
fclose(f);
g = fopen("[Link]", "wb");
for(i = 0; i < nr; i++)
{
fwrite(&st[i], sizeof(Student), 1, g);
}
fclose(g);
cout << "\nDatele sunt aranjate in ordine alfabetica! \n";
getch();
}
void Aranjare_Med_Alpha()
{
char siri[36], siri1[36];
FILE *f, *g;
Student st[100], temp;
int nr = 0;
f = fopen("[Link]", "rb");
int i, j = 0, change;
//citesc din fisier in tabel
while(fread(&st[nr], sizeof(Student), 1, f) > 0)
nr++;
do
{
change = 0;
j++;
for(i = 0; i < nr-j; i++)
{
sprintf(siri, "%05.2f %-25.25s", 10-st[i].med, st[i].nume);
sprintf(siri1, "%05.2f %-25.25s", 10-st[i+1].med, st[i+1].nume);
if(stricmp(siri, siri1) > 0)
{
temp = st[i];
st[i] = st[i+1];
st[i+1] = temp;
change = 1;
4
}
}
}
while(change);
fclose(f);
g = fopen("[Link]", "wb");
for(i = 0; i < nr; i++)
{
fwrite(&st[i], sizeof(Student), 1, g);
}
fclose(g);
cout << "\nDatele sunt aranjate alfabetic dupa medii! \n";
getch();
}
[Link]
#include "studentgv.h"
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
using namespace std;
void Creare()
{
FILE *f, *g;
Student st;
int i;
char prenume[21];
g = fopen("[Link]", "r");
f = fopen("[Link]", "wb");
while(fscanf(g, "%d %s %s %d.%d.%d %s %d %d %d %d %d %d", &[Link], [Link], prenume,
&[Link].d, &[Link].m, &[Link].y,
[Link], &[Link], &[Link][0], &[Link][1], &[Link][2], &[Link][3], &[Link][4]) !=EOF)
{
strcat([Link], " ");
strcat([Link], prenume);
[Link] = 0;
for(i = 0; i < 5; i++)
[Link] += [Link][i];
[Link] /= 5;
fwrite(&st, sizeof(Student), 1, f);
}
printf("\n Transcrierea din fisierul text in cel binar a decurs OK!");
getch();
fclose(f);
fclose(g);
}
void Linia(int left, int line, int mij, int right)
{
int i;
5
printf("%c", left);
for(i = 1; i <= 4; i++) printf("%c", line); printf("%c", mij);
for(i = 1; i <= 5; i++) printf("%c", line); printf("%c", mij);
for(i = 1; i <= 27; i++) printf("%c", line); printf("%c", mij);
for(i = 1; i <= 14; i++) printf("%c", line); printf("%c", mij);
for(i = 1; i <= 7; i++) printf("%c", line); printf("%c", mij);
for(i = 1; i <= 5; i++) printf("%c", line); printf("%c", mij);
for(i = 1; i <= 7; i++) printf("%c", line); printf("%c", right);
}
void Afisare(char nume[], char mesaj[])
{
FILE *f;
Student st;
int nr = 0;
f = fopen(nume, "rb");
cout << "\n ---- Lista " << mesaj << " a studentilor ---- \n\n";
Linia(201, 205, 209, 187);
printf("\n%c Nr %c", 186, 179);
printf(" ID %c", 179);
printf(" %6c Nume, Prenume %6c", ' ', 179);
printf(" Data nasterii%c", 179);
printf(" Grupa %c", 179);
printf(" Sem%2c", 179);
printf(" Med %c\n", 186);
Linia(199, 196, 197, 182);
while(fread(&st, sizeof(Student), 1, f) > 0)
{
nr++;
printf("\n%c %2d %c %3d %c %-25.25s %c %02d.%02d.%4d %2c %5s %c %3d %c %5.2f %c",
186, nr, 179, [Link], 179, [Link], 179, [Link].d, [Link].m, [Link].y, 179, [Link], 179, [Link], 179,
[Link], 186);
}
printf("\n");
Linia(200, 205, 207, 188);
getch();
fclose(f);
}
void Adaugare()
{
FILE *f;
Student st;
int i;
char ch;
char prenume[21];
f = fopen("[Link]", "ab");
while( (ch = getch())!=13)
{
scanf("%d %s %s %d.%d.%d %s %d %d %d %d %d %d", &[Link], [Link], prenume, &[Link].d,
&[Link].m, &[Link].y,
[Link], &[Link], &[Link][0], &[Link][1], &[Link][2], &[Link][3], &[Link][4]);
strcat([Link], " ");
6
strcat([Link], prenume);
[Link] = 0;
for(i = 0; i < 5; i++)
[Link] += [Link][i];
[Link] /= 5;
fwrite(&st, sizeof(Student), 1, f);
}
printf("\n Adaugarea in fisierul binar a decurs OK!");
fclose(f);
}
[Link]
#include "studentgv.h"
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
void Linia(int left, int line, int mij, int right);
using namespace std;
void Lista1()
{
FILE *f;
Student st;
int nr = 0;
f = fopen("[Link]", "rb");
printf("\n ---- Lista studentilor cu media mare de 9 ---- \n\n");
Linia(201, 205, 209, 187);
printf("\n%c Nr %c", 186, 179);
printf(" ID %c", 179);
printf(" %6c Nume, Prenume %6c", ' ', 179);
printf(" Data nasterii%c", 179);
printf(" Grupa %c", 179);
printf(" Sem%2c", 179);
printf(" Med %c\n", 186);
Linia(199, 196, 197, 182);
while(fread(&st, sizeof(Student), 1, f) > 0)
{
if([Link] >= 9)
{
nr++;
printf("\n%c %2d %c %3d %c %-25.25s %c %02d.%02d.%4d %2c %5s %c %3d %c %5.2f %c",
186, nr, 179, [Link], 179, [Link], 179, [Link].d, [Link].m, [Link].y, 179, [Link], 179, [Link], 179,
[Link], 186);
}
}
printf("\n");
Linia(200, 205, 207, 188);
getch();
fclose(f);
7
}
void Lista2(char gru[])
{
FILE *f;
Student st;
int nr = 0;
f = fopen("[Link]", "rb");
printf("\n ---- Lista studentilor dintr-o grupa ---- \n\n");
Linia(201, 205, 209, 187);
printf("\n%c Nr %c", 186, 179);
printf(" ID %c", 179);
printf(" %6c Nume, Prenume %6c", ' ', 179);
printf(" Data nasterii%c", 179);
printf(" Grupa %c", 179);
printf(" Sem%2c", 179);
printf(" Med %c\n", 186);
Linia(199, 196, 197, 182);
while(fread(&st, sizeof(Student), 1, f) > 0)
{
if(!(stricmp(gru, [Link])))
{
nr++;
printf("\n%c %2d %c %3d %c %-25.25s %c %02d.%02d.%4d %2c %5s %c %3d %c %5.2f %c",
186, nr, 179, [Link], 179, [Link], 179, [Link].d, [Link].m, [Link].y, 179, [Link], 179, [Link], 179,
[Link], 186);
}
}
printf("\n");
Linia(200, 205, 207, 188);
getch();
fclose(f);
}
void Lista3(char sir[])
{
FILE *f;
Student st;
int nr = 0;
f = fopen("[Link]", "rb");
printf("\n ---- Lista studentilor numele carora se incepe cu litera indicata---- \n\n");
Linia(201, 205, 209, 187);
printf("\n%c Nr %c", 186, 179);
printf(" ID %c", 179);
printf(" %6c Nume, Prenume %6c", ' ', 179);
printf(" Data nasterii%c", 179);
printf(" Grupa %c", 179);
printf(" Sem%2c", 179);
printf(" Med %c\n", 186);
Linia(199, 196, 197, 182);
while(fread(&st, sizeof(Student), 1, f) > 0)
{
if(!strnicmp(sir, [Link], strlen(sir)))
{
8
nr++;
printf("\n%c %2d %c %3d %c %-25.25s %c %02d.%02d.%4d %2c %5s %c %3d %c %5.2f %c",
186, nr, 179, [Link], 179, [Link], 179, [Link].d, [Link].m, [Link].y, 179, [Link], 179, [Link], 179,
[Link], 186);
}
}
printf("\n");
Linia(200, 205, 207, 188);
getch();
fclose(f);
}
studentgv.h
#ifndef STUDENTGV_H_INCLUDED
#define STUDENTGV_H_INCLUDED
struct Data
{
int d;
int m;
int y;
};
struct Student
{
int id;
char nume[31];
Data dn;
char gr[6];
int sem;
int nota[5];
float med;
};
#endif // STUDENTGV_H_INCLUDED
V. Rezultate
1. Înscrierea datelor iniţiale într-un fişier binar dintr-un fișier text (de la tastatură).
2. Afișarea tabelului de studenți.
9
3. Adăugarea datelor în fișier.
4. Aranjarea datelor din fișier după medie.
5. Aranjarea datelor din fișier după medie.
6. Aranjarea datelor din fișier alfabetic după medie.
10
7. Afișarea studenților cu media mare de 9.
8. Afișarea studenților dintr-o anumită grupă.
9. Afișarea studenților numele cărora se începe cu aceeași/ aceleași literă/ litere.
V. Concluzie
La aranjarea studenților alfabetic după medie a trebuit să rezolv cumva problema că programul aranjează
studenții după medie indeferent de nume. Pentru a rezolva această problemă a trebuit să “pun pe acelaș cântar”
toți studenții cu aceeași medie astfel încât programul, dacă găsește stundenți cu medii egale, să-i aranjeze după
nume. Pentru aceasta, am pus ca programul să nu compare pur și simplu mediile a 2 studenți vecini, ci să
compare diferențele “10 – media studenților vecini”. Astfel, dacă au fost găsiți, spre exemplu, 3 studenți cu
aceeași medie, programul nu va trece la următorii, ci îi va aranja mai întâi pe aceștia conform numelor lor.
11