初始C语言-2.C语言程序的四种基本结构

学习C语言二,C语言的四大基本结构

还有下的视频在我B站主页找

概要:C语言的四种基本结构是很重要的,程序主要是由这些结构组成,学完这些结构,便可以写一些基本的程序。。

一,四种基本结构

 二,四种基本结构精析

        一.分支结构(if-else)

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

1.1首先,if()后面的


表达式一定为真,才能继续后面的语句,否则运行else中的语句。(为真的意思就是非0);

1.2语句组中,可为单个句子,也可为多条语句,如果为单条语句,{}可以省略不用;若为多条语句,则必须要加{},否则会有语法错误。

1.3上述结构叫做双分支结构


,当然也会有单分支结构,也有多分支结构,还有一种很变态的多分支结构。(后面会着重介绍)

//本题目要求计算下列分段函数f(x)的值:

#include<stdio.h>
int main(){
    float x,r;
    scanf("%f",&x);
    if(x!=0)
    {r=1/x;
        printf("f(%.1f) = %.1f",x,r);
     
    }   else
        printf("f(0.0) = 0.0");
        return 0;
}

 **这里再给大家一个例题自己尝试。

单分支结构(if结构)

有的人就会问了,为啥单分支结构只是if结构?不能是else结构吗?          不行

if的英文意思是”如果“,没有”如果“哪里来的”另外“?

即if可以单独使用,而else不行。

if(){
    语句组;
}

**重点还是要说一下if命令的嵌套使用,基本除了顺序结构外,每一种结构的嵌套都很重要且常用!

1.4什么叫嵌套?

1.if(){
	if(){
		
	}
	else{
		
	}
} 


2.if(){
	
}
else{
	if(){
		
	}
	else{
		
	}
}



3.if(){
	if(){
		
	}
	else{
		
	}
}
else{
	if(){
		
	}
	else{
		
	}
}

这样看确实会有点眼花缭乱,我太懒了。。。

顾名思义,嵌套就是在一个里面加了其他的东西,可能就加了一个,也可能加了好多。只要你想,你可以一直循环着嵌套。

但是如果这样的话,问题又来了;

那么多if和else,要怎么才能知道,谁跟谁是互相配对的呢?

嵌套时,else总与最靠近它的,没有与别的else配对过的if相匹配。

当对某个问题的限制条件仍有限制时,可以选择if的嵌套结构。

这也是一个很好的例题,希望大家能搞懂。 

1.5多分支结构;

多分支结构与嵌套结构往往是用的比较多的;

if(){
	
}else if(){
	
}else{
	
}

else if可以写好多个,依题目而定。当问题有好多个限制条件把这个问题分为若干个小部分时,可以选择多分支结构。

//猜数字游戏
#include<stdio.h>
int main(){
	int mynumber=789;
	int yournumber;
	printf("please input a digit:");
	scanf("%d",&yournumber);
	if(mynumber==yournumber)
	printf("good guess!");
	else if(yournumber>mynumber)
	printf("Too big");
	else
	printf("Too small");
	return 0;
}

例如这个题目,题目要么对,要么错,但是错的时候却有太大和太小,所以我选择用多分支结构。

1.6(变态的)多分支结构(swith结构)

 *** switch后面的表达式中只能是整型式,或者字符型(特殊的整型);

因为浮点型数字并不能精准存放,它也不能拿出来作为比较的量。

总的来说,switch结构就是比较方便一点的多分支结构,多分支结构一旦分支太多,可能会导致错误,因为if else实在太多,同时程序的可读性也不强。switch相比多分支结构更简洁,清晰。

但是switch的限制也比较大,只能用于整型。

着重讲一下这个default,这个是很必要的,如果switch接收到的量不是case中的任何一个,我们又想让程序有操作,也便于我们找出错误的地方,所以选择这个default,意思就是如果上面的case一个都不满足,就执行它;

来点邪恶的东西,如果我把default放在所有case的前面会怎么样?

当这个时候,程序先执行除了default的代码,最后执行default。

如果default后面没有break,程序会执行default下面的代码,无视case匹配,直到又遇到break;

这是一个很好的解释例子,这个代码中case的顺序也不是按顺序来的,default也不按常理出牌,但是最后仍然输出了-1,但是为什么又输出了3? 

因为default中没有break,程序继续向后执行,直到遇见break,在这里,return和break有一样的作用。    看下下面的这个例子;

#include<stdio.h>
int main(){
	int choice,i;
	double price;
	printf("[1].......\n");
	printf("[2].......\n");
	printf("[3].......\n");
	printf("[4].......\n");
	printf("[5]exit\n");//提供选择 
	for(i=1;i<=5;i++)//给五次选择的机会 
	{
	    printf("请输入选择:");
	    scanf("%d",&choice);
	    if(choice==5)
	    break;
	    switch(choice)
	{
		case 1:price=1;break;
		case 2:price=2;break;
		case 3:price=3;break;
		case 4:price=4;break;
		default:price=0;break;
	}
	printf("price=%.1f\n",price);
	}
	printf("Thanks\n"); 
	return 0;
}

1.7条件运算表达式

这里用的是比较少的一个表达式因为运用条件比较苛刻,只有当一个问题有两种情况时才能使用,一般到了后面就很难遇到这么简单的题目了;

表达式1?表达式2:表达式3;条件运算表达式由?:;组成,是C语言中提供的唯一一个三目运算符 。

 如上,首先判断n是否大于5,如果n大于5,执行表达式2,如果小于等于5,则将n赋值为0;

此刻就相当于一个双分支结构。这个并不常见,就不做过多讲解了。

***二,循环结构

如果没猜错的话,循环绝对会是大部分同学的噩梦,不管是初学者还是学过一段时间的人,学过好久的人也免不了在这里踩坑,一定一定要用心认真搞清楚!!!

   

循环主要分为两种,一种是for循环一种是while循环,两者实际上是相通的,只有在某种情况下谁更合适而已。 

      一,for循环

for循环是C语言中比较常用的一种结构了,尤其在数组中,更为明显。

1.for循环的基本结构

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

我们来分析一下这个结构,如下图,我也会做一些补充。

 我们对缺省做一下分析,表达式1是一般是不能缺省的,因为表达式1的作用是初始化变量,当然,如果你非要不写在里面,那就写在外面,看个人喜好,但是写在里面的可读性更好。

......那如果是表达式2缺失呢?我们一定要学会一种思维,想问题的时候要追根溯源,例如这里,表达式2缺失会怎么样?我们选择溯源去想,表达式2的作用是什么呢?表达式2的作用是判断。。也叫做循环的限制语句,如果限制条件没有了,系统会默认表达式二为真,则会很容易造成死循环,这个时候就不得不讲一讲break和continue命令了;

continue常用于if结构中; 

 由上可知,除非有break或者continue,你就等着死循环吧。

如果,表达式3缺省呢?这就跟表达式1一样了,这里不写,其他的地方也要写,不写就等着死循环吧。

它的运行顺序又是怎么样的呢?

#include<stdio.h>
int main(){
	int count,num,i;
	double score,total;
	printf("Enter num:");
    scanf("%d",&num);
    printf("请输入%d个成绩:",num);
    total=0;
    count=0;
    for(i=1;i<=num;i++)
    {
    	total=total+score;
    	if(score<60)
    	count++;
    	scanf("%lf",&score);
	}
    if(num!=0){ 
	printf("Averge is %.2f\n",total/num);
	printf("Number of failure is %d\n",count);
	} 
	else
	printf("Averge is 0");//是除法时,则要专门写一个if,来考虑分母为0的情况!!! 
	return 0;
}

 

二,while循环与do-while循环

while(表达式){
    循环体(所有的都是这样,花括号中只有一条语句时,可不要花括号)
}
do{

    循环体;

}while(表达式);

两个循环结构中虽然都有while,都是也有不相同。

1.while循环可能一次都不发生,只要表达式为假。

2.do-while一定至少发生一次,先执行后判断;do-while只是一条单语句,所以后面要加;分号。

试着把这些例子看懂,能看懂就很棒了;

   三,循环嵌套

1.for循环嵌套;

这可太简单了,就是for里面再加一个for(俗称套娃),当然,可以无限套。

2.其他的循环嵌套也都是这样,都是一个套一个的。直接上例题吧。

还有一些,循环与分支结构的互相嵌套,这个概念还是很好理解的,就直接上题了;

这道题难度很大,一定要搞懂!!!!!!!

这个也要好好看看。

 

上面几道题都要好好看看。

四,子程序结构(函数结构)

1.函数是C语言程序的基本组成单元,迄今为止编写的每一个程序都需要用到函数。

基本结构就是函数声明,函数调用,加上函数定义。

int sum (int m,int n);//函数声明;
	//sum前面的int是返回值类型
	//sum是函数名
	//后面的两个int是形参的数据类型
#include<stdio.h>
double cylinder(double r,double h);//函数声明; 
int main(){
	double height,radius,volumn;
	printf("Enter radius and height:");
	scanf("%lf%lf",&radius,&height);
	volumn=cylinder(radius,height);//函数调用,将返回值赋给volumn; 
	printf("volumn=%.3f",volumn); 
	return 0;
} 
double cylinder(double r,double h){//定义求圆柱面积的函数; 
	double result;
	result=3.1415926*r*r*h;
	return result;//返回结果; 
}
/*也可不声明函数,但需要将新定义的函数放在main函数之前*/
#include<stdio.h>
double cylinder(double r,double h){//定义求圆柱面积的函数; 
	double result;
	result=3.1415926*r*r*h;
	return result;//返回结果; 
int main(){
	double height,radius,volumn;
	printf("Enter radius and height:");
	scanf("%lf%lf",&radius,&height);
	volumn=cylinder(radius,height);//函数调用,将返回值赋给volumn; 
	printf("volumn=%.3f",volumn); 
	return 0;
}

我们这里说的函数都是自定义函数,当然,那些系统函数也是人写的,身份不一样而已。

2.依据上方代码可知,自定义函数要先声明(向系统表明我已经创造了这个函数,系统会给这个函数分配地址),再在main函数中对其调用(也不一定非要在main函数中调用,后面讲)。调用之后,就要在main函数之外写自定义函数了。

问题来了,为什么要在main函数之外去写这个自定义函数。

*****敲黑板的内容来了:

函数定义不能嵌套,至于为什么,我也不知道。

3.现在再来说一下参数问题,在函数中,参数又分形参和实参,啥叫实参?啥叫形参?

简单来说,形参就是形式参数,在声明中,变量名是可有可无的,在自定义函数入口处其实也可以省略,只要自定义函数中不用到那个变量,当然,一般都是要用到的。

那么实参呢?实参就是实际接受到的数据,这个是必须要有名字的,不然怎么将数据传到里面?

那么根据我上面的解释,你们知道在上面那个代码中,哪个是形参哪个是实参吗?

没错,自定义函数后面接的括号里面的内容就是形参,函数声明中的也是形参,而函数调用中的参数就是实参。

说省略的问题只是为了让大家了解这个知识,而不是提倡大家去省略,一定不要以为这样写的少就很帅,一个好的程序跟他的可读性还是有很大关联的。

4.那么,我们为什么要自定义函数呢?好像大部分的操作在main函数中也能完成。

这个在之后写大项目时便能知道函数的方便之处,其实函数的用处是很大的,它给了我们更多的选择,是我们在处理问题时也更加的方便。

话不多说,直接上代码。

#include<stdio.h>
#include<math.h>
int prime(int m){
	int i,limit;
	if(m<=1)
	return 0;
	else if(m==2)
	return 1;
	else{ 
	limit=sqrt(m)+1;
	for(i=2;i<=limit;i++){//1不是素数,所以从2开始 
			if(m%i==0)
			return 0;
		}
	}
	return 1;
}
int main(){
	int x,y,k,count=0;
	printf("请输入x,y:");
	scanf("%d%d",&x,&y);
	if(x<1||y>500||x>y)
	printf("Invalid!\n");
	else{
		for(k=x;k<=y;k++){
			if(prime(k)==1){//根据返回值判断。 
				printf("%6d",k);
				count++; 
			}
			if(count%10==0)
			printf("\n");
		}
		
	}
	return 0;
}

#include<stdio.h>
int sum(int m,int n){
	int i,result=0;
	for(i=m;i<=n;i++){
		result+=i;
	}
	return result;
}
int main(){
	int m,n,sum_;
	printf("Enter m,n:");
	scanf("%d%d",&m,&n);
	sum_=sum(m,n);
	printf("%d",sum_);
	return 0;
}

还有要注意的就是函数的返回值问题,首先,函数一次只能返回一个值,再一个就是,新手经常会混淆返回值是谁的这个问题,其实很简单,主函数调用时,要的是什么值,就返回什么值。

5.参数传递

首先,参数只能由实参传向形参,形参的改变是无法干扰实参的;

 见上面的代码;

说的都差不多了,再给大家拓展一下;有关静态变量的问题(static)

 

 这是为什么呢?这里就又要讲一讲有关C语言程序的储存内容了;

就像形参为什么不能影响实参?

 系统会给自定义函数开辟一个空间,当自定义函数结束后,空间就会被释放。存储的变量就也被释放了。所以形参不能影响实参。如果我加上了static,我就将自定义函数中的变量放到了静态区中,成了静态变量。知道main函数执行完毕,变量空间才会被释放。

希望大家能有所收获!!!一定要把我上面写的代码看懂哦,这样基本上这些结构你就能搞清楚了,这类问题便很难难到各位了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢吃豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值