分支和循环相关练习1
Suzhou 82 0
计算n以内数字的阶乘
#include <stdio.h>

int main()
{
    int a = 0;
    int b = 0;
    int n = 1;
    int m = 0;
    for(b = 1;b <= 3;b++)
    {
        n = 1;
        for(a = 1;a <= b; a++)
        {
            n *= a;
        }
        m += n;
    }
    printf("%d",m);
    return 0;
 } 

简化:

#include <stdio.h>

int main()
{
    int a = 0;
    int b = 0;
    int ret = 1;
    int sum = 0;
    for(a = 1;a <= 3;a++)
    {
        ret *= a;
        sum += ret;
    }
    printf("%d",sum);
    return 0;
 } 

有序数组中查找
# include <stdio.h>

int main ()
{
    int k = 7;  //被查找值
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int sz = sizeof(arr)/sizeof(arr[0]);  //计算数组中元素个数
    int left = 0;  //左下标
    int right = sz-1;  //右下标
    while(right >= left)
    {
        int mid = (left+right)/2;  //循环中每次都需要重新计算mid
        if (k < arr[mid])
        {
            right = mid-1;
        }
        else if (k > arr[mid])
        {
            left = mid+1;
        }
        else
        {
            printf("%d\n",mid);
            break;
        }    
    }
    if(right < left)  
    {
        printf("找不到");        
    }

    return 0;
}

多个字符从两端到中间汇聚

::: tip 代码思路: 设计一个多个字符组成的数组(arr1[])和另一个同样多数量符号(如#)组成的数组(arr2[]),字符向中间汇聚的过程可以描述成符号组成的数组的两端,不断被字符组成的数组赋值的过程。 即arr2[left] = arr1[left],arr2[right] = arr1[right],left++,right--,直到left == right。 :::

#include <stdio.h>
#include <string.h>  //消除“内置函数“strlen”的不兼容隐式声明”的警告

int main()
{
    char arr1[] = "welcome!!";
    char arr2[] = "#########";
    int left = 0;
    int right = strlen(arr1)-1;
    while(left <= right)
    {
        printf("%s\n",arr2);  //打印出全#
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        left ++;
        right --;
    }
    printf("%s\n",arr2);  //打印全部字符

    return 0;
 } 
#########
w#######!
we#####!!
wel###e!!
welc#me!!
welcome!!

--------------------------------
Process exited after 0.01459 seconds with return value 0

::: warning 字符串数组来说,当采用“sz=sizeof(arr)/sizeof(arr[0])”计算数组中元素个数确定下标时,数组中的字符末尾的“\0”也占用一个下标,即sz需要减去2才能得到right。 求字符串长度可以使用函数strlen(arr),计算长度时遇到“\0”就会停止,即sz减1就可以得到所需right。 ::: ::: tip 在循环体内添加“Sleep xxx(ms)”可以实现间隔xxx毫秒打印(需要添加相应头文件“#include <windows.h>”)。 在循环体内添加“system("cls")”可以实现打印一次后清空屏幕打印下一次(需要添加相应头文件“#include <stdlib.h>”)。 :::


设计三次登录失败返回程序
#include <stdio.h>

int main ()
{
    int a = 0;
    int passwd[20] = {0};
    for(a=1;a<=3;a++)
    {
        printf("请输入密码");
        scanf("%s",passwd);
        if(passwd == "123456")
        {
            printf("登录成功");
            break;
         } 
        else
        {
            printf("密码错误\n"); 
        }
    }
    if (a > 3)
    {
        printf("登录失败"); 
    }
    return 0;
}
请输入密码1254
请输入密码123456
请输入密码12584
登录失败
--------------------------------
Process exited after 6.626 seconds with return value 0

上述代码逻辑正确,输出结果报错的原因是:第11行代码中,错误使用“==”对两个数组进行比较,正确方法如下:

#include <stdio.h>

int main ()
{
    int a = 0;
    int passwd[20] = {0};
    for(a=1;a<=3;a++)
    {
        printf("请输入密码");
        scanf("%s",passwd);
        if(strcmp(passwd,"123456") == 0)
        {
            printf("登录成功");
            break;
         } 
        else
        {
            printf("密码错误\n"); 
        }
    }
    if (a > 3)
    {
        printf("登录失败"); 
    }
    return 0;
}
请输入密码1524
密码错误
请输入密码123456
登录成功
--------------------------------
Process exited after 4.867 seconds with return value 0

::: tip strcmp函数用于比较两个字符串并根据比较结果返回整数。 基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。 :::

评论区

索引目录