函数参数与结构体练习_第1页
函数参数与结构体练习_第2页
函数参数与结构体练习_第3页
函数参数与结构体练习_第4页
函数参数与结构体练习_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

函数参数与结构体练习第1页,课件共30页,创作于2023年2月2.为什么会出现if-else不匹配?

这种错误的原因可能比较复杂;总的原则是:(1)有一个else必有一个if,所以首先在数量上要匹配(2)逻辑关系要合理;若执行的是复合语句,不要漏掉复合语句标志{}。例如:if(x<y)

t=a;a=b;b=t;

elset=m;编译时就会提示出错信息,正确的写法:if(x<y){t=a;a=b;b=t;}

elset=m;(3)若条件不成立时要求执行的语句有多条,else后必须为复合语句。例如:if(x<y){t=a;a=b;b=t;}

else{t=m;m=n;n=t;}

C程序中常见问题-if语句第2页,课件共30页,创作于2023年2月C程序中常见问题-定长数组与变长数组定义定长数组:inta[5];

变长数组:intn;inta[n];定义数组并初始化数组元素:inta[5]={1,2,3,4,5};

访问数组元素(写、读):for(i=0;i<5;i++)a[i]=i*2;for(i=0;i<5;i++)printf("%d",a[i]);变长数组:intn=20;inta[n];C99标准规定:定义数组时,其尺寸可以不确定,但不是所有的编译器都支持该特性第3页,课件共30页,创作于2023年2月关于函数函数是具有名字的语句序列,使用函数可改善程序的结构,也用于将多处重复使用的代码编写为函数,减少代码量函数定义和函数调用形式参数与实际参数参数传递实际参数向形式参数传值实参与形参个数相等,类型一致,按顺序一一对应函数的返回值局部变量与全局变量变量的作用域与生存期staticextern第4页,课件共30页,创作于2023年2月#include<stdio.h>

longsum(inta,intb);longfactorial(intn);voidmain(){intn1,n2;longa;scanf("%d,%d",&n1,&n2);a=sum(n1,n2);printf("a=%1d",a);}longsum(inta,intb){longc1,c2;c1=factorial(a);c2=factorial(b);return(c1+c2);}

longfactorial(intn){longrtn=1;inti;for(i=1;i<=n;i++)rtn*=i;return(rtn);}longsum(inta,intb);longfactorial(intn);文件包含编译预处理命令函数原型说明函数定义函数调用函数调用函数返回值形参实参第5页,课件共30页,创作于2023年2月函数参数数组作为函数参数结构体数据作为函数参数第6页,课件共30页,创作于2023年2月传值调用函数调用执行时,将实际参数的值传递给形式参数,这个传递过程是单向的voidswap(intx,inty){intt;t=x;x=y;y=t;}intmain(){inta,b,c;a=3;b=8;c=2;if(a>b)swap(a,b);if(a>c)swap(a,c);if(b>c)swap(b,c);printf("%d%d%d",a,b,c);return0;}第7页,课件共30页,创作于2023年2月传值调用函数调用执行时,将实际参数变量的地址传递给形式参数voidswap(int*x,int*y){intt;t=*x;*x=*y;*y=t;}main(){inta,b,c;a=3;b=8;c=2;if(a>b)swap(&a,&b);if(a>c)swap(&a,&c);if(b>c)swap(&b,&c);printf("%d%d%d",a,b,c);}第8页,课件共30页,创作于2023年2月数组作为函数参数数组作为参数有两种形式数组元素作为实参,与一般变量相同;形参为数组,实参为数组名intnum[5]={79,11,27,26,43};num[4]num[2]num[3]num[0]num[1]7911272643数组元素是一个变量第9页,课件共30页,创作于2023年2月数组元素作为函数参数数组元素等同于一个一般变量,作为实参时,是将数组元素的值传给形参voidchange(intx){printf("before:%d\n",x);x=x+10;printf("after:%d\n",x);}intmain(){inti;intnum[6]={43,18,9,13,55,7};

change(num[2]);for(i=0;i<6;i++)printf("%d\t",num[i]);return0;}第10页,课件共30页,创作于2023年2月数组名作为函数参数数组名可以作为实参,传递的是数组空间的首地址

inti,j,temp,a[5]={43,18,9,13,55};

for(i=0;i<4;i++){for(j=0;j<4-i;j++)if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}/*endif*/}/*endfori*/voidsort(inta[],intn)/*数组a的尺寸为n*/{inti,j,temp;for(i=0;i<n-1;i++){for(j=0;j<n-1-i;j++)if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}/*endif*/}/*endfori*/}intmain(){inti;intnum[6]={43,18,9,13,55,7};

sort(num,6);for(i=0;i<6;i++)printf("%d\t",num[i]);return0;}第11页,课件共30页,创作于2023年2月数组名作为函数参数(续)多维数组作为实参和形参intmax_Value_Matrix(inta[][4],intm,intn){inti,j,line,col;

max=a[0][0];line=0;col=0;for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i][j]>max){max=a[i][j];line=i;col=j;}printf("%d,%d,",line,col);returnmax;}例如:找出二维数组中的最大元素,输出其下标voidmain(){inti,j,max,num[3][4];for(i=0;i<3;i++){for(j=0;j<4;j++){num[i][j]=rand();printf("%d\t",num[i][j]);}printf("\n");}

max=max_Value_Matrix(num,3,4);

printf("%d\t",max);}第12页,课件共30页,创作于2023年2月结构体变量作为函数参数(续)结构体变量作为函数的实参和形参intGetDateId(DATEdate){staticunsignedintday_of_month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};inti,date_id=0;for(i=0;i<date.month;i++)date_id+=day_of_month[i];date_id+=date.day;if(date.month>2&&IsLeapYear(date.year))date_id++;returndate_id;}typedefstruct{intyear,month,day;}DATE;voidmain(){DATEnew_date;intdays;

intGetDateId(DATEdate);new_date.year=2008;new_date.month=11;new_date.day=26;days=GetDateId(new_date);printf("%d",days);printf("\n");}第13页,课件共30页,创作于2023年2月结构体数组编写一程序,对于某班的50名学生,输入各学生的姓名、学号、高数、英语和程序设计课程成绩(都是百分制成绩),并按照总分降序排列输出成绩表。

1.定义描述每个学生信息的结构体类型

2.定义存储所有学生信息的结构体数组

3.输入

4.排序

5.输出第14页,课件共30页,创作于2023年2月内存布局代码区静态数据区栈区(stack)堆区(heap)代码区静态数据区(变量)栈区(stack)堆区(heap)文字常量区第15页,课件共30页,创作于2023年2月变量的属性数据类型:变量所持有的数据的性质(操作属性)存储类型存储器类型:寄存器、静态存储区、动态存储区生存期:变量在某一时刻存在-------静态变量与动态变量作用域:变量在某区域内有效-------局部变量与全局变量变量的存储类型auto-----自动型register-----寄存器型static------静态型extern-----全局型变量定义格式:[存储类型]数据类型变量表;变量是对程序中数据的存储空间的抽象如:intsum;

autointa,b,c;

registerinti;

staticfloatx,y;变量的属性第16页,课件共30页,创作于2023年2月

变量的作用域是指在程序的哪个范围内这个变量是有效的,即可以引用和赋值。根据作用域可以将变量分为:全局变量和局部变量外部变量(全局变量)定义在函数体外,可以在源程序的任何位置定义(必须保证不在任何一个函数体内)作用域从源文件定义位置开始之后的所有函数外部变量通常在程序开始处所有函数前定义,以便所有函数都能使用若在本程序中使用别的文件中定义的外部变量,则在程序开始处加extern进行声明(与函数的原型声明功能类似)变量的作用域第17页,课件共30页,创作于2023年2月外部变量会被各函数共同操作intgcd(){inti;

for(i=m;i>0;i--)if(m%i==0&&n%i==0)break;returni;}intm,n;main(){

intmax;printf("\ninputvalueform,n:");scanf("%d,%d",&m,&n);max=gcd();printf("Gcd=%d\t",max);}慎用全局变量,因耦合性太强!变量的作用域第18页,课件共30页,创作于2023年2月根据作用域可以将变量分为:外部变量(全局变量)intfun(intn){ intm,i; for(m=i=0;i<n;++i){ intk=m+1; m=k+i*1; } returnm;}左例中:n,m,i都是局部变量,作用于整个函数内部k为循环体内定义的语句,只作用于该复合语句中内部变量(局部变量,自动变量)在函数内作定义说明作用域仅限于它所定义的语句块(复合语句)内函数中的形参属于局部变量变量的作用域第19页,课件共30页,创作于2023年2月变量的作用域同一作用域内不允许出现同名变量不同作用域内同名变量互不影响全局变量的作用域是整个程序局部变量的作用域是所定义的复合语句体嵌套的两个作用域内的同名变量,以内层定义为准intf(intn){intx=1,y;while(1){doublex=2.0;}}x为又精度2.0变量的作用域第20页,课件共30页,创作于2023年2月变量的生存期变量是在程序的执行过程中才变划分内存空间的,这时候的变量才会存在程序结束后由OS收回程序所占内存空间,变量也就不存在了全局变量从程序开始到结束都存在局部变量只在其所定义的复合语句执行期间才存在变量的生存期第21页,课件共30页,创作于2023年2月程序装载到内存后所占用的内存空间称为用户区,分为数据区和代码区,其中数据区又分为静态存储区和动态存储区:静态存储区是在程序开始执行时给所有全局变量分配的存储区,在程序执行过程中占据固定的存储单元,程序行完毕才释放动态存储区是在程序运行期间根据需要进行动态分配的存储空间,用以存放以下数据:函数形式参数;自动变量;函数调用时的现场保护和返回地址;只在函数调用时分配动态存储空间,结束时释放这些空间变量的生存期代码区静态数据区栈区(stack)堆区(heap)第22页,课件共30页,创作于2023年2月有时需要在函数执行之后保留局部变量(的值),在下一次调用时使用。----实现这一需求的是静态局部变量intfac(intn){intf=1;f=f*n;return(f);}main(){inti;for(i=1;i<=5;i++) printf("%d!=%d\n",i,fac(i));}函数返回后仍保留f的值就好了!----将f设为静态局部变量(用关键字static进行声明)变量的生存期第23页,课件共30页,创作于2023年2月对静态局部变量的说明:intfac(intn){staticintf=1;f=f*n;return(f);}intmain(void){inti;for(i=1;i<=5;i++)printf("%d!=%d\n",i,fac(i));return0;}静态局部变量在静态存储区内分配存储单元,在程序整个运行期间都不释放。静态局部变量只赋初值一次如果在定义局部变量时不赋初值,系统自动赋初值0(对数值型变量)或空字符(对字符变量)。static变量第24页,课件共30页,创作于2023年2月staticintfac(intn){staticintf=1;f=f*n;return(f);}intmain(void){inti;for(i=1;i<=5;i++)printf("%d!=%d\n",i,fac(i));return0;}函数定义加static前缀时,本函数只能在当前程序文件中被调用static函数第25页,课件共30页,创作于2023年2月C程序中常见问题-字符数组与字符串定义字符数组:charname[5];

定义字符数组及初始化:charname1[5]={'c','h','i','n','a'};charname2[]={'c','h','i','n','a'};

定义字符数组及初始化:charname1[]={'c','h','i','n','a','\0'};

charname2[]={"china"};Charname3[]="china";scanf("%s",name);或gets(name);读入一个字符串时,系统会自动加上结束标志'\0'。第26页,课件共30页,创作于2023年2月当前字符=空格是否未出现新单词,使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例输入:Iamaboy.当前字符是否空格word原值新单词开始否word新值num值Iamaboy.例输入一行字符,统计其中有多少个单词第27页,课件共30页,创作于2023年2月YNword←0(c=str[i])!='\0'?输出num的值输入一个字符串str结束准备i←0num←0word←0c==''?word==0?word←1num←num+1i←i+1NYYN第28页,课件共30页,创作于2023年2月YNword←0(c=str[i])!='\0'

温馨提示

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

评论

0/150

提交评论