




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9讲变量的存储类型带参数的宏定义数组,请大家及时消化我课上讲的内容,并举一反三,模仿未讲过的例题多写程序。如果说学习C语言有捷径的话:那就是多读程序,多写程序,2,作业答案1,5.6doubleS(floatx,intn)if(n=1)returnx;elsereturnS(x,n-1)+x*x;,将#include改为windows.h将clrscr();改为system(“CLS”);clrscr()是TC中的清屏函数,VC中没有,但VC中一般不需要。,3,习题5.12,问题的关键是如何将n的问题化解为n-1的问题(即反方向求解问题)。根据分析,写出如下的数学函数:,doubleS(floatx,intn)if(n=1)returnx;elsereturnS(x,n-1)+pow(x,n);,4,#include#includedoubleS(floatx,intn);voidmain()doublex,s;intn;printf(“pleaseinputx,n:n”);scanf(“%lf,%d”,/*递归要通过函数的依次调用实现*/,习题5.12程序,#include#includedoubleS(floatx,intn);voidmain()doublex,s;intn;printf(“pleaseinputx,n:n”);scanf(“%lf,%d”,切忌:将递归函数的内容写至主函数中;将递归中的语句放至循环中;在递归函数中写s(x,n)=S(x,n-1)+pow(x,n);,5,另一个具有“记忆性”的变量类型:静态变量(static),一般的内部变量在函数退出后失效,再次进入函数,变量值重新初始化静态变量在变量类型前面用static修饰staticinti;变量存在静态存储区,当函数结束时,内存空间不被释放,因此,变量的值可以保存到下次进入函数,即变量具有记忆功能,6,涉及的语法-变量的存储类型,编译器为变量分配内存的方式它决定变量的生存期,动态存储根据需要临时分配存储空间,离开即释放静态存储在程序运行期间分配固定的存储空间不释放,内存分配,7,例-静态变量,#includevoidFunc(void);main()inti;for(i=0;i10;i+)Func();/*函数功能:打印被调用的次数函数入口参数:无函数返回值:无*/voidFunc(void)staticinttimes=1;/*静态局部变量函数结束时times变量仍然占据静态存储区的存储空间,不释放*/printf(Func()wascalled%dtime(s).n,times+);,Func()wascalled1time(s).Func()wascalled2time(s).Func()wascalled3time(s).Func()wascalled4time(s).Func()wascalled5time(s).Func()wascalled6time(s).Func()wascalled7time(s).Func()wascalled8time(s).Func()wascalled9time(s).Func()wascalled10time(s).,2,3,10,8,例-非静态变量,#includevoidFunc(void);main()inti;for(i=0;i10;i+)Func();/*函数功能:打印被调用的次数函数入口参数:无函数返回值:无*/voidFunc(void)inttimes=1;printf(Func()wascalled%dtime(s).n,times+);,Func()wascalled1time(s).Func()wascalled1time(s).Func()wascalled1time(s).Func()wascalled1time(s).Func()wascalled1time(s).Func()wascalled1time(s).Func()wascalled1time(s).Func()wascalled1time(s).Func()wascalled1time(s).Func()wascalled1time(s).,2,2,9,根据存储类型可分为,自动变量(auto)静态变量(static)寄存器变量(register),10,自动变量(auto),我们以前定义的那些变量,都默认是这种类型“自动”体现在进入语句块时自动申请内存,退出时自动释放内存标准定义格式auto类型名变量名;特点:动态局部变量缺省的存储类型不初始化时,值是不确定的,11,寄存器变量(register),寄存器CPU的内部容量很有限、但速度极快的存储器使用频率比较高的变量声明为register,可以使程序更小、执行速度更快register类型名变量名;registerinti;现代编译器有能力自动把普通变量优化为寄存器变量,并且可以忽略用户的指定,所以一般无需特别声明变量为register,12,静态变量和全局变量,相同点:都是静态存储类型自动初始化为0都存储在静态存储区,整个程序运行期间一直占据内存不同点:作用域不同全局变量在所有的源程序文件中都可用静态变量又分为静态局部变量和静态全局变量,作用域分别是所在函数和所在源文件,13,#includeintsquare(inti);voidmain()inti=0;i=square(i);for(;i3;i+)staticinti=1;i+=square(i);printf(“%d,”,i);printf(“%dn”,i);intsquare(inti)returni*i;,习题5.1,2,1,6,2,42,3,输出结果:,2,6,3,42,14,带参数的宏定义,#defineSQUARE(n)(n)*(n)main()inti=1;printf(%4d,SQUARE(+i);,main()inti=1;printf(%4d,(i)*(i);,15,涉及语法-带参数的宏定义,一般格式:#define宏名(参数表)字符序列功能:将程序中出现的前者置换为后者。其中宏名后面的括号里是参数,类似函数中形参表,只是此处的形参无类型说明。字符序列中应包含括号中所指定的参数,否则参数设置无意义。,16,应注意的问题,使用带参数的宏定义可以实现某些简单函数的功能(注意是某些,而不是全部)。定义时,宏名和参数表之间不能有空格。对带参数的宏定义,字符序列及其字符序列中各个形参都应该用圆括号括起来。例:#defineSQUARE(n)(n)*(n),#defines(a,b,c)a*b*cmain()printf(“%d”,s(3+5,5/2,2+3);,3+5*5/2*2+3,#definef(x,y)(x)+(y)main()inta=4,b=3;printf(%d,f(a,b)*f(a,b);,(a)+(b)*(a)+(b),17,区别,(i)*(i),当函数功能非常简单时,可以用带参数的宏定义来实现。,18,函数相关内容总结,为什么定义函数?模块化程序设计方法函数的定义、调用、声明参数传递变量的作用域和存储类型函数的嵌套定义和递归定义,19,新的问题:,例:输入全班60个学生的C语言成绩并统计不及格的人数。分析:输入60个成绩统计人数输出统计结果,如何定义变量?在数学中怎样解决这个问题?score1,score2,scorei,score60,20,1定义变量用于存储成绩,intscore60;,数组名(这一组数的共同名字),数组长度,含义:向系统申请60*sizeof(int)个字节的连续空间,用于存储60个成绩,它们共同的名字score。将来数组中的每一个元素就分别是score0、score1、score2、score59,此时,方括号里的数字不再表示长度,而是下标。它们的名字score表示这一串内存的起始地址。,21,数组的内存分配,score,score0,score1,score59,score2,score3,注意下标从0开始,22,涉及的语法-数组定义及相关概念,数组:一组具有类型相同、顺序存放的数据什么时候定义数组?定义格式:数据类型数组名数组长度;注:数组长度必须是常量。例:intscore60;含义:,23,2、输入60个成绩,循环60次输入for(i=0;i60;i+)scanf(%d,使用数组的每一个元素也称数组元素的引用。,24,3、统计人数,从第一个学生起,判断每一个学生的成绩是否小于60,是的话计数器加1for(i=0;i60;i+)if(scoreI60)counter+;4、输出:,25,完整程序,#defineN60main()intscoreN;inti,counter=0;for(i=0;iN;i+)/*输入*/scanf(%d,有什么好处?,26,P162例63求Fibonacci数列前40项,算法:定义数组求每一项输出每一项,intfib40=1,1;/*为数组的第一、二个元素进行初始化,其它自动为0*/,for(i=2;i40;i+)fibi=fibi-2+fibi-1;/*循环求剩余的38项*/,for(i=0;i40;i+)if(i%4=0)/*每输出四个数,输出一个回车*/printf(n);printf(%12d,fibi);,27,P162例63:完整程序,#includevoidmain()inti,fib40=1,1;for(i=2;i40;i+)fibi=fibi-2+fibi-1;for(i=0;i40;i+)if(i%4=0)printf(n);printf(%12d,fibi);,28,例65,查找字符在字符串中出现的位置算法定义字符数组用来存储字符串查找输出查找结果,29,#includevoidmain()/*在一个固定的字符串中查找是否存在空格*/inti,counter=0;chara30=Iamateacher.;/*一般用字符串常量对字符数组初始化,也可以用chara30=I,a,m,a,t,e,a,c,h,e,r,.;系统会将未赋值的数组元素自动赋值为0.*/for(i=0;ai!=0;i+)/*查找*/if(ai=)printf(“在字符串%s中的位置为空格。n,i+1);counter+;printf(“thestring:%shas%dspace!n,a,counter);,/*一般字符数组中存储的字符串长度不定,所以循环条件不能用I30这样的语句限定,而应用ai!=0作为循环结束条件*/,若想实现“在任意字符串中查找是否存在任意要找的字符”。,30,#includevoidmain()/*在任意字符串中查找是否存在一个任意字符*/inti,p=-1;chara30,ch;gets(a);/*输入*/ch=getchar();for(i=0;ai!=0;i+)if(ai=ch)/*找到即结束*/p=i;break;if(p!=-1)/*根据p的值判断是否找到。*/printf(字符%c在字符串%s中的位置为:%d。n,ch,a,p+1);elseprintf(字符%c在字符串%s中没有找到。n,ch,a);,gets(a):gets()是C语言库函数,gets(a)的含义是:将从键盘上输入的一串字符存储在数组a中。也可用scanf(“%s”,a);实现输入,注意a是数组名,表示数组的起始地址,因此不用再写二者的区别是前者可以接收空格,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电容器制造工质量管控考核试卷及答案
- 网球制作工职业技能考核试卷及答案
- 职业健康培训考核试题(附答案)
- 有色金属强化熔炼工晋升考核试卷及答案
- 信托业务员技术考核试卷及答案
- 电子商务师技能比武考核试卷及答案
- 道路客运服务员技能比武考核试卷及答案
- 烟类作物栽培工转正考核试卷及答案
- 生活垃圾转运分拣工成本控制考核试卷及答案
- 2025供应链管理服务合同
- 重庆风电基础知识培训课件
- 2025年携程笔试试题及答案
- 田径竞赛规则修改(2025-2026)
- 铭记历史+砥砺前行-2025-2026学年高一上学期抗战胜利80周年爱国教育主题班会
- 基孔肯雅热主题班会课件
- 桡动脉穿刺技术
- 学校食品供货协议书范本
- 《信号与系统》全套教学课件
- 《通信原理》课件第1讲通信概述
- 2025-2026学年冀人版三年级科学上册(全册)教学设计(附目录)
- 私车出差管理办法
评论
0/150
提交评论