Показать сообщение отдельно

  #3  
Старый 08.06.2009, 14:04
ss88
Участник форума
Регистрация: 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..
 
Ответить с цитированием