《函数参数与结构体练习优秀课件.ppt》由会员分享,可在线阅读,更多相关《函数参数与结构体练习优秀课件.ppt(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、函数参数与结构体练习第1页,本讲稿共30页2.为什么会出现if-else不匹配?这种错误的原因可能比较复杂;总的原则是:(1)有一个else必有一个if,所以首先在数量上要匹配(2)逻辑关系要合理;若执行的是复合语句,不要漏掉复合语句标志。例如:if(xy)t=a;a=b;b=t;else t=m;编译时就会提示出错信息,正确的写法:if(xy)t=a;a=b;b=t;else t=m;(3)若条件不成立时要求执行的语句有多条,else后必须为复合语句。例如:if(xy)t=a;a=b;b=t;else t=m;m=n;n=t;C程序中常见问题-if语句第2页,本讲稿共30页C程序中常见问题-
2、定长数组与变长数组定义定长数组:定义定长数组:int a5;变长数组:变长数组:int n;int an;定义数组并初始化数组元素:定义数组并初始化数组元素:int a5=1,2,3,4,5;访问数组元素(写、读):访问数组元素(写、读):for(i=0;i 5;i+)ai=i*2;for(i=0;i 5;i+)printf(%d,ai);变长数组:变长数组:int n=20;int an;C99标准规定:定义数组时,其尺寸可以不确定,但不是所有的编译器都支持该特性第3页,本讲稿共30页关于函数关于函数l函数是具有名字的语句序列,使用函数可改善程序的结构,也用于将函数是具有名字的语句序列,使用
3、函数可改善程序的结构,也用于将多处重复使用的代码编写为函数,减少代码量多处重复使用的代码编写为函数,减少代码量l函数定义和函数调用函数定义和函数调用l形式参数与实际参数形式参数与实际参数l参数传递参数传递l实际参数向形式参数传值实际参数向形式参数传值l实参与形参个数相等,类型一致,按顺序一一对应实参与形参个数相等,类型一致,按顺序一一对应l函数的返回值函数的返回值l局部变量与全局变量局部变量与全局变量l变量的作用域与生存期变量的作用域与生存期lstaticstaticlexternextern第4页,本讲稿共30页#include long sum(int a,int b);long fact
4、orial(int n);void main()int n1,n2;long a;scanf(%d,%d,&n1,&n2);a=sum(n1,n2);printf(a=%1d,a);long sum(int a,int b)long c1,c2;c1=factorial(a);c2=factorial(b);return(c1+c2);long factorial(int n)long rtn=1;int i;for(i=1;ib)swap(a,b);if(ac)swap(a,c);if(bc)swap(b,c);printf(%d%d%d,a,b,c);return 0;第7页,本讲稿共30
5、页传值调用传值调用l函数调用执行时,将函数调用执行时,将实际参数变量的地址传实际参数变量的地址传递给形式参数递给形式参数void swap(int*x,int*y)int t;t=*x;*x=*y;*y=t;main()int a,b,c;a=3;b=8;c=2;if(ab)swap(&a,&b);if(ac)swap(&a,&c);if(bc)swap(&b,&c);printf(%d%d%d,a,b,c);第8页,本讲稿共30页数组作为函数参数数组作为函数参数l数组作为参数有两种形式数组作为参数有两种形式l数组元素作为实参,与一般变量相同;数组元素作为实参,与一般变量相同;l形参为数组,实
6、参为数组名形参为数组,实参为数组名lint num5=79,11,27,26,43;int num5=79,11,27,26,43;num4num2num3num0num17911272643l数组元素是一个变量第9页,本讲稿共30页数组元素作为函数参数数组元素作为函数参数l数组元素等同于一个一般变量,作为实参时,数组元素等同于一个一般变量,作为实参时,是将数组元素的值传给形参是将数组元素的值传给形参void change(int x)printf(before:%dn,x);x=x+10;printf(after:%dn,x);int main()int i;int num6=43,18,9
7、,13,55,7;change(num2);for(i=0;i6;i+)printf(%dt,numi);return 0;第10页,本讲稿共30页数组名作为函数参数数组名作为函数参数l数组名可以作为实参,传递的是数组空间的数组名可以作为实参,传递的是数组空间的首地址首地址 int i,j,temp,a5=43,18,9,13,55;for(i=0;i 4;i+)for(j=0;j aj+1)temp=aj;aj=aj+1;aj+1=temp;/*end if*/*end for i*/void sort(int a,int n)/*数组数组a的尺寸为的尺寸为n*/int i,j,temp;f
8、or(i=0;i n-1;i+)for(j=0;j aj+1)temp=aj;aj=aj+1;aj+1=temp;/*end if*/*end for i*/int main()int i;int num6=43,18,9,13,55,7;sort(num,6);for(i=0;i6;i+)printf(%dt,numi);return 0;第11页,本讲稿共30页数组名作为函数参数数组名作为函数参数(续续)l多维数组作为实参和形参多维数组作为实参和形参int max_Value_Matrix(int a4,int m,int n)int i,j,line,col;max=a00;line=0
9、;col=0;for(i=0;i m;i+)for(j=0;j max)max=aij;line=i;col=j;printf(%d,%d,line,col);return max;l例如:找出二维数组中的最大元素,输出其下标void main()int i,j,max,num34;for(i=0;i3;i+)for(j=0;j4;j+)numij=rand();printf(%dt,numij);printf(n);max=max_Value_Matrix(num,3,4);printf(%dt,max);第12页,本讲稿共30页结构体变量作为函数参数结构体变量作为函数参数(续续)l结构体变
10、量作为函数的实参和形参结构体变量作为函数的实参和形参int GetDateId(DATE date)static unsigned int day_of_month13=0,31,28,31,30,31,30,31,31,30,31,30,31;int i,date_id=0;for(i=0;i 2&IsLeapYear(date.year)date_id+;return date_id;typedef struct int year,month,day;DATE;void main()DATE new_date;int days;int GetDateId(DATE date);new_da
11、te.year=2008;new_date.month=11;new_date.day=26;days=GetDateId(new_date);printf(%d,days);printf(n);第13页,本讲稿共30页结构体数组结构体数组编写一程序,对于某班的50名学生,输入各学生的姓名、学号、高数、英语和程序设计课程成绩(都是百分制成绩),并按照总分降序排列输出成绩表。1.定义描述每个学生信息的结构体类型 2.定义存储所有学生信息的结构体数组 3.输入 4.排序 5.输出第14页,本讲稿共30页内存布局代码区静态数据区栈区(stack)堆区(heap)代码区静态数据区(变量)栈区(stac
12、k)堆区(heap)文字常量区第15页,本讲稿共30页变量的属性数据类型:变量所持有的数据的性质(操作属性)存储类型存储器类型:寄存器、静态存储区、动态存储区生存期:变量在某一时刻存在-静态变量与动态变量作用域:变量在某区域内有效-局部变量与全局变量变量的存储类型auto -自动型register-寄存器型static -静态型extern -全局型变量定义格式:存储类型 数据类型 变量表;变量是对程序中数据的存储空间的抽象如:int sum;auto int a,b,c;register int i;static float x,y;变量的属性第16页,本讲稿共30页变量的作用域 是指在程序
13、的哪个范围内这个变是指在程序的哪个范围内这个变量是有效的,即可以引用和赋值。量是有效的,即可以引用和赋值。根据作用域可以将变量分为:全局变量和局部变量外部变量(全局变量)定义在函数体外,可以在源程序的任何位置定义(必须保证不在任何一个函数体内)作用域从源文件定义位置开始之后的所有函数外部变量通常在程序开始处所有函数前定义,以便所有函数都能使用若在本程序中使用别的文件中定义的外部变量,则在程序开始处加extern 进行声明(与函数的原型声明功能类似)变量的作用域第17页,本讲稿共30页外部变量会被各函数共同操作int gcd()int i;for(i=m;i0;i-)if(m%i=0&n%i=0
14、)break;return i;int m,n;main()int max;printf(ninput value for m,n:);scanf(%d,%d,&m,&n);max=gcd();printf(Gcd=%dt,max);慎用全局变量,因慎用全局变量,因耦合性太强耦合性太强!变量的作用域第18页,本讲稿共30页根据作用域可以将变量分为:外部变量(全局变量)int fun(int n)int m,i;for(m=i=0;in;+i)int k=m+1;m=k+i*1;return m;左例中:n,m,i都是局部变量,作用于整个函数内部k为循环体内定义的语句,只作用于该复合语句中内部变
15、量(局部变量,自动变量)在函数内作定义说明作用域仅限于它所定义的语句块(复合语句)内函数中的形参属于局部变量变量的作用域第19页,本讲稿共30页变量的作用域同一作用域内不允许出现同名变量同一作用域内不允许出现同名变量不同作用域内同名变量互不影响不同作用域内同名变量互不影响全局变量的作用域是整个程序全局变量的作用域是整个程序局部变量的作用域是所定义的复合语句体局部变量的作用域是所定义的复合语句体嵌套的两个作用域内的同名变量,以内层定义嵌套的两个作用域内的同名变量,以内层定义为准为准int f(int n)int x=1,y;while(1)double x=2.0;x为又精度2.0变量的作用域第
16、20页,本讲稿共30页变量的生存期变量是在程序的执行过程中才变划分内存空间变量是在程序的执行过程中才变划分内存空间的,这时候的变量才会存在的,这时候的变量才会存在程序结束后由程序结束后由OS收回程序所占内存空间,变量收回程序所占内存空间,变量也就不存在了也就不存在了全局变量从程序开始到结束都存在全局变量从程序开始到结束都存在局部变量只在其所定义的复合语句执行期间才局部变量只在其所定义的复合语句执行期间才存在存在变量的生存期第21页,本讲稿共30页程序装载到内存后所占用的内存空间称为用户区,分程序装载到内存后所占用的内存空间称为用户区,分为数据区和代码区,其中数据区又分为静态存储区和为数据区和代
17、码区,其中数据区又分为静态存储区和动态存储区:动态存储区:静态存储区是在程序开始执行时给所有静态存储区是在程序开始执行时给所有全局变量全局变量分配的存储区,在程序执分配的存储区,在程序执行过程中占据固定的存储单元,程行过程中占据固定的存储单元,程序行完毕才释放序行完毕才释放 动态存储区是在程序运行期间根据需要进行动态分配的动态存储区是在程序运行期间根据需要进行动态分配的存储空间,用以存放以下数据:存储空间,用以存放以下数据:函数形式参数;自动变量;函数调用时的现场保护和返回地址;只在函数调用时分配动态存储空间,结束时释放这些只在函数调用时分配动态存储空间,结束时释放这些空间空间 变量的生存期代
18、码区静态数据区栈区(stack)堆区(heap)第22页,本讲稿共30页有时需要在函数执行之后保留局部变量(的值),在下一次调用时使用。-实现这一需求的是静态局部变量int fac(int n)int f=1;f=f*n;return(f);main()int i;for(i=1;i=5;i+)printf(%d!=%dn,i,fac(i);函数返回后仍保留f的值就好了!-将f 设为静态局部变量(用关键字static进行声明)变量的生存期第23页,本讲稿共30页对静态局部变量的说明:int fac(int n)static int f=1;f=f*n;return(f);int main(vo
19、id)int i;for(i=1;i=5;i+)printf(%d!=%dn,i,fac(i);return 0;静态局部变量在静态存储区内分配存储单元,在程序整个运行期间都不释放。静态局部变量只赋初值一次如果在定义局部变量时不赋初值,系统自动赋初值0(对数值型变量)或空字符(对字符变量)。static变量第24页,本讲稿共30页static int fac(int n)static int f=1;f=f*n;return(f);int main(void)int i;for(i=1;i=5;i+)printf(%d!=%dn,i,fac(i);return 0;函数定义加static前缀时
20、,本函数只能在当前程序文件中被调用static函数第25页,本讲稿共30页C程序中常见问题-字符数组 与 字符串定义字符数组:定义字符数组:char name5;定义字符数组及初始化:定义字符数组及初始化:char name15=c,h,i,n,a;char name2 =c,h,i,n,a;定义字符数组及初始化:定义字符数组及初始化:char name1 =c,h,i,n,a,0;char name2 =china;Char name3 =china;scanf(%s,name);或 gets(name);读入一个字符串时,系统会自动加上结束标志0。第26页,本讲稿共30页当前字符=空格是否
21、未出现新单词,使word=0,num不累加前一字符为空格(word=0),新单词出现,word=1,num加1前一字符为非空格(word=1),未出现新单词,num不变否0是11是1未01否0是12否1未12是1未02否0是13是1未03否0是14否1未14否1未14否1未14例 输入:I am a boy.当前字符是否空格word原值新单词开始否word新值num值Iamaboy.例 输入一行字符,统计其中有多少个单词第27页,本讲稿共30页YNword0(c=stri)!=0?输出num的值输入一个字符串str结束准备i0 num0 word0c=?word=0?word 1 num nu
22、m+1ii+1NYYN第28页,本讲稿共30页YNword0(c=stri)!=0?输出num的值输入一个字符串str结束准备i0 num0 word0c=?word=0?word 1 num num+1ii+1NYYN#include int main()char str81;int i,num=0,word=0;char c;gets(str);for(i=0;(c=stri)!=0;i+)if(c=)word=0;else if(word=0)word=1;num+;printf(There are%d words in the line.n,num);return 0;第29页,本讲稿共30页有三个字符串,找出其中最大者 H o w 0 H e l l o 0 H i g h 0 str0str1str2#include#include void main()char string20,str320;int i;for(i=0;i0)strcpy(string,str0);else strcpy(string,str1);if(strcmp(str2,string)0)strcpy(string,str2);printf(nThe largest string is:n%sn,string);第30页,本讲稿共30页