计算机二级C语言3.docx
- 文档编号:12677917
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:31
- 大小:133.98KB
计算机二级C语言3.docx
《计算机二级C语言3.docx》由会员分享,可在线阅读,更多相关《计算机二级C语言3.docx(31页珍藏版)》请在冰豆网上搜索。
计算机二级C语言3
计算机二级C语言3
第十二章变量的作用域及存储类别
1全局变量和局部变量
全局变量---凡是在函数外(包括主函数和子函数)定义的变量,它的有效范围是从定义开始到程序结束,其默认的初始值为0.
局部变量---①在函数内部(包括主函数和子函数)定义的变量,它的有效范围是在函数内部,其默认的初始值为随机数。
②在复合语句内部定义的变量,它的有效范围是在复合语句内部,其默认的初始值为随机数。
看下面程序输出结果是什么?
例1:
#include”stdio.h”
intx;
intfun()
{intx=5;
printf(“%d,”,x);
returnx++;
}
main()
{inty;
y=fun();
{inty=9;
y++;
}
printf(“%d,%d\n”,x,y);
}
答案:
5,0,5
2变量的存储类别
所谓变量的存储类别就是指变量存储在内存中的哪个区域,内存的区域划分如下图:
定义任何一个变量都要对这个变量进行三项说明:
一是这个变量放在哪个区;二是这个变量的值的类型;三是这个变量的值是多少。
1对于全局变量有两种存储类别的说明,即extern和static(封闭型的),并且全局变量放在静态区。
对于全局变量如果省略存储类别说明,则默认是extern,extern有两种含义:
一是说明这个全局变量是开放型的,二是用来扩展全局变量的使用范围。
如:
externintx;/*用于扩展x的使用范围*/
main()
{
printf(“%d”,x);
}
intx;
2对于局部变量有三种存储类别说明,即:
auto(动态型)、static(静态型)、register(寄存器型)
局部变量的默认存储类别是auto
register和auto基本一样,只不过前者速度要快一些。
static称为静态局部变量:
它放在静态区。
也就是说,全局变量和静态局部变量是放在静态区的,放在静态区的变量有两个特点:
⑴默认初始值为0⑵其值保留。
例子:
下面程序输出结果是什么?
#include”stdio.h”
voidfun(int*s)
{staticintj;
dos[j]+=s[j+1];while(++j<2);
}
main()
{intk,a[10]={1,2,3,4,5};
for(k=1;k<3;k++)fun(a);
for(k=0;k<5;k++)printf(“%d”,a[k]);
}/*答案:
35745*/
3函数的存储类别
定义任何一个子函数,也需要对这个子函数进行两项说明:
一是函数的返回值类型;二是函数的存储类别。
用extern(开放型)和static(封闭型)来说明函数存储类别。
默认的函数存储类别是extern
做书后习题
第十三章编译预处理和动态函数
1宏替换
宏替换分两种情况:
1不带参数的宏替换
#defineN10/*注意后面没有分号*/
说明:
即把程序中的N替换成10,而不是N的值等于10,N不是变量,它是常量。
在程序正式运行之前进行替换。
分析下面程序:
#defineN3+5
main()
{
printf(“%d”,2*N);
}
答案:
11
2带参数的宏替换
分析下面程序:
#defineF(x)3*x+5
main()
{
printf(“%d”,2*F(3+6));
}
答案:
29
2动态函数---malloc()、calloc()、free()
int*p1,*p2;
p1=(int*)malloc(5);/*老师画图解释含义*/
p2=(int*)calloc(2,5);/*老师画图解释含义*/
free(p1);free(p2);
第十四章结构体、共用体、类型定义、链表
1结构体变量的概念
大家回忆一下数组变量的含义,它是把相同类型的变量集合在一起,然后起个名字,这个名字就是数组变量。
那么能否把类型不同的变量集合在一起呢?
回答是肯定的,把类型不同的变量集合在一起,然后起个名字,这个名字就称为结构体变量。
2如何定义结构体变量?
首先定义类型,看如下:
然后才可以定义基于这种类型的结构体变量,假设现在要定义两个结构体变量a,b可以有如下定义方法,
⑴structstudent{charname[10];
intage;
floats1;}a,b;
⑵structstudenta,b;
⑶structstudent{charname[10];
intage;
floats1;}a;
structstudentb;
分析:
假设没有类型名,如何定义结构体变量?
回答:
只能用⑴的方法定义
⑷假设用typedef来进行说明,看如下:
则可定义结构体变量a,b如下:
STa,b;
分析:
现在大家比较一下以上四种定义结构体变量的方法,哪个简单?
?
?
另外关于typedef举个例子:
如:
typeintT;那么定义int型变量可以写成:
Ta,b;
Typedefchar*M;那么定义字符型指针型变量可以写成:
Ma,b;(不能写成M*a,*b;)
3给结构体变量初始化
比如用⑷定义方法来进行初始化:
STa={“li”,19,78},b={“zhang”,20,88};
分析:
用其它三种定义,怎么给变量初始化?
用图形来表示一下变量a,b的示意图:
大家分析一下:
变量a和b各占多少字节?
(都占18个字节)
另外还要注意变量a和b在位置上是不连续的。
3给结构体变量赋值
假设不用上述初始化的方法,也使a,b得到上面的值,我们可以用赋值的方法满足它。
分析:
什么情况下可以写成a.name=”li”;
(结构体类型中的charname[10]改为char*name;时可以)
另外:
想把b的值赋给a,用哪两种方法实现?
(一是写成a=b;二是写成strcpy(a.name,b.name);a.age=b.age;a.s1=b.s1)
4用指针来指向结构体变量
STp;/*定义一个指向结构体的指针*/
p=&a;
则上面的赋值语句可以写成:
strcpy(p->name,”li”);/*或strcpy((*p).name,”li”);*/
p->age=19;/*或(*p).age=19;*/
p->s1=78;/*或(*p).s1=78;*/
总结一下:
表示结构体里的分量有三种方法:
如把变量a里的分量age改为20;可写成如下:
a.age=20;p->age=20;(*p).age=20;
5结构体数组,看如下定义:
structstudents[3]={{“li”,19,78},{“zhang”,20,80},
{“wang”,21,90}};
structstudentp=s;/*或写成p=&s[0]*/
注意:
变量s[0]、s[1]、s[2]在位置上是连续的。
大家分析一下:
如果执行p++;后,指针p指向谁?
?
?
(指向s[1])
具备了上述的知识,我们可以做几个例题:
例1:
下面程序的输出结果是什么?
#include”stdio.h”
#defineN3
structstudent{charname[10];
intage;
floats1;};
intfun(structstudent*p)
{floatmax=p->s1;
intk=0,i;
for(i=1;i if(p->s1>max){max=p->s1;k=i;} returnk; } main() {structstudents[N]={{“li”,19,78},{“zhang”,20,80}, {“wang”,21,90}}; intk; k=fun(s); printf(“%s,%d,%.2f\n”,s[k].name,s[k].age,s[k].s1); } 答案: wang,21,90.00(即: 求成绩最高的) 例2: 下面程序的输出结果是什么? #include”stdio.h” structst {intx; int*y; }*p; intdt[4]={10,20,30,40}; structstaa[4]={50,&dt[0],60,&dt[0],60,&dt[0],60,&dt[0]}; main() {p=aa;printf(“%d\n”,++p->x); printf(“%d\n”,(++p)->x);printf(“%d\n”,++(*p->y)); } 答案: 51 60 11 例3: 下面程序的输出结果是什么? #include”stdio.h” #defineN3 structstudent{charname[10]; intage; floatscore[3]; floatav;}; voidfun(structstudent*p,structstudenta) {floatavmin; inti,k; for(i=0;i p[i].av=(p[i].score[0]+p[i].score[1]+p[i].score[2])/3; avmin=p[0].av; k=0; for(i=1;i if(p[i].av p[k]=a; } main() {structstudents[N]={{“li”,19,{55,60,50},0}, {“zhang”,20,{80,81,82},0}, {“wang”,21,{90,91,92},0}}; structstudenta={“lina”,25,{65,66,67},66}; inti,j; fun(s,a); for(i=0;i {printf(“\n%s,%d,”,s[i].name,s[i].age); for(j=0;j<3;j++) printf(“%.2f,”,s[i].score[j]); printf(“%.2f”,s[i].av); } } 答案: 例4: 学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是: 把指定分数范围内的学生数据放在b所指的数组中,分数范围内的学生人数由函数值返回。 例如,输入的分数是60、69,则应当把分数在60~69之间的学生数据进行输出,包含60分和69分的学生数据。 主函数中将把60放在low中,把69放在heigh中。 注意: 部分源程序已给出。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 #include #defineN16 typedefstruct { charnum[10]; ints; }STREC; intfun(STREC*a,STREC*b,intl,inth) { 由学生自己来写 } main() { STRECs[N]={{"GA005",85},{"GA003",76}, {"GA002",69},{"GA004",85},{"GA001",96}, {"GA007",72},{"GA008",64},{"GA006",87}, {"GA015",85},{"GA013",94},{"GA012",64}, {"GA014",91},{"GA011",90},{"GA017",64}, {"GA018",64},{"GA016",72}}; STRECh[N],tt; inti,j,n,low,heigh,t; printf("Enter2integernumberlow&heigh: "); scanf("%d%d",&low,&heigh); if(heigh {t=heigh;heigh=low;low=t;} n=fun(s,h,low,heigh); printf("Thestudent'sdatabetween%d--%d: \n",low,heigh); for(i=0;i printf("%s%4d\n",h[i].num,h[i].s); printf("\n"); } 参考答案: inti,n=0; for(i=0;i if(a[i].s>=l&&a[i].s<=h)b[n++]=a[i]; returnn; 输出结果: 例5: 编程题 学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是: 把分数最低的学生数据放在b所指的数组中。 注意,分数最低的学生可能不止一个,函数返回分数最低的学生的人数。 注意: 部分源程序已给出。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 #include #defineN16 typedefstruct {charnum[10]; ints; }STREC; intfun(STREC*a,STREC*b) { } main() { STRECs[N]={{"GA05",85},{"GA03",76}, {"GA02",69},{"GA04",85}, {"GA01",91},{"GA07",72}, {"GA08",64},{"GA06",87}, {"GA015",85},{"GA013",91}, {"GA012",64},{"GA014",91}, {"GA011",91},{"GA017",64}, {"GA018",64},{"GA016",72}}; STRECh[N]; inti,n; FILE*out; n=fun(s,h); printf("The%dlowestscore: \n",n); for(i=0;i printf("%s%4d\n",h[i].num,h[i].s); printf("\n"); out=fopen("out24.dat","w"); fprintf(out,"%d\n",n); for(i=0;i fprintf(out,"%4d\n",h[i].s); fclose(out); } 参考答案: inti,mins,n=0; mins=a[0].s; for(i=1;i if(a[i].s for(i=0;i if(a[i].s==mins)b[n++]=a[i]; returnn; 输出结果: 6动态链表 ⑴链表的概念 把在位置上不连续的多个结构体变量建立联系。 ⑵链表的建立 Ⅰ静态链表的建立(知道结点的个数) typedefstructss{intdata; structss*next; }ST; STa,b,c,*h,*p; h=p=&a;p->next=&b;p=p->next;p->next=&c;p=p->next;p->next=0; 经过上面的几个语句,已经把a,b,c三个变量连接起来了,这里要注意: 每个变量都称为一个结点,最后一个结点的指针变量*next的值一定是0(或NULL、‘\0’) 示意图如下: 假设要输出上图中的每个结点的data: ST*p; p=h; while(p! =0)/*如果把p! =0写成p->next! =0输出会是什么? ? ? */ {printf(“%d,”,p->data); p=p->next; } Ⅱ动态链表的建立(不知道结点的个数) 动态链表分为不带头结点的和带头结点。 例: 从键盘输入若干个正整数(每个数就是每个结点里的data),直到输入-1为止,把这若干个结点连接起来。 不带头结点的程序如下: #include"stdio.h" #include"stdlib.h" typedefstructss{intdata; structss*next; }ST; main() {ST*h,*p,*q;intx; /*下面程序是建立动态链表(不带头结点)*/ h=p=q=(ST*)malloc(sizeof(ST)); while (1) {scanf(“%d”,&x); if(x==-1){p->next=0;break;} p=q; p->data=x; q=(ST*)malloc(sizeof(ST)); p->next=q; } /*下面程序是输出各结点中的data*/ p=h;/*和带头结点的不一样*/ while(p! =0) {printf(“%d,”,p->data); p=p->next; } } 带头结点的程序如下: #include"stdio.h" #include"stdlib.h" typedefstructss{intdata; structss*next; }ST; main() {ST*h,*p,*q;intx; /*下面程序是建立动态链表(带头结点)*/ h=p=q=(ST*)malloc(sizeof(ST));h->data=0; while (1) {scanf(“%d”,&x); if(x==-1){p->next=0;break;} q=(ST*)malloc(sizeof(ST)); q->data=x; p->next=q; p=q; } /*下面程序是输出各结点中的data*/ p=h->next;/*和不带头结点的不同*/ while(p! =0) {printf(“%d,”,p->data); p=p->next; } } 例子: 填空题 给定程序中,函数fun的功能是将带头结点的单向链表结点数据域中的数据从小到大排序。 即若原链表结点数据域从头至尾的数据为: 16、3、1、7、5,排序后链表结点数据域从头至尾的数据为: 1、3、5、7、16。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意: 不得增行或删行,也不得更改程序的结构! #include #include #defineN6 typedefstructnode {intdata; structnode*next; }NODE; voidfun(NODE*h) { NODE*p,*q;intt; /**********found**********/ p=1;/*p=h*/ while(p) { /**********found**********/ q=2;/*q=p->next*/ while(q) { /**********found**********/ if(p->data3q->data)/*>*/ { t=p->data; p->data=q->data; q->data=t; } q=q->next; } p=p->next; } } NODE*creatlist(inta[]) { NODE*h,*p,*q;inti; h=(NODE*)malloc(sizeof(NODE)); h->next=NULL; for(i=0;i { q=(NODE*)malloc(sizeof(NODE)); q->data=a[i]; q->next=NULL; if(h->next==NULL)h->next=p=q; else{p->next=q;p=q;} } returnh; } voidoutlist(NODE*h) { NODE*p; p=h->next; if(p==NULL) printf("ThelistisNULL! \n"); else { printf("\nHead"); do { printf("->%d",p->data); p=p->next; }while(p! =NULL); printf("->End\n"); } } main() { NODE*head; inta[N]={0,16,3,1,7,5}; head=creatlist(a); printf("\nTheoriginallist: \n"); outlist(head); fun(head); printf("\nThelistaftersorting: \n"); outlist(head); } 讲解一下P207的14.10和14.11 7删除链表中的某一个结点 老师画图讲解一下,并结合本章后面的习题 8在链表中插入一个结点 老师画图讲解一下,并结合本章后面的习题 9共用体变量 弄懂下面的例子就可以了: #include”stdio.h” main() {union{shorti[2]; longk; charc[4]; }r,*s=&r; s->i[0]=0x39;s->i[1]=0x38; printf(“%x\n”,s->c[0]); } 问: ⑴公用体变量r占多少字节? 既: sizeof(r)=? (4) ⑵输出结果是什么? (39) ⑶如果把%x改为%c,输出结果是什么? (9) ⑷如果把%x改为%d,输出结果是什么? (57) ⑸如果把s->i[0]=0x39;和s->i[1]=0x38;分别改为 s->i[0]=39;和s->i[1]=38; 输出结果是什么? (27) ⑹如果把s->i[0]=0x39;和s->i[1]=0x38;分别改为 s->i[0]=339;和s->i[1]=338; 输出结果是什么? (53) 第十五章位运算 本章主要掌握有关位运算的几种符号: 基本运算符: ~(按位取反)、<<(左移)、>>(右移)、&(按位与)^(异或)、|(按位或) 扩展运算符: <<=>>=&=^=|= 假设a=7,b=9 a<<=2;问a=? (28,左移2位相当于a=a*22) b>>=2;问b=? (2,右移2位相当于b=b/22) a&=b;问a=? (1,对应的两位均为1才得1,否则得0) a|=b;问a=? (15,对应的两位只要有一位是1就得
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 二级 语言