IOS学习第6天
循环结构
同1件事,反复不停的去做,这样的情况我们就叫做循环
分类
while循环结构
do-while循环结构
for循环结构
特点
1.同一件事
2.反复不停的去做,中间不能停
3.循环也有结束的时刻
- 优点
1.代码少,看起来简洁
2.后期的维护和修改非常方便
注意点
while循环
1.while后面的条件表达式可以是任意的表达式,0为假,非0为真
2.永真与永假
while(1)
while(0)
3.循环体可以有任意行的代码
4.要找出循环体,并指导循环继续或结束的条件
穷举:一个一个的测试,指导找到正确答案,这种解决问题的方式叫做穷举
例子:
1.循环体确定 而且循环次数也确定
例如:
打印"凤姐我爱你" 10次
#include <stdio.h>
int main(int argc, const char * argv[]) {
// insert code here...
//1.循环体 : printf("凤姐我爱你\n"); 次数还要+1
//2.循环条件: 打印的次数 不超过10次
int count = 0;//变量用来记录打印次数
/*
count 和 打印的次数
0 1
1 2
9 10
*/
// "规律: 如果 记录次数的变量 从0开始 那么 小于几 就是几次"
while(count < 15){
printf("凤姐我爱你\n");
count++;
}
return 0;
}
1.获取10个1-99之间的随机数,每获取一个判断并且打印这个数是奇数还是偶数
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
// insert code here...
//1.循环条件: 10次
int count = 0;
//2.循环体: 按照没学过while循环写代码 赋值粘贴的那些代码就是循环体
while(count < 10){
//1-99的随机数 [0-98]+1
int num = arc4random_uniform(99)+1;
//判断这个数是奇数还是偶数
if (num % 2 == 0) {
printf("这个数%d是偶数\n",num);
}else{
printf("这个数%d是奇数\n",num);
}
count++;
}
return 0;
}
“应用场景”:循环体确定 但是循环次数不确定
例子: 让用户输入密码 直到输对为止 假设密码是:88888
/*
分析 :
循环条件: 密码不对
循环体: 复制粘贴的哪一些代码 就是循环体
*/
#include <stdio.h>
int main(int argc, const char * argv[]) {
// insert code here...
//记录密码的变量
int pwd = 0;
while (pwd != 88888) {//当密码不对的时候循环
printf("请输入密码:\n");
scanf("%d",&pwd);
if (pwd == 88888) {
printf("密码正确");
}else{
printf("密码错误\n");
}
}
// int pwd = 0;
// printf("请输入密码:\n");
// scanf("%d",&pwd);//我们只输入数字
// if (pwd == 88888) {
// printf("密码正确\n");
// }else{
// printf("密码错误\n");
// }
return 0;
}
例题:
反复地询问用户 "你爱我吗? y(爱)/n(不爱)"
直到用户输入y为止才停止询问
/*
分析:
循环体:
循环条件: user != 'y'
*/
#include <stdio.h>
int main(int argc, const char * argv[]) {
// insert code here...
char user = 'a';//定义一个变量 用来存储用户的输入
while(user != 'y'){
printf("你爱我吗? y(爱)/n(不爱)\n");
rewind(stdin);
scanf("%c",&user);//n 回车
//n给了user 但是回车还在缓存中,下一次执行的时候会直接取走'\n'这个符号 而不用你自己输入
}
return 0;
}
"提示":只要 scanf("%c",&user); 就在这句代码前 加上一个
rewind(stdin);
例题:
用户输入 登陆账号和密码 ,只有账号和密码都正确才能登陆,否则要求用户重新输入 账号和密码
#include <stdio.h>
int main(int argc, const char * argv[]) {
// insert code here...
//循环体:
//循环条件: 账号不正确(123456) 或者 密码不正确(888888)
int account = 0;//记录账号的变量
int pwd = 0;//记录密码的变量
while(account != 123456 || pwd !=888888){
printf("请输入账号:\n");
scanf("%d",&account);
printf("请输入密码:\n");
scanf("%d",&pwd);
//循环体是输入账号 和 密码
}
// printf("恭喜登陆成功\n");
return 0;
}
"应用场景":遍历一个范围内所有的数
例题:
打印0-10的每一个整数
#include <stdio.h>
int main(int argc, const char * argv[]) {
// insert code here...
//循环体:
//循环条件:11次
/*
分析:
count 和 我们要打印的值
0 0
1 1
2 2
*/
// int count = 0;
// while(count < 11){
//
// printf("%d\n",count);
// count++;
// }
/*
分析:
count 要打印的值
0 1
1 2
2 3
要打印的值 = count + 1
*/
//改一下题目 打印 1-10所有的整数
// int count = 0;
// while (count < 10) {
// //打印
// printf("%d",count+1);
// count++;
// }
int count = 1;
while (count < 11) {
//打印
printf("%d",count);
count++;
}
return 0;
}
"应用场景":找出一个范围内指定范围的数
例题:
打印1-100之内 能被8整除的数
int count = 1;//count 从1 开始 因为打印的数值也是从1开始,这样不用再计算
while (count < 101) {
if(count % 8 == 0){
//并不是所有的数都要打印
printf("%d ",count);
}
count++;
}
"例题":打印 100-200 之间的偶数
#include <stdio.h>
int main(int argc, const char * argv[]) {
// insert code here...
// 打印 100-200 之间的数
int count = 100;
/*
count 和要打印的值
0 100
1 101
2 102
要打印的值 = count + 100
*/
while(count < 201){
//不是所有的数都要打印
if (count % 2 == 0) {
printf("%d ",count);//要打印的值
}
count++;
}
}
"例题":打印 1000- 5000 之内 各个位数的和为5 的数
int main(int argc, const char * argv[]) {
// insert code here...
//怎么求各个位数
/*
分析: 1234
把你要的那个数 移到个位
1234 % 10 = 4
1234/10%10 = 3
1234/100%10 = 2
1234/1000 = 1
*/
//打印 1000- 5000 之内 各个位数的和为5 的数
int count = 1000;
while (count < 5001) {
//这个打印语句 不是所有的书都需要打印
int ge = count / 1 % 10;
int shi = count / 10 % 10;
int bai = count / 100 % 10;
int qian = count / 1000 % 10;
if (ge + shi + bai + qian == 5) {
printf("%d ",count);
}
count++;
}
}
"应用场景":求累加和平均值
例题:
求1+2+3+4+5...+100的和
#include <stdio.h>
int main(int argc, const char * argv[]) {
// insert code here...
//先把题目简单化:打印1-100所有的数
int count = 1;
int sum = 0;//求和的容器
while (count < 101) {
// 这一句是打印 所有的数
//但是 题目不是打这个数 而是求和
//既然都打印出来了 那么只要不打印, 把这个数加到某一个容器中
// sum = sum+count;
/*
sum = 0 + 1;
sum = 0 + 1 + 2
sum = 0 + 1 + 2 + 3
....
*/
sum+=count;//sum + count ;sum = count
// printf("%d ",count);
count++;
}
printf("sum = %d\n",sum);
return 0;
}
"例题:
请用户输入班级的人数
然后依次 输入每一个学生的成绩
求 成绩的总分和平均分
#include <stdio.h>
int main(int argc, const char * argv[]) {
// insert code here...
//1.确定一下人数
printf("请输入您的班级人数:\n");
int nums = 0;
scanf("%d",&nums);
//循环
int count = 0;
//count cong 0 开始 那么count 小于 xxx 就是循环xxx次
int sum = 0;//求和的容器
while (count < nums) {
/*
循环体里面都要干啥?
1.提醒:请输入第2个人的成绩
2.scanf
3.求和 */
//提示输入第几个学生
printf("请输入第%d个学生的成绩\n",count + 1);
int score = 0;
scanf("%d",&score);
//求和
sum+=score;//不能写成 sum+score; sum = score
count++;
}
//打印总成绩和平均分
printf("sum = %d\n",sum);
printf("avg = %d\n",sum / nums);
return 0;
}
"应用场景":求若干个数的最大值和最小值
例题:
让用户输入5个数,求这5个数的最大值
int main()
{
//1.定义一个变量A,就是存放最大值的 ---> 相当于上面例子 拳王
int max = INT32_MIN;
//2.定义一个变量B,接受用户输入的数 ---> 相当于上面例子的 班里面的挑战者
int shuRu = 0;
//3.写循环-->接受用户输入,并找出最大值 --> 依次上台挑战拳王
//3.1-->次数: 循环5次
int i = 1;
while (i<6) {
//3.2-->循环体: 在循环体中,让用户向变量B中输入数据,输入完毕之后,和变量A进行比较,如果B比A,把B的值赋值给A,总之,A中存储的一定是用户已经输入的数中最大的一个
printf("请输入第%d个数",i);
scanf("%d",&shuRu);
max = max > shuRu?max:shuRu;
i++;
}
printf("你输入的最大的数是%d",max);
return 0;
}
break与continue
1.break在哪可以使用?
“强调”: 第一个在switch-case结构中使用
第二个在循环结构中使用break;
在if-else中 使用了break 也不起作用
2.break在循环结构中的作用:
立即终止循环,就算后面还有代码 不会执行
3.continue在哪可以使用?
只有在循环结构中可以使用
4.continue在循环结构中的作用:
立即终止本次循环 而进行下次一个判断
用于加速循环