导言
大家好,很高兴又和大家见面啦!!!今天我们还是继续讲解的分支与循环的相关习题,今天的习题为:
编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序)
我们通过今天的习题又将学习哪些知识点呢?让我们一起来看看吧;
模拟用户登录情景,并且只能登录三次
编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序)
题目解析
这道题理解起来并不困难,题目要求我们编写模拟用户登录的代码,用户登录我们并不陌生了,正常的登录界面有账号、密码,我们平时登录qq、微信、51CTO……这些账号时都是需要输入这些内容,用手机号登录的用户还需要输入验证码。
我们在使用银行卡、手机锁屏解锁、手机银行app……这些账号时,如果输入错误达到一定次数,这些账号会被锁定,此时我们等待解锁才行。
通过以上的例子,我们知道了,要实现用户登录的至少需要有以下几个功能:
- 功能一——输入; 通过输入功能,用户可以将账号和密码的相关信息输入到程序中;
- 功能二——检测; 通过检测功能,系统可以将用户输入的信息与预设的信息进行对比;
- 功能三——反馈;通过反馈功能,系统可以将检测的结果反馈给用户;
下面我们就要探讨一下这些功能该如何实现了;
功能一——输入
输入功能的实现我们可以通过输入函数来完成,所谓的输入函数是指C语言库提供可以读取用户通过键盘输入到字符缓冲区信息的函数,如scanf函数和getchar函数。
这两者的区别是:
scanf可以读取的数据是在空格或者换行符前的所有数据;
getchar是能够读取字符缓冲区内的一个字符,包括空格和换行符;
我们现在在输入账号和密码时,系统如果能够一次性读取我们输入的全部内容的话这样执行效率肯定会更高一点,所以功能一我们选择用scanf来实现;
现在问题来了,我们通过scanf输入的数据需要存放在一个空间内才行,前面我们有提到过,既然是字符串的存储的话我们可以通过字符类型的数组来进行存储,所以功能一的完整实现是数组和scanf函数来共同完成;
//功能一——输入
char ch[10];
scanf("%s", ch);
功能二——检测
检测功能说白了也就是和我们预存的数据进行对比,那又该如何对比呢?
下面我们要介绍一个库函数strcmp;
库函数strcmp
strcmp——字符串比较函数,使用这个库函数我们需要引用头文件string.h;
这个函数的作用是用来比较两个字符串的,比较的规则如下:
- 如果第一个字符串与第二个字符串相等,则函数返回0;
- 如果第一个字符串大于第二个字符串,则函数返回值>0;
- 如果第一个字符串小于第二个字符串,则函数返回值<0;
函数的使用格式如下:
//strcmp函数使用格式
strcmp(对象1,对象2)
通过将对象1与对象2 进行比较来确定函数的返回值,在我们的检测中我们可以通过返回值是否为0,来确定用户输入信息是否正确;
//功能二——检测
strcmp(ch, "123456") == 0;
功能三——反馈
我们在对字符串进行检测后,肯定需要将检测结果反馈给用户的,反馈结果只有两种情况,输入正确和输入错误。
当输入正确时,检测结果为真,则反馈用户下列信息:
提示用户输入正确,成功登录;
当输入错误时,检测结果为假,题目的要求是用户只能输入错误三次密码,所以此时应该反馈给用户下列信息:
- 提示用户输入错误,请重新输入;
- 告知用户剩余几次输入机会;
- 重新给用户提供输入界面;
//功能三——反馈
if ()
{
pirntf("密码输入正确,成功登录\n");
}
else
{
printf("密码输入错误,请重新输入\n");
printf("剩余输入次数为%d\n", 次数统计变量);
scanf("%s", ch);
}
如果用户输入的三次全部错误,则我们还需要反馈给用户,剩余输入次数为0,然后程序结束运行,所以在代码中我们还应该加入一个次数判断,来控制程序的运行:
if (次数为0)
{
return 0;
}
这样我们的逻辑基本上就没问题了,下面我们就可以编写代码来实现用户登录的模拟情景了;
代码实现
因为在输入错误时需要重复进行输入,所以我们通过分支与循环语句来将所有的功能合并起来。代码如下:
#include <stdio.h>
#include <string.h>//使用strcmp需要引用头文件
int main()
{
//功能一——输入
char ch[10];
int i = 3;//定义次数统计变量
while (i > 0)
{
scanf("%s", ch);
//功能二——检测
if (strcmp(ch, "123456") == 0)
//功能三——反馈
{
printf("密码输入正确,成功登录\n");
break;
}
else
{
i--;
if (i > 0)
{
printf("密码输入错误,请重新输入\n");
printf("剩余输入次数为%d\n", i);
}
else
{
printf("输入次数已用完,程序即将退出\n");
}
}
}
return 0;
}
下面我们来看一下代码的运行:
可以看到,现在已经能够实现咱们需要的功能了,但是我还能不能优化呢?接下来我们一起来探讨一下;
代码优化
大家还记不记得上一篇中提到的知识点——Sleep函数、system函数以及cls指令;
在用户登录情景中我们同样可以使用,我们可以在用户输入错误后,让提示停留1s,再将界面清除并提供输入界面,输入界面我们也可以加入一句提示语,在用户三次机会全部用完后我们也可以让提示停留一会儿再退出,这样是不是更加贴合咱们在实际进行登录的情景了呀。代码如下所示:
#include <stdio.h>
#include <string.h>//使用strcmp需要引用头文件
#include <Windows.h>//使用Sleep需要引用头文件
#include <stdlib.h>//使用system需要引用头文件
int main()
{
//功能一——输入
char ch[10];
int i = 3;//定义次数统计变量
while (i > 0)
{
printf("请输入密码>:");//提示用户输入密码
scanf("%s", ch);
//功能二——检测
if (strcmp(ch, "123456") == 0)
//功能三——反馈
{
printf("密码输入正确,成功登录\n");
break;
}
else
{
i--;
if (i > 0)
{
printf("密码输入错误,请重新输入\n");
printf("剩余输入次数为%d\n", i);
Sleep(1000);//让提示停留1秒钟
system("cls");//清空屏幕
}
else
{
printf("输入次数已用完,程序即将退出\n");
Sleep(1000);//让提示停留1秒钟
system("cls");//清空屏幕
}
}
}
return 0;
}
下面我们来感受一下此时的运行效果:
怎么样,是不是感觉更加贴合实际情景了。
咱们今天通过这道题目,不仅复习了分支与循环的相关知识在实际中的运用,我们也复习了在上一篇内容中提到的三个知识点Sleep函数、system函数以及cls指令;
希望各位朋友下去可以自己动手操作一下来加深自己对这些内容的印象。
结语
咱们今天的内容到这里就全部结束了,后面我们还会继续分享分支与循环的相关习题,我相信大家通过这段时间的阅读以及练习,对这些知识点的掌握应该比较牢固了,下面是我下一篇要讲解的习题:
- 将任意三个数按从大到小的顺序排列出来;
- 打印(1-100)之间3的倍数;
- 编写代码求两个数的最大公约数;
大家有兴趣的话可以提前完成这些内容,后续再对照我的讲解来对比一下咱们的解题思路,这样对各位的提升效果会更加的明显。
最后感谢各位的翻阅,希望各位通过这些内容能更好的理解运用分支与循环的相关知识点,咱们下一篇见。