今天我们要学的是c语言中的分支和循环语句_do~while循环语句(上)
目录:
一.do~whiile语句的语法形式
二.do~while语句的特点
三.break和continue在do~while语句中的作用
四.练习
下面让我们正式学习c语言中的分支和循环语句_do~while循环语句(上)
一.do~while语句的语法形式
在第四天我们的学习中,我们知道了while循环的三个必要条件是:初始化,判断,调试。do~while循环同时也需要这三个条件,但是它的条件的放置位置可与while循环天差地别,下面是do~while循环的语法形式:
int a=0;//初始化
do
{
printf("%d",a);
a++;//调试
}
while(a<=10);//判断
如图所示,do~while循环中的判断放置在了最后,这是与while循环的最大的不同
二.do~while语句的特点
相比于while循环语句(先判断再执行循环),do~while循环时先进行循环然后再判断 ,这导致do~while循环使用的局限性非常大,所以一般我们很少见到
三.break和continue在do~while语句中的作用
break和continue在do~while语句中的作用基本一致,最重要的还是流程变了
在上面的那个图片中stmt是循环语句,expr是判断
四.练习
1.计算n的阶乘
#include <stdio.h>
int main()
{
int a;
int b=1;
int n;
scanf("%d",&n);
for(a=1;a<=n;a++)
{
b=b*a;
}
printf("%d",b);
return 0;
}
代码解析:
1.<stdio.h>是有关于printf和scanf函数的头文件,所以要提前声明该头文件
2.n的阶乘是指:从1到n之间所有数之间的乘积
3.定义a=1用来进行1~n之间的乘积的计算
4.定义b=1为每次的乘法计算提供储存位置
5.b=b*a用来储存每次a与a的乘积的计算
假设n的值为2,则程序结果为
2.计算1!+2!+····+10!
#include <stdio.h>
int main()
{
int a;
int c;
int sum=0;
for(c=1;c<=10;c++)
{
int b=1;
for(a=1;a<=c;a++)
{
b=b*a;
}
sum=sum+b;
}
printf("%d",sum);
return 0;
}
代码解析:
1.<stdio.h>是有关于printf函数的头文件,所以要提前声明该头文件
2.c的作用是执行每次阶乘的递进
3.a的作用是计算每次递进后的阶乘的结果
4.b的作用是储存每次递进后的阶乘的结果
5.sum的作用是储存每次阶乘相加的结果
程序结果为
3.在一个有序数组中查找具体的某一个数字 (讲解二分查找)
注意:有序,具体,二分法(不断切割)
非二分法:
#include <stdio.h>
int main()
{
int num[]={1,2,3,4,5,6,7,8,9,10};
int n=sizeof(num)/sizeof(num[0]);
int a;
int b;
scanf("%d",&b);
for(a=0;a<n;a++)
{
if(b==num[a])
{
printf("%d",a);
break;
}
}
if(a==10)
printf("不存在");
return 0;
}
代码解析:
1.size(num)/size(num[0])的作用是求出非字符数组中的元素的个数,如果是数组元素可以直接用strlen函数即可
2.a==11说明不存在的原因是:for循环中是先初始化再判断,再执行语句,最后调试,其中再最后一次调试后a的值永远为11
3.这个非二分法是通过将num[a]与b不断遍历比较而得出所求元素的位置,比较复杂
4.a<n因为数组的下表是从零开始的
程序结果为:
当输入9:
当输入99:
二分法:
#include <stdio.h>
int main()
{
int num[]={1,2,3,4,5,6,7,8,9,10};
int n=sizeof(num)/sizeof(num[0]);
int left=0;
int right=n-1;
int mid=(left+right)/2;
int cai;
scanf("%d",&cai);
while(left<=right)
{
if(num[mid]<cai)
{
left=mid+1;
mid=(left+right)/2
}
if(num[mid]>cai)
{
right=mid-1;;
mid=(left+right)/2
}
if(num[mid]==cai)
{
printf("%d\n猜对了\n",mid);
break;
}
}
if(left>right)
printf("没找到,不存在\n");
return 0;
}
代码解析:
1.二分法求数的位置是主要根据数组的左侧(left)和右侧(right)和中间(mid)的轮回替换来实现的。
2.sizeof(num)/sizeof(num[0])用来计算数组的大小
3.mid=(left+right)/2;其中mid是中部,大小为左侧和右侧下标之和
4.当(num[mid]<cai)那么说明我们要猜的数再这个原数组中间的右边,因为这个是数组是有序数组,所以我们需要重新缩小距离,重新求得left和mid的值
5.当(num[mid]>cai)那么说明我们要猜的数再这个原数组中间的左边,因为这个是数组是有序数组,所以我们需要重新缩小距离,重新求得right和mid的值
6.其中right和left的值为mid+1或mid-1是因为mid的值本来不等于要猜的数字,所以我们需要加减1来跳过这个数字
7.只有left<=right的时候执行的循环才有效,因为left的值按道理要小于right的值,除非猜数已经实现了一个轮回
程序结果为:
当输入8时:
当输入11时:
明天我们要学的是c语言中的分支和循环语句_do~while循环语句(中)