C语言的三种基本结构

C程序的流程控制



一、C程序的结构化

C程序是以顺序结构,分支结构,循环结构三种基本结构构建的,单入口单出口

二、C程序的三种基本结构

1.顺序结构

顺序结构: CPU从上到下依次执行

2.分支结构

1.分支结构功能:实现多选一
2.分支结构分两类:条件分支,开关分支

a.条件分支

条件分支语法格式:
 格式A:
 if(表达式A){ 		
 	语句1;
 }

如果表达式A为真,那么就执行语句1;

 格式B:
 if(表达式A){
 	语句1;
 }else{
 	语句2;
 }

如果表达式A为真,那么就执行语句1;否则执行语句2;

 格式C
 if(表达式A){
 	语句1;
 }else if(表达式B){
 	语句2;
 }
 ....
 else if(表达式N){
 	语句N;
 }

如果表达式A为真,那么就执行语句1;如果表达式A不为真,那么执行表达式B;如果表达式B为真,那么就执行语句2;如果表达式B不为真,那么就依次向下判断

 格式D:
 if(表达式A){
 	语句1;
 }else if(表达式B){
	语句2;
 }
 ...
 else if(表达式N){
 	语句N;
 }else{
 	语句M;
 }

如果表达式A为真,那么就执行语句1;如果表达式A不为真,那么就执行表达式B,如果表达式B为真,那么就执行语句2;如果表达式B不为真,那么就依次向下判断,如果上面表达式都不成立那么就执行语句M。

例如

#include <stdio.h>
#include <string.h>

int main(void){
	//定义并初始化字符串
	char str1[]="hello";
	char str2[]="china";
	int len=0;

	//形式A:if
	if(strlen(str1)){
		printf("str1的有效长度:%d\n",strlen(str1));
	}
	
	//形式B:if...else
	len=strlen(str2);
	if(0 == len){
		printf("str2为空字符串\n");
	}else{
		printf("str2字符串有效长度:%d\n",len);
	}

	//形式C:if...else if
	len = compare(str1,str2);
	if(len > 0){
		printf("str1大于str2\n");
	}else if(0 == len){
		printf("str1等于str2\n");
	}else if(len < 0){
		printf("str1小于str2\n");
	}
	
	//形式D:if...else if...esle
	if(str1[0] != (*(str2+0)){
		str1[0] = (*(str2+0));
	}else if(str1[1] != (*(str1+1))){
		str1[1] = (*(str2+1));
	}else if(str1[2] != (*(str2+2))){
		str1[2] = (*(str2+2));
	}else if(str1[3] != (*(str2+3))){
		str1[3] = (*(str2+3));
	}else if(str1[4] != (*(str2+4))){
		str1[4] = (*(str2+3));
	}else{
		printf("%s %s\n",str1,str2);
	}
	
	return 0;
}

//定义字符串比较函数
int compare(char *pstr1,char *pstr2){
	while(*pstr1){
		if(*pstr1 != *pstr2){
			return *pstr1 - *pstr2;
		}
		pstr1++;
		pstr2++;
	}
	return *pstr1 - *pstr2;
}
条件分支使用注意事项

1.if和else的配对原则:else或者else if和最近的if配对
2.如果语句只有一条{}是可以省略的

b.开关分支

开关分支语法结构:
 switch(控制表达式){
 	case 常表达式1:
 		语句1;
 		break;
 	case 常量表达式2:
 		语句2;
 		break;
 	...
 	case 常量表达式N:
 		语句N
 		break;
 	default:
 		语句M;
 		break; //可以省略
 	}

控制表达式的计算结果和case对应的常量表达式数值相等,那么就会执行对应的语句,一旦遇到break,switch…case开关分支立刻结束,如果控制表达式和case对应的常量表达式都不相等,那么就会执行default对应的语句。

例如

#include <stdio.h>

int main(void){
	//100~90  A
	//89~80   B
	//79~70   C
	//69~60   D
	//其他 	  E
	int a=0;
	printf("请输入你的成绩:");
	scanf("%d",&a);	

	if(a < 0 && a > 100){
		printf("成绩不合法\n");
		return -1;
	}
	switch(a/10){
		case 10:
		case 9:
			printf("成绩为A等\n");
			break;
		case 8:
			printf("成绩为B等\n");
			break;
		case 7:
			printf("成绩为C等\n");
			break;
		case 6:
			printf("成绩为D等\n");
			break;
		default:
			printf("成绩为E等\n");
		}
		
	
	return 0;
}
开关分支使用注意事项:

1.控制表达式被当成一个整数处理(int),可以是字符,但是不能是浮点数和字符串
2.常量表达式必须是常量,不允许有重复的分支case
3.如果其中某个case对应的break没有添加,那么当这个case成立后,并且执行其对应的语句后会继续执行下一个case
4.default关键字可以写在任意case前但是必须添加break
5.分支语句case:或者default如果定义变量记得添加{},并且将来只能在对应的case使用
6.gcc编译器对开关分支switch…case生成的代码要比条件分支if…else少,所以switch…case代码执行效率高

2.循环结构

循环结构的功能:将一组语句重复多次执行
三种类型循环:for循环,while循环,do…while循环

1.for循环

for循环的语法格式:
  for(表达式A,表达式B,表达式C){
  		循环语句;
  }

for循环语句的执行流程:
步骤一:首先计算运行表达式A(只运行一次)
步骤二:然后计算运行表达式B,
如果表达式B的结果为真时,那么运行循环语句;
如果表达式B的结果为假时,那么for循环结束退出;
步骤三:如果表达式B为真,那么就运行循环语句,并且当循环语句运行完毕
再接着计算运行表达式C,表达式C运行完毕,接着步骤二直到表达式B为假时

例如

#include <stdio.h>
#include <string.h>
int main(void){
	char a[]="hello,world";
	char b[]="hello,china";

	//形式1
	for(int i=0;i < strlen(b);i++){
		if(*(a+i) != *(b+i)){
			*(a+i) = *(b+i);
		}
	}
	//打印输出字符串
	printf("a=%s b=%s\n",a,b);

	//形式2
	//for循环的的死循环
	for(;;){
		printf("%s\n",b);
	}
	
	//形式3
	int i=0;
	for(;i<10;i++){
		printf("%d\n",i);
	}

	//形式4
	for(int i=0;;i++){
		if(i >= 10){
			break;
		}
		printf("%s\n",b);
	}
	
	//形式5
	for(int i=0;i <10;){
		if( 0 == (i%2)){
			continue;
		}
		printf("%d\n",i);
	}
	return 0;
}

while循环

while循环语法格式:
  while(循环控制表达式){
  	循环语句;
  }

while循环语句执行流程:
步骤一:首先执行循环控制表达式
如果循环控制表达式为真,那么就执行循环语句
如果循环控制表达式为假,while循环直接结束
步骤二:当循环语句执行完毕,继续执行第一步骤

如果while循环语句只有一条{}可以省略

例如

#include <stdio.h>

int main(void){
	int number=0;
	int sum=0;

	while(number++ <= 100){
		sum += number;
	}
	printf("%d\n");
	return 0;
}

do…while循环

do…while循环语法格式:
  do{
  	循环语句;
  }while(循环控制表达式);

do…while循环语句执行流程:
步骤一:先执行循环语句
步骤二:然后计算执行循环控制表达式
如果为真,继续执行循环语句,后续依次重复
如果为假,do…while循环结束
do…while循环语句特点:至少执行一次

切记while()后的分号不可省略

例如

#include <stdio.h>

int main(void){
	char a[5]={'A','B','D','E','F'};
	int len=sizeof(a)/sizeof(a[0]);
	int b=0;
	do{
		printf("%d\n",*(a+b));
		b++;
	}while(b < len);  //此分号不可省略
	
	return 0;
}

goto语句

goto语句语法格式:
	goto 标签;

可以让cpu跳转到任何一条语句去执行,标签名就是指定要跳转的地方
标签名根据标识符命名规则来定

例如

#include <stdio.h>
typedef enum{
	LABEL_FREE_ONE,
	LABEL_FREE_TOW,
	LABEL_FREE_THREE
}label_t;

int main(void){
	//形式1:
	int a[5]={1,2,3,4,5};
	int len=sizeof(a)/sizeof(a[0]);
	int i=0;
lab:
	printf("%d\n",a[i]);//打印输出数组的第i个元素
	i++;
	if(i <len){
		goto lab;
	}

	//形式2
	int number=0;
	scanf("%d",&number); //输入非0表示分配失败
						//输入0表示分配成功
		
	printf("分配第一块内存:");
	if(0 != number){
		printf("分配失败\n");
		goto LABEL_ONE;
	}
	
	printf("分配第二块内存\n");
	if(0 != number){
		printf("分配失败\n");
		goto LABEL_TOW;
	}
	
	printf("分配第三块内存\n");
	if(0 != number){
		printf("分配失败\n");
		goto LABEL_THREE;
	}

	printf("三块内存分配成功\n");
	return 0;
	
LABEL_FREE_THREE:
	printf("释放第二块内存\n");
LABEL_FREE_TOW:
	printf("释放第一块内存\n");
LABEL_FREE_ONE:
	printf("释放完成,程序结束\n");
	return number;
}

空语句

空语句使用语法:
	;

仅仅包含一个;语句

应用场景:

用于实现一个空循环,延时
延时的时间不明确

例如

#include <stdio.h>

int main(void){
	for(;;);

	for(int 1=0;i <10000;i++);

	while(1);

	;
	return 0;
}

切记:在while/for循环中的圆括号误写了;,意外的变成了空循环

例如

#include <stdio.h>

int main(void){
	//园括号后误写上;导致循环语句成为空语句
	for(int i=0;i<10;i++);{
		//报错,未定义,如果循环变量定义在循环体内,循环变量只能用于该循环
		printf("%d\n",i);  
	}
	return 0;
}

C语言多维数组

多维数组

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值