#include
#include
#include
struct data {
int year;
int month;
int day;
};
struct cost{
int yuan;
int jiao;
int fen;
};
struct treatment{
char pname[20];
char pid[19] ;
int age;
char dname[20];
int did;
int office;
float money;
struct data day0;
struct treatment *next;
};
//病人名字
int addpname( char y0[]){
int k0=1;
int i0;
while(k0){
k0=0;
printf("请输入病人名字(小写字母)\n");
scanf("%s",y0);
for(i0=0;i0
if(y0[i0]122){
k0=1;
printf("输入有误,请重新输入\n");
break; //注意break是否跳出for 对的
}
}
}
return 0;
}
//病人id
void addpid( char y1[20]){
int k1=1;
int i1;
while(k1){
k1=0;
printf("请输入病人身份证号\n");
scanf("%s",y1);
for(i1=0;i1<18;i1++){
if(y1[i1]<48||y1[i1]>57&&y1[18]!=120)
{
k1=1;
printf("输入有误,请重新输入\n");
break;
}
}
}
}
//医生名字
int adddname( char y2[20] ){
int k2=1;
int i2;
while(k2){
k2=0;
printf("请输入医生名字(小写字母)\n");
scanf("%s",y2);
for(i2=0;i2<strlen(y2);i2++){
if(y2[i2]<97||y2[i2]>122){
k2=1;
printf("输入有误,请重新输入\n");
break;
}
}
}
return 0 ;
}
//医生工作号
int adddid(){
int i3;
int k3=1;
while(k3){
k3=0;
int y3;
fflush(stdin);
printf("请输入医生工作号\n");
y3=scanf("%d",&i3);
if(y3==EOF||0>i3||200
k3=1;
printf("输入有误,请重新输入\n");
// break; //Break使用有误导致缓冲区里有错误数据且给了下一个输入
}
}
return i3;
}
//判断日期
int adddata( int ydata[3]){
//存储日期
int i4; //i4表示年
int k4=1;
while(k4){
k4=0;
printf("请输入年份\n");
scanf("%d",&i4);
if(i4>2020||i4<2017){
k4=1;
printf("输入有误!请重新输入\n");
}
}
int k5=1;
int i5; //判断月
while(k5){
k5=0;
printf("请输入月份(1-12)\n");
scanf("%d",&i5);
if(i5>12||i5<1){
printf("输入有误!请重新输入\n");
k5=1;
}
}
int y5; //月份天数上限
switch(i5){
case 1: case 3: case 5:case 7: case 8 : case 10: case 12 :y5=31;break;
case 4: case 6: case 9:case 11:y5=30;break;
case 2:if(i4%4==0&&i4%100!=0||i4%400==0)
y5=29;
else
y5=28;
break;
}
int k6=1; //判断日期
int i6;
while(k6){
k6=0;
printf("请输入日期(1-%d)\n",y5);//上限
scanf("%d",&i6);
if(i6<1||i6>y5){
k6=1;
printf("输入有误!请重新输入\n");
}
}
ydata[0]=i4;
ydata[1]=i5;
ydata[2]=i6;
return 0;
}
/*科室处理*/
int addoffice(){
int y7;
int k7=1;
while(k7){
k7=0;
printf("请选择科室\n");
printf("1-神精科 2-精神科\n");
printf("3-内 科 4-外 科\n");
printf("5-小儿科\n");
fflush(stdin);
if(scanf("%d",&y7)==EOF||y7>5||y7<1){
printf("输入有误!请重新输入\n");
k7=1;
}
}
return k7;
}
//钱的处
int addqian(){ //元
int k8=1;
int i8;
while(k8){
k8=0;
fflush(stdin);
if( scanf("%d",&i8)==EOF||i810000000){
k8=1;
printf("输入有误,请重新输入\n");
}
}
return i8;
}
int addqian2(){ //分 不能大于10
int k10=1;
int i10;
while(k10){
k10=0;
fflush(stdin);
if( scanf("%d",&i10)==EOF||i1010){
k10=1;
printf("输入有误,请重新输入\n");
}
}
return i10;
}
//病人的年龄
int addage(){
int k9=1;
int i9;
int y9;
while(k9){
k9=0;
printf("请输入整数\n");
fflush(stdin); //清除缓冲区内容
y9=scanf("%d",&i9); //getchar();只能清除一个字符
if(y9==EOF){ //判断scanf录入的是不是字母
printf("输入有误!请重新输入\n");
k9=1;
}
if(i9<0||i9>300){
printf("输入有误!请重新输入\n");
k9=1;
}
}
return i9;
}
//增加函数
int realadd(struct treatment *bus0){
struct cost s;
addpname(bus0->pname);
addpid(bus0->pid);
printf("请输入病人的年龄") ;
bus0->age=addage();
adddname(bus0->dname);
bus0->did=adddid();
bus0->office=addoffice();
int yy[3]; //年月日
adddata(yy);
bus0->day0.year=yy[0];
bus0->day0.month= yy[1];
bus0->day0.day=yy[2];
printf("请输入病人消费情况\n");
printf("请输入元\n");
s.yuan=addqian();
printf("请输入角\n");
s.jiao=addqian2();
printf("请输入分\n");
s.fen=addqian2();
bus0->money=(float)s.yuan+0.1*(float(s.jiao ))+0.01*(float(s.fen ));
return 0;
}
//删除函数
int delete0(struct treatment * top){ ///用delete的话和编译器里的东西重名
char key[6];
addpid(key); //输入关键字
struct treatment *Sqian,*Shou;
Shou=top;
while(Shou!=NULL){
if(strcmp(key,Shou->pid)==0){
if(Shou==top){ //头
Sqian=Shou;
Shou=Shou->next;
free(Sqian);
}
else if(Shou->next==NULL){ //尾
Sqian=Shou;
Shou=top;
free(Sqian);
}
else { //中间
Shou=Shou->next;
free(Sqian->next);
Sqian->next=Shou;
}
}//第一个if
else { //向后走
Sqian=Shou;
Shou=Shou->next;
}
return 0;
}
}
// 打印输出函数
void output0(struct treatment *bus1){
do{
printf("病人的名字%s\n",bus1->pname);
printf("病人的身份证%s\n",bus1->pid);
printf("病人的年龄%d\n",bus1->age);
printf("医生的名字%s\n",bus1->dname);
printf("医生的工作号%d\n",bus1->did);
printf("科室d%\n",bus1->office);
printf("开销总计%f\n",bus1->money);
printf("日期:%d 年%d 月%d 日\n",bus1->day0.year,bus1->day0.month,bus1->day0.day );
bus1=bus1->next;
}while(bus1!=NULL) ;
}
//加载文件到链表 --------------------------------------------------------------------------------------------------------------
int wenjian(struct treatment *top0 ,struct treatment *rear){
FILE *fp0;
struct treatment *sp11;
fp0=fopen("D://source.txt","a+");
if(fp0==NULL){ //判断文件打开是否成功;
printf("打开文件错误");
return 0;
}
else{
if(!feof(fp0)) { //头上加载
fread(top0,sizeof(struct treatment),1,fp0);
top0->next=NULL;
sp11=top0;
while(!feof(fp0)){ //后面加
sp11->next=(struct treatment *)malloc(sizeof(struct treatment ));
fread(sp11->next,sizeof(treatment),1,fp0);
sp11=sp11->next;
sp11->next=NULL;
}
rear=sp11;
}
else printf( "文件为空");
fclose(fp0);
printf("加载文件成功");
return 1;
}
}
//将链表写入文件--------------------------------------------------------------------------
int addw(struct treatment *head){ //加入尾
FILE *fp1;
struct treatment *sp22,*sbing;
sp22=head;
fp1=fopen("D://source.txt","a");
printf("DFJKL;") ;
if(fp1==NULL){ //判断打开是否成功
printf("打开文件有误");
return 0;
}
else if(strlen(head->pname)!=0){ //加入一个判断来确定链表是否为空
do{
printf("kaishi"); //写入
fwrite(sp22,sizeof( struct treatment),1,fp1);
sbing=sp22;
sp22=sp22->next;
}while(sbing!=NULL);//注意条件是否错误
}
else
printf("sssssssssssssssssssssssssssssssssssssssss");
fclose(fp1);
return 1;
}
//增加信息到链表--------------------------------------------------------------------------------------
int addolian(struct treatment *head3,struct treatment *rear3){
printf("开始加载信息");
printf( " %d dsfsdgsag ",strlen(head3->pname)) ;
if(strlen(head3->pname)==0){ //为什么等于3
realadd(head3);
head3->next=NULL;
}
else{
rear3->next=(struct treatment *)malloc(sizeof(struct treatment));
rear3=rear3->next;
realadd(rear3);
rear3->next=NULL;
}
}
int main(){
struct treatment *head0,*rear0,*sbing0,*bianli0;
head0=(struct treatment *)malloc(sizeof(treatment));
rear0=head0;
wenjian(head0,rear0);
int i;
while(1){
printf("选择相应功能前的数字\n") ;
printf("1-增加病人信息 2-输出所有病人信息\n");
printf("3-添加到文件 4-删除某病人的信息 \n");
i=addage();
switch(i){
case 1:addolian(head0,rear0);break;
case 2:output0(head0);break;
case 3:addw(head0);break;
case 4:delete(head0);break;
}
}
return 0; //后面对文件操作的几个函数有问题 ------------------------ //
}