PROGRAMAVIMAS C++ KURSINIS DARBAS MOKYKLOS DUOMENŲ BAZĖS ADMINISTRAVIMAS

Užduotis:

Sugalvojau tokią užduotį: mokykloje kaupiama informacija – mokinio pavardė, vardas, dalykas, klasė ir vidurkis. Programa turi veikti taip, kad būtų galimybė atlikti duomenų peržiūrą, paiešką pagal pavardę, būtų galima redaguoti saugomus ir įvestus duomenis, būtų galima pateikti nepažangių mokinių sąrašą, kurių vidurkis būtų mažesnis už 5, taip pat programa turi leisti papildyti saugomus duomenis naujais duomenimis, turi turėti galimybę pašalinti pasirinktą mokinį iš duomenų bazės, bei atlikti duomenų rikiavimą pagal pavardę.

Užduoties analizė:

Susigalvotai užduočiai susidariau tokią analizę, kurioje mąsčiau, kokius kintamuosius, ciklus, funkcijas naudosiu. Iš užduoties jau aiškiai matyti, kad lengviausia ir patogiausia bus naudoti klases. Tad sudarysiu vieną klase kurią pavadinsiu Mokinys. Šią klasę aprašys tokie kintamieji: pavardė, vardas, dalykas, klase, vidurkis. Visi šie kintamieji bus public tipo, kad  juos mes galėtumėme naudoti už klasės ribų. Pavardė, vardas, dalykas bus char tipo kintamieji, nes juos sudarys simbolių kratinys. Kintamasis klasė bus int tipo, nes tai skaičius, o vidurkis float tipo, nes vidurki imsime su kableliu. Duomenų peržiūrai, redagavimui, trynimui ir kitiems veiksmams sudarysime funkcijas, kurias inkapsuliuosime  į klasę Mokinys. Funkcijos bus void tipo jei mes neperduosime jokios reikšmės ir int tipo jei mums reiks perduoti reikšmes. Duomenų tvarkymui naudosime dinaminius masyvus.

Užduoties išsikelti uždaviniai:

Prieš pradedant realizuoti užduotį sau išsikėliau tokius klausimus:
•    Kelias klases tikslinga naudoti.
•    Klasės kintamųjų apsirašymas
•    Kelias funkcijas tikslinga ir patogiausia naudoti
•    Ką kiekviena funkcija atliks
•    Funkcijos kintamųjų apsirašymas, įvedimas.
•    Funkcijų parinkimas ir pritaikymas veiksmams atlikti.
•    Kaip nuskaityti duomenis nuo struktūrizuoto failo
•    Kaip suformuoti išvedimo masyvą
•    Kiek reikšmių jame spausdinti.
•    Kaip duomenis ir visos programos realizavimą pateikti vartotojui
•    Kaip atlikti duomenų paiešką pagal pavardę
•    Kaip redaguoti duomenis, kad naujus patalpintų i senų duomenų vietą
•    Kaip rasti visus mokinius kurių vidurkis <5
•    Kaip papildyti duomenų masyvą
•    Kaip ištrinti reikiamus duomenis
•    Kaip atlikti rikiavimą
•    Kaip rasti elementu kieki

Algoritmas:
1.    Bibliotekų aprašai.
2.    Header failas su klasės ir funkcijų deklaracijomis
3.    f-ja duomenų dydžiui nustatyti
4.    f-ja duomenų nuskaitymui iš failo.
5.    f-ja duomenų parodymui ekrane.
6.    f-ja duomenų redagavimui
7.    f-ja nepažangiems mokiniams rasti
8.    f-ja naujų duomenų iterpimui
9.    f-ja duomenu trynimui
10.    f-ja duomenu paieškai pagal pavardę
11.    f-ja duomenų rikiavimui pagal pavardę
12.    f-ja parodanti meniu – galimu veiksmų ir komandų sarašą
13.    pagrindinė f-ja
Testavimo rezultatai:
Duomenų peržiūra:

Duomenų paieška:
Duomenų redagavimas:

Nepažangių mokinių radimas:

Duomenų papildymas:

Duomenų trynimas:

Duomenų rikiavimas:

Programos kodas:

Klase.h

//—————————————————————————

#pragma hdrstop

//—————————————————————————

#pragma argsused
const char CDuom[]=”Duomenys.txt”;
class Mokinys{
public:  char dalykas[15];
char vardas[10];
char pavarde[15];
int klase;
float vidurkis;
int Dydis();
void Duomenys();
void Rasti(Mokinys*);
void Redaguoti(Mokinys*);
void Spausdinti(Mokinys*);
void Nepazangus();
void Iterpti();
void Trinti(Mokinys*);
void Rikiuoti(Mokinys*);
void Meniu();
};
Mokinys *A;
int N;
//—————————————————————————

Unit1.cpp

//========================Bibliotekos=============================
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fstream.h>
#include <Klase.h>

//===================Funkcija nustatanti duomenu failo dydi==============
int Mokinys :: Dydis(){

FILE *FD; char *R;
R = new char[80];
FD = fopen(CDuom, “r”);
if(FD == NULL){
cout<<“Duomenu failas nesurastas”;
}
N = 0;
while(!feof(FD)){
fgets(R, 80, FD);
N++;
}
fclose(FD);
delete R;
return N;
}

//==================Funkcija nuskaitanti ir isvedanti failo duomenis==========
void Mokinys :: Duomenys()
{
int N = Dydis();
A = new Mokinys[N];
FILE *FD;
FD = fopen(CDuom, “r”);
if (A == NULL)
{
cout<<“Duomenims trukstas atminties”;
}

int i = 0;
while(!feof(FD))
{
fscanf(FD, “%15s%10s%15s%i%f”, A[i].pavarde, A[i].vardas, A[i].dalykas, &A[i].klase, &A[i].vidurkis);
i++;
}

fclose(FD);
}

//===================Funkcija leidzianti redaguoti duomenis===============
void Mokinys :: Redaguoti(Mokinys *A){

char dalykas1[15];                                                 //kintamasis-naujas dalykas
char vardas1[10];                                                  //———–naujas vardas
char pavarde1[15];                                                //———–nauja pavarde
int klase1;                                                             //———–nauja klase
float vidurkis1;                                                      //———–naujas vidirkis
cout<<“Iveskite pavarde, pagal kuria norite redaguoti: \n”;
cin >> pavarde1;                                                  //norimos redaguoti pavardes ivedimas
for(int i=0; i<N; i++) {                                  //ciklas einantis per duomenis
if(strcmp(A[i].pavarde,pavarde1)==0) {                               //jei rasta tokia pavarde
cout << “Senas vardas: “<<A[i].vardas<<” Iveskite nauja varda: “;
cin >> vardas1;                                                      //naujo vardo ivedimas
strcpy(A[i].vardas,vardas1);                           //naujo varda kopijavimas i senojo vieta
cout << “Sena pavarde: “<<A[i].pavarde<<” Iveskite nauja pavarde: “;
cin>>pavarde1;                                                    //naujos pavardes ivedimas
strcpy(A[i].pavarde, pavarde1);                           //naujos pavardes kopijavimas
cout << “Senas dalykas: “<<A[i].dalykas<<” Iveskite nauja dalyka: “;
cin>>dalykas1;                                                //naujo dalyko ivedimas
strcpy(A[i].dalykas, dalykas1);                        //naujo dalyko kopijavimas
cout<<“Sena klase: “<<A[i].klase<<” Iveskite nauja klase: “;
cin>>klase1;                                                  //naujos klases ivedimas
A[i].klase=klase1;                                      //sena klase keiciama i nauja
cout<<“Senas vidurkis: “<<A[i].vidurkis<<” Iveskite nauja vidurki: “;
cin>>vidurkis1;                                              //naujo vidurkio iveimas
A[i].vidurkis=vidurkis1;                               //senas vidurkis keiciamas i nauja
i=N;
cout<<“Atnaujinti duomenys: “<<endl;
}
}
}

//===================Funkcija spausdinanti duomenis – rezultata===========
void Mokinys :: Spausdinti(Mokinys *A){
cout<<“+—————————————————————+”<<endl;
cout<<“|  Pavarde   |   Vardas    |      Dalykas    | Klase | Vidurkis |”<<endl;
cout<<“+—————————————————————+”<<endl;
for(int i=0; i<N; i++) {                                                      //per visus elementus
cout<<“|”<<A[i].pavarde <<”   \t”<<A[i].vardas<<”    \t”<<A[i].dalykas<<”    \t”<<A[i].klase<<”    \t”<< A[i].vidurkis<<”    \t|”<<endl;
}
cout<<“+—————————————————————+”<<endl;
}

//===================Funkcija randati tuos kuriu vidurkis <5 ==========
void Mokinys :: Nepazangus(){
float vidurkis;
cout<<“+—————————————————————+”<<endl;
cout<<“|  Pavarde   |   Vardas    |      Dalykas    | Klase | Vidurkis |”<<endl;
cout<<“+—————————————————————+”<<endl;
for(int i=0; i<N; i++) {                              //per visus elementus
if(A[i].vidurkis<5)                                      //jei  vidurkis maziau uz 5
cout<<“|”<<A[i].pavarde <<”   \t”<<A[i].vardas<<”    \t”<<A[i].dalykas<<”    \t”<<A[i].klase<<”    \t”<< A[i].vidurkis<<”    \t|”<<endl;
}
cout<<“+—————————————————————+”<<endl;
}

//==================Funkcija leidzianti papildyti duomenis=============
void Mokinys :: Iterpti(){

cout << “Iveskite varda: “;
cin >> vardas;
cout << “Iveskite pavarde: “;
cin >> pavarde;
cout << “Iveskite dalyka: “;
cin >> dalykas;
cout << “Iveskite klase: “;
cin >> klase;
cout << “Iveskite vidurki:”;
cin >> vidurkis;

strcpy(A[N].vardas, vardas);                                       //papildo masyva naujais irasais
strcpy(A[N].pavarde, pavarde);
strcpy(A[N].dalykas, dalykas);
A[N].klase=klase;
A[N].vidurkis=vidurkis;
N++;

}

//========================Funkcija leidzianti trinti duomenis==========
void Mokinys :: Trinti(Mokinys *A)
{
char kas[20];                                                   //kintamasis-pavarde kuria norime istrinti
cout<<“Iveskite pavarde, kuria norite trinti”<<endl;
cin>>kas;
for(int k=0; k<N; k++) {
if(!strcmp(A[k].pavarde,kas)){         //tikrina per masyva, jei pavarde sutampa su yvestu
for(int i=k; i<N; i++)
A[i]=A[i+1];
N–;                                                   //duomenu dydzio sumazinimas
}
}
}

//===========================Funkcija duomenu paieskai===============
void Mokinys :: Rasti(Mokinys *A){
char s[15];
cout << “Iveskite pavarde kuria norite rasti:\n”;
cin >> s;                                     // ivedamas paz nr
cout<<“+—————————————————————+”<<endl;
cout<<“|  Pavarde   |   Vardas    |      Dalykas    | Klase | Vidurkis |”<<endl;
cout<<“+—————————————————————+”<<endl;
int i;
for(i=0; i<N; i++) {
if(strcmp(A[i].pavarde,s)==0)                 // jei sutampa
{
cout<<“|”<<A[i].pavarde <<”   \t”<<A[i].vardas<<”    \t”<<A[i].dalykas<<”    \t”<<A[i].klase<<”    \t”<< A[i].vidurkis<<”    \t|”<<endl;;
}
}
printf(“—————————————————————–\n”);
}

//=======================Funkcija atliekanti rikiavima=============
void Mokinys :: Rikiuoti(Mokinys *A)
{
Mokinys C;
for(int i=0; i<N; i++){
for(int j=i+1; j<N; j++){
if (strcmp(A[j].pavarde,A[i].pavarde)<0)
{ C=A[i]; A[i]=A[j]; A[j]=C;}
}
}
}

//==================================Meniu=======================
void Mokinys :: Meniu()
{
cout<<“1. Duomenu perziura\n”;
cout<<“2. Duomenu paieska\n”;
cout<<“3. Duomenu redagavimas\n”;
cout<<“4. Nepazangiausi\n”;
cout<<“5. Duomenu papildymas\n”;
cout<<“6. Duomenu salinimas\n”;
cout<<“7. Rikiuoti\n”;
cout<<“8. Baigti darba\n”;
}

//========================Pagrindine programa=====================
main(){
Mokinys B;
int s, n;                                                        //kintamieji komandos numeriui ir ciklui
cout << “MENIU:\n”;
B.Meniu();                                                //Meniu-komandu isvedimas ekrane
B.Duomenys();
cout<<“Jusu veiksmas: “;
cin >> s;                                                  //pasirinktos komandos ivedimas
for(int i=0; i<n; i++){                             //begalinis ciklas meniu komandoms ivesti
switch(s){                                                 // veiksmu pasirinkimas

case 1:                                                   //funkcija duomenu parodymui
B.Duomenys();
B.Spausdinti(A);
cout<<“Jusu veiksmas: “;
cin >> s;
break;

case 2:
B.Rasti(A);                                         //funkcija atliekanti paieska
cout<<“Jusu veiksmas: “;
cin >> s;
break;

case 3:
B.Redaguoti(A);                                   //funkcija atliekanti redagavima
B.Spausdinti(A);                                 //funkcija atliekanti rezultatu spausdinima
cout<<“Jusu veiksmas: “;
cin >> s;
break;

case 4:
B.Nepazangus();                         //funkcija randanti mokinius kuriu vidurkis <5
cout<<“Jusu veiksmas: “;
cin >> s;
break;

case 5:                                      //funkcija atliekanti iterpima-papildyma
B.Iterpti();                        //funkcija atliekanti rezultatu spausdinima
B.Spausdinti(A);
cout<<“Jusu veiksmas: “;
cin >> s;
break;

case 6:
B.Trinti(A);                                    //funcija atliekanti trynima
B.Spausdinti(A);
cout<<“Jusu veiksmas: “;
cin >> s;
break;

case 7:
B.Rikiuoti(A);
B.Spausdinti(A);
cout<<“Jusu veiksmas: “;
cin >> s;
break;
case 8:                                          //programos nutraukimas ir lango uzdarymas
EXIT_SUCCESS;
return 0;
}
}
}