C语言—分支循环语句

1.if-else语句

if(表达式)
     语句1;
else
     语句2;

其中else部分是可选的。该语句执行时,先计算表达式的值,如果其值为真(既表达式的值为非0),则执行语句1;如果其值为假(既表达式的值为0),并且该语句包含else部分,则执行语句2。

由于if语句只是简单测试表达式的数值,因此可以对某些代码的编写进行简化。最明显的例子是用如下写法

if(表达式)来替代 if(表达式!=0)

因为if-else语句的else部分是可选的,所以在嵌套的if语句中省略它的else部分将导致歧义。解决的方法是将每个else与最近的前一个没有else配对的if进行匹配。例如:

if(n>0)
  if(a>b)
     z=a;
  else
     z=b;

else部分与内层的if匹配,我们通过程序的缩进结构也可以看出来。如果这不符合我们的意图,则必须使用花括号强制实现正确的匹配关系:

if(n>0){
   if(a>b)
     z=a;
}
else
     z=b; 

2.else—if语句

在C语言中我们会用到下列结构

if(表达式)

    语句

else if(表达式)

    语句

else if(表达式)

    语句

else

    语句

各表达式被依次求值,一旦某个表达式结果为真,则执行与之相关的语句,并终止整个语句序列的执行。同样,其中各语句既可以是单条语句,也可以是用花括号括起来的复合语句

最后一个else部分用于处理“上述条件均不成立”的情况或默认情况,也就是当上面条件都不满足时的情形。

这里通过一个折半查找函数说明三路判定程序的用法。该函数用于判定已排序的数组V中是否存在某个特定的值x。数组v的元素必须以升序排列。如果V中包含x,则该函数返回x在V中的位置(介于0~n-1之间的一个整数);否则,该函数返回-1。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int binsearch(int x, int v[], int n) {  // 将 v 改为 int 类型数组
    int low, high, mid;

    low = 0;  //定义数组左下标为0
    high = n - 1; //右下标为n-1
    while (low <= high) { 
        mid = (low + high) / 2; //折半查找,先找到一个中间值
        if (x < v[mid])         //如果目标值小于中间值,则从该数组前半部分查找
            high = mid - 1; 
        else if (x > v[mid])    //如果目标值大于中间值,则在数组的后半部分查找
            low = mid + 1;
        else
            return mid;
    }
    return -1;
}

int main() {
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };  // 初始化整数数组
    int n = 0, num = 0;  // 增加 num 用于存储要查找的数字

    printf("输入你要查找的数:");
    scanf("%d", &num);  // 使用 scanf 正确获取整数输入
    int result = binsearch(num, arr, sizeof(arr) / sizeof(arr[0]));  // 正确传递参数
    printf("您的查找数字下标为:%d", result);
    return 0;
}

3.switch语句

switch语句是一种多路判定语句,它测试表达式是否与一些常量整数值中的某一个值匹配,并执行相应的分支动作

switch(表达式){

  case 常量表达式:语句序列

  case 常量表达式:语句序列

  default:语句序列
}

 每一个分支都由一个或多个整数值常量或常量表达式标记。如果某个分支与表达式的值匹配,则从该分支开始执行。各分支表达式必须互不相同。如果没有哪一分支能匹配表达式,则执行标记为default的分支,default分支是可选的。如果没有default分支也就没有其他分支与表达式的值匹配,则该switch语句不执行任何动作。各分支及default分支的排列次序是任意的。

编写一个程序以统计各个数字,空白符及其他所有字符出现的次数

#include <stdio.h>

int main() {
    int c, i, nwhite, nother;//c:存储从输入读取的单个字符 i:用于循环控制 nwhite:统计输入中的空白字符(如空格,制表符,换行符)的数量
    //nother 统计输入中既不是数字也不是空白字符的其它字符的数量 ndigit统计数字0到9在输入中出现的次数
    int ndigit[10];  

    nwhite = nother = 0; //将nwhite和nother初始化为0,并且将ndigit数组中所有元素初始化为0
    for (i = 0; i < 10; i++)
        ndigit[i] = 0;

    while ((c = getchar()) != EOF) {  //只要从标准输入读取的字符c不是文本结束符EOF,就会执行循环体
        switch (c) {        //通过switch语句判断输入的字符c,如果是数字字符,就将对应的ndigit数组元素的值加1       
        case '0': case '1': case '2': case '3': case '4':
        case '5': case '6': case '7': case '8': case '9':
            ndigit[c - '0']++;
            break;
        case' ':   //如果输入的是空格,换行符或制表符,就将nwhite的值加1
        case '\n':
        case '\t':
            nwhite++;
            break;
        default:    //对于其他任何字符,将nother的值加1
            nother++;
            break;
        }
    }
    printf("digits=");
    for (i = 0; i < 10; i++)
        printf("%d ", ndigit[i]);  // 通过for循环打印出ndigit数组中每个元素的值,并在每个值之间添加一个空格
    printf("white space =%d,other=%d\n", nwhite, nother); //最后打印出空格字符的数量nwhite和其它字符的数量nother

    return 0;
}

break语句将导致程序的执行立即从switch语句中退出。

4.while循环与for循环

当程序中没有初始化或重新初始化的操作,使用while循环语句更自然。

while(表达式){
     语句
     表达式;
}

例
while((c=getchar())=='' || c=='\n' || c=='\t');

如果语句中需要执行简单的初始化和变量递增,使用for语句更合适一点,它将循环控制语句集中放在循环的开头,结构更紧凑,清晰。  

for(表达式1;表达式2;表达式3)
    语句

例
for(i=0;i<n;i++)
   ...

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值