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++)
...