C语言程序填空题 下载本文

char fname[20], buf[100]; int num; struct key { char word[10]; int count;

}keyword[]={ \\; char *getword (FILE *fp) { int i=0; char c;

while((c=getc(fp)) != EOF && (c==' '||c=='\\t'||c=='\\n')) ; if( c==EOF ) return (NULL) ;

else buf[i++]=c;

while((c = ① && c!= ' ' && c!= '\\t' && c!= '\\n' )

buf[i++] = c;

buf[i]= '\\0';

return(buf);

}

lookup(char *p)

{ int i;

char *q, *s;

for(i=0;i

{ q = ② ; s=p;

while( *s && (*s==*q) )

{ ③ } if( ④ )

{ keyword[i].count++; break; } } return; } main() { int i; char *word;

printf(\;

scanf(\;

if((cp=fopen(fname, \

{ printf(\;

exit(0);

}

num = sizeof(keyword) / sizeof(struct key);

while( ⑤ )

lookup(word);

fclose(cp);

for(i=0;i

printf(\word,keyword[i].count); }

【3.60】下面程序的功能是从键盘接受姓名(例如:输入\),在文件\中查找,若文件中已经存入了刚输入的姓名,则显示提示信息;若文件中没有刚输入的姓名,则将该姓名存入文件。要求:⑴若磁盘文件\,已存在,则要保留文件中原来的信息;若文件\不存在,则在磁盘上建立一个新文件;⑵当输入的姓名为空时(长度为0),结束程序。

#include main() { FILE *fp; int flag;

char name[30], data[30];

if((fp=fopen(\ ① ))==NULL ) { printf(\; exit(0); } do

{ printf(\; gets(name); if( strlen(name)==0 ) break; strcat(name, \; ② ; flag=1;

while( flag && (fgets(data, 30, fp) ③ ) ) if( strcmp(data, name) == 0 ) ④ ;

if( flag )

fputs(name, fp); else

printf(\; } while( ⑤ ); fclose(fp); } 参考答案

【3.1】答案: ① a+b ② a-b ③ a-b 【3.2】答案:① 1.0/(float)(i*i) ② sqrt(6*s) 【3.3】答案:① *k=p

【3.4】答案:① t=t*i ② t=t>0?-1:1 【3.5】答案:① d=1 ② k++ ③ k<=n 【3.6】答案: ① x>=0 ② x

【3.8】答案:① m=n ② m>0 ③ m=m/10 【3.9】答案:① i==j ② k!=i&&k!=j 【3.10】答案:① i<=9 ② j%3!=0

【3.11】答案:① m=n ② r!=0 ③ return(n) 【3.12】答案:① float a[10],x ② i<=9 ③ i<=8 ④ j<=9-i

⑤ a[j]>a[j+1] ⑥ a[j]=a[j+1] ⑦ i<=9 ⑧i%5==0 【3.13】答案:① &a[i] ② continue

注释:①是基本概念,使用scanf函数输入数组元素的值。当输入的元素值小于0时,应当跳过后面的语句,取下一个数,所以②要填入continue。 【3.14】答案:① s[j++]=s[i] ② s[j]=s[i]

【3.15】答案:① s[j++]=s[i] 【3.16】答案:① x[i++]

【3.17】答案:① i=strlen(a);i>=j;i-- ② a[i+1]=a[i]

【3.18】答案:① '\\0' ② str1[i]-str2[i]

【3.19】答案:① j++ ② '\\\\' ③ j++ ④ '\\\\' ⑤ j++ ⑥ '\\0'

【3.20】答案:① t[k]!= '\\0' ② t[k]== '\\0' 【3.21】答案:① <=n ② s ③ 0 ④ fun(k) 【3.22】答案:① a[fmax(a,N)] ② k=p

【3.23】答案:① last*n00 ② x!=min-x ③ flag=0

【3.24】答案:① (x0+a/x0)/2 ② a,x1

注释:根据迭代公式,①处应当是计算迭代值

x1=(x0+a/x0)/2。按照求平方根的要求,当迭代的精度不能满足\时,则要继续迭代,因此②处应当填写\。程序中调用了求绝对值的库函数fabs( )。

【3.25】答案:① 2+age(n-1) ② age(5)

注释:由于程序是递归算法,因此首先要建立问题的递归数学模型。根据原题的描述可以写出如下递归公式: age(n) = 10 (n=1) age(n) = 2+age(n-1) (n>1)

对照程序和递归公式可以看出:n的含义是第n位学生。很显然,要求第5位学生的年龄,②处应当是调用函数age,实参的值应当是5。在①处应该是函数的递归调用,根据递归公式,应当填写:2+age(n-1)。 【3.26】答案:① return(1) ② return (sum(n-1)+n)

注释:按照常规的编程方法,此问题可采用一个循环语句实现。阅读程序,没有发现循环语句,这时,应当认为原来的编程者使用的是非常规的算法。对于这样常规算法需要用循环实现而没有使用循环的程序,就可以肯定地认为,一定是使用了递归算法。

将问题\求1~n的累加和\的公式写成递归定义,可以是如下形式;

sum(n)=1 当n=1时

sum(n)=sun(n-1)+n 当n>1时

根据此递归定义,可以很容易完成程序。

【3.27】答案:① return(1) ② n*facto(n-1) 注释:我们熟悉的求n!的算法一般是采用循环语句实现,但在此程序中根本没有循环语句。这时我们应该想到:是采用递归算法实现的。首先写出求n!的递归公式;

n!=1 当n=1时 n!=n*(n-1) 当n>1时

根据此递归定义,可以很容易完成程序。

【3.28】答案:① com=n ② com=combin(n-1,m-1) + combin(n-1,m)

注释:题目的说明中已经给出组合问题的递归定义,不需要读者自己寻找递归表达式。程序中的语句\

(n<2*m) m=n-m;\完成了题目中叙述的\用公式(1)进行简化\的工作。

【3.29】答案:① *str=='\\0' ② 1+strlen(str+1) 注释:求串长算法的关键是确定串结束标记'\\0'的位

置。根据求串长的方法,可以得到如下递归算法:指针

str指向字符串的首字符

如果 当前字符(*str)== 串结束标记'\\0' 则 串长=0

否则 串长 = 1+除第一个字符之外的剩余字符串的串长

因此,在①的位置上应当填写\,以判断当前字符(*str)是否是串结束标记'\\0'。在②的位置应当是根据上面的递归算法进行递归调用,因此应当填写\。

【3.30】答案:① &n ② m ③ m/10 ④ m>0 ⑤ r(m)

【3.31】答案:① prt(c, n-1) ② prt(' ' , n-i) ③ prt('*', i)

注释:函数prt的功能是输出n个字符c。 【3.32】答案:① y(x, n-1)

注释:这显然是一个递归问题,首先要对原来的数学函数定义形式进行变形,推导出原来函数的等价递归定义。可以推导出原来函数的递归定义如下。 y(x,n)=x 当n=0时 y(x,n)=sqrt(x+y(x,n-1)) 当n>0时

【3.33】答案:① p-- ② *p='\\0' ③ *p=c ④ p-- ⑤*s++

注释:在递归算法中,指针s指向字符串首部要反向的字符,即要将指针s所指向的字符与指针p 所指向的字符串尾的字符('\\0')进行交换,在交换过程中,将尚没有交换的字符串的中间部分作为一个整体,进行递归处理。程序中首先执行\,将首字符存入临时变量;然后执行\,将尾字符存入串首;执行

\是递归处理串的中间部分,这时,在②处应当填入\,即存入串结束标记。这是这一程序中的关键所在。在③处要完成将存在临时变量c中的字符存入串尾的工作,应当填写\。

【3.34】答案:① str+1 ② return ①改为 n-2 【3.35】答案:① p>=q ② max=s ③ p,max ④ p+1,q ⑤ &array[0], &array[9]

注释:本程序中的排序部分采用的是递归算法。函数sort的两个形参的含义是:对指针p和指针q之间的数据进行排序。由语句\; s<=q; s++)\中指针p和指针q之间的关系可以得出:指针p不应在指针q之后,因此①处应填\、⑤处应填\。

由于变量max是指向当前最大值的指针,则当找到新的最大值时,max中保存的应该是新的最大值的指针,因此②处应填\。

当调用函数swap交换两个变量值的时候,要求实参是

变量的地址,因此,③处应填\将最大值存入指针p所指的单元。

由于问题的要求是\从大到小\排序,通过执行一次函数sort使最大值已经放到了指针p所指的单元中,因此,下一遍排序的时候,只要对指针p之后的元素进行即可,所以④处应填\。

【3.36】答案:① a+1 ② n+'0' 【3.37】答案:① s

注释:p是一个一级指针,赋值后保存二维数组a的首地址,做加法运算加1时,实际地址增加一个它所指向的数据类型的长度。在C语言中,多维数组在计算机中是按行存储的,所以在本题中要通过指针访问二维数组中的数据,必须将二维下标转换为一维下标。 【3.39】答案:① '\\0' 或 0 ② ++

注释:在C语言中,进行字符串处理时,必须注意串结束标记'\\0',它是在进行串处理时的最基本的要求,所以①中要填入'\\0'。为了使用putchar输出一个字符串,则必须有改变指针的运算,这里只能使用++运算。 【3.40】答案:① p++ ② w[i+1]=w[i]

【3.41】答案:① && ② *a<*b ③ *a++, *b++ ④ ==

⑤ != ⑥ '\\0' ⑦ w=s ⑧ n++ ⑨ t=s[i];s[i]=s[j];s[j]=t; ⑩ s3[0] 【3.42】答案:① *++pa ② *++pa ③ *pa ④ return(total) ⑤ n<=2 || n>=MAXNUM+1 ⑥ num+n

【3.43】答案:① stu.name ② &stu.score ③ p->name ④ p->score

注释:这是结构中的最基本概念。

【3.44】答案:① struct student ②

strcmp(stu[i].name,str)==0 ③ break 注释:程序的主体是一个二重循环,内层for循环完成查找学生的工作。①处是进行结构数组说明并初始化,按照结构变量说明的格式规定,应该填写:strcut student。②处为if语句的逻辑条件,应当是当查找到