接着分支与循环《一》
for循环
for循环的语法结构
for(表达式1;表达式2;表达式3)
循环语句;
表达式1:表达式1为初始化部分,。用于初始化变量的。
表达式2:表达式2为条件判断语句,用于判断循环时候终止。
表达式3:表达式3为调整部分,用于循环条件的调整
实际的问题:例如利用for循环打印1到10
int main()
{
int i=0;
//初始化 判断 调整
for(i=0;i<10;i++)
{
printf("%d ",i)
}
return 0;
}
for循环的执行流程
下面代码会输出什么结果?
int main()
{
int i=0;
//初始化 判断 调整
for(i=0;i<10;i++)
{
if(i==5)
//break;//利用监视窗口,观察数值变化
continue;//1 2 3 4 6 7 8 9 10
printf("%d ",i)
}
return 0;
}
break,continue在while和for循环中的意义是一样的。
for语句的循环控制变量
一些建议:
1.不可以在for循环体内修改循环变量,防止for循环失去控制
2.建议for语句的循环控制变量的取值采用“钱闭后开区间”的写法
int i=0;
//前闭后开的写法
for(i=0;i<10;i++)
{}
//两边都是闭区间
for(i=0;i<=9;i++)
{}
1.for循环的初始化,调整,判断都可以省略但是for循环的判断部分 如果被省略,那判断条件就是:恒为真
2.如果不是非常熟练,建议大家不要随便省略
int main()
{
for(;;)
{
printf("haha\n");
}
return 0;
}
for循环每个部分都有意义,因此不能随便省略,例如下面代码输出结构不同
实例:1
int main()
{
int i=0;
int j=0;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("haha\n");
}
}
//10*10
return 0;
}
int main()
{
int i=0;
int j=0;
for(;i<10;i++)
{
for(;j<10;j++)
{
printf("haha\n");
}
}
//10个哈哈,因为第二个循环结束之后再次进去的时候j不会初始化,
//第一次进去的时候被自增为10,后面就会直接出去。
return 0;
}
实例2:
int x,y;
for(x=0,y=0;x<2&&y<5;++i,y++)
{
printf("haha\n");
}
return 0;
///输出2个haha
请问循环要循环多少次?
int main()
{
int i=0;
int k=0;
for(i=0,k=0;k=0;i++,k++)
k++;
return 0;
}
在中间应该判断循环的条件的时候却,将0赋值给了k,因此判断为假,不进入循环
do while()循环
do while语句的语法
do
循环语句:
while(表达式);
int main()
{
//1--10
int i=0;
do
{
printf("%d"i);
i++;
}
while(i<=10);
return 0;
}
do while 循环中break和continue
int main()
{
//1--10
int i=0;
do
{
if(5==i)
break;
//continue;
printf("%d"i);
i++;
}
while(i<=10);
return 0;
}
break输出:1 2 3 4
continue输出:1 2 3 4 光标卡住
do while语句的特点:循环至少执行一次,使用的场景有限,所以不是经常使用
练习
1.计算n的阶乘
int main()
{
int i=0
int n=0;
int ret=1;
scanf("%d",&n);//不考虑溢出
for(i=0;i<n;i++)
{
ret=ret*i;
}
printf("ret=%d\n",ret);
return 0;
}
2.计算1!+2!+3!+......10!
int main()
{
int i=0
int n=0;
int ret=1;
int sun=0;
for(n=1;n<10;n++)
{
ret=1;
for(i=0;i<n;i++)
{
ret=ret*i;
}
//n的阶乘
sum=sum+ret;
}
//ret=1*1=1
//ret=1*1*2=2
//ret=1*1*2*3=6
printf("sum=%d\n",sum);
return 0;
}
int main()
{
int i=0
int n=0;
int ret=1;
int sun=0;
for(n=1;n<10;n++)
{
ret=ret*n;
//n的阶乘
sum=sum+ret;
}
printf("sum=%d\n",sum);
return 0;
}
3.在一个有序数组中查找具体的某个数字n。编写 int binsearch(int x,int v[],int n);功能在v[0<=v[1]<=v[2]<=.....<=v[n-1]的数组中查找x
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int k=7;
//写一个代码,在arr数组中(有序的)中找到7
int i=0;
int sz=sizeof(arr)/sizeof(arr[0]);
for(i=0;i<sz;i++)
{
if(k==arr[i])
{
printf("找到了,下标是:%d\n",i);
break;
}
}
if(i==sz)
printf("找不到\n");
return 0;
}
折半查找算法
二分法
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int sz=sizeof(arr)/sizeof(arr[0]);//计算元素个数
int reft=0://左下标
int right=sz-1;/右下标
while()
{
int mid=(reft+right)/2;
if(arr[mid]>k)
{
right=mid-1;
}
else if(arr[mid]<k)
{
left=mid+1;
}
else
{
printf("找到了,下标是:%d\n",mid);
break;
}
}
//...
if(left>right)
{
printf("找不到\n");
}
return 0;
}
4.编写代码,演示多个字符从两边移动,向中间汇聚
#include<string.h>
#include<windows.h>
#include<stdlib.h>
int main()
{
//welcome!!!!!!
//w############
//we###########
//.....
//welcome!!!!!!
//char arr[]="abc"
//[a b c \0]
// 0 1 2 3
//4-2,如果写成4-1则会指向\0的位置
char arr1[]="welcome!!!!!!";
char arr2[]="#############";
int left=0;
//int right=sizeof(arr1)/sizeof(arr1[0])-2;//err
while(left<=right)
{
int right=strlen(arr-1)
arr2[left]=arr1[left];
arr2[right]=arr1[right];
printf("%s\n",arr2);
//休息一秒
Sleep(1000);
system("cls")//执行系统命令的一个函数————cls清屏函数
left++;
right--;
}
printf("%s\n",arr2);
return 0;
}
5.编写代码实现,模拟用户登录情景,并且只能登录三次(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则推出程序)
int main()
{
int i=0;
char password[20]={0};
for(i=0;i<3;i++)
{
printf("请输入密码:");
scanf("%d",password);
if(strcmp=(password,"123456")==0)//==不能用于比较两个字符串是否相等,
//应该使用一个库函数__strcmp
{
printf("登录成功!\n");
break;
}
else
{
printf("密码错误\n");
}
}
if(i==3)
printf("三次密码均输入错误,退出程序\n");
return 0;
}