通过本实例,希望对C语言编程初学者有所帮助。至少可以学习到以下方面:
1 菜单操作;
2 指针;
3 结构体 ;
4 链表;
5 文件操作:新建,修改,追加,读取;
6 函数调用,接口;
7 数组;
8 排序;
9 良好的窗口提示...
-----------------------------------------------------------
/* Note:Your choice is C IDE
环境:Turbo C for Windows 2007.5
存放路径:D:\InfoMsys
项目:龙丘科技有限公司员工通讯录系统
作者:邱钊鹏
E-mail:chiusir@yahoo.cn
软件版本:V1.0.1
最后更新:2008年8月13日
淘宝店:http://shop36265907.taobao.com/
*/
#i nclude <stdio.h>
#i nclude <stdlib.h>
#i nclude <string.h>
#i nclude <conio.h>
#define MaxRec 2001 //通讯录数目,自己可以适当增加或者减少
#define RecPerPg 5
struct student
{
char ID[6];
char name[20];
char cell[13];
char b1cell[13];
char QQ[12];
char MSN[40];
char email[40];
char otel[20];
char b1otel[20];
char htel[14];
char haddr[40];
char backup[40];
};
/* 以下是函数原型说明,被调函数的定义在主调函数后面时,要加此部分 */
void PintMenu(void);
void ConInsRec(void);
void ViewRec(void);
void SearchRec(void);
void ModifyRec(void);
int ModifyOne(char tempnum[]);
void InsertRec(void);
void DeleteRec(void);
void SortRec(void);
int AppendFun(int maxid);
int ConfirmID(char *pf,char In_Arr[],int cnt)
{
char tmarr[40]="",tmch;
do{
printf(" %s",pf);
gets(tmarr);
if((atoi(tmarr)>0)&&(atoi(tmarr)<2001) ) break;
else
{
printf("\n ID应为1~2000,要退出吗(Y-退出/N-返回)?");
putch(tmch=getch());
if((tmch==\'y\')||(tmch==\'Y\')||(tmch==27)) return 1;
}
if(strlen(tmarr)>cnt-1)
{
printf("\n 长度(1~%d)不符合要求!\n",cnt-1);
}
else if(strcmp(tmarr,"")==0)
{
printf("\n ID应为1~2000,要退出吗(Y-退出/N-返回)?");
putch(tmch=getch());
if((tmch==\'y\')||(tmch==\'Y\')||(tmch==27)) return 1;
}
}while(strlen(tmarr)>cnt-1);
sprintf(tmarr,"%04d",atoi(tmarr));
strcpy(In_Arr,tmarr);
return 0;
}
int ConfirmName(char *pf,char In_Arr[],int cnt)
{
char tmarr[40]="",tmch;
do{
printf(" %s",pf);
gets(tmarr);
if(strlen(tmarr)>cnt-1)
{
printf("\n 长度(1~%d)不符合要求!\n",cnt-1);
}
else if(strcmp(tmarr,"")==0)
{
printf("\n 姓名为空,要退出吗(Y-退出/N-返回)?");
putch(tmch=getch());
if((tmch==\'y\')||(tmch==\'Y\')||(tmch==27)) return 1;
}
}while(strlen(tmarr)>cnt-1);
strcpy(In_Arr,tmarr);
return 0;
}
void ConfirmArr(char *pf,char In_Arr[],int cnt)
{
char tmarr[250]="";
do{
printf(" %s",pf);
gets(tmarr);
if(strcmp(tmarr,"")==0||strlen(tmarr)>cnt-1)
{
printf("\n 长度(1~%d)不符合要求!\n",cnt-1);
}
}while((strlen(tmarr)>cnt-1)||(strlen(tmarr)==0));
strcpy(In_Arr,tmarr);
return ;
}
int ConfirmSel(void)
{
char tmarr[3]="",sel=0;
do{
if((tmarr[sel]=getch())==13) break;
putch(tmarr[sel++]);
}while(strlen(tmarr)<2);
return (atoi(tmarr));
}
int ConfirmPW(char In_Arr[])
{
char tmarr[15]="",errflag=0,sel=0;
printf("\n\n\n 请输入登陆密码(ESC退出):");
do{
if((tmarr[sel]=getch())==27) exit(0);
putch(\'*\');
if((sel<strlen(In_Arr))&&(tmarr[sel]!=In_Arr[sel]))
errflag=1;
else if((sel==(strlen(In_Arr)-1))&&(errflag==0))
return 0;
/*printf("\nstrlen(In_Arr)=%d,tmarr[sel]=%c,strlen(tmarr)=%d",strlen(In_Arr),tmarr[sel],strlen(tmarr)); */
++sel;
}while(strlen(tmarr)<12);
return 1;
}
/*延时函数*/
void delay_s(unsigned int s)
{
int ii,jj,sel;
for(ii=0;ii<s;ii++)
for(sel=0;sel<10000;sel++)/*参数根据计算速度适当加减*/
for(jj=0;jj<20000;jj++); /*此处使用酷睿2双核2.4G,800M前端总线频率*/
}
/*==================main()=====================*/
void main(void)
{
char sel=0,yes_no=0,ErrorCnt=0;
char password[12]="2008";//此处设置系统密码,长度可以自己修改
FILE *fp;
//clrscr();
printf("\n\n\n\n\n\n");
printf("\n !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ");
printf("\n ! ! ");
printf("\n ! 欢迎使用个人通讯录通讯录系统 ! ");
printf("\n ! ! ");
printf("\n ! 作者:邱钊鹏 ! ");
printf("\n ! 版本:V1.0.1 ! ");
printf("\n ! 2008年08月13日 ! ");
printf("\n ! chiusir@yahoo.cn ! ");
printf("\n !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ");
while(ErrorCnt<3)
{
if(ConfirmPW(password)==0) break;
if(++ErrorCnt>0)
{
printf("\n 您第%d次输入的密码错误,请重试!",ErrorCnt);
}
if(ErrorCnt>=3)
{
printf("\n 您连续三次输入的密码错误,10分钟后重试!");
delay_s(3);
exit(0);
}
delay_s(1);
};
printf("\n 恭喜,输入密码正确!");
delay_s(1);
fp=fopen("longqiu.dat","r+");
if(fp==NULL)
{
printf("\n 打开文件失败!\n 正在创建新文件...\n");
fp=fopen("longqiu.dat","w+");
printf("\n 写入第一个样板记录...\n");
delay_s(1);
fprintf(fp,"0001 邱钊鹏 13820080808 13620080808 88888888 chiusir@yahoo.cn chiusir@yahoo.cn 010-67396661-8415 010-67396661-8415 0377-20080808 北京工业大学电动车技术研究中心 欢迎报考北京工业大学研究生 ");
}
if(fp!=NULL) fclose(fp);
while(1)
{
PintMenu(); /* 显示主菜单 */
printf("\n 请选择0~7(Q/ESC-退出系统):");
putch(sel=getch());
switch(sel)
{
case \'1\': SearchRec(); break; /* 显示,正常 */
case \'2\': ViewRec(); break; /* 查询,正常 */
case \'3\': InsertRec(); break; /* 添加,正常 */
case \'4\': ConInsRec(); break; /* 创建,正常 */
case \'5\': ModifyRec(); break; /* 修改,正常 */
case \'6\': SortRec(); break; /* 排序,正常 */
case \'7\': DeleteRec(); break; /* 删除,正常 */
case 27:
case \'0\':
case \'Q\':
case \'q\':
{
printf("\n 要继续操作吗(Q/ESC-退出系统/其他键-返回)?-->");
putch(yes_no=getch());
if((yes_no==\'q\')||(yes_no==\'Q\')||(yes_no==27)) exit(0);
}
break;
default:
printf("\n %c为非法选项!(Q/ESC-退出系统/其他键-返回)\n",sel);
delay_s(1);
break;
}
}
}
void PintMenu(void) /* 显示菜单界面 */
{
//clrscr();
printf("\n\n\n\n");
printf("\n !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ");
printf("\n ! 龙丘科技有限公司员工通讯录系统 ! ");
printf("\n !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ");
printf("\n |----------------------------| ");
printf("\n | 请输入选项编号(0-7): | ");
printf("\n |----------------------------| ");
printf("\n | 1--查询记录 | ");
printf("\n | 2--查看全部记录 | ");
printf("\n | 3--添加记录 | ");
printf("\n | 4--连续添加记录 | ");
printf("\n | 5--修改记录 | ");
printf("\n | 6--记录排序 | ");
printf("\n | 7--删除记录 | ");
printf("\n | 0--(Q或ESC)退出系统 | ");
printf("\n |----------------------------|\n");
}
/* 定义创建信息管理系统的函数 */
void ConInsRec()
{
int n=0,maxid=0;
struct student temp;
FILE *fp;
fp=fopen("longqiu.dat","r+");
if(fp==NULL)
{
printf("\n 打开文件失败!\n");
return;
}
while(feof(fp)==0)
{
fscanf(fp,"%6s%20s%13s%13s%12s%40s%40s%20s%20s%14s%40s%40s\n",&temp.ID,&temp.name,&temp.cell,&temp.b1cell,&temp.QQ,&temp.MSN,&temp.email,&temp.otel,&temp.b1otel,&temp.htel,&temp.haddr,&temp.backup);
n++;
maxid=((atoi(temp.ID)>maxid)?atoi(temp.ID):maxid);
}
fclose(fp);
printf("\n 总共有%d条记录,最大ID为%04d.",n,maxid);
while(1)
{
if(AppendFun(maxid)) break;
++maxid;
}
}
int AppendFun(int maxid)
{
char c;
int n=0;
struct student temp,record[MaxRec],*p;
FILE *fp;
fp=fopen("longqiu.dat","r+");
if(fp==NULL)
{
printf("\n 打开文件失败!\n");
return 1;
}
p=record;
while(feof(fp)==0)
{
fscanf(fp,"%6s%20s%13s%13s%12s%40s%40s%20s%20s%14s%40s%40s\n",p->ID,p->name,p->cell,p->b1cell,p->QQ,p->MSN,p->email,p->otel,p->b1otel,p->htel,p->haddr,p->backup);
p++;
n++;
}
fclose(fp);
printf("\n 请输入第%d个记录,ID为%04d:\n",1+n,1+maxid);
sprintf(temp.ID,"%04d",1+maxid);
if(ConfirmName("请输入新记录的姓名(直接回车结束输入):",temp.name,sizeof(temp.name))) return 1;
ConfirmArr("请输入新记录手机号:",temp.cell,sizeof(temp.cell));
ConfirmArr("请输入备注手机号1:",temp.b1cell,sizeof(temp.b1cell));
ConfirmArr("请输入新记录的QQ:",temp.QQ,sizeof(temp.QQ));
ConfirmArr("请输入新记录的MSN:",temp.MSN,sizeof(temp.MSN));
ConfirmArr("请输入新记录的E-Mail:",temp.email,sizeof(temp.email));
ConfirmArr("请输入新记录的办公电话:",temp.otel,sizeof(temp.otel));
ConfirmArr("请输入备注办公电话1:",temp.b1otel,sizeof(temp.b1otel));
ConfirmArr("请输入新记录的家庭电话:",temp.htel,sizeof(temp.htel));
ConfirmArr("请输入新记录的家庭地址:",temp.haddr,sizeof(temp.haddr));
ConfirmArr("请输入备注:",temp.backup,sizeof(temp.backup));
if(p==record+n) *p=temp;
fp=fopen("longqiu.dat","r+");
if(fp==NULL)
{
printf("\n 打开文件失败!\n");
return 1;
}
for(p=record;p<record+n+1;p++)
fprintf(fp,"%-6s%-20s%-13s%-13s%-12s%-40s%-40s%-20s%-20s%-14s%-40s%-40s\n",p->ID,p->name,p->cell,p->b1cell,p->QQ,p->MSN,p->email,p->otel,p->b1otel,p->htel,p->haddr,p->backup);
fclose(fp);
return 0;
}
/* 定义添加信息管理系统的函数 */
void InsertRec(void)
{
char c,yes_no;
int n=0,maxid=0;
struct student temp,record[MaxRec],*p;
FILE *fp;
while(1)
{
n=0;
maxid=0;
fp=fopen("longqiu.dat","r+");
if(fp==NULL)
{
printf("\n 打开文件失败!\n");
return;
}
p=record;
while(feof(fp)==0)
{
fscanf(fp,"%6s%20s%13s%13s%12s%40s%40s%20s%20s%14s%40s%40s\n",p->ID,p->name,p->cell,p->b1cell,p->QQ,p->MSN,p->email,p->otel,p->b1otel,p->htel,p->haddr,p->backup);
p++;
n++;
}
fclose(fp);
fp=fopen("longqiu.dat","r+");
if(fp==NULL)
{
printf("\n 打开文件失败!\n");
return;
}
while(feof(fp)==0)
{
fscanf(fp,"%6s%20s%13s%13s%12s%40s%40s%20s%20s%14s%40s%40s\n",&temp.ID,&temp.name,&temp.cell,&temp.b1cell,&temp.QQ,&temp.MSN,&temp.email,&temp.otel,&temp.b1otel,&temp.htel,&temp.haddr,&temp.backup);
maxid=((atoi(temp.ID)>maxid)?atoi(temp.ID):maxid);
}
printf("\n 总共有%d条记录,最大ID为%04d.",n,maxid);
fclose(fp);
IDCHECK:
if(ConfirmID("\n请输入新记录的ID(1~2000,直接回车结束输入):",temp.ID,sizeof(temp.ID))) return;
for(p=record;p<record+n;p++)
if(strcmp(temp.ID,p->ID)==0)
{
printf("\n\tID重复,要重新输入吗(Y/N)?");
putch(yes_no=getch());
if((yes_no==\'n\')||(yes_no==\'N\')||(yes_no==27)) return;
goto IDCHECK;
}
/*if(ConfirmID("请输入新记录的ID(1~2000,直接回车结束输入):",temp.ID,sizeof(temp.ID))) return; */
if(ConfirmName("请输入新记录的姓名(直接回车结束输入):",temp.name,sizeof(temp.name))) return;
ConfirmArr("请输入新记录手机号:",temp.cell,sizeof(temp.cell));
ConfirmArr("请输入备注手机号1:",temp.b1cell,sizeof(temp.b1cell));
ConfirmArr("请输入新记录的QQ:",temp.QQ,sizeof(temp.QQ));
ConfirmArr("请输入新记录的MSN:",temp.MSN,sizeof(temp.MSN));
ConfirmArr("请输入新记录的E-Mail:",temp.email,sizeof(temp.email));
ConfirmArr("请输入新记录的办公电话:",temp.otel,sizeof(temp.otel));
ConfirmArr("请输入备注办公电话1:",temp.b1otel,sizeof(temp.b1otel));
ConfirmArr("请输入新记录的家庭电话:",temp.htel,sizeof(temp.htel));
ConfirmArr("请输入新记录的家庭地址:",temp.haddr,sizeof(temp.haddr));
ConfirmArr("请输入备注:",temp.backup,sizeof(temp.backup));
if(p==record+n) *p=temp;
fp=fopen("longqiu.dat","r+");
if(fp==NULL)
{
printf("\n 打开文件失败!\n");
return;
}
for(p=record;p<record+n+1;p++)
fprintf(fp,"%-6s%-20s%-13s%-13s%-12s%-40s%-40s%-20s%-20s%-14s%-40s%-40s\n",p->ID,p->name,p->cell,p->b1cell,p->QQ,p->MSN,p->email,p->otel,p->b1otel,p->htel,p->haddr,p->backup);
fclose(fp);
printf("\n 增加记录成功!要继续增加吗(Y/N)?");
putch(yes_no=getch());
if((yes_no==\'n\')||(yes_no==\'N\')||(yes_no==27)) break;
}
}
/* 定义显示信息管理系统的函数 */
void ViewRec(void)
{
int n=0,m=0,totrec=0,yes_no;
struct student temp;
FILE *fp;
fp=fopen("longqiu.dat","r+");
if(fp==NULL)
{
printf("\n 打开文件失败!\n");
return;
}
while(feof(fp)==0)
{
fscanf(fp,"%6s%20s%13s%13s%12s%40s%40s%20s%20s%14s%40s%40s\n",&temp.ID,&temp.name,&temp.cell,&temp.b1cell,&temp.QQ,&temp.MSN,&temp.email,&temp.otel,&temp.b1otel,&temp.htel,&temp.haddr,&temp.backup);
totrec++;
}
fclose(fp);
fp=fopen("longqiu.dat","r+");
n=0;
for(n=1;n<totrec/RecPerPg+1;n++)
{
//clrscr();
printf("\n ID 姓名 手机 备注手机 QQ MSN E-Mail 办公电话 备注电话 住宅电话 家庭地址 备注");
for(m=0;m<RecPerPg;m++)
{
fscanf(fp,"%6s%20s%13s%13s%12s%40s%40s%20s%20s%14s%40s%40s\n",&temp.ID,&temp.name,&temp.cell,&temp.b1cell,&temp.QQ,&temp.MSN,&temp.email,&temp.otel,&temp.b1otel,&temp.htel,&temp.haddr,&temp.backup);
printf("\n%-6s%-20s%-13s%-13s%-12s%-40s%-40s%-20s%-20s%-14s%-40s%-40s",temp.ID,temp.name,temp.cell,temp.b1cell,temp.QQ,temp.MSN,temp.email,temp.otel,temp.b1otel,temp.htel,temp.haddr,temp.backup);
}
printf("\n <第%d页,按任意键显示下一页(ESC退出)!>",n);
yes_no=getch();
if(yes_no==27) return;
}
//clrscr();
printf("\n ID 姓名 手机 备注手机 QQ MSN E-Mail 办公电话 备注电话 住宅电话 家庭地址 备注");
for(m=0;m<totrec%RecPerPg;m++)
{
fscanf(fp,"%6s%20s%13s%13s%12s%40s%40s%20s%20s%14s%40s%40s\n",&temp.ID,&temp.name,&temp.cell,&temp.b1cell,&temp.QQ,&temp.MSN,&temp.email,&temp.otel,&temp.b1otel,&temp.htel,&temp.haddr,&temp.backup);
printf("\n%-6s%-20s%-13s%-13s%-12s%-40s%-40s%-20s%-20s%-14s%-40s%-40s",temp.ID,temp.name,temp.cell,temp.b1cell,temp.QQ,temp.MSN,temp.email,temp.otel,temp.b1otel,temp.htel,temp.haddr,temp.backup);
}
fclose(fp);
if(n==0)
printf("\n 系统中无记录!\n");
else
printf("\n 系统中共有%d个记录!\n 按任意键返回主菜单!",totrec);
getch();
}
待续