C语言

第四章

4.1.1循环

数数几位数

  • 程序要读入一个4位以下(含4位)的正整数,然后输出这个整数的位数。如:
  • 输入352.输出:3

人VS计算机

  • 人的方式:眼睛一看就知道了

    • 352->3位!
  • 计算机的方式:判断数的范围来决定它的位数
    • 352∈[100,999]->3位
    • 人不擅长,因为人对数字的计算能力比文字弱

程序实现

int x;
int n = 1;scanf("%d",&x);if(x>999){n = 4;
}else if(x>99){n = 3;
}else if(x>9){n = 2;
}else{n = 1;
}printf("%d\n",n);
  • 因为题目明确了4位数及以下的正整数,所以可以简化一些判断
  • 因为从高处往下判断,所以不需要判断上限了
    • 反过来不行
  • 问题:任意范围的正整数怎么办?
    • 不可能每多加一位数就多加一个if,这样下去无穷尽也

换个方式想

  • 352->3 很快

    • 123812843267518273618273612675317是几位数?
  • 数数!

数数

  • 123812843267518273618273612675317
  • 人怎么数?从左往右数,一次划掉一个数字
  • 计算机怎么划掉那个数字呢?

三位数逆序的题

  • 352

    • 352%100 ->52
  • 那么123812843267518273618273612675317%100000000000000000000000000000000->23812843267518273618273612675317
  • 怎么得到那100000000000000000000000000000000?

人VS计算机

  • 如果换一下,从右边开始划
  • 123812843267518273618273612675317/10->12381284326751827361827361267531
  • 去掉最右边的数,然后?
  • 不断地划,直到没数可以划…
    • 在这个过程中计数

试试代码

int x;
int n=0;scanf("%d",&x);n++;
x/10;
if(x>0){n++;x/=10;if(x>0){n++;x/=10;if...}
}
printf("%d",n);
  • 这样还是没完没了,因此需要用到while
int x;
int n=0;scanf("%d",&x);n++;
x/10;
while(x>0){n++;x/=10;
}printf("%d",n);

4.1.2WHILE循环

if(x>0){x/=10;n++;
}
//与while语句
while(x>0){x/=10;n++;
}
//不同点是if是一次性的,while是反复执行

(循环体内要有改变条件的机会)

while循环

  • 如果我们把while翻译作“当”,那么一个while循环的意思就是:当条件满足时,不断地重复循环体内的语句。
  • 循环执行之前判断是否继续循环,所以有可能循环一次也没有被执行。
  • 条件成立是循环继续的条件。

再想想

int x;
int n=0;scanf("%d",&x);n++;
x/10;
while(x>0){n++;x/=10;
}printf("%d",n);
  • 如果没有外面的运算?
int x;
int n=0;scanf("%d",&x);while(x>0){n++;x/=10;
}printf("%d",n);

看程序运行结果

  • 人脑模拟计算机的运行,在纸上列出所有的变量,随着程序的进展不断重新计算变量的值。当程序运行结束时,留在表格最下面的就是程序的最终结果。

验证

  • 测试程序常使用边界数据,如有效范围两端的数据、特殊的倍数等

    • 个位数;
    • 10;
    • 0;
    • 负数。

调试

int x;
int n=0;scanf("%d",&x);n++;
x/10;
while(x>0){//printf("x=%d,n=%d\n",x,n);n++;x/=10;
}printf("%d",n);
  • 在程序适当的地方插入printf来输出变量的内容

4.1.3DO-WHILE循环

数位数的算法

  1. 用户输入x;
  2. 初始化n为0;
  3. x=x/10,去掉个位;
  4. n++;
  5. 如果x>0,回到3;
  6. 否则n就是结果。

do-while循环

  • 在进入循环的时候不做检查,而是在执行完一轮循环体的代码之后,再来检查循环的条件是否满足,如果满足则继续下一轮循环,不满足则结束循环
do
{<循环体语句>
}while(<循环条件>);

(左边do-while,右边while)

两种循环

  • do-while循环和while循环很像,区别是在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。
int x;
int n=0;
scanf("%d",&x);
do{n++;x/=10;
}while(x>0);
printf("%d",n);

4.2.1循环计算

log₂x

int x;
int ret=0;
scanf("%d",&x);
while(x>1){x/=2;ret ++;
};
printf("log₂x of %d is %d.",x,ret);

输出结果每次都是1,因为循环除以2最后永远是1(整数)。那么,这个log₂x错在哪呢?

小套路

  • 计算之前先保存原始的值,后面可能有用
int x;
int ret=0;
scanf("%d",&x);
int t=x;
while(x>1){x/=2;ret ++;
};
printf("log₂x of %d is %d.",t,ret);

这些值是怎么定的?

int x;
int ret=0;
scanf("%d",&x);
int t=x;
while(x>1){x/=2;ret ++;
};
printf("log₂x of %d is %d.",t,ret);

为什么ret从0开始?

为什么while的条件里面是x>1?

因为在循环中,各个数值之间是有关联的,比如做累加,初始值一般为0,但如果累乘就一般为1。

计数循环

int count=100;
while(count>=0){count--;printf("%d\n",count);
}
printf("发射!\n");
  • 这个循环需要执行多少次?
  • 循环停下来的时候,有没有输出最后的0?
  • 循环结束后,count的值是多少?

(小套路:如果要模拟运行一个很大次数的循环,可以模拟较少的循环次数,然后作出推断。)

4.2.2猜数游戏

猜数游戏

  • 让计算机来想一个数,然后让用户来猜,用户每输入一个数,就告诉他是大了还是小了,直到用户猜中为止,最后还要告诉用户他猜了多少次。
  • 因为需要不断重复让用户猜,所以需要用到循环
  • 在实际写出程序之前,我们可以先用文字描述程序的思路
  • 核心重点是循环的条件
    • 人们往往会考虑循环终止的条件
  1. 计算机随机想一个数,记在变量number里;
  2. 一个负责记次数的变量count初始化为0;
  3. 让用户输入一个数字a;
  4. count递增(加1);
  5. 判断a和number的大小关系,如果a大,就输出“大”;如果a小就输出“小”;
  6. 如果a和number是不相等的(无论大还是小),程序转回到第3步;
  7. 否则,程序输出“猜中”和次数,然后结束。

(循环的条件是a和number不相等)

scrand(time(0))int number=rand()%100+1;
int count=0;
int a=0;
printf("我已经想好了一个1到100之间的数。");
do{printf("请猜这个1到100之间数:");scanf("%d",&a);count++;if(a>number){printf("你猜的数大了。");}else if(a<number){printf("你猜的数小了。");}
}while(a != number);
printf("太好了!你用了%d次就猜到了答案。\n",count);

随机数

  • 每次召唤rand()就得到一个随机数

%100

  • x%100的结果是[0,n-1]的一个整数

4.2.3算平均数

算平均数

  • 让用户输入一系列的正整数,最后输入-1表示输入结束,然后程序计算出这些数字的平均数,输出输入的数字的个数和平均数
  • 变量->算法->流程图->程序

变量

  • 一个记录读到的整数的变量
  • 平均数要怎么算?
    • 只需要每读到一个数,就把它加到一个累加的变量里,到全部数据读完,再拿它去除以读到的数的个数就可以了
  • 一个变量记录累加的结果,一个变量记录读到的数的个数

算法

  1. 初始化变量sum和count为0;
  2. 读入number;
  3. 如果number不是-1,则将number加入sum,并将count加1,回到2;
  4. 如果number是-1,则计算和打印出sum/count(注意换成浮点来计算)。

#include<stdio.h>int main(){int number;int sum=0;int count=0;do{scanf("%d",&number);if(number!=-1){sum+=number;count++;scanf("%d",&number);}}while(number != -1);printf("%f\n",1.0*sum/count);return 0;
}

4.2.4整数逆序

整数的分解

  • 一个整数是由1至多位数字组成的,如何分解出整数的各个位上的数字,然后加以计算

    • 对一个整数做%10的操作,就得到它的个位数;
    • 对一个整数做/10的操作,就去掉了它的个位数;
    • 然后再对上一步结果做%10,就得到原来数的十位数了;
    • 以此类推。
#include<stdio.h>int main(){int x;scanf("%d",&x);int digit=0;int ret=0;while(x>0){digit=x%10;printf("%d",digit); ret=ret*10+digit;//printf("x=%d,digit=%d,ret=%d\n",x,digit,ret);x/=10;}//printf("%d",ret);return 0;
}

(这里有个小问题,输入007,输出为7,输入其他第一个数字不为0的都可以顺利逆置)

C语言学习-翁凯(第四章笔记)相关推荐

  1. C语言学习-翁凯(第九章笔记)

    C语言学习-翁凯(第九章笔记) 第九章 9.1.1 取地址运算:&运算符取得变量的地址 运算符& scanf("%d",&i);里面的& 获得变量的 ...

  2. C语言学习-翁凯(第六章笔记)

    C语言学习-翁凯-第六章 第六章 6.0.1 给定条件的整数集 int a;scanf("%d",&a);int i,j,k;int cnt=0;//i=indexi=a; ...

  3. C语言学习-翁凯(第七章笔记)

    C语言学习-翁凯(第七章笔记) 第七章 7.1.1初见函数 素数求和 int m,n;int i;int cnt=0;int sum=0;scanf("%d %d",&m, ...

  4. c语言选择结构程序设计报告,C语言学习与总结---第四章:选择结构程序设计

    选择结构程序设计 4.1 if语句 4.2 关系运算符和关系表达式 4.2.1 关系运算符 4.2.2 关系表达式 4.3 逻辑运算符和逻辑表达式 4.3.1 逻辑运算符 4.3.2 逻辑表达式 4. ...

  5. python语言程序设计基础答案第四章_《Python语言程序设计基础》第四章笔记

    4.1 程序的分支结构 4.1.1 单分支结构 if : if True: print("条件正确") 4.1.2 二分支结构 if : else : if True: print ...

  6. C语言入门——《明解C语言》入门篇第四章练习

    新开C语言专栏整理一下学C的艰苦之路,先从看书+视频开始. 整理了<明解C语言>入门篇第四章练习的"参考答案",记录一下学习的过程.直接上代码. 练习4-1 int m ...

  7. 机器学习实战 基于_机器学习实战:基于Scikit-Learn和TensorFlow—第四章笔记

    机器学习实战:基于Scikit-Learn和TensorFlow---第四章笔记 一.学习目标 之前用了那么多的机器学习的模型,但是它们各自的训练算法在很大程度上还是一个黑匣子,我们对对系统内部的实现 ...

  8. 谭浩强C语言程序设计代码示例第5章(笔记)

    谭浩强C语音程序设计代码示例第四章(新手入门笔记) 第一章包含参考书,在线编译工具,代码,注释等. 遵循共享互助原则 谭浩强C语言程序设计代码示例(1-3章) 谭浩强C语言程序设计代码示例第4章(笔记 ...

  9. 谭浩强C语言程序设计代码示例第6章(笔记)

    谭浩强C语音程序设计代码示例第六章(新手入门笔记) 第一章包含参考书,在线编译工具,代码,注释等. 遵循共享互助原则 谭浩强C语言程序设计代码示例(1-3章) 谭浩强C语言程序设计代码示例第4章(笔记 ...

  10. Python学习入门基础 -- 第四章 列表、元组、字典、字符串变量使用、变量进阶

    Python基础入门知识点总结传送门 第一章 认识Python.Python常用集成开发环境PyCharm 第二章 注释.变量基本使用.变量的命名 第三章 运算符.判断if语句.while和for循环 ...

最新文章

  1. 2022-2028年中国阻燃母料行业市场深度分析及发展规模预测报告
  2. linux环境变量管理器,运维 - linux(ubuntu) 环境变量管理 (持续更新)
  3. 【前端】2015阿里前端实习生在线笔试题
  4. 弹簧压缩 时间 matlab,用matlab解决弹簧振子摆动与时间的关系
  5. 高可用的eureka
  6. 右键我的电脑,没有属性,解决方案
  7. 8086控制转移指令学习笔记
  8. 我们正在破解JDBC,因此您不必
  9. macos实现输入文件输入结束符
  10. java关键字:volatile
  11. android开发实践之1:安装部署环境设置
  12. python从入门到精通-小白如何系统学习python,从入门到精通?
  13. python做性能测试_Python做性能测试-1、Locust基础篇
  14. Windows10重装专业版和mysql缺少dll文件或找不到入口点DLLRegisterServer问题处理
  15. JZOJ 6841. 【2020.11.5提高组模拟】淘淘蓝蓝之树林(凸包+最短路)
  16. lookup无序查找_Excel查询函数之无所不能的VLOOKUP(LOOKUP)实例介绍
  17. [RPI]关于树莓派3B+的AV接口(RCV)
  18. 慎用小封装大阻值电阻
  19. css一些特殊的图形,CSS 绘制特殊图形
  20. 密钥分配方案简述 集中式和分布式

热门文章

  1. 本周小折腾记录: ipad和电脑完成同屏功能
  2. Everything使用攻略和技巧
  3. django models filter查询条件
  4. 《机器学习》课后习题3.5 编辑实现线性判别分析,并给出西瓜数据集 3.0α 上的结果.
  5. 文献--A Survey on Server-side Approaches to Securing Web Applications
  6. 基于SpringBoot的在线问卷调查管理系统
  7. 基于单片机步进电机ppt答辩_智能小车答辩课件.ppt
  8. 【实用】MD5加密工具类及加密过程详解
  9. 010Editor的Template安装与使用
  10. 4k hidpi 黑苹果_黑苹果 篇四:开启mac下的2k hidpi选项,同时开启144hz