test
This commit is contained in:
commit
177d370b6f
12
Makefile
Normal file
12
Makefile
Normal 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
|
75
anketa.c
Normal file
75
anketa.c
Normal 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
95
anketa.h
Normal 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á má 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ý má 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 sú 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 už 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
|
16
main.c
Normal file
16
main.c
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user