版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、函数参数与结构体练习第1页,共30页,2022年,5月20日,9点26分,星期一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;
2、 m=n; n=t; C程序中常见问题-if语句第2页,共30页,2022年,5月20日,9点26分,星期一C程序中常见问题-定长数组与变长数组定义定长数组: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页,2022年,5月20日,9点
3、26分,星期一关于函数函数是具有名字的语句序列,使用函数可改善程序的结构,也用于将多处重复使用的代码编写为函数,减少代码量函数定义和函数调用形式参数与实际参数参数传递实际参数向形式参数传值实参与形参个数相等,类型一致,按顺序一一对应函数的返回值局部变量与全局变量变量的作用域与生存期staticextern第4页,共30页,2022年,5月20日,9点26分,星期一#include long sum(int a, int b); long factorial(int n);void main() int n1,n2; long a; scanf(%d,%d,&n1,&n2); a = sum(n
4、1,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页,2022年,5月20日,9点26分,星期一传值调用函数调用执行时,将实际参数变量的地址传递给
5、形式参数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页,2022年,5月20日,9点26分,星期一数组作为函数参数数组作为参数有两种形式数组元素作为实参,与一般变量相同;形参为数组,实参为数组名int num5=79,11,27,26,43;num4num2num3n
6、um0nu组元素是一个变量第9页,共30页,2022年,5月20日,9点26分,星期一数组元素作为函数参数数组元素等同于一个一般变量,作为实参时,是将数组元素的值传给形参void change(int x) printf(before: %dn,x); x = x + 10; printf(after: %dn,x);int main() int i; int num6= 43, 18, 9, 13, 55, 7; change(num2); for(i = 0; i6; i+) printf(%dt,numi); return 0;第10页,共30页,2022年,5
7、月20日,9点26分,星期一数组名作为函数参数数组名可以作为实参,传递的是数组空间的首地址 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; for(i = 0; i n-1; i+) for(j = 0; j aj+1) temp = aj; aj = aj+1; aj+
8、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页,2022年,5月20日,9点26分,星期一数组名作为函数参数(续)多维数组作为实参和形参int max_Value_Matrix(int a4,int m,int n) int i, j, line,col; max = a00; line = 0; col = 0; for(i = 0; i
9、 m; i+) for(j = 0; j max) max = aij; line = i; col = j; printf(%d, %d, ,line,col); return max; 例如:找出二维数组中的最大元素,输出其下标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页,2022年,
10、5月20日,9点26分,星期一结构体变量作为函数参数(续)结构体变量作为函数的实参和形参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() DA
11、TE new_date; int days; int GetDateId( DATE date); new_date.year = 2008; new_date.month = 11; new_date.day = 26; days = GetDateId(new_date); printf(%d, days); printf(n);第13页,共30页,2022年,5月20日,9点26分,星期一结构体数组编写一程序,对于某班的50名学生,输入各学生的姓名、学号、高数、英语和程序设计课程成绩(都是百分制成绩),并按照总分降序排列输出成绩表。 1. 定义描述每个学生信息的结构体类型 2. 定义存储
12、所有学生信息的结构体数组 3. 输入 4. 排序 5. 输出第14页,共30页,2022年,5月20日,9点26分,星期一内存布局代码区静态数据区栈区(stack)堆区(heap)代码区静态数据区(变量)栈区(stack)堆区(heap)文字常量区第15页,共30页,2022年,5月20日,9点26分,星期一变量的属性数据类型:变量所持有的数据的性质(操作属性)存储类型存储器类型:寄存器、静态存储区、动态存储区生存期:变量在某一时刻存在-静态变量与动态变量作用域:变量在某区域内有效-局部变量与全局变量变量的存储类型auto -自动型register-寄存器型static -静态型extern
13、-全局型变量定义格式: 存储类型 数据类型 变量表;变量是对程序中数据的存储空间的抽象如: int sum; auto int a,b,c; register int i; static float x,y;变量的属性第16页,共30页,2022年,5月20日,9点26分,星期一变量的作用域 是指在程序的哪个范围内这个变量是有效的,即可以引用和赋值。根据作用域可以将变量分为:全局变量和局部变量外部变量(全局变量)定义在函数体外,可以在源程序的任何位置定义(必须保证不在任何一个函数体内)作用域从源文件定义位置开始之后的所有函数外部变量通常在程序开始处所有函数前定义,以便所有函数都能使用若在本程序
14、中使用别的文件中定义的外部变量,则在程序开始处加extern 进行声明(与函数的原型声明功能类似)变量的作用域第17页,共30页,2022年,5月20日,9点26分,星期一外部变量会被各函数共同操作int gcd( ) int i; for(i = m; i0; i-) if ( m%i=0 & n%i=0 ) 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);慎用全局变量,因耦合性太强
15、!变量的作用域第18页,共30页,2022年,5月20日,9点26分,星期一根据作用域可以将变量分为:外部变量(全局变量)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为循环体内定义的语句,只作用于该复合语句中内部变量(局部变量,自动变量)在函数内作定义说明作用域仅限于它所定义的语句块(复合语句)内函数中的形参属于局部变量变量的作用域第19页,共30页,2022年,5月20日,9点26分,星期一变量的作用域同一作用域内不允许出现同
16、名变量不同作用域内同名变量互不影响全局变量的作用域是整个程序局部变量的作用域是所定义的复合语句体嵌套的两个作用域内的同名变量,以内层定义为准int f(int n) int x = 1, y; while (1) double x = 2.0; x为又精度2.0变量的作用域第20页,共30页,2022年,5月20日,9点26分,星期一变量的生存期变量是在程序的执行过程中才变划分内存空间的,这时候的变量才会存在程序结束后由OS收回程序所占内存空间,变量也就不存在了全局变量从程序开始到结束都存在局部变量只在其所定义的复合语句执行期间才存在变量的生存期第21页,共30页,2022年,5月20日,9点
17、26分,星期一程序装载到内存后所占用的内存空间称为用户区,分为数据区和代码区,其中数据区又分为静态存储区和动态存储区:静态存储区是在程序开始执行时给所有全局变量分配的存储区,在程序执行过程中占据固定的存储单元,程序行完毕才释放 动态存储区是在程序运行期间根据需要进行动态分配的存储空间,用以存放以下数据:函数形式参数;自动变量;函数调用时的现场保护和返回地址;只在函数调用时分配动态存储空间,结束时释放这些空间 变量的生存期代码区静态数据区栈区(stack)堆区(heap)第22页,共30页,2022年,5月20日,9点26分,星期一有时需要在函数执行之后保留局部变量(的值),在下一次调用时使用。
18、-实现这一需求的是静态局部变量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页,2022年,5月20日,9点26分,星期一对静态局部变量的说明: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(%
19、d!=%dn,i,fac(i); return 0;静态局部变量在静态存储区内分配存储单元,在程序整个运行期间都不释放。静态局部变量只赋初值一次如果在定义局部变量时不赋初值,系统自动赋初值0(对数值型变量)或空字符(对字符变量)。static变量第24页,共30页,2022年,5月20日,9点26分,星期一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页,2022年,5月20日,9点26分,星期一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、页,2022年,5月20日,9点26分,星期一当前字符=空格是否未出现新单词,使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页,2022年,5月20日,9点26分,星期一YNword0(c=stri)!=0?输出num的值输入一个字符串s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年福建省漳平市高一化学上册期末考试模拟检测卷附参考答案(轻巧夺冠)
- 2026湖南高速养护工程有限公司社会招聘任务型劳动合同制员工46人笔试历年参考题库附带答案详解
- 2026湖南衡阳市衡东县城乡发展投资集团有限公司招聘2人笔试历年参考题库附带答案详解
- 2026湖北文旅鄂州集团招聘1人笔试历年参考题库附带答案详解
- 2026湖北交通投资集团有限公司招聘14人笔试历年参考题库附带答案详解
- 2026浙江杭州富阳优农农业发展有限公司销售人员招聘笔试历年参考题库附带答案详解
- 2026浙江宁波交通工程建设集团有限公司招聘笔试历年参考题库附带答案详解
- 2026年河北省黄骅市高一化学上册期末考试模拟考试卷【夺冠系列】附答案
- 2026人工智能在医疗健康领域的应用前景与商业价值分析报告
- 2026江西铜业集团南方公司春季校园招聘11人笔试历年参考题库附带答案详解
- 外伤的急救培训
- DB51T 2596-2019 公路梁式桥梁变刚度支座技术规程
- 北京工业大学《微机原理与应用》2023-2024学年期末试卷
- SF-T0095-2021人身损害与疾病因果关系判定指南
- AQ 1066-2008 煤层瓦斯含量井下直接测定方法(正式版)
- GB 1499.2-2024钢筋混凝土用钢第2部分:热轧带肋钢筋
- 江苏省泰州市海陵区2023-2024学年六年级下学期期末数学试卷
- 《光伏发电工程预可行性研究报告编制规程》(NB/T32044-2018)中文版
- 2023急性中耳炎多学科团队救治中国专家共识(全文)
- 《食品感官评价方法》课件
- 公路工程总体实施性施工组织设计
评论
0/150
提交评论