语言第二次函数与程序结构_第1页
语言第二次函数与程序结构_第2页
语言第二次函数与程序结构_第3页
语言第二次函数与程序结构_第4页
语言第二次函数与程序结构_第5页
已阅读5页,还剩41页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

函数与程序结构Typical

C

ProgramOrganizationProgramfile1function1functionm………filenfunction1functionn函数概述C语言程序的特点:函数化结构函数分类:系统函数、用户函数系统函数:printf()、scanf()、sqrt()等用户函数:在程序中编写的函数,又称自定义函数。用户函数的特例:main()函数如果在程序中经常需要某种处理,就可以编写

一个函数,在需要这种处理时,就调用该函数。函数的定义返回值类型function-name

(参数声明表){声明和语句(组成函数体)}//

example:int

sum

(int

a,

int

b){int

temp;temp

=

a

+

b;return

temp;}return

功能返回函数值例子中把temp作为函数的返回值,类型为int;return一般格式return(表达式)或:return

表达式当return语句后面没有表达式时,函数将不像调用这返回值函数的调用#include<stdio.h>void

main(){void

p_star(int

n);int

k;for(k=1;k<=5;k++){p_star(k);putchar('\n');}void

p_star(int

n){int

i;for(i=1;i<=n;i++)putchar('*');return;}函数原型及函数声明函数调用}函数实参函数形参函数定义函数的声明与定义要一致函数调用也可以作为一个函数的实参#include<stdio.h>void

main(){float

max(float,float);float

a,b,c;printf("a,b,c:

");scanf("%f,%f,%f",&a,&b,&c);printf("Max=%f\n",max(max(a,b),c));}float

max(float

x,float

y){float

m;m=x>y?x:y;return(m);}函数调用作为函数的实参函数调用编写输出n个连续的任意字符的函数

p_string(),并调用该函数输出一个5行的“*”三角形图案注意函数调用时,实参和形参按照在参数表中的位置对应传值。#include

<stdio.h>void

main(){void

p_string(int,char);int

k;for(k=1;k<=5;k++){p_string(k,'*');putchar('\n');}void

p_string(int

n,char

ch){int

i;for(i=1;i<=n;i++)putchar(ch);return;}按位置对应传送}前面代码变为如下形式编译其会发生错误正确形式:提前声明变量的作用域在函数体内定义的变量称为局部变量,也称为内部变量。局部变量只能在定义它的函数中使用。程序中的两个i是相互隔离的,不同的,没有影响的内部变量{}}{#include<stdio.h>void

main(){ void

p_star50(void);int

i;for(i=1;i<=20;i++)p_star50();putchar('\n');void

p_star50(void)int

i;for(i=1;i<=50;i++)putchar('*');return;}变量的作用域#include

<stdio.h>//

Declared

in

outer

block//

This

is

another

variable

called

count++count; //

this

applies

to

inner

countprintf("count

=%d\n",count);}while(

++count

<=2); //

This

works

with

outer

countprintf("count

=

%d\n",

count); //

Inner

count

is

dead,

this

is

outercountreturn

0;intmain(void){int

count

=0;do{int

count

=0;}程序执行结果:count=1count=1count=3说明:两个count不相关,循环体内定义的变量,作用域循环体内部;函数在执行时在循环体内部本地变量会掩盖main中的变量。重名时编译器使用的是当前块中声明的变量外部变量(全局变量)全局变量是在函数之外定义的变量。在任何一个函数之外的位置,都可以定义全局变量。在一个程序中,凡是在全局变量之后定义

的函数,都可以使用在其之前定义的全局变量。因此,一个全局

变量,可以被多个函数使用,但并不一定能被所在程序中的每一

个函数使用,全局变量也有一定的作用范围。变量的作用域int

a=3,b=5;void

main(){int

max(int,int);int

a=8;printf("MAX=%d\n",max(a,b));}int

max(int

m,int

n){return(m>n?m:n);}定义全局变量定义局部变量局部变量全局变量局部变量和全局变量示例。重名时编译器使用的是当前块中声明的变量#include

<stdio.h>变量作用域规则自动变量(局部):在函数开头声明的自动变量,其作用域是声明该变量名的函数。不同函数中声明的具有相同名字的局部变量之间没有关系。外部变量或函数的作用域从声明它的地方开始,到其所在的文件的末尾结束。例如:依次定义在同一文件中的5个函数或外部变量如下:main()

{…..}int

sp=0;double

val[maxval];void push

(double

f)

{….}double pop

(void){…..}其变量的使用关系?(page80)

如果要在外部变量定义之前使用该变量,或者外部变量的定义与变量的使用不在同一个源文件,则需用关键字extern声明Exampleint

a;

extern

int

b;//外部变量//声明过//自动变量//

#1//声明(其它地方定义过)void

foo

(){int

i;while

(…)

{int

j;

b

=

i+j;}extern

void

bar

();…;bar

();}变量的声明与定义的区别?External

Variablesint

f

(){…;}//file2.cextern

int

i;extern

float

j[];int

g

(){i=9;…;}variable

definitions//file1.cint

i;float

j[10];variable

declarationsDeclarations

and

Definitions//file1.cint

i;float

j[10];int

f(){…}//file2.cextern

int

i;extern

float

j[];…//file3.cextern

int

i;extern

float

j[];…利用外部变量实现打印最长输入行静态变量外部变量和函数在所有的程序代码中是可见的,能被访问的;即使这些代码不在相同的文件中但有些函数或变量希望仅供其所在的源文件中的函数使用,其它函数不能访问,保持一定的私有性。C语言提供了静态变量提供这种功能静态变量用static声明,限定外部变量和函数静态变量//main.cextern

int

myDollar;extern

void

add

(int

a);int

main

(){//

Ooooops!myDollar

-=

999999;add

(999999);…;}//visa.cintmyDollar;int

lookup

(){return

myDollar;}void

add

(int

a){myDollar

+=a;}//

void

sub

(int

a)静态变量的使用//main.c//

compiler

complains…extern

int

myDollar;extern

void

add

(int

a);int

main

(){//

Ooooops!myDollar

-=

999999;add

(999999);…;}//visa.cstatic

int

myDollar;int

lookup

(){return

myDollar;}void

add

(int

a){myDollar

+=a;}//

void

sub

(int

a)静态变量Static声明也可用于声明函数,static类型的函数除了该函数声明所在的文件可见外,其他文件都无法访问。Static声明也可用于声明内部变量,static类型的作用域与自动变量相同;但它不会像自动变量一样随着被所在函数的被调用和退出而存在和消失。static类型的内部变量是一种只能在特定函数中使用,但一直占据存储空间的变量;该变量只在程序运行时被初始化一次静态局部变量寄存器变量头文件Aheader

filegroup

common

declarations

togethercould

be

included

by

other

filestypically

named

*.h使用头文件可以各个文件需要共享的定义和声明集中在一起,便于保证程序的正确性可以解决extern的不方便问题Header

Files

Example//area.hdouble

area

(int

r);//area.c#include

“area.h”double

area

(int

r){double

pi

=3.14;double

f

=

pi

*r

*r;return

f;}//main.c#include

“area.h”int

main

(){double

f;f

=

area

(5);return

0;}宏替换宏定义的常见错误函数嵌套函数嵌套是指在一个用户函数的函数体中,又出现了另外用户函数的调用。如函数a调用函数b,函数b又调用函数c等。#include<stdio.h>voidmain(){long

fac(int);long

cmn(int,int);intm,n;printf("m,n=");scanf("%d,%d",&m,&n);printf("C(%d,%d)=%ld\n",m,n,cmn(m,n));}/*

定义求k!的函数*/long

fac(int

k){inti;long

t;for(i=1,t=1;i<=k;i++)t*=i;return(t);/*定义求组合数的函数*/}long

cmn(int

m,int

n){long

res;res=fac(m)/(fac(n)*fac(m-n));return(res);}递归函数递归函数用递归函数计算累加和nii

=

1⑴用递归公式描述问题设累加和用函数sum(n)表示:

sum(n

-1)

+

n(n

=

1)(n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论