搜档网
当前位置:搜档网 › 04-模块化编程与函数-带作业讲解

04-模块化编程与函数-带作业讲解

C语言用函数实现模块化程序设计

第7章用函数实现模块化程序设计 习题与思考 2.在C语言中,函数的隐含存储类别是_____A_____. A)auto B)static C)extern D)无存储类别 要点分析:本习题考察变量的存储类别。C语言规定,如不指定变量的存储类别,系统默认为自动类型的,即auto型。 3.以下所列的各函数首部中,正确的是_____C_____. A)void play(var:Integer,var b:Integer) B)void play(int a,b) C)void play(int a,int b) D)Sub play(a as integer,b as integer) 要点分析:本习题考察函数的定义。要求函数首部的各个形式参数应分别指出其数据类型。 4.以下程序的输出结果是_____C_____. fun(int x,int y,int z) { z=x*x+y*y;} void main( ) { int a=31; fun(5,2,a); printf("%d",a);} A)0 B)29 C)31 D)无定值要点分析:本习题考察形参和实参的关系。函数一旦发生传值调用,把实参的值传递给形参后,实参的值仍保留原值。 5.以下程序的输出结果是_____A_____. f( int b[ ],int m, int n ) { int i,s=0; for(i=m;i

return s; } void main( ) { int x,a[ ]={1,2,3,4,5,6,7,8,9}; x=f(a,3,7); printf("%d\n",x); } A) 10 B) 18 C) 8 D) 15 要点分析:本习题考察数组做函数的参数,此时实参为数组名,形参数组不再重新分配存储空间,形参数组共占实参数组所在的存储空间。数组做函数参数是学生出错误比较多的知识点。 7.以下程序的输出结果是_____D_____. int f( ) { static int i=0; int s=1; s+=i;i++; return s;} void main( ) { int i,a=0; for(i=0;i<5;i++)a+=f(); printf("%d\n",a); } A) 20 B) 24 C) 25 D) 15 要点分析:本习题考察静态局部变量。静态局部变量的值在调用结束后仍保持结束后的值。静态局部变量是变量的存储类别的重点,学生应该掌握并应用。 8. 以下程序的功能是调用函数fun计算:m=1-2+3-4+…+9-10,并输出结果。请填空。 int fun( int n) { int m=0,f=1,i; for(i=1; i<=n; i++) { m+=i*f; f= _____-f_____ ; } return m; } void main( ) { printf("m=%d\n", _____fun(10)_____ ); } 要点分析:本习题考察函数的调用。通过编写fun函数求得累加和。

模块化程序设计实例

9 .5 模块化程序设计实例 《程序设计基础》(基于C语言讲解)石光华编著—北京: 清华大学出版社 下面以设计一个简单的成绩管理软件为例,一步一步地按模块化程序设计方法进行设计。 1 .定义问题 设计一个成绩管理软件,其基本功能包括:输入成绩,成绩加分,计算平均成绩,找出最高分,找出最低分,输出成绩等。 2 .确定组成程序的模块 根据成绩管理软件的功能,确定软件的基本模块包括:输入模块,加分模块,平均分模块,最高分模块,最低分模块,输出模块等。 142 程序设计基础 3 .绘制程序结构图 成绩管理软件的结构图如图9-5所示。 图9-5 成绩管理软件结构图 4 .流程图 用流程图确定主程序的逻辑结构,如图9-6所示。 在流程图中,istate 的作用是记录是否已经输入成绩。istate 的使用有如下两种 方式。 (1) 作为全局变量使用。此时istate可以在所有模块中改变其值,主程序更简洁,但 可能产生边际效应。 (2) 作为主程序的局部变量使用。此时istate只能在主程序中改变其值。在主程序 中可以直观地看到其变化,能够防止边际效应。 采用方式(2)的主程序如下。

#include < stdio .h> #define SIZE 10 void main() { int iscore[SIZE] ={0}; int key= - 1; int iresult=0; float fresult=0; int istate=0; printf(″1:Input scores;\n″); 第9章模块化程序设计 143 图9-6 成绩管理软件主程序流程图 printf(″2:Output scores;\n″); printf(″3:Count for the max score;\n″); printf(″4:Count for the minimum score;\n″); printf(″5:Count for the total score;\n″); printf(″6:Count for theaverage score;\n″); printf(″- 1:Exit .\n″); while(1) { printf(″Please input your choose:″); scanf(″%d″,&key); if (key = = - 1) 144 程序设计基础

模块化程序设计练习题及答案

第四章模块化程序设计练习题及参考答案 一、填空题 1、以下程序的运行结果是(111),把x定义为静态变量运行结果是(123)。void increment(void) { int x=0; x+=1; printf("%d",x);} main() { increment(); increment(); increment(); } 2、若输入的值是-125,以下程序的运行结果是(-125=-5*5*5) #include "math.h" main() { int n; void f(int n); scanf("%d",&n); printf("%d=",n); if(n<0) printf("-"); n=fabs(n); fun(n); } void fun(int n) { int k,r; for(k=2;k<=sqrt(n);k++) { r=n%k; while(r==0) { printf("%d",k); n=n/k; if(n>1)printf("*"); r=n%k; } } if(n!=1) printf("%d\n",n); } 3、设有以下宏定义: #define WIDTH 80 #define LENGTH WIDTH+40 则执行赋值语句:v=LENGTH*20;(v为int型)后,v的值是(880) 4、设有以下宏定义: #define WIDTH 80 #define LENGTH (WIDTH+40)

则执行赋值语句:k=LENGTH*20;(k为int型变量)后,k的值是(2400) 5、下面程序的运行结果是(5) #define DOUBLE(r) r*r main() { int x=1,y=2,t; t=DOUBLE(x+y); printf("%d\n",t);} 6、下面程序的运行结果是(36) #define MUL(z) (z)*(z) main() { printf("%d\n",MUL(1+2)+3); } 7、下面程序的运行结果是(212) #define POWER(x) ((x)*(x)) main() { int i=1; while(i<=4) printf("%d,",POWER(i++)); } 8、下面程序的运行结果是(9) #define MAX(a,b) (a>b?a:b)+1 main() { int i=6,j=8,k; printf("%d\n",MAX(i,j)); } 二、选择题 1、以下正确的说法是(D)建立自定义函数的目的之一是: A)提高程序的执行效率B)提高程序的可读性 C)减少程序的篇幅D)减少程序文件所占内存 2、以下正确的说法是(B) A)用户若需调用标准库函数,调用前必须重新定义 B)用户可以重新定义标准库函数,若如此,该函数将失原有含义。 C)系统根本不允许用户重新定义标准库函数。 D)用户若需调用标准函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统自动去调用。 3、以下正确的函数定义形式是(C) A)double fun(int x,int y) B)double fun(int x;int y) C)double fun(int x,int y); D)double fun(int x,y) 4、以下正确的说法是(D)。在C语言中: A)实参与其对应的形参各占用独立的存储单元。 B)实参和与其对应的形参共占用一个存储单元。 C)只用当实参和与其对应的形参同名时才共占用存储单元。

模块化程序设计

第四章模块化程序设计 教学目的:模块程序设计是C程序合作编程序的方法,通过这一章的学习使学生能自己编C 程序中的函数,正确地调用函数,熟悉函数调用时形式参数和实在参数的关系。通过变量的存储类型,能正确使用各种不同存储类型的变量编程序。 重点难点:函数的嵌套调用及函数的递归调用。 前面各几章的学习,大家已有了编制小程序的经验。如果想编制大程序,在C语言下就得用模块化程序设计,其基本思想是将一个大的程序按功能分割成一些模块,使每一个模块都成为功能单一、结构清晰、接口简单、容易理解的小程序。 C语言提供了支持模块化软件开发的功能: 1 函数式的程序结构。程序由一个或多个函数组成,每个函数都有各自独立的功能和界面。 2 允许通过使用不同的存储类别的变量,控制模块内部和外部的信息交换。 3具有预编译处理功能,为程序的调试、移植提供方便,支持模块化程序设计。 本章介绍这些功能及进行程序开发的基本方法。 4.1 函数 C程序结构 无论涉及的问题是复杂还是简单,规模是大还是小,用C语言设计程序,任务只有一种,就是编写函数,至少要编写一个主函数main(),C程序的执行就是执行相应的main()函数。即从它的main()函数的第一个花括号开始,依次执行后面的语句,直到最后的花括号为止。其它函数只有在执行了main()函数的过程中被调用时才执行。 高级语言中“函数”的概念和数学中“函数”的概念不完全相同。英语单词function有“函数”和“功能”两种介绍,高级语言中的函数实际上是功能的意思。当要完成某一个功能时,就用一个函数去实现它。在程序设计时首先要考虑main()函数中的算法,当main()中需要使用某一功能时,就用一个具有该功能的函数表达式表示。这时的函数,我们只知道它具有什么功能,其它先不作处理。设计完main()的算法并检验无误后,这时开始考虑它所调用的函数。如果在库函数中能找到,就可直接使用,否则再动手设计这些函数。这种设计方法称为自顶向下、逐步细化的程序设计方法。这种方法设计出来的程序在功率高,程序层次分明、结构清晰。复杂程序的层次可从以下图形中看出: 许多大型软件系统包含了相当丰富的,可供从事某一领域工作人员选用,如一个高等学校的信息管理系统就包含了教务、科研、人事、财务,设备、图书、后勤、办公室等子系统。每一个子系统以可分为许多子子系统。 这种软件为了方便用户大都采用菜单(menu)方式,这种形式的软件,大家都用过。用户

实验七 用函数实现模块化程序设计

河南工业大学C语言实验报告 专业班级:生物11级1班学号:201112910118姓名:l刘路路指导老师:朱红莉评分: 实验题目:用函数实现模块化程序设计 实验目的:熟练掌握函数的定义、调用、声明 实验内容:P218-219 习题1、2、4 实验步骤:(具体程序及运行结果) 7.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。 #include int main() {int hcf(int,int); int lcd(int,int,int); int u,v,h,l; scanf("%d,%d",&u,&v); h=hcf(u,v); printf("H.C.F=%d\n",h); l=lcd(u,v,h); printf("L.C.D=%d\n",l); return 0; } int hcf(int u,int v) {int t,r; if (v>u) {t=u;u=v;v=t;} while ((r=u%v)!=0) {u=v; v=r;} return(v); } int lcd(int u,int v,int h) { return(u*v/h); } 7.3写一个判素数的函数,在主函数输入一个整数,输出是否为素数的信息。 #include int main() {int prime(int); int n; printf("input an integer:"); scanf("%d",&n);

if (prime(n)) printf("%d is a prime.\n",n); else printf("%d is not a prime.\n",n); return 0; } int prime(int n) {int flag=1,i; for (i=2;i #define N 3 int array[N][N]; int main() { void convert(int array[][3]); int i,j; printf("input array:\n"); for (i=0;i

51单片机模块化编程设计与实例要点分析

模块化编程设计题 一、简述模块化编程的必要性(模块化的优点) 参考答案: 大多数的编程学习者一开始接触和学习到的程序很小,代码量很少,甚至只有几十行。对于这样短小的程序进行模块化设计不是完全必要的。很多情况下程序模块化设计需要“浪费”很多时间,例如增加了代码的数量,增加了构思的时间。把所有的程序代码都写在一个main()函数中程序完全可以运行。 但是随着学习的深入,代码量的增加,将所有的代码都放在同一个.C文件中的做法越发使得程序结构混乱,虽然可以运行,但是可读性、可移植性变差。即使是自己写的程序,时间长以后对程序的阅读和修改也要花一些时间。模块化编程使得程序的组织结构更加富有层次感,立体感和降低程序的耦合度。 在大规模程序开发中,一个程序由很多个模块组成,很可能,这些模块的编写任务被分配到不同的人。几乎所有商用程序都必须使用模块化程序设计理念。在程序的设计过程中各个开发者分工合作,分别完成某一模块特定的功能,减少开发时间等。 二、模块化编程设计步骤 (1)、创建头文件 在模块化编程中,往往会有多个C文件,而且每个C文件的作用不尽相同。在我们的C 文件中,由于需要对外提供接口,因此还必须有一些函数或者是变量提供给外部其它文件进行调用。对于每一个模块都有相应的.c文件和.h文件,为了阅读调试方便,原则上.c文件和.h文件同名,如和。 (2)防重复包含 例如文件 #ifndef__DELAY_H__ #define__DELAY_H__ void delay(uint t); #endif 假如有两个不同源文件需要调用delay(uint t)这个函数,他们分别都通过#include “”把这个头文件包含了进去。在第一个源文件进行编译时候,由于没有定义过因此#ifndef__DELAY_H__条件成立,于是定义_DELAY_H_ 并将下面的声明包含进去。在第二个文件编译时候,由于第一个文件包含时候,已经将_DELAY_H_定义过了。因此#ifndef__DELAY_H__不成立,整个头文件内容就没有被包含。假设没有这样的条件编译语句,那么两个文件都包含了delay(uint t);就会引起重复包含的错误。所以在.h文件中,为了防止出现错误都进行防重复包含。 (3)代码封装 将需要模块化的进行代码封装 头文件的作用可以称其为一份接口描述文件。其文件内部不应该包含任何实质性的函数代码。我们可以把这个头文件理解成为一份说明书,说明的内容就是我们的模块对外提供的接口函数或者是接口变量。同时该文件也包含了一些很重要的宏定义以及一些结构体的信息,离开了这些信息,很可能就无法正常使用接口函数或者是接口变量。但是总的原则是:不该让外界知道的信息就不应该出现在头文件里(不需要外部调用的函数不在头文件中申明),而外界调用模块内接口函数或者是接口变量所必须的信息就一定要出现在头文件里(需要被外部调用的函数一定要在头文件中申明),否则,外界就无法正确的调用我们提供的接口功能。

第5章_模块化程序设计

第5章模块化程序设计 5.1 简答题 (1)指令“CALL EBX”采用了指令的什么寻址方式? 寄存器间接寻址 (2)为什么MASM要求使用proc定义子程序? (这个问题不好回答,是不是作者写错了?我猜测可能的原因:在汇编语言中,函数、子程序等都称为过程,所以使用proc定义子程序) (3)为什么特别强调为子程序加上必要的注释? 便于程序员调用时使用,而不必关注子程序的内部实现。 (4)参数传递的“传值”和“传址”有什么区别? 传值是传递参数的拷贝,传址是传递参数的地址 (5)子程序采用堆栈传递参数,为什么要特别注意堆栈平衡问题? 保证正确返回;释放传递参数占用的堆栈空间,避免多次调用可能导致的堆栈溢出(6)INCLUDE语句和INCLUDELIB有什么区别? INCLUDE语句包含的是文本文件、是源程序文件的一部分;INCLUDELIB语句包含的是子程序库文件 (7)什么是子程序库? 子程序库就是子程序模块的集合,其中存放着各子程序的名称、目标代码以及有关定位信息,便于子程序的管理和调用 (8)调用宏时没有为形参提供实参会怎样? 缺少的实参,形参会做“空”处理。 (9)宏定义体中的标号为什么要用local为指令声明? 为了避免宏展开后出现标示符不唯一的情况,定义为局部。 (10)条件汇编不成立的语句会出现在可执行文件中吗? 不会。 5.2 判断题 (1)过程定义proc是一条处理器指令。 错,proc是伪指令 (2)CALL指令的执行并不影响堆栈指针ESP。 错,要改变,因为返回地址要压入堆栈 (3)call指令本身不能包含子程序的参数。 对。 (4) call指令用在调用程序中,如果被调用程序中也有call指令,说明出现了嵌套。 对。 (5)子程序需要保护寄存器,包括保护传递入口参数和出口参数的通用寄存器。 错,不能保护传递出口参数的寄存器 (6)利用INCLUDE包含的源文件实际上只是源程序的一部分。 对 (7)宏调用与子程序调用一样都要使用CALL指令实现。 错,宏调用是通过宏展开实现的调用,不用CALL指令 (8)宏定义与子程序一样一般书写与主程序之后。

模块化程序设计方法在学生管理系统开发中的应用

模块化程序设计方法在学生管理系统开发中的应用 蒋振超 (山东师范大学信息科学与工程学院计算机系2006级1班) 摘要:随着计算机技术的发展和互联网时代的到来,我们已经进入了信息时代,在这数字化的时代里,学校的学生信息管理受到了极大的挑战。本文通过设计和建设网络拓扑架构、数据库基础结构、信息的发布与管理,对学生信息管理系统各种功能探讨、定义、以及实现,从而实现学生信息的网络化管理,以方便管理者,老师和学生之间的信息共享、交流和管理。 关键词:学生信息;信息管理系统;管理系统功能 中图分类号:TP393 Modular Programming in Student Management System Development Jiang zhen-chao (School of Information Science and Engineering, Shandong Normal University) Abstract:With the development of computer technology and the Internet era, we have entered the information age, in this digital era, the school's student information management are a great challenge. In this paper, the design and construction of network topology architecture, database infrastructure, information publishing and management, student information management system of various functions, definitions, and implementation, in order to achieve the network management of student information to facilitate the management, teachers and information sharing among students, exchange and management. Key words:student information;information management system;function of information system

第7章用函数实现模块化程序设计Convertor

第7章用函数实现模块化程序设计 7.1为什么要用函数 7.2怎样定义函数 7.3调用函数 7.4对被调用函数的声明和函数原型 7.5函数的嵌套调用 7.6函数的递归调用 7.7数组作为函数参数 7.8局部变量和全局变量 7.9变量的存储方式和生存期 7.10 关于变量的声明和定义 7.11 内部函数和外部函数 7.1为什么要用函数 问题: 如果程序的功能比较多,规模比较大,把所有代码都写在main函数中,就会使主函数变得庞杂、头绪不清,阅读和维护变得困难 有时程序中要多次实现某一功能,就需要多次重复编写实现此功能的程序代码,这使程序冗长,不精炼7.1为什么要用函数 解决的方法:用模块化程序设计的思路 采用“组装”的办法简化程序设计的过程 事先编好一批实现各种不同功能的函数 把它们保存在函数库中,需要时直接用 7.1为什么要用函数 解决的方法:用模块化程序设计的思路 函数就是功能 每一个函数用来实现一个特定的功能 函数的名字应反映其代表的功能 7.1为什么要用函数 在设计一个较大的程序时,往往把它分为若干个程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定的功能 C程序可由一个主函数和若干个其他函数构成 主函数调用其他函数,其他函数也可以互相调用 同一个函数可以被一个或多个函数调用任意多次 7.1为什么要用函数 main a b c f g h d e i e 7.1为什么要用函数 可以使用库函数 可以使用自己编写的函数 在程序设计中要善于利用函数,可以减少重复编写程序段的工作量,同时可以方便地实现模块化的程序设计 7.1为什么要用函数 例7.1 输出以下的结果,用函数调用实现。 ****************** How do you do! ******************

C语言模块化程序设计(好)

C语言模块化程序设计需理解如下概念: (1)模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明; (2)某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明; (3)模块内的函数和全局变量需在.c文件开头冠以static关键字声明; (4)永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。 一个嵌入式系统通常包括两类模块: (1)硬件驱动模块,一种特定硬件对应一个模块; (2)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。 多任务还是单任务 所谓"单任务系统"是指该系统不能支持多任务并发操作,宏观串行地执行一个任务。而多任务系统则可以宏观并行(微观上可能串行)地"同时"执行多个任务。 多任务的并发执行通常依赖于一个多任务操作系统(OS),多任务OS 的核心是系统调度器,它使用任务控制块(TCB)来管理任务调度功能。TCB 包括任务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。调度器在任务被激活时,要用到这些信息。此外,TCB还被用来存放任务的"上下文"(context)。任务的上下文就是当一个执行中的任务被停止时,所要保存的所有信息。通常,上下文就是计算机当前的

状态,也即各个寄存器的内容。当发生任务切换时,当前运行的任务的上下文被存入TCB,并将要被执行的任务的上下文从它的TCB中取出,放入各个寄存器中。 究竟选择多任务还是单任务方式,依赖于软件的体系是否庞大。例如,绝大多数手机程序都是多任务的,但也有一些小灵通的协议栈是单任务的,没有操作系统,它们的主程序轮流调用各个软件模块的处理程序,模拟多任务环境。 单任务程序典型架构 (1)从CPU复位时的指定地址开始执行; (2)跳转至汇编代码startup处执行; (3)跳转至用户主程序main执行,在main中完成: a.初试化各硬件设备; b.初始化各软件模块; c.进入死循环(无限循环),调用各模块的处理函数 用户主程序和各模块的处理函数都以C语言完成。用户主程序最后都进入了一个死循环,其首选方案是: while(1) { } 中断服务程序 中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中

实验三-模块化程序设计

实验三模块化程序设计 【实验目的】 1.理解和掌握多模块的程序设计与调试的方法; 2.掌握函数的定义和调用的方法; 3.学会使用递归方法进行程序设计。 【实验内容】 1.编写一个函数,判断一个数是不是素数。在主函数中输入一个整数,输出是否是素数的信息。 实验步骤与要求: (1) 编写一个函数isprime(n),如果n是素数返回1,否则返回0。 (2) 编写一个主函数,输入一个整数,调用isprime( )函数,判断此整数是否为素数,并输出结果。 函数isprime(n)算法说明: (1) k = sqrt(n) (2) i = 2 (3) 当i <= k时,执行(3.1)(3.2),否则转(4) (3.1) if ( m % i == 0 ) return 0 (3.2) i=i+1 (4) return 1 #include #include int isprime(int n) { int i; double k; i=2; k = sqrt(n); while(i<=k) { if(n%i==0) return 0;

i++; } return 1; } main() { int a; int t=1; printf("请输入一个整数\n"); scanf("%d",&a); t=isprime(a); printf("%d",a); if(t==0) printf("不是素数\n"); else printf("不是素数\n"); } 2.编写函数Celsius返回华氏温度对应的摄氏温度,函数Fahrenheit返回摄氏温度对应的华氏温度。用这些函数编写程序,打印从0到100的所有摄氏温度及对应的华氏温度,32到212度的所有华氏温度及对应的摄氏温度。 实验步骤与要求: (1)用整齐的表格形式输出。 (2)尽量减少输出行数,但要保持可读性。 #include main() { int fahr,celsius; int lower,upper;

一个理想的模块化程序设计案例

一个理想的模块化程序设计案例 吕振洪 浙江师范大学,浙江金华,321004 jhlzhxch@https://www.sodocs.net/doc/1518363296.html, 摘要:模块化的抽象思维能力在项目开发过程中至关重要。但在C语言的教学、训练中,鲜有好的项目让学生理解、消化用模块化程序设计对解决问题带来的影响和优势。本文通过“Turbo C 2.0菜单系统”这案例,把项目分解成一些小模块,先让学生分步实现各模块,后按模块化程序设计的思路再优化原实现,最后逐步组装成“菜单系统”这项目。项目实施过程紧凑,代码简洁且可读性好。该案例也可应用于8086系列汇编语言课程的教学。 关键词:模块化程序赫斯基,菜单系统,优化,数据结构 1引言 在C语言教学中,教师需解决“教学中的理论内容在实际中如何应用?”这问题。教材中鲜有较好的案例来指导模块化程序设计[1]。本文以Turbo C 2.0菜单系统为例,利用“→”、“←”、“↑”、“↓”、“Esc”、“Enter”、“Alt-X”这些键在Windows的控制台环境下来模拟完成菜单的操作。该菜单系统的逻辑结构如下图一: 图一 Turbo C 2.0的逻辑菜单 目前的面向对象的程序设计语言要实现这样的菜单已非常简单。 但对C语言的初学者来说,通过这案例可在三个方面来强化模块化设计:一是实现Turbo C系统该怎样模块化设计;二是菜单系统的模块化设计;三是实现小的功能时的模块化设计。 2菜单系统的数据组织 我们希望所编写的菜单程序能处理各种各样的菜单,这需要有好的数据结构[3]。一方面要有好的菜单存储结构,另一方面是满足菜单系统选择处理所需的数据模型[2]。 2.1 菜单的存储结构 从菜单系统的逻辑结构图可看出:主菜单里包含子菜单,子菜单里含子菜单或菜单项。根据这样的递归结构,我们可用如下的存储结构来解决: typedef struct MenuItemStru{ int SubMenuItemCount; int SubMenuItemWidth; MenuItemStru * pSubMenuAddr; int MenuItemStrWidth; char * MenuItemStrAddr; }

模块化编程概述

◇模块化编程概述 ◇模块化编程的步骤 为什么要引入模块化编程 通过前十几节课的讲解,我们了解并掌握了单片机的各种外围模块的基本原理和使用方法。同时,我们也体会到,随着代码量的增加,将所有的代码都放在同一个.C文件中的做法越发使得程序结构混乱,导致可读性和可移植性变差,而模块化编程时解决这一问题的常用而有效的方法。 模块化设计原则:高内聚 在一个C文件里面的函数,只有相互之间的调用,而没有调用其他文件里面的函数,尽量减少不同文件里函数的交叉引用。模块与模块之间,尽可能的独立存在。模块与模块之间的接口,尽量少而简单。 模块化编程的步骤 第一步创建头文件 建立一个.C文件(源文件)和一个.h文件(头文件)。原则上.c文件和.h文件同名;文件名要有意义,最好能够体现该文件代码的功能。例如延时函数相关的源文件和头文件命名为delay.c与delay.H 第二步防重复包含处理 在.h文件中加入如下代码: #ifndef XXX #define XXX #endif 在同一个工程中各个.h文件的XXX不能相同,因此推荐大家使用一下规则:将.h文件的文件名全部大写,“.”替换成下划线“_”,首尾各添加2个下划线“_”作为XXX。例如delay.h #ifndef __DELAY_H__ #define __DELAY_H__ #endif 第三步代码封装 将需要模块化的代码封装成函数与宏定义。函数先在头文件里申明一下,函数体放在.C文件中,需要被外部调用的宏定义放在.h文件中,仅会被本.C文件调用的宏定义放在.C 文件中。 尽量少用或不用全局变量,必须要用的全局变量的申明放在.c文件中,当需要调用外部全局变量,需要在.h文件中用extern重新申明一下。 第四步使用源文件 将.C文件添加到工程之中,同时在需要调用.h文件中的宏或者函数的.C文件中添加代码将该.h文件包含进去。所包含的头文件中的函数,宏定义,全局变量可以在.C文件中自由调用。

实验五 模块化的程序设计

实验五模块化的程序设计 实验目的 (1)理解自顶向下,逐步细化的模块化设计思想划分子模块;知道模块化程序设计方法。 (2)熟悉函数的定义、函数的声明和函数的调用,理解函数调用的实现过程。 (3)理解函数调用时的数据传送机制,通过参数将主调函数的数据传递到被调函数,运用return语句将被调函数的处理结果返回主调函数。 (4)通过设置断点和单步执行,观察子函数的执行路径,和子函数中变量的值的变化。 实验范例 引导任务 任务1会变化的三角形 任务2 计算生日相差几天 任务1会变化的三角形 任务描述 在屏幕上打印一个三角形,如图5-1所示,运行程序时输入三角形的级别n,可以打印不同大小的三角形。 图5-1 输出可变的三角形

任务解决 任务解决路径: 图5-2 任务1 解决路径 第一步:学习无参无返回值函数的定义、声明和调用; 第二步:了解函数参数的作用,学习使用带参的函数构建多层模块程序的构建; 第三步:学习带参无返回值函数的设计; 1.编写打印三角形的函数 (1)问题分析 要在屏幕上打印一个三角形,可以直接在main 函数中使用printf 语句完成,如下程序代码所示: 在本任务中,要求调整程序的结构,写一个打印三角形的无参无返回值函数,然后在main 函数中调用它实现打印三角形。程序员编写的函数称为用户自定义函数,相对于系统函数而言,不是系统已写好的代码,需要程序员自己定义函数和编写实现函数的程序代码。无参无返回值函数通常执行一个具体的操作,无计算结果。 (2)函数的应用 使用用户自定义函数分三步:函数定义,函数声明和函数调用。 ①无参无返回值函数的定义 无参无返回值函数定义的一般形式为: 一个打印三角形的函数的定义可以为: #include int main() { printf("打印一个三角形\n "); printf(" *\n"); printf(" ***\n"); printf("*****\n"); printf("打印结束\n"); return 0; } void 函数名(void ) { ...... }

模块化程序设计

模块化程序设计 一、变量 变量分为局部变量、静态变量、全局变量和寄存器变量,关键字依次为auto、static、extern 和register。全局变量和静态变量存放在内存静态存储区域,局部变量存放在内存栈区。在C 语言中,只允许在函数体的开始位置声明变量,C++可在函数任何位置声明。auto默认省略,如auto int a一般写成int a。对变量赋值不能放在函数外,只有在定义全局变量时的初始化才被允许,如在函数外int a; a=0非法,int a=0合法。 局部变量也称为内部变量,是在函数内部定义的变量,其作用域从声明处到所在函数的结尾。补充:即使主函数中定义的变量也只能在主函数中使用;形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量;允许在不同的函数中使用相同的变量名,互不干扰。在复合语句中也可定义变量,其作用域只在复合语句范围内,例如:int s,a; { int b; s=a+b; //b作用域 } //s,a作用域 全局变量也称为外部变量,是在函数外部定义的变量,其作用域从声明处到本程序文件的结尾,其他程序文件可对其进行extern声明从而合法使用,即具有全文件作用域。全局变量只能定义一次,但可声明多次。在同一源文件中,允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用。从模块化程序设计考虑,尽量少用全局变量,使用静态全局变量。在函数中使用全局变量,一般应作全局变量声明,但在一个函数之前定义的全局变量,在该函数内使用可不声明,例如: int a,b; //外部变量 main(){} int x,y; //外部变量 a和b在main可不声明,x和y若不声明则非法。 静态变量可分为静态局部变量和静态全局变量,两者都只能定义一次。静态全局变量作用域从声明处到本程序文件的结尾,不能作用到其它文件里,即具有单文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。 若全局变量仅在单个程序文件中访问,则可将该变量修改为静态全局变量,以降低模块间的耦合度;同理,修改为静态局部变量;若需要一个可重入的函数,则一定要避免函数中使用static变量;当函数返回值为指针类型时,必须是static局部变量的地址作为返回值,若为auto类型,则返回为错指针。 注意:不要在头文件文件中定义变量!定义和声明的区别可理解为:用关键字auto、static、extern和register是声明,如int a,声明一般在头文件中;初始化是定义,如a=0。 二、函数和宏定义 函数分为内部函数和外部函数,关键字分别为static和extern,外部函数声明时extern 可省略(全局变量声明不能省略)。在定义函数时声明的参数叫做“形式参数”,简称形参。在调用函数时,被调用函数的参数成为“实际参数”,简称实参。实参必须与形参的类型保持一致。 宏定义分简单宏定义和带参数宏定义,简单宏定义格式为:#define 标识符常量表达式。在预处理阶段将用常量表达式直接替换标识符,编译时不进行数据类型检验,且要注意“边际效应”,故存在风险(与const关键字各有优缺点)。若某头文件被多个程序文件include,

单片机程序模块化编程方法

程序模块化方法 模块化编程,必然会涉及到多文件编译,也就是工程编译。在这样的一个系统中,往往会有多个C文件,而且每个C文件的作用不尽相同。在我们的C 文件中,由于需要对外提供接口,因此必须有一些函数或者是变量提供给外部其它文件进行调用。 假设我们有一个delay.c文件,此为一个延迟函数 void delayms (unsigned char xms) { unsigned char i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } 而在我们的另外一个文件中需要调用此函数,那么我们该如何做呢? 头文件的作用正是在此。可以称其为一份接口描述文件。其文件内部不应该包含任何实质性的函数代码。我们可以把这个头文件理解成为一份说明书,说明的内容就是我们的模块对外提供的接口函数或者是接口变量。同时该文件也包含了一些很重要的宏定义以及一些结构体的信息,离开了这些信息,很可能就无法正常使用接口函数或者是接口变量。但是总的原则是:不该让外界知道的信息就不应该出现在头文件里,而外界调用模块内接口函数或者是接口变量所必须的信息就一定要出现在头文件里,否则,外界就无法正确的调用我们提供的接口功能。因而为了让外部函数或者文件调用我们提供的接口功能,就必须包含我们提供的这个接口描述文件----即头文件。同时,我们自身模块也需要包含这份模块头文件(因为其包含了模块源文件中所需要的宏定义或者是结构体),好比我们平常所用的文件都是一式三份一样,模块本身也需要包含这个头文件。 下面我们来定义这个头文件,一般来说,头文件的名字应该与源文件的名字保持一致,这样我们便可以清晰的知道哪个头文件是哪个源文件的描述。 于是便得到了delay.c的头文件delay.h 其内容如下。 #ifndef __DELAY_H__ #define __DELAY_H__ extern void delayms(unsigned char xms); #endif 这与我们在源文件中定义函数时有点类似。不同的是,在其前面添加了extern 修饰符表明其是一个外部函数,可以被外部其它模块进行调用。 #ifndef __DELAY_H__ #define __DELAY_H__ …… #endif 这是头文件的编写格式,__DELAY_H__这个是头文件的名

C51的模块化设计方法

C51的模块化设计方法 一个大的单片机程序往往包含很多模块,我是这样组织的: 1、每一个C源文件都要建立一个与之名字一样的H文件(头文件),里面仅仅包括该C文件 的函数的声明,其他的什么也不会有,比如变量的定义啊等等不应该有。 2、建立一个所有的文件都要共同使用的头文件,里面当然就是单片机的管脚使用的定义, 还有里面放那些需要的KEIL系统的头文件,比如#i nclude,#i nclude等等,把这个文件命名为common.h,或者干脆就叫main.h 3、每个C源文件应该包含自己的头文件以及那个共同的使用的头文件,里面还放自己本 文件内部使用的全局变量或者以extern定义的全局变量 4、主文件main.c里面包含所有的头文件包括那个共同使用的文件,main.c里面的函数可以 再做一个头文件,也可以直接放在文件的开头部分声明就可以了,里面一般还有中断服务程序也放在main.c里面 5、对于那些贯穿整个工程的变量,可以放在那个共同的使用的头文件里面,也可以用 extern关键字在某个C源文件里面定义,哪个文件要使用就重复定义一下 6、建立工程的时候,只要把C源文件加到工程中,把H文件直接放到相应的目录下面就 可以了,不需要加到工程里面。 第一章概述 本手册介绍ASM51宏汇编器及用汇编语言开发MCS-51系列单片机软件的过程。本章概述ASM51宏汇编器及用法。 1.1 模块化程序设计

ASM51宏汇编器允许用户以模块方式编程,以适应用户模块化的程序设计。模块是具有相对独立功能的程序,它能独立进行汇编或编译。模块化程序设计是将一个大的或复杂的程序分成小的功能模块,每个模块程序单独编写、汇编和调试,最后再将这些模块连接起来,形成一个完整的用户程序。这样做比单块程序更易编写、调试和修改。 模块程序的开发只需根据模块的输入及输出定义,按其所需的输入并检查其输出以校核模块的正确性。由于程序具有良好的模块接口,可以把问题限定在模块内,一旦识别出有毛病的模块,解决这个问题就相当简单了。当每个模块都测试完毕即可将各模块连接起来,最后再测试全模块。 模块化程序的另一个好处是程序共享,即一个模块中的程序可以被其他模块引用。由于模块化程序是可重新定位的,因而也就允许在满足其输入及输出要求是被调用。 1.2 MCS-51模块程序的开发过程 本节简要讨论使用可重定位的汇编器(ASM51),连接/重新定位程序(RL51)及代码转换程序(OH)来开发程序的过程。 1.2.1 段、模块及程序 段是一块程序代码或数据存贮器。段是可重新定位的或绝对的。一个可重新定位的段有一个名字、类型及其属性。具有相同段名,但在不同模块的各个段,将由RL51把它们合并在一起。绝对段没有名字因而也不能与其它段结合。 一个模块有一个或多个段。模块有用户指定的名字。模块的定义决定局部符号的作用域。一个目标文件有一个或多个模块。 把全部输入模块的所有绝对的及可重新定位的段连接起来,最后能形成单一的绝对模块,即完整的用户应用程序。 1.2.2 源程序编辑 完成上述模块化设计后,使用文本编辑器编写源程序。若在开发过程中检测到错误,再回到文本编辑器以修改源程序。 1.2.3 汇编

相关主题