C语言综述(2)

本文详细介绍了C语言中的流程控制,包括顺序、选择和循环结构,并深入探讨了函数的使用,如函数定义、调用、声明、递归调用、函数分解和C程序结构。此外,还讲解了数组的一维和二维数组及其初始化、越界问题,以及指针的基本概念、作用和指针与数组的关系。最后,涉及了结构体的定义、结构体数组、结构体与指针以及结构体在函数中的应用。
摘要由CSDN通过智能技术生成

目录

1、流程控制

1.1、流程控制的基本结构

1.2、 顺序结构

1.3、选择结构

1.4、循环结构

2、函数与程序结构

2.1、函数

2.2、递归调用与递归算法

2.3、程序的函数分解

2.4、C程序结构

3、数组

3.1、一维数组

3.2、二维数组

3.3、数组越界

4、指针

4.1、指针的基本概念

4.2、指针存在的作用

4.3、指针与数组

4.4、函数指针和指针函数

5、结构体

5.1、结构体数组

5.2、结构体与指针

5.3、结构体与函数


1、流程控制

1.1、流程控制的基本结构

1.2、 顺序结构

顺序结构是按照语句排列自上而下、依次顺序执行,顺序结构是最简单的程序结构,也是最常用的程序结构,只要按照解决问题的顺序写出相应的语句就行,一般的程序设计中顺序结构与选择结构,循环结构相互嵌套复合使用

#include <stdio.h>

int main(void)
{
    int a=0;
    int b=0;
    a=10;
    b=20;

    printf("%d + %d=%d\n",a,b,a+b);

    return 0;
}

1.3、选择结构

选择结构是当给定判断条件时,根据条件来判断是否满足某些条件,从而从两条或者多条路径中选择要执行的操作路径。

#include <stdio.h>

int main(void)
{
    int a=0;
    int b=0;
    a=10;
    b=20;
    if(a>b)
    {
       printf("a > b\n");
    }
    else
    {
       printf("a <= b\n");
    }
    
    return 0;
}
#include <stdio.h>
int main(){
    int a;
    printf("Input integer number:");
    scanf("%d",&a);
    switch(a){
        case 1: printf("Monday\n"); break;
        case 2: printf("Tuesday\n"); break;
        case 3: printf("Wednesday\n"); break;
        case 4: printf("Thursday\n"); break;
        case 5: printf("Friday\n"); break;
        case 6: printf("Saturday\n"); break;
        case 7: printf("Sunday\n"); break;
        default:printf("error\n"); break;
    }
    return 0;
}

1.4、循环结构

循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件,判断继续执行某个功能还是退出循环。

#include <stdio.h>

int main(void)
{
    int i=0;
    int tm=0;
    int sum=0;

    for(i=0;i<10;i++)
    {
        printf("hello world\n");
    }
    while(tm<10)
    {
        printf("world hello\n");
        tm++;
    }
    //先做一次在判断
    do
    {
         sum++;
         printf("this is sunday\n");
    }while(sum<12);
  
    return 0;
}

2、函数与程序结构

2.1、函数

一个函数包含声明部分和执行部分。执行部分由语句组成,编译后产生机器指令,C程序的结构如下:

# C是函数式语言。  

# 一个C程序必须有且只能有一个名为main的主函数。  

# C程序的执行总是从main函数开始,在main中结束。  

# 函数不能嵌套定义,可以嵌套调用。

注:函数定义、函数调用、函数声明、函数执行、函数参数传递、函数设计

(1)、函数定义

函数的本质是一种抽象机制,一个函数将一段代码封装,用一个表达式(即函数调用)代替,实际上是将一个计算过程抽象为一个操作。

#include <stdio.h>

int fun1()
{
	printf("这是调用函数fun1\n");
	return 0;
} 
int main(void)
{
	fun1();
	return 0;
}

函数的优点:

#降低程序的规模,提高程序设计的效率

#提高程序的可读性,使程序更容易理解。

#减小程序修改的复杂性。

#实现模块复用。

 (2)、函数调用、函数声明

函数调用的一般写法为:函数名(实际参数列表)//实际参数如果过多需要用逗号隔开。

对被调用函数的要求:

 #对于库函数:#include<*.h>

 #必须是已经存在(定义)的函数

 #对于用户定义的函数:函数原型声明。

函数声明的一般形式: 函数类型 函数名(形参类型 [形参名],...); 或 函数类型 函数名();

     以上的函数声明称为函数原型(函数接口)。作用是告诉编译系统函数类型、函数名、各参数的类型及顺序,以便检验函数调用与函数声明是否一致。

     函数声明位置:程序的声明语句部分(函数内或函数外) 被调用函数定义在主调函数main之前,可不进行函数声明!

#include <stdio.h>

int main(void)
{
   float add(float,float);//函数声明
   float a,b,c;
   scanf("%lf%lf",&a,&b);
   c=add(a,b);//函数调用,a,b为实参
   printf("sum is %lf\n",c);
   return 0;
}

float add(float x,float y)//h函数定义,x,y为形参
{
   float z;
   z=x+y;
   return (z);
}
   

(3)函数执行

程序的执行是沿着main函数的主线进行,但遇到函数调用时,程序压栈保护现场,执行流程会暂时偏离main函数,而转到被调用函数去执行,当被调用函数执行完毕后,又返回到main函数,继续往下执行。被调用函数还可能会再调用其他函数,形成嵌套调用。

(4)参数传递

形参与实参

       形式参数:定义函数时函数名后面括号中的变量名

       实际参数:调用函数时函数名后面括号中的表达式

1、实参可以是常量、变量或表达式。    

       C语言规定,实参到形参变量的数据传递是“值传递”,即实参与形参是按传值方式相结合,也称为传值调用(call by value)方式。传值调用的过程是:    

        ⑴ 即使实参是变量,形参变量与实参变量各占用一个独立的存储单元。形参变量是一            定要占用内存存储单元,且与实参变量占用的是不同的内存存储单元。  

        ⑵ 形参变量的内存存储单元是在函数被调用时才分配的。    

        ⑶ 函数调用结束返回时,为形参变量所分配的临时内存存储单元也被释放。 “值传递”            特点是:函数中对形参变量的操作不会影响到主调函数中的实参变量。

2、实参与形参的类型应一致。

3、实参与形参的个数应相等。

(5)函数设计

 C程序是由若干个函数组成的,函数是组成C语言应用程序的基本构件,因此,函数的设计是程序设计的关键。

设计一个函数的思路与步骤如下:

(1)、确定函数的功能,设计求解问题算法。

      首先,对问题进行详尽分析,以确定函数的具体功能、要得到的最终结果?其次,设计操作流程以实现函数功能,即确定算法。

(2)、给函数取一个好的名称。好的函数名应该能够让读者“见名识义”,以提高程序的可读性。

(3)、确定函数类型。根据函数得到的结果,

(4)、确定函数返回值类型。 确定函数形参变量。弄清楚算法对什么数据(形参变量)进行计算才能得到所期望的结果。 根据设计的操作流程(算法)编写函数体。

(5)、增加注释和函数说明。为了方便别人或者自己了解函数的功能,就需要做好函数注释和函数说明工作。

2.2、递归调用与递归算法

递归调用:函数调用自身的行为就是递归,可以直接或者间接调用。

    注:每一次递归调用时,都会在栈区申请一块内存,当递归次数过多或者递归没有限制条件,就会造成栈区内存泄漏。

//输出整型值,按顺序打印他们的每一位

#include <stdio.h>

void print(int n)
{
	if(n > 9)
	{
		print(n/10);//递归调用 
	}
	printf("%d\n",n%10); 
}
int main(void)
{
	int n=0;
	
	scanf("%d",&n);
	print(n);
	
	return 0;
}

递归的两个必要条件

(1)、存在限制条件,当满足这个限制条件的时候,递归便不再继续。

(2)、每次递归调用之后越来越接近这个条件。

递归的优点:简洁,思路清晰,可读性好

递归的缺点:运行时的效率较低

//求n的阶乘

#include <stdio.h>

int 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值