共有回帖数  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号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知