最开始运行程序的时候,要先建立文件,就是要选菜单1.
#include <stdio.h>
struct Card
{
int ID//卡号
char name[20]
double value//金额
int flag//挂失信息
}
card[1000]//假设最多1000张
int counts//当前已有饭卡数量
FILE * fp
int menu()
{
int choose
printf("|-------------------------------|\n")
printf("| 请输入选项编号(0--7) |\n")
printf("|-------------------------------|\n")
printf("| 0——退出 |\n")
printf("| 1——建立饭卡文件 |\n")
printf("| 2——买饭 |\n")
printf("| 3——续钱 |\n")
printf("| 4——添加新饭卡 |\n")
printf("| 5——注销旧饭卡 |\n")
printf("| 6——设置与解除挂失 |\n")
printf("| 7——显示全部饭卡信息 |\n")
printf("|-------------------------------|\n")
scanf("%d",&choose)
return choose
}
void write_file()
{
int i
FILE * f
f=fopen("card.dat","w")
for(i=0i<countsi++)
fprintf(f,"%d %s %lf %d\n",card[i].ID,card[i].name,card[i].value,card[i].flag)
fclose(f)
}
void create_file() //如果已经存在了card.dat那么就打开该文件
{
int i=0
fp=fopen("card.dat","r")
if(fp!=NULL) //如果已经存在
{
printf("文件已经存在!\n")
while(fscanf(fp,"%d%s%lf%d",&card[i].ID,card[i].name,&card[i].value,&card[i].flag)!=EOF)
i++
counts=i
fclose(fp)
return
}
fp=fopen("card.dat","w")
printf("输入卡号,姓名,金额,挂失信息(0/1)(卡号-1表示输入结束!):\n")
while(scanf("%d%s%lf%d",&card[i].ID,card[i].name,&card[i].value,&card[i].flag),card[i].ID!=-1)
i++
counts=i
fclose(fp)
write_file()
}
void buy1(int card_id,double cost)
{
int i
for(i=0i<countsi++)
{
if(card[i].ID==card_id)
{
if(card[i].flag==1)
{
printf("本卡已挂失!\n")
return
}
if(card[i].value<5)
{
printf("金额不足!\n")
return
}
printf("%lf\n",card[i].value)
card[i].value-=cost
printf("%lf\n",card[i].value)
}
}
printf("非法卡!\n")
}
void buy()
{
int id
double v
printf("输入卡号和消费金额:\n")
scanf("%d%lf",&id,&v)
buy1(id,v)
}
void add_value()
{
int id,i
double v
printf("输入卡号和续钱金额:\n")
scanf("%d%lf",&id,&v)
for(i=0i<countsi++)
{
if(card[i].ID==id)
{
printf("%lf\n",card[i].value)
card[i].value+=v
printf("%lf\n",card[i].value)
printf("ok!\n")
return
}
}
printf("error!\n")
}
void add_card()
{
int i=counts
printf("输入卡号,姓名,金额,挂失信息(0/1)(卡号-1表示输入结束!):\n")
while(scanf("%d%s%lf%d",&card[i].ID,card[i].name,&card[i].value,&card[i].flag),card[i].ID!=-1)
i++
counts=i
}
void del_card()
{
int id
int i,j
printf("输入要注销的卡号:\n")
scanf("%d",&id)
for(i=0i<countsi++)
{
if(card[i].ID==id)
{
for(j=ij<counts-1j++)
card[j]=card[j+1]
printf("注销成功!\n")
return
}
}
}
void set_flag()
{
int id,i,f
printf("输入卡号和挂失信息(1:挂失,0:解除挂失)\n")
scanf("%d%d",&id,&f)
for(i=0i<countsi++)
{
if(card[i].ID==id)
{
card[i].flag=f
printf("设置完成 !\n")
break
}
}
}
void output()
{
int i
printf("%6s%11s%10s%6s\n","卡号","姓名","金额","挂失")
for(i=0i<countsi++)
printf("%6d%11s%10.3lf%2d\n",card[i].ID,card[i].name,card[i].value,card[i].flag)
}
void main()
{
int m
while(m=menu(),m)
{
switch(m)
{
case 1:
create_file()
break
case 2:
buy()
break
case 3:
add_value()
break
case 4:
add_card()
break
case 5:
del_card()
break
case 6:
set_flag()
break
case 7:
output()
break
default:
printf("输入有误,重新输入!\n")
}
}
write_file()//退出系统的时候,把数据保存到文件
}
这个最好自己写,但是我有一个员工信息的代码,含注释,与这个很相似,只要稍加修改即可。#include <stdio.h>
#include <stdlib.h>
#include <windows.h> //清屏函数头文件
#include <string.h>
struct Stuff
{
char number[10] //员工编号
char name[10] //员工姓名
char sex[8] //员工性别
char borth[10] //员工生日
char degree[20] //员工学历
char business[20] //员工职务
char phone[15] //员工电话
char place[50] //员工住址
char con[50]//判断关键字专用
struct Stuff *next
}
char Menu(void) //菜单显示
struct Stuff *App(struct Stuff *head) //添加
void Sort(struct Stuff *head) //排序
struct Stuff *Ser(struct Stuff *head) //查找
void Chn(struct Stuff *head,char n[10]) //更改
void Scpy(char *p,char *q)//排序中用于交换员工信息
struct Stuff *Del(struct Stuff *head,char n[10]) //删除
int Sel(char ch,struct Stuff *p,struct Stuff *q) //判断排序及关键字专用函数
void Prf(struct Stuff *head) //输出
void Fre(struct Stuff *head) //释放
int i=1 //定义全局变量,实现实时员工人数统计
int main(void)
{
char n[10]
struct Stuff *head=NULL //链表头指针定义
while(1)
{
switch(Menu())
{
case '1':
printf("请输入员工信息,直接输入'#'结束\n")
head=App(head)
break
case '2':
Sort(head)
break
case '3':
head=Ser(head)
break
case '4':
printf("员工信息如下:\n")
Prf(head)
break
case '5':
printf("请输入员工编号:")
scanf("%s",n)
Chn(head,n)
break
case '6':
printf("请输入员工编号:")
scanf("%s",n)
head=Del(head,n)
break
case '0':
printf("欢迎下次光临,88!\n")
exit(0)
default:
printf("输入错误,请重新输入!\n")
}
fflush(stdin) //清楚缓冲区
printf("按任意键继续~")
getchar()
system("cls") //清屏效果
}
Fre(head)
return 0
}
//菜单函数
char Menu(void)
{
char ch
printf("------------请选择-----------\n")
printf("1.添加员工信息\n2.员工信息排序\n3.查找员工信息\n4.输出员工信息\n5.更改员工信息\n6.删除员工信息\n0.退出\n-----------------------------\n")
scanf(" %c",&ch)
return ch
}
//添加成员函数
//输入参数:链表头指针
//返回参数:链表头指针
struct Stuff *App(struct Stuff *head)
{
struct Stuff *p=NULL,*q=head
while(i)
{
p=(struct Stuff *)malloc(sizeof(struct Stuff)) //申请结构体空间
if(p==NULL)
{
printf("内存不够!\n")
exit(0)
}
p->next =NULL //指针域为空
printf("请输入第%d名员工:\n",i)
printf(" 编号 | 姓名 | 性别 | 出生年月 | 学历 | 职务 | 电话 | 住址 :\n")
fflush(stdin)
scanf("%s",p->number )
if(!strcmp(p->number ,"#"))
{
free(p) //释放不需要的结构体内存
break
}
else
{
++i
scanf("%s%s%s%s%s%s%s",p->name ,p->sex ,p->borth ,p->degree ,p->business ,p->phone ,p->place )
p->con[0]='\0' //防止后面判断出现随机值
if(head==NULL)
head=p
else
{
while(q->next !=NULL) //防止结束后再次输入时出现问题
q=q->next
q->next =p
}
q=p//每次都加在链表尾
}
}
return head
}
//排序函数
//输入参数:头指针
void Sort(struct Stuff *head)
{
char ch
struct Stuff *p,*q,*r
while(1)
{
printf("请选择排序条件:1.编号2.姓名3.性别4.出生年月5.学历6.职务7.电话8.地址0.退出\n")
scanf(" %c",&ch)
if(ch=='0')
break
if(ch<'1'||ch>'8')
{
printf("输入错误,请重新输入!\n")
continue
}
p=head
while(p->next!=NULL) //选择排序
{
q=p->next
r=p
while(q!=NULL)
{
if(Sel(ch,r,q)) //调用判断函数
r=q
q=q->next
}
if(r!=p) //交换内容
{
Scpy(r->number,p->number)
Scpy(r->name,p->name)
Scpy(r->sex,p->sex)
Scpy(r->borth,p->borth)
Scpy(r->degree,p->degree)
Scpy(r->business,p->business)
Scpy(r->phone,p->phone)
Scpy(r->place,p->place)
}
p=p->next
}
Prf(head) //输出
}
}
//交换函数
void Scpy(char *p,char *q)
{
char c[50]
strcpy(c,p)
strcpy(p,q)
strcpy(q,c)
}
//判断函数
//输出参数:1为真,0为假
int Sel(char ch,struct Stuff *p,struct Stuff *q)
{
switch(ch) //实现各个关键字查找
{
case '1':
return strcmp(q->number ,p->number )<0||strcmp(q->con ,p->number )==0 //排序条件及查找条件
case '2':
return strcmp(q->name ,p->name )<0||strcmp(q->con ,p->name )==0
case '3':
return strcmp(q->sex ,p->sex )<0||strcmp(q->con ,p->sex )==0
case '4':
return strcmp(q->borth ,p->borth)<0 ||strcmp(q->con ,p->borth )==0
case '5':
return strcmp(q->degree ,p->degree )<0||strcmp(q->con ,p->degree )==0
case '6':
return strcmp(q->business ,p->business )<0||strcmp(q->con ,p->business)==0
case '7':
return strcmp(q->phone ,p->phone )<0 ||strcmp(q->con ,p->phone)==0
case '8':
return strcmp(q->place ,p->place )<0||strcmp(q->con ,p->place )==0
default :
exit(0)
}
}
//查找函数
struct Stuff *Ser(struct Stuff *head)
{
struct Stuff *p=NULL,*q,a={"\0","\0","\0","\0","\0","\0","\0","\0"}//防止判断时错误
int flag //查找判断
char ch,sh
q=&a
while(1)
{
printf("请输入要查找的条件:1.编号2.姓名3.性别4.出生年月5.学历6.职务7.电话8.住址0.退出\n")
scanf(" %c",&ch)
if(ch=='0')
break
if(ch<'1'||ch>'8')
{
printf("输入错误,请重新输入!\n")
continue
}
fflush(stdin)
printf("请输入:")
gets(q->con )
p=head //指向表头
flag=0
while(p!=NULL)
{
if(Sel(ch,p,q))
{
printf("员工信息如下:\n")
printf(" 编号 | 姓名 | 性别 | 出生年月 | 学历 | 职务 | 电话 | 住址 \n%s %s %s %s %s %s %s %s\n"
,p->number ,p->name ,p->sex ,p->borth ,p->degree ,p->business ,p->phone ,p->place )
printf("是否需要:1.更改 2.删除 3.继续\n")
scanf(" %c",&sh)
if(sh=='1')
Chn(head,p->number)//调用更改函数
else if(sh=='2')
head=Del(head,p->number) //调用删除函数,得到的head必须return
flag=1
break
}
p=p->next
}
if(flag==0)
printf("没有找到该员工信息!\n")
}
return head
}
//更改函数
//输入参数:n[10] 为员工编号
void Chn(struct Stuff *head,char n[10])
{
struct Stuff *p=head
int flag=0
if(head==NULL)
printf("未找到员工信息!\n")
else
{
while(p!=NULL)
{
if(!strcmp(p->number,n))
{
printf("请输入新的信息:\n编号|姓名|性别|出生年月|学历|职务|电话|住址\n")
scanf("%s%s%s%s%s%s%s%s",p->number ,p->name ,p->sex ,p->borth ,p->degree ,p->business ,p->phone ,p->place )
printf("员工信息如下:\n")
flag++
break
}
p=p->next
}
if(flag==0)
printf("未找到该员工信息!\n")
}
Prf(head)
}
//删除函数
//输入参数:n为员工编号
//输出参数:头指针
struct Stuff *Del(struct Stuff *head,char n[10])
{
struct Stuff *p,*pr
int flag
flag=0
p=head,pr=head
if(head==NULL)
printf("未找到员工信息!\n")
else
{
while(strcmp(p->number ,n)&&p->next !=NULL)
{
pr=p
p=p->next
}
if(!strcmp(p->number ,n))
{
if(p==head)
head=p->next
else
pr->next=p->next
free(p)
printf("删除成功!\n")
i--
}
else
printf("未找到员工信息!\n")
}
Prf(head)
return head
}
//输出函数
void Prf(struct Stuff *head)
{
struct Stuff *p=head
int i=1
while(p!=NULL)
{
printf("%d. %s %s %s %s %s %s %s %s\n"
,i++,p->number ,p->name ,p->sex ,p->borth ,p->degree ,p->business ,p->phone ,p->place)
p=p->next
}
}
//释放函数
void Fre(struct Stuff *head)
{
struct Stuff *p
while(head!=NULL)
{
p=head
head=head->next
free(p)
}
}
只有400行不到,分的如果你真的看懂了,就应该自己写,程序是死的人是活的,自己动手改改吧。