【新书推荐】7.1 do while语句

news2024/11/15 23:23:40

本节必须掌握的知识点:

    示例二十二

        代码分析

        汇编解析

do while语句其语法形式

do{

语句块;

}while(表达式)

语法解析:

●执行do循环体内的语句块;

●判断while语句里的表达式,表达式为真继续下次循环,若为假则跳出循环;

7.1.1 示例二十二

示例代码二十二

●第一步:分析需求,设计程序结构框架。

分析需求:重复输入一个整数并判断该整数是奇数还是偶数。

设计程序结构框架:循环结构(do/while语句)中嵌套一个if/else结构。

 ●第二步:数据定义,定义恰当的数据结构;

       int GoOn = 0;//定义一个int类型的整型局部变量,并初始化为0。GoOn变量作为do/while语句的循环控制变量。

int num;//定义一个int类型的整型局部变量,利用scanf_s接收键盘输入整数完成初始化。

●第三步:分析算法。

利用do/while语句结构重复实现一个过程。

该过程为:从键盘输入一个整数,利用(num % 2)的算法判断和输出该整数是奇数还是偶数。

判断完成后,输出结果。

       ●第四步:编写伪代码,即用我们自己的语言来编写程序。

       int main(void) {

    定义一个int类型整型变量GoOn=0;

定义一个int类型整型变量num

    do{

        调用printf函数打印一个提示信息"请输入一个整数:\t"

        调用scanf_s函数接收键盘输入一个整数,并存入变量num;                            

        if(num%2)

            如果num%2的模为真:调用printf函数输出"这个数是奇数\n";

else

如果num%2的模为假:调用printf函数输出"这个数是偶数\n";      

调用printf函数打印一个提示信息"重复输入1,不重复输入2:\t"

调用scanf_s函数接收键盘输入一个整数,并存入变量GoOn;

}while(如果GoOn等于1则继续循环)

system("pause");

    return 0;                                                                                                    

}

●第五步:画流程图,使用Visio、Excel或者其他绘图工具绘制算法流程和逻辑关系图;    

图7-1 示例二十二do while语句流程图

●第六步:编写源程序,其实就是将我们的伪代码翻译成计算机语言;

/*

   重复输入一个整数并判断该整数是奇数还是偶数

*/

#include <stdio.h>

#include <stdlib.h>

int main(void) {

    int GoOn = 0; //已初始化

    int num; //未初始化

    do {

        printf("请输入一个整数:\t");

        scanf_s("%d", &num);

        if (num % 2)

        {

            printf("这个数是奇数\n");

        }

        else

        {

            printf("这个数是偶数\n");

        }

        printf("重复输入1,不重复输入2:\t");

        scanf_s("%d", &GoOn);

    } while (GoOn == 1);

    system("pause");

    return 0;

}

输出结果:

请输入一个整数: 1

这个数是奇数

重复输入1,不重复输入2: 1

请输入一个整数: 2

这个数是偶数

重复输入1,不重复输入2: 2

●第七步:调试程序,修复程序中可能出现的BUG;

参见反汇编代码。

●第八步:优化代码,尝试更好的设计方案,效率更高的算法,逻辑更为清晰简洁明了。

(无)

7.1.2 代码分析

       示例二十二是一个do/while结构嵌套一个if/else结构的程序。

  1. 进入do语句主体,在控制台窗口输出“请输入一个整数”;
  2. 在控制台输入:1;

3.判断 1%2有余数,执行printf(“这个数是奇数”);

4.执行printf("重复输入1,不重复输入2:\t");

5.如果我们输入1,那么将再次循环进入do语句主体;如果输入2则直接退出循环。

因为while里的表达式是GoOn的值判断是否等于1,如果等于1则继续循环,如果不等则退出循环。

显然这是一个标志循环,循环的次数是不确定的。根据循环控制变量GoOn是否为标志值1来决定是否继续循环。

7.1.3 汇编解析

汇编代码

;C标准库头文件和导入库

include vcIO.inc

.data

GoOn sdword  0

num  sdword  ?

.const    

szMsg1 db "请输入一个整数:",0

szMsg2 db "%d",0

szMsg3 db "这个数是奇数",0dh,0ah,0

szMsg4 db "这个数是偶数",0dh,0ah,0

szMsg5 db "重复输入1,不重复输入2:",09h,0

.code     

start:

NEXT:    

       ;输入整数num

       invoke printf,offset szMsg1

       invoke scanf,offset szMsg2,ADDR num

       ;

       mov eax,num

       mov ebx,2

       cdq                ;被除数扩展到EDX:EAX

       idiv ebx

       .if edx

              invoke printf,offset szMsg3

       .else

              invoke printf,offset szMsg4 

       .endif     

       ;输入控制变量

       invoke printf,offset szMsg5

       invoke scanf,offset szMsg2,ADDR GoOn

       ;

       .if GoOn == 1

              jmp NEXT

       .endif

       ;     

       invoke _getch

       ret                       

end start

●输出结果:

请输入一个整数:1

这个数是奇数

重复输入1,不重复输入2: 1

请输入一个整数:2

这个数是偶数

重复输入1,不重复输入2: 1

请输入一个整数:3

这个数是奇数

重复输入1,不重复输入2: 2

       由上述的汇编代码我们可知,C语言中的do/while语句对应的汇编实现方法为:

NEXT:

       .if GoOn == 1

              jmp NEXT

       .endif

       当GoOn == 1时,使用jmp指令直接跳转到NEXT:地址标号处,开始下一轮循环。

反汇编代码

           int GoOn = 0;//已初始化

00AD1952  mov         dword ptr [GoOn],0 

    int num;//未初始化

    do {

        printf("请输入一个整数:\t");

00AD1959  push        offset string "\xc7\xeb\xca\xe4\xc8\xeb\xd2\xbb\xb8\xf6\xd5\xfb\xca\xfd:\t" (0AD7B30h) 

00AD195E  call        _printf (0AD104Bh) 

00AD1963  add         esp,4 

        scanf_s("%d", &num);

00AD1966  lea         eax,[num] 

00AD1969  push        eax 

        scanf_s("%d", &num);

00AD196A  push        offset string "%d" (0AD7B44h) 

00AD196F  call        _scanf_s (0AD1154h) 

00AD1974  add         esp,8 

        if (num % 2)

00AD1977  mov         eax,dword ptr [num] 

00AD197A  and         eax,80000001h 

00AD197F  jns         main+66h (0AD1986h;如果num为正整数,则跳转到0AD1986h地址处

00AD1981  dec         eax  ;num为负整数

00AD1982  or          eax,0FFFFFFFEh 

00AD1985  inc         eax 

00AD1986  test        eax,eax  ;测试eax是否为0

00AD1988  je          main+79h (0AD1999h) ;如果eax==0为偶数,跳转到0AD1999h地址处

        {

            printf("这个数是奇数\n");

00AD198A  push        offset string "\xd5\xe2\xb8\xf6\xca\xfd\xca\xc7\xc6\xe6\xca\xfd\n" (0AD7B48h) 

00AD198F  call        _printf (0AD104Bh) 

00AD1994  add         esp,4 

        }

00AD1997  jmp         main+86h (0AD19A6h) 

        else

        {

            printf("这个数是偶数\n");

00AD1999  push        offset string "\xd5\xe2\xb8\xf6\xca\xfd\xca\xc7\xc5\xbc\xca\xfd\n" (0AD7B58h) 

00AD199E  call        _printf (0AD104Bh) 

00AD19A3  add         esp,4 

        }

        printf("重复输入1,不重复输入2:\t");显示提示信息

00AD19A6  push        offset string "\xd6\xd8\xb8\xb4\xca\xe4\xc8\xeb1\xa3\xac\xb2\xbb\xd6\xd8\xb8\xb4\xca\xe4\xc8\xeb2:\t" (0AD7B68h) 

00AD19AB  call        _printf (0AD104Bh) 

00AD19B0  add         esp,4 

        scanf_s("%d", &GoOn);键盘输入整数值并存入变量GoOn地址处

00AD19B3  lea         eax,[GoOn] 

00AD19B6  push        eax 

00AD19B7  push        offset string "%d" (0AD7B44h) 

00AD19BC  call        _scanf_s (0AD1154h) 

00AD19C1  add         esp,8 

    } while (GoOn == 1);

00AD19C4  cmp         dword ptr [GoOn],1   ;比较GoOn和1是否相等

00AD19C8  je          main+39h (0AD1959h; GoOn == 1时,跳转到0AD1959h地址处

    system("pause");

00AD19CA  mov         esi,esp 

00AD19CC  push        offset string "pause" (0AD7B88h) 

00AD19D1  call        dword ptr [__imp__system (0ADB168h)] 

00AD19D7  add         esp,4 

       由上述反汇编代码可知:

       C语言中的do/while语句翻译为汇编指令语句为:

00AD1959:do循环的开始地址

} while (GoOn == 1);循环条件判断语句

00AD19C4  cmp         dword ptr [GoOn],1   ;比较GoOn和1是否相等

00AD19C8  je          main+39h (0AD1959h; GoOn == 1时,跳转到0AD1959h地址处

 

结论

1.while语句是先判断后执行(下一节详细讲述);

2.do while语句是先执行后判断,属于标志循环,循环次数不确定;

3.do while语句通常用于输入检查。

4.不要忘记while后面的条件语句以’;’结尾。

    在C语言中 for,while ,do while语句本质没有区别,可以相互转换,只是在使用形式上,do while 语句适合用于至少执行一次的循环。而while语句中,如果条件不成立,永远不会执行循环体内的代码。

实验四十二:do while语句实现输入检查

在VS中新建项目7-1-2.c,使用do while语句改写示例二十一,实现循环输入并对输入进行错误检查。

/*

   do/while语句实现循环输入并对输入进行错误检查

*/

#include <stdio.h>

#include <stdlib.h>

int main(void) {

    int GoOn = 0;//已初始化

    int day = 0;

    printf("\t\t☆☆☆☆☆天气查询☆☆☆☆☆\n");

    printf("\t\t   ☆查询周一天气请输入:1\n");

    printf("\t\t   ☆查询周二天气请输入:2\n");

    printf("\t\t   ☆查询周三天气请输入:3\n");

    printf("\t\t   ☆查询周四天气请输入:4\n");

    printf("\t\t   ☆查询周五天气请输入:5\n");

    printf("\t\t   ☆查询周六天气请输入:6\n");

    printf("\t\t   ☆查询周日天气请输入:7\n");

    do {

        do

        {

            printf("请输入查询天气:");

            scanf_s("%d", &day);

            if (day < 1 || day > 7)

                printf("输入错误,请重新输入(1,2,3,4,5,6,7任意一个整数值)\n");

        } while (day < 1 || day > 7);

        switch (day)

        {

        case 1:

            printf("周一天气:晴天\n");

            break;

        case 2:

            printf("周二天气:阴天\n");

            break;

        case 3:

            printf("周三天气:大雨\n");

            break;

        case 4:

            printf("周四天气:中雪\n");

            break;

        default:

            printf("周%d天气:雨夹雪\n", day);

            break;

        }

        printf("重复输入1,不重复输入2:\t");

        scanf_s("%d", &GoOn);

    } while (GoOn == 1);

    system("pause");

    return 0;

}

●输出结果:

请输入查询天气:1

周一天气:晴天

重复输入1,不重复输入2: 1

请输入查询天气:7

周7天气:雨夹雪

重复输入1,不重复输入2: 1

请输入查询天气:0

输入错误,请重新输入(1,2,3,4,5,6,7任意一个整数值)

请输入查询天气:8

输入错误,请重新输入(1,2,3,4,5,6,7任意一个整数值)

请输入查询天气:3

周三天气:大雨

重复输入1,不重复输入2: 2

实验四十二使用了两个do while语句进行了嵌套,外层的do while语句实现了重复查询天气的功能,内层的do while语句对输入的变量day的值进行了错误检查。如果day <1或day > 7,则提示重新输入正确的值。确保了键盘输入的整数值必须在1~7之间,防止输入错误的出现。这种设计是非常有必要的,增强了程序的稳定性和人性化设计。

练习

  1. 请读者书写程序7-1-2.c伪代码,并绘制流程图。
  2. 请读者将7-1-2.c翻译成汇编语言实现。
  3. 请读者分析7-1-2.c的反汇编代码。

4、假设用户的密码是一个三位整数,令用户输入密码,如果输入成功,则提示“正确”。如果输入错误,则提示“您输入的密码有误”,并提示重新输入密码。最多输入三次,如果三次没有成功,则退出程序。

5、  (1)打印0~100中所有的偶数。

(2)打印0~100中所有的奇数

       6、根据读取的整数值显示所出的拳(只接收0,1,2),【0...石头/1...剪刀/2...布】。

7、不停的输入整数,显示和及平均值。

8、编写一段程序重复实现:读取两个整数的值,然后计算并显示两个整数的和。

9、编写一段程序重复实现:读取两个整数的值,然后计算并显示两个整数的平均值。

10、编写一段程序重复实现:读取一个整数的值,然后判断该整数是正数、负数或零。

本文摘自编程达人系列教材《汇编的角度——C语言》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1439596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LoveWall v2.0Pro社区型校园表白墙源码

校园表白墙&#xff0c;一个接近于社区类型的表白墙&#xff0c;LoveWall。 源码特色&#xff1b; 点赞&#xff0c; 发评论&#xff0c; 发弹幕&#xff0c; 多校区&#xff0c; 分享页&#xff0c; 涉及违禁物等名词进行检测&#xff01; 安装教程: 环境要求&#xff1b;…

ChatGPT 3.5与4.0:深入解析技术进步与性能提升的关键数据

大家好&#xff0c;欢迎来到我的博客&#xff01;今天我们将详细比较两个引人注目的ChatGPT版本——3.5和4.0&#xff0c;通过一些关键数据来深入解析它们之间的差异以及4.0版本的技术进步。 1. 模型规模与参数 ChatGPT 3.5&#xff1a; 参数数量&#xff1a;约1.7亿个模型层数…

层层深入揭示C语言指针的底层机制

理解C语言指针的底层机制需要我们从硬件、操作系统和编译器三个层次逐步展开。 1. 硬件层次 计算机硬件是实现内存管理的基础。内存是一个由无数个存储单元组成的线性空间&#xff0c;每个存储单元都有一个唯一的地址。这个地址通常是一个二进制数&#xff0c;表示该存储单元…

C++力扣题目494--目标和 474--一和零

494.目标和 力扣题目链接(opens new window) 难度&#xff1a;中等 给定一个非负整数数组&#xff0c;a1, a2, ..., an, 和一个目标数&#xff0c;S。现在你有两个符号 和 -。对于数组中的任意一个整数&#xff0c;你都可以从 或 -中选择一个符号添加在前面。 返回可以使…

通过nginx学习linux进程名的修改

目录 1. 缘起2. 背景知识3. 源码分析3.1 准备工作3.2 设置进程名字 1. 缘起 在运行nginx的时候&#xff0c;用ps查看nginx的进程信息&#xff0c;可能的输出如下&#xff1a; root 42169 3105 0 16:51 ? 00:00:00 nginx: master process ./objs/nginx root …

ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重提示词

论文完成初稿之后&#xff0c;一般情况下&#xff0c;宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易&#xff0c;即使对老师来说&#xff0c;找人评审论文也是一件苦活。我们这个时候可以通过文字提示让 ChatGPT充当我们的评审专家&#xff0c;为论文提出问题…

spring boot和spring cloud项目中配置文件application和bootstrap加载顺序

在前面的文章基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 日志配置 logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <configuration scan"true" scanPeriod"10000000 seconds" debug…

双非本科准备秋招(19.2)—— 设计模式之保护式暂停

一、wait & notify wait能让线程进入waiting状态&#xff0c;这时候就需要比较一下和sleep的区别了。 sleep vs wait 1) sleep 是 Thread 方法&#xff0c;而 wait 是 Object 的方法 2) sleep 不需要强制和 synchronized 配合使用&#xff0c;但 wait 强制和 s…

分享一下 uniapp 打包安卓apk

首先需要安装 Java 环境&#xff0c;这里就不做解释了 第二步&#xff1a;打开 mac 终端 / cmd 命令行工具 使用keytool -genkey命令生成证书 keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore *testalias 是证书别名&am…

年货大数据(电商平台年货节数据):水果销售额增长72%,海鲜肉类涨幅高于蔬菜

春节临近&#xff0c;生鲜又成了线上线下“叫卖”狠&#xff0c;竞争大&#xff0c;盈利好的行业之一。无论是线下商超&#xff0c;还是线上电商&#xff0c;生鲜行业在年货节期间不愁没有市场需求。 根据鲸参谋数据显示&#xff0c;1月前三周京东平台生鲜市场整体销量超3300万…

C++初阶:容器(Containers)vector常用接口详解

介绍完了string类的相关内容后&#xff1a;C初阶&#xff1a;适合新手的手撕string类&#xff08;模拟实现string类&#xff09; 接下来进入新的篇章&#xff0c;容器vector介绍&#xff1a; 文章目录 1.vector的初步介绍2.vector的定义&#xff08;constructor&#xff09;3.v…

5G NR 信道号计算

一、5G NR的频段 增加带宽是增加容量和传输速率最直接的方法&#xff0c;目前5G最大带宽将会达到400MHz&#xff0c;考虑到目前频率占用情况&#xff0c;5G将不得不使用高频进行通信。 3GPP协议定义了从Sub6G(FR1)到毫米波(FR2)的5G目标频谱。 其中FR1是5G的核心频段&#xff0…

算法学习打卡day47|单调栈系列题目

单调栈题目思路 通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置&#xff0c;此时我们就要想到可以用单调栈了。时间复杂度为O(n)。单调栈的本质是空间换时间&#xff0c;因为在遍历的过程中需要用一个栈来记录右边第一个比当前元…

大模型2024规模化场景涌现,加速云计算走出第二增长曲线

导读&#xff1a;2024&#xff0c;大模型第一批规模化应用场景已出现。 如果说“百模大战”是2023年国内AI产业的关键词&#xff0c;那么2024年我们将正式迈进“应用为王”的新阶段。 不少业内观点认为&#xff0c;2024年“百模大战”将逐渐收敛甚至洗牌&#xff0c;而大模型在…

DC-7靶机渗透详细流程

信息收集&#xff1a; 1.存活扫描&#xff1a; 由于靶机和kali都是nat的网卡&#xff0c;都在一个网段&#xff0c;我们用arp-scan会快一点&#xff1a; arp-scan arp-scan -I eth0 -l └─# arp-scan -I eth0 -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:dd:ee:6…

如何应对Android面试官->实战高级UI,用自定义View画一条锦鲤(上)

前言 如何用自定义View画一条鱼&#xff0c;其中涉及到哪些知识点&#xff1f;我们先上效果图&#xff1a; 涉及的知识点&#xff1a; 整体可以分为三大步骤 小鱼的绘制小鱼的摆动点击之后小鱼的游动 小鱼的绘制 想实现小鱼的绘制&#xff0c;我们首先需要分解下这个小鱼都由…

re:从0开始的CSS学习之路 5. 颜色单位

0. 写在前面 没想到在CSS里也要再次了解这些颜色单位&#xff0c;感觉回到了大二的数字图像处理&#xff0c;可惜现在已经大四了&#xff0c;感觉并没有学会什么AI的东西 1. 颜色单位 预定义颜色名&#xff1a;HTML和CSS规定了147种颜色名。例如&#xff1a;red yellow green …

如何使用websocket

如何使用websocket 之前看到过一个面试题&#xff1a;吃饭点餐的小程序里&#xff0c;同一桌的用户点餐菜单如何做到的实时同步&#xff1f; 答案就是&#xff1a;使用websocket使数据变动时服务端实时推送消息给其他用户。 最近在我们自己的项目中我也遇到了类似问题&#xf…

Django模板(二)

标签if 标签在渲染过程中提供使用逻辑的方法,比如:if和for 标签被 {% 和 %} 包围,如下所示: 由于在模板中,没有办法通过代码缩进判断代码块,所以控制标签都需要有结束的标签 if判断标签{% if %} {% endif %} : # athlete_list 不为空 {% if athlete_list %}# 输出 ath…

Qt 常用算法及正则表达式

目录 常用算法 正则表达式 常用算法 double c qAbs(a)&#xff0c;函数 qAbs() 返回 double 型数值 a 的绝对值 double max qMax(b,c)&#xff0c;函数 qMax() 返回两个数值中的最大值 int bnqRound(b)&#xff0c;返回一个与浮点数最接近的整数值(四舍五入) int cn q…