c语言程序函数的结构,C语言课件:第11讲函数与程序结构

《C语言课件:第11讲函数与程序结构》由会员分享,可在线阅读,更多相关《C语言课件:第11讲函数与程序结构(21页珍藏版)》请在人人文库网上搜索。

1、第11讲 函数与程序结构,函数概述 多源代码文件程序的编译,1,关于函数的若干问,什么是函数? 函数(function)是用于完成特定任务的程序代码的独立单元。 C语言程序一般由诸多函数组成。 函数有什么用? 实现了代码的重用:程序可以在任何需要的地方调用函数,一个函数可以为别的程序所调用(printf、getchar); 函数使得程序更加模块化,可读性提高、便于修改维护。 函数怎么用? 正确定义函数; 如何调用函数; 如何建立函数间的通信。,2,编写和使用一个简单的函数,编写一个在一行中输出40个星号的函数 void starbar (void) 在一个程序中使用该函数打印简单的信头 int。

2、 main (void) starbar(); ,3,函数原型声明 - 函数定义 - 函数调用,函数原型声明的格式 返回值类型 函数名 ( 参数声明表 ); /参数表可以不用 void starbar ( void ); 函数定义的格式 返回值类型 函数名( 参数声明表 ) 声明和语句(局部/私有) 函数调用语句(先声明后使用) 返回值类型 变量 = 函数名(参数表); starbar();,4,编写和使用带参数的函数,带参数函数的声明 : void charbar (char ch, int num); void charbar (char, int); 带参数函数的定义:形式参量(形式参数。

3、) void charbar (char ch, int num) 形式参量ch,num是局部变量; 形式参量ch,num在调用函数charbar时被赋值; 形式参量ch,num的声明位于标识函数体开始的花括号之前,而普通局部变量在开始花括号之后声明。 带参数函数的调用:实际参数 实际参数是调用函数传递(复制)给被调函数形式参量的特定数值; 实际参数可以是常量、变量或一个复杂的表达式。,5,从函数返回值,使用return从函数返回一个值 返回值类型与函数类型相同; 返回值本身可以由任何表达式计算得到,不仅仅是常量或变量; 返回值可以被赋值给一个变量,也可以被用作表达式的一部分; return语。

4、句终止执行函数,即使不是函数的最后一个语句。 使用全局变量从函数“返回”多个值 在函数块外部声明的变量都是全局变量; 全局变量在程序的整个生命周期中都存在; 在外部文件的函数中使用全局变量要作声明,使用extern关键字; 能被任何一个函数访问或修改,其值在两次函数调用之间保持不变; 过多的使用全局变量可能对程序结构产生不良影响,导致各函数之间数据联系太多。,6,调用函数与被调函数之间的通信,由调用函数向被调函数传递信息的方法 使用函数参数 由被调函数向调用函数反向传递信息的方法 使用函数返回值(一个值) 使用全局变量或者指针(多个值),7,使用函数的程序设计思想,程序功能:将一个文本中包含特。

5、定“模式”或字符串的各行复制到另一文本中,8,原始文本: Ah Love! could you and I with Fate conspire To grasp this sorry Scheme of Things entire, Would not we shatter it to bits - and then Re-mould it nearer to the Hearts Desire! 输出文本: Ah Love! could you and I with Fate conspire Would not we shatter it to bits - and then Re-mo。

6、uld it nearer to the Hearts Desire!,A 任务划分,该任务可以明确地划分成下列3部分: 更好的做法:把每一部分设计成一个独立的函数 减少不必要的相互影响的机会; 这些函数可以在其他程序中使用(可重用性)。,9,while ( 行未读完 ) 读行函数/*读原始文本中的各行*/ if ( 该行包含指定的模式 /*子串查找函数*/ ) 写行函数 /*将读取的各行写入新文本中*/ ,B 函数设计,读行函数: 判读文件中“还有未读的行” 读行函数,直接调用fgets函数 子串查找函数:判定“一行字符串是否包含指定的子串” 直接利用字符串比较函数char *strstr(。

7、const char *string, const char *strSearch) 如果是,则该函数返回strSearch在string中首次出现的地址;否则,返回NULL 记得#include 写行函数: 直接调用fputs函数向指定文件写入字符串,10,C 代码编写,单文件模式 Part I : 预处理 Part II :函数声明 Part III:变量声明(全局) Part IV:main函数 Part V:其它函数(子函数),11,函数中的变量声明,函数中局部变量的声明位置 紧跟标识函数开始的左花括号之后; 紧跟在任何其他标识复合语句(程序块)开始的左花括号之后。 程序块内声明的变量。

8、 在程序块内,内部声明的变量会隐藏块外的同名变量(尽量避免); 每次进入程序块,块内声明及初始化的自动变量都将被初始化; 静态变量只初始化一次,而且是在编译时完成,并非函数运行时在函数体内进行。,12,变量作用域与生存期,13,f2(),f1(),f2(),void f2(); void f1(); int a = 0;,变量作用域:示例,int nmax = 20; int main (void) int a = 0, b = 1, c, n; printf (%3d: %dn, 1, a); printf (%3d: %dn, 2, b); for ( n=3; n= nmax; n+ )。

9、 c = a + b; a = b; b = c; printf (%3d: %dn, n, c); return 0; ,14,int a = 0, b = 1, c, n, nmax = 25;,问题1:各变量的作用域?,问题2:两种情况各输出多少行?,静态变量,static 关键字包含的意思,取决于静态变量声明的位置 在函数外部声明: 变量/函数只在其所在文件中可见,其它文件无法访问; 限定外部变量/函数的作用域,达到隐藏外部对象的目的。 在函数内部声明: 对函数而言,仍是一个局部变量; 不管函数是否被调用,该静态变量一直存在; 在程序的初始化阶段进行初始化,函数调用时不会再次初始化。 。

10、static int somePersistantVar = 0;,15,寄存器变量,程序执行期间,数据存取操作在机器的寄存器中进行; 将使用频率较高的数据存储在寄存器中,存取代价更小、执行速度更快; 使用register 关键字将变量声明为寄存器变量 必须是简单数据类型; 只能是局部变量和符合条件的函数参数; 底层硬件环境会对寄存器变量的使用有一些限制; 编译器可以忽略过量的或不支持的寄存器变量声明;(无害的) 寄存器变量的地址不能访问(寄存器不在可编址的内存中),因此,指向寄存器变量的指针是不合法的。,16,变量初始化规则,不进行显式初始化的情况 外部变量和静态变量被初始化为0 自动变量和。

11、寄存器变量的初值没有定义 关于静态变量的初始化 初始化表达式必须是常量表达式 在程序开始执行前进行初始化 关于自动变量和寄存器变量的初始化 每次进入函数或程序块时被初始化 初始化表达式可以不是常量表达式,17,第11讲 函数与程序结构,函数概述 多源代码文件程序的编译,18,模块化设计思想,C程序不要求所有代码是一个整体(不止一个文件) 模块的概念:接口与实现 接口 头文件(.h) 实现 源文件(.c/cpp)或其他对象文件 C/C+程序通常由头文件和源文件组成 头文件作为一种包含功能函数、数据接口声明的载体文件; 源文件保存程序的实现代码; 头文件是C语言家族中不可缺少的组成部分。,19,多。

12、源代码文件的编译,Linux:ubuntu $ gcc -g O0 Wall main.c module.c o main.o -g:gdb调试器支持选项,用于生成相关调试信息 -O0:gcc 编译器默认优化等级,O0O1O2O3O4 -Wall:打开所有编译器告警选项 Windows:集成开发环境(VC+ 6.0、VS等) 集成开发环境中的编译器是面向工程的。工程(project)描述了一个程序所使用的资源,包括源代码文件。 对于多文件程序,必须将所有源代码文件加入到同一个工程。 执行编译时自动建立各文件之间的链接,生成唯一的可执行文件。,20,头文件的使用,21,module.h,module.c,main.c,#include “module.h”,#include “module.h。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值