|
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
С нами:
9185589
Репутация:
128
|
|
Сообщение от Mosvit
Помогите решить такую задачу на языке Си:
Реал изовать базу данн ых “служащие” в виде файла, содержащего имя, фамилию и отчество служащего, а также его рейтинг. Уметь: 1) вводить данные; 2)удалять данные; 3)изменять данные; 4) сортировать данные по любому столбцу; 5) выводить данные на экран.
В Паскале можно было бы с помощью записей сделать, а тут не знаю как...
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum {EMPLOYEE_COUNT=100, NAME_LEN_MAX=100,LNAME_LEN_MAX=100};
typedef struct {
char name[NAME_LEN_MAX];
char lname[LNAME_LEN_MAX];
int rate;
} employee_t;
int get_empl_from_db(const char * file_name, employee_t * list);
void print_empl_list(employee_t * list, size_t count);
static int cmpbyname(const void * p1, const void * p2);
static int cmpbylname(const void * p1, const void * p2);
static int cmpbyrate(const void * p1, const void * p2);
void sort(employee_t * list,size_t count, int (*cmpitems)(const void * p1, const void * p2));
void save_db(const char * file_name, employee_t * list, size_t count);
void add(employee_t new_empl, employee_t * list, size_t count);
void delete(size_t del_index, employee_t * list, size_t &count);
int main(int argc, char** argv){
size_t empl_count=0;
employee_t * empl_list = calloc(EMPLOYEE_COUNT,sizeof(employee_t));
empl_count = get_empl_from_db("db.txt",empl_list);
if(empl_count==0){
fprintf(stderr,"Empty database or error reading\n");
exit(EXIT_FAILURE);
}
printf("%d\n",empl_count);
print_empl_list(empl_list, empl_count);
sort(empl_list,empl_count,cmpbyrate);
print_empl_list(empl_list, empl_count);
exit(EXIT_SUCCESS);
}
int get_empl_from_db(const char * file_name, employee_t * list) {
FILE * db_file = fopen(file_name,"rt");
if(db_file == NULL) return 0;
int i;
for(i=0; !feof(db_file) && i < EMPLOYEE_COUNT; i++)
if(fscanf(db_file,"%s %s %d",list[i].name,list[i].lname,&list[i].rate)!=3)
break;
fclose(db_file);
return i;
}
void save_db(const char * file_name, employee_t * list, size_t count) {
FILE * db_file = fopen(file_name,"wt");
if(db_file == NULL) return;
for(int i=0; i < count; i++)
fprintf(db_file,"%s %s %d\n",list[i].name,list[i].lname,list[i].rate);
fclose(db_file);
}
void add(employee_t new_empl, employee_t * list, size_t count) {
if(count == EMPLOYEE_COUNT)
return;
list[count]=new_empl;
}
void delete(size_t del_index, employee_t * list, size_t &count) {
if(del_index >= count)
return;
else
for(int i = del_index; i<*count-1; i++)
list[i]=list[i+1];
--(*count);
}
void print_empl_list(employee_t * list, size_t count) {
for(int i = 0; i < count; i++)
printf("%d %s %s %d\n",i+1,list[i].name,list[i].lname,list[i].rate);
}
static int cmpbyname(const void * p1, const void * p2){
return strcmp(((employee_t *)p1)->name, ((employee_t *)p2)->name);
}
static int cmpbylname(const void * p1, const void * p2){
return strcmp(((employee_t *)p1)->lname, ((employee_t *)p2)->lname);
}
static int cmpbyrate(const void * p1, const void * p2){
return (((employee_t *)p1)->rate == ((employee_t *)p2)->rate)?0
:((((employee_t *)p1)->rate < ((employee_t *)p2)->rate)?-1:1);
}
/* sorting array with qsort() function and refreshing*/
void sort(employee_t * list,size_t count, int (*cmpitems)(const void * p1, const void * p2)){
qsort(list, count, sizeof(employee_t), cmpitems);
}
формат входного файла
Код:
имя фамилия рейтинг
имя фамилия рейтинг
Особо не форматировал код, чтение БД, сохранение, сортировка по любому полю, удаление и добавление есть. Интерфейс делай какой хочешь. Проблемы переполнения буфферов количества работников и имени/фамилии я не рассматривал, т.к. это не приоритетные вопросы в контексте текущей задачи.
ПЫ.СЫ. код нужно компилировать в стандарте языка С от 99-го года (с99). Лучше всего для этого подходит gcc (ему в make-файле или из консоли надо указать -std=c99). Есть еще варианты типа Пеллеса и ЛЦЦ, но лучше этого не делать. BC и TC, скорее всего, выдадут несколько ошибок, потому что они нифига не соблюдали стандарт никогда да и разработка этих сред закончилась много ранее появления 99-го стандарта языка С.
ПЫ.ПЫ.СЫ. Если сделаешь что-то на этой основе. то разберись, что такое функция qsort(). Подозреваю, что это лаба на ранних курсах института, прикольно будет если напугаешь препода знанием таких методов.
Последний раз редактировалось ss88; 08.06.2009 в 21:19..
|