C语言答案 - 图文

更新时间:2023-12-21 15:29:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第1套 上机操作题

一、程序填空题

【微答案】

(1) 0 (2) i++或++i或i+=1或i=i+1 (3)2.0*i 【微分析】

填空1:循环变量1从开始参加运算,但是在每次循环的开始i都进行自加1操作,故i应赋初值为0。 填空2:循环变量i自增1运算。

填空3:根据公式确定表达式通项。注意x为double类型,故应将i变为double类型再进行运算。 二、程序修改题

【微答案】

(1)void fun ( char *s , char *t )

(2)t[2*d]='\\0';或t[d+i]='\\0';或t[2*d]=0;或t[d+i]=0; 【微分析】

(1)从调用函数来看,函数传递的是数组,所以函数的形参应为指针。

(2) 循环结束后回文字符的个数为2*d个,因为数组下标是从0开始的,所以最后一个字符的下标为2*d-1,在最后一个字符的后面加上结束符'\\0',因此为t[2*d]='\\0';。 三、程序设计题

【微答案】

void fun(char *s, char t[]) {

int i,j=0,n; n=strlen(s); for(i=0;i

if(i%2!=0&&s[i]%2!=0)

{t[j]=s[i]; /*将下标为奇数同时ASCII码值为奇数的字符放入数组t中*/ j++; }

t[j]='\\0'; /*最后加上结束标识符*/ }

【微分析】

本题要求除了下标为奇数同时ASCII码值也为奇数的字符之外,其余的所有字符都删除。即要留下下标为奇数同时ASCII码值也为奇数的字符。所以if的条件语句中应使用if(i%2!=0&&s[i]%2!=0)。 第2套 上机操作题

一、程序填空题

【微答案】

(1)t=i (2) i (3) '\\0'或0 【微分析】

本题中第一个for循环的作用是得到字符串的长度,第二个for循环的作用是对下标为奇数的字符按ASCII码大小排序,最后将排好序的字符取出。

填空1:取出字符串中下标为奇数的字符,所以将下标i赋值给中间变量t。

填空2:此处for循环语句的作用是实现对下标为奇数的元素进行排序操作,所以循环变量初值应填入j=i+2。

填空3: 将下标为奇数的字符取出后,存入p所指的数组中,最后不要忘记在数组最后加入字符串结束标识'\\0'。 二、程序修改题

【微答案】

(1)while(fabs(t)>=num) (2)t=s/n; 【微分析】

(1)函数fun中while语句的作用是,当新的一项大于给定参数时,循环累计计算s的值。而题目要求最后一项的绝对值小于给定参数,因此循环条件应当是while(fabs(t)>=num)。

(2)变量t用来存放最后一项的值,因为每一项均为1或-1除以一个数,所以此处应使用除法运算符\。 三、程序设计题

【微答案】

void fun (char a[], char b[], int n) {

int i,k=0;

for(i=0;a[i]!='\\0';i++)

if(i!=n) /*将不是指定下标的字符存入数组b中*/ b[k++]=a[i];

b[k]='\\0'; /*在字符串最后加上结束标识*/ }

【微分析】

本题要求删除字符串中指定下标的字符,即把非指定下标的字符保留,所以if语句条件表达式的内容是if(i!=n)。字符串最后不要忘记加上字符串结束标识'\\0'。 第3套 上机操作题

一、程序填空题

【微答案】

(1)0 (2)|| (3)1 【微分析】

填空1:本题考查为变量赋初值,在这里row+=a[i][j]代表是每行的总和, colum+=a[j][i]代表的是每列的总和,因而row,colum在初始化时应该为零,此空应该填0。

填空2:本题考查了if条件语句,此句if判断代表每行的总和与列是否相等,每行的总和是否与对角线的总和相等,两者若有一个不成立,即返回0,因而此空应该填写||。

填空3:题目要求若矩阵是\幻方\,则函数返回值为1,因而此空应该填写1。 二、程序修改题

【微答案】 (1)t-=1.0/i; (2)return t; 【微分析】

(1)变量t存放公式的和,通过循环语句进行复合运算,因此此处应改为t-=1.0/i;,注意此处应进行变量的类型转换。

(2)循环结束后应将和值返回给主函数。 三、程序设计题

【微答案】

void fun (char *str) {

int i=0; char *p=str; while(*p) {

if(*p!=' ') /*删除空格*/ {

str[i]=*p; i++; } p++; }

str[i]='\\0'; /*加上结束符*/ } 【微分析】

本题要求删除所有空格,即保留除了空格以外的其他所有字符。由于C语言中没有直接删除字符的操作,所以对不需要删除的字符采用\保留\的操作。用指针p指向字符串中的每一个字符,每指向到一个字符都判断其是否为空格,若不是空格则保存到str[i]。 第4套 上机操作题

一、程序填空题

【微答案】

(1)1 (2) j++ (3)j 【考点分析】

本题考查:if语句条件表达式;自增/自减运算符;函数返回值。 【微分析】

填空1:根据题目要求,需要进行奇偶数的判定,我们可以通过if条件语句来判断数组元素是否是奇数,如果元素不能被2整除,则为奇数,所以填入if (a[i]%2==1)。

填空2:将为奇数的元素重新存放到数组的前面,同时下标增1。 填空3:函数返回值需要返回数组中奇数的个数,因此返回变量j。

二、程序修改题

【微答案】 (1)t=a;a=b;b=t;

(2)return(b);或return b; 【微分析】

求最大公约数算法一般采用辗转相除法。辗转相除法的算法为:首先将 m除以 n(m>n)得余数 r,再用余数r去除原来的除数,得到新的余数,重复此过程直到余数为 0时停止,此时的除数就是m 和 n的最大公约数。

程序首先判断参数a和b的大小,如果a

【微答案】

void fun( char *a ) {

int i,j=0;

for(i=0;a[i]!='\\0';i++) if(a[i]!='*')

a[j++]=a[i]; /*若不是要删除的字符'*'则留下*/ a[j]='\\0'; }

【微分析】

用循环操作从字符串的开始往后逐个进行比较,若不是要删除的字符(用if(a[i]!=′*′)来控制)则保留。变量i和j用来表示原字符串的下标和删除*号后新字符串的下标。注意下标变量j要从0开始,最后还要加上字符串结束标识′\\0′。 第5套 上机操作题

一、程序填空题

【微答案】

(1)N (2)i (3) -1 【微分析】

填空1:变量i是循环变量,它的取值范围是在0到N之间。

填空2:如果ss所指字符串数组中的字符串和t所指字符串相同的话,则返回其下标值,即return i;否则返回-1,即return -1;。

填空3:在main函数中输出最后结果,判断函数返回值n,如果n=-1,说明没有找到,否则输出n。 二、程序修改题

【微答案】 (1)a2=k/10; (2)return i; 【微分析】

(1) a2存放十位数,所以是a2=k/10,此处是一个书写错误。

(2)根据题意,要返回能被3整除的数的个数,从循环体中可以知道其个数是由i来计算的,所以返回的是i。

三、程序设计题

【微答案】

void fun( char *a ) {

while(*a!='\\0') a++;

a--; /*指针a指向字符串的尾部*/ while(*a=='*')

a--; /*指针a指向最后一个字母*/ *(a+1)='\\0'; /*在字符串最后加上结束标志符*/ }

【微分析】

对于一个字符串要删除其尾部的*号,只需要在最后一个不是*号的字符后面加上结束符号′\\0′。具体操作为:首先找到字符串的结尾,然后从最后一个字符开始往前逐个判断是否为*号,直到找到非*号字符为止,最后在该字符后面加上结束符号'\\0'。 第6套 上机操作题

一、程序填空题

【微答案】

(1) *n (2) next (3) head 【微分析】

填空1:*n用来存放结点的个数,对其赋初值为0。

填空2:while循环用于遍历链表,循环一次,指针指向链表的下一个结点。 填空3:根据函数定义语句确定调用函数的实际参数,即fun(head,&num);。 二、程序修改题

【微答案】 (1)a=NULL; (2)if(*r==*p) 【微分析】

(1)a=Null;是个明显的语法错误,指针指向空值的关键字应为NULL。 (2)r和p均为指针变量,分别指向两个字符串中的字符变量,循环条件是当r和p所指向的字符相同时,进行指针后移操作,故此处应为if(*r==*p)。 三、程序设计题

【微答案】

void fun(int a, int b, long *c) {

*c=b+(a/10)*10+(b/10)*100+(a)*1000; }

【微分析】

本题中主要的问题是如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数,分别用10对它们求余可得到它们的个位数。得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。注意:使用c时要进行指针运算。 第7套 上机操作题

一、程序填空题

【微答案】

(1) a[i]%2 (2) a[j] (3) j 【微分析】

填空1:if语句条件表达式,判断数组元素是否为偶数,对2求余,结果为0,则为偶数;结果为1则为奇数。

填空2:如果该数组元素是偶数,则将其值保存。

填空3:最后按要求将偶数个数通过return语句返回给main函数。 二、程序修改题

【微答案】 (1)int fun (int n) (2)if (n==1) 【微分析】

(1)定义有参函数时,形参变量要分别定义其类型,根据主函数中的调用函数可知,此处形参变量应定义为int型。

(2)if条件判断表达式中,n=1是赋值表达式,表达式的值永远为真,不能形成判断条件,应将n=1改为n==1。 三、程序设计题

【微答案】

void fun( char *a,int n ) {

int i=0,k=0; char *p, *t;

p=t=a; /*将指针移动到字符串末尾*/ while(*t) t++;

t--; /*从后往前如果是'*' 则使k++,找到最后一个*所在的位置,并记录'*'的个数*/

while(*t=='*')/*指针t指向前一个,同时标量k增加一*/ {k++;t--;} if(k>n)

{while(*p&&p

{ a[i]=*p; i++;p++; }

a[i]='\\0'; } }

【微分析】

字符串中尾部*号不能多于n个,多余的要删除。首先需要通过while循环统计字符串尾部*号,然后通过if条件语句完成尾部*号数和n的比较,若尾部*号数多于n个,则需要把n个*号和其余字符重新保留。 第8套 上机操作题

一、程序填空题

【微答案】

(1) sum=0 (2) t[i][i] (3) 1 【微分析】

填空1:变量sum用来储存\和\结果,所以将其初始化为0。

填空2:从题目中我们可以了解到,主对角线元素的行和列下标是相同的,所以应填入t[i][i]。 填空3:对于反向对角线元素的行和列的下标,它们的关系是相加和为n-1,所以应填入1。 二、程序修改题

【微答案】 (1)double r ;

(2)while (fabs(n-m) >0.001) 【微分析】

(1)程序中我们会发现r=(m+n)/2,而m和n都是double型的,并且根据题意可知,变量r需要定义为double型。

(2)绝对误差不超过0.001,所以循环条件应为fabs(n-m)>0.001。 三、程序设计题

【微答案】

void fun( char *a, char *h,char *p ) { int i=0; char *q=a; while(q

{ a[i]=*q; q++;i++;} while(q

while(*q)

{ a[i]=*q; i++; q++;} a[i]='\\0'; }

【微分析】

本题的重点是要选择好判断条件,首先是需要判断前导*的结束,然后判断是否指向最后一个字母,最后补充尾部*,只要思路对了就可正确解答。 第9套 上机操作题

一、程序填空题

【微答案】

(1)j (2)k (3)p或(p) 【微分析】

填空1:函数中申请了两个内存空间,其中p存放数字字符串,t存放非数字字符串,根据条件可知,p依次存放数字字符串,其位置由j来控制,所以应填j。

填空2:利用for循环再把t中的内容依次追加到p中,其中t的长度为k,所以应填k。 填空3:处理之后的字符串存放到p中,最后返回p的首地址即可,所以应填p。 二、程序修改题

【微答案】

(1)while ( i < j ) (2)if ( *a )

【微分析】

(1)将字符串中字符逆序存放,循环条件是i

【微答案】

void fun(char *s, char t[]) {

int i, j = 0 ;

for(i = 0 ; i < strlen(s) ; i++)

if(!((i % 2) ==0 && (s[i] % 2))) t[j++] = s[i] ; t[j] = 0 ; }

【微分析】

本题是从一个字符串按要求生成另一个新的字符串。我们使用for循环语句来解决这个问题。在赋值新的字符串之前,先对数组元素的下标和ASCII码的值进行判断,将满足要求的元素赋给新的字符串。 第10套 上机操作题

一、程序填空题

【微答案】

(1)k (2)len (3)ss[i][j] 【微分析】

填空1:使用变量k来保存第几个字符串是最长的字符串,所以应填k。

填空2:利用for循环把原字符串右移至最右边存放,字符串的长为len,所以应填len。 填空3:左边用字符*补齐,所以应填ss[i][j]。 二、程序修改题

【微答案】 (1)result*=n--; (2)return result; 【微分析】

该题采用循环语句计算n的阶乘。当n大于1且小于170时,令result与n相乘,同时n自动减1,循环至n=2(n=1时无须相乘)。最后将阶乘的积result返回给主函数。 三、程序设计题

【微答案】

void fun( char s[],int c) {

int i=0; char *p; p=s;

while(*p) /*判断是否为结束符*/ {

if(*p!=c) /*判断字符串中字符是否与指定字符相同*/ {

s[i]=*p;/*不同将重新组合字符串,*/ i++; }

p++; /*相同则处理下一个字符。*/ }

s[i]='\\0'; }

【微分析】

删除字符串中指定字符只需把未删除字符保留。该程序先将字符串s的首地址赋给了指针p,经过判断后,将重新组合的字符存入s。 第11套 上机操作题

一、程序填空题

【微答案】

(1) [N] (2) t[i][j] (3) t[j][i] 【微分析】

填空1:主函数中调用函数的参数为二维数组,所以此处形参应定义为指针数组。

填空2:根据题意可知,对称元素相加的和存放在左下三角元素中,那么应填入的是t[i][j]。 填空3:右上三角元素置0,应填入t[j][i]。 二、程序修改题

【微答案】

(1)#define FU(m,n) (m)/(n) (2)return (value); 【微分析】

本题考查C语言的宏定义,其格式为:#define 标识符字符串,中间要用空格分开。在该题中,标识符为FU(m,n),字符串为(m/n),由题干信息可知,m、n均为表达式,且先进行表达式运算,再进行除法运算,因此此处应为(m)/(n)。 三、程序设计题

【微答案】

void fun( char *a ) {

char *p=a;

while(*p=='*') p++; /*指针p指向字符串第一个字母*/ for(;*p!='\\0';p++,a++)

*a=*p; /*从第一个字母开始,其后的字符都放入指针a所指的字符串中*/ *a='\\0'; /*在字符串最后加上字符串结束标识*/ }

【微分析】

我们在此提供另一种解答方法。 #include void fun(char *a) { char *p=a;

while(*p=='*') p++; strcpy(a,p); } 第12套 上机操作题

一、程序填空题

【微答案】

(1) t[][N] (2) i=0;i

填空1:根据main函数中的函数调用语句,可以填写fun函数定义中的形参内容。 填空2:由于是N×N矩阵,所以for语句中循环变量i的取值范围是0到N。 填空3:for循环体中是变量值交换算法。 二、程序修改题

【微答案】

(1)int fun(int a[],int m)或fun(int a[],int m) (2)else if(m>a[mid]) 【微分析】

(1)fun(int a[],int m)函数的返回值为int类型,所以定义函数时,函数的返回类型不能是void,而是int类型。这里int可以省略,若省略函数类型标识符,系统将默认为int型。

(2)else If(m > a[mid])中,关键字if需要区别大小写,大写是错误的。 三、程序设计题

【微答案】

void fun( char *a, char *p ) {

char *t=a;

for(;t<=p;t++) if(*t!='*')

*(a++)=*t; for(;*t!='\\0';t++) *(a++)=*t; *a='\\0';

/*在字符串最后加上字符串结束标识*/ }

【微分析】

本题用两个循环语句来实现。第1个循环的作用是将指针p所指字母以前所有非*号的字符保留下来,即删除指针p以前所有的*号。第2个循环的作用是将指针p以后的所有*号保留下来。最后在新串的结尾

加上结束符。 第13套 上机操作题

一、程序填空题

【微答案】

(1) N (2) substr (3) 0 【微分析】

填空1:此处考查for循环语句中循环变量i的取值范围,题目指出共有N个字符串,所以i的取值范围为0~N-1。

填空2:strstr(s1,s2)的功能是在s1串中查找s2子串。题目要求在ss字符串数组中,查找substr所指的字符串,故应填substr。

填空3:此处使用if条件语句来判断查找结果,由printf(\′t found!\\n\可知此处需填写没有找到的条件,即是find==0。 二、程序修改题

【微答案】

(1)fun(int x,int y, int z)或int fun(int x,int y,int z) (2)return j; 【微分析】

(1)定义函数时,必须为每个形参分别定义变量类型。 (2)通过return语句将最小公倍数j返回主调函数。 三、程序设计题

【微答案】

void fun( char *a, int n,int h,int e ) {

int i,j=0;

for(i=h;i

a[j]='\\0'; /*在字符串最后加上结束标识*/ }

【微分析】

由于程序已经给出前导*号和尾部*号的个数,所以只要用循环语句将中间的字符保留起来。注意循环变量i的初值(h)和终止值(n-e),由于h和e分别表示a中的前导*号和尾部*号的个数,n是字符串的长度,所以从a[h]到a[n-e-1]之间的所有字符都要保留。循环结束后在新串的尾部加上结束符'\\0'。 第14套 上机操作题

一、程序填空题

【微答案】

(1) s[i] (2) k (3) '\\0'或0 【微分析】

填空1:将字符串s中所有字母元素赋给数组t。

填空2:字符串中所有非字母元素放到字母元素后面,所以取值范围是0~k。 填空3:最后给字符串加入结束标识'\\0'。 二、程序修改题

【微答案】 (1)while (*w) (2)if ( *r ==*p ) 【微分析】

(1)这里要判断的是值的真假,而不是地址,所以改为while (*w)。

(2)C语言中关键字区分大小写,只需运行程序,就可以根据错误提示找到。 三、程序设计题

【微答案】

void fun(char *s, char t[]) {

int i,j=0,n; n=strlen(s);

for(i=0;i

t[j]='\\0'; }

【微分析】

要删除ASCII码值为奇数的字符,也就是要保留ASCII码值为偶数的字符,由于最终是要求出剩余字符形成的新串,所以本题的算法是对原字符串从头到尾扫描,并找出ASCII码值为偶数的字符依次存入数组中。

第15套 上机操作题

一、程序填空题

【微答案】

(1) N (2) k (3) ss[i] 【微分析】

填空1:for循环语句作用是遍历字符串数组中的每一个字符串,所以循环变量i的循环条件是i

【微答案】 (1) int k=0; (2)while (*p||*q) 【微分析】

(1) 变量k存放数组c的下标,因此应初始化为0。

(2) while循环语句的循环条件是判断两个字符串是否到达结尾。 三、程序设计题

【微答案】

void fun( char *a ) {

int i=0; char *p=a;

while(*p&&*p=='*') {

a[i]=*p; i++; p++; }

while(*p) {

if(*p!='*') {a[i]=*p;i++;} p++; }

a[i]='\\0'; }

【微分析】

函数fun的功能:除了字符串前导的*号之外,将串中其他*号全部删除。解答本题,(1) 定义一个临时指针p,初始指向原串首地址;(2) 利用循环语句把字符串前导*号拷贝到原串;(3) 继续移动指针,把串中和串尾的非*号字符拷贝到原串;(4)为修改后的字符串赋结束字符'\\0'。 第16套 上机操作题

一、程序填空题

【微答案】

(1) [M] (2) N (3)'\\0' 【微分析】

填空1:根据main函数中函数调用语句,确定函数定义时的形式参数,所以填入[M]。 填空2: while循环语句需要对所有字符串进行操作,因此循环条件是i

【微答案】 (1)t=1.0;

(2)return(s*2); 【微分析】

该题中,我们首先检查变量数据类型前后是否一致,因为变量t定义为double型,所以赋值时要赋以

实型数值。return(s)是一个数学错误,应该返回return(s*2)。 三、程序设计题

【微答案】

void fun( char *a, int n ) {

int i=0; int k=0; char *p,*t;

p=t=a; /*开始时,p与t同时指向数组的首地址*/ while(*t=='*') /*用k来统计前部星号的个数*/ {k++;t++;}

if(k>n) /*如果k大于n,则使p的前部保留n个星号,其后的字符依次存入数组a中*/ { while(*p)

{ a[i]=*(p+k-n); i++; p++; }

a[i]='\\0'; /*在字符串最后加上结束标识位*/ } }

【微分析】

字符串中前导*号不能多于n个,多余的删除。首先需要通过while循环统计字符串前导*号的个数,然后通过if条件语句完成前导*号的个数和n的比较,如果前导*号多于n个,需要把n个*号和其余字符重新保留。

第17套 上机操作题

一、程序填空题

【微答案】

(1)data (2) next (3) head 【微分析】

本题考查的是链表的数据结构,需利用指针变量才能实现,一个结点中应包含一个指针变量,用来存放下一个结点的地址。

建立单项链表的一般步骤是:建立头指针→建立第一个结点→头指针指向第一个结点→建立第二个结点→第一个结点的指针与指向第二个结点→……→最后一个结点的指针指向NULL。

填空1:变量s用来累加各结点的数据域,因此该空应为data。 填空2:每次循环结束时,指针P指向下一个结点,即p=p->next。

填空3:由被调用函数的形参列表可知,此处应为指针类型变量,因为要对链表的数据域求和,所以将链表的头指针传给被调用函数。 二、程序修改题

【微答案】 (1)while( *r) (2)*a=*r;a++;r++; 【微分析】

while( r)和r++都是简单的逻辑和语法错误,C语言中语句必须以分号\;\结尾。只要掌握了C语言的基础知识,发现这样的错误是很容易的。 三、程序设计题

【微答案】

void fun(char *s, char t[]) {

int i,j=0,k=strlen(s); /*k为字符串的长度*/

for(i=1;i

【微分析】

本题使用了一种i永远是奇数的循环方法,即for(i=1;i

【微答案】

(1) STU (2) std[i].num (3) std[i] 【微分析】

填空1:根据函数fun的返回值类型可知,函数类型标识符应该是结构体类型的,所以填入STU。 填空2:根据题目说明,找出指定编号人员,并将其数据返回。通过strcmp函数比较编号,若相同则函数值为0,所以填入std[i].num。

填空3:由题目可知,假如编号对应,则返回其编号对应数据,所以填入数据std[i]。 二、程序修改题

【微答案】

(1)if(*r==*p) {r++;p++; } (2)if(*r=='\\0') 【微分析】

从字符串s中找出子串t的方法是:从第1个字符开始,对字符串进行遍历,若s串的当前字符等于t串的第1个字符,两个字符串的指针自动加1,继续比较下一个字符;若比较至字符串t的结尾,则跳出循环;若s串的字符与t串的字符不对应相同,则继续对s串的下一个字符进行处理。 三、程序设计题

【微答案】

void fun(char *s, char t[]) {

int i=0;

for(;*s!='\\0';s++) /*找出ASCII值为奇数的字符依次存入数组t中*/ if(*s%2==1) t[i++]=*s;

t[i]='\\0'; /*在字符串的末尾加上串结束符*/ }

【微分析】

要删除ASCII码值为偶数的字符,也就是要留下ASCII码值为奇数的字符。由于最终是要求出剩余字符(即ASCII码值为奇数)形成的新串,所以本题程序的算法是对原字符串从头到尾扫描,并找出ASCII码值为奇数的字符并将其依次存入数组t中。此外,还要注意数组t的下标变化和下标的初值(初值必须为0,即i=0),t[i++]的作用是先使用t[i],然后再使i自增1。 第19套 上机操作题

一、程序填空题

【微答案】

(1)FILE*(2)fclose(fp)(3)fp 【微分析】 填空1:从使用fp = fopen(\\可知fp应该是文件类型指针,因此本空因该填写FILE*。 填空2:当对fp作打开操作的时候,并进行不同的操作前,应该对其关闭,因为在第一次打开时是对fp进行写操作,而在第二次打开后进行的是读操作,因此应该先对fp进行关闭,本空填fclose(fp)。

填空3:fscanf()是把文本文件输出,因此本空只能填写fp。 二、程序修改题

【微答案】

(1)t=calloc(m,sizeof(STU)); (2)t[k]=b[j]; 【微分析】

(1)calloc应用于分配内存空间。调用形式为 (类型说明符*)calloc(n,size),功能:在内存动态存储区中分配n块长度为\字节的连续区域,函数的返回值为该区域的首地址,(类型说明符*)用于强制类型转换。calloc函数与malloc 函数的区别在于calloc函数一次可以分配n块区域。例如,ps=(struct stu*) calloc(2,sizeof (struct stu));,其中的sizeof(struct stu)是求stu的结构长度。该语句的意思是:按stu的长度分配两块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。在本题中不用考虑那么复杂,根据定义类型STU b[N],*t;就可以看出*t=calloc(m,sizeof(STU))中的错误。

(2)t[k].num=b[j].num的错误旨在考查对结构体概念的掌握和灵活应用程度。 三、程序设计题

【微答案】

int fun(int a[], int n) {

int i,j=1;

for(i=1;i

if(a[j-1]!=a[i]) /*若该数与前一个数不相同,则要保留*/

a[j++]=a[i];

return j; /*返回不相同数的个数*/ }

【微分析】

该程序的流程是:定义变量i和j,其中j用于控制删除后剩下的数在数组中的下标,i用于搜索原数组中的元素。j始终是新数组中最后一个元素的下一个元素的下标,所以if语句中的条件是a[j-1]!=a[i],其中a[j-1]就是新数组中的最后一个元素,若条件成立,则表示出现了不同的值,所以a[i]要保留到新数组中。注意本题中i和j的初值都要从1开始,该算法只能用于数组已排序的题目中。 第20套 上机操作题

一、程序填空题

【微答案】

(1)0.0 (2)x[i]/N (3)j++ 【微分析】

填空1:通过读上面的程序可以看出此空考的是给变量赋初值,av代表的是平均值,因此av的初值应该是0.0。

填空2:通过for循环可知,此空代表求平均值,因此应该填写x[i]/N。

填空3:先把大于平均值的数放在形参y所指数组中,然后使下标值加1,因此此空应该填j++。 二、程序修改题

【微答案】

(1)double fun(int m)

(2)for(i=100;i<=m;i+=100) 【微分析】

(1)题目要求在函数fun中求级数前m项和,可用循环语句,每次计算级数中的一项,然后累加。第一处错误在于定义fun(int m),由函数的返回值可知应该定义为double fun(int m)。

(2)for(i=100,i<=m,i+=100)中是一个简单的语法错误。for循环语句的形式为for(表达式1;表达式2;表达式3) ,其表达式之间应以\;\相隔。 三、程序设计题

【微答案】

fun(STU a[], STU *s) {

int i;

*s=a[0]; /*先认为第1个值最小*/

for(i=0;is>a[i].s) *s=a[i]; }

【微分析】

找出结构体数组元素中的最小值。先认为第1个值最小,即*s=a[0];,如果在循环的过程中发现比第1个值更小的,就将指针s指向该元素,直到找到最小元素。另外,本题还涉及结构体中的指向运算符,请考生注意。

第21套 上机操作题

一、程序填空题

【微答案】

(1) 999 (2) t/10 (3) x 【微分析】

填空1:题目要求找出100~999之间符合要求的数,所以while语句的循环条件是t<=999。 填空2:变量s2存放三位数的十位,取出三位数十位数值的方法为s2=(t/10)。

填空3:题目需要判断各位上数字之和是否为x,所以if语句条件表达式是s1+s2+s3==x。 二、程序修改题

【微答案】

(1)void fun(long s,long *t) (2)while(s>0) 【微分析】

函数的形参类型应与实参类型相同,主函数中函数fun()的调用方式说明其参数应为指针类型,所以形参t应定义为long *t。

while循环的功能是,每循环一次就从s中的数上取出一位进行运算,直到取完为止,所以循环条件为s>0。

三、程序设计题

【微答案】

void fun( STREC a[] ) {

int i,j; STREC t;

for(i=1;i {t=a[j];a[j]=a[j+1];a[j+1]=t;} /*按分数的高低排列学生的记录,高分在前*/ }

【微分析】

对N个数进行排序的算法很多,其中最简单的排序算法是冒泡算法。利用双层for循环嵌套和一个if判断语句来实现,外层循环用来控制需比较的轮数,内层循环用来控制两两比较。

第22套 上机操作题

一、程序填空题

【微答案】

(1)char (2) ch<='9' (3)'0' 【微分析】

填空1:函数定义时,类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型,所以此处应该填入char。

填空2:通过if条件语句判断字符串中字符是否是数字字符,既大于等于字符'0',同时小于等于字符'9'。

填空3:return语句完成函数返回操作,要实现字符转换,应填入return '9'- (ch-'0')。 二、程序修改题

【微答案】 (1)b[k]=*p;

(2)b[k]=' ';k++; 【微分析】

(1) 题目中p是指针型变量作函数参数,因此给b[k]赋值时出现错误。

(2) 题目要求赋值3个字符后加一个空格,所以应该是先给b[k]赋值空格,然后变量k再加1。 三、程序设计题

【微答案】

double fun( STREC *h ) {

double ave=0.0; STREC *p=h->next; while(p!=NULL) { ave=ave+p->s; p=p->next; }

return ave/N; }

【微分析】

题目要求求链表中数据域的平均值,应首先使用循环语句遍历链表,求各结点数据域中数值的和,再对和求平均分。遍历链表时应定义一个指向结点的指针p,因为\头结点\中没有数值,所以程序中让p直接指向\头结点\的下一个结点,使用语句STREC *p=h->next。 第23套 上机操作题

一、程序填空题

【微答案】

(1)1 (2) i (3) a[p+i]或*(a+p+i) 【微分析】

填空1:该处是判断数组元素的个数是奇数还是偶数,为奇数时要使当前位置加1,以使p指向数组中间位置。

填空2和填空3:这里是一个比较常见的数组位置调换程序,应填入i和a[p+i]。 二、程序修改题

【微答案】 (1)float k;

(2)if(*a< *c) 【微分析】

(1) 观察程序中的k,在赋值语句中,k是以变量的形式进行赋值而非指针,所以将k定义为指针是错误的。

(2) 此处if语句是为了将小于*c的值放入*c中,所以改为if(*a < *c)。 三、程序设计题

【微答案】

int fun( STREC *a, STREC *b ) {

int i,j=0,max=a[0].s; /*找出最大值*/ for(i=0;i

if(max

b[j++]=a[i]; /*找出成绩与max相等的学生的记录,存入结构体b中*/ return j; /*返回最高成绩的学生人数*/ }

【微分析】

该程序使用两个循环判断语句,第1个循环判断语句的作用是找出最大值。第2个循环判断语句的作用是找出与max相等的成绩(即最高成绩)的学生记录,并存入b中。 第24套 上机操作题

一、程序填空题

【微答案】

(1) a[i] (2) a[j] (3) a[j] 【微分析】

填空1:for循环语句循环体中将数组元素a[i]赋值给变量max和变量min。

填空2:通过一次for循环,找到数组中的最大值,if语句的条件表达式是maxa[j]。 二、程序修改题

【微答案】 (1)去掉分号

(2)case 1:case 2:return 1; 【微分析】

C语言中,switch语句之后不能有分号,并且case语句常量后应用的是冒号。 三、程序设计题

【微答案】

void fun(STREC *a) {

int i;

a->ave=0.0; for(i=0;i

a->ave=a->ave+a->s[i]; /*求各门成绩的总和*/ a->ave/=N; /*求平均分*/ }

【微分析】

本题考查自定义形参的相关知识点,程序流程是这样的:在fun()函数中求出平均分后,返回到主函数时平均分也要带回,所以只能定义一个指针类型的形参STREC*a ,此时,引用成员的方式可以使用指向运算符,即a->ave和a->s[i],当然也可用(*a).ave和(*a).s[i]。 第25套 上机操作题

一、程序填空题

【微答案】

(1) n/2 (2) i (3) a[n-i-1]或a[n-1-i] 【微分析】

填空1:逆置数组元素中的值,将a[0]与a[n-1]对换位置,依此类推,那么需要对换n/2次。 填空2:将a[0]与a[n-1]对换位置,a[1]与a[n-2]对换位置,依次类推,则a[i]=a[n-1-i]。 填空3:普通的调换位置程序,显然填入a[n-i-1]。 二、程序修改题

【微答案】

(1)n= *p-'0';

(2)n=n*8+*p-'0'; 【微分析】

(1)\和\是字符串中的数字字符,为了进行数字运算,必须要将数字字符转换为数字,用数字字符减去字符'0'的ASCII码,就得到对应的数字。题中给出的是\,不是\。

(2)要在一个八进制数的最后加上一位,原来各个位上的数上升一位,只需将原数乘以8再加上个位数。 三、程序设计题

【微答案】

STREC fun( STREC *a, char *b ) {int i;

STREC str={\ /*若没找到指定的学号,在结构体变量中给学号置空串,给成绩置-1*/

for(i=0;i

if(strcmp(a[i].num,b)==0) /*找到指定学号的学生数据*/ str=a[i];

return str; /*返回学生记录*/ }

【微分析】

本程序一开始先使结构体变量str中的学号为空串,成绩为-1。循环体的功能是搜索所有学生的学号,并判断是否有学号与b所指字符串相同(即找到),若找到则给str重新赋值(str=a[i]),若没找到则str成员的值还是原有值(即未找到时学号返回空串,成绩返回-1)。

第26套 上机操作题

一、程序填空题

【微答案】

(1) a[] (2) 2 (3) i+1 【考点分析】

本题考查:函数定义; for循环语句。 【微分析】

填空1:由main中函数调用语句确定函数定义的形式参数。 填空2:for循环语句中,循环变量增值为2。 填空3:确定for语句循环变量的初值。 二、程序修改题

【微答案】 (1)sum=0.0;

(2)if((i+1)%5==0) 【微分析】

(1)变量sum书写错误。

(2)循环条件if(i+1%5==0)是一个运算逻辑错误,应先计算i+1,再对5求余。 三、程序设计题

【微答案】

double fun( STREC *a, STREC *b, int *n ) {

int i,j=0;

double av=0.0; for(i=0;i

av=av/N; /*求平均值*/ for(i=0;i

if(a[i].s

【微分析】

本题使用循环语句和条件判断语句来实现,第1个循环语句的作用是求出总分,然后求出平均分av。第2个循环的作用是将分数低于平均分的学生记录存入数组b中。 第27套 上机操作题 一、程序填空题

【微答案】

(1) struct student (2) n-1 (3) a[i].name,a[j].name 【微分析】

填空1:变量t是中间变量,用来存放结构体数组中的元素,因此应定义为结构体类型。

填空2:for循环语句用来遍历结构体数组,n是数组的长度,因此循环变量的取值范围是0~n-1。 填空3:字符串比较函数strcmp的一般格式为\字符串1,字符串2)\。

功能:按照ASCII码顺序比较两个字符数组中的字符串,并由函数返回值返回比较结果。 字符串1=字符串2,返回值=0; 字符串1>字符串2,返回值>0; 字符串1<字符串2,返回值<0。 二、程序修改题

【微答案】 (1)q=p+i; (2)while(q>p) 【微分析】

解答本题需要三个步骤,首先找到字符串中ASCII码值最大的字符并保存;然后将该字符复制,并将该字符前面的字符串顺次后移;最后将ASCII码值最大的字符赋给字符串的第一个字符。要找到ASCII码值最大的字符可以通过定义一个字符变量max,该字符变量初始时等于字符串的第一个字符,若字符串的下一个字符大于max,则将下一个字符赋给max,如此循环到字符尾,即可得到ASCII码值最大的字符,同时令指针q指向最大字符。此后对最大字符前面的子串顺次后移,可采用while语句实现。 三、程序设计题

【微答案】

int fun( STREC *a,STREC *b,int l, int h ) {

int i,j=0;

for(i=0;i

if(a[i].s>=l&&a[i].s<=h)

/*将分数高于l,低于h的学生记录存入结构体数组b中*/ b[j++]=a[i];

return j; /*返回分数范围内的学生人数*/ }

【微分析】

本题使用循环判断结构实现程序操作,循环语句用于遍历结构体数组,条件语句用于判断当前元素是否符合条件,若符合条件则将其存入结构体数组b中。 第28套 上机操作题

一、程序填空题

【微答案】

(1)std[i].year (2)std[i] (3)n 【微分析】

本题要求从给定的人员数据中找出与指定出生年份相同的记录存入k中,并返回符合条件的人数。 填空1:此空判断结构体变量中的年份与year是否相等,所以应填std[i].year。 填空2:把符合条件的记录依次存入实参k中,所以应填std[i]。 填空3:函数返回符合满足条件的人数,所以应填n。 二、程序修改题

【微答案】

(1)IsPrime(int n) (2)if(!(n%i)) 【微分析】

(1)函数定义格式错误,函数定义时后面不能加\;\,所以应该去掉分号。

(2)根据题意可知,if条件语句判断n是否可以整除i,如果不能整除则为质因子,所以if!(n%i) 应改为 if(!(n%i))。 三、程序设计题

【微答案】

fun(STU a[], STU *s) {

int i;

*s=a[0];

for(i=0;is

}

【微分析】

本题的流程是先使s指向第1名学生,利用循环语句遍历所有学生的成绩,利用条件语句判断当前学生成绩是否最高,所以if语句的条件是s->ss\等价于\.s\。 第29套 上机操作题

一、程序填空题

【微答案】

(1) struct student (2) a.name (3) a.score[i] 【微分析】

填空1:函数定义时,类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。该题中,用结构类型定义函数类型。

填空2和填空3: 此处考查结构体变量成员的表示方法a、name和a、score[i]分别表示学生的姓名和成绩。

二、程序修改题

【微答案】

(1)if(p==n) return -1; (2)a[i]=a[i+1]; 【微分析】

(1)需要确定if条件语句的条件表达式,发现变量p大写,C语言中变量是区别大小写的。 (2)删除数列中的元素,删除后,后面的元素依次前移一个位置,因此此处应为a[i]=a[i+1]。 三、程序设计题

【微答案】

void fun(int a, int b, long *c) {

*c=a/10+(b)*10+(a)*100+(b/10)*1000; }

【微分析】

本题中主要的问题是如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数,分别用10对它们求余可得到它们的个位数。得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。注意:使用c时要进行指针运算。 第30套 上机操作题

一、程序填空题

【微答案】

(1) ->sno (2) ->name (3) &t 【考点分析】

本题考查:结构变量成员的表示方法;strcpy函数;函数调用。 【微分析】

填空1:给b所指结构体变量学生学号赋值。

填空2:通过strcpy字符串拷贝函数修改b所指结构体变量学生姓名。

填空3:由于函数fun的形参是指针型变量,所以在main中调用函数fun的参数应为指针或地址。 二、程序修改题

【微答案】

(1)double fun(double a,double x0) (2)if(fabs(x1-x0)>=0.00001) 【微分析】

用C语言求平方根的方法一般有两种经典的算法,分别是迭代法和递归法,本题要求仅用递归法。该程序采用了if语句,错误在于if语句的判断条件,程序的含义是当迭代结果差大于误差时进行循环,故正确的答案应该是if(fabs(x1-x0)>=0.00001)。 三、程序设计题

【微答案】

double fun( STREC *a, STREC *b, int *n ) {

int i;

double av=0.0; *n=0;

for(i=0;i

av=av/N; /*求平均值*/ for(i=0;i

{ b[*n]=a[i];*n=*n+1;} /*将高于等于平均分的学生存入b所指存储单元中,并统计人数*/ return av; /*返回平均分*/ }

【微分析】

本题中第1个循环的作用求出所有分数的总和,然后进行av=av/N后得到平均值。第2个循环的作用是将大于等于平均分的学生存入b所指存储单元中。注意同一结构体变量之间可以互相赋值。

本程序中直接用*n来表示b的下标,注意开始时要给*n赋初值0,且使用时不能少*号,因为单独的n是一个指针变量,而我们要用的是它所指向的存储单元中的值。 第31套 上机操作题

一、程序填空题

【微答案】

(1) *fw (2) str (3) str 【微分析】

填空1:定义函数,函数的形参是一个文件类型的指针。 填空2:此处考查fputs函数的形式,应填入str。

填空3:依据printf函数的格式,输出字符串内容,即printf(\,str);。 二、程序修改题

【微答案】

(1)void fun(long s,long *t) (2)sl=sl*10; 【微分析】

(1)主函数中调用函数的参数为地址,因此函数fun的形式参数应为指针类型。

(2)重新组合一个数,从个位开始,然后十位,依次类推,因此每增加一位数,原数值需乘以10,即s1=s1*10;。

三、程序设计题

【微答案】

int fun( STREC *a, STREC *b ) {

int i,j=0,min=a[0].s; for(i=0;ia[i].s)

min=a[i].s; /*找出最小值*/ for(i=0;i

b[j++]=a[i]; /*找出成绩与min相等的学生的记录,存入结构体b中*/ return j; }

【微分析】

本题中第一个循环语句的作用是遍历数组求出最低分数,第二个循环语句的作用是将数组中的元素与最低分比较,查找是否存在与最低分相等的成绩。 第32套 上机操作题

一、程序填空题

【微答案】

(1)fp (2) == (3) fp 【微分析】 填空1:while循环语句的循环条件是判断文件是否结束,配合feof函数来完成,其一般形式为:feof(文件指针);。

填空2:根据题目要求确定if语句条件表达式的内容,满足条件后跳出循环。

填空3:文件定位函数fseek(),调用形式;fseek(文件指针,位移量,起始点);,此处文件指针是fp。 二、程序修改题

【微答案】

(1)n=strlen( aa ) ; (2)ch=aa[i];

【微分析】

插入排序算法:先对字符串中的前两个元素进行排序,然后第三个元素插入到前两个元素中,三个元素依然有序,依次类推,完成排序。

(1)此处考查strlen函数的格式,应改为strlen(aa)。

(2)程序中并没有定义变量c,该语句的作用是将元素a[i]的值赋给中间变量ch,以与其他元素进行比较并交换,所以应改为ch=a[i]。 三、程序设计题

【微答案】

double fun( STREC *h ) {

double max=h->s;

while(h!=NULL) /*通过循环找到最高分数*/ {if(maxs) max=h->s; h=h->next; }

return max; }

【微分析】

本题使用循环语句遍历链表中的每个结点,用判断语句比较结点数据的域大小。注意,h是一个指向结构体类型的指针变量,若要引用它所指向的结构体中的某一成员时,要用指向运算符\->\。 第33套 上机操作题

一、程序填空题

【微答案】

(1)0 (2) 10*x (3)n/10 【微分析】

填空1:定义变量t用来存放某数的各个位数值,此处判断t是否为偶数,即对2求余结果是否为0。 填空2:将t作为x的个位数,原来x的各个位上升1位,即x=10*x+1。 填空3:每循环一次,通过除法运算,去掉数值最后一位。 二、程序修改题

【微答案】 (1)*t=0;

(2)if(d%2!=0)或if(d%2==1) 【微分析】

(1) 由函数定义可知,变量t是指针变量,所以对t进行赋初值0是不对的。因为t指向的是存放新数的变量,所以此处应给新数赋初值0,即*t=0。

(2) 变量d表示数s各个位上的数,此处的if条件应为判断d是否为奇数。 三、程序设计题

【微答案】

void fun(char p1[], char p2[]) {

int i,j;

for(i=0;p1[i]!='\\0';i++) ; for(j=0;p2[j]!='\\0';j++) p1[i++]=p2[j]; p1[i]='\\0'; }

【微分析】

本题用两个循环完成操作,第1个循环的作用是求出第1个字符串的长度,即将i指到第1个字符串的末尾。第2个循环的作用是将第2个字符串的字符连到第1个字符串的末尾。最后在第1个字符串的结尾加上字符串结束标识′\\0′。 第34套 上机操作题

一、程序填空题

【微答案】

(1) 1 (2) s[k]或*(s+k) (3) c 【考点分析】

本题考查:指针型变量;if…else语句;赋值语句。 【微分析】

填空1:函数fun中变量n统计字符的长度,假如长度为偶数,则k=n-1;假如长度为奇数,则k=n

-2,使得下标为奇数的最后一个元素有效 (不是′\\0′)。

填空2:了解变量k的作用后,则将最右边的奇数位置的数赋值给变量c。 填空3:将最后一个下标为奇数的元素移到第一个奇数位置。 二、程序修改题

【微答案】 (1)long s=0, t=0; (2)t=t/10; 【微分析】

(1) t用来存放每次循环后的多位数,第一次循环时,t应当是个位数,所以t的初始值应为0。 (2) 根据题意,这里不需要求余数,而是要去掉个位数,重新组合一个数,因此应用除法运算。 三、程序设计题

【微答案】

void fun(char *tt, int pp[]) {

int i;

for(i=0;i<26;i++)

pp[i]=0; /*初始化pp数组各元素为0*/ for(;*tt!='\\0';tt++)

if(*tt>='a'&&*tt<='z') pp[*tt-'a']++; }

【微分析】

要求统计在tt所指字符串中'a'~'z'26个小写母各自出现的次数,并依次放在pp所指数组中。首先使用for循环语句初始化pp数组中分别用来统计26个字母的个数,再使用循环判断语句对tt所指字符串中的字符进行逐一比较操作,同时存入相对应的pp数组中。 第35套 上机操作题

一、程序填空题

【微答案】

(1)j++或j+=1或++j或j=j+1 (2)s[i]=t1[i] (3) j 【微分析】

填空1:根据函数fun中的内容可知,数组t1存储了s中的非数字字符,数组t2存储了s中的数字字符,为了存储下一个数字字符,下标j要进行加1操作。

填空2:将s串中的数字与非数字字符分开后,要先将非数字字符放入字符串s中,因此填入s[i]=t1[i]。 填空3:最后将数字字符加到s串之后,并且i要小于数字的个数j。 二、程序修改题

【微答案】

(1)for (j = i + 1; j < 6; j++) (2)*(pstr + i) = *(pstr + j) ; 【微分析】

(1)此处考查for语句的格式,各表达式之间应用\;\割开。

(2)此处考查用指针表示数组元素的方法,*(pstr+I)表示pstr所指向数组的第I个元素,同理*(pstr+j)表示pstr所指向数组的第j个元素。 三、程序设计题

【微答案】

int fun(char *ss, char c) {

int i=0;

for(;*ss!='\\0';ss++) if(*ss==c)

i++;/*求出ss所指字符串中指定字符的个数*/ return i; }

【微分析】

从字符串中查找指定字符,需要使用循环判断结构,循环语句用来遍历字符串,循环条件为字符串没有结束,即当前字符不是′\\0′,判断语句用来判断当前字符是否为指定字符。最后返回指定字符的个数。 第36套 上机操作题

【微答案】 (1)int i, sl;

(2)t[i]=s[sl-i-1]; 【微分析】

(1)变量s1没有定义。

(2)该循环实现将s串中的字符逆序存入t串中,t[i]对应s串中的s[sl-i-1]。 三、程序设计题

【微答案】

void fun(int a, int b, long *c) {

*c=a+(b)*10+(a/10)*100+(b/10)*1000; }

【微分析】

本题的主要问题是如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数,分别用10对它们求余可得到它们的个位数。得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。注意:使用c时要进行指针运算。 第45套 上机操作题

一、程序填空题

【微答案】

(1)k (2)N-1 (3)temp 【微分析】

填空1:外循环p的值为数组移动的次数,试题要求第k列左移,则需要移动的次数为k,所以应填k。 填空2:矩阵共N列,所以应填N-1。

填空3:临时变量temp中存放的值为数组最左边元素的值,需要把temp放到数组的末尾,即放到a[i][N-1]中,所以应填temp。 二、程序修改题

【微答案】

(1)void fun(int a[][M], int m) (2)a[j][k] = (k+1)*(j+1); 【微分析】

(1)在函数体fun中可知,a是一个字符串数组型变量,设置实参时,用**a表示是错误的,所以应改为void fun(int a[][M], int m)。

(2)根据输出的结果可知,应改为a[j][k]=(k+1)*(j+1);。 三、程序设计题

【微答案】

void fun(int a, int b, long *c) {

*c=(a)*1000+(b)*100+(a/10)*10+(b/10); } 【微分析】

本题是给出两个两位数的正整数分别取出各位上的数字,再按条件组成一个新数。取a十位数字的方法a/10,取a个位数字的方法a。同理可取出整数b的个位数和十位数。 第46套 上机操作题

一、程序填空题

【微答案】

(1) struct student * (2) a->score[i] (3) a 【微分析】

填空1:函数定义时,类型标识符指明了本函数的类型,我们前面已经多次提到,函数的类型实际上是函数返回值的类型。该题中,用结构指针变量作为函数类型标识符。

填空2: 通过循环语句对指针a所指结构体变量中的3门成绩进行修改,所以此处为a->score[i]。 填空3:通过return语句将形参a返回给主调函数。 二、程序修改题

【微答案】

(1)char *fun(char (*sq)[M]) (2)return sp; 【微分析】

函数fun的形参为字符串指针数组,每个元素指向一个长度为M的字符串,要找出其中最长的字符串,可先假设指针数组的第1个元素所指的字符串最长,之后对字符串指针数组进行遍历,若遇字符串长度大于待定最长字符串的长度,则令该字符串为待定最长字符串,如此循环直至指针数组末尾,即可得到最长字符串的地址。

(1)此处是函数定义错误,根据返回值类型可知该函数应定义为字符型指针函数。 (2)由for循环体可知,指针sp指向长度最长的字符串,因此应返回sp。 三、程序设计题

【微答案】

void fun(int a, int b, long *c) {

*c=a+(b/10)*10+(a/10)*100+(b)*1000; }

【微分析】

本题的主要问题如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数(a/10),分别用10对它们求余可得到它们的个位数(a)。得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。注意:使用c时要进行指针运算。 第47套 上机操作题

一、程序填空题

【微答案】

(1) \ (2) fs (3) ft 【微分析】

填空1:本题考查对文件操作的掌握。打开一个文件的调用方式是,fs=fopen(文件名,使用文件方式),以只读的方式打开文件,所以文件打开方式为\。

填空2:while循环语句中,循环条件通过feof()函数来检测是否到文件结尾。

填空3:fputc()函数用于将一个字符写到磁盘文件上去,调用形式为:fputc(要输出的字符,文件指针)。 二、程序修改题

【微答案】 (1)if(d%2==0) (2)s/=10; 【微分析】

(1)分析程序,在if的条件表达式中,不应该出现赋值运算符\=\,应使用\==\运算符。 (2)这里是一个运算符的错误,表示除法的运算符是\。 三、程序设计题

【微答案】

void fun(char *s, char t[]) {

int i,j=0;

for(i=0;s[i]!='\\0';i++)

if(i%2==0 && s[i]%2==0) /*将s所指字符串中下标和ASCII码值都为偶数的字符放入数组t中*/

t[j++]=s[i];

t[j]='\\0'; /*在字符串最后加上结束标识*/ }

【微分析】

本题要求删除除了下标为偶数同时ASCII码值也为偶数的字符,即保留下标为偶数同时ASCII码值也为偶数的字符。循环语句用于遍历字符串,条件语句用于判断当前字符是否符合要求。注意判断条件是下标为偶数,同时ASCII码值也为偶数,所以应使用逻辑与\运算符。 第48套 上机操作题

一、程序填空题

【微答案】

(1) fp (2) fclose(fp) (3) fname 【微分析】

填空1:fprintf函数的形式是:fprintf(文件指针,格式字符串,输出表列);,所以填入文件指针fp。 填空2:文件一旦使用完毕,应使用关闭函数fclose()将文件关闭,以避免发生文件数据丢失等错误。 填空3:fopen函数用来打开一个文件,其一般形式为:文件指针名=fopen(文件名,使用文件方式);因此应填入文件名fname。 二、程序修改题

【微答案】

(1)for(i=j+1;i

该程序是对n个无序数实现从小到大的排序,先找出整数序列的最小项,置于指针第1个元素的位置;再找出次小项,置于第2个元素的位置;之后顺次处理后续元素。

(1)数组的长度为n,所以最后一个元素的下标值为n-1,i的取值范围应该包括此下标值。 (2)p是中间变量,存放值较小的元素下标。 三、程序设计题

【微答案】

void fun(int a, int b, long *c) {

*c=a/10+(b/10)*10+(a)*100+(b)*1000; }

【微分析】

本题的主要问题是如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数,分别用10对它们求余可得到它们的个位数。得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。注意:使用c时要进行指针运算。 第49套 上机操作题

一、程序填空题

【微答案】

(1) STYPE (2) FILE (3) fp 【微分析】

填空1:根据主函数中的调用函数可知,函数的形参应为结构体类型,因此填入STYPE。 填空2:fp是指向文件类型的指针变量,因此填入FILE。

填空3:函数fwrite调用的一般形式为\,size,count,fp);\。

buffer:是一个指针变量,在fread函数中它存放输入数据的首地址,在fwrite函数中,它存放输出数据的首地址。

size:表示数据块的字节数。 count:表示要读写的数据块数。 fp:表示文件指针。 二、程序修改题

【微答案】

(1)for ( i=0; i

(1)字符串长度为sl,但数组下标从0到sl-1,因此不包括sl。

(2)正序和逆序字符串都加入了t串中,此时t串中最后一个元素的下标为2*s1-1,所以在2*s1下标处加入字符串结束标识'\\0'。 三、程序设计题

【微答案】

void fun(int a, int b, long *c)

{ /*b 获取b的个位,a/10 获取a的十位,a 获取a的个位,b/10 获取b的十位*/ *c=b+(a)*10+(b/10)*100+(a/10)*1000; }

【微分析】

本题中主要的问题是如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数,分别用10对它们求余可得到它们的个位数。得到后对应乘以1000、100、10、1,就可得到c的千位数、百位数、十位数和个位数。注意使用c时要进行指针运算。 第50套 上机操作题

一、程序填空题

【微答案】

(1)&& (2)'A' (3)ch 【微分析】

填空1:if条件表达式的考查,判断ch是否为小写字母,因而本空因该填写&&。 填空2:大写转换小写,大写转小写ASCII+32,因此本空应填'A'。

填空3:按题意若是其他字符则保持不变,并返回。此空要表达的就是既不是大写字母也不是小写字母,因而此空应该填写ch。 二、程序修改题

【微答案】

(1)void fun(int *a) (2)a[j]=a[j-1]; 【微分析】

(1)由函数的调用形式可知,函数fun的形参变量应为指针类型。

(2)每次循环都将最后一个元素取出,使前面的元素向后移动一位,因此为a[j]=a[j-1];。 三、程序设计题

【微答案】 int fun(int n) {

int s=0,i;

for(i=2;i<=n-1;i++) /*将n减1累加*/ if(n%i==0) s+=i; return s; }

【微分析】

本程序的实现步骤为:首先遍历从2~n-1的所有整数;然后用条件语句找出能被n整除的所有整数,并累加求和;最后返回值。 第51套 上机操作题

一、程序填空题

【微答案】

(1)48 (2)s++ (3)sum 【微分析】

本题是把字符串中是数字字符转换成对应的数值并进行累加。

填空1:'0'字符对应的ASCII码值是48,因此数字字符转换成对应数值时只要减去48,即是该数字字符对应的数值,所以应填48。

填空2:判断完一个字符之后,将字符串指针移到下一个位置,所以应填s++。 填空3:返回累加和sum,所以应填sum。 二、程序修改题

【微答案】

(1)if((k==0)||(k==0)) (2)}

【微分析】

(1)C语言中,x能被y整除的表示方法是x%y==0,而不是题目中所表示的x%y=0。所以,if((k=0)||(k=0))修改后的结果应该是答案所示信息。

(2)程序中缺少程序完整所需的\,此类信息在做题时一定要注意,可以在做题前先运行一下程序,这样明显的错误一般都会有错误信息显示出来。比如丢失\的错误信息是\statement missing } in function fun\。 三、程序设计题

【微答案】

double fun( int n) {

double sum=0.0; int i;

for(i=21; i<=n; i++)

if((i % 3==0) && (i % 7==0)) sum+=i; return sqrt(sum); }

【微分析】

本题考查算术运算的算法,首先利用一个for循环判断小于n且能同时被3和7整除的整数,并将满足条件的整数累加到sum,之后调用sqrt函数计算sum的平方根,并作为函数的返回值。 第52套 上机操作题 一、程序填空题

【微答案】

(1)a[i] (2)a[i] (3)0 【微分析】 填空1:因为本题的方法是首先从素数2开始,将所有2的倍数的数从中删去(把数表中相应位置置零),可知本空应填a[i]。

填空2:while循环表示接着从数表中找下一个非零数,并从表中删去该数的所有倍数,此空填a[i]。 填空3:因为要统计表中素数个数,因而只需把置零的数排除开来,因而此空填写0。 二、程序修改题

【微答案】 (1)y=1; (2)d=a-i; 【微分析】

这道题是历年的经典考题,也是验证哥德巴赫猜想的变体。原来的思路是:任意一个大于等于6的偶数都可以分解为两个素数之和,n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如果都是,则为一组解;如果n1不是素数,就不必再检查n2是否为素数。先从n1=3开始,检验n1和n2(n2=N-n1)是否为素数;然后使n1+2 再检验n1,n2是否为素数,……直到n1=n/2为止。 三、程序设计题

【微答案】

double fun(int n) {

int i;

double sum=0.0;

for(i=1;i<=n;i++) if(i%5==0||i%9==0) sum+=1.0/i; return sum; }

【微分析】

本程序中循环语句用来遍历n以内的所有自然数,条件语句用来判断该数是否能被5或9整除,注意此处判断条件中应使用逻辑或\运算符。变量sum累加符合要求的数的倒数和。 第53套 上机操作题

一、程序填空题

【微答案】

(1) s[i] (2) '9' (3)*t=n 【考点分析】

本题考查:for循环语句;if语句条件表达式;指针变量。 【微分析】 填空1:通过for循环语句,来判断是否到字符串结尾,变量i用来存放字符串数组下标,则应填入s[i]。 填空2:题目要求判断数字字符,所以此处应填入'9'。

填空3:将数字字符个数存入变量t中,这里需注意变量t是指针变量。 二、程序修改题

【微答案】

(1)t = *x ; *x = y ;

(2)return(t) ;或return t; 【微分析】

首先,定义变量t作为中间变量,然后进行数据交换,注意参数x是指针变量,交换时应使用*x,最后确定返回值,根据代码b=fun(8a,b)可以知道返回值将赋给变量b,而b中应存放交换前*x中的值,所以函数应返回变量t。 三、程序设计题

【微答案】

void fun (int *a, int *n) {

int i,j=0;

for(i=1;i<=1000;i++) /*求1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数,并放入数组a中*/

if((i%7==0||i==0)&&iw!=0) a[j++]=i; *n=j; }

【微分析】

该题需要运用循环判断结构来实现,其中循环语句比较容易,只要确定循环变量的范围即可,下面我们来看判断语句,题目要求找出能被7或11整除,但不能同时被7和11整除的所有整数。能同时被7和11整除的整数一定能被77整除,且不能被77整除的数不一定就是能被7或11整除的数所以可得出程序中的if()语句。注意:(i%7==0||i==0)两边必须要有小括号。 第54套 上机操作题

一、程序填空题

【微答案】

(1)i+1 (2)k=j (3)t 【微分析】

填空1:根据for循环要确定循环的初值,再根据选择排序可知此空应填写i+1。 填空2:如果k比j大,则应该把k=j。

填空3:通过字符串复制函数strcpy,使得ss[i]和ss[k]交换位置。 二、程序修改题

【微答案】

(1)void fun(char *str, char ch ) (2)if ( *str != ch ) (3)str[1] = 0; 【微分析】

(1)第1个形参应该是字符串类型,所以应改为void fun(char *str, char ch)。 (2)应该是判断不相等,所以应改为if(*str!=ch)。

(3)赋值字符串结束符错误,所以应改为str[1] = 0;。 三、程序设计题

【微答案】

void fun(char*s) {

char ch; int i,m,n; i=0;

m=n=strlen(s)-1;

/*将第i个和倒数第i个数互换,但循环的次数为数组长度的一半*/ while(i<(n+1)/2) { /*使用中间变量叫唤*/ ch=s[i]; s[i]=s[m]; s[m]=ch; i++; m--; }

} 【微分析】

将字符串中的内容逆置,实际上就是将第一个字符和最后一个字符交换,再将第二个字符与倒数第二个字符交换,依此类推,直到中间的字符为止。因此,长度为n的字符串需要交换的次数为n/2。

本程序使用while语句表示每一个字符,然后将前后对应的字符进行交换。 第55套 上机操作题

一、程序填空题

【微答案】

(1)t,s (2)s[i] (3)0或'\\0' 【微分析】

本题是在矩阵中找出在行上最大、在列上最小的那个元素。

填空1:当给定的长度n大于该字符串s的长度,那么把该字符串直接拷贝到t就可以了,所以应填t,s。

填空2:使用for循环语句,把最右边n个字符依次添加到t中,所以应填s[i]。 填空3:字符串操作结束,需要给t加一个字符串结束符,所以应填0或'\\0'。 二、程序修改题

【微答案】 (1)if(i%k==0)

(2)if(k==i) 【微分析】

(1)判断当前数是否为素数,若存在一个数(除1和其自身)能整除当前数,则跳出本次循环,所以if条件应为i%k==0。

(2)如果i是素数,则循环结束时k==i,将该值返回。 三、程序设计题

【微答案】

void fun (int x, int pp[], int *n) {

int i,j=0;

for(i=1;i<=x;i=i+2) /*i的初始值为1,步长为2,确保i为奇数*/ if(x%i==0) /*将能整除x的数存入数组pp中*/ pp[j++]=i;

*n=j; /*传回满足条件的数的个数*/ }

【微分析】

本题考查:偶数的判定方法;整除的实现。

本题题干信息是:能整除x且不是偶数的所有整数。循环语句中变量i从1开始且每次增2,所以i始终是奇数。

整除的方法,在前面已经讲过多次,这里就不再赘述了。对于本题目要求的不是偶数的判定方法,即该数对2求余不为0。除以上方法外,还可以通过for循环语句直接把偶数筛出去,确保参与操作的数均为奇数。

第56套 上机操作题

一、程序填空题

【微答案】

(1)ss[i] (2)n+j (3)1 【微分析】

填空1:strlen(字符数组),此函数计算以字符数组为起始地址的字符串的长度,并作为函数值返回。但这一长度不包括串尾的结束标志'\\0',因而在此处应该计算一下每个字符串的长度,本空应该填写ss[i]。

填空2:本题要求在字符串右边用字符*补齐,因而本空应该填写n+j。 填空3:在字符串最后的字符都应以'\\0'结束,因而本空应填1。 二、程序修改题

【微答案】 (1)if(*p==' ')

(2)*(p-1)=toupper(*(p-1)); 【微分析】

(1)本题重点考查考生对指针的理解,当引用指针指向的元素时,应使用指针运算符*号。 (2)当p指向空格时,将前面的字符转换为大写,因此此处应为*(p-1)而不是*p。 三、程序设计题

【微答案】

void fun(char *s,int num) { char ch ; int i, j ;

for(i = 1 ; i < 6 ; i++) for(j = i + 1 ; j < 6 ; j++) {

if(*(s + i) < *(s + j)) {

ch = *(s + j) ;

*(s + j) = *(s +i) ; *(s + i) = ch ; } } }

【微分析】

本题要求对长度为7的字符串,除首、尾字符外,将其余5个字符按ASCⅡ码降序排列,因而要用双重循环进行排序。注意第1个循环的变量的初值i=1,第2个循环的变量的初值为j=i+1;这是因为题目要求除首、尾字符外,将其余5个字符按ASCⅡ码降序排列。

第57套 上机操作题

一、程序填空题

【微答案】

(1) q (2) next (3) next 【微分析】

填空1:使用free函数,释放q所指的内存空间,其一般格式为:free(指针变量)。 填空2和填空3:删除链表中符合条件结点后,指针要指向下一个结点。 二、程序修改题

【微答案】 (1)p=j ; (2)p=i;

【微分析】

(1)这里是一个语法错误,缺少一个\;\号。

(2)p用来存放进行比较的两个数组元素中,较小元素的下标,因此此处应为p=i。 三、程序设计题

【微答案】

void fun ( int m, int *a , int *n ) {

int i,j=0;

for(i=1;i<=m;i++)

if(i%7==0||i==0) /*求出1到m(含m)之内能被7或11整除的所有整数放在数组a中*/ a[j++]=i;

*n=j; /*返回这些数的个数*/ }

【微分析】

本题应使用循环判断语句实现,首先要确定循环变量的取值范围,题且要求找到1~m之间附合要求的数,所以循环变量的取值范围为1~m。if条件语句用来对每一个数进行判断,注意题目要求能被7或11整除,因此条件表达式中应使用逻辑或\运算符。 第58套 上机操作题

一、程序填空题

【微答案】

(1)1.0 (2)-1 (3)t 【微分析】

填空1:在这里要给f赋初值,由计算表达式可知此空应该填1.0。 填空2:在计算的过程中正负号是交错的,因而此空填写-1。

填空3:本题考查了复合赋值运算,由本题求表达式f(x)的值可知此空应该填写 t。 二、程序修改题

【微答案】

(1)for(i=1;i<=3;i++) (2)if(k>=0&&k<=6) 【微分析】

(1)红球数i的总数为3,因为组合中必须有红球,所以i的值不能为0。

(2)该if语句用来限定组合中黑球的数量,黑球的总数为6,且组合中可以没有黑球,因此判断条件应为:k>=0&&k<=6。 三、程序设计题

【微答案】

double fun(int n) {

double t,sn=1.0; int i,j;

for(i=1;i<=n;i++) {

t=1.0;

for(j=1;j<=i;j++) t*=j; sn+=1.0/t; } return sn;

} 【微分析】

在程序中输入n后,以前n项的阶乘作为分母递加,由于t是浮点型数据,所以写为复合赋值语句s +=1.0/t;。for循环的作用是每一次循环将1.0/t与sn相加,并将值存入sn中。 第59套 上机操作题

一、程序填空题

【微答案】

(1) n (2) break (3) break 【微分析】

填空1:要统计长整数n的各个位上出现数字1、2、3的次数,就需要判断各个位上的数是多少。通过n除以10求余,可得到个位上的数,所以填入n。

填空2和填空3:switch语句是多分支选择语句,在每个分支中要加入break,不然会依次执行后面的分支。continue语句的作用是结束当前分支的运行,而break语句的作用是结束整个switch语句的运行。 二、程序修改题

【微答案】 (1)if(t==0)

(2)*zero=count; 【微分析】

(1)根据题意,此处应该是条件语句,而不是赋值语句,并且在条件表达式中不会出现\=\号。 (2)此处是指针赋值的一个简单错误,对指针指向的元素进行赋值应使用*号。 三、程序设计题

【微答案】 double fun(int n) {

double sum=0,tmp=1; int i;

for(i=1;i<=n;i++) { tmp=tmp*i; sum+=1.0/tmp; }

return sum; }

【微分析】

本题要求计算并输出多项式的值,通式为:1/(1*2*……*n),在给出的参考程序中,由于函数的返回值为双精度型,所以定义sum、tmp为双精度型,再对符合条件的n,使用中间变量tmp求出1到n的累乘值,即题目中每个多项式中分子的值,再通过sum+=1.0/tmp;计算出所有多项式之和,最终返回值。 第60套 上机操作题

一、程序填空题

【微答案】

(1) 0 (2) n (3) (t*t) 【微分析】

填空1:程序开始定义了变量s,但没有对其进行初始化,根据公式及后面的程序可知变量s用来存储公式的前n项和,因此该变量应初始化为0。

填空2:通过for循环语句将表达式各项进行累加,结果存于变量s中,循环变量i的取值范围为1~n。 填空3:根据题目要求确定表达式通项,前面已定义t=2.0*i,因此此空应填(t*t)。 二、程序修改题

【微答案】

(1)for(i=0;str[i];i++) (2)if(substr[k+1]== '\\0') 【微分析】

我们先看循环条件for(i = 0, str[i], i++),不难发现此处for循环语句的格式有误,其中表达式之间应以\;\相隔;同时很容易发现if条件语句处的关键字书写错误。 三、程序设计题

【微答案】

double fun ( double eps) {

double s=1.0,s1=1.0; int n=1;

while(s1>=eps) /*当某项大于精度要求时,继续求下一项*/ {s1=s1*n/(2*n+1); /*求多项式的每一项*/ s=s+s1; /*求和*/ n++; }

return 2*s; }

【微分析】

首先应该定义double类型变量,并且赋初值,用来存放多项式的某一项和最后的总和。从第2项开始以后的每一项都是其前面一项乘以n/(2*n+1),程序中用s1来表示每一项,s表示求和后的结果。需注意s1和s的初值都为1.0,因为循环变量从第二项开始累加。 第61套 上机操作题

一、程序填空题

【微答案】

(1)1.0 (2)1 (3)i 【微分析】

填空1:本题要求给double型变量t赋初值,从for循环中我们知道,t用来存放累乘的结果,因此t的初值应该为1。

填空2:考查for循环变量的范围,注意本题要求计算f(x)的前n项,即计算,所以循环变量i应从1递增至n-1,因此此空应填1。

x填空3:t用来存放每次循环增量,分析公式可知,后一项总是在前一项的基础上乘以一个i,因此此空应填i。

二、程序修改题

【微答案】 (1)k=i;

(2)b=k; 【微分析】

(1)i是当前要被判断的数,因为i是循环变量,所以将i的值赋给k再进行运算。

(2)b是存放十位上的数,但前面已经除以了一个10,即原数的十位已经变成了个位,所以这里用求余就可以了。 三、程序设计题

【微答案】

double fun(double x[10]) {

double x1=0.0,s=0.0; int i;

for(i=0;i<10;i++) x1=x1+x[i];

x1=x1/10; /*求10个数的平均值*/ for(i=0;i<10;i++)

s=s+(x[i]-x1)*(x[i]-x1);

return sqrt(s/10); /*求10个数的方差*/ }

【微分析】

这是一道求公式的值的题目,程序中第1个循环用来完成求10个数的总和,接着再用x1=x1/10来求出平均值。第2个循环用来求累加和的值,最后将累加和的平方根返回,注意sqrt函数的应用。 第62套 上机操作题

一、程序填空题

【微答案】

(1)x (2)n (3)fabs(t) 【微分析】

填空1和填空2:f用来存放函数值,其初值为1.0+x,do...while循环用于累加后面的通项t,第一次循环时应为-x2/2,因此空1应为x,空2应为n。

填空3:由题目中可知do…while循环的条件,因而此空填写fabs(t)。

1?x?x2xn?1???2!(n?1)!

二、程序修改题

【微答案】

(1)for(i=1;i<=y;i++) (2)t=t00; 【微分析】

先用简单的思路理解一下该程序,如果当x=y=1时,程序的问题就很简单了,所以for语句的循环条件应该是for(i=1;i<=y;i++)。另外,t=t/1000;中的错误是混淆了\和\的定义,这样的细节问题曾多次出现,请考生务必引起注意。 三、程序设计题

【微答案】

double fun(double x) {

double s1=1.0,p=1.0,sum=0.0,s0,t=1.0; int n=1; do { s0=s1; sum+=s0; t*=n; p*=(0.5-n+1)*x; s1=p/t; n++;

}while(fabs(s1-s0)>=1e-6); return sum; }

【微分析】

本题要求计算并输出当x<0.97时多项式的值。解答这类题,首先应该分析多项式的特点, 由于从第二项开始的所有项都能把分子与分母用两个表达式进行迭代,所以可利用一个循环语句完成操作,循环条件为fabs(s1-s0)>=le-6。 第63套 上机操作题

一、程序填空题

【微答案】

(1) a (2) a (3) b 【微分析】 条件表达式,其一般形式为\表达式1? 表达式2: 表达式3\。其求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式3的值作为整个条件表达式的值。本题主要考查了条件语句的另一种形式:m>n ? m:n,只要把嵌套的语句分开,不难得出答案。 二、程序修改题

【微答案】 (1)c=c+32; (2)c=c+5; 【微分析】

(1)从ASCII码值表中可以看出,小写字母的ASCII码值比对应大写字母的ASCII码值大32,所以大写字母转换成小写字母要加32。

(2)将大写字母转换成对应小写字母之后,再将其转换成其后面的第5个字母,所以要加5。 三、程序设计题

【微答案】

double fun(int n) {

int i;

double s=0.0,s1=0.0; for(i=1;i<=n;i++)

{s1=s1+pow(i,0.5); /*求每一项*/ s=s+s1; /*按公式求出s*/ }

return s; }

【微分析】

本程序用s1来表示题中每个小括号内的值,第1项相当于有1个10.5(它还是1),第2项相当于第1项的值加上20.5,第3项相当于第2项的值加上30.5,……,依此类推。函数pow(x,y)的功能是求出x的y次方,该函数已在库函数中定义(即可直接使用)。程序中用变量s来表示总的结果,每次循环加1次s1,即加1项。 第64套 上机操作题

一、程序填空题

【微答案】

(1)j=2 (2)i (3)j 【微分析】

填空1:j的初始化要从2开始,因为要判断一个数是否为素数即将其除以从2开始的数字,看有没有被整除的。

填空2:如果碰到有个数字j可以被i整除,那么表示这个数不是素数,要用break直接结束循环,这个时候的j肯定小于i。

填空3:j>=i,表示在上面if(i%j==0)没有成功,所以会循环执行for(j=2;j=i,这样可以知道该数字i就是素数。 二、程序修改题

【微答案】

(1)int i,j=0,k,sum; (2)if(sum%4==2) 【微分析】

(1)变量j用于控制数组下标,使用前应初始化为0。

(2)这里混淆了\==\与\=\的区别,\==\是比较运算符,\=\是赋值运算符。 三、程序设计题

【微答案】

double fun(int n) {

int i;

double s=0.0; for(i=1;i<=n;i++)

s=s+(1.0/(2*i-1)-1.0/(2*i)); /*计算S=(1-1/2)+(1/3-1/4)+(1/(2n-1)-1/2n)*/ return s; } 【微分析】

对于求多项式值的题目,一般都使用循环语句来累加计算多项式的通项。本题中多项式的通项为1/(2n-1)-1/2n,循环变量的取值范围为1~n。注意,存放累加和的变量s要定义为实型,累加时要进行类型转换。

第65套 上机操作题

一、程序填空题

【微答案】

(1)*s (2)s++ (3)n 【微分析】

填空1:判断s所指向的字符串中的字符符合条件时,将当前字符存放到t指向的字符串中,所以应填*s。

填空2:判断完一个字符之后,将字符串的指针移到下一个位置,所以应填s++。 填空3:题目要求函数要返回符合条件的字符个数n,所以应填n。 二、程序修改题

【微答案】

(1) {int j, c=0;float xa=0.0; (2)if (x[j] >= xa) 【微分析】

(1)本题着重考察考生对C语言基本语法以及比较运算符的掌握情况。

(2)本题中的第一个错误:在C语言中,{}应成对出现,所以程序中的语句\j,c=0;float xa=0.0;\应改为\或相同作用的语句;

本题中的第二个错误:在C语言中,判断大于或等于的运算符应为>=,所以程序中的语句\应改为\或相同作用的语句。 三、程序设计题

【微答案】

float fun (int m, int n) {

float p, q=1.0; int i;

for(i=1;i<=m;i++) q*=i; p=q;

for(i=1, q=1.0; i<=n;i++) q*=i; p/=q;

for(i=1,q=1.0;i<=m-n;i++) q*=i; p/=q; return p; }

【微分析】

本题考查算术运算的算法,先建立一个jc函数来计算m的阶乘,函数中使用一个for循环来计算m的阶乘,并将计算结果作为函数的返回值。在fun函数中调用jc函数,来计算三个阶乘的除法。 第66套 上机操作题

一、程序填空题

【微答案】

(1) '\\0' (2) 0 (3) c 【微分析】

填空1:for语句循环条件是判断是否到达字符串结尾,即当前字符是否为'\\0'。 填空2:while语句用以确定字符串的长度,所以变量n赋初值为0。

填空3:题目要求如果找到与参数c相同的字符,就在后面插入一个相同的字符,所以找到后,应该给数组元素赋值,该题目给出参数为c。 二、程序修改题

【微答案】

(1)double sum=0.0; (2)sum/=c; 【微分析】

(1)变量定义错误,变量sum存放所有数据的和,应定义为double型。 (2)C语言中的除法运算符是\。 三、程序设计题

【微答案】 float fun(int n) {

int i,s1=0; float s=0.0;

for(i=1;i<=n;i++)

{s1=s1+i; /*求每一项的分母*/ s=s+1.0/s1; /*求多项式的值*/ }

return s; }

【微分析】

此类计算表达式值的程序,首先需要根据题意分析表达式的规律,得出通项,然后再完成程序语句。 本题中表达式的规律是1+2+…+n的倒数之和,那么可以通过for循环语句来实现第1项到第n项的变化。

这里其实就是累加算法,方法是先根据题目要求定义变量,注意该变量的数据类型,然后对其进行初始化操作,因为该变量作用是累加器,所以初始值应为0(或0.0,这里根据变量数据类型来确定),再通过for循环语句来完成累加过程。

本题中s1用来表示每一项的分母,每一项的分母都是由前一项分母加项数。注意:由于s1定义成一个整型,所以在s=s+1.0/s1中不能把1.0写成1。 第67套 上机操作题 一、程序填空题

【微答案】

(1)0 (2)j-- (3)j

【考点分析】

本题考查:数组元素的引用;for循环语句。 【微分析】 填空1:N×N矩阵,第一列元素表示为t[0][N-j-1],第一行元素表示为t[j][0],将第一列赋值给第一行,因此填入0。

填空2:for循环语句中,变量j的变化范围为从N-1递减到0,因此j做自减1操作。 填空3:最后将临时数组r中的元素赋值给矩阵最后一列。 二、程序修改题

【微答案】

(1)double f(double x) (2)return s ; 【微分析】

该程序的流程是:fun()函数对f(n)项循环累加,fun()函数采用条件选择语句计算函数f(x)的值。第一处错误在于未定义函数f(double x)的类型,因为返回值类型为double型,所以此处函数应定义为double。第二处错误的语法错误。 三、程序设计题

【微答案】

double fun( int m ) {

int i;

double s=0.0; for(i=1;i<=m;i++)

s=s+log(i); /*计算s=ln(1)+ln(2)+ln(3)+…+ln(m)*/ return sqrt(s); /*对s求平方根并返回*/ }

【微分析】

首先计算从1到m的对数的和,因此循环变量的范围是1~m,每次循环都进行一次累加求和。该题需要注意的是,log()函数的形式参数应当为double型变量,而用于循环的基数变量为整数,需要进行强制转换。在返回的时候求出平方根。 第68套 上机操作题

一、程序填空题

【微答案】

(1)i (2)ps[j] (3)tp 【微分析】

本题是按字符串的长短进行排序。

填空1:外循环每循环一次,k应保存当前的i值,所以应填i。

填空2:使用内循环对i+1后面的字符串长度进行比较,所以应填ps[j]。 填空3:此处的作用是交换两个变量的值,所以应填tp。 二、程序修改题

【微答案】

(1)double fun(int n) (2)return sum ; 【微分析】

(1)根据函数的返回值可知函数fun应定义为double类型。 (2)语法错误,缺分号。 三、程序设计题

【微答案】

double fun(double x, int n) {

int i;

double s=1.0,s1=1.0; for(i=1;i<=n;i++)

{s1=s1*i; /*各项中的阶乘*/ s=s+pow(x,i)/s1; /*按公式求出*/ }

return s; }

【微分析】

程序定义了变量s1和s,s1表示每项的分母(即各项的阶乘),s存放累加和。循环语句控制累加的次数,

在循环体中进行阶乘和累加操作,累加的结果存入s中。此处使用了求乘方函数pow(x,i),其含义是求x的i次方的值。 第69套 上机操作题

一、程序填空题

【微答案】

(1)*s (2)1 (3)k[n] 【微分析】

本题统计字符串中各字母的个数,建立了一个包括26个整型变量的数组,用来存储每个字母的个数。 填空1:isalpha函数的作用是判断当前字符是否为字母,tolower函数的作用是将当前字母转换为小写字母,所以应填*s。

填空2:把该字母出现的个数累加到指定的数组中,所以应填1。

填空3:max用来记录出现次数最高的字母的出现次数,如果当前该字母出现次数大于最大次数max,那么把该次数赋值给max,所以应填k[n]。 二、程序修改题

【微答案】

(1)double fun(int k) (2)return s ; 【微分析】

(1)此处为函数定义错误,根据返回值的类型可知函数类型标识符应为double。 (2)语法错误。 三、程序设计题

【微答案】

double fun(int n) {

int i;

double s=0.0;

for(i=1;i<=n;i++)

s=s+1.0/(i*(i+1)); /*求级数的和*/ return s; }

【微分析】

本题要求级数的和,由多项式的形式可知,应使用循环语句实现,循环的通项为1/n(n+1)。本程序首先定义了和变量及循环变量,然后运用一个for语句求出级数的和,最后将和变量s返回。 第70套 上机操作题

一、程序填空题

【微答案】

(1)s/N (2)j++ (3)-1 【微分析】

填空1:由原程序可知,av代表的是平均值,而平均值的求法是所有数的总和除以数的个数,因而本空应该填写s/N。

填空2:y数组代表暂时存放x数组,if(x[i]>av)表达的是当x数组中的数大于平均值时,应该把这些大于平均值的数放在y数组的前半部分,因而此空应该填y[j++]。

填空3:此空表明当x[i]不等于什么时,x[i]中的数要赋值给y数组,由题意可知此空只能填写-1。 二、程序修改题

【微答案】

void upfst( char *p) 【微分析】

主函数中fun函数的调用方式说明函数fun的参数应为指针类型。 三、程序设计题

【微答案】

double fun (int w[][N]) {

int i,j,k=0; double av=0.0;

for(i=0;i

if(i==0||i==N-1||j==0||j==N-1) /*只要下标中有一个为0或N-1,则它一定是周边元素*/

{av=av+w[i][j]; /*将周边元素求和*/ k++; }

return av/k; /*求周边元素的平均值*/ }

【微分析】

本题要求计算二维数组周边元素的平均值,for循环语句控制循环过程,if条件语句根据数组元素的下标判断该元素是否为二维数组的周边元素。

本题采用逐一判断的方式,周边元素的规律为下标中有一个是0或N-1,所以只要下标中有一个为0或N-1,那么它一定是周边元素。计算周边元素个数的方式是当给av累加一个值时,k也加1。 第71套 上机操作题

一、程序填空题

【微答案】

(1)N或20 (2)break (3)n 【微分析】

填空1:变量n用于存储数组的下标,要通过while语句对数组进行赋值,数组的容量为20,因此循环条件应为n<20。

填空2:通过一个for循环判断x是否与数组中已存的元素重复,若重复则跳出for循环结束。

填空3:若for循环是由break语句结束的,则x与数组中的元素重复,此时i必然小于n;若for循环是因为循环变量i递增到某值,而不再满足循环条件结束的,说明x的值与数组中的元素不重复,则此时i的值等于n。 二、程序修改题

【微答案】 (1)sum=0;

(2)scanf(\,&a[i][j]); 【微分析】

该题考查对循环语句的掌握和对数组概念的理解。本题的解题思路为:先从键盘输入一个3×3矩阵,然后循环累加,执行循环语句中的sum=sum+a[i][i];。因为变量sum用来存放累加后的结果,所以应对其初始化为0。第二处错误考查标准输入函数scanf的格式,被赋值的变量前要加上取地址符\。 三、程序设计题

【微答案】

void fun (int array[3][3]) {

int i,j,t;

for(i=0;i<3;i++) /*将右上三角和左下三角对换,实现行列互换*/ for(j=i+1;j<3;j++) {t=array[i][j];

array[i][j]=array[j][i]; array[j][i]=t; } }

【微分析】

要实现矩阵转置,即将右上角数组元素和左下角数组元素对换,本题通过数组元素交换方法,完成矩阵转置操作。

因为对矩阵转置后仍然存回其本身,所以只能循环矩阵中的一个角(本程序是右上半三角)。控制右上半三角的方法是在内层循环中循环变量j从i+1或i开始。 第72套 上机操作题

一、程序填空题

【微答案】

(1) && (2) 0或'\\0' (3) s[j]或*(s+j)

【微分析】填空1:if语句中的条件是判断是否为数字字符,数字字符的条件是既要大于等于\,同时还需要小于等于\,因此需要使用逻辑与\来连接。

填空2:while语句判断是否到达字符串的结尾,因此填入0(字符串结束标识'\\0')。 填空3:for语句使数字后的字符全都向后移一个单位,那么要使s[j+1]=s[j]。 二、程序修改题

【微答案】

(1)for(i=2;i<=m;i++)

(2)y+=1.0/(i*i);或y+=(double)1/(i*i); 【微分析】

(1)根据公式可以知道for循环语句中变量i的取值范围,应该包括m。

(2)变量y是一个double型变量,而i是整型变量,所以要进行类型转换,改为y+=1.0/(i*i)。 三、程序设计题

【微答案】

void fun ( int a[3][3], int b[3][3]) { int i,j;

for(i=0;i<3;i++) for(j=0;j<3;j++)

b[i][j]=a[i][j]+a[j][i];/*把矩阵a加上a的转置,存放在矩阵b中*/ }

【微分析】

行列数相等的二维数组的转置就是行列互换,即转置后的第i行第j列正好对应原矩阵的第j行第i列。本题使用双层循环实现矩阵的转置,并将计算结果存入矩阵B中,外层循环控制矩阵的行下标,内层循环控制矩阵的列下标。 第73套 上机操作题

一、程序填空题

【微答案】

(1)x[i]/N (2)j++或++j (3)i++或++i 【微分析】

填空1:av代表平均值,本题考查了怎样求平均值,因此本空应该填写x[i]/N。

填空2:通过for循环和if判断找到x[i]中比平均值小的数,并把这些值赋值给y[j],因此本空应该填写j++或者++j。

填空3:通过while循环语句,把x[i]中比平均值大的数放在数组y的后半部分,因此本空应该填写i++或者++i。

二、程序修改题

【微答案】

(1)void fun(char *s, int num[5]) (2)num[k]=0; (3)switch(*s) 【微分析】

switch语句说明如下:

(1)switch后的表达式,可以是整型或字符型,也可以是枚举类型。在新的ANSIC标准中允许表达式的类型为任何类型。

(2)每个case后的常量表达式只能是由常量组成的表达式,当switch后的表达式的值与某一个常量表达式的值一致时,程序就转到此case后的语句开始执行。如果没有一个常量表达式的值与switch后的值一致,就执行default后的语句。

(3)各个case后的常量表达式的值必须互不相同。

(4)各个case的次序不影响执行结果,一般情况下,尽量将出现概率大的case放在前面。

(5)在执行完一个case后面的语句后,程序会转到下一个case后的语句开始执行,因而必须使用break语句才能跳出。 三、程序设计题

【微答案】

int fun( int a [M][N]) {

int i,j,sum=0; for(i=0;i

if(i==0||i==M-1||j==0||j==N-1) /*只要下标中有一个为0或M-1或N-1,则它一定是周边元素*/

sum=sum+a[i][j]; /*将周边元素相加*/ return sum; } 【微分析】

本题采用逐一判断的方式,周边元素的规律是,其下标值中一定有一个是0或M-1或N-1。程序中循环语句用来控制数组的行和列,条件语句用来判断数组元素是否为周边元素。

第74套 上机操作题

一、程序填空题

【微答案】

(1)*av (2)i (3)x[j] 【微分析】

填空1:从原程序中可以看出*av代表的是平均值,而s/N表示的就是平均值,因此本空应该填*av。 填空2:if语句来判断找最接近平均值的数,因而此空应该填i。

填空3:题目要求将小于平均值且最接近平均值的数作为函数返回,而j表达的是最接近平均值的数在数组中的下标,因而本空应该填写x[j]。 二、程序修改题

【微答案】

(1)float fun(int n) (2)for(i=2;i<=n;i++) 【微分析】

(1)根据函数的返回值可知,函数应定义为float型。

(2)该题中函数fun的作用是计算数列前n项的和,而数列的组成方式是:第n项的分母是1加第n-1项的值,分子为1,如果循环累加按for(i=2;i

【微答案】

void fun(int a[][N], int m) {

int i,j;

for(j=0;j

a[i][j]=a[i][j]*m; /*右上半三角元素中的值乘以m*/ }

【微分析】

本程序实现将矩阵中右上半三角元素中的值乘以m,使用循环语句遍历数组元素,第1个循环用于控制行坐标,第2个循环用于控制列下标。 第75套 上机操作题

一、程序填空题

【微答案】

(1)std[] (2)PERSON (3)std 【微分析】

填空1:定义形参变量引用数组std,此时形参可以定义为指针变量,也可以定义为数组。由下文可知,程序是通过数组下标对数组元素进行操作的,因此形参应使用数组形式,而非指针形式。

填空2:程序使用变量temp交换结构体数组元素的值,因而temp应定义为PERSON型。 填空3:程序通过函数fun对数组std进行操作,因此函数的实参应为std。 二、程序修改题

【微答案】 (1)int k, q, i; (2)pt[i] = str[k][i]; 【微分析】

(1)关键字书写错误,定义整型变量的关键字应使用int,而非Int。

(2)数组元素表示错误,表示二维数组元素,应使用方括号将行坐标和列坐标分别括起来,即str[k,i]应改为:str[k][i]。 三、程序设计题

【微答案】

void fun (int a[][N]) {

int i,j;

for(i=0;i

a[i][j]=0; /*将数组左下半三角元素中的值全部置成0*/ }

【微分析】 对于N×N二维数组,如何表示其左下半三角元素,可以通过以下语句实现。

for(i=0;i

外层循环用来控制矩阵的行下标,内层循环控制矩阵的列下标。注意列下标的取值范围,因为要表示下三角元素,所以j的范围是0~i。 第76套 上机操作题

一、程序填空题

【微答案】

(1)STU (2)score[i] (3)&std 【微分析】

本题是利用结构体存储学生记录,对记录进行修改并由实参ss返回。 填空1:实参ss是一个结构型指针变量,所以应填STU。

填空2:该学生的各科成绩都乘以一个系数a,所以应填score[i]。

填空3:函数的调用,由于函数定义时使用的指针结构型变量,所以应填&std。 二、程序修改题

【微答案】 if(k>1)

【微分析】

语法错误,if条件表达式应写在小括号内。 三、程序设计题

【微答案】

void fun(int a[ ][N], int n) {

int i,j;

for(i=0;i

for(j=0;j<=i;j++)

a[i][j]=a[i][j]*n; }

【微分析】

首先从数组中找出要被乘以n的那部分元素,这一过程其实就是找出将被挑出的元素在原数组中的分布规律的过程。通过观察得出,要被处理的元素下标值的范围是每行中从第一个元素开始,直到列数等于该行行数时为止。找到这个规律后,依次从数组中取得符合要求的元素,然后乘以n。 第77套 上机操作题

一、程序填空题

【微答案】

(1)i (2)t++ (3)count 【微分析】

填空1:在OK函数里i应该代表的是放鞭炮的次数,因而在第一空应该填i。 填空2:在OK函数里t代表的是间隔的秒数,for循环中的此空该填t++。

填空3:最后返回的应该是听到的鞭炮总共的炸响声,本题中count代表的是鞭炮总共的炸响声,因而此空应填count。 二、程序修改题

【微答案】

(1)return 3; (2)else return 1; 【微分析】

(1)变量a、b、c分别表示三条边,当三边相等(a==b && b==c)时,返回3。 (2)在能构成三角形的前提下,如果不能构成等边三角形或等腰三角形,则返回1。 三、程序设计题

【微答案】

double fun(int n) {

int m,k,i; double s=0.0; for(m=3;m<=n;m++) {

k=sqrt(m);

for(i=2;i<=k;i++) if(m%i==0) break; if(i>=k+1)

s+=sqrt(m); }

return s; } 【微分析】

本题考查素数的判定方法及求平方根函数sqrt的使用。首先确定了n的范围,然后确定循环条件,最后根据素数的判定方法确定条件语句。 第78套 上机操作题

一、程序填空题

【微答案】

(1) M (2) < (3) k 【考点分析】

本题考查:for循环语句的循环条件;if语句条件表达式;return语句完成函数值的返回。 【微分析】

填空1:题目指出ss所指字符串数组中共有M个字符串,所以for循环语句循环条件是i

填空2:要求求长度最短的字符串,*n中存放的是已知字符串中长度最短的字符串的长度,这里将当前字符串长度与*n比较,若小于*n,则将该长度值赋给*n,因此if语句的条件表达式为len<*n。

填空3:将最短字符串的行下标作为函数值返回,变量k储存行下标的值。 二、程序修改题

【微答案】

(1)if(( tt[i]>='a')&&( tt[i] <= 'z')) (2)tt[i]-=32; 【微分析】

(1)分析本题可知,要判断字符是否为小写字母,即判断其是否在a~z之间,所以这里需要进行连续的比较,用&&。

(2)从ASCII码表中可以看出,小写字母的ASCII码值比对应大写字母的ASCII值大32。将字符串中的小写字母改为大写字母的方法是:从字符串第一个字符开始,根据ASCII码值判断该字母是不是小写字母,若是,则ASCII码值减32即可。 三、程序设计题

【微答案】

void fun( int m, int *k, int xx[] ) {

int i,j,n=0;

for(i=4;i

if(i%j==0) break; if(j

*k=n; /*返回非素数的个数*/ }

【微分析】

题目要求将1~m之间的非素数存入数组中,应使用循环判断结构。循环语句用来遍历1~m之间的每个数,判断语句用来判断该数是否素数,若不是素数,则将其存入数组中。这道题目是考查一个数是否为素数的简单延伸,只要掌握了判断素数的方法,问题便能顺利解决。 第79套 上机操作题

一、程序填空题

【微答案】

(1)s (2)-- (3)return 0 【微分析】

填空1:根据函数体fun中,对变量lp和rp的使用可知,lp应指向形参s的起始地址,rp指向s的结尾地址,所以应填s。

填空2:rp是指向字符串的尾指针,当每做一次循环rp向前移动一个位置,所以应填:--。 填空3:当lp和rp相等时,表示字符串是回文并返回1,否则就返回0,所以应填return 0。 二、程序修改题

【微答案】

(1)double fun(int n) (2)s=s+(double)a/b; 【微分析】

本文来源:https://www.bwwdw.com/article/6e85.html

Top