Students database

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Category: Programs in C, C++

Program: Student.c
File exe: Student.exe
need: Student.dat

Students database. Write/read to file. Sorted by name, class. Programs write at language C.
{ STUDENT.C                 Copyright (c) TrSek alias Zdeno Sekerak }
{ Databaza studentov, zaradeni, vyradenie, triedenie                }
{ Vsetko sa uklada do suboru pre neskorsie pouzitie                 }
{                                                                   }
{ Datum:28.05.96                               http://www.trsek.com }
 
#include "stdio.h"
#include "conio.h"
#include "alloc.h"
#include "string.h"
#include "stdlib.h"
 
#define SUBOR "student.dat"
#define MAX_STR 512
 
typedef struct stud
{
  char* meno;
  char* priez;
  int   rocnik;
  char* odbor;
  long  evcis;
 
  void* prev;
  void* next;
} student;
 
 
// zozbrazi hlavnu stranku
void Hlavna(int poc)
{
  clrscr();
  printf("Databaza studentov (pocet=%d)\n", poc);
  printf("--------------------------------\n");
  printf(" 1. Zadanie noveho studenta\n");
  printf(" 2. Oprava udajov studenta\n");
  printf(" 3. Vymazanie studenta\n");
  printf(" 4. Zotriedenie podla priezviska\n");
  printf(" 5. Prehlad podla rocnikov\n");
  printf(" 0. Koniec\n");
  printf("--------------------------------\n");
  printf("Zadaj volbu (0..5):");
}
 
 
// opyta sa na cislo rocnika
int OpytajRocnik(void)
{
int roc;
 
  printf("\nZadaj ktory rocnik chces vypisat. Rocnik:");
  scanf("%d", &roc);
  return roc;
}
 
 
// opyta sa a pocka na stlacenie klavesu
void OtazkaKoniec(void)
{
  printf("\nOperacia ukoncena. Stlac enter.");
  getchar();
  getch();
}
 
 
// vypise vsetkych z rocnika
void VypisRocnik(student* st, int rocnik)
{
  printf("\nMeno a Priezvisko, rocnik, odbor, evcis\n");
  printf("---------------------------------------\n");
 
  while(st != NULL)
  {
    if( st->rocnik == rocnik )
    {
      printf("%s %s, %d, %s, %d\n", st->meno, st->priez, st->rocnik,
	 st->odbor, st->evcis );
    }
    // dalsi zaznam
    st = st->next;
  }
}
 
 
// vyzve na zadanie jednoho studenta
void ZadajZaznam(student* st)
{
  printf("\n\n");
  printf("Zadaj meno      :");
  mstrcpy( &(st->meno), mscanf());
 
  printf("Zadaj priezvisko:");
  mstrcpy( &(st->priez), mscanf());
 
  printf("Zadaj rocnik    :");
  st->rocnik = atoi(mscanf());
 
  printf("Zadaj obdor     :");
  mstrcpy( &(st->odbor), mscanf());
 
  printf("Zadaj evidencne cislo:");
  st->evcis = atol(mscanf());
}
 
 
// ukaze zaznam studenta
void UkazZaznam(student* st)
{
  printf("\n\n");
  printf("Meno      :%s\n", st->meno );
  printf("Priezvisko:%s\n", st->priez );
  printf("Rocnik    :%d\n", st->rocnik );
  printf("Obdor     :%s\n", st->odbor );
  printf("Evidencne cislo:%ld\n", st->evcis );
}
 
 
// opyta sa na evidnce cislo a opravy zaznam
void OpravZaznam(student* st)
{
long evcis;
 
  printf("\n");
  printf("Zadaj evidence cislo studenta:");
  evcis = atol(mscanf());
 
  // budeme hladat cislo
  while( st != NULL )
  {
    if( st->evcis == evcis )
    {
      UkazZaznam(st);
      ZadajZaznam(st);
      return;
    }
 
    // dalsi zaznam
    st = st->next;
  }
 
  // nenasiel
  printf("Lutujem ale takyto zaznam neexistuje.\n");
}
 
 
// zmaze celu databazu a uvolni pamat
void ZmazVsetko(student* start)
{
student* pom;
 
  while(start != NULL)
  {
    pom = start->next;
 
    // uvolnime string
    free(start->meno);
    free(start->priez);
    free(start->odbor);
 
    // uvolnime aj strukturu
    free(start);
    start = pom;
  }
}
 
 
// zisti celkovy pocet zaznamov
int ZistiPocet(student* st)
{
int poc=0;
 
  while(st != NULL)
  {
    poc++;
    st = st->next;
  }
 
  return poc;
}
 
 
// precita zo suboru
student* PrecitajDatabazu(student** start)
{
FILE* f;
student* st=*start;
 
  f=fopen( SUBOR, "r");
 
  // subor zatial neexistuje
  if(f==NULL)
     return *start;
 
  // postupne bude vycitavat
  while(!feof(f))
  {
    st = PridajZaznam(st);
 
    // ak je to prvy zaznam
    if( *start==NULL )
	*start = st;
 
  }
 
  // uzavrieme
  fclose(f);
  return st;
}
 
 
// ulozi do suboru
void UlozDatabazu(student* st)
{
FILE* f;
 
  f=fopen( SUBOR, "w");
 
  // subor sa neda otvorit
  if(f==NULL)
  {
     printf("Chyba zapisu na disk. Disk je pravdepodobne chraneny proti zapisu.");
     return;
  }
 
  // vsetky zapiseme
  while(st != NULL)
  {
    st = st->prev;
  }
 
  // uzavrieme
  fclose(f);
}
 
 
// hlavny program
void main()
{
student* start=NULL;
char ch;
int poc;
 
 
  // vycita databazu zo suboru student.dat
  start = PrecitajDatabazu(&start);
  poc = ZistiPocet(start);
 
  // opyta sa co ma robit
  do
  {
    Hlavna(poc);
    ch=getche();
 
    switch(ch)
    {
      case '1': start = PridajZaznam(start);
		ZadajZaznam(start);
		poc++;
		break;
 
      case '2': OpravZaznam(start);
		OtazkaKoniec();
		break;
 
      case '3': VymazZaznam(&start,&poc);
		break;
 
      case '4': Usporiadaj(&start);
		OtazkaKoniec();
		break;
 
      case '5': VypisRocnik(start, OpytajRocnik());
		OtazkaKoniec();
		break;
    }
  }while(ch != '0');
 
  // vycisti pamat
  UlozDatabazu(start);
  ZmazVsetko(start);
}