签到

06月21日
尚未签到

共有回帖数 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 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知