资源描述
上机填空题技巧总结
一、 填空题之措施
1. 上机填空题占30分,一般有3个空需要填写,每个空为10分;
2. 填空题做题之前必要弄清题目含义,抓住核心字,例如:规定对数组进行从小到大排序,则将会浮现不不不小于符号,如果是从大到小排序则浮现不不小于符号;
3. 填空题中浮现频率最高就是函数调用、函数首部、函数返回值等和函数有关问题,因而必要牢牢掌握祝函数基本特性;
4. 填空题中有“空”比较难,考生除了掌握必要C语言知识之外,还需要较好逻辑思路,如果一种空将花诸多时间来解决,那么建议使用“死记硬背”措施来缩短复习时间;
5. 上机题库中100题有某些题目是反复或是相似题目诸多,同窗们要使用比对措施尽量去理解;
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 name[10];
float score[3];
};
void fun(struct student a)
{ struct 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:%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()
{ struct student s={10001,"ZhangSan",95,80,88};
int i;
printf("\n\nThe original data :\n");
printf("\nNo:%ld Name:%s\nScores: ",s.sno,s.name);
for (i=0;i<3;i++) printf("%6.2f ", s.score[i]);
printf("\n");
fun(s);
}
23题:
(1) 从例如中可以看出:变化是构造体中学号和姓名
#include <stdio.h>
#include <string.h>
struct student {
long sno;
char name[10];
float score[3];
};
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->name
}
main()
{ struct student t={10002,"ZhangQi",93,85,87};
int i;
printf("\n\nThe original data :\n");
printf("\nNo:%ld Name:%s\nScores: ",t.sno,t.name);
for (i=0;i<3;i++) printf("%6.2f ",t.score[i]);
printf("\n");
/**********found**********/
fun(__3__);à此处为函数调用,根据形参类型来鉴定实参,形参struct student *b为构造体指针,联系main函数定义某些只有struct student t和b类型相似,因而可知需要填是:&t
printf("\nThe data after modified :\n");
printf("\nNo:%ld Name:%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 <stdio.h>
#include <string.h>
struct student {
long sno;
char name[10];
float score[3];
};
/**********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 = 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()
{ struct student s={10001,"ZhangSan",95,80,88}, *t;
int i;
printf("\n\nThe original data :\n");
printf("\nNo:%ld Name:%s\nScores: ",s.sno,s.name);
for (i=0;i<3;i++) printf("%6.2f ",s.score[i]);
printf("\n");
t = fun(&s);
printf("\nThe data after modified :\n");
printf("\nNo:%ld Name:%s\nScores: ",t->sno,t->name);
for (i=0;i<3;i++) printf("%6.2f ",t->score[i]);
printf("\n");
}
3. 构造体和排序:上机题库P14第2题
重点注意:
(1)排序格式:红色某些为考试中重点,必要记住
从小到大排序:
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++) if(a[i]>a[j]) {t=a[i];a[i]=a[j];a[j ]=t;}
从大到小排序:
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++) if(a[i]<a[j]) {t=a[i];a[i]=a[j];a[j ]=t;}
void fun(struct student a[],int n)
{
/**********found**********/
__1__ t;à此处规定填入t类型,可以从t = a[i];中得知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(a[i].name,a[j].name),此处需要特别注意
{ t = a[i]; a[i] = a[j]; a[j] = t; }
}
main()
{ struct student s[4]={{10001,"ZhangSan",95,80,88},
{10002,"LiSi",85,70,78},
{10003,"CaoKai",75,60,88},
{10004,"FangFang",90,82,87}};
int i,j;
printf("\n\nThe original data :\n\n");
for (j=0;j<4;j++)
{ printf("\nNo:%ld Name:%-8s Scores: ",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\nThe data after sorting :\n\n");
for (j=0;j<4;j++)
{ printf("\nNo:%ld Name:%-8s Scores: ",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
a
b
c
A
B
C
NULL
带头结点链表,头结点head不存储任何数据,从头结点下一种结点开始存储数据,因而考试中如果浮现 p = __1__ ;则填入p=h->next
(2)链表数据排序
对数组元素从小到大排序:
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++) if(a[i]>a[j]) {t=a[i];a[i]=a[j];a[j ]=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(a[i]>a[j])*/
{ t = p->data; p->data = q->data; q->data = t; }
/*如果a[i]>a[j]成立,则互换数据元素,让数据变成从小到大排序*/
q = q->next;/*相称于q++*/
}
p = p->next;/*相称于p++*/
}
15题:
#include <stdio.h>
#include <stdlib.h>
#define N 6
typedef 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__ ;à比较两个链表中元素大小,因而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 a[N]= {0,10,4,2,8,6 };
head=creatlist(a);
printf("\nThe original list:\n");
outlist(head);
fun(head);
printf("\nThe list after sorting :\n");
outlist(head);
}
2. 不带头结点链表:p=h
(1) 不带头结点链表体现形式:
a
b
c
A
B
C
NULL
不带头结点链表没有头结点,链表第一种结点存储就是数据,因而考试中如果浮现 p = __1__ ;则填入p=h
(2) 解说P38第42题(和15题类似)
void fun(NODE *h)
{ NODE *p,*q; int t;
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;
int a[N]= {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中没有任何数据,因而就无需再进行逆置,故return 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 a[N]={2,4,6,8,10};
head=creatlist(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个空、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个空、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;
STU n; int i;
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空
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);/*将形参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 <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)à根据函数调用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=%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、68、70、71、76、89、90、99
2. 一维数组中存在这样某些类型:
(1) 求一种数值数组中所有值平均值和把不不不小于或者不不小于平均值数辅导例外一种数组中。在计算机平均值时,一方面定义一种变量来存储平均分,平均分一般用av变量来替代,如果av已经定义但是没有赋初值,那么这个空填写内容为:av=0;
(2) 求算平均值值时有两种措施,第一种是算出总分数,最后再除以总个数即可,如算1到6之间数平均值,一方面算出1到6和,另一方面用综合除以总个数6,即可以得到平均值;第二种措施是用每一种数除以6再把所有和加起来。即1/6+2/6+3/6+4/6+5/6+6/6;因此在执行一维数组中算平均值时也是存在来中状况,如果在for语句背面有av=av/N;则第二个空一般填写时av+=s[i];如果说没有av=av/N;则填写是:av+=s[i]/N;
(3) 在背面一种空填写时候要注意变量使用状况,如果变量使用了j和i,那么这一种空填写内容为:j++;
(4) 如果一维数组中求是把不不不小于或者是不不小于平均值数移动到数组首部时候,这种题目解答时这样,第一种空一般填写内容为:j++;第二个空填写内容是-1;
(5) 对数组进行排序时:如果是从大到小排序时候,用是不不小于符号,如果是从小到大排序时使用是不不不小于符号。
3. 二维数组中题目类型以及解决技巧:
(1) 二维数组题目,填空时候一般是填在函数调用,函数在调用时候写应当是而为数组名字;在定义函数时候使用是函数类型和由m各元素构成一行指针变量,假设二维数组名字是ss,那么填写内容是:(*ss)[M];如果调用是一般变量则填写内容为:int n;
(2) 二维数组遍历时,使用是两个循环,使用是循环嵌套使用,第二个循环使用时候填写内容为:j=0;(特殊特殊解决)
(3) 互换两个变量值使用格式为:
t=a;a=b;b=t; 记住互换变量格式和顺序。
(4) 如果二维数组是字符串题目时候,要记住字符串中函数使用格式;即:strlen、strcmp、strcpy、sizeof、strcat使用格式。注意里面格式中使用都是和指针。
(5) 特殊特殊解决。第7题填空内容记住。
七、 填空题与数学公式有关
1. 解题措施:
(1) 如果在函数中定义变量,但是没有定义成静态存储变量,即变量前面没有static,应给变量赋初值,如果后来用到是加减运算,则赋初值为0或者是0.0;如果后来用到是乘除运算,则赋初值为1或者是1.0;
(2) 循环条件填空,分析体现式规律,看体现式中最后一项值与否到了第m项或者是第n项,如果到了第m或者第n项,则在循环中第二个体现式中用到是i<=m或者是i<=n;
(3) 循环条件中如果用是while语句,则循环变量初值应当在while外面定义和赋初值,在循环语句中必要给变量自加或者是自减。如果没有则一般填是i++;
(4) 看体现式中每一项运算规则,按照运算规则把每一项中n值替代为i,特殊状况例外。如果是体现式中用到是间隔相加减运算时,注意给中间变量赋初值为1或者是1.0;在背面运算中给变量乘以一种-1,以变化中间变量符号。
2. 解题分析:
(1) 看清题目中规定题意,题目规定做什么就只需考虑什么。
(2) 找出题目中体现式:
当n=1时,体现式变为,当n=2时,体现式为,n不断变化,得到体现式值也不相似,题目中规定将n=1,n=2…n=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赋初始值,一般赋值为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;
}
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 10
int 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(ss[i]);可知i代表是行,因而填入for(i=0;i< N ;i++)*/
{ len=strlen(ss[i]);
/**********found**********/
if(len<= __2__);/*题目规定将串长超过k字符串删除,换个说法就是将串不不小于等于k字符串留下,因而该空填写if(len<= k)*/
/**********found**********/
strcpy(ss[j++],__3__);/*将ss[i]行值赋值到s[j]中,该空浮现频率很高,因而要牢记。strcpy(ss[j++],ss[i])*/
}
return j;
}
main()
{ char x[N][M]={"Beijing","Shanghai","Tianjing","Nanjing","Wuhan"};
/*定义了一种5行10列二维字符数组x*/
int i,f;
printf("\nThe original string\n\n");
for(i=0;i<N;i++)puts(x[i]); 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(x[i]);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__) {/* ss[i][k]可知,i处在行位置,因而i要不不小于最大行长度,因而填入:while(i<N)*/
/**********found**********/
ss[i][k]=__3__; i++; }/*将所有串长超过K字符串右边字符删除,请看分析可知,如果在k位置加一种’\0’则所有字符串长度为k,因而填写:
ss[i][k]=’\0’;*/
A
B
C
\0
\0
\0
\0
1
2
3
4
\0
\0
\0
a
b
c
d
e
f
\0
A
B
\0
\0
\0
\0
\0
1
2
\0
4
\0
\0
\0
a
b
\0
d
e
f
\0
}
main()
{ char x[N][M]={"Create","Modify","Sort","skip","Delete"};
int i;
printf("\nThe original string\n\n");
for(i=0;i<N;i++)puts(x[i]); printf("\n");
fun(x,4);
printf("\nThe string after deleted :\n\n");
for(i=0;i<N;i++) puts(x[i]); printf("\n");
}
(4) 类似题目:第11、12、19、45、62、77、100
2. 记录字符个数
(1) 考察数字字符判断措施和字符结束形式
(2) 举例1:P53第67题
#include <stdio.h>
void fun(char *s,int *t)
{ int i,n;
n=0;
/**********found**********/
for(i=0;___1___ !=0;i++)/*for循环中体现式2体
展开阅读全文