C语言:分支与循环《二》

接着分支与循环《一》

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值