【数据结构课程大作业】通信录管理系统
该软件为本人数据结构课程设计作业,采用win32控制台程序,基于链表的增删改查,可供计算机专业在校大学生作为数据结构课程设计参考
每次使用需输入密码,初始密码为:123。可在软件主界面选择修改密码功能修改密码。具体功能如下:
1输入信息。用来输入联系人的姓名与号码,当输入# #时表示结束。例如
htq 1234567
hq 123456789
# #则
htq 1234567
hq 123456789
这两行信息将存入内存。
若输入
htq 1234567
# #
则
htq 1234567
这一行信息将存入内存。
若要保存到本地文件中,则可选择功能模块5保存信息
2显示信息。用来显示本地文件中已保存的信息
3查找信息。当忘记了某个联系人的号码时,可以通过此功能输入联系人的姓名来查找对应的号码
4删除信息。删除某个联系人的信息。
5保存信息。将输入内存中的联系人信息保存至本地的文件中。
6查看信息。调用windows本地的记事本程序打开保存至本地的联系人文件fp。
7修改密码。用来修改本软件初始界面中需要输入的密码。
8退出。 退出使用本软件。
具体代码如下:
# include <stdio.h> # include<conio.h> # include<stdlib.h> # include<windows.h> # include<string.h> typedef struct Node { char name[7]; char number [11]; struct Node * prior, * pnext; }Node, * linklist; void save(linklist phead) { // char fname[17]; FILE *fp; linklist pnew=phead->pnext; if((fp=fopen("fp","a+"))==NULL) { printf("文件打开失败!\n"); } else { while(pnew!=NULL) { fprintf(fp,"%s %s \t",pnew->name,pnew->number); pnew=pnew->pnext; } printf("\t保存成功\n"); //MessageBox(NULL,"保存成功","提示",MB_OK); fclose(fp); } } void look() { // system("Notepad /*E:\\调试\\通信录管理系统\\通信录管理系统\\*/fp "); system("Notepad fp "); } linklist enter() { char name[7]; char number[15]; int i=0; linklist phead=(linklist)malloc(sizeof(Node)); linklist ptail=phead; phead->pnext=NULL; while(1) { printf("\t请输入姓名与电话号码(以#结束)\n"); //MessageBox(NULL,"请输入姓名与电话号码(以#结束)","提示",MB_OK); scanf("%s %s",name,number); if(strcmp(name,"#")==0) break; else { linklist pnew=(linklist)malloc(sizeof(Node)); strcpy(pnew->name,name); strcpy(pnew->number,number); ptail->pnext=pnew; pnew->prior=ptail; pnew->pnext=NULL; ptail=pnew; } } return phead; } void display(linklist phead) { linklist p=phead->pnext; //printf("\t姓名 号码\n"); //char a[1000]; if(p==NULL) { printf("您目前联系人为空,赶快去添加吧!\n"); } // char c[20]; // wsprintf(c,"号码%s",p->number); // MessageBox(NULL,TEXT("姓名 号码"),TEXT("我的联系人"),MB_OK); while(p!=NULL) { //wsprintf(a,"姓名:%s 号码:%s",p->name,p->number); //MessageBox(NULL,a,TEXT("我的联系人"),MB_OK); printf("\t%s %s\n",p->name,p->number); p=p->pnext; } } void search(linklist phead) { linklist ptemp=phead->pnext; char name[7]; if(ptemp==NULL) { printf("您目前联系人为空!赶快去添加吧!\n"); return; } printf("\t请输入要查找的人的名字\n"); // MessageBox(NULL,"请输入要查找的人的名字","提示",MB_OK); l: scanf("%s",name); while(1) { if(ptemp==NULL) { printf("您输入的联系人不存在,请您核对后重新输入\n"); ptemp=phead->pnext; goto l; } if(strcmp(ptemp->name,name)==0) { printf("号码为%s",ptemp->number); return; } else { ptemp=ptemp->pnext; } } } int dellink(linklist phead)//如果定义的是双链表删除函数要分类讨论 { char name[7]; linklist ptemp=phead->pnext; if(ptemp==NULL) { printf("您目前联系人为空,赶快去添加吧!\n"); return 0; } printf("\t请输入要删除的人的名字\n"); //MessageBox(NULL,"请输入要删除的人的名字","提示",MB_OK); l: scanf("%s",name); while(strcmp(ptemp->name,name)!=0) { ptemp=ptemp->pnext; if(ptemp==NULL) { printf("您输入的联系人不存在,请您核对后重新输入!\n"); ptemp=phead; goto l; } } ptemp->prior->pnext=ptemp->pnext; //ptemp->pnext->prior=ptemp->prior; free(ptemp); // MessageBox(NULL,"删除成功!","提示",MB_OK); printf("删除成功!\n"); return 1; } char password[4];//="123";//字符串数组只能在初始化的时候一次性赋值,其余的时候必须单个赋值 void xg() { char a1[7]; char a2[7]; char a3[7]; printf("请输入当前密码!\n"); fflush(stdin); label1: gets(a3); if(strcmp(password,a3)!=0) { printf("密码不正确!请重新输入!\n"); goto label1; } else printf("请输入新密码!\n"); fflush(stdin); label:gets(a1); printf("请再次输入新密码!\n"); fflush(stdin); gets(a2); if(strcmp(a1,a2)!=0) { printf("您两次输入的密码不一致!请重新输入!\n"); goto label; } else { FILE *fp; if((fp=fopen("密码.txt","r+"))!=NULL) { fputs(a1,fp); fclose(fp); printf("修改密码成功!\n"); } //strcpy(password,a1); //printf("修改密码成功!\n"); else { printf("文件打开失败!密码修改不成功!\n"); } } } void main() { char a[7]; FILE *fp; //static char password[7]="123"; int i,count=0; printf("请输入密码!\n"); printf("================\n"); printf("= =\n"); printf("================\n"); COORD pos; pos.X=2; pos.Y=2; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); //LABEL: gets(a); LABEL: { for(i=0;i<7;i++) { a[i]=getch(); if(a[i]=='\x0d') break; printf("*"); } a[i]='\0'; printf("\n"); } if((fp=fopen("密码.txt","r"))!=NULL) { fgets(password,4,fp); if(strcmp(a,password)!=0) { count++; if(count==3) { printf("您已连续3次输错密码!请在1分钟后重新输入\n"); //outtext("您已连续3次输错密码!请在1分钟后重新输入\n"); Sleep(1000*60); goto LABEL; } printf("您输入的密码不正确!请重新输入!\n"); //outtext("您输入的密码不正确!请重新输入!\n"); goto LABEL; } else { printf("\n密码正确!欢迎使用!\n"); } } else { printf("\n获取密码失败,请您稍后重新输入!\n"); goto LABEL; } Sleep(1000); system("cls"); //initgraph(1024,960); //loadimage(NULL,"46.jpg"); //getch(); //closegraph(); //Sleep(1000); //system("cls"); linklist phead=(linklist)malloc(sizeof(Node)); phead->pnext=NULL; int n; //DWORD a; COORD POS; POS.X=7; POS.Y=0; // SetConsoleTitle("通信录管理系统"); //initgraph(640,480); // loadimage(NULL,"C:\\Users\\Administrator\\Desktop\\46.jpg"); // rectangle(28,0,520,200); //closegraph(); //Sleep(2000); //SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE); // FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_GREEN,480,POS,&a); SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),POS); printf("\t\t欢迎使用通信录管理系统\n"); printf("\t■■■■■■■■■■■■■■■■■■■■■\n"); printf("\t■"); printf("\t1.输入信息 2.显示信息");printf(" \t■\n"); printf("\t■"); printf("\t3.查找信息 4.删除信息");printf(" \t■\n"); printf("\t■"); printf("\t5.保存信息 6.查看信息");printf(" \t■\n"); printf("\t■"); printf("\t7.修改密码 8.退出 ");printf(" \t■\n"); printf("\t■■■■■■■■■■■■■■■■■■■■■\n"); //Sleep(1000*27); //closegraph(); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|/*FOREGROUND_BLUE|*/FOREGROUND_RED|FOREGROUND_GREEN); while(1) { printf("\t请选择功能模块\n"); scanf("%d",&n); switch(n) { case 1:phead=enter();break; case 2:display(phead);break; case 3:search(phead);break; case 4:if(dellink(phead))display(phead);/*printf("删除成功!\n");*/break; case 5:save(phead);break; case 6:look();break; case 7:xg();break; case 8:exit(1); } } }软件运行截图如下:
软件启动界面 密码输入正确提示信息界面
程序主界面如下:
输入显示信息界面如下: 查找与删除信息界面如下:
修改密码界面如下:
具体运行过程可点击链接自行下载体验。