课程设计

所谓的课程设计。。很囧。

 

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define W struct Worker

//职工结构体
struct Worker {
    int id; //职工号
    char name[20];  //职工姓名
    char sex;   //性别,M或者F
    int age;    //年龄
    char workTime[12];  //工作开始日期。格式:YYYY-MM-HH ,如2010-06-06
    char degree[10];    //学历
    char title[10]; //职位
    char partyTime[12]; //入党时间
    char isMarried; //婚否,Y或N
    char nativePlace[20];   //籍贯
    char address[50];   //通讯地址
    char tel[15];   //电话号码
    char department[20];    //所在部门
    char email[30]; //邮箱地址
    char selfIntro[150];    //个人简介

	struct Worker *next;	//下个节点地址
};

//全局变量
/*char *adminId;
char *adminPwd;*/

W* workers = NULL; //整个职工列表头结点


//函数说明
void showMainMenu();
char* loadProperty(FILE*);
void login();
W* create();
W* input(W*);
void output(W*);
W* add(W*,W*);
W* search();
W* searchById(W*,int);
W* searchByName(W*,char*);
W* searchByDep(W*,char*);
W* searchByNP(W*,char*);
W* del(W*);
W* remove(W*,int);
void modify();
W* edit(W*,int);
W* sortByAgeHelper(W*,W*);
W* sortByAge(W*);
W* sortById(W*);
char* getProperty(char*);
void init();
void sort();
void insert();
void doOutput();
void doDel();
void printing();
void exitAndSave();


//主函数
void main() {
	login();
	return;
}


//显示主菜单函数
void showMainMenu() {
	int select;
	printf("==============主菜单===============");
	printf("\n1.浏览全部");
	printf("\n2.录入");
	printf("\n3.编辑");
	printf("\n4.删除");
	printf("\n5.排序");
	printf("\n6.查找");
	printf("\n7.打印");
	printf("\n8.系统设置");
	printf("\n9.保存并退出");
	printf("\n0.退出\n\n");
	printf("请选择:");
	
	scanf("%d",&select);

	switch(select) {
	case 1:
		doOutput();
		break;
	case 2:
		insert();
		break;
	case 3:
		modify();
		break;
	case 4:
		doDel();
		break;
	case 5:
		sort();
		break;
	case 6:
		search();
		break;
	case 7:
		printing();
		break;
	case 8:

		break;
	case 9:
		exitAndSave();
		break;
	case 0:
		exit(0);
		break;
	default :
		showMainMenu();
	}

}

/**
*	读取属性函数
*/
char* loadProperty(FILE* file,char* key) {
	char* value;
	char properties[255];
	char* result;
	//	FILE* file;
	//file = fopen(filePath,"r");
	if(file == NULL) {
		printf("文件读取错误!请检查文件\"%s\"是否存在!程序即将退出。\n","a");
		system("pause");
		exit(0);
	} 
	else {
		fgets(properties,255,file);
		result = strtok(properties,"=");
		while(strcmp(result,key) != 0) {
			fgets(properties,255,file);
			result = strtok(properties,"=");

		}
		if(strcmp(result,key) == 0) {
			result = strtok(NULL,"=");
			result = getProperty(result);
			return result;
		}
	}
	return 0;
}


//登录函数

void login() {
	char userName[255];
	char userPwd[255];
    char systemName[255];

	FILE* file;
	file = fopen("Mysys.properties","r");
    printf("=================================================\n");
	printf("========欢迎使用%s职工管理系统========\n",loadProperty(file,"systemName"));
	printf("=================================================\n");
	printf("==============请登录===============");
	printf("%s","\n请输入用户名:");
	scanf("%s",userName);
	printf("%s","\n请输入密码:");
	scanf("%s",userPwd);

	
	if(strcmp(userName,loadProperty(file,"adminId")) == 0 && strcmp(userPwd,loadProperty(file,"adminPwd")) == 0) {
		printf("\n登录成功!\n");
		init();
		showMainMenu();
	}
	else {
		printf("\n用户名或密码错误,请重新登录!\n");
		login();
	}
	fclose(file);
}

//创建链表函数
W* create() {
	W* list = (W*)malloc(sizeof(W));
	input(list);
	workers = list;
	return list;
}


//输入函数
W* input(W* aWorker) {
	printf("-------------请输入职工信息------------------\n");
	printf("职工号:");
	scanf("%d",&aWorker->id);
	printf("姓名:");
	scanf("%s",aWorker->name);
	printf("年龄:");
	scanf("%d",&aWorker->age);
	fflush(stdin);	//清空标准输入缓存
	printf("性别(M/F):");
	scanf("%c",&aWorker->sex);
	fflush(stdin);	//清空标准输入缓存
	printf("婚否(Y/N):");
	scanf("%c",&aWorker->isMarried);
	printf("籍贯:");
	scanf("%s",aWorker->nativePlace);
	printf("学历:"); 
	scanf("%s",aWorker->degree);
	printf("所在部门:");
	scanf("%s",aWorker->department);
	printf("通讯地址:");
	scanf("%s",aWorker->address);
	printf("电话号码:");
	scanf("%s",aWorker->tel);
	printf("电子邮箱:");
	scanf("%s",aWorker->email);
	printf("参加工作时间(YYYY-MM-DD):");
	scanf("%s",aWorker->workTime);
	printf("入党时间(YYYY-MM-DD):");
	scanf("%s",aWorker->partyTime);
	printf("个人简介(100字以内):");
	scanf("%s",aWorker->selfIntro);

	aWorker->next = 0;

	return aWorker;
}

//输出函数
void output(W* list) {
	if(list != NULL) {
		W *p,*q;
		p = list;
		q = list;
		printf("==================职工信息=============================\n");
		
		do {
				
			if(q != NULL) {

				printf("------------------------------------------------------\n");
				printf("职工号:%d\t姓名:%s\n",q->id,q->name);	
				printf("年龄:%d\t性别:%c\n",q->age,q->sex);
				printf("婚否:%c\t籍贯:%s\n",q->isMarried,q->nativePlace);
				printf("学历:%s\t所在部门:%s\n",q->degree,q->department);
				printf("通讯地址:%s\t电话号码:%s\n",q->address,q->tel);
				printf("电子邮箱:%s\t参加工作时间:%s\n",q->email,q->workTime);
				printf("入党时间:%s\n",q->partyTime);
				printf("个人简介:%s\n",q->selfIntro);	
			}
			p = q;
			q = p->next;	
		} while (p->next != NULL);
	}
	else {
		printf("没有相关职工信息!\n");
	}
}


//录入函数(按职工号排序)
W* add(W* list,W* aWorker) {
	W* head;
	W *p,*q;
	p = q = head = list;
	if(aWorker->id < p->id) {
		aWorker->next = list;
		head = aWorker;
		return head;
	}
	else if(aWorker->id == p->id) {
		printf("\n错误:录入失败,职工号重复。\n");
		return list;
	}
	else {
		while(p->next != 0) {
			q = p;
			p = q->next;
			if(aWorker->id > q->id && aWorker->id < p->id) {
				q->next = aWorker;
				aWorker->next = p;
				return head;
			}
		}
			
		if(aWorker->id > p->id) {
			p->next = aWorker;
			return head;
		}
		else {
			printf("\n错误:录入失败,职工号重复。\n");
			return head;
		}
		
	}
}

//查询函数
W* search() {
	W* result;
	if(workers == NULL) { 
		printf("\n\n没有任何可供查询的信息。\n");
	}
	else {
		int select;
		W* result;
		printf("-------------查询----------\n");
		printf("1.根据职工号查询\n");
		printf("2.根据姓名查询\n");
		printf("3.根据所在部门查询\n");
		printf("4.根据籍贯查询\n");
		printf("5.返回主菜单\n");
		printf("\n请选择查询方式:\n");
		scanf("%d",&select);

		switch(select) {
		case 1:
			workers = sortById(workers);//
			int keyId;
			printf("请输入职工号:");
			scanf("%d",&keyId);
			if(workers != 0)
				result = searchById(workers,keyId);
			else
				result = NULL;
			break;
		case 2:
			char keyName[10];
			printf("请输入职工姓名:");
			scanf("%s",&keyName);
			if(workers != 0)
				result = searchByName(workers,keyName);
			else
				result = NULL;
			break;
		case 3:
			char keyDep[10];
			printf("请输入职工所在部门:");
			scanf("%s",&keyDep);
			if(workers != 0)
				result = searchByDep(workers,keyDep);
			else
				result = NULL;
			break;
		case 4:
			char keyNP[10];
			printf("请输入职工籍贯:");
			scanf("%s",&keyNP);
			if(workers != 0)
				result = searchByDep(workers,keyNP);
			else
				result = NULL;
			break;
		case 5:
			showMainMenu();
			break;
		default:
			search();
			break;
		}
		if(result != NULL) {
			output(result);
		}
		else {
			printf("没有相关职工信息。\n");
		}
	}
	
	int goWhere;
	printf("\n\n请选择:1.继续查询\t2.返回主菜单\n");
	scanf("%d",&goWhere);
	if(goWhere == 1)
		search();
	else
		showMainMenu();
	return result;
}

//根据职工号查询
W* searchById(W* list,int id) {
	while(list != 0)   {
		if(list->id == id) {
			W* result = (W*)malloc(sizeof(W));
			*result = *list;
			result->next = NULL;
			return result;
		}
		list = list->next;
	} 
	return NULL;
}

//根据姓名查询
W* searchByName(W* list,char* name) {
	W *result,*p,*q;
	int i = 0;
	while(list != 0)   {
		if(strcmp(list->name,name) == 0) {
			i++;
			if(i == 1) {
				result = (W*)malloc(sizeof(W));
				p = q = result;
				*result = *list;
				result->next = 0;
			}
			else {
				q = (W*)malloc(sizeof(W));
				*q = *list;
				p->next = q;
				p = q;
				q->next = 0;
			}
		}
		list = list->next;
	} 
	return result;
}

//根据部门查询
W* searchByDep(W* list,char* dep) {
	W *result,*p,*q;
	int i = 0;
	while(list != 0)   {
		if(strcmp(list->department,dep) == 0) {
			i++;
			if(i == 1) {
				result = (W*)malloc(sizeof(W));
				p = q = result;
				*result = *list;
				result->next = 0;
			}
			else {
				q = (W*)malloc(sizeof(W));
				*q = *list;
				p->next = q;
				p = q;
				q->next = 0;
			}
		}
		list = list->next;
	} 
	return result;
}

//根据籍贯查询
W* searchByNP(W* list,char* np) {
	W *result,*p,*q;
	int i = 0;
	while(list != 0)   {
		if(strcmp(list->nativePlace,np) == 0) {
			i++;
			if(i == 1) {
				result = (W*)malloc(sizeof(W));
				p = q = result;
				*result = *list;
				result->next = 0;
			}
			else {
				q = (W*)malloc(sizeof(W));
				*q = *list;
				p->next = q;
				p = q;
				q->next = 0;
			}
		}
		list = list->next;
	} 
	return result;
}


//删除节点函数
W* remove(W* list,int id) {
	W *head,*p,*q;
	head = p = q = list;
	if(list->id == id) {
		head = list->next;
		free(list);
		return head;
	}
	while(p->next != 0) {
		q = p;
		p = q->next;
		if(p->id == id) {
			q->next = p->next;
			free(p);
			return head;
		}
	}
	printf("没有相应的职工信息,删除失败。\n");
	return head;
}

//删除职工函数
W* del(W* list) {
	if(list != NULL) {
		int key;
		printf("\n请输入待删除职工信息的职工号:");
		scanf("%d",&key);
		return remove(list,key);
		
	}
	else {
		printf("没有相应的职工信息,删除失败。\n");
		return list;
	}
}

//编辑节点
W* edit(W* list,int id) {
	W *head,*p,*q,*next;
	p = q = head = list;
	while(p != 0) {
		if(p->id == id) {
			W* temp = (W*)malloc(sizeof(W));
			//*temp = *p;
			next = p->next;
			input(temp);
			//p->next = next;
		//	printf("测试测试:%d",p->id);
			if(searchById(list,temp->id) != NULL) {
				printf("\n新的职工号%d已经存在,编辑失败。",searchById(list,temp->id)->id);
				//*p = *temp;
			}
			else {
				*p = *temp;
				p->next = next;
			}
			free(temp);
			return head;
		}
		q = p;
		p = q->next;
	}
	printf("找不到相应信息。\n");
	return head;
}

//编辑职工信息
void modify() {
	if(workers == NULL) {
		printf("没有任何待编辑信息。\n");
	}
	else {
		int key;
		printf("========编辑职工信息==========\n");
		printf("请输入待编辑的职工信息职工号:");
		scanf("%d",&key);
		edit(workers,key);
	}
	int select;
	printf("\n\n请选择:1.继续编辑\t2.返回主菜单\n");
	scanf("%d",&select);
	if(select ==1) 
		modify();
	else 
		showMainMenu();
	return;
}



//按职工号排序
W* sortById(W* list) {
	W *head,*p,*q,*r;
	head = list;
	

	
	if(head->next == 0)
		return head;

	p = head->next;
	head->next = NULL;
	while(p != 0) {

		q = p;
		p = q->next;
		q->next = 0;
		head = add(head,q); 
	}
	return head;
}


//按年龄排序
W* sortByAge(W* list) {
	W *head,*p,*q,*r;
	head = list;
	

	
	if(head->next == 0)
		return head;

	p = head->next;
	head->next = NULL;
	while(p != 0) {

		q = p;
		p = q->next;
		q->next = 0;
		head = sortByAgeHelper(head,q); 
	}
	/*while(r->next != 0) {
		i++;
		q = p ;
		p = r;
		p = q->next;
		r = p->next;
		if(i == 1)
			q->next = 0;
		p->next = 0;
			head = sortByAgeHelper(head,p);
	}
		head = sortByAgeHelper(head,r);
		//p->next = 0;*/
	return head;
}


//按年龄排序协助函数
W* sortByAgeHelper(W* list,W* aWorker) {
	W* head;
	W *p,*q;
	p = q = head = list;
	if(aWorker->age < p->age) {
		aWorker->next = list;
		head = aWorker;
		return head;
	}
	else {
		while(p->next != 0) {
			q = p;
			p = q->next;

			if(aWorker->age >= q->age && aWorker->age <= p->age) {
				q->next = aWorker;
				aWorker->next = p;
				return head;
			}
		}
			
		if(aWorker->age > p->age) {
			p->next = aWorker;
			return head;
		}
		
	}
}

//排序
void sort() {
	if(workers == NULL) {
		printf("没有可供排序的数据!\n");
		showMainMenu();
	}
	else {
		int select;
		printf("\n----------排序-------------\n");
		printf("1.按职工号排序\n");
		printf("2.按年龄排序\n");
		scanf("%d",&select);
		switch(select) {
		case 1:
			workers = sortById(workers);
			printf("排序成功!\n");
			output(workers);
			printf("\n按任意键回到主菜单...\n");
			system("pause");
			showMainMenu();
			break;
		case 2:
			workers = sortByAge(workers);
			printf("排序成功!\n");
			output(workers);
			
			printf("\n按任意键回到主菜单...\n");
			system("pause");
			workers = sortById(workers);
			showMainMenu();
			break;
		default:
			sort();
		}
	}
}

//录入
void insert() {
	if(workers == NULL) {
		create();
	}
	else {
		workers = sortById(workers);
		workers = add(workers,input((W*)malloc(sizeof(W))));
	}

	int select;
	printf("\n请选择:1.继续录入\t2.回主菜单\n");
	scanf("%d",&select);
	switch(select) {
	case 1:
		insert();
	default:
		showMainMenu();
	}
}

//浏览全部
void doOutput() {
	output(workers);
	printf("\n\n按任意键返回主菜单...\n");
	system("pause");
	showMainMenu();
}

//删除模块
void doDel() {
	workers = del(workers);
	printf("\n\n请选择:1.继续删除\t2.返回主菜单");
	int select;
	scanf("%d",&select);
	if(select == 1) 
		doDel();
	else
		showMainMenu();
}

//打印模块
void printing() {
	if(workers != NULL) {
		W* q;
		q = workers;
		printf("--------------------\n");
		printf("正在打印...\n");
		printf("--------------------\n");
		/*   VC++不支持
		
		  fprintf(stdprn,"=================职工信息表===================\n");
		while(q != 0) {
			fprintf(stdprn,"------------------------------------------------------\n");
			fprintf(stdprn,"职工号:%d\t姓名:%s\n",q->id,q->name);	
			fprintf(stdprn,"年龄:%d\t性别:%c\n",q->age,q->sex);
			fprintf(stdprn,"婚否:%c\t籍贯:%s\n",q->isMarried,q->nativePlace);
			fprintf(stdprn,"学历:%s\t所在部门:%s\n",q->degree,q->department);
			fprintf(stdprn,"通讯地址:%s\t电话号码:%s\n",q->address,q->tel);
			fprintf(stdprn,"电子邮箱:%s\t参加工作时间:%s\n",q->email,q->workTime);
			fprintf(stdprn,"入党时间:%s\n",q->partyTime);
			fprintf(stdprn,"个人简介:%s\n",q->selfIntro);

			q = q->next;
		}*/
		printf("\n\n打印完成。\n");
	}
	else {
		printf("\n没有任何信息可以打印。\n");
	}
	printf("\n\n任意键回到主菜单...\n");
	system("pause");
	showMainMenu();

}
//初始化函数
void init() {
	printf("正在初始化...\n");
	FILE* file = fopen("data.data","r");
	if(file == NULL) {
		printf("职工信息无存档。\n");
	}
	else {
		printf("正在读入职工信息...\n");
		//读入信息
		W *p,*q;
		int i=0;
		p = q;
		while(!feof(file)) {
			
			p = (W*)malloc(sizeof(W));
			p->id = atoi(loadProperty(file,"id"));
			strcpy(p->name,loadProperty(file,"name"));
			p->age = atoi(loadProperty(file,"age"));
			p->sex = *loadProperty(file,"sex");
			p->isMarried = *loadProperty(file,"isMarried");
			strcpy(p->nativePlace,loadProperty(file,"nativePlace"));
			strcpy(p->degree,loadProperty(file,"degree"));
			strcpy(p->department,loadProperty(file,"department"));
			strcpy(p->address,loadProperty(file,"address"));
			strcpy(p->tel,loadProperty(file,"tel"));
			strcpy(p->email,loadProperty(file,"email"));
			strcpy(p->workTime,loadProperty(file,"workTime"));
			strcpy(p->partyTime,loadProperty(file,"partyTime"));
			strcpy(p->selfIntro,loadProperty(file,"selfIntro"));

			i++;
			if(i == 1) {
				workers = p;
				q = p;
				workers->next = 0;
				
			}
			else {
				q->next = p;
				q = p;
				p->next = 0;
			}
			if(strcmp(loadProperty(file,"end"),"true") == 0)
				return;
		}
	}
	fclose(file);
}
//退出模块
void exitAndSave() {
	if(workers != NULL){
		printf("正在储存数据....\n");
		workers = sortById(workers);
		W* p;
		FILE *file = fopen("data.data","w");
		p = workers;
		while(p != 0) {
			fprintf(file,"id=%d\n",p->id);
			fprintf(file,"name=%s\n",p->name);
			fprintf(file,"age=%d\n",p->age);
			fprintf(file,"sex=%c\n",p->sex);
			fprintf(file,"isMarried=%c\n",p->isMarried);
			fprintf(file,"nativePlace=%s\n",p->nativePlace);
			fprintf(file,"degree=%s\n",p->degree);

			fprintf(file,"department=%s\n",p->department);
			fprintf(file,"address=%s\n",p->address);
			fprintf(file,"tel=%s\n",p->tel);
			fprintf(file,"email=%s\n",p->email);
			fprintf(file,"workTime=%s\n",p->workTime);
			fprintf(file,"partyTime=%s\n",p->partyTime);
			fprintf(file,"selfIntro=%s\n",p->selfIntro);
			if(p->next != 0) {
				fprintf(file,"end=false\n\n");
			}
			else {
				fprintf(file,"end=true\n\n");
			}

			p = p->next;
		}
		printf("正在退出....\n");
		fclose(file);
	}
	printf("退出成功!\n");
	system("pause");
	exit(0);
}

//getproperty
char* getProperty(char* str) {
	char* head;
	head = str;
	while(*str != '\0') {
		str++;
	}
	str--;
	*str = '\0';
	str++;
	*str = NULL;
	return head;
}

//系统设置
/*void settings() {
	int select;
	char user[255],pwd[255],systemName[255];
	printf("\n==========系统设置============\n\n");
	printf("1.修改单位名称\n");
	printf("2.修改密码\n");
	printf("3.返回主菜单\n");

	scanf("%d",&select);
	switch(select) {
	case 1:
		File file = fopen("Mysys.properties","r");
		strcpy(p->nativePlace,loadProperty(file,"nativePlace"));
		break;
	case 2:
		break;
	default:
		break;
	}
}*/

posted on 2010-06-12 19:01  PSJay  阅读(285)  评论(0编辑  收藏  举报

导航