第4讲作用域和选择结构程序设计_第1页
第4讲作用域和选择结构程序设计_第2页
第4讲作用域和选择结构程序设计_第3页
第4讲作用域和选择结构程序设计_第4页
第4讲作用域和选择结构程序设计_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1#include<stdio.h>#definePI3.14floatl(float);/*函数声明*/floats(float);/*函数声明*/floatl(floatr)/*函数定义:求周长*/{returnPI*r*2;}floats(floatr)/*函数定义:求面积*/{returnPI*r*r;}

voidmain(){floatr,cir,area;printf("pleaseinputr:");scanf("%f",&r);cir=l(r);/*函数调用*/

area=s(r);/*函数调用*/printf("circumference=%7.2f\n,area=%7.2f\n",cir,area);}作业及问题习惯用符号常量,并注意语法格式函数声明后有分号一般都写在前面return只能返回一个值暂时还不能用一个函数求两个值。printf("circumference=%7.2f\n,area=%7.2f\n",l(r),s(r));/*第二种调用方式:l(r),s(r)

作为printf()的参数*/第4讲

多函数程序设计-变量的作用域选择结构程序设计3#include<stdio.h>#definePI3.14floatl(float);/*函数声明*/floats(float);/*函数声明*/floatl(floatr)/*函数定义:求周长*/{returnPI*r*2;}floats(floatr)/*函数定义:求面积*/{returnPI*r*r;}voidmain(){floatr,l,s;printf("pleaseinputr:");scanf("%f",&r);

l=l(r);/*函数调用*/

s=s(r);/*函数调用*/printf("circumference=%7.2f\n,area=%7.2f\n",l,s);}问题若这样起名会怎样?会有错误提示,因为相同的名字造成了冲突。4#include<stdio.h>#definePI3.14floatl(float);/*函数声明*/floats(float);/*函数声明*/floatl(floatr)/*函数定义:求周长*/{returnPI*r*2;}floats(floatr)/*函数定义:求面积*/{returnPI*r*r;}voidmain(){floatr,cir,area;printf("pleaseinputr:");scanf("%f",&r);cir=l(r);/*函数调用*/area=s(r);/*函数调用*/printf("circumference=%7.2f\n,area=%7.2f\n",cir,area);}问题若这样起名又会怎样?会冲突吗?不会,它们虽然是不同的r,但因为它们的作用域不同,所以不会产生冲突。5涉及的语法

-作用域作用域:即作用范围可分为:局部变量全局变量6局部变量局部变量在语句块内(即{}内)定义的变量形式参数也是局部变量特点定义时不会自动初始化,除非程序员指定初值进入语句块时获得内存,仅能由语句块内语句访问,退出语句块时释放内存,不再有效并列语句块各自定义的同名变量互不干扰7main(){inti=1,j=2;printf(″i=%d,j=%d\n″,i,j);

{inti=3,a=4;printf(″i=%d,a=%d\n″,i,a);

j++;}

{inti=5;

printf(″i=%d\n″,i);j++;

}printf(″i=%d,j=%d\n″,i,j);}运行结果为:i=1,j=2i=3,a=4i=5i=1,j=4例,运行结果?++是一个运算符,j++表示将j变量的值加18例3-7,运行结果?#include<stdio.h>voidswap(intx,inty);/*函数声明*/voidmain(){inta=3,b=5;printf("11>a=%d,b=%d\n",a,b);/*调用交换函数之前*/swap(a,b);/*调用交换函数swap*/printf("12>a=%d,b=%d\n",a,b);/*调用交换函数之后*/}/*函数定义:交换两个变量的值的函数*/voidswap(inta,intb)

{inttemp;printf("21>a=%d,b=%d\n",a,b);/*交换变量值之前*/temp=a;a=b;b=temp;/*交换器:交换变量x,y的值*/printf("22>a=%d,b=%d\n",a,b);/*交换变量值之后*/}35ab35a

btemp353实参a,b的值没发生变化!单向值传递!即由实参向形参的方向传递数值!而不会朝相反的方向!9全局变量全局变量在所有函数之外定义的变量特点默认作用范围:在源程序.c中,从定义它的位置以后都有效在定义点之前或在其他.c文件中引用,应该进行如下声明:

extern类型名变量名;从程序运行起即占据内存,程序运行过程中可随时访问,程序退出时释放内存使函数之间的数据交换更容易,也更高效但是尽量少用,因为谁都可以改写全局变量,所以很难确定是谁改写了它破坏了函数的独立性(封装性)10#include<stdio.h>intglobal; /*定义全局变量*/voidGlobalPlusPlus(void);main(){ global=1; printf("BeforeGlobalPlusPlus(),itis%d\n",global); GlobalPlusPlus(); printf("AfterGlobalPlusPlus(),itis%d\n",global);}/*函数功能:对全局变量global加1,并打印加1之前与之后的值函数入口参数:无函数返回值:无*/voidGlobalPlusPlus(void){ printf("Before++,itis%d\n",global); global++; printf("After++,itis%d\n",global);}例BeforeGlobalPlusPlus(),itis1Before++,itis1After++,itis2AfterGlobalPlusPlus(),itis2注意:全局变量具有“记忆性”。11#include<stdio.h> voidGlobalPlusPlus(void);main(){

intglobal=1; printf("BeforeGlobalPlusPlus(),itis%d\n",global); GlobalPlusPlus(); printf("AfterGlobalPlusPlus(),itis%d\n",global);}/*函数功能:对局部变量global加1,并打印加1之前与之后的值函数入口参数:无函数返回值:无*/voidGlobalPlusPlus(void){

intglobal=1; printf("Before++,itis%d\n",global); global++; printf("After++,itis%d\n",global);}例BeforeGlobalPlusPlus(),itis1Before++,itis1After++,itis2AfterGlobalPlusPlus(),itis112如何用全局变量解决例3-7#include<stdio.h>inta=3,b=5;voidswap(void);/*函数声明*/voidmain(){printf("11>a=%d,b=%d\n",a,b);/*调用交换函数之前*/swap();/*调用交换函数swap*/printf("12>a=%d,b=%d\n",a,b);/*调用交换函数之后*/}voidswap(void)/*函数定义,没有参数*/{inttemp;printf("21>a=%d,b=%d\n",a,b);/*交换变量值之前*/temp=a;a=b;b=temp;/*交换变量a,b的值*/printf("22>a=%d,b=%d\n",a,b);/*交换变量值之后*/}虽然得以解决,但并不是一个好办法!为什么?因为它破坏了函数的封闭性!学指针的时候我们会学另外一种方法!即便要用全局变量,一般也是在只读不写的时候才用!13例:使用全局变量解决#include<stdio.h>#definePI3.14floatr;floatl(void);/*函数声明*/floats(void);/*函数声明*/floatl(void)/*函数定义:求周长*/{returnPI*r*2;}floats(void)/*函数定义:求面积*/{returnPI*r*r;}voidmain(){floatcir,area;printf("pleaseinputr:");scanf("%f",&r);cir=l();/*函数调用*/area=s();/*函数调用*/printf("circumference=%7.2f\n,area=%7.2f\n",cir,area);}r一旦被赋值,其值不再发生变化,只是拿来用。14小结:分清楚同名变量的作用域。一般情况下用局部变量,极少情况下考虑到数据的一致性时可以用全局变量。变量的存储类型待第5章以后再讲。15编写函数,求两个整数的最小值、最大值分析结果(算法)主函数:输入a,b计算最小值和最大值(通过函数调用实现)输出最小值和最大值求最大值函数求最小值函数新的问题:例3-2:#include<stdio.h>intmin(int,int);/*函数声明*/intmax(int,int);intmin(inta,intb)/*函数功能:求a,b的最小值*/{

inttemp;

if(a>b)

temp=b;

else

temp=a;

returntemp;}intmax(inta,intb)/*函数功能:求a,b的最大值*/{

inttemp;

if(a>b)

temp=b;

else

temp=a;

returntemp;}voidmain(){inta,b;

printf("pleaseinputtwointegers:");scanf("%d%d",&a,&b);printf("min=%d\nmax=%d\n",min(a,b),max(a,b));}运行过程?16例3-2:编写函数,求两个整数的最小值、最大值另一种写法:#include<stdio.h>intmin(int,int);/*函数声明*/intmax(int,int);intmin(inta,intb)/*函数功能:求a,b的最小值*/{

return(a>b)?b:a;}intmax(inta,intb)/*函数功能:求a,b的最大值*/{

return(a>b)?a:b;}voidmain(){inta,b;

printf("pleaseinputtwointegers:");scanf("%d%d",&a,&b);printf("min=%d\nmax=%d\n",min(a,b),max(a,b));}条件运算符__?__:__C语言中唯一的三目运算符含义:若?前边的表达式成立,则结果为:前边的表达式或数据,若不成立,结果为:后边的表达式或数据。简单的if-else语句可以用条件运算符来替代。结合性:自右向左计算:y=x>0?1:(x<0?-1:0)函数定义的另一种写法请参考书中48页的解法一17例4-9从键盘上输入一个年份,然后判断这个年份是否为闰年。分析结果(算法)输入year判断year是否为闰年输出yes或no如果year能被4整除且不能被100整除,或者year能被400整除,

year是闰年,否则

year不是闰年。18分析year能被4整除且不能被100整除,或者year能被400整除(?)或者(?)(?且?)或者(?)(?&&?)||(?)(year%4==0&&year%100!=0)||(year%400==0)如果year能被4整除且不能被100整除,或者year能被400整除,

year是闰年,否则

year不是闰年。%求模(余)运算符,优先级与结合性同/(除法运算符)结果的符号与被除数的符号相同例:printf("10%3=%d,-10%3=%d,10%-3=%d,-10%-3=%d\n",10%3,-10%3,10%-3,-10%-3);结果为:10%3=1,-10%3=-1,10%-3=1,-10%-3=-1if(year%4==0&&year%100!=0)||(year%400==0){printf(“%disaleapyear!”,year);}else{

printf(“%disnotaleapyear!”,year);}19结果#include<stdio.h>voidmain(){intyear;printf(“pleaseinputyear:”);scanf(“%d”,&year);if((year%4==0&&year%100!=0)||(year%400==0))

{printf(“%disaleapyear!”,year);/*一般要缩进*/}

else

{

printf(“%disnotaleapyear!”,year);/*缩进与上边一致*/}}20写成多函数程序#include<stdio.h>voidleap(intyear);/*函数声明*/voidleap(intyear)/*判断year是否为闰年并输出*/{

if((year%4==0&&year%100!=0)||(year%400==0))

printf(“%disaleapyear!”,year);elseprintf(“%disnotaleapyear!”,year);

}voidmain(){intyear;printf(“pleaseinputyear:”);scanf(“%d”,&year);

leap(year);/*调用leap函数判断year是否为闰年并输出*/}21涉及的语法选择结构语句格式if(条件表达式)

{

…}else

{

…}else分支可以省略,此时为单分支结构22涉及的语法

-关系运算符><>=<===!=大于,小于,大于等于,小于等于,等于,不等于运算结果只有两个值:0和非0,0表示假,即该关系不成立;非0,表示真,即该关系成立例如:2006%4==0的结果是?

0,表示假(关系不成立)优先级:在算术运算符和赋值运算符之间。结合性:自左向右23涉及的语法

-逻辑运算符逻辑运算也被称为布尔(Boolean)运算,即参与运算的数据和运算结果都只有两个值:0和非0,0表示假(条件不成立);非0表示真(条件成立)与运算&&(相当于而且)a&&b当且仅当两者都为真,则结果为真(a>b&&b>c);a大于b,并且b大于c或运算||(相当于或者)a||b只要两者中有一个为真,结果就为真(a>b||b>c);a大于b,或者b大于c求反!单目运算符(!a);如果a是0,结果非0;如果a是非0,结果是0并不改变a的值24是字母吗?输出“是”NOYES输入letter输出“不是”结束开始练习:从键盘上输入一个字母,判断它是不是英文字母#include<stdio.h>voidmain(){charc;printf(“pleaseinputacharacter:”);c=getchar();/*从键盘上输入一个字符并存储到变量

温馨提示

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

评论

0/150

提交评论