打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
西北大学计算机基础与c语言程序设计精品课程网

著名的计算机科学家wirth(沃思)提出了一个著名的公式表达了程序设计的实质:

算法+数据结构=程序

即“程序是在数据的特定的表示方式的基础上,对抽象算法的具体描述”。

程序结构=控制结构+数据结构

结构化程序设计:是为使程序具有合理的结构,以保证程序正确性而规定的一套程序设计的方法,是人们多年来研究与实践的结晶。

①结构化程序设计目的:通过设计结构良好的程序,以程序的静态良好结构保证程序动态执行的正确性,使程序易理解、易调试、易维护,以提高软件开发的效率,减少出错率。

②结构化程序设计的构成单元

任何程序都可由顺序、选择、重复三种基本控制结构来组成。如图1.5所示 。

处理1

处理2

条件

处理1

处理2

条件

  处理

 

 

 

 

 

 

 

 

 

 

 

 

 


 

a  顺序结构                    b 选择结构                             c 重复结构

表示“处理1”先             表示当条件满足时执行“处理1” 首先判断条件是否满足,若满足

于“处理2”执行    否则执行“处理2”                      执行“处理”,返回“判断”条件,直至条件不

满足为止

三种基本的结构程序设计图

 

三种控制结构可表示其它结构,采用基本结构组合的方法,产生所需要的程序。

三种基本的控制结构共有的特点是单入口单出口。(如虚线部分)

程序语言中也可引入其它控制结构设施,为灵活、方便的处理问题。

限制GOTO 句的意义:

goto 语句为无条件转向语句,其一般格式为:goto 语句标号

含义是无条件跳转到语句标号所处位置开始继续执行后面的语句。显然goto语句改变了程序的执行顺序。如果程序中不限制goto 语句的使用,则使得程序的静态结构与程序的动态执行差异很大,程序难阅读、难理解,破坏了单入口/单出口的原则,使程序的正确性难以证明,错误难以局部化。

③结构化程序设计方法

结构化程序设计的概念是E.W.Dijkstra于1969年首先提出的,他强调了从程序结构和风格上来研究程序设计问题。也将此方法称为“自顶向下”或“逐步求精”法。其一是“自顶向下,逐步求精”的设计思想,即整个设计应分为若干层次,逐步加以解决;而每一步实在前一步的基础上,对前一步设计的细化。其二是“独立功能,一个入口,一个出口“的模块化结构,即把大而复杂的问题层层细化分解成若干个相对独立、功能单一的问题处理模块,而每个模块与外界联系只有一个单入口与单出口。其三是“仅用三种基本控制结构”的设计原则,即每个模块都只用三个基本结构来描述。

 

C程序实现的结构及特点

一个完整的、可执行的C程序文件一般结构如下:

[包含文件语句]

[预编译语句]

[宏定义语句]

[子函数1]

[子函数2]

[子函数3]

.

.

.

[子函数n]

主函数

以上每行表示一段语句或程序,[ ]中的内容表示可选。所谓可选,并不是说可有可无,而是要根据实际情况看是否需要它们,但对一个完整的、可执行的C程序而言,主函数是必不可少的,它是一个程序的入口。换句话说,计算机执行一个程序的时候,是从主函数的位置开始执行的。还有一点需要说明的是,主函数的函数名必须使用main()。

不管是子函数还是主函数,它都是一个函数,对一个函数而言,一般是这样一个结构:

[返回类型] 函数名([参数列表]){

[说明性语句]

[操作性语句]

}

与上面所讲的内容相似,[ ] 中的内容表示可选,对于主函数而言,返回类型和参数列表一般情况下可以不明确的写出来,系统会执行一些默认的操作,但对于子函数而言,返回类型是必不可少的,其他的内容比如参数列表则要根据实际情况而定(需要就用,不需要就不用。但是什么时候需要,什么时候不需要,就属于程序的功能设计范畴,这在以后还要做进一步的讨论)。

C语言程序结构有如下特点:

1.C程序由函数构成。一个C程序至少要包括一个函数,即main函数,也可以包含一个main函数和若干个其它函数。因此,函数是C程序的基本单位。被调用的函数可以是系统提供的库函数,如printf和scanf函数,也可以是用户自定义的函数。C的函数相当于其它语言中的子程序。用函数来实现特定的功能。C语言的函数库十分丰富,Turbo C提供三百多个库函数。C语言的这种特点易于实现程序的模块化。

2.            每个函数由两部分组成:函数的说明部分和函数体。函数的一般形式为:

函数类型 函数名(参数表)

参数说明;

{

  函数体;

}

其中说明部分包括函数名、函数类型、函数属性、形参名、形参类型。一个函数名后面必须跟一对圆括弧,可以没有参数,如main();函数体即函数说明部分下面的大括弧{}内的部分,如果一个函数中有多对大括弧,则最外层的一对{}为函数体的范围。函数体一般包括变量的定义和执行部分。

3.            main函数是整个C程序的入口。一个C程序总是从main函数开始执行的。main函数可以在程序最前面,也可以在程序最后,或在一些函数之前、另一些函数之后。

4.            C程序书写格式自由,一行内可以写几个语句,一个语句也可以分开写在多行上。各语句之间用分号分隔。分号是C语句的必要组成部分。语句结束标志分号不可缺省,即使是程序的最后一个语句也必须要有分号。

5.            C语言本身没有输入输出语句。其输入和输出功能是由库函数scanf和printf等函数来实现的,即C对输入输出实行“函数化”。

6.            可以用/*……*/对C程序中的任何部分作注释,以提高程序的可读性。

与参数传递的相关技术

 

变量的作用域

程序的编译单位是源程序文件,一个源程序文件可以包含一个或若干个子函数,在函数内定义的变量是内部变量,在函数外定义的变量是外部变量,又叫全局变量或全程变量。

全局变量可以为本文件中其它函数所共用,其作用域从定义该变量的位置开始一直到文件结束。全局变量可以实现参数传递的某些功能,在其作用域范围内,全局变量可以将子函数中的值带出到其它函数,但如果在一个子函数中作了改变,将会影响全局变量的值。局部变量只在本函数范围内有效,也就是说只有在本函数内才能使用它们,本函数以外不能使用。需要注意的是,不同函数中可以使用相同名字的变量,由于其作用域的范围不同,尽管有相同的名字,但它们代表不同的对象,作用域不同,互不干扰。在一个函数内部,可以在复合语句中定义变量,但这种变量只在本复合语句中有效。简单来说,变量作用域就是指包含该变量定义的最小范围。比如说,在子函数定义的变量其作用域就在该子函数体内,在复合语句中定义的变量其作用域就在该复合语句中,在文件开始定义的变量在整个文件内有效。

 

参数传递方式

参数传递是函数之间进行信息通讯的重要渠道。其参数传递的主要方式有传值和传地址两类方式。C语言中调用函数时,实参代替形参的过程是一个单向的传值过程,在编译技术中称为值传递方式。C语言中指针类型的参数传递可以看作是传地址方式。下面是一个关于参数传递以及变量作用域的源程序:

#include <stdio.h>

int b=10;                                  /*定义全局变量*/

int fun1(int a1){

       b=a1+1;                               /*改变全局变量*/

       printf("in fun1:the addr of a is %X,the value of a is %d.\n",&a1,a1);

       return(a1=a1+1);

}

int fun2(int *a2){

       printf("in fun1:the addr of a is %X,the value of a is %d.\n",a2,*a2);

       return(*a2=*a2+1);                    /*地址方式改变变量的值*/

}

main(){

int a,c,d;

a=0;                                   /*定义局部变量*/

c=3;                                   /*定义局部变量*/

printf("in main:the addr of a,b,c,d is %X,%X,%X.\n",&a,&b,&c,&d);

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

d=fun1(a);

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

c=fun2(&a);

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

}

下面是该程序的运行结果:

in main:the addr of a,b,c,d is 12FF7C,422D8C,12FF78.

a=0,b=10,c=3

in fun1:the addr of a is 12FF24,the value of a is 0.

a=0,b=1,d=1

in fun1:the addr of a is 12FF7C,the value of a is 0.

a=1,b=1,c=1

在该程序中,a1、a2、a、c、d是局部变量,而b是全局变量。可以看出,由于fun1()函数的调用改变了全局变量b,fun2()函数的调用改变了局部变量c。

 

函数结果的带出方式

值传递方式最大的缺点是被调用函数不能通过参数向调用函数返值,原因是出了函数体,值参数的作用域相当是该函数的局部变量,无法带出结果值,如果返回一个结果值,可以使用return方式返回函数结果值。

如果函数结果需要带出多个值,该怎样实现?可以有以下两类方式:①全局变量方式带出,②通过地址传递带出(数组方式、结构体方式、指针方式)。

①全局变量方式:上面源程序中的fun1()函数对b的改变就是一个全局变量方式带出的例子。

②数组方式:如果要返回的是多个相同类型的值,则可以将这些值放到一个数组当中,然后返回数组的指针或首地址。

③结构体方式:如果要返回的是多个不同类型的值,则可以将这些值放到一个结构体当中,然后返回结构体的指针或全局变量,但必须注意的是该结构体必须是在全局范围内定义的结构体。

④指针方式:像改变上源程序中的fun2()函数对a一样改变相关需要改变的变量。

注:通过参数表的参数传递是一种参数显式传递方式,而通过全局变量可一种隐式参数传递,一个函数中对全局变量的改变会影响其它程序的调用,使用全局变量必须注意这个问题。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【大智慧】如何正解理解和掌握大智慧之全局、局部变量详解(含数组,教课书上都没有的内容)
Matlab函数
上位机编程规范
程序语言的组成知识笔记
第5课 让发光二极管闪烁
perl环境配置以及Eclipse安装perl开发插件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服