目录

  • 1 课程导论
    • 1.1 课程整体介绍
      • 1.1.1 所有专业人才培养方案
    • 1.2 为什么学(WHY)
      • 1.2.1 行业需求分析
      • 1.2.2 计算机等级考试大纲
      • 1.2.3 软件水平考试大纲
    • 1.3 课程性质及作用(WHAT&WHERE)
    • 1.4 学什么(WHAT)
      • 1.4.1 程序设计基础_知识图谱
    • 1.5 如何学(HOW)
      • 1.5.1 课程考核
      • 1.5.2 课程学习资源
      • 1.5.3 程序设计基础A_考试大纲
      • 1.5.4 蓝桥杯相关备赛资料
      • 1.5.5 程序设计基础学习资料
  • 2 程序与程序设计语言
    • 2.1 课前挑战
      • 2.1.1 扩展知识学习
        • 2.1.1.1 计算机发展史
        • 2.1.1.2 计算机系统构成
        • 2.1.1.3 计算机应用
        • 2.1.1.4 信息编码与存储
    • 2.2 课程导入(WHERE)
    • 2.3 要点解析(WHAT)
      • 2.3.1 什么是程序
      • 2.3.2 C程序基本结构如何
      • 2.3.3 什么是计算机指令
        • 2.3.3.1 指令与程序
      • 2.3.4 什么是计算机语言
        • 2.3.4.1 程序设计语言
        • 2.3.4.2 C语言概述
    • 2.4 项目实战(HOW)--60秒关机
    • 2.5 项目拓展(HOW)--查看本机IP地址
    • 2.6 实验(训)项目一:C语言编程基础
      • 2.6.1 学长说--第一个程序
      • 2.6.2 拓展练习代码截图
    • 2.7 章节通关测试--程序与程序设计语言
  • 3 问题求解与算法设计
    • 3.1 课前挑战
      • 3.1.1 问题求解与算法设计
      • 3.1.2 程序设计思想
    • 3.2 课程导入(WHERE)
    • 3.3 要点解析(WHAT)
      • 3.3.1 什么是算法
      • 3.3.2 算法有什么特征
      • 3.3.3 算法的描述方式
    • 3.4 项目实战(HOW)--流程图绘制
    • 3.5 项目拓展(HOW)--目标检测算法流程表述
    • 3.6 学长说--矩形面积计算
    • 3.7 章节通关测试-- 问题求解与算法设计
  • 4 标识符;数据类型
    • 4.1 课前挑战
    • 4.2 课程导入(WHERE)
    • 4.3 要点解析(WHAT)
      • 4.3.1 标识符的命名规则
      • 4.3.2 数据类型
    • 4.4 项目实战(HOW)--学习强国平台数据类型分析
    • 4.5 项目拓展(HOW)--GDP;北斗风电场数据类型分析
    • 4.6 学长说--查看数据类型内存空间
    • 4.7 章节通关测试--标识符与数据类型
  • 5 常量、变量
    • 5.1 课前挑战
      • 5.1.1 相关知识提前学--常量
      • 5.1.2 相关知识提前学--变量
    • 5.2 课程导入(WHERE)
    • 5.3 要点解析(WHAT)
      • 5.3.1 什么是变量、什么是常量
      • 5.3.2 如何声明变量及常量
    • 5.4 项目实战(HOW)--报文解密
    • 5.5 项目拓展(HOW)--疫情可视化
    • 5.6 章节通关测试--常量与变量
  • 6 运算符与表达式
    • 6.1 课前挑战
      • 6.1.1 相关知识提前学--运 算 符
      • 6.1.2 相关知识提前学--赋值运算符与赋值表达式
      • 6.1.3 相关知识提前学--自增、自减
      • 6.1.4 相关知识提前学--类型转换
      • 6.1.5 相关知识提前学--位运算
    • 6.2 课程导入(WHERE)
    • 6.3 要点解析(WHAT)
      • 6.3.1 赋值运算符及表达式
      • 6.3.2 算术运算符及表达式
      • 6.3.3 数据类型的转换
    • 6.4 项目实战(HOW)--报文解密
    • 6.5 项目拓展1·(HOW)--报文解密
      • 6.5.1 项目拓展--北斗卫星导航定位原理
    • 6.6 学长说--报文解密
    • 6.7 章节通关测试--运算符与表达式
  • 7 数据输入、输出
    • 7.1 输入、输出函数
      • 7.1.1 课前挑战
      • 7.1.2 课程导入(WHERE)
      • 7.1.3 要点解析(WHAT)
        • 7.1.3.1 输出函数printf
        • 7.1.3.2 输入函数scanf
      • 7.1.4 项目实战(HOW)--工资核算
        • 7.1.4.1 学长说--工资核算
      • 7.1.5 项目拓展(HOW)--北斗卫星导航定位原理
      • 7.1.6 学长说--报文解密2
      • 7.1.7 章节通关测试--输入、输出
    • 7.2 字符、字符串的输入输出函数
      • 7.2.1 课前挑战
      • 7.2.2 课程导入(WHERE)
      • 7.2.3 要点解析(WHAT)
        • 7.2.3.1 字符数据的输入、输出
        • 7.2.3.2 字符串数据的输入、输出
      • 7.2.4 项目实战(HOW)--学习强国登录模块1
      • 7.2.5 项目拓展(HOW)--学习强国用户注册1
      • 7.2.6 章节通关测试--字符、字符串的输入输出
  • 8 顺序结构程序设计
    • 8.1 课前挑战
    • 8.2 课程导入(WHERE)
    • 8.3 要点解析(WHAT)
      • 8.3.1 顺序结构
      • 8.3.2 基本语句
    • 8.4 项目实战(HOW)--工资核算
    • 8.5 项目拓展(HOW)--报文解密实例
    • 8.6 实验(训)项目二:结构化程序设计1--顺序结构
    • 8.7 第一阶段测试:C语言编程基础
  • 9 选择结构程序设计
    • 9.1 关系运算符及逻辑运算符及运算符优先级
      • 9.1.1 课前挑战
      • 9.1.2 课程导入(WHERE)
      • 9.1.3 要点解析(WHAT)
        • 9.1.3.1 关系运算符与关系表达式
        • 9.1.3.2 逻辑运算符与逻辑表达式
        • 9.1.3.3 运算符优先级
      • 9.1.4 项目实战(HOW)--学习强国登录模块1
      • 9.1.5 项目拓展(HOW)--打字练习
      • 9.1.6 选择结构上机实训
      • 9.1.7 章节通关测试--关系运算符及逻辑运算符及运算符优先级
    • 9.2 单分支及双分支结构
      • 9.2.1 课前挑战
        • 9.2.1.1 条件运算符与条件表达式
      • 9.2.2 课程导入(WHERE)
      • 9.2.3 要点解析(WHAT)
      • 9.2.4 项目实战(HOW)--快捷支付程序模拟
      • 9.2.5 项目拓展(HOW)--学习强国登录2;自动驾驶汽车
      • 9.2.6 学长说--软件设计师证书生成程序模拟
      • 9.2.7 学长说--银行卡账户余额支付
      • 9.2.8 章节通关测试--单分支及双分支结构
    • 9.3 多分支结构
      • 9.3.1 课前挑战
      • 9.3.2 课程导入(WHERE)
      • 9.3.3 要点解析(WHAT)
        • 9.3.3.1 if else嵌套
        • 9.3.3.2 switch语句
      • 9.3.4 项目实战(HOW)--普通话等级鉴定
      • 9.3.5 项目拓展(HOW)--了不起我的国
      • 9.3.6 实验(训)项目二:结构化程序设计2--选择结构
      • 9.3.7 学长说--天气预报实现演示1 if else嵌套
      • 9.3.8 学长说--天气预报实现演示;switch语句
      • 9.3.9 学长说--switch恐龙世界
      • 9.3.10 学长说--普通话等级鉴定1--if;else嵌套
      • 9.3.11 学长说--普通话等级鉴定2--switch
      • 9.3.12 章节通关测试--多分支结构
  • 10 循环结构程序设计
    • 10.1 自增/自减运算符与自增/自减表达式
    • 10.2 while&do-while循环
      • 10.2.1 课前挑战
      • 10.2.2 课程导入(WHERE)
      • 10.2.3 要点解析(WHAT)
      • 10.2.4 项目实战(HOW)--音乐喷泉程序模拟
      • 10.2.5 项目拓展(HOW)--KEEP运动迹模拟
      • 10.2.6 学长说--音乐喷泉实例
      • 10.2.7 章节通关测试--while&do-while循环
    • 10.3 for循环
      • 10.3.1 课前挑战
      • 10.3.2 课程导入(WHERE)
      • 10.3.3 要点解析(WHAT)
      • 10.3.4 项目实战(HOW)
      • 10.3.5 项目拓展(HOW)--输出矩阵数据
      • 10.3.6 学长说--慈善募捐
      • 10.3.7 学长说--100~200之间的不能被3整除的数
      • 10.3.8 章节通关测试--for循环
    • 10.4 for循环嵌套
      • 10.4.1 课前挑战
      • 10.4.2 课程导入(WHERE)
      • 10.4.3 要点解析(WHAT)
      • 10.4.4 项目实战(HOW)--慈善募捐
      • 10.4.5 项目拓展(HOW)--矩阵操作
      • 10.4.6 实验(训)项目二:结构化程序设计3--循环结构
      • 10.4.7 学长说--输出以下4×5的矩阵
      • 10.4.8 学长说--打印图形1
      • 10.4.9 学长说--打印图形2
      • 10.4.10 学长说--输出100-200间的素数
      • 10.4.11 学长说--我爱你中国升级版-for循环嵌套
      • 10.4.12 第二阶段测试:结构化程序设计
  • 11 数组
    • 11.1 一维数组
      • 11.1.1 课前挑战
      • 11.1.2 课程导入(WHERE)
      • 11.1.3 要点解析(WHAT)
      • 11.1.4 项目实战(HOW)--成绩统计1
      • 11.1.5 项目拓展(HOW)--斐波拉契数列
      • 11.1.6 学长说--成绩统计1
      • 11.1.7 学长说--斐波拉契数列问题
      • 11.1.8 章节通关测试--一维数组
    • 11.2 二维数组
      • 11.2.1 课前挑战
      • 11.2.2 课程导入(WHERE)
      • 11.2.3 要点解析(WHAT)
      • 11.2.4 项目实战(HOW)-- 成绩统计1
      • 11.2.5 项目拓展(HOW)--图像卷积模拟
      • 11.2.6 学长说--成绩统计二
      • 11.2.7 章节通关测试--二维数组
    • 11.3 字符数组及字符串函数
      • 11.3.1 课前挑战
      • 11.3.2 课程导入(WHERE)
      • 11.3.3 要点解析(WHAT)
      • 11.3.4 项目实战(HOW)--学习强国登录
      • 11.3.5 项目拓展(HOW)
      • 11.3.6 学长说--学习强国的登录模块
      • 11.3.7 第三阶段测试:数组
  • 12 模块化程序设计--函数
    • 12.1 函数的定义、参数、声明
      • 12.1.1 课前挑战
      • 12.1.2 课程导入(WHERE)
      • 12.1.3 要点解析(WHAT)
      • 12.1.4 项目实战(HOW)
      • 12.1.5 项目拓展(HOW)--学习强国用户模块1
      • 12.1.6 学长说--四则混合运算
      • 12.1.7 章节通关测试--函数的定义、参数、声明
    • 12.2 函数的调用、常用库函数调用
      • 12.2.1 课程导入(WHERE)
      • 12.2.2 课前挑战
      • 12.2.3 要点解析(WHAT)
      • 12.2.4 项目实战(HOW)--自助点餐系统
      • 12.2.5 项目拓展(HOW)--学习强国用户模块2
      • 12.2.6 章节通关测试--函数的调用、常用库函数调用
      • 12.2.7 学长说--求自然数的平方根(库函数应用)
      • 12.2.8 学长说--大小写字母转化
      • 12.2.9 学长说--产生随机数序列
    • 12.3 函数的嵌套、递归调用
      • 12.3.1 课前挑战
      • 12.3.2 课程导入(WHERE)
      • 12.3.3 要点解析(WHAT)
      • 12.3.4 项目实战(HOW)--斐波拉契数列问题
      • 12.3.5 项目拓展(HOW)--学生年龄信息处理
      • 12.3.6 学长说--阶乘问题1--函数的嵌套调用
      • 12.3.7 学长说--阶乘问题--递归调用
      • 12.3.8 学长说--斐波拉契数列问题--函数递归调用
      • 12.3.9 章节通关测试--函数的嵌套、递归调用
    • 12.4 内部、外部函数变量的作用域和存储方式及函数应用
      • 12.4.1 课前挑战
      • 12.4.2 课程导入(WHERE)
      • 12.4.3 要点解析(WHAT)
      • 12.4.4 项目实战(HOW)--阶乘问题
      • 12.4.5 学长说--静态局部变量(static局部变量)
      • 12.4.6 学长说--输出1到5的阶乘值
      • 12.4.7 第四阶段测试:模块化程序设计
  • 13 数组与指针、指针变量作函数参数
    • 13.1 课前挑战
    • 13.2 课程导入(WHERE)
    • 13.3 要点解析(WHAT)
      • 13.3.1 指针的概念
      • 13.3.2 ​定义指针变量
      • 13.3.3 ​指针的运算
    • 13.4 项目实战(HOW)--指针的应用
    • 13.5 项目拓展(HOW)--指针的拓展应用
    • 13.6 章节通关测试--数组与指针、指针变量作函数参数
  • 14 结构体与共用体
    • 14.1 课前挑战
    • 14.2 课程导入(WHERE)
    • 14.3 要点解析(WHAT)
      • 14.3.1 结构体概念
      • 14.3.2 定义结构体
      • 14.3.3 声明结构体变量及赋值
    • 14.4 项目实战(HOW)--学生成绩
    • 14.5 项目拓展(HOW)--商品信息管理
    • 14.6 章节通关测试--结构体与共用体
  • 15 结构体指针、链表操作
    • 15.1 课前挑战
    • 15.2 课程导入(WHERE)
    • 15.3 要点解析(WHAT)
    • 15.4 项目实战(HOW)
    • 15.5 项目拓展(HOW)
    • 15.6 章节通关测试--结构体指针、链表操作
  • 16 文件操作
    • 16.1 课前挑战
    • 16.2 课程导入(WHERE)
    • 16.3 要点解析(WHAT)
    • 16.4 项目实战(HOW)
    • 16.5 项目拓展(HOW)
    • 16.6 第五阶段测试:C语言高级编程
  • 17 预编译和宏定义
    • 17.1 预编译概念
    • 17.2 #define命令
    • 17.3 #include命令
    • 17.4 条件编译
    • 17.5 其他指令
函数的定义、参数、声明

函数的定义、函数参数、函数声明

一 、课前知识提前学习

1、函数的定义

在比较大的程序中,通常包含比较复杂的逻辑和功能,这些功能包含若干子功能,子功能可能分解出更小的子功能。这些功能组合在一起,形成完整的程序。因此,一个模块化程序通常根据实际需要可分为若干个子程序模块,每个子程序模块实现一个特定的基本功能。

例如为了实现实数的四则运算,从功能上将其分解为如下四个模块:

图1 四则运算功能分解

可以有多种实现方式,例如以C语言为开发语言,由多人完成,每个模块放在一个.c文件中。当所有的函数分别调试通过后,可以将上述函数的定义合并到一个.c文件,经编译链接成一个完整的可执行程序.exe。

函数的出现实现了数据和指令的封装,函数相当一个“黑盒”,除了其形式参数和返回值外,主调函数无法直接访问被调函数内部的数据和指令。

函数是C语言的构建模块,每个函数本质上是一个自带声明和语句的小程序。函数可以实现代码复用,一个函数最初可能是某个大程序中的一部分(例如加法处理),但可以用于其它程序,或者将程序中公用部分提炼出来作为一个公用模块(例如输出)供其它模块使用。利用函数可以实现程序的模块化,无论C程序的设计规模有多大、多复杂,都可以将其划分为若干个相对独立、功能较单一的函数,通过对这些函数的调用,实现程序功能

2、函数的参数

C语言提供了三种传递方式:

(1)返回值传递:函数调用结束时return语句从函数内部带值返回;
       (2)参数传递:函数调用时主调函数从外部传递数据给被调函数;
       (3)全局变量传递:定义公共访问区的全局变量方式。

形式参数和实际参数

参数传递指通过函数参数将主调函数的数值(实际参数)传递到被调函数(形式参数)的过程。形式参数出现在函数定义中,在整个函数体内部都有效;实际参数出现在主调函数中,用于将实际处理数据传递给被调函数的形参,实现主调函数向被调函数传递数据的功能。

形参列表的一般格式:数据类型1 形式参数名1, ..., 数据类型n 形式参数名n

例如:

int func(int m, floati)

{ ... ...

}


每个形式参数必须指定数据类型,可以为基本数据类型也可以为用户自定义数据类型;函数参数数量根据函数的功能定义进行声明,多个形式参数定义之间要用逗号隔开。函数也可以没有参数,说明此参数不需要接收信息。例如:

void SayHello( void)/*或 void SayHello( )*/

{ printf(“Hello”);

}


只有当调用发生时,系统才给形式参数分配内存空间,并在函数调用结束后,释放形参所占用的存储空间。
由于形式参数属于函数内部的变量,因此函数的形参名不能和当前函数内的变量名相同。

实参列表的格式为:实参1,实参2,...,表达式n

例如:

power(2,1)


实际参数可以是常量、变量或表达式,但必须有确定的值。多个实参之间用逗号分隔。 

函数调用过程中,实际参数和形式参数之间存在数据传递的关系,形式参数和实际参数在类型、个数及顺序上必须保持一致,否则会发生“类型不匹配”错误。

参数传递的方式

 (1)值拷贝传递机制

值拷贝传递的特点是:形参和实参各自占用不同的存储空间,在函数内部对形参的任何操作,其结果只能影响形参本身,而不会影响到实参。这种方式只能实现外部数据向函数内部的传递,不能实现函数内部数据向外传递。

(2)地址拷贝传递机制

地址拷贝传递机制是将主调函数中某一数据存储区的地址通过函数参数传递给被调函数,主调函数和主调函数可以共同访问一段数据区。
        只传递数据的地址信息,适合对大量数据信息的操作。

3、数的定义

库函数声明

调用一个函数,首先该函数必须已经存在(定义)。其次遵循先声明后使用的原则对其进行函数声明。函数声明的目的是通知编译器,当前函数已经存在并可以使用。在源程序编译阶段,编译器并不检查已经声明函数的函数体,在链接阶段才检查此函数是否存在。

调用标准库函数时,需要在当前源文件的头部添加标准库函数所在的头文件。

预定义形式:#include "头文件名称"或#include <头文件名称>

用户自定义函数声明

调用用户自定义函数时,函数声明一般出现在其函数定义的前面,声明的基本原则是“谁使用,谁声明”。函数声明在于确认传递给函数的参数类型、数目以及函数返回值的类型。

声明格式: 返回值类型符 函数名称(形式参数列表);

例如:

void add(int a,intb); /*该声明语句写在main()函数内*/


在一个小程序的开发过程中,一般将所有函数的声明放在源程序的开始位置,其特点是:当前文件从声明位置到文件结束的任何函数中都可以调用该函数,而与函数定义的位置无关。此种声明方式为全局声明。例如:

#include<stdio.h>

int power(int m,int n);

void Myfun1( );

main( )

{ ……

}

void Myfun1( )

{ ……

}

int power(int m,int n)

{ ……

}

 当开发大的应用程序时,一般将所有公用函数的声明保存在相应的头文件(.h)中,然后通过#include 指令将函数声明包含到当前文件中。

函数声明和函数定义完全不同。函数定义包括函数头和函数体,完整的定义了函数的输入、输出和具体实现;函数声明则是为编译的需要,只要理解了编译的特点,就比较容易理解声明的必要性和声明的有效范围。