共有回帖数 0 个
-
转眼间大一过了不少,学c也两个月了.IT协会的人来催说要做个程序去学院里.所以一狠心花一晚上把文件给啃完了,然后构思了下面的程序,花了4天时间写了出来(936行).
本程序有个中心就是*sface指针变量.是由*sface的值来确定要显示的界面,然后找到相关的功能函数与该界面匹配,然后用鼠标点击来改变*sface的值来达到切换界面的目的.
编程过程中都很顺利,我的每一条语句都达到了我想要的目的,这是让我最欣慰的.不过如何实现鼠标控制与键盘输入在同一时间共存我搞不定(我的鼠标驱动是网上找的,自己做了修改来适应写的程序),而且还有几个小bug没去改.
还请前辈们多多指点,指正.
#define F1 0x3b00
#define F2 0x3c00
#include conio.h
#include dos.h
#include bios.h
#include malloc.h
#include stdlib.h
#include stdio.h
#include graphics.h
#define R 15 /*鼠标的形态*/
#define LEN sizeof(struct member)
struct member
{
char name[20];
char sex[10];
char relat[20];
char email[20];
char phone[20];
struct member *next;
};
void getmouse(int *x,int *y,int *key)
{
union REGS inregs,outregs;
inregs.x.ax=3; /*获取鼠标位置和状态也可以用3*/
int86(0x33,&inregs,&outregs); /*中断调用*/
*x=outregs.x.cx; /*cx寄存器中存的是横坐标*/
*y=outregs.x.dx; /*dx寄存器中存的是列坐标*/
*key=outregs.x.bx; /*bx寄存器是按键状态*/
}
void visbilemouse()
{
union REGS inregs,outregs;
inregs.x.ax=0x01; /*显示鼠标*/
int86(0x33,&inregs,&outregs);
}
/*按键后,返回当前鼠标的x,y和按键状态,知道按键后才返回*/
void mouse(int *x,int *y,int *z) /*画鼠标是利用将一个空矩形存入内存中,然后再在该空矩形中画鼠标形状*/
{
int a=0,b=0,c=0,a_old=0,b_old=0; /*a,b的值可以随便*/
int *ball; /*定义指向内存的存储图形的指针*/
ball=malloc(imagesize(a,b,a+R,b+R)); /*返回矩形的大小*/
getimage(a,b,a+R,b+R,ball); /*第一次将图形(一个空矩形)存入到内存中,内存中存入的是一个空矩形*/
while(c==0) /*直到按键后才返回,不按键一直循环*/
{
getmouse(&a,&b,&c); /*a,为横坐标,b,为列坐标,c为按键状态*/
if(a0) a=0; /*保证鼠标左边不出界*/
if(b0) b=0; /*保证上面不出界*/
if(agetmaxx()-R) a=getmaxx()-R; /*保证右边不出界*/
if(bgetmaxy()-R) b=getmaxy()-R; /*保证下边不出界*/
if(a!=a_old || b!=b_old) /*当鼠标移动时*/
{
putimage(a_old,b_old,ball,0); /*在a_old,b_old输出图形,用来擦掉原来的鼠标*/
getimage(a,b,a+R,b+R,ball); /*这条语句是将目前鼠标所在位置的图形存贮到ball里面试着看着有无这条语句的区别*/
/*不需要在获取了*/
setcolor(WHITE);
setlinestyle(0,0,1);
setfillstyle(SOLID_FILL,GREEN);
line(a,b,a+R,b+R/2);
line(a,b,a+R/2,b+R);
line(a+R,b+R/2,a+R/2,b+R);
line(a+R*3/4,b+R*3/4,a+R,b+R); /*画鼠标*/
floodfill(a+5,b+5,WHITE);
}
a_old=a;b_old=b;
} /*while()结束*/
*x=a;*y=b;*z=c; /*返回按键后鼠标的位置*/
putimage(a,b,ball,0); /*将鼠标擦掉,因为存在ball里面的是一个背景为缺省状态下的一个空矩形*/
free(ball);
}
void click(int *color,int *sface,int *flag,int *page,int *year,int *month) /*鼠标点击函数 控制点击时页面的切换*/
{
int x,y,z,c,f;
visbilemouse(); /*显示鼠标*/
f=1; /*令f=1*/
c=*color; /*c为当前背景颜色的值*/
do
{
mouse(&x,&y,&z); /*获取鼠标当前位置*/
if(z==1)
{
switch(*sface) /*页面指针变量决定当前的界面显示*/
{
case 1: /*密码输入界面.*/
{
if(x195&&x315&&y220&&y232) /*点击设置密码.使*sface的值变成2.然后调用surface函数时实现了设置密码的界面显示*/
{*sface=2;f=0;}
else if(x320&&x445&&y220&&y232) /*同上的原理,f=0跳出本循环*/
{*sface=3;f=0;}
else if(x620&&x580&&y430&&y420) /*当按exit时使*flag=0,跳出主函数中的循环*/
{*flag=0;f=0;}
break;}
case 3: /*3和2界面无分别.故一同考虑*/
case 2:
{
if(x520&&x560&&y420&&y432) /*点击 back 返回上一级界面.在这里就是密码输入界面*/
{*sface=1;f=0;}
else if(x620&&x580&&y430&&y420) /*当按exit时使*flag=0,跳出主函数中的循环*/
{*flag=0;f=0;}
break;}
case 4: /*主界面上的点击*/
{
if(x250&&x390&&y180&&y192) /* *sface=5 进入财务管理界面*/
{*sface=5;f=0;}
else if(x250&&x390&&y240&&y252) /* *sface=6 进入万年历输入界面*/
{*sface=6;f=0;}
else if(x250&&x390&&y300&&y312) /* *sface=8 进入通讯录主界面界面*/
{*sface=8;f=0;}
else if(x620&&x580&&y430&&y420) /*当按exit时使*flag=0,跳出主函数中的循环*/
{*flag=0;f=0;}
break;}
case 5: /*以下都是上面的思路,在这不罗嗦了*/
case 6:
{
if(x520&&x560&&y420&&y432)
{*sface=4;f=0;}
else if(x620&&x580&&y430&&y420)
{*flag=0;f=0;}
break;}
case 7: /*万年历输入界面时下鼠标控制*/
{
if(x580&&x620&&y400&&y412)
{*sface=4;f=0;}
else if(x620&&x580&&y430&&y420)
{*flag=0;f=0;}
else if(x222&&x252&&y60&&y90) /*点击年减使*year减一*/
{*sface=7;if(*year1)(*year)--;f=0;}
else if(x222&&x252&&y90&&y120) /*这里是加*/
{*sface=7;(*year)++;f=0;}
else if(x280&&x320&&y355&&y395) /*点击了月减的箭头.令*month 减1.若*month〈1,令month=12;*year减1*/
{*sface=7;(*month)--;if(*month1){(*year)--;*month=12;}f=0;}
else if(x330&&x370&&y355&&y395) /*上面的原理,这里是月+ */
{*sface=7;(*month)++;if(*month12){(*year)++;*month=1;}f=0;}
break;}
case 8:
{
if(x520&&x560&&y420&&y432)
{*sface=4;f=0;}
else if(x620&&x580&&y430&&y420)
{*flag=0;f=0;} /* *flag=0跳出func_cortorl函数*/
else if(x250&&x390&&y190&&y202)
{*sface=9;f=0;}
else if(x250&&x390&&y220&&y232)
{*sface=10;f=0;}
else if(x250&&x390&&y250&&y262)
{*sface=11;f=0;}
else if(x250&&x390&&y280&&y292)
{*sface=12;f=0;}
else if(x250&&x390&&y310&&y322)
{*sface=13;f=0;}
break;}
case 9: /*通讯录全部输出函数*/
{
if(x580&&x620&&y400&&y412) /*点击back使回通讯录主界面.页数*page置1*/
{*sface=8;*page=1;f=0;}
else if(x580&&x620&&y360&&y372) /*点击*page1时按PGDN令页数减1*/
{*sface=9;if(*page1)(*page)--;f=0;}
else if(x580&&x620&&y380&&y392) /*点击PGUP令页数加1*/
{*sface=9;(*page)++;f=0;}
else if(x620&&x580&&y430&&y420)
{*flag=0;f=0;}
break;}
case 10: /*通讯录另外3个函数的界面控制是一样的*/
case 11:
case 12:
case 13:
{
if(x580&&x620&&y400&&y412)
{*sface=8;f=0;}
else if(x620&&x580&&y430&&y420)
{*flag=0;f=0;}
break;}
}
}
else if(z==2)
{
if(c==14)c=1;*color=c;setbkcolor(c++); /*点击鼠标右健使背景颜色改变*/
}
}while(f); /*f为真时执行循环*/
cleardevice();
}
void graph()/*图形驱动程序*/
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
}
void surface(int *color,int *sface)/*界面显示函数,掌管本程序全部界面显示*/
{
setcolor(4); /*字体颜色默认为红色*/
setbkcolor(*color); /*设置背景颜色*/
switch(*sface) /*判断当前*sface的值来确定要显示的界面*/
{
case 1:
{ /*密码输入界面*/
printf("");
gotoxy(2,2);
printf("Enter F1 to use mouse");
gotoxy(2,3);
printf("Enter any other key to use keyboard");
gotoxy(2,5);
printf("The mouse right key changes the background color");
rectangle(195,220,315,232);
outtextxy(210,222,"Setpassword");
rectangle(320,220,445,232);
outtextxy(325,222,"Revisepassword");
rectangle(580,420,620,432);
outtextxy(585,422,"EXIT");
break;}
case 5: /*财务管理界面*/
{
rectangle(80,20,560,460);
rectangle(580,420,620,432);
outtextxy(585,422,"EXIT");
rectangle(580,400,620,412);
outtextxy(585,402,"BACK");
break;}
case 2: /*分别为设置密码 修改密码 万年历输入界面*/
case 3:
case 6:
{
rectangle(80,50,560,400);
rectangle(580,420,620,432);
outtextxy(585,422,"EXIT");
rectangle(520,420,560,432);
outtextxy(525,422,"BACK");
break;}
case 10: /*分别为查找 增加 删除成员 删除全部成员界面*/
case 11:
case 12:
case 13:
{
rectangle(80,50,560,400);
rectangle(580,420,620,432);
outtextxy(585,422,"EXIT");
rectangle(580,400,620,412);
outtextxy(585,402,"BACK");
break;}
case 4: /*主界面*/
{
gotoxy(1,1);
printf("Welcome to your world.Maker--Mr.wang.");
outtextxy(263,140,"Just");
outtextxy(300,140,"starts");
outtextxy(354,140,"I");
rectangle(250,180,390,192);
outtextxy(260,182,"Personal_Finance");
rectangle(250,240,390,252);
outtextxy(265,242,"Inquiry_Date");
rectangle(250,300,390,312);
outtextxy(265,302,"Phone_book");
rectangle(580,420,620,432);
outtextxy(585,422,"EXIT");
break;}
case 8: /*通讯录主界面*/
{
rectangle(250,190,390,202);
outtextxy(274,192,"Output_all");
rectangle(250,220,390,232);
outtextxy(265,222,"Inquiry_Member");
rectangle(250,250,390,262);
outtextxy(265,252,"Increase_Member");
rectangle(250,280,390,292);
outtextxy(265,282,"Deletion_Member");
rectangle(250,310,390,322);
outtextxy(273,312,"Deletes_all");
rectangle(580,420,620,432);
outtextxy(585,422,"EXIT");
rectangle(520,420,560,432);
outtextxy(525,422,"BACK");
break;}
case 7: /*万年历输出界面*/
{
setcolor(2);
rectangle(120,145,520,355);
setcolor(GREEN);
ellipse(200,90,0,360,25,15);
line(310,365,310,385);
line(285,375,310,365);
line(285,375,310,385);
line(340,365,340,385);
line(365,375,340,365);
line(365,375,340,385);
setcolor(6);
circle(237,75,15);
circle(237,105,15);
setcolor(5);
line(229,84,245,84);
line(229,84,237,64);
line(237,64,245,84);
line(229,96,245,96);
line(229,96,237,116);
line(237,116,245,96);
setcolor(RED);
circle(300,375,20);
circle(350,375,20);
setcolor(10);
ellipse(200,120,0,360,20,15);
circle(400,85,20);
setcolor(5);
ellipse(355,85,0,360,25,15);
rectangle(450,365,525,385);
setcolor(9);
ellipse(355,125,0,360,25,15);
circle(400,125,20);
setcolor(RED);
rectangle(580,420,620,432);
outtextxy(585,422,"EXIT");
rectangle(580,400,620,412);
outtextxy(585,402,"BACK");
break;
}
case 9: /*查找全部成员界面*/
{
rectangle(150,20,490,460);
rectangle(580,420,620,432);
outtextxy(585,422,"EXIT");
rectangle(580,400,620,412);
outtextxy(585,402,"BACK");
rectangle(580,380,620,392);
outtextxy(585,382,"PGDN");
rectangle(580,360,620,372);
outtextxy(585,362,"PGUP");
break;
}
}
}
int mouse_keyboard() /*判断使用键盘还是鼠标*/
{
int flag;
while(bioskey(1)==0)
{
flag=bioskey(0);
if(flag==F1)return 1; /*按F1为使用鼠标*/
else return 0; /*其他任意键为使用键盘*/
}
}
void Func_control(int *color,int *sface,int *flag,int *page,int *year,int *month) /*掌管本程序的函数调用*/
{ /* 上面指针变量分别控制--背景颜色--界面的显示--是否跳出主函数中的循环--输出全部通讯录成员时的翻页--万年历输出时的年月加减*/
int f; /*定义f选择变量.由此函数将f的值传给个主功能函数(分别为财务管理函数,万年历函数,通讯录函数)。在由主功能函数根据f的值来判断要进行的分功能*/
double i;
f=0;
switch(*sface) /*判断现在是界面几.然后确定f的值并传给界面对应的主功能函数,再由主功能函数根据f的值来判断要执行的分功能*/
{
case 1:
{
surface(color,sface);f=1; /*显示*sface所对应的界面.f等于几对应上面*sface的值,即执行什么功能.这里就是执行1界面的密码输入功能*/
if(mouse_keyboard()) /*判断使用键盘还是鼠标,鼠标和键盘同时使用搞不定...*/
click(color,sface,flag,page,year,month); /*按F1使用鼠标*/
else password(f,sface);cleardevice();break;} /*选择使用键盘就执行password函数,将f的值传给password函数*/
case 2:
{
surface(color,sface);f=2; /*以下的原理一样*/
if(mouse_keyboard())
click(color,sface,flag,page,year,month);
else password(f,sface);cleardevice();break;}
case 3:
{
surface(color,sface);f=3; /*surface函数确定要显示的界面*/
if(mouse_keyboard())
click(color,sface,flag,page,year,month);
else password(f,sface);cleardevice();break;}
case 4: /*4-主界面和8-通讯录主界面直接进行鼠标操作*/
case 8:
{surface(color,sface);
click(color,sface,flag,page,year,month);cleardevice();break;}
case 10: /*调用通讯录函数,f的值确定要执行的分功能,如下一样*/
{surface(color,sface);f=10;
if(mouse_keyboard())
click(color,sface,flag,page,year,month);
else main_phone(f,sface,page);cleardevice();break;}
case 11:
{surface(color,sface);f=11;
if(mouse_keyboard())
click(color,sface,flag,page,year,month);
else main_phone(f,sface,page);cleardevice();break;}
case 12:
{surface(color,sface);f=12;
if(mouse_keyboard())
click(color,sface,flag,page,year,month);
else main_phone(f,sface,page);cleardevice();break;}
case 13:
{surface(color,sface);f=13;
if(mouse_keyboard())
click(color,sface,flag,page,year,month);
else main_phone(f,sface,page);cleardevice();break;}
case 9: /*此为输出全部成员函数.i变量是为了产生时间差,防止鼠标连击*/
{surface(color,sface);f=9;
main_phone(f,sface,page);
for(i=0;i6000000;i++);click(color,sface,flag,page,year,month);
cleardevice();break;}
case 6:
{
surface(color,sface);f=6;
if(mouse_keyboard())
click(color,sface,flag,page,year,month);
else wannianli(f,year,month,sface);cleardevice();break;}
case 7: /*此为万年历显示函数.i变量是为了产生时间差,防止鼠标连击*/
{
f=7;
wannianli(f,year,month,sface);
surface(color,sface);for(i=0;i6000000;i++);click(color,sface,flag,page,year,month);cleardevice();break;}
case 5: /*财务管理函数.因无 分功能.无须传入f*/
{
surface(color,sface);
if(mouse_keyboard())
click(color,sface,flag,page,year,month);
else finace(sface);cleardevice();break;}
}
}
int finace(int *sface) /*财务管理函数*/
{
FILE *fp,*fa;
float total,array;
float a1,a2,a3,a4,a5,a6,a7,a8,t1,t2,b1,b2,b3,c1,c2,t;
char c,d;
fp=fopen("finace$","rb+");
fa=fopen("array","rb+");
if(fp==NULL) /*若找不到文件*/
{gotoxy(20,3);printf("No finance record,please enter you total money:");
fclose(fp);
fp=fopen("finace$","wb+"); /*兴建一个并把资金总数写入*/
scanf("%f",&total);fwrite(&total,4,1,fp);
fclose(fp);
fp=fopen("finace$","rb+");}
fread(&total,4,1,fp); /*以下的功能都很简单.不细说了*/
fread(&array,4,1,fa);
fclose(fp);
fclose(fa);
gotoxy(28,4);printf("Now you total money:%5.3f",total); /*你现在的金额数*/
gotoxy(28,5);printf("Last you have spend:%5.3f",array); /*你上次的消费*/
gotoxy(25,6);printf("Would you want to change total?(Y/N)"); /*是否要改变总金额数*/
gotoxy(38,7);scanf("%c%c",&c,&d);
if(c=='y'||c=='Y')
{
gotoxy(26,8);printf("Input you total money now:");
gotoxy(30,9);scanf("%f",&total);
}
gotoxy(24,10);printf("Please input you cost in eats today:");
gotoxy(26,11);
scanf("%f,%f,%f,%f,%f,%f,%f,%f",&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8);
t1=a1+a2+a3+a4+a5+a6+a7+a8;
gotoxy(33,12);printf("Eats cost:%5.3f",t1);
gotoxy(24,14);printf("Please input you cost in others totay:");
gotoxy(27,15);scanf("%f,%f,%f",&b1,&b2,&b3);
t2=b1+b2+b3;
gotoxy(33,16);printf("Other cost:%5.3f",t2);
gotoxy(24,18);printf("Please input you increase in totay:");
gotoxy(28,19);scanf("%f,%f",&c1,&c2);
t=t1+t2;
gotoxy(28,22);printf("Today you have cost:%5.3f",t);
gotoxy(26,25);printf("Now you total money:");
total=total+c1+c2-t;
gotoxy(28,26);printf("%5.4f",total);
fp=fopen("finace$","wb+");
fa=fopen("array","wb+");
fwrite(&total,4,1,fp);
fwrite(&t,4,1,fa);
fclose(fp);
fclose(fa);
getch();
*sface=4;
}
int password(int f,int *sface) /*密码程序*/
{
FILE *fp;
char s1[20],s2[20],ch,x=26; /* x变量没有起到我想它起的作用...大家当没看见它吧...*/
int i;
if(f==1) /*密码输入界面*/
{
x=26;
gotoxy(26,10);printf("Please enter password:");
gotoxy(26,11);
fp=fopen("password","rb+");
fread(&s2,20,1,fp);
i=0;
ch=getch();
while(ch!=0xd) /*此循环这么罗嗦的目的就是为了隐式密码输入*/
{ /*按回车键结束输入*/
s1=ch;x++;
switch(ch)
{
case 0x8:if(x26)printf("b b");s1=' ';i=i-2;x--;break; /*当按退格键时*/
default :printf("*"); /*退格以外的都输出*号*/
}
ch=getch();
i++;
}
s1=' '; /*字符串结束*/
if(strcmp(s1,s2)==0) /*如果密码正确*/
*sface=4; /*进入主界面*/
else /*输出密码错误*/
{gotoxy(26,13);printf("Password mistake");getch();} /*getch()都是为了能够看见结果*/
fclose(fp);
}
else if(f==2) /*设定密码界面*/
{
x=26;
if((fp=fopen("password","rb+"))==NULL) /*如果打开password文件返回空指针.证明没设密码,提示设定密码*/
{
fclose(fp);
gotoxy(26,13);
printf("Please set your password:");
gotoxy(26,14);
fp=fopen("password","wb+");
i=0;
ch=getch();
while(ch!=0xd) /*隐式密码输入*/
{
x++;
s1=ch;
switch(ch)
{
case 0x8:if(x26)printf("b b");s1=' ';i=i-2;x--;break;
default :printf("*");
}
ch=getch();
i++;
}
s1=' '; /*应该手动赋于' '*/
fwrite(&s1,20,1,fp);*sface=1; /*写入文件后返回密码输入界面*/
fclose(fp);
}
else {gotoxy(24,13);printf("Error.You have set password already.");*sface=1;getch();} /*若检测到password文件已经存在,提示已有密码,不能设定*/
}
else if(f==3) /*修改密码界面*/
{
x=26;
fp=fopen("password","rb+");
fread(&s2,20,1,fp);
fclose(fp);
gotoxy(26,11);
printf("Inputs your present password:");
gotoxy(26,12);
i=0;
ch=getch(); /*同上面的*/
while(ch!=0xd)
{
x++;
s1=ch;
switch(ch)
{
case 0x8:if(x26)printf("b b");s1=' ';i=i-2;x--;break;
default :printf("*");
}
ch=getch();
i++;
}
s1=' ';
i=0;
if(strcmp(s1,s2)==0) /*如果输入的原密码正确.提示输入新密码*/
{gotoxy(26,13);printf("Inputs password which you wants to revise:");
gotoxy(26,14);
ch=getch();
while(ch!=0xd)
{
x++;
s1=ch;
switch(ch)
{
case 0x8:if(x26)printf("b b");s1=' ';i=i-2;x--;break;
default :printf("*");
}
ch=getch();
i++;
}
s1=' ';
*sface=1; /* *sface=1 准备返回输入密码界面*/
fp=fopen("password","wb+"); /*将新密码写入文件中*/
fwrite(&s1,20,1,fp);
fclose(fp);
}
else
{gotoxy(26,13);printf("Password mistake");*sface=1;getch();} /*原密码不正确也返回界面1*/
}
}
struct member *inq(struct member *head,int *sface) /*查找通讯录成员*/
{
char s[20],temp[20];
struct member *p1;
int ff=0;
p1=head;
if(head==NULL)printf("error");
gotoxy(26,6);
printf("Please input the person or the number");
gotoxy(26,7);
printf("which you wants to inquire");
gotoxy(27,8);
scanf("%s",s);
if(strcmp(s,":")0) /*如果输入的是数字*/
{
do
{
strcpy(temp,p1-phone); /*就在号码中查找匹配的*/
if(strcmp(s,temp)==0)
{gotoxy(24,10);printf("Name: %s",p1-name);
gotoxy(24,11);printf("Sex: %s",p1-sex);
gotoxy(24,12);printf("Relat: %s",p1-relat);
gotoxy(24,13);printf("Email: %s",p1-email);
gotoxy(24,14);printf("Phone: %s",p1-phone);
ff=1; /*ff=1表示已经找到了*/
*sface=8; /*准备返回界面8--通讯录主界面*/
getch();
break;
}
else p1=p1-next;
}while(p1!=NULL);
}
else if(strcmp(s,":")0) /*如果输入的是名字*/
{
do
{
strcpy(temp,p1-name); /*在姓名中查找匹配的*/
if(strcmp(s,temp)==0) /*找到了*/
{gotoxy(24,10);printf("Name: %s",p1-name);
gotoxy(24,11);printf("Sex: %s",p1-sex);
gotoxy(24,12);printf("Relat: %s",p1-relat);
gotoxy(24,13);printf("Email: %s",p1-email);
gotoxy(24,14);printf("Phone: %s",p1-phone);
ff=1;
*sface=8; /*准备返回界面8--通讯录主界面*/
getch();
break;
}
else p1=p1-next;
}while(p1!=NULL);
}
if(ff==0){gotoxy(26,13);printf("Error,cannot find");getch();*sface=8;} /*没找到*/
return head;
}
struct member *add(struct member *head,int *sface) /*增加通讯录成员*/
{
struct member *ad,*p1,*p2;
ad=(struct member*)malloc(LEN);
if(head==NULL)printf("Error");
gotoxy(20,8);printf("Inputs member which you wants to increase:");
gotoxy(25,10);printf("Name: ");scanf("%s",ad-name);
gotoxy(25,11);printf("Sex: ");scanf("%s",ad-sex);
gotoxy(25,12);printf("Relat: ");scanf("%s",ad-relat);
gotoxy(25,13);printf("Email: ");scanf("%s",ad-email);
gotoxy(25,14);printf("Phone: ");scanf("%s",ad-phone);
p1=head;
if(head==NULL) /*都是谭好强的算法.在这就不抢他老人家的饭碗了*/
{head=ad;ad-next=NULL;}
else
{while((strcmp(ad-name,p1-name)0)&&(p1-next!=NULL))
{p2=p1;
p1=p1-next;}
if(strcmp(ad-name,p1-name)=0)
{if(head==p1)head=ad;
else p2-next=ad;
ad-next=p1;}
else
{p1-next=ad;ad-next=NULL;}
}
gotoxy(26,17);printf("Increase successfully");getch(); /*增加成功*/
*sface=8;
return head;
}
struct member *del(struct member *head,int *sface) /*删除成员函数*/
{
char s[20],temp[20];
struct member *p1,*p2;
p1=head;
gotoxy(26,8);
printf("Please input the person or the number");
gotoxy(26,9);
printf("which you wants to deletion");
gotoxy(26,10);
scanf("%s",s);
if(strcmp(s,":")0) /*如果输入的是数字*/
{
while(strcmp(s,p1-phone)!=0&&p1-next!=NULL) /*依旧是老谭的算法,c程序设计3版的*/
{p2=p1;p1=p1-next;}
if(strcmp(s,p1-phone)==0)
{if(p1==head)head=p1-next;
else p2-next=p1-next;
gotoxy(26,13);printf("Deletes successfully");getch(); /*删除成功*/
}
else {gotoxy(26,13);printf("Error,cannot find");getch();} /*没找到*/
}
else if(strcmp(s,":")0) /*如果输入的是名字*/
{
while(strcmp(s,p1-name)!=0&&p1-next!=NULL)
{p2=p1;p1=p1-next;}
if(strcmp(s,p1-name)==0)
{if(p1==head)head=p1-next;
else p2-next=p1-next;
gotoxy(26,13);printf("Deletes successfully");getch();
}
else {gotoxy(26,13);printf("Error,cannot find");getch();}
}
*sface=8; /*回通讯录主界面*/
return head;
}
int main_phone(int f,int *sface,int *page) /*通讯录主调用函数,写的时候烦...所以写的有点乱*/
{
struct member *head,*p1,*p2;
struct member pho[100]; /*建立结构体数组做全体输出时的中转作用,本来尝试的是动态存储,但测试效果都不尽人意*/
FILE *fp;
int i=0,y,n;
char c,c1;
char file1[10];
y=3;
strcpy(file1,"phone1"); /*为删除文件做准备*/
fp=fopen("phone1","rb+"); /*打开文件*/
if(fp==NULL) /*如果原文件为空*/
{fclose(fp);fp=fopen("phone1","wb+");fputc('',fp);fclose(fp);fp=fopen("phone1","rb+");}
head=p1=(struct member *)malloc(LEN); /*开辟写结点.老谭的算法,我的思路*/
fread(head,90,1,fp); /*将文件中的内容写如p1为地址的结点中*/
while(!feof(fp))
{
p2=p1;
p1=(struct member *)malloc(LEN); /*开辟新结点*/
fread(p1,90,1,fp); /*将文件中的内容写如p1为地址的结点中*/
if(strcmp(p1-name,"A")=0&&strcmp(p1-name,"z") =0) /*这都为输出全部成员时做的准备.若不要这个功能.pho结构体数组可以不要*/
{
strcpy(pho.name,p1-name);
strcpy(pho.sex,p1-sex);
strcpy(pho.relat,p1-relat);
strcpy(pho.email,p1-email);
strcpy(pho.phone,p1-phone);
i++;
}
p2-next=p1; /*完成链表的成链*/
}
p1-next=NULL; /*防止p1-next乱指*/
fclose(fp);
if(f==10) /*调用查询成员函数,传入链表首地址*/
head=inq(head,sface);
else if(f==11) /*调用增加成员函数,传入链表首地址*/
head=add(head,sface);
else if(f==12) /*调用增加成员函数,传入链表首地址*/
head=del(head,sface);
else if(f==9) /*输出全部成员函数*/
{
gotoxy(9,2);printf("Page:%d",*page);
i=(*page-1)*4; /* *page指针变量控制页面值 */
for(n=0;n4;n++) /* i值控制第几个结构体数组的输出,一页输出4个成员的信息*/
{
gotoxy(21,y++);printf("Name: %s",pho.name);
gotoxy(21,y++);printf("Sex: %s",pho.sex);
gotoxy(21,y++);printf("Relat: %s",pho.relat);
gotoxy(21,y++);printf("Email: %s",pho.email);
gotoxy(21,y++);printf("Phone: %s",pho.phone);
i++;
y++;
}
*sface=9; /*准备进入输出全部成员界面*/
}
/*将处理好的链表重新存入原文件中.下次调用时就是上一次调用的结果*/
fp=fopen("phone1","wb+");
p1=head;
do
{fwrite(p1,90,1,fp);
p1=p1-next;
}while(p1!=NULL);
fclose(fp);
if(f==13) /*删除全部成员*/
{
gotoxy(24,13);printf("Whether deletes the complete record?(Y/N)");
gotoxy(35,14);scanf("%c%c",&c1,&c);
if(c=='y'||c=='Y')
{
if(remove(file1)==-1) /*删除文件*/
{gotoxy(26,16);printf("Deletes fail");getch();}
else {gotoxy(26,16);printf("Deletes successfully");getch();}
}
*sface=8;
}
}
int wannianli(int f,int *year,int *month,int *sface)
{
void biaoge(int hh,int td[],int day,int mm,int tt); /*用于输出月历的函数*/
int ye,t,mo,i,nn,hh,mm,td[32],tt;
long int d,m,n,sum=0,data1;
static int day;
sum=m=nn=n=d=0;
if(f==6)
{
gotoxy(20,13);printf("Please input the date which you wants to inquire:");
gotoxy(23,14);printf("For example:2006 12 2");
gotoxy(24,15);
scanf("%d%d%d",&ye,&mo,&day);
*year=ye;
*month=mo;
*sface=7;
}
else if(f==7)
{
if(*year12)
t=*year;
else if(*year=12)
t=*year%12;
switch(t) /*判断该年的属相*/
{
case 0:gotoxy(59,24);printf("Monkey");break;
case 1:gotoxy(59,24);printf("Chicken");break;
case 2:gotoxy(59,24);printf(" Dog");break;
case 3:gotoxy(59,24);printf(" Pig");break;
case 4:gotoxy(59,24);printf(" Mouse");break;
case 5:gotoxy(59,24);printf(" Cow");break;
case 6:gotoxy(59,24);printf(" Tiger");break;
case 7:gotoxy(59,24);printf("Rabbit");break;
case 8:gotoxy(59,24);printf("Dragon");break;
case 9:gotoxy(59,24);printf(" Snake");break;
case 10:gotoxy(59,24);printf(" Horse");break;
case 11:gotoxy(59,24);printf(" Sheep");break;
}
if((*year%4==0&&*year%100!=0)||*year%400==0) /*如果是闰年*/
{
switch(*month)
{case 1:d=day;for(i=0;i31;i++){td=i+1;tt=i+1;}break; /*这是总天数的计算以便后边输出月历*/
case 2:d=day+31;for(i=0;i29;i++){td=i+1;tt=i+1;}break;
case 3:d=day+59;for(i=0;i31;i++){td=i+1;tt=i+1;}break;
case 4:d=day+90;for(i=0;i30;i++){td=i+1;tt=i+1;}break;
case 5:d=day+120;for(i=0;i31;i++){td=i+1;tt=i+1;}break;
case 6:d=day+151;for(i=0;i30;i++){td=i+1;tt=i+1;}break;
case 7:d=day+181;for(i=0;i31;i++){td=i+1;tt=i+1;}break;
case 8:d=day+212;for(i=0;i31;i++){td=i+1;tt=i+1;}break;
case 9:d=day+243;for(i=0;i30;i++){td=i+1;tt=i+1;}break;
case 10:d=day+273;for(i=0;i31;i++){td=i+1;tt=i+1;}break;
case 11:d=day+304;for(i=0;i30;i++){td=i+1;tt=i+1;}break;
case 12:d=day+334;for(i=0;i31;i++){td=i+1;tt=i+1;}break;}}
else
{ /*如果不是闰年*/
switch(*month)
{case 1:d=day;for(i=0;i31;i++){td=i+1;tt=i+1;}break;
case 2:d=day+31;for(i=0;i28;i++){td=i+1;tt=i+1;}break;
case 3:d=day+59;for(i=0;i31;i++){td=i+1;tt=i+1;}break;
case 4:d=day+90;for(i=0;i30;i++){td=i+1;tt=i+1;}break;
case 5:d=day+120;for(i=0;i31;i++){td=i+1;tt=i+1;}break;
case 6:d=day+151;for(i=0;i30;i++){td=i+1;tt=i+1;}break;
case 7:d=day+181;for(i=0;i31;i++){td=i+1;tt=i+1;}break;
case 8:d=day+212;for(i=0;i31;i++){td=i+1;tt=i+1;}break;
case 9:d=day+243;for(i=0;i30;i++){td=i+1;tt=i+1;}break;
case 10:d=day+273;for(i=0;i31;i++){td=i+1;tt=i+1;}break;
case 11:d=day+304;for(i=0;i30;i++){td=i+1;tt=i+1;}break;
case 12:d=day+334;for(i=0;i31;i++){td=i+1;tt=i+1;}break;}}
gotoxy(24,6);printf("Year"); /*在相应的方框里输出年月日*/
gotoxy(43,6);printf("Month");
gotoxy(44,8);printf("Day");
gotoxy(24,8);printf("%3d",*year);
gotoxy(50,6);printf("%2d",*month);
gotoxy(50,8);printf("%2d",day);
if((*year%4==0&&*year%100!=0)||*year%400==0)
{if(*month2)n=d+1;else n=d;}
else n=d; /*n是该日为该年的第几天*/
if(*year0)
{
for(i=1;i*year;i++)
{
if((i%4==0&&i%100!=0)||i%400==0) /*如果是闰年就加366天否则加上365天*/
m=366;
else m=365;
sum=sum+m;
} /*sum是从1年1月1号开始计算的总天数*/
sum=n+sum;
data1=sum-day; /*data1是为了判断该月第一天是星期几,后面输出月历时能判断该月1号应该对齐的星期*/
if(sum7)
nn=sum;
else nn=sum%7;
switch(nn) /*判断是星期几*/
{
case 1:gotoxy(33,9);printf("Monday");break;
case 2:gotoxy(33,9);printf("Tuesday");break;
case 3:gotoxy(33,9);printf("Wendesday");break;
case 4:gotoxy(33,9);printf("Thursday");break;
case 5:gotoxy(33,9);printf("Friday");break;
case 6:gotoxy(33,9);printf("Saterday");break;
case 0:gotoxy(33,9);printf("Sunday");break;
}
}
gotoxy(19,13);printf("Sun Mon Tue Wen Thu Fri Satn");
nn=data1%7;
switch(nn) /*判断该月的一天是星期几*/
{
case 0:hh=20;mm=5;biaoge(hh,td,day,mm,tt);break;
case 1:hh=27;mm=4;biaoge(hh,td,day,mm,tt);break;
case 2:hh=34;mm=3;biaoge(hh,td,day,mm,tt);break;
case 3:hh=41;mm=2;biaoge(hh,td,day,mm,tt);break;
case 4:hh=48;mm=1;biaoge(hh,td,day,mm,tt);break;
case 5:hh=55;mm=0;biaoge(hh,td,day,mm,tt);break;
case 6:hh=13;mm=6;biaoge(hh,td,day,mm,tt);break;
}
*sface=7; /*输入结束后自动进入万年历输出界面*/
}
}
void biaoge(int hh,int td[],int day,int mm,int tt) /*输出月历,具体的格子计算我也说不清了*/
{
int i;
for(i=1;i=hh;i++)
{printf(" ");}
for(i=0;itt;i++) /*下面的格式完全是为了与界面7中画好的图形相匹配*/
{
if(td!=day)
printf("%7d",td);
else if(td==day)
printf(" 01");
if(i==mm)printf("n ");
else if((i-mm)%7==0)printf("n ");
else if(i==tt-1)printf("n ");
}
}
void main() /*主函数*/
{
FILE *fc; /*存储颜色的文件*/
int *color,cl=9,*sface,sur=1,f=1,p=1,*flag,yea=2006,mon=12;
int *page,*year,*month; /*通讯录全部输出时page控制翻页 万年历输出时year和month控制年月的变化*/
year=&yea; /*对全部指针变量进行初始化*/
month=&mon;
page=&p;
sface=&sur;
flag=&f;
color=&cl;
fc=fopen("color","r+"); /*读入上一次的背景颜色*/
*color=getw(fc);
fclose(fc);
graph(); /*启动图形驱动*/
setbkcolor(*color); /*可有可无...*/
do
{
Func_control(color,sface,flag,page,year,month);
}while(*flag); /*直到点击eixt令*flag=0 使跳出循环*/
fc=fopen("color","w+"); /*存储这一次的背景颜色*/
putw(*color,fc);
fclose(fc);
closegraph(); /*关闭图形驱动*/
}
/*都12点半了.因为明天整天课,赶着睡觉,也没写注释的经历,就想到什么就写什么.所以不知道上面写的注释是不是太过零乱或者有点罗嗦,还请各位前辈多多指教,指正*/
楼主 2016-02-12 15:20 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知