#include "common.h"
MEMBER * newNode(MEMBER *head){
MEMBER * newNode= (MEMBER *)malloc(sizeof(MEMBER));
float tmp;
char tmpDate[10];
if(newNode==NULL)
return NULL;
newNode->next = NULL;
do{
printf("\n请输入新队员编号:\n");
gets(newNode->number);
if(strlen(newNode->number)==0)// 输入不能为空串
continue;
if(unique(head,newNode->number)==1)//验证编号的唯一性
break;
else
printf("所输入的编号已经存在,请重新输入!\n");
}while(1);
printf("请输入新队员姓名:\n");
while(strlen(gets(newNode->name))==0)// 输入不能为空串
continue;
printf("请输入新队员角色(0-前锋 1-中场 2-后卫 3-守门员):\n");
//暂时没有考虑输入0-3之外的数据的容错性
while(1){
while(scanf("%d",&newNode->role)!=1){// 输入不是%d格式,需要重新输入
while(getchar()!='\n')
continue;
printf("请重新输入角色!\n");
}
if(newNode->role>=0&&newNode->role<=3)
//上句while执行完毕,已经输入一个整数,并且输入的是0-3之一
break;
else{//已经输入一个整数,但是输入的不是0-3之一
printf("请输入0~3中的一个整数:\n");
printf("请输入新队员角色(0-前锋 1-中场 2-后卫 3-守门员):\n");
}
}
printf("请输入新队员年龄:\n");
while(getchar()!='\n')
continue;
while(scanf("%d",&newNode->age)!=1){//输入不是%d格式,需要重新输入
printf("请重新输入年龄!\n");
}
printf("请输入新队员身高(单位:厘米):\n");//输入不是%f格式,需要重新输入
while(getchar()!='\n')
continue;
while(scanf("%f",&tmp)!=1){
printf("请重新输入身高!\n");
}
newNode->high=tmp;
printf("请输入新队员体重(单位:公斤):\n");
while(getchar()!='\n')
continue;
while(scanf("%f",&tmp)!=1){//输入不是%f格式,需要重新输入
printf("请重新输入体重!\n");
}
newNode->weight=tmp;
printf("请输入新队员薪水(单位:人民币元/月):\n");
while(scanf("%f",&tmp)!=1){//输入不是%f格式,需要重新输入
while(getchar()!='\n')
continue;
printf("请重新输入薪水!\n");
}
newNode->salary=tmp;
while(getchar()!='\n')
continue;
do{
printf("请输入新队员加入日期(使用半角字符,格式:yy-mm-dd):\n");
gets(tmpDate);
if(checkDate(newNode, tmpDate)==1)
break;
}while(1);
return newNode;
}
int unique(MEMBER* head,char * number){
MEMBER *p;
int flag=1;//标记编号是否唯一,1代表没有重复,唯一;0代表重复,不唯一
p=head->next;
while(p!=NULL){
if(strcmp(p->number,number)==0){
flag=0;//重复,不唯一
break;
}
p=p->next;
}
return flag;
}
int checkDate(MEMBER *newNode, char *tmpDate)
{
int i,d[8],flag=1;
do{
if(strlen(tmpDate)!=8){
flag=0;
break;
}
else if(tmpDate[0]<'0'||tmpDate[0]>'9'){
flag=0;
break;
}
else if(tmpDate[1]<'0'||tmpDate[1]>'9'){
flag=0;
break;
}
else if(tmpDate[2]!='-'){
flag=0;
break;
}
else if(tmpDate[3]<'0'||tmpDate[3]>'9'){
flag=0;
break;
}
else if(tmpDate[4]<'0'||tmpDate[4]>'9'){
flag=0;
break;
}
else if(tmpDate[5]!='-'){
flag=0;
break;
}
else if(tmpDate[6]<'0'||tmpDate[6]>'9'){
flag=0;
break;
}
else if(tmpDate[7]<'0'||tmpDate[7]>'9'){
flag=0;
break;
}
for(i=0;i<strlen(tmpDate);i++){
d[i]=tmpDate[i]-'0';
}
newNode->joinDate.year = 10*d[0]+d[1];
newNode->joinDate.month = 10*d[3]+d[4];
newNode->joinDate.day = 10*d[6]+d[7];
if(newNode->joinDate.month<=0||newNode->joinDate.month>12){
flag=0;
break;
}
else if(newNode->joinDate.day<=0||newNode->joinDate.day>31){
flag=0;
break;
}
}while(!flag);
if(!flag)
printf("所输入的日期格式不对,请重新输入!\n");
return flag;
}
MEMBER * insert(MEMBER *head,MEMBER *newNode,int style){
MEMBER *p,*q;
q=head;
p=head->next;
switch(style){
case 1://按姓名升序插入
while(p!=NULL){//找到插入点,在p与q之间插入
if(strcmp(p->name ,newNode->name) < 0){//按姓名升序插入
p=p->next;
q=q->next;
}
else break;
}
break;
case 2://按姓名降序插入
while(p!=NULL){//找到插入点,在p与q之间插入
if(strcmp(p->name ,newNode->name) > 0){//按姓名降序插入
p=p->next;
q=q->next;
}
else break;
}
break;
case 3://按薪水升序插入
while(p!=NULL){//找到插入点,在p与q之间插入
if(p->salary < newNode->salary){//按薪水升序插入
p=p->next;
q=q->next;
}
else break;
}
break;
case 4://按薪水降序插入
while(p!=NULL){//找到插入点,在p与q之间插入
if(p->salary > newNode->salary){//按薪水降序插入
p=p->next;
q=q->next;
}
else break;
}
break;
default://默认,按编号升序插入
while(p!=NULL){//找到插入点,在p与q之间插入
if(strcmp(p->number ,newNode->number) < 0){//按编号升序插入
p=p->next;
q=q->next;
}
else break;
}
break;
}//end of switch
q->next = newNode;
newNode->next = p;
return head;
}
MEMBER * loadFromFile(int style){
MEMBER *head,*node;
FILE *fp = fopen(FILENAME,"rb");
if(fp==NULL){//文件还不存在,无法打开
char c;
printf("文件打开错误或文件不存在!\n");
printf("需要新建一个文件吗?(y/n)\n");
c=getche();
if(c=='y'||c=='Y'){
fp=fopen(FILENAME,"wb");
fclose(fp);
fp=fopen(FILENAME,"rb");
}
else
{
printf("\n\n程序即将结束!\n");
exit(1);
}
}
head=(MEMBER*)(malloc(sizeof(MEMBER)));
if(head==NULL){
printf("分配内存失败!");
exit(1);
}
head->next=NULL;
node=(MEMBER*)malloc(sizeof(MEMBER));//为新的结点申请内存
node->next=NULL;
if(fread(node,sizeof(MEMBER),1,fp)==0) {//读取第一个结点
printf("文件中没有数据!\n");
}
else{
insert(head,node,style);//将读取的结点插入到链表中,插入法生成链表
while(!feof(fp) ){//没有到文件尾,继续读取
node=(MEMBER*)malloc(sizeof(MEMBER));//为新的结点申请内存
node->next=NULL;//插入法生成链表的需要
if(fread(node,sizeof(MEMBER),1,fp)==1){
insert(head,node,style);//将读取的结点插入到链表中,插入法生成链表
}
else
free(node);//释放无效结点内存
}
}
fclose(fp);
return head;
}
void writeToFile(MEMBER *head){
MEMBER *p;
FILE *fp;
if(head==NULL) {
printf("向文件写入链表时,链表头指针为空!\n");
return;
}
fp= fopen(FILENAME,"wb");
if (NULL == fp )
{
printf("文件打开错误!\n");
getch();
return;
}
p=head->next;
while(p!=NULL){//没有到链表尾,继续
fwrite(p,sizeof(MEMBER),1,fp);//将一个结点写到文件
p=p->next;//将读取的结点插入到链表中,插入法生成链表
}
fclose(fp);
}
void list(MEMBER *head){
MEMBER*p;
int count=0;
system("CLS");
p=head->next;
printf("\n%3s%8s%15s%13s%4s%8s%8s%8s%12s\n\n","ID","编号","姓名","位置","年龄","身高","体重","薪水","转入日期");
while(p!=NULL){//遍历输出链表
printf("%3d%8s%15s%13s%4d%8.2f%8.2f%8.2f%5d-%2d-%2d\n",count+1,p->number,p->name,roleSet[p->role],p->age,p->high,p->weight,p->salary,p->joinDate.year,p->joinDate.month,p->joinDate.day);
count++;
p=p->next;
}
}
void freeList(MEMBER* head){
MEMBER *p,*q;
q=head;
p=head->next;
while(p!=NULL){
free(q);
q=p;
p=p->next;
}
free(q);//释放最后一个结点内存
}
没有合适的资源?快使用搜索试试~ 我知道了~
球队信息管理系统(C语言源代码)
共63个文件
c:17个
sbr:16个
obj:16个
需积分: 18 25 下载量 164 浏览量
2008-09-18
09:09:10
上传
评论 1
收藏 328KB RAR 举报
温馨提示
用c语言编写的一个简单的小系统。仅供新手学习参考。
资源推荐
资源详情
资源评论
收起资源包目录
球队信息管理系统.rar (63个子文件)
球队信息管理系统
reviseMember.c 4KB
main.c 1KB
countSalary.c 321B
queryByName.c 819B
球队信息管理系统.ncb 337KB
addMember.c.bak 860B
球队信息管理系统.opt 52KB
sortBySalary.c 552B
common.h 1KB
球队信息管理系统.dsp 5KB
reportCustomize.c 2KB
Debug
com.obj 20KB
countSalary.sbr 0B
球队信息管理系统.pch 154KB
reviseMember.obj 14KB
showAll.sbr 0B
queryByName.obj 6KB
vc60.pdb 52KB
sortByName.obj 4KB
com.sbr 0B
reportControl.obj 9KB
countSalary.obj 3KB
queryByName.sbr 0B
sortBySalary.sbr 0B
球队信息管理系统.exe 216KB
vc60.idb 121KB
deleteByNumber.sbr 0B
deleteByNumber.obj 4KB
menu.obj 7KB
sortByName.sbr 0B
queryByNumber.sbr 0B
countMember.obj 3KB
球队信息管理系统.ilk 314KB
reviseMember.sbr 0B
reportByRole.sbr 0B
reportCustomize.sbr 0B
addMember.obj 4KB
球队信息管理系统.bsc 217KB
reportControl.sbr 0B
球队信息管理系统.pdb 625KB
queryByNumber.obj 6KB
sortBySalary.obj 4KB
countMember.sbr 0B
main.obj 8KB
reportByRole.obj 6KB
showAll.obj 3KB
addMember.sbr 0B
main.sbr 0B
menu.sbr 0B
reportCustomize.obj 11KB
球队信息管理系统.plg 3KB
showAll.c 193B
queryByNumber.c 829B
球队信息管理系统.dsw 557B
addMember.c 693B
com.c 7KB
sortByName.c 589B
deleteByNumber.c 728B
reportMenu.c 914B
countMember.c 305B
reportControl.c 2KB
menu.c 2KB
reportByRole.c 881B
共 63 条
- 1
资源评论
chenshko
- 粉丝: 6
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功