新视野二级C上机之填空题做题方法和技巧.docx
《新视野二级C上机之填空题做题方法和技巧.docx》由会员分享,可在线阅读,更多相关《新视野二级C上机之填空题做题方法和技巧.docx(22页珍藏版)》请在冰豆网上搜索。
![新视野二级C上机之填空题做题方法和技巧.docx](https://file1.bdocx.com/fileroot1/2023-1/26/57860c17-f731-428a-9044-3becd3a31d0d/57860c17-f731-428a-9044-3becd3a31d0d1.gif)
新视野二级C上机之填空题做题方法和技巧
新视野教育•二级C语言上机填空题做题方法和技巧总结
一、填空题之方法
1、上机填空题占30分,一般有3个空需要填写,每个空为10分;
2、填空题做题之前必须弄清题目含义,抓住关键字,例如:
要求对数组进行从小到大排序,则将会出现大于符号,如果是从大到小排序则出现小于符号;
3、填空题中出现频率最高的就是函数的调用、函数的首部、函数的返回值等和函数相关的问题,因此必须牢牢掌握祝函数的基本特征;
4、填空题中有的“空”比较难,考生除了掌握必须的C语言知识之外,还需要很好的逻辑思路,如果一个空将花很多时间来解决,那么建议使用“死记硬背”的方法来缩短复习时间;
5、上机题库中100题有部分题目是重复的或是相似的题目很多,同学们要使用比对的方法尽量去理解;
6、多练习,多思考,多总结
二、填空题之结构体相关考点
1、结构体成员引用:
上机题库P18第9题(和92题一致),P27第23题(和51题一样)
||||||||||||||||
(1)读清楚题目要求:
1要求将形参a所指结构体变量的数据赋值给函数中的结构体变量b;
2从例如可以看出来:
结构体中的学号和姓名变为了1002和“LiSi”,但是3门课成绩没有变化;
(2)代码分析:
#include
#include
structstudent{
longsno;
charname[10];
floatscore[3];
};
voidfun(structstudenta)/*fun函数首部,函数返回void,有一个形参a,a是一个结构体类型,形参a和类型必须和实参s的类型一致*/
{structstudentb;inti;
/**********found**********/
b=__1__;/*题目要求将形参a的值赋值给结构体变量b,因此填:
a*/
b.sno=10002;/*将10002赋值给b.no,因此结构体变量b的学号变为了10002*/
/**********found**********/
strcpy(__2__,"LiSi");/*姓名要变为”LiSi”,则要引用b中的name成员,因此填入b.name*/
printf("\nThedataaftermodified:
\n");/*讲解是一句带过不用多讲*/
printf("\nNo:
%ldName:
%s\nScores:
",b.sno,b.name);/*讲解是一句带过不用多讲*/
/**********found**********/
for(i=0;i<3;i++)printf("%6.2f",b.__3__);/*分析:
这个是一个循环语句,执行3次循环,printf("%6.2f",b.__3__)要求输出是一个实型数据的成员,因此可以得知是score成员,因为score是一个数组,因此填:
b.score[i],当i变化就可以取出第一门、第二门、第三门课的成绩*/
printf("\n");
}
main()
{structstudents={10001,"ZhangSan",95,80,88};/*考试必须了解的定义部分定义的内容*/
inti;
printf("\n\nTheoriginaldata:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",s.sno,s.name);
for(i=0;i<3;i++)printf("%6.2f",s.score[i]);
printf("\n");
fun(s);/*调用fun函数,传入实参,实参和形参必须一一对应,类型和个数必须一致*/
}
23题:
(1)从例如中可以看出:
变化的是结构体中的学号和姓名
#include
#include
structstudent{
longsno;
charname[10];
floatscore[3];
};
voidfun(structstudent*b)
{inti;
/**********found**********/
b__1__=10004;/*题目中t的学号变化为了10004,因此填写:
b->sno,不能填写b.sno,因为b是一个指针*/
/**********found**********/
strcpy(b__2__,"LiJie");/*t的姓名变为了”LiJie”,因此填写:
b->name*/
}
main()
{structstudentt={10002,"ZhangQi",93,85,87};
inti;
printf("\n\nTheoriginaldata:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",t.sno,t.name);
for(i=0;i<3;i++)printf("%6.2f",t.score[i]);
printf("\n");
/**********found**********/
fun(__3__);/*此处为函数调用,根据形参的类型来判定实参,形参structstudent*b为结构体指针,联系main函数定义部分只有structstudentt和b的类型相同,因此可知需要填的是:
&t*/
printf("\nThedataaftermodified:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",t.sno,t.name);
for(i=0;i<3;i++)printf("%6.2f",t.score[i]);
printf("\n");
}
2、函数调用and结构体:
上机题库P22第16题(和78、82题一样)
(1)把a中地址作为函数返回值返回函数。
(2)观察可知a中的学号、姓名边为了10002和“zhangSan”,每门课的成绩增加了1分。
#include
#include
structstudent{
longsno;
charname[10];
floatscore[3];
};
/**********found**********/
__1__fun(structstudent*a)/*根据函数调用t=fun(&s);可知函数返回类型和t的类型相同,structstudents={10001,"ZhangSan",95,80,88},*t;可知t的类型为structstudent**/
{inti;
a->sno=10002;
strcpy(a->name,"LiSi");
/**********found**********/
for(i=0;i<3;i++)__2__+=1;/*题目要求将每门课成绩增加1分,因此填为:
a->score[i],不能为a.score[i]或是a.score*/
/**********found**********/
return__3__;/*题目要求返回a的地址,a本身就是一个指针,因此填入a即可*/
}
main()
{structstudents={10001,"ZhangSan",95,80,88},*t;
inti;
printf("\n\nTheoriginaldata:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",s.sno,s.name);
for(i=0;i<3;i++)printf("%6.2f",s.score[i]);
printf("\n");
t=fun(&s);
printf("\nThedataaftermodified:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",t->sno,t->name);
for(i=0;i<3;i++)printf("%6.2f",t->score[i]);
printf("\n");
}
3、结构体和排序:
上机题库P14第2题
(1)排序的格式:
红色部分为考试中的重点,必须记住
(2)第2题代码分析:
voidfun(structstudenta[],intn)
{
/**********found**********/
__1__t;此处要求填入t的类型,可以从t=a[i];中得知t和a数组的类型必须一致,voidfun(structstudenta[],intn)中得知a为结构体类型,因此填写:
structstudent
inti,j;
/**********found**********/
for(i=0;i<__2__;i++)根据排序的格式填空,因此记住是关键
for(j=i+1;j/**********found**********/
if(strcmp(__3__)>0)按照姓名字典顺序从小到大排序,因此:
strcmp(a[i].name,a[j].name),此处需要特别注意
{t=a[i];a[i]=a[j];a[j]=t;}
}
main()
{structstudents[4]={{10001,"ZhangSan",95,80,88},
{10002,"LiSi",85,70,78},
{10003,"CaoKai",75,60,88},
{10004,"FangFang",90,82,87}};
inti,j;
printf("\n\nTheoriginaldata:
\n\n");
for(j=0;j<4;j++)
{printf("\nNo:
%ldName:
%-8sScores:
",s[j].sno,s[j].name);
for(i=0;i<3;i++)printf("%6.2f",s[j].score[i]);
printf("\n");
}
fun(s,4);
printf("\n\nThedataaftersorting:
\n\n");
for(j=0;j<4;j++)
{printf("\nNo:
%ldName:
%-8sScores:
",s[j].sno,s[j].name);
for(i=0;i<3;i++)printf("%6.2f",s[j].score[i]);
printf("\n");
}
}
三、填空题与链表相关
1、带头结点的链表:
p=h->next,上机题库P21第15题
(1)带头结点链表的表现形式:
带头结点的链表,头结点head不存放任何的数据,从头结点的下一个结点开始存放数据,因此考试中如果出现p=__1__;则填入p=h->next
(2)链表数据排序
(3)15题:
#include
#include
#defineN6
typedefstructnode{
intdata;
structnode*next;
}NODE;
voidfun(NODE*h)
{NODE*p,*q;intt;
/**********found**********/
p=__1__;链表为带头结点,因此填写:
p=h->next
while(p){
/**********found**********/
q=__2__;比较两个链表中元素的大小,因此q=p->next,这样q指向了p的下一位
while(q){
/**********found**********/
if(p->data__3__q->data)—>从小到大排序,因此使用大于符号,填写:
>
{t=p->data;p->data=q->data;q->data=t;}
q=q->next;
}
p=p->next;
}
}
main()
{NODE*head;
inta[N]={0,10,4,2,8,6};
head=creatlist(a);
printf("\nTheoriginallist:
\n");
outlist(head);
fun(head);
printf("\nThelistaftersorting:
\n");
outlist(head);
}
2、不带头结点的链表:
p=h
(1)不带头结点链表的表示形式:
(2)讲解P38第42题(和15题类似)
voidfun(NODE*h)
{NODE*p,*q;intt;
p=h;不带头结点的链表
while(p){
/**********found**********/
q=__1__;q指向p的下一位,因此填入:
q=p->next
/**********found**********/
while(__2__)判断q有没有到末尾,因此填入p或是p!
=NULL
{if(p->data>q->data)
{t=p->data;p->data=q->data;q->data=t;}
q=q->next;
}
/**********found**********/
p=__3__;while(p)为循环条件,要构成循环p就得自加或是自减,从循环体中得知没有进行p++之类的操作,因此此处填入:
p=p->next或是p++
}
}
main()
{NODE*head;
inta[N]={0,10,4,2,8,6};
head=creatlist(a);
printf("\nTheoriginallist:
\n");
outlist(head);
fun(head);
}
3、链表的返回值:
P43第50题(和43题类似)
/**********found**********/
__1__fun(NODE*h)根据函数调用head=fun(head);和NODE*head;知道函数的返回值为NODE*
{NODE*p,*q,*r;
p=h;
if(p==NULL)—>如果p数据位空,则表示p中没有任何的数据,因此就无需再进行逆置,故returnNULL;
returnNULL;
q=p->next;
p->next=NULL;
/**********found**********/
while(__2__)此空判断q有没有为空,讲解时候不容易理解,考生记住即可,填入:
while(q)或是while(q!
=NULL)
{r=q->next;
q->next=p;
p=q;
/**********found**********/
q=__3__;填入:
q=r;次空理解起来较难,因此考生必须认真记忆,老师无需多讲
}
returnp;
}
main()
{NODE*head;
inta[N]={2,4,6,8,10};
head=creatlist(a);
printf("\nTheoriginallist:
\n");
outlist(head);
head=fun(head);
printf("\nThelistafterinverting:
\n");
outlist(head);
}
四、填空题与文件相关
1.文件指针定义
(1)文件定义的形式:
FILE*fp;(课本P115)
(2)举例:
上机题库P30第28题第一空
/**********found**********/
__1__fp;
分析:
在涉及文件类型的上机题目时fp指的就是文件指针,因此在前面填写类型时候直接写入:
FILE*fp;
(3)类似题目:
P32第32题第1个空、P67第88题第2个空
2.文件打开
(1)文件打开的格式:
fopen(“文件名”,“打开方式”);(课本P115)
(2)举例:
P31第30题第1个空
voidfun(char*filename,STUn)
{FILE*fp;
/**********found**********/
fp=fopen(__1__,"rb+");
分析:
缺少了文件名,形参filename是实参传过来的文件名,因此这里直接填入:
fp=fopen(filename,"rb+");表示以“读和写”的方式打开一个二进制文件filename
(3)类似的题目:
P41第47题第1个空、P71第94题第1个空、P72第96题第3空
3.文件关闭
(1)文件关闭的格式:
fclose(文件指针);(课本P117)
(2)举例:
上机题库P30第28题第2空
fp=fopen("file1.txt","w");/*第一次以写的形式打开文件file1.txt*/
fprintf(fp,"%s%d%f\n",s,a,f);
/**********found**********/
__2__;
fp=fopen("file1.txt","r");/*第二次以读的形式打开文件file1.txt*/
分析:
打开文件以后必须将它关闭,因此该空要填:
fclose(fp);
(3)类似题目:
P72第96题第2空
4.测试文件结束
(1)判断文件结束的feof函数形式:
feof(fp)(课本P118)
(2)经常出现在while()的表达式里面,常见形式为:
while(!
feof(fp))测试指针fp有没有结束
(3)举例:
上机题目P26第22题第1空
FILE*fp;
STUn;inti;
fp=fopen(filename,"rb+");
/**********found**********/
while(!
__1__)
分析:
填写feof(fp)测试fp指针又没有结束
(4)类似题目:
P32第32题第2个空、P61第80题第1个空、P71第94题第2个空
5.设置文件位置函数
(1)fseek设置文件位置:
fseek(文件指针,位移量,移动起始点)(课本P118)
(2)考试一般考查的是移动的起始点:
SEEK_SET表示文件开始,SEEK_CUR表示文件当前位置,SEEK_END表示文件末尾
(3)举例:
上机题库P31第30题第2个空
/**********found**********/
fseek(fp,-1L*sizeof(STU),__2__);
分析:
题目要求:
重写形参filename所指文件中最后一个学生的数据,因此文件指针fp要指向最后的位置,则填入:
fseek(fp,-1L*sizeof(STU),SEEK_END);
(4)类似题目:
P26第22题第3空、P61第80第3空、
6.读二进制文件
(1)fwrite(存入数据的指针,每一个数据占有的字节,输入数据的个数,文件指针);(课本P120)
(2)举例:
P31第30题第3空
voidfun(char*filename,STUn)
{FILE*fp;
/**********found**********/
fp=fopen(filename,"rb+");/*打开文件filename*/
/**********found**********/
fseek(fp,-1L*sizeof(STU),SEEK_END);/*定位到最后一个学生的位置*/
/**********found**********/
fwrite(__3__,sizeof(STU),1,fp);/*将形参n新学生的数据覆盖最后一个学生的数据,因为fp已经定位到了最后一个学生的位置*/
fclose(fp);
}
分析:
题目要求用新数据覆盖最后一个学生的数据,因此填入:
fwrite(&n,sizeof(STU),1,fp);填入的是地址,不能是:
fwrite(n,sizeof(STU),1,fp);
(3)类似题目:
P41第47题第3空,P67第88题第3空、
7.写二进制文件函数
(1)fread(读出数据的指针,每一个数据占有的字节,输出数据的个数,文件指针);
(2)上机考试填空题没有出现需要填写的空,考生作一般的了解
8.fcanf函数数和fprintf函数
(1)fscanf(文件指针,格式控制字符串,输入列表项);
(2)fprintf(文件指针,格式控制字符串,输出列表项);
(3)fscanf函数和fprintf函数在上机编程题中详细介绍,这里不作重点讲解,了解即可
五、填空题与函数相关
1.函数调用:
P13第1题
#include
doublef1(doublex)定义了f1函数,有一个形参
{returnx*x;}
doublef2(doublex,doubley)定义了f2函数,有两个形参
{returnx*y;}
/**********found**********/
__1__fun(inti,doublex,doubley)根据函数调用r=fun(1,x1,x2);可知函数返回值和r类型一致,doublex1=5,x2=3,r;r为doule类型,则函数返回double
{if(i==1)
/**********found**********/
return__2__(x);此处为函数调用,实参数为1,根据实参和形成个数一致可知,调用的为f1函数
else
/**********found**********/
return__3__(x,y);此处的实参数为2,则调用f2函数
}
main()
{doublex1=5,x2=3,r;
r=fun(1,x1,x2);
r+=fun(2,x1,x2);
printf("\nx1=%f,x2=%f,x1*x1+x1*x2=%f\n\n",x1,x2,r);
}
六、填空题与数组相关
1.类似题目:
3、4、7、20、24、26、39、40、41、54、57、64、