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

下载本文档

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

文档简介

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>struct student long sno; char name10; float score3;void fun(struct student a) st

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

4、/*讲解是一句带过不用多讲*/*found*/ 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() struct student s=10001,"ZhangSan", 95, 80

5、, 88; int i; printf("nnThe original data :n"); printf("nNo: %ld Name: %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>struct stud

6、ent long sno; char name10; float score3;void fun( struct student *b) int i;/*found*/ b_1_ = 10004;à题目中t的学号变化为了10004,因此填写:b->sno,不能填写b.sno,因为b是一个指针/*found*/ strcpy(b_2_, "LiJie");àt的姓名变为了”LiJie”,因此填写:b->namemain() struct student t=10002,"ZhangQi", 93, 85, 87; int i

7、; printf("nnThe original data :n"); printf("nNo: %ld Name: %snScores: ",t.sno, ); for (i=0; i<3; i+) printf("%6.2f ", t.scorei); printf("n");/*found*/ fun(_3_);à此处为函数调用,根据形参的类型来判定实参,形参struct student *b为结构体指针,联系main函数定义部分只有struct student t和b的类型相同,

8、因此可知需要填的是:&t printf("nThe data after modified :n"); printf("nNo: %ld Name: %snScores: ",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和“zhang

9、San”,每门课的成绩增加了1分#include <stdio.h>#include <string.h>struct student long sno; char name10; float score3;/*found*/_1_ fun(struct student *a)à根据函数调用t = fun(&s);可知函数返回类型和t的类型相同,struct student s=10001,"ZhangSan", 95, 80, 88, *t;可知t的类型为struct student * int i; a->sno = 10

10、002; strcpy(a->name, "LiSi");/*found*/ for (i=0; i<3; i+) _2_ += 1;à题目要求将每门课成绩增加1分,因此填为:a->scorei,不能为a.scorei或是a.score/*found*/ return _3_ ;à题目要求返回a的地址,a本身就是一个指针,因此填入a即可main() struct student s=10001,"ZhangSan", 95, 80, 88, *t; int i; printf("nnThe original

11、 data :n"); printf("nNo: %ld Name: %snScores: ",s.sno, ); for (i=0; i<3; i+) printf("%6.2f ", s.scorei); printf("n"); t = fun(&s); printf("nThe data after modified :n"); printf("nNo: %ld Name: %snScores: ",t->sno, t->name); fo

12、r (i=0; i<3; i+) printf("%6.2f ", t->scorei); printf("n");3. 结构体和排序:上机题库P14第2题 重点注意:(1)排序的格式:红色部分为考试中的重点,必须记住从小到大排序:for(i=0;i<n-1;i+)for(j=i+1;j<n;j+) if(ai>aj) t=ai;ai=aj;aj =t;从大到小排序:for(i=0;i<n-1;i+)for(j=i+1;j<n;j+) if(ai<aj) t=ai;ai=aj;aj =t; void fun

13、(struct student a, int n)/*found*/ _1_ t;à此处要求填入t的类型,可以从t = ai;中得知t和a数组的类型必须一致,void fun(struct student a, int n)中得知a为结构体类型,因此填写:struct student int i, j;/*found*/ for (i=0; i<_2_; i+)à根据排序的格式填空,因此记住是关键 for (j=i+1; j<n; j+)/*found*/ if (strcmp(_3_) > 0)à按照姓名字典顺序从小到大排序,因此:strcmp

14、(,),此处需要特别注意 t = ai; ai = aj; aj = t; main() struct student s4=10001,"ZhangSan", 95, 80, 88,10002,"LiSi", 85, 70, 78, 10003,"CaoKai", 75, 60, 88, 10004,"FangFang", 90, 82, 87; int i, j; printf("nnThe original data :nn"); for (j=0; j<

15、4; j+) printf("nNo: %ld Name: %-8s Scores: ",sj.sno, ); for (i=0; i<3; i+) printf("%6.2f ", sj.scorei); printf("n"); fun(s, 4); printf("nnThe data after sorting :nn"); for (j=0; j<4; j+) printf("nNo: %ld Name: %-8s Scores: ",sj.sno, sj.n

16、ame); 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=i+1;j<

17、;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 =

18、q->next;/*相当于q+*/ p = p->next;/*相当于p+*/ 15题:#include <stdio.h>#include <stdlib.h>#define N 6typedef struct node int data; struct node *next; NODE;void fun(NODE *h) NODE *p, *q; int t;/*found*/ p = _1_ ;à链表为带头结点,因此填写:p=h->next while (p) /*found*/ q = _2_ ;à比较两个链表中元素的大小,

19、因此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; int aN= 0, 10, 4, 2, 8, 6 ; head=creatlist(a); printf("nThe original list:n")

20、; outlist(head); fun(head); printf("nThe list after sorting :n"); outlist(head);2. 不带头结点的链表:p=h(1) 不带头结点链表的表示形式:abcABCNULL不带头结点的链表没有头结点,链表的第一个结点存储的就是数据,因此考试中如果出现 p = _1_ ;则填入p=h(2) 讲解P38第42题(和15题类似)void fun(NODE *h) NODE *p, *q; int t; p = h;à不带头结点的链表 while (p) /*found*/ q = _1_ ;

21、4;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 *hea

22、d; int aN= 0, 10, 4, 2, 8, 6 ; head=creatlist(a); printf("nThe original list: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中没有任何的数据,因此就无需再进行逆置,故re

23、turn NULL; return NULL; 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;次空理解起来较难,因此考生必须认真记忆,老师无需多讲 return p;main() NODE *head; int aN=2,4,6,8,10; head=creatlist(

24、a); printf("nThe original list:n"); outlist(head); head=fun(head); printf("nThe list after inverting :n"); outlist(head);四、 填空题与文件相关1. 文件指针定义(1) 文件定义的形式:FILE *fp;(课本P115)(2) 举例:上机题库P30第28题第一空/*found*/ _1_ fp;分析:在涉及文件类型的上机题目时fp指的就是文件指针,因此在前面填写类型时候直接写入:FILE *fp;(3) 类似题目:P32第32题第1个空

25、、P67第88题第2个空2. 文件打开(1) 文件打开的格式:fopen(“文件名”,“打开方式”);(课本P115)(2) 举例:P31第30题第1个空void fun(char *filename, STU n) FILE *fp;/*found*/fp = fopen(_1_, "rb+");分析:缺少了文件名,形参filename是实参传过来的文件名,因此这里直接填入:fp = fopen(filename, "rb+");表示以“读和写”的方式打开一个二进制文件filename(3) 类似的题目:P41第47题第1个空、P71第94题第1个空、

26、P72第96题第3空3. 文件关闭(1) 文件关闭的格式:fclose(文件指针);(课本P117)(2) 举例:上机题库P30第28题第2空fp = fopen("file1.txt", "w");/*第一次以写的形式打开文件file1.txt*/ fprintf(fp, "%s %d %fn", s, a, f);/*found*/ _2_ ;fp = fopen("file1.txt", "r");/*第二次以读的形式打开文件file1.txt*/分析:打开文件以后必须将它关闭,因此该空要

27、填:fclose(fp);(3) 类似题目:P72第96题第2空4. 测试文件结束(1) 判断文件结束的feof函数形式:feof(fp)(课本P118)(2) 经常出现在while()的表达式里面,常见形式为:while(!feof(fp)测试指针fp有没有结束(3) 举例:上机题目P26第22题第1空FILE *fp; STU n; int i; fp = fopen(filename,"rb+");/*found*/ while (!_1_)分析:填写feof(fp)测试fp指针又没有结束(4) 类似题目:P32第32题第2个空、P61第80题第1个空、P71第94题

28、第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空

29、、P61第80第3空、6. 读二进制文件(1) fwrite(存入数据的指针,每一个数据占有的字节,输入数据的个数,文件指针);(课本P120)(2) 举例:P31第30题第3空void fun(char *filename, STU n) FILE *fp;/*found*/ fp = fopen(filename, "rb+");/*打开文件filename*/*found*/ fseek(fp, -1L*sizeof(STU), SEEK_END);/*定位到最后一个学生的位置*/*found*/ fwrite(_3_, sizeof(STU), 1, fp);/*将

30、形参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) fs

31、canf(文件指针,格式控制字符串,输入列表项);(2) fprintf(文件指针,格式控制字符串,输出列表项);(3) fscanf函数和fprintf函数在上机编程题中详细介绍,这里不作重点讲解,了解即可五、 填空题与函数相关1. 函数调用:P13第1题#include <stdio.h>double f1(double x)定义了f1函数,有一个形参 return x*x; double f2(double x, double y) 定义了f2函数,有两个形参 return x*y; /*found*/_1_ fun(int i, double x, double y)

32、24;根据函数调用r = fun(1, x1, x2);可知函数返回值和r类型一致,double x1=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() double x1=5, x2=3, r; r = fun(1, x1, x2); r += fun(2, x1, x2);printf("nx1=

33、%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) 求一个数值数组中的所有值的平均值和把大于或者小于平均值的数辅导例外一个数组中。在计算机平均值时,首先定义一个变量来存放平均分,平均分一般用av变量来代替,如果av已经定义但是没有赋初值,那么这个空填写的内容的为:av=0;(2) 求算平均值值时有两种方法,第一种是算出总的分数,最后再除以总的个数即可,如算1到6之间的数的平

34、均值,首先算出1到6的和,其次用综合除以总的个数6,即可以得到平均值;第二种方法是用每一个数除以6再把所有的和加起来。即1/6+2/6+3/6+4/6+5/6+6/6;所以在执行的一维数组中算平均值时也是存在来中情况,如果在for语句的后面有av=av/N;则第二个空一般的填写时av+=si;如果说没有av=av/N;则填写的是:av+=si/N;(3) 在后面的一个空的填写的时候要注意变量的使用情况,如果变量使用了j和i,那么这一个空的填写的内容为:j+;(4) 如果一维数组中求的是把大于或者是小于平均值的数移动到数组的首部的时候,这种题目的解答时这样的,第一个空一般填写的内容为:j+;第二

35、个空填写的内容是-1;(5) 对数组进行排序时:如果是从大到小的排序的时候,用的是小于符号,如果是从小到大排序时使用的是大于符号。3. 二维数组中的题目类型以及解决的技巧:(1) 二维数组的题目,填空的时候一般是填在函数调用,函数在调用时候写的应该是而为数组的名字;在定义函数的时候使用的是函数的类型和由m各元素组成一行的指针变量,假设二维数组的名字是ss,那么填写的内容是:(*ss)M;如果调用的是普通变量则填写的内容为:int n;(2) 二维数组遍历时,使用的是两个循环,使用的是循环的嵌套使用,第二个循环的使用的时候填写的内容为:j=0;(特殊的特殊处理)(3) 交换两个变量的值的使用的格

36、式为: t=a;a=b;b=t; 记住交换变量的格式和顺序。(4) 如果二维数组是字符串的题目的时候,要记住字符串中函数的使用的格式;即:strlen、strcmp、strcpy、sizeof、strcat的使用格式。注意里面的格式中使用的都是和指针。(5) 特殊的特殊处理。第7题的填空的内容记住。七、 填空题与数学公式相关1. 解题方法:(1) 如果在函数中定义变量,但是没有定义成静态存储变量,即变量前面没有static,应给变量赋初值,如果以后用到的是加减运算,则赋初值为0或者是0.0;如果以后用到的是乘除运算,则赋初值为1或者是1.0;(2) 循环条件的填空,分析表达式的规律,看表达式中

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

38、(2) 找出题目中的表达式:当n=1时,表达式变为,当n=2时,表达式为,n不断的变化,得到的表达式值也不相同,题目中要求将n=1,n=2n=n的值进行一个累加,最后得到一个结果赋值给变量s。(3) 通过以上的分析我们可以得到如下的信息:1) 需要一个变量来存储结果值。对应到程序中,我们使用s来表示,因为计算的结果可能为小数,因此将s定义为实型。2) 需要一个变量从1开始递增到n,对应到程序中用i表示。3) 需要用到循环的知识。4) 函数最后会将s的值进行返回。double fun(int n) int i; double s, t;/*found*/ s=_1_;需要给s赋初始值,一般赋值为

39、0或是1,这里面有规律,在填空题中一定填入的是0。/*found*/ for(i=1; i<=_2_; i+)需要填入的是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就行! return s

40、;3. 类似题目:6、13、25、29、36、46、52、60、66、69、73、83、95八、 填空题与字符串相关1. 删除字符串(1) 主要考查二维字符数组与字符串的操作(2) 举例1:P18第8题(和65题一样)#define N 5#define M 10int fun(char (*ss)M, int k)/*char (*ss)M行指针,下标与二维数组x的列下标相同,k通过实参传递过来后为7*/ int i,j=0,len;/*found*/ for(i=0; i< _1_ ; i+)/*根据len=strlen(ssi);可知i代表的是行,因此填入for(i=0; i<

41、; N ; i+)*/ len=strlen(ssi);/*found*/ if(len<= _2_);/*题目要求将串长超过k的字符串删除,换个说法就是将串小于等于k的字符串留下,因此该空填写if(len<= k)*/*found*/ strcpy(ssj+,_3_);/*将ssi行的值赋值到sj中,该空出现频率很高,因此要牢记。strcpy(ssj+,ssi)*/ return j;main() char xNM="Beijing","Shanghai","Tianjing","Nanjing",&

42、quot;Wuhan" /*定义了一个5行10列的二维字符数组x*/ int i,f; printf("nThe original stringnn"); for(i=0;i<N;i+)puts(xi); printf("n"); f=fun(x,7);/*将二维数组x传给fun函数的第一个形参,将7传递给fun函数的第二个形参*/ printf("The string witch length is less than or equal to 7 :n"); for(i=0; i<f; i+) puts(xi)

43、;printf("n");(3) 举例2:P19第10题(和93题一样)#define N 5#define M 10/*found*/void fun(char (*ss) _1_, int k)/*根据函数调用可知,char (*ss) _1_和实参二维数组x对应,因此必须与列下标对应,故填写char (*ss)M*/ int i=0 ;/*found*/ while(i< _2_) /* ssik可知,i处于行的位置,因此i要小于最大行长度,因此填入:while(i<N)*/*found*/ssik=_3_; i+; /*将所有串长超过K的字符串右边的字符删除,请看分析可知,如果在k位置加一个0则所有字符串的长度为k,因此填写:ssik=0;*/ABC00001234000abcdef0AB000001204000ab0def0main() char xNM="Create","Modify","Sort","skip","Delete" int i; printf("nThe original stringnn"); for(i=0;i<N;i+)puts(xi); printf(&quo

温馨提示

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

评论

0/150

提交评论