This commit is contained in:
Michaela Šaková 2019-03-23 19:14:52 +01:00
commit 177d370b6f
7 changed files with 198 additions and 0 deletions

12
Makefile Normal file
View File

@ -0,0 +1,12 @@
CFLAGS= -c -g -Wall -std=c99
all: anketa
%.o: %.c
gcc $(CFLAGS) $< -o $@
clean:
rm *.o anketa
anketa: anketa.o main.o
gcc anketa.o main.o -o anketa

BIN
anketa Executable file

Binary file not shown.

75
anketa.c Normal file
View File

@ -0,0 +1,75 @@
#include "anketa.h"
#include <stdlib.h>
#include <string.h>
#include <assert.h>
int count_students(struct student* students){
int x=0;
for(int i=0; i<MAXSTUDENTS; i++){
if(students[i].name!=NULL){
x++;
}
}
return x;
}
int search(struct student* students,const char* name){
int index=-1;
for(int i=0; i<MAXSTUDENTS; i++){
if(strcmp(students[i].name,name)==0){
index=i;
break;
}
}
return index;
}
int add_student(struct student* students, const char* name, int votes){
int index=-1, x=0;
for(int i=0; i<MAXSTUDENTS; i++){
if(strcmp(students[i].name,name)==0){
index=i;
break;
}
if(students[i].name!=NULL){
x++;
}
}
if(index!=-1){
students[index].votes+=votes;
return index;
}
if(x<(MAXSTUDENTS-1)){
strcpy(students[x].name,name);
students[x].votes=votes;
return x;
}
return -1;
}
int compare(const void* s1,const void* s2){
struct student* stud1=(struct student*)s1;
struct student* stud2=(struct student*)s2;
return stud1->votes==stud2->votes?0:stud1->votes<stud2->votes?1:-1;
}
void sort_students(struct student* students){
qsort(students, count_students(students), sizeof(struct student), compare);
}
void print_students(struct student* students){
for(int i=0;i<MAXSTUDENTS;i++){
if(students[i].name!=NULL){
printf("%s\n %d\n", students[i].name, students[i].votes);
}
}
}
void read_students(FILE* file,struct student* students){
}

95
anketa.h Normal file
View File

@ -0,0 +1,95 @@
#ifndef ANKETA_H
#define ANKETA_H
/**
* Veľkosť buffra pre načítanie reťazcov
* a maximálna veľkosť mena.
*/
#define BUFSIZE 100
/**
* Maximálna veľkosť databázy
*/
#define MAXSTUDENTS 50
#include <stdio.h>
/**
* Jedna položka v databáze
* Neplatná položka je taká ktorá počet hlasov 0 alebo meno je prázdny reťazec.
*/
struct student {
// Meno študenta
char name[BUFSIZE];
// Počet získaných hlasov
int votes;
};
/**
* Spočítanie platných položiek v databáze.
* Databáza je ukončená prvou neplatnou položkou alebo koncom poľa.
* Maximálny počet položiek je MAXSTUDENTS.
*
* @return nezáporný počet platných položiek.
*/
int count_students(struct student* students);
/**
* Vyhľadanie záznamu s daným menom v databáze.
* Databáza je ukončená prvou neplatnou položkou alebo koncom poľa.
*
* @param pole záznamov
* @param meno na vyhľadanie
* @return Index prvého záznamu, ktorý dané meno. -1 ak sa v poli taký záznam nenachádza.
*/
int search(struct student* students,const char* name);
/**
* Porovnanie dvoch položiek v databáze podľa počtu hlasov.
*
* @return Nula v prápade, že položky rovnaké. Kladná hodnota v prípade, že počet hlasov prvej položky je menší ako počet hlasov druhej položky. Záporná hodnota inak.
*/
int compare(const void* s1,const void* s2);
/**
* Pridanie novej informácie do databázy.
*
* Ak sa meno v poli nachádza, funkcia zvýši počet hlasov pre danú položku.
* Ak sa meno v databáze nenachádza, funkcia vytvorí nový záznam na prvom voľnom mieste od začiatku.
*
* @param pole záznamov
* @param meno na pridanie
* @param početnosť na pridanie
* @return index, kde bola položka pridaná. -1 ak nebolo v poli dosť miesta.
*/
int add_student(struct student* students, const char* name, int votes);
/**
* Zotriedenie všetkých záznamov podľa počtu hlasov.
* Databáza je ukončená prvou neplatnou položkou alebo koncom poľa.
*
* @param pole na zotriedenie.
*/
void sort_students(struct student* students);
/**
* Výpis všetkých záznamov na štandardný výstup.
* Databáza je ukončená prvou neplatnou položkou alebo koncom poľa.
*
* @param pole na výpis
*/
void print_students(struct student* students);
/**
* Načítanie záznamov z otvoreného súboru do poľa.
*
* Funkcia načíta maximálne MAXSTUDENTS záznamov, potom skončí.
* Načítanie skončí aj v prípade načítania neplatnej položky.
* Jedna položka v textovom súbore je vo formáte:
*
* meno
* početnosť
*
* @param otvorený súbor. Otvorený súbor je rovný stdin v prípade načítania zo štandardného vstupu.
* @param pole kam sa uložia výsledky.
*/
void read_students(FILE* file,struct student* students);
#endif

BIN
anketa.o Normal file

Binary file not shown.

16
main.c Normal file
View File

@ -0,0 +1,16 @@
#include "anketa.h"
#include <string.h>
int main(){
struct student students[MAXSTUDENTS];
memset(students,0,sizeof(struct student)*(MAXSTUDENTS));
read_students(stdin,students);
int sz = count_students(students);
if (sz <= 0){
// Nenacitalo sa nic
return 0;
}
sort_students(students);
print_students(students);
return 0;
}

BIN
main.o Normal file

Binary file not shown.