当前课程知识点:C语言程序设计(上) > 选择结构的程序设计 > 3.2 路径中的再选择——嵌套判断 > 3.2.2 用户登录检查
接下来我们还接着讨论
路径中的再选择
也就是嵌套判断的问题
我们用一个例子
用户登陆检查
这个是现在用的最频繁的一个
无论是你进邮箱
还是你到银行去取款
还是一些其它类似的业务
你都会频繁的使用这个登陆
登陆的时候我们一般的
通常是有两个参数的
一个是系统
所谓的系统就是
对我们现在来说就是我们的程序
你到银行当然就是银行的系统
你到邮箱就是邮箱系统
这个系统一定会至少识别两个信息
一个是你的用户名
当然用户名是在不同的地方
它的长度它的设置是不一样的
其次除此之外就是密码
密码当然是你自己知道的一个信息
在我们这里边就是我们问题里
就有两个变量
一个是name用户名
一个是password
是我们的那个密码
我们对算法的考虑
为了简化起见
我们把这两个变量都考虑
考虑成整型
当一说整型你的输入就一定要注意
在整型允许的范围内
另外一个
是我们要求这系统是这样子
我成功登陆以后
你给我明确的提示
成功登陆当然没有问题了
你登陆进去了你就可以工作了
如果我不成功的时候
你最好告诉我的是
是用户名错了还是密码错了
就不要说你没成功
这时候我就不能识别
到底是用户名错还是密码错
因为有这个要求
我们的流程考虑的时候
是不是应该是这样子
这前面的判断应该
是一个什么样的判断
是一个逻辑运算的一个结果
用逻辑运算来表达的
来表达的这么一个条件
你的姓名并且密码都正确吗
应该这是一个逻辑运算的结果
作为条件
如果是的你告诉我登陆成功
我们就可以进去了进入系统
否则
一定是这两者里边有一个是错的
我不希望你这块说它们是错的
我希望你告诉我说谁错了
所以下边在这个else里边
else块里边有一个再判断
你的姓名错了吗
用户名错了吗
如果是用户名错了
这块提示用户名错
否则一定是密码错了
你提示我密码错
无论是这两个哪个错了
一定会从这两条路里选一条
这也一样你要进入这个系统
你不可能跳过这三条路里边的
所有路你不走
对这个选择来说
if块else块你必须选一个
进了else块里边还有一个选择
你必须选一个
所以这是两级的嵌套
嵌套在哪里
嵌套在else里边
这块根据这个流程我们的程序
是不是应该这样
大家看一下
在这个程序里边
在底下就做这个逻辑运算作为条件
逻辑运算
你送进来的那个name
和我们预设的这个用户名
进行等量的比较
相等吗 你送进来那个对吗
是16001吗
并且你的密码是六个1吗
这个密码其实都在这摆着
事实上就是这样程序就是这样写
写程序的人
这一块必须要知道你的密码
程序是谁写上去
大家不用担心
你不是可以修改你的密码
你写的时候是一次性写上去
谁都不知道
我们现在写程序是知道的
这一块名字你的用户名
等于你预设的这个值
你的密码也等于你预设的这个值
end这个条件才成立
登陆成功
否则走下面的这一块
我们运行一下这个程序
看一下
这个程序
我们看一下
这个程序在这
我们先不用担心这个密码
暴露不暴露
我们先看这个没有问题的话
登陆成功走了if块
否则我们要进一步的嵌套判断
判断你是用户名错了
还是密码错了
运行一下这个程序
我们的用户名大家有没有忘记
用户名是
密码刚才是六个1
登陆成功
我们试一下
用户名错
密码给它对
这个用户名是不存在的
告诉你用户名错了
我们如果是密码错了
密码我们给
我们看一下刚才为什么不对
回过头来检查一下程序
因为我们是密码输错了
它却告诉我们还是用户名错了
我们看这一块的确是用户名错了
大家现在会不会有一个困惑
这个程序都写错了
这个编译系统怎么会通过了
我们编译的时候它没告诉错了
这就表明编译系统通过了没有问题
我现在来输入的时候
我们用户名的确是这样
我的密码也没问题
现在大家说这个系统现在告诉你
正常登陆还是没登陆
我这两个都对了
两个对了
刚才我们已经看见了成功登陆
这个程序应该没有问题
可是我们刚才做了第二次测试
我们的用户名是16001
我写成
然后密码给对
用户名错
它是用户名错
的确我把用户名给错了
这是系统查出来的吗
我们再看明明用户名错了
我们给错了
系统也告诉我错了
但是这一块却有问题
我们看一下在16001
我让用户名对
我让密码错
系统说什么
用户名不存在说用户名错
没说密码错
可是我用户名是对的
为什么回来看一下
我们发现什么
在用户名这块
我把用户名程序给写错了
应该是16
我写成14了
大家现在觉得我写错了
系统为什么会编译通过了
这个问题大家稍微想一下就应该知道
系统只能查出来什么样的错
是你的语法结构有错
比如说
你没有if却有了else
你前面有括弧后边却没括弧
这种结构
这种就说程序结构
语法结构语法有错程序结构有错
它是能查出来的
像你把这里边哪个数据给错了
它是不查的
所以这种错就非常的隐式
是因为两个都对了
它走了这条线了
你也看不到它有问题
你如果真的把用户名输错了
它也说错了
也看不到问题
只有你希望说
你期待这个结果的时候
它才会发现上边的问题
所以这就是一种隐含的错误
程序测试就是测这些错误
就是把所有的用例要测试到
我们还做一点点讨论
就这用户名这密码很危险
我们平常看这个密码
密码这样搁在程序里边
谁人都知道
我们刚才已经说到了
其实这个密码
为什么你到银行办了一个卡
银行给你预置了一个密码
然后告诉你你立刻去修改你的密码
银行预置的这个密码
工作人员是知道的
你去修改的那个密码
编程序的人会不会知道
我们想想
你的密码是
临时从你脑子里构造出来的
编程序的人自然是不知道
那个程序你的这个东西
怎么写到这个位置上
因为我们用的修改密码的这个材料
你用的那卡的材料是不同的
材料决定了
你这个密码只有你自己知道
所以大家不用担心
但是我们时常会看到有提示说
你的密码不能简单的只给四位
或者是只给六位
有些重要的东西提示你
密码要复杂
不但要有数字
还要有字母
如果从这程序里边把密码修改一下
比如说我要把密码修改成
现在已经有了十二位
十二位密码
看行还是不行
我输的没有问题里边写的也没有问题
说密码不正确
不正确吗1到9
然后再123
这不1到9再到123
为什么会不正确呢
这个不正确
我们再改改小看看
去掉两位
登陆成功
大家看我是1到9十位
不是十二位了给了十位
十位就通过了
十二位就没通过
大家一定会觉得奇怪
int型的我们前面在
讲这个类型的时候说int是十六位
而float才是
三十二位
这块的int十六位
照道理它最大的整型数是
五位数
32767负的32768
这是它的绝对值最大的是32768
怎么会到了这么多
如果有这个疑问
我们可以看一下
咱把这int到底是
十六位还是三十二位
我们看一下
我们输出一下
输出一下测试一下
我们要输出的是谁
输出的是这个函数
这个函数是来测试
这个各种类型的
各种变量的长度的
比如说你在这里边写一个变量名
它会告诉你
这个变量名里面占的位数是
几个字节它几个字节
比如说我现在写了int
它告诉我int是占了几个字节
我要写个double
它告诉我double是占了几个字节
这块它应该告诉我的是
int占了几个字节
咱把int输出来看一下
占了几个字节呢
告诉我们说
int占了四个字节
占了四个字节
我们现在说
这个咱随便输一下吧
全错了 回来
现在如果这样大家想把它改成long
行不行呢
行不行取决于说
long到底占了几个字节
按我们前面说int是两个字节
long是四个字节
这个不是绝对的
是依机器的不同
或者编译系统的不同
都会带来不同
比如说你用了一个很早的机器
这个机器说绝对一点
它是一个十六位的机器
它的整型
一定是两个字节十六位
如果你用了一个六十四位的机器
这个整型一定是
至少是三十二位
就不是十六位了
这个东西大家用不用把它背下来
不用背下来
你用的时候
你看你的系统
你用的是一个比较新的机器自然知道
它的宽度
它的整型的宽度是会要宽一些的
或者是说
当你在做程序的时候
出现了我们刚才说的那个问题
我设了一个十二位的密码
它却不认
这就是大家能够理解说
你平常设密码时候人家告诉你设几位
就是这个意思
你要设的特别长
它的系统接受不了
只要大家注意到说
你其实和机器的交互
很大程度上你是在事先做的约定
是在订购内存的
订购内存
这个内存
你的变量是多大
你只能到里面放多大的数否则会溢出
所以这块是希望大家注意的
这个我们会在讨论区里边
给大家一些问题
有兴趣的读者我们下去一起讨论
-1.1 计算机的问题求解方法
--讨论题:数学模型
-1.1 计算机的问题求解方法--作业
-1.2 C语言与C程序
--讨论题:运算符
-1.3 C语言处理系统与程序调试运行
--例程
-1.4 程序中的人机交互
--例程
--作业讨论区
-2.1 算术运算的C程序实现
--算术混合运算.c
-2.1 算术运算的C程序实现--作业
-2.2 关系运算的C程序实现
--bukao.c
--字符比较.c
--讨论题:比较大小
-2.2 关系运算的C程序实现--作业
-第二周作业--作业
-2.3 逻辑运算的C程序实现
--计算结合性
--闰年.c
--自动购票问题.c
-2.3 逻辑运算的C程序实现--作业
-2.4 位运算的C程序实现
--讨论题:位运算
-2.5 几种很个别的运算
--讨论题
--讨论题
-2.5 几种很个别的运算--作业
-2.6 混合运算及数据类型转换
--讨论题:数据类型
-2.7 顺序结构程序实例
--Video
--三角形面积.c
--讨论题:工业产值
-2.7 顺序结构程序实例--作业
-3.1 程序中的路径选择实现
--打印学生成绩.c
--一元二次方程.c
-3.1 程序中的路径选择实现--作业
-3.2 路径中的再选择——嵌套判断
--例程
--讨论题:程序改错
-3.2 路径中的再选择——嵌套判断--作业
-3.3 复杂判断问题的C程序设计
--3.3 多级选择
--银行存款.c
--讨论题:多级选择
-3.4 多分支问题的C程序设计
--加减乘除运算.c
-3.4 多分支问题的C程序设计--作业
-3.5 GOTO的适当使用
-3.6 选择结构的程序实例
--3.6 程序展示
--计算第几天.c
--讨论题:输出奇数
--讨论题:计算税金
-3.6 选择结构的程序实例--作业
-第四周作业--作业
-4.1 需要重复执行的程序
--求和.c
--打印学生成绩.c
--统计录入速度.c
--求平均数.c
-4.1 需要重复执行的程序--作业
-4.2 至少要执行一次的循环
--n的阶乘.c
--字符分类统计.c
-4.2 至少要执行一次的循环--作业
-4.3 已知循环次数用for语句
--求和问题.c
--数列求和.c
--讨论题:循环语句
-4.3 已知循环次数用for语句--作业
-4.4 循环控制——简单循环应用
--水仙花数.c
--讨论题:死循环
--讨论题:猜数字
-循环结构的程序设计(一)--4.4 循环控制——简单循环应用
-4.5 循环的嵌套
--讨论题:程序运行
-4.5 循环的嵌套--作业
-4.6 break与continue
--最大素数.c
-4.6 break与continue--作业
-4.7 循环的综合应用
--数的排列组合.c
--鸡兔同笼.c
--打印空心字符.c
--讨论题:打印图形
--讨论题:计算闰年
-第六周作业
-第六周作业--作业
-5.1 同类有序数据处理问题
-5.2 一维数组的定义和引用
--数组定义.c
--数组初始化.c
--反向输出.c
--讨论题:对称数
-5.2 一维数组的定义和引用--作业
-5.3 一维字符串数组
--讨论题:编程
-5.4 字符串处理函数
--字符串反向.c
--字符串函数
-5.5 二维数组的定义与使用
-5.6 二维数组的输入输出
-5.6 二维数组的输入输出--作业
-5.7 二维数组的应用
--转置矩阵.c
--讨论题:修改程序
-5.8 二维字符数组
--5.8 单词排序
--单词排序.c
-5.8 二维字符数组--作业
-5.9 数组综合应用
--统计成绩.c
--统计字符次数.c
--讨论题:洗牌
-本期课程结束语
--end
-第八周编程作业
-《C语言程序设计(上)》期末复习参考
--html
-《C语言程序设计(上)》期末复习参考答案
--html