C语言学习-翁凯-第五章

第五章

5.1.1for循环

阶乘

  • n! = 1 * 2 * 3 * 4 * 5 * …* n
  • 写一个程序,让用户输入n,然后计算输出n!
  • 变量:
    • 显然读用户的输入需要一个int 的n,然后计算的结果需要用一个变量保存,可以是int的factor,在计算中需要有一个变量不断地从1递增到n,那可以是int的i
int n;scanf("%d",&n);
int  fact=1;int i=1;
while(i<=n){fact *= i;i++;
}printf("%d!=%d\n",n,fact);

可以使用for语句,改良为

int n;scanf("%d",&n);
int  fact=1;int i;
for(i=1;i<=n;i++){fact *= i;
}printf("%d!=%d\n",n,fact);

for(初始动作;循环继续的条件;循环每轮要做的事情)

for循环

​ for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步进进行调整,比如加1或者减1

for(i=0;i<5;i=i+1){printf("%d",i);
}

for = 对于

  • for(count=10;count>0;count–);
  • 就读成:“对于一开始的count=10,当count>0时,重复做循环体,每一轮循环在做完循环体内语句后,使得count–。”

小套路

  • 做求和的程序时,记录结果的变量应该初始化为0,而做求积的变量时,记录结果的变量应该初始化为1
  • 循环控制变量i只在循环里被使用了,在循环外面它没有任何用处。因此,外面可以把变量i的定义写到for语句里面去
int n;scanf("%d",&n);
int  fact=1;for(int i=1;i<=n;i++){fact *= i;
}printf("%d!=%d\n",n,fact);

(只有c99才能用!)

try

  • 1*1还是1,所以程序的循环不需要从1开始,那么改成从多少开始合适呢?这样修改之后,程序对所有的n都正确吗?这样的改动有价值吗?
  • 除了可以从1乘到n来计算n!,还可以从n乘到1来计算吧?试试把循环换个方向来计算n。这时候,还需要循环控制变量i吗?
int n;scanf("%d",&n);
int  fact=1;int i=n;
//for(int i=1;i<=n;i++){//    fact *= i;
//}
for(;n>1;n--){fact *= n;
}printf("%d!=%d\n",i,fact);

5.1.2循环的计算和选择

循环次数

  • for(i=0;i<n;i++);
  • 则循环的次数是n,而循环结束以后,i的值是n。循环的控制变量i,是选择从0开始还是从1开始,是判断i<n还是判断i<=n,对循环的次数,循环结束后变量的值都有影响

for == while

for(int i=1;i<=n;i++){fact *= i;
}

等价于

int i=1;
while(i<=n){fact *=i;i++;
}

for循环

for(初始动作;条件;每轮的动作){ }

  • for中的每一个表达式都是可以省略的

    • for(;条件;) == while(条件)

三种循环

for循环

while循环

do-while循环

Tips for loops

  • 如果有固定次数,用for
  • 如果必须执行一次,用do-while
  • 其他情况用while

5.2.1循环控制

素数

  • 只能被1和自己整除的数

    • 2,3,5,7,11,13,17,19······

break vs continue

  • break:跳出循环
  • continue:跳过循环这一轮剩下的语句进入下一轮

int x;scanf("%d",&x);int i;
int isPrime=1;
for(i=2;i<x;i++){if(x%i == 0){isPrime=0;break;}
}
if(isPrime==1){printf("是素数\n");
}else{printf("不是素数\n");
}return 0;

5.2.2嵌套的循环

100以内的素数

  • 如何写程序输出100以内的素数?
int x;for(x=2;x<=100;x++){int i;
int isPrime=1;
for(i=2;i<x;i++){if(x%i == 0){isPrime=0;break;}
}
if(isPrime==1){printf("%d",x);
}
}return 0;

嵌套的循环

  • 循环里面还是循环

输出前50个素数

int x;
int cnt=0; for(x=2;cnt<50;x++){int i;
int isPrime=1;
for(i=2;i<x;i++){if(x%i == 0){isPrime=0;break;}
}
if(isPrime==1){cnt++;printf("%d\t",x);if(cnt%5==0){printf("\n");}
}
}return 0;

5.2.3从嵌套的循环中跳出(离开多重循环)

凑硬币

  • 如何用1角、2角和5角的硬币凑出10元以下的金额呢?
int x;
int one,two,five;scanf("%d",&x);
for(one=1;one<x*10;one++){for(two=1;two<x*10/2;two++){for(five=1;five<x*10/5;five++){if(one+two*2+five*5==x*10){printf("可以用%d个1角加%d个2角加%d个5角得到%d元。\n",one,two,five,x);}}}
}return 0;

break和continue

  • 只能对它所在的那层循环做

接力break

int x;
int one,two,five;
int exit=0;scanf("%d",&x);
for(one=1;one<x*10;one++){for(two=1;two<x*10/2;two++){for(five=1;five<x*10/5;five++){if(one+two*2+five*5==x*10){printf("可以用%d个1角加%d个2角加%d个5角得到%d元。\n",one,two,five,x);exit=1;break;}}if(exit)break;}if(exit==1)break;
}return 0;

goto

int x;
int one,two,five;scanf("%d",&x);
for(one=1;one<x*10;one++){for(two=1;two<x*10/2;two++){for(five=1;five<x*10/5;five++){if(one+two*2+five*5==x*10){printf("可以用%d个1角加%d个2角加%d个5角得到%d元。\n",one,two,five,x);goto out;}}}
}
out:
return 0;

5.3.1求和-前n项求和

int n;int i;double sum=0.0;scanf("%d",&n);for(i=1;i<=n;i++){sum += 1.0/i;}printf("f(%d)=%f\n",n,sum);return 0;

 int n;int i;double sum=0.0;int sign=1; scanf("%d",&n);for(i=1;i<=n;i++){sum += sign*1.0/i;sign=-sign;}printf("f(%d)=%f\n",n,sum);return 0;

5.3.2整数分解

正序分解整数

  • 输入一个非负整数,正序输出它的每一位数字
  • 输入:13425
  • 输出:1 3 4 2 5
 int x;scanf("%d",&x);int t=0;do{int d=x%10;t=t*10+d;x/=10;}while(x>0);printf("x=%d,t=%d\n",x,t);x=t;do{int e=x%10;printf("%d",e);if(x>9){printf(" ");}x/=10;}while(x>0);printf("\n");return 0;

但是当x最后一位为0时,会被省略,如700,输出为7

改进版:

int x;scanf("%d",&x);int mask=1;int t=x; while(t>9){t/=10;mask*=10;}printf("x=%d,mask=%d\n",x,mask);do{int d=x/mask;printf("%d",d);if(mask>9){printf(" ");}x%=mask;mask/=10;}while(mask>0);printf("\n");return 0;

5.3.3求最大公约数

求最大公约数

  • 输入两个数a和b,输出它们的最大公约数
  • 输入:12 18
  • 输出:6

枚举

  1. 设t为2;
  2. 如果u和v都能被t整除,则记下这个t;
  3. t加1后重复第2步,直到t等于u或v;
  4. 那么,曾经记下的最大的可以同时整除u和v的t就是gcd。
int a,b;
int min;scanf("%d %d",&a,&b);
if(a<b){min=a;
}else{min=b;
}
int ret=0;
int i;
for(i=1;i<min;i++){if(a%i==0){if(b%i==0){ret=i;}}
}printf("%d和%d的最大公约数是%d。\n",a,b,ret);

辗转相除法

  1. 如果b等于0,计算结束,a就是最大公约数;
  2. 否则,计算a除以b的余数,让a等于b,而b等于那个余数;
  3. 回到第一步。
 int a,b;int t;scanf("%d %d",&a,&b);while(b!=0){t=a%b;a=b;b=t;printf("a=%d,b=%d,t=%d\n",a,b,t);}printf("gcd=%d\n",a);return 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语言 10 9-8 7-6… 1循环语句,C语言学习与总结---第五章:循环结构程序设计

    循环结构程序设计 5.1 while语句 5.2 do-while语句 5.3 for语句 5.4 循环的嵌套 5.5 while与do-while的比较 5.7 改变循环执行的状态 5.7.1 co ...

  5. Python语言学习:基于python五种方法实现使用某函数名【func_01】的字符串格式('func_01')来调用该函数【func_01】执行功能

    Python语言学习:基于python五种方法实现使用某函数名[func_01]的字符串格式('func_01')来调用该函数[func_01]执行功能 目录 问题提出 代码五种设计思路 T1方法:e ...

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

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

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

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

  8. DirectX12龙书--第五章笔记

    需要龙书电子版的可联系我,部分图片太大,csdn导入不了,可访问我的github图床github或者在书里面查看. DirectX12龙书第五章笔记 第五章 5.1 3D视觉即错觉? 5.2 模型的表 ...

  9. 《学习Opencv》第五章 习题6

    这是第五章 习题5.6的结合版,其中实现了摄像头抓拍功能,能够成功运行. #include "stdafx.h" #include "cv.h" #includ ...

  10. JavaScript高级程序设计(第4版)学习随笔【第五章】

    第五章主讲基本引用类型 引用值(或者对象)是某个特定引用类型的实例.新对象通过使用new操作符后跟一个构造函数(constructor)来创建.引用类型有时候也被称为对象定义,因为它们描述了自己的对象 ...

最新文章

  1. 他自学成才,坐拥38w粉丝,技术类第一大号!
  2. leetcode笔记:Gray Code(2016腾讯软件开发笔试题)
  3. jQueryMobile常用技巧
  4. 判断某一天是这一年的第多少天
  5. Leedcode4-sort listnode 归并排序
  6. Cilium架构:提供并透明地保护应用程序工作负载之间的网络连接和负载平衡
  7. OpenShift 4 - DevSecOps Workshop (13) - 将镜像推送到Quay,并进行漏洞扫描
  8. 【elasticsearch】elasticsearch的问题之ERROR: bootstrap checks failed
  9. C++ 出现异常“.... \debug_heap.cpp Line:980 Expression:__acrt_first_block==header“
  10. 机器学习算法基础4-K-近邻算法、朴素贝叶斯算法、分类模型评估、模型的选择与调优
  11. uni-app 167将某人踢出群聊(二)
  12. 反思腾讯:大数据与AI时代的危与机
  13. .img文件怎么打开(解压缩)
  14. 3d游戏计算机怎么配置要求吗,3DMAX软件对电脑的配置要求
  15. 大数据与云计算学习:Python网络数据采集
  16. 2020年4月11日
  17. 如何才能画出透亮迷人的双眼?
  18. 在移动端设置overflow:hidden禁止滚动的解决方法
  19. 【C# Opencv机器视觉】 Opencv水位检测、液体高度检测、卡尺高度检测
  20. 哪家的云服务器便宜?

热门文章

  1. 金山PDF转WOED 1.3.0.1007版本
  2. 字体,字号与尺寸对应表
  3. QT实现的人机对战五子棋
  4. linux查询文件md5sum,Linux下通过md5sum生成MD5文件校验MD5
  5. 【工具分享】推荐一款超级好用的截图工具
  6. 斐讯K2P B1 博通TTL刷机方法
  7. 斐讯路由器k2编程器救砖教程
  8. 华为手机解锁码快速申请方式
  9. 后台管理软件测试用例,如何进行测试用例管理?
  10. 深入理解LTE网络的CDRX