嵌入式C编程01函数与结构化编程.ppt
函数与结构化编程,课程安排,程序结构化概念函数定义与使用函数参数与返回值程序模块化,程序=数据(组合)+语句(组合)数据(组合):基本数据类型,组合数据类型 语句(组合):表达式与语句,流程控制 在main中开始语句控制流一直到main结束返回就足够了么?main写了上百甚至几百上千行,做了很多很多事!以后要维护、升级从 哪里开始?一个公司由采购、研发、生产、工程、支持等部门组成,便于职能管理。程序也需要这样,按职能分割再组合到一起结构化编程,从回顾开始,1、自顶向下:程序设计时,应先考虑总体,后考虑细节 不要一开始就追求众多的细节,先从最上层总目标开始设计,逐步使 问题具体化2、逐步求精:对复杂的问题,应设计一些子目标作过渡,逐步细化3、模块化:一个复杂问题,肯定是由若干个稍简单的问题构成 模块化是把程序要解决的总目标分解为分目标,再进一步分解为具体 的小目标,把每个 小目标称为一个模块,程序结构化设计原则,构化程序设计方法引入了工程思想和结构化思想,使大型软件的开发和编程都得到极大的改善遵循结构化的程序的设计原则,按结构化程序设计方法设计出的程序具有明显的优点 其一,程序易于理解、使用和维护 其二,提高了编程工作的效率,降低了软件开发的成本,程序结构化设计优点,其实你已经在进行程序结构化了(或许是被迫!)#include-引用库函数 int main(void)/从控制台获得输入信息/将输入信息原样输出return 0;我们调用C库函数实现 函数是程序结构化的基础,如何进行程序结构化,让结构化进行得更彻底点吧int main(void)/所见即所得int_out();return 0;int_out()从哪里来?-需要自己实现的函数!,如何进行程序结构化,课程安排,程序结构化概念函数定义与使用函数参数与返回值程序模块化,C入口函数:main主函数进入main函数之后,实用程序往往由N多个函数(库函数/自定义函数)组成,通过逐级函数调用,实现程序功能一个函数不宜过长(不要超过50行),函数使用原则:一个函数只做一件事(实现一个功能),C是函数式语言,C程序结构,函数的定义,1、函数的命名 GNU命名规范:小写字母,与”_”分隔单词2、返回值类型 可以是基本类型、也可以是结构但不能直接返回数组!3、函数原型声明 先定义,再使用的原则也可以先声明,再使用,后定义4、实参和形参参数可以是任何类型!声明、定义时指定形参,使用时传入的为实参,函数基本概念,调用的方法是用实参代替形参:函数语句方式调用:add(10,20);函数表达式方式调用:sum=add(10,20);函数参数方式调用:printf(“sum is%dn”,add(10,20);,函数调用方式,函数调用之前必须先定义或者声明函数声明方式:函数类型 函数名(形参类型说明表);,先声明/定义再调用,最后调用的函数最先返回右边程序执行结果是什么?,函数执行过程,课程安排,程序结构化概念函数定义与使用函数参数与返回值程序模块化,形式参数:定义函数时,函数名后面括号中的变量名形参必须指定类型实际参数:调用函数时,函数名后面括号中的表达式实参必须有确定的值形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换(隐式转换),形参与实参,实参是怎么传递给形参的?将实参的值拷贝(赋值)给形参!调用结束,形参内存被释放,实参单元仍保留并维持原值,参数传递过程,无参函数int main(void)基本类型作为函数参数 add(int a,int b);数组作为函数参数:传递的是数组地址(用指针表示地址!)char des128=0;char src=“xnf”;strcpy(des,src);组合结构类型作为函数参数:实参整个结构值拷贝给形参大结构拷贝造成函数调用效率低,通常做法是传递结构地址(用指针表示地址!)show_info(stu_info_t stu);指针作为函数参数:高效的传递方式,学习指针时再回来,函数参数类型,无返回类型函数(void函数)执行return;语句返回或者函数结束后自动返回有返回类型函数(非void函数)执行return(表达式);或者return 表达式;返回返回类型不一致会发生什么事?,函数返回值,基本类型作为函数返回类型 int add(int a,int b);不能把数组作为函数返回类型 只能通过指针实现!组合结构类型作为函数返回类型 通常通过指针实现!指针作为函数返回类型:学习指针时再回来,函数返回类型,课程安排,程序结构化概念函数定义与使用函数参数与返回值程序模块化,实际的程序不单只有main.c一个文件,而是可能由多个.c(源文件)和.h(头文件)组成 这些文件是怎么得来的呢?这就涉及程序的模块化!一个大型程序往往按功能或者层次结构划分为多个模块例如一个手机软件程序:人机交互界面、通话功能、短信功能、日期时间、用户密码、通信录/通话记录保存、网络通信。那么多功能都塞在一个main.c中完成么?怎么做才方便维护与管理?这就要求模块化每个子功能实现为一个模块(一个.c文件和一个对应.h文件),什么是程序模块化,把程序划分为主模块和多个辅助功能模块主模块实现为main.c:在主函数中调用辅助功能模块中的接口函数,将子功能串联起来实现程序功能辅助模块实现为*.c和*.h:*.h:接口类型定义,接口函数声明*.c:实现模块接口函数(模块子功能),如何进行程序模块化,主模块(main.c):引用stu_info.h头文件:#include“stu_info.h”调用显示学生接口函数:show_info(stu);学生信息辅助模块(stu_info.c/stu_info.h):stu_info.h:自定义学生信息结构:stu_info_t 声明显示学生信息函数:void show_info(stu_info_t stu);stu_info.c:实现学生信息函数,学生信息程序模块化,编译程序时将所有源文件一起编译编译时需要指明自定义头文件路径:gcc-I./*.c o main为了使得模块结构更加清晰,通常工程目录组织为:gcc-I./inc main.c src/*.c o main,学生信息程序模块化,辅助模块,手机程序模块化,上机实验,1、实现函数void change_char(char ch),将char ch=a 传递给 change_char,在change_char中将ch改为b,观查结果实现函数 void change_str(char str);将char str“hello”传递给change_str,在change_str中将str改为”HELLO”,观查结果思考产生这样结果的原因!2、自己实现字符串操作函数:int str_len(char str);int str_cmp(char str1,char str2);3、将str_len、str_cmp封装在str_op.c模块中使用,