计算机二级C语言3Word文档下载推荐.docx
《计算机二级C语言3Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机二级C语言3Word文档下载推荐.docx(31页珍藏版)》请在冰点文库上搜索。
for(k=0;
5;
k++)printf(“%d”,a[k]);
}/*答案:
35745*/
3函数的存储类别
定义任何一个子函数,也需要对这个子函数进行两项说明:
一是函数的返回值类型;
二是函数的存储类别。
用extern(开放型)和static(封闭型)来说明函数存储类别。
默认的函数存储类别是extern
做书后习题
第十三章编译预处理和动态函数
1宏替换
宏替换分两种情况:
1不带参数的宏替换
#defineN10/*注意后面没有分号*/
说明:
即把程序中的N替换成10,而不是N的值等于10,N不是变量,它是常量。
在程序正式运行之前进行替换。
分析下面程序:
#defineN3+5
printf(“%d”,2*N);
11
2带参数的宏替换
#defineF(x)3*x+5
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];
}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;
s1=78;
/*或(*p).s1=78;
总结一下:
表示结构体里的分量有三种方法:
如把变量a里的分量age改为20;
可写成如下:
a.age=20;
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])
具备了上述的知识,我们可以做几个例题:
下面程序的输出结果是什么?
#defineN3
structstudent{charname[10];
};
intfun(structstudent*p)
{floatmax=p->
s1;
intk=0,i;
for(i=1;
i<
N;
i++,p++)
if(p->
s1>
max){max=p->
k=i;
returnk;
}
{structstudents[N]={{“li”,19,78},{“zhang”,20,80},
intk;
k=fun(s);
printf(“%s,%d,%.2f\n”,s[k].name,s[k].age,s[k].s1);
wang,21,90.00(即:
求成绩最高的)
例2:
structst
{intx;
int*y;
}*p;
intdt[4]={10,20,30,40};
structstaa[4]={50,&
dt[0],60,&
dt[0]};
{p=aa;
printf(“%d\n”,++p->
x);
printf(“%d\n”,(++p)->
printf(“%d\n”,++(*p->
y));
51
60
11
例3:
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;
i++)
if(p[i].av<
avmin){avmin=p[i].av;
p[k]=a;
{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;
{printf(“\n%s,%d,”,s[i].name,s[i].age);
for(j=0;
j<
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<
stdio.h>
#defineN16
typedefstruct
charnum[10];
ints;
}STREC;
intfun(STREC*a,STREC*b,intl,inth)
由学生自己来写
STRECs[N]={{"
GA005"
85},{"
GA003"
76},
{"
GA002"
69},{"
GA004"
GA001"
96},
GA007"
72},{"
GA008"
64},{"
GA006"
87},
GA015"
GA013"
94},{"
GA012"
64},
GA014"
91},{"
GA011"
90},{"
GA017"
GA018"
GA016"
72}};
STRECh[N],tt;
inti,j,n,low,heigh,t;
printf("
Enter2integernumberlow&
heigh:
"
);
scanf("
%d%d"
&
low,&
heigh);
if(heigh<
low)
{t=heigh;
heigh=low;
low=t;
n=fun(s,h,low,heigh);
Thestudent'
sdatabetween%d--%d:
\n"
low,heigh);
n;
%s%4d\n"
h[i].num,h[i].s);
}
参考答案:
inti,n=0;
if(a[i].s>
=l&
&
a[i].s<
=h)b[n++]=a[i];
returnn;
输出结果:
例5:
编程题
把分数最低的学生数据放在b所指的数组中。
注意,分数最低的学生可能不止一个,函数返回分数最低的学生的人数。
{charnum[10];
intfun(STREC*a,STREC*b)
GA05"
GA03"
GA02"
GA04"
85},
GA01"
GA07"
72},
GA08"
GA06"
91},
STRECh[N];
inti,n;
FILE*out;
n=fun(s,h);
The%dlowestscore:
n);
i++)
out=fopen("
out24.dat"
"
w"
fprintf(out,"
%d\n"
%4d\n"
h[i].s);
fclose(out);
inti,mins,n=0;
mins=a[0].s;
for(i=1;
if(a[i].s<
mins)mins=a[i].s;
if(a[i].s==mins)b[n++]=a[i];
6动态链表
⑴链表的概念
把在位置上不连续的多个结构体变量建立联系。
⑵链表的建立
Ⅰ静态链表的建立(知道结点的个数)
typedefstructss{intdata;
structss*next;
}ST;
STa,b,c,*h,*p;
h=p=&
next=&
b;
p=p->
next;
c;
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->
Ⅱ动态链表的建立(不知道结点的个数)
动态链表分为不带头结点的和带头结点。
例:
从键盘输入若干个正整数(每个数就是每个结点里的data),直到输入-1为止,把这若干个结点连接起来。
不带头结点的程序如下:
#include"
stdio.h"
stdlib.h"
{ST*h,*p,*q;
/*下面程序是建立动态链表(不带头结点)*/
h=p=q=(ST*)malloc(sizeof(ST));
while
(1)
{scanf(“%d”,&
if(x==-1){p->
break;
p=q;
data=x;
q=(ST*)malloc(sizeof(ST));
next=q;
/*下面程序是输出各结点中的data*/
/*和带头结点的不一样*/
=0)
{printf(“%d,”,p->
带头结点的程序如下:
/*下面程序是建立动态链表(带头结点)*/
h->
data=0;
q->
p=h->
/*和不带头结点的不同*/
填空题
给定程序中,函数fun的功能是将带头结点的单向链表结点数据域中的数据从小到大排序。
即若原链表结点数据域从头至尾的数据为:
16、3、1、7、5,排序后链表结点数据域从头至尾的数据为:
1、3、5、7、16。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
不得增行或删行,也不得更改程序的结构!
stdlib.h>
#defineN6
typedefstructnode
{intdata;
structnode*next;
}NODE;
voidfun(NODE*h)
NODE*p,*q;
intt;
/**********found**********/
p=1;
/*p=h*/
while(p)
{
q=2;
/*q=p->
next*/
while(q)
data3q->
data)/*>
t=p->
data;
p->
data=q->
q->
data=t;
q=q->
NODE*creatlist(inta[])
NODE*h,*p,*q;
inti;
h=(NODE*)malloc(sizeof(NODE));
h->
next=NULL;
for(i=0;
i<
i++)
q=(NODE*)malloc(sizeof(NODE));
data=a[i];
if(h->
next==NULL)h->
next=p=q;
else{p->
returnh;
voidoutlist(NODE*h)
NODE*p;
p=h->
if(p==NULL)
ThelistisNULL!
else
\nHead"
do
{
->
%d"
p->
}while(p!
=NULL);
End\n"
NODE*head;
inta[N]={0,16,3,1,7,5};
head=creatlist(a);
\nTheoriginallist:
outlist(head);
fun(head);
\nThelistaftersorting:
讲解一下P207的14.10和14.11
7删除链表中的某一个结点
老师画图讲解一下,并结合本章后面的习题
8在链表中插入一个结点
9共用体变量
弄懂下面的例子就可以了:
{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[0]=39;
i[1]=38;
输出结果是什么?
(27)
⑹如果把s->
i[0]=339;
i[1]=338;
(53)
第十五章位运算
本章主要掌握有关位运算的几种符号:
基本运算符:
~(按位取反)、<
<
(左移)、>
>
(右移)、&
(按位与)^(异或)、|(按位或)
扩展运算符:
<
=>
=&
=^=|=
假设a=7,b=9
a<
=2;
问a=?
(28,左移2位相当于a=a*22)
b>
问b=?
(2,右移2位相当于b=b/22)
a&
=b;
(1,对应的两位均为1才得1,否则得0)
a|=b;
(15,对应的两位只要有一位是1就得