}
这道题是有关字符串的题目,x[N][M]有5个字符串,删除所有串长超过k的字符串,第1空填写循环结束条件,比较完5个字符串长度是否超过k就结束,所以这空填N(常量5),第2空跟k比较长度,很明显填k,最后一空是字符串函数strcpy复制字符串,strcpy两个参数都必须为指针,这空只能填ss[i],把长度小于等于k的字符串全部复制到ss[j]中,j++实现j自增。
运行检验结果。
(三)、函数调用
5、给定程序中,函数fun的功能是将a和b所指的两个字符串转换成面值相同的整数,并进行相加作为函数值返回,规定字符串中只含9个以下数字字符。
例如,主函数中输入字符串:
32486和12345,在主函数中输出的函数值为:
44831。
#include
#include
#include
#defineN9
longctod(char*s)
{longd=0;
while(*s)
if(isdigit(*s)){
/**********found**********/
d=d*10+*s-__1__;
/**********found**********/
__2__;}
returnd;
}
longfun(char*a,char*b)
{
/**********found**********/
return__3__;
}
main()
{chars1[N],s2[N];
do
{printf("Inputstrings1:
");gets(s1);}
while(strlen(s1)>N);
do
{printf("Inputstrings2:
");gets(s2);}
while(strlen(s2)>N);
printf("Theresultis:
%ld\n",fun(s1,s2));
}
这道题是有关字符串的,把字符串转成数据并相加。
其中有2个函数,ctod和fun函数,其中fun函数内容很简单,直接return表达式,ctod函数定义后,主函数中没有被调用,所以第三空填写ctod函数调用。
isdigit函数是判断是否有数字,if(isdigit(*s))如果是数字,则执行语句d=d*10+*s-__1__;,,具体减去什么,我们发现*s的内容是字符,如‘2’字符如何转化为数字2,我们只有通过ASCII码转换,减去48(‘0’的ASCII码码值)即可得到相应的数字。
所以第一空填‘0’,第二空是循环体的一部分,循环是由*s来控制,如果没变化就会产生死循环,所以第二空使指针s下移,不断地接收字符串中的值。
第3空根据题目要求要把两个数加起来,但是ctod参数只有一个,每一次只能转化一个字符串,所以这空填ctod(a)+ctod(b)。
运行后入字符串:
32486和12345,得到44831,说明做正确了。
函数调用特别要注意实际参数必须与形参个数一致,类型一致,一一对应,特别注意字符串函数stycpy,strcmp,strlen等函数的调用形式。
(四)、初值
6、给定程序中,函数fun的功能是:
计算下式前n项的和作为函数值返回。
例如,当形参n的值为10时,函数返回:
9.612558。
#include
doublefun(intn)
{inti;doubles,t;
/**********found**********/
s=__1__;
/**********found**********/
for(i=1;i<=__2__;i++)
{t=2.0*i;
/**********found**********/
s=s+(2.0*i-1)*(2.0*i+1)/__3__;
}
returns;
}
main()
{intn=-1;
while(n<0)
{printf("Pleaseinput(n>0):
");scanf("%d",&n);}
printf("\nTheresultis:
%f\n",fun(n));
}
这是一道有关数学的题目,先把这数学式子看下,思考下分子和分母有什么规律,然后再做题,第一空填的是s的初值,根据s=s+(2.0*i-1)*(2.0*i+1)/__3__;我们可以看出s是用来求整个式子的和,式子的每一项都存在规律,所以初值为0,那么第一空就填0,第二空是控制循环的条件,这个式子(2.0*i-1)*(2.0*i+1)/__3__跟题目给出的式子比较,发现i最大只能为n,所以第二空填n,第三空之前有定义了一个变量t,没被用到过,所以第三空肯定是填跟t有关内容,根据分析第三空填t*t。
运行输入10,值为9.612558,说明做对了。
(五)、变量或指针的自增自减
14、给定程序中,函数fun的功能是:
将形参s所指字符串中的数字字符转换成对应的数值,计算出这些数值的累加和作为函数值返回。
例如,形参s所指的字符串为:
abs5def126jkm8,程序执行后的输出结果为:
22。
#include
#include
#include
intfun(char*s)
{intsum=0;
while(*s){
/**********found**********/
if(isdigit(*s))sum+=*s-__1__;
/**********found**********/
__2__;
}
/**********found**********/
return__3__;
}
main()
{chars[81];intn;
printf("\nEnterastring:
\n\n");gets(s);
n=fun(s);
printf("\nTheresultis:
%d\n\n",n);}
这道题跟第5题有点类似,都是把字符串中的数字字符转为对应的数值,不同的是第5题是把两个字符串转成面值相同的整数并相加,这道题把1个字符串中的各个数值相加。
第一空是把所有是数字的加进sum中,所以同样的第一空填写’0’,第2空指针下移,填写s++,最后一空返回的是这些数值的累加和,而sum正是求这些数值的累加和,所以填sum。
输入abs5def126jkm8,程序执行后的输出结果为22,则正确。
(六)、return表达式
前面的第1题,第5题,第14题都使用到return,这里就不再列举。
(七)、文件指针
28、给定程序中,函数fun的功能是将参数给定的字符串、整数、浮点数写到文本文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数atoi和atof将字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。
#include
#include
voidfun(char*s,inta,doublef)
{
/**********found**********/
__1__fp;
charstr[100],str1[100],str2[100];
inta1;doublef1;
fp=fopen("file1.txt","w");
fprintf(fp,"%s%d%f\n",s,a,f);
/**********found**********/
__2__;
fp=fopen("file1.txt","r");
/**********found**********/
fscanf(__3__,"%s%s%s",str,str1,str2);
fclose(fp);
a1=atoi(str1);
f1=atof(str2);
printf("\nTheresult:
\n\n%s%d%f\n",str,a1,f1);
}
main()
{chara[10]="Hello!
";intb=12345;
doublec=98.76;
fun(a,b,c);
}
这是一道典型的文件题目,第一空很明显填写定义指针的形式,回忆下文件那张,定义文件指针为FILE*fp,一定要大写还要记得加*号。
接着以写的方式打开文件,第二空之后又出现了以读的方式打开文件,我们知道文件打开完了要关闭文件,才能再对文件进行其他的读写操作。
所以第二空填写关闭文件,关闭文件调用fclose(文件指针),第二空填fclose(fp)。
fscanf函数中的第一个参数是我们要填写的,fscanf(文件指针,格式控制字符串,输入项表),所以第三空填fp。
运行检验结果。
文件中考得多的就是文件指针,如FILE*fp,feof(fp),fclose(fp),fp,还有就是文件打开方式读文本文件r、读二进制文件rb,写文本文件w、写二进制文件wb。
(八)、指向结构体成员运算符--->和结构体成员运算符.
23、程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。
函数fun的功能是对形参b所指结构体变量中的数据进行修改,最后在主函数中输出修改后的数据。
例如:
b所指变量t中的学号、姓名、和三门课的成绩依次是:
10002、"ZhangQi"、93、85、87,修改后输出t中的数据应为:
10004、"LiJie"、93、85、87。
#include
#include
structstudent{
longsno;
charname[10];
floatscore[3];
};
voidfun(structstudent*b)
{inti;
/**********found**********/
b__1__=10004;
/**********found**********/
strcpy(b__2__,"LiJie");
}
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__);
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");
}
这是一道结构体题,考的内容是函数之间结构体变量的数据传递,函数fun的功能是对形参b所指结构体变量中的数据进行修改,所以传递的是结构体变量的地址,第三空考的是函数调用,实际参数就是&t,所以第三空填&t,t中的学号10002变成10004,所以结构体指针变量b指向学号(sno)变成10004;所以bsno=10004,第一空填—>,strcpy(b__2__,"LiJie");这是对姓名进行赋值的一种方式,所以第二空填name>。
运行后结果为10004、"LiJie"、93、85、87,则正确。
47、程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。
所有学生数据均以二进制方式输出到文件中。
函数fun的功能是从形参filename所指的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的学生数据输出到filename所指的文件中,覆盖原来的文件内容。
#include
#defineN5
typedefstructstudent{
longsno;
charname[10];
floatscore[3];
}STU;
voidfun(char*filename)
{FILE*fp;inti,j;
STUs[N],t;
/**********found**********/
fp=fopen(filename,__1__);
fread(s,sizeof(STU),N,fp);
fclose(fp);
for(i=0;ifor(j=i+1;j/**********found**********/
if(s[i].sno__2__)
{t=s[i];s[i]=s[j];s[j]=t;}
fp=fopen(filename,"wb");
/**********found**********/
__3__(s,sizeof(STU),N,fp);
fclose(fp);
}
main()
{STUt[N]={{10005,"ZhangSan",95,80,88},{10003,"LiSi",85,70,78},
{10002,"CaoKai",75,60,88},{10004,"FangFang",90,82,87},
{10001,"MaChao",91,92,77}},ss[N];
inti,j;FILE*fp;
fp=fopen("student.dat","wb");
fwrite(t,sizeof(STU),5,fp);
fclose(fp);
printf("\n\nTheoriginaldata:
\n\n");
for(j=0;j{printf("\nNo:
%ldName:
%-8sScores:
",t[j].sno,t[j].name);
for(i=0;i<3;i++)printf("%6.2f",t[j].score[i]);
printf("\n");
}
fun("student.dat");
printf("\n\nThedataaftersorting:
\n\n");
fp=fopen("student.dat","rb");
fread(ss,sizeof(STU),5,fp);
fclose(fp);
for(j=0;j{printf("\nNo:
%ldName:
%-8sScores:
",ss[j].sno,ss[j].name);
for(i=0;i<3;i++)printf("%6.2f",ss[j].score[i]);
printf("\n");}
}
这道题既有结构体又有文件,所有学生数据均以二进制方式输出到文件中。
函数fun的功能是从形参filename所指的文件