二级C语言上机填空题技巧总结_第1页
二级C语言上机填空题技巧总结_第2页
二级C语言上机填空题技巧总结_第3页
二级C语言上机填空题技巧总结_第4页
二级C语言上机填空题技巧总结_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、上机填空题技巧总结一、填空题之方法1. 上机填空题占 30 分,一般有 3 个空需要填写,每个空为 10 分;2. 填空题做题之前必须弄清题目含义,抓住关键字,例如:要求对数组进行从小到大排序,则将会出现大于符号,如果是从大到小排序则出现小于符号;3. 填空题中出现频率最高的就是函数的调用、函数的首部、函数的返回值等和函数相关的问题,因此必须牢牢掌握祝函数的基本特征;4. 填空题中有的“空”比较难,考生除了掌握必须的 C 语言知识之外,还需要很好的逻辑思路,如果一个空将花很多时间来解决, 那么建议使用 “死记硬背” 的方法来缩短复习时间;5. 上机题库中 100 题有部分题目是重复的或是相似的

2、题目很多, 同学们要使用比对的方法尽量去理解;6. 多练习,多思考,多总结二、填空题与结构体相关1. 结构体成员引用: 上机题库 P18 第 9 题(和 92 题一致), P27 第 23 题( 和 51 题一样 )读清楚题目要求:(1) 要求将形参 a 所指结构体变量的数据赋值给函数中的结构体变量b(2) 从例如可以看出来:结构体中的学号和姓名变为了1002 和“ LiSi”,但是3 门课成绩没有变化#include<stdio.h>#include<string.h>structstudentlongsno;charname10;floatscore3;voidfu

3、n(structstudenta)structstudentb;inti;/*found*/b=_1_;题目要求将形参b.sno=10002;学号变为了a 的值赋值给结构体变量 10002b,因此填:a/*found*/strcpy(_2_,"LiSi");姓名要变为”LiSi” , 则要引用b 中的name成员printf("nThedataaftermodified:n");/*讲解是一句带过不用多讲*/printf("nNo:%ldName:%snScores:",b.sno,);/*讲解是一句带过不用多讲*/*fo

4、und*/for(i=0;i<3;i+)printf("%6.2f",b._3_);分析:这个是一个循环语句,执行3次循环, printf("%6.2f",b._3_) 要求输出是一个实型数据的成员,因此可以得知是 score 成员,因为 score 是一个数组,因此填: b.scorei ,当 i 变化就可以取出第一门、第二门、第三门课的成绩printf("n");main() structstudents=10001,"ZhangSan",95,80,88; inti;printf("nnThe

5、originaldata:n");printf("nNo:%ldName:%snScores:",s.sno,);for(i=0;i<3;i+)printf("%6.2f",s.scorei);printf("n");fun(s);23 题:(1) 从例如中可以看出:变化的是结构体中的学号和姓名#include<stdio.h>#include<string.h>structstudentlongsno;charname10;floatscore3;voidfun(structstu

6、dent*b)inti;/*found*/b_1_=10004;题目中 t 的学号变化为了10004,因此填写: b->sno ,不能填写b.sno ,因为 b 是一个指针/*found*/strcpy(b_2_,"LiJie");t 的姓名变为了” LiJie ”, 因此填写: b->namemain() structstudentt=10002,"ZhangQi",93,85,87; inti;printf("nnTheoriginaldata:n");printf("nNo:%ldName:%snScore

7、s:",t.sno,);for(i=0;i<3;i+)printf("%6.2f",t.scorei);printf("n");/*found*/fun(_3_); 此处为函数调用,根据形参的类型来判定实参, 形参 structstudent*b 为结构体指针,联系 main 函数定义部分只有 structstudentt 和 b 的类型相同,因此可知需要填的是: &tprintf("nThedataaftermodified:n");printf("nNo:%ldName:%snScor

8、es:",t.sno,);for(i=0;i<3;i+)printf("%6.2f",t.scorei);printf("n");2. 函数调用 and 结构体:上机题库 P22 第 16 题(和 78、82 题一样)重点注意:(1) 把 a 中地址作为函数返回值返回函数(2) 观察可知 a 中的学号、姓名边为了 10002 和“ zhangSan”,每门课的成绩增加了 1 分#include<stdio.h>#include<string.h>structstudentlongsno;charname

9、10;floatscore3;/*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->scorei,不能为 a.scorei

10、或是 a.score/*found*/return_3_;题目要求返回 a 的地址, a 本身就是一个指针,因此填入a 即可main() structstudents=10001,"ZhangSan",95,80,88,*t; inti;printf("nnTheoriginaldata:n");printf("nNo:%ldName:%snScores:",s.sno,);for(i=0;i<3;i+)printf("%6.2f",s.scorei);printf("n");

11、t=fun(&s);printf("nThedataaftermodified:n");printf("nNo:%ldName:%snScores:",t->sno,t->name);for(i=0;i<3;i+)printf("%6.2f",t->scorei);printf("n");3. 结构体和排序:上机题库P14第 2 题重点注意:(1)排序的格式: 红色部分为考试中的重点,必须记住从小到大排序:从大到小排序:for(i=0;i<n-1 ;i+)for(i=0;i&l

12、t;n-1 ;i+)for( j=i+1;j<n;j+) if(ai>ajfor( j=i+1;j<n;j+) if(ai<aj)t=ai;ai=aj;aj=t;t=ai;ai=aj;aj=t;voidfun(structstudenta,intn)/*found*/_1_t;此处要求填入 t 的类型,可以从t=ai;中得知 t 和 a 数组的类型必须一致, voidfun(structstudenta,intn)中得知 a 为结构体类型,因此填写:structstudentinti,j;/*found*/for(i=0;i<_2_;i+) 根据排序的格式填空,因

13、此记住是关键 for(j=i+1;j<n;j+)/*found*/if(strcmp(_3_)>0)按照姓名字典顺序从小到大排序,因此:strcmp(,),此处需要特别注意t=ai;ai=aj;aj=t;main() structstudents4=10001,"ZhangSan",95,80,88, 10002,"LiSi",85,70,78,10003,"CaoKai",75,60,88,10004,"FangFang",90,82,87;inti,j;printf(&q

14、uot;nnTheoriginaldata:nn");for(j=0;j<4;j+)printf("nNo:%ldName:%-8sScores:",sj.sno,);for(i=0;i<3;i+)printf("%6.2f",sj.scorei);printf("n");fun(s,4);printf("nnThedataaftersorting:nn");for(j=0;j<4;j+)printf("nNo:%ldName:%-8sScores:",

15、sj.sno,);for(i=0;i<3;i+)printf("%6.2f",sj.scorei);printf("n");三、填空题与链表相关1. 带头结点的链表: p=h->next, 上机题库 P21 第 15 题考点分析:(1)带头结点链表的表现形式:headabcABCNULL带头结点的链表, 头结点 head 不存放任何的数据, 从头结点的下一个结点开始存放数据,因此考试中如果出现p=_1_;则填入p=h->next(2)链表数据排序对数组元素从小到大排序:for(i=0;i<n-1 ;i+)for( j

16、=i+1;j<n;j+) if(ai>aj)t=ai;ai=aj;aj=t;对链表元素进行从小到大排序:while(p)/* 相当于数组排序中的 for(i=0; i<n-1 ;)*/ q=p->next;/*相当于 j=i+1*/while(q)/*相当于 for( ;j<n;)if(p->data>q->data)/*相当于 if(ai>aj)*/t=p->data;p->data=q->data;q->data=t;/* 如果 ai>aj 成立,则交换数据元素, 让数据变成从小到大排序 */ q=q-&g

17、t;next;/* 相当于 q+*/p=p->next;/*相当于 p+*/15 题:#include<stdio.h>#include<stdlib.h>#defineN6typedefstructnodeintdata;structnode*next;NODE;voidfun(NODE*h)NODE*p,*q;intt;/*found*/p=_1_;链表为带头结点,因此填写:p=h->nextwhile(p)/*found*/q=_2_; 比较两个链表中元素的大小,因此 q=p->next ,这样 q 指向了 p 的下一位while(q)/*fou

18、nd*/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; intaN=0,10,4,2,8,6; head=creatlist(a);printf("nTheoriginallist:n");outlist(head);fun(head);printf("nThelistaftersorting:n");out

19、list(head);2. 不带头结点的链表 :p=h( 1) 不带头结点链表的表示形式:abcABCNULL不带头结点的链表没有头结点,链表的第一个结点存储的就是数据,因此考试中如果出现 p=_1_; 则填入 p=h( 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!=NULLif(p->data>q-&

20、gt;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; intaN=0,10,4,2,8,6; head=creatlist(a); printf("nTheoriginallist:n");outlist(head);fun(head);3. 链表的返回值: P43 第

21、 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;

22、q->next=p;p=q;/*found*/q=_3_; 填入: q=r; 次空理解起来较难,因此考生必须认真记忆,老师无需多讲returnp;main() NODE*head; intaN=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

23、;(课本 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+");分析:缺

24、少了文件名,形参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

25、*/fprintf(fp,"%s%d%fn",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

26、 题第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表示文件末尾(

27、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*

28、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,

29、fp);填入的是地址,不能是:fwrite(n,sizeof(STU),1,fp);(3) 类似题目: P41 第 47 题第 3 空, P67 第 88 题第 3 空、7. 写二进制文件函数(1) fread( 读出数据的指针,每一个数据占有的字节,输出数据的个数,文件指针) ;(2) 上机考试填空题没有出现需要填写的空,考生作一般的了解8. fcanf 函数数和 fprintf 函数( 1)( 2)fscanf (文件指针,格式控制字符串,输入列表项);fprintf(文件指针,格式控制字符串,输出列表项);( 3) fscanf 函数和 fprintf 函数在上机编程题中详细介绍,这里不

30、作重点讲解,了解即可五、填空题与函数相关1. 函数调用: P13 第 1 题#include<stdio.h>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 类型,则函数返回doubleif(i=1)/*found*/return_2_(x);

31、此处为函数调用,实参数为 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=%fnn",x1,x2,r);六、填空题与数组相关1. 类似题目: 3、4、7、20、 24、26、39、 40、41、54、57、64、 68、70、71、 76、89、 90、992. 一维数组中存在这样一些类型:(1) 求一个数

32、值数组中的所有值的平均值和把大于或者小于平均值的数辅导例外一个数组中。在计算机平均值时,首先定义一个变量来存放平均分,平均分一般用 av 变量来代替,如果 av 已经定义但是没有赋初值,那么这个空填写的内容的为: av=0;(2) 求算平均值值时有两种方法,第一种是算出总的分数, 最后再除以总的个数即可, 如算1 到 6 之间的数的平均值,首先算出 1 到 6 的和,其次用综合除以总的个数 6,即可以得到平均值;第二种方法是用每一个数除以 6 再把所有的和加起来。即 1/6+2/6+3/6+4/6+5/6+6/6; 所以在执行的一维数组中算平均值时也是存在来中情况, 如果在 for 语句的后面

33、有 av=av/N; 则第二个空一般的填写时 av+=si; 如果说没有 av=av/N; 则填写的是: av+=si/N;(3) 在后面的一个空的填写的时候要注意变量的使用情况,如果变量使用了j 和 i, 那么这一个空的填写的内容为:j+;(4) 如果一维数组中求的是把大于或者是小于平均值的数移动到数组的首部的时候,这种题目的解答时这样的,第一个空一般填写的内容为:j+; 第二个空填写的内容是-1 ;(5) 对数组进行排序时: 如果是从大到小的排序的时候,用的是小于符号, 如果是从小到大排序时使用的是大于符号。3. 二维数组中的题目类型以及解决的技巧:(1) 二维数组的题目, 填空的时候一般

34、是填在函数调用, 函数在调用时候写的应该是而为数组的名字;在定义函数的时候使用的是函数的类型和由 m各元素组成一行的指针变量,假设二维数组的名字是 ss, 那么填写的内容是: (*ss)M; 如果调用的是普通变量则填写的内容为: intn;(2) 二维数组遍历时, 使用的是两个循环, 使用的是循环的嵌套使用,第二个循环的使用的时候填写的内容为: j=0;( 特殊的特殊处理 )(3) 交换两个变量的值的使用的格式为:t=a;a=b;b=t;记住交换变量的格式和顺序。(4) 如果二维数组是字符串的题目的时候, 要记住字符串中函数的使用的格式; 即:strlen 、 strcmp 、strcpy 、

35、sizeof 、strcat 的使用格式。注意里面的格式中使用的都是和指针。(5) 特殊的特殊处理。第7 题的填空的内容记住。七、填空题与数学公式相关1.解题方法:(1) 如果在函数中定义变量,但是没有定义成静态存储变量,即变量前面没有static,应给变量赋初值,如果以后用到的是加减运算,则赋初值为0 或者是 0.0 ;如果以后用到的是乘除运算,则赋初值为1 或者是 1.0 ;(2) 循环条件的填空, 分析表达式的规律, 看表达式中的最后一项的值是否到了第m项或者是第 n 项,如果到了第m或者第 n 项,则在循环中的第二个表达式中用到的是i<=m 或者是 i<=n;(3) 循环条

36、件中如果用的是while 语句,则循环变量的初值应该在while 的外面定义和赋初值,在循环语句中必须给变量自加或者是自减。如果没有则一般填的是i+;(4) 看表达式中的每一项的运算规则,按照运算的规则把每一项中的n 值替换为 i, 特殊情况例外。如果是表达式中用到的是间隔相加减的运算时,注意给中间变量赋初值为1或者是 1.0 ;在后面的运算中给变量乘以一个-1 ,以改变中间变量的符号。2.解题分析:(1) 看清题目中要求的题意,题目要求做什么就只需考虑什么。(2) 找出题目中的表达式:当 n=1 时,表达式变为,当 n=2 时,表达式为,n 不断的变化,得到的表达式值也不相同,题目中要求将n

37、=1,n=2n=n 的值进行一个累加,最后得到一个结果赋值给变量s。(3) 通过以上的分析我们可以得到如下的信息:1) 需要一个变量来存储结果值。对应到程序中,我们使用s 来表示,因为计算的结果可能为小数,因此将s 定义为实型。2) 需要一个变量从 1 开始递增到 n,对应到程序中用 i 表示。3) 需要用到循环的知识。4) 函数最后会将 s 的值进行返回。doublefun(intn)inti;doubles,t;/*found*/s=_1_; 需要给 s 赋初始值,一般赋值为 0 或是 1,这里面有规律,在填空题中一定填入的是 0。/*found*/for(i=1;i<=_2_;i+

38、) 需要填入的是 i 变量的初始值和结束值,结束值一般是通过实参传递给形参的,因此很多时候填入形参名即可。t=2.0*i;将 2*i 的值赋值给变量t ,因此遇到直接用 t*t代替就行。/*found*/s=s+(2.0*i-1)*(2.0*i+1)/_3_;需要在 (2.0*i-1)*(2.0*i+1)/_3_;中填入适当的值来补充完整表达式,比较得知,(2.0*i-1)*(2.0*i+1)/_3_;缺少的是部分,上面分析过可以用 t*t来代替,因此,第三个填入t*t就行!returns;3. 类似题目: 6、13、 25、29、36、 46、52、60、 66、69、 73、83、95八、

39、填空题与字符串相关1. 删除字符串(1) 主要考查二维字符数组与字符串的操作(2) 举例 1:P18第 8 题( 和 65 题一样 )#defineN5#defineM10intfun(char(*ss)M,intk)/*char(*ss)M行指针,下标与二维数组 x 的列下标相同,k 通过实参传递过来后为7*/inti,j=0,len;/*found*/for(i=0;i<_1_;i+)/*根据 len=strlen(ssi);可知 i 代表的是行,因此填 入for(i=0;i<N;i+)*/len=strlen(ssi);/*found*/if(len<=_2_);/*

40、题目要求将串长超过k 的字符串删除,换个说法就是将串小于等于k 的字符串留下,因此该空填写if(len<=k)*/*found*/strcpy(ssj+,_3_); /* 将 ssi 行的值赋值到 sj 中,该空出现频率很高,因此要牢记。 strcpy(ssj+,ssi)*/returnj;main() charxNM="Beijing","Shanghai","Tianjing","Nanjing","Wuhan" /* 定义了一个 5 行 10 列的二维字符数组 x*/inti,f;p

41、rintf("nTheoriginalstringnn");for(i=0;i<N;i+)puts(xi);printf("n");f=fun(x,7);/* 将二维数组 x 传给 fun 函数的第一个形参,将 7 传递给 fun 函数的第二个形参 */printf("Thestringwitchlengthislessthanorequalto7:n"); for(i=0;i<f;i+)puts(xi);printf("n"); (3) 举例 2: P19第 10 题(和 93 题一样)#define

42、N5#defineM10/*found*/voidfun(char(*ss)_1_,intk)/*根据函数调用可知, char(*ss)_1_和实参二维数组 x 对应,因此必须与列下标对应,故填写char(*ss)M*/inti=0;/*found*/while(i<_2_)/*ssik可知, i 处于行的位置,因此i 要小于最大行长度,因此填入: while(i<N)*/*found*/ssik=_3_;i+;/* 将所有串长超过 K 的字符串右边的字符删除, 请看分析可知,如果在 k 位置加一个 0 则所有字符串的长度为 k,因此填写:ssik=0 ;*/ABC0000AB 0000012340001204000abcdef0ab0def0main() charxNM="Create","Modify","Sort","skip","Delete" inti;printf("nTheoriginalstringnn");for(i=0;i<N;i+)puts(xi);printf(&q

温馨提示

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

评论

0/150

提交评论