在索引文章中提到,本文进行的是单词本程序整体框架的代码编写,包括头文件及声明、主函数编写、主菜单编写等,话不多说,直接上代码:
#include
#include
#include
#include
#define SIZE 1000
char mingzi[20];
char shuru[8];
void printInfo();
void Register();
void Loading();
void RegisterorLoading();
void Menu();
void Visit();
void Vocabulary();
void danciyulanordancixuexi();
void cuotiben();
void Exit();
void delword();
void addword();
void findword();
这边必须提醒大家的是,上述代码包含了整个单词本程序所有涉及到的需要进行声明的子函数、头文件等,并不是只对本文提到的主函数、主菜单函数等进行声明。
int main()
{
RegisterorLoading(); //注册与登录界面
Menu(); //菜单界面
Exit(); //退出界面
return 0;
}
为了提高代码的可读性,主函数中只进行子函数调用,所有功能都编写子函数实现。
void RegisterorLoading() //注册与登录界面
{
int i; //选择登录或注册的变量
printInfo(); //窗口界面美观
scanf("%d",&i);
system("cls"); //清空已有窗口界面
switch(i)
{ case 1 : Register(); getchar();getchar(); //跳转注册或登录
case 2: Loading();system("cls"); break;
}
}
其中“printInfo()”函数用于使界面较为美观,其源码如下:
void printInfo() //界面外形框
{
printf("\n\n\n\n\n");
printf("\t ***************************\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & 1.注册 &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & 2.登录 &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t &**************************\n\n");
}
“printInfo()”函数只是起到使界面美观的作用,笔者为了方便,只在最开始演示一次,如果大家对界面的美观度要求较高,可以照着上述代码对之后的代码做一点修改,就能达到相同的页面效果。
void Register() //用户名注册
{
int dk=1; //打卡数
char yonghuming1[20],mima1[8],mima2[8],mima3[8],mm[8]; //用户名,第一次设的密码,第一次确认的密码,第一次确认密码错误时第二次确认的密码,最终存入文件的密码。
FILE *fp;
fp=fopen("D:\\Ctext\\yonghushuju.txt","a+");
if(!fp)
{
printf("file error\n");
exit(1);
};
printf("请注册你的用户名:\n");
scanf("%s",yonghuming1);
printf("请输入密码:\n");
scanf("%s",mima1);
printf("请确认密码:\n");
scanf("%s",mima2);
if(!strcmp(mima1,mima2)) //如果第一次输入的密码与确认的密码一致则注册成功。
{
strcpy(mm,mima1);
printf("注册成功!");
}
else
{
printf("请再次确认密码:\n");
scanf("%s",mima3);
if(!strcmp(mima1,mima3)) //若第一次不一致则需第二次确认一致。
{
strcpy(mm,mima1);
printf("恭喜你,注册成功!\n");
}
else
{ printf("注册失败!\n");getchar();getchar(); //密码两次确认不一致则注册失败直接退出。
exit(1);}
}
fprintf(fp,"%s %s %d\n",yonghuming1,mm,dk); //用户名与密码还有初始打卡数存入文件。
fclose(fp);
}
void Loading() //登录
{
int ch=0; //中间变量,用来判断用户名是否存在。
typedef struct yhsj //定义结构体
{
char name[20];
char password[8];
int dkts;
}sj;
sj yhxx[1000]; //定义结构体数组,用来存储用户信息
int i=0; //循环变量
FILE *fp; //定义文件指针
fp=fopen("D:\\Ctext\\yonghushuju.txt","r");//以只读的形式打开用户数据文件
if(!fp)
{
printf("file error!\n");
exit(1);
} //若打开失败,则退出程序
printf("请输入用户名登录:\n");
scanf("%s",mingzi); //将用户输入的信息存储到字符数组中
fscanf(fp,"%s%s%d",yhxx[i].name,yhxx[i].password,&yhxx[i].dkts);
while(!feof(fp))
{
i++;
fscanf(fp,"%s%s%d",yhxx[i].name,yhxx[i].password,&yhxx[i].dkts);
} //将文件里所有的用户信息读入结构体
fclose(fp); //关闭文件
for (i=0;i<1000;i++)
{
if(!strcmp(mingzi,yhxx[i].name)) //判断用户数据文件里是否有与之相配的用户名
{
ch=1; //若存在该用户名,则将ch赋值为1;
printf("请输入密码:\n");
scanf("%s",shuru);
if(!strcmp(shuru,yhxx[i].password)) //将用户输入的密码与用户数据文件中的密码比对
{printf("登录成功!(请按回车继续)\n");
getchar();getchar();} //停顿
else
{
printf("密码错误,请重新输入:\n");
scanf("%s",shuru);
if(!strcmp(shuru,yhxx[i].password)) //再次进行密码比对
{ printf("登录成功!(请按回车继续)\n");
getchar();getchar();}
else
{
printf("输入错误次数过多,再见!\n");
getchar();getchar();exit(1); //密码输入次数超限,停顿后直接结束程序。
}
}
}
}
if(ch==0) //用户数据文件里找不到该用户名,引导进行用户注册
{printf("无此用户名,请注册!\n");getchar();getchar();
exit(1);}
}
void Menu()
{
int i; //选择变量,用于后面做选择。
do{
printf("主菜单\n");
printf("1.查看单词本\n");
printf("2.编辑单词本\n");
printf("3.单词学习\n");
printf("4.查看错题集\n");
printf("0.退出\n");
printf("请输入您的选择:");
scanf("%d",&i);
getchar();
switch(i) //菜单栏往下跳转
{
case 1: Visit();break;
case 2:Vocabulary();break;
case 3:danciyulanordancixuexi();break;
case 4:cuotiben();break;
case 0: Exit();
default:printf("请输入正确的选择!\n");
}
}while(i);
}
至此,单词本程序的主菜单及整体框架已经基本编写完成,接下来将进行“查看单词本”功能的编写。