文档库 最新最全的文档下载
当前位置:文档库 › 编程题

编程题

编程题
编程题

第三部分程序编写题

字符串类:第1—20题

2、请编写函数fun,函数的功能是:在字符串中的所有数字字符前加一个$字符。例如,输入A1B23CD45,则输出为:A$1B$2$3CD$4$5。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

void fun(char *s)

{……}

main()

{ char s[80];

printf("Enter a string: ");scanf("%s",s);

fun(s);

printf("The result: %s\n",s);

}

本题的考核点是在字符串中的数字之前加一$字符的算法。提示思路:通过一中间数组和一循环来实现。方法是:从字符串的首字符开始,判断字符是否为数字,若是,将字符$和数字字符赋给中间数组,反之,将字符直接赋给中间数组,直至字符串尾,最后将中间数组赋给原字符串。

void fun(char *s)

{ char p[80];

int i=0,j=0;

while (s[i]!='\0')/*假如s[i]不为字符串结束符,则继续循环*/

{ if ((s[i]>='0') && (s[i]<='9')) {p[j]='$';p[j+1]=s[i];j=j+2;}/*假如s[i]为数字字符,则将$置于p[j]中,数字字符置于p[j+1]中*/

else {p[j]=s[i];j=j+1;}/*否则将s[i]置于p[j]中*/

i++;

}

p[j]='\0';

strcpy(s,p);/* 将p数组中的字符复制到s数组中*/

}

4、规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串前面连续的*号全部删除,中间和尾部的*号不删除。例如,字符串中的内容为:

*******A*BC*DEF*G****,删除后,字符串中的内容应当是:A*BC*DEF*G****。在编写函数时,不得使用C语言提供的字符串函数。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

#include

void fun(char *a)

{……}

main()

{ char s[81];

printf("Enter a string:\n");gets(s);

fun(s);

printf("The string after deleted:\n");puts(s);

}

本题的考核点是在字符串中删除字符的算法。提示思路:从原串中的第一个非*开始的所有字符拷贝到另一字符串数组中,最后将这个字符串数组覆盖原串。本评析仅供参考(计算机培训中心提示:注意题目要求并请及时存盘)。

void fun(char *a)

{char b[81];

int i=0,j=0;

while ((a[j]!='\0') && (a[j]=='*')) j++;/*查找出字符串数组a中第一个不为“*”的字符,并用j返回其下标*/

while (a[j]!='\0') /*将字符串a中第一个不为“*”开始的所有字符全部复制到字符串b 中*/

{b[i]=a[j];j++;i++;}

b[i]='\0';

i=0;j=0;

while (b[i]!='\0') /*将字符串b中的所有字符复制到a字符串中覆盖原串*/

{a[j]=b[i];i++;j++;}

a[j]='\0';

}

5、请编写函数fun,函数的功能是:将s所指字符串中下标为奇数位置上的大写字母转换为字母序列中的下一个小写字母;若该位置上是小写字母,则不转换;若该位置上是大写字母Z,则仅转换成小写字母z。例如,输入:ABCdXZZZZ,则输出为:AcCdXzZz。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

#define N 80

void fun(char *s)

{……}

main()

{ char s[N];

printf("Enter a string: ");scanf("%s",s);

fun(s);

printf("The result:%s",s);

}

本题的考核点是字符转换算法。解题思路:将s所指字符串中下标为奇数位置上的大写字母转换为字母序列中的下一个小写字母,若该位置上是小写字母,则不转换;若该位置上是大写字母Z,则仅转换成小写字母z。判断字符为大写字母的方法是:判断字符的ASCII值是否大于A小于Z。判断下标为奇数,用%2等于1来判断。

void fun(char *s)

{ int i=0;

while (s[i]!='\0')/*假如s[i]不为字符串结束符,则继续循环,否则退出循环*/

{ if ((s[i]=='Z')&&(i%2==1)) s[i]='z';/*假如s[i]为大写字母Z且在字符串中下标为奇数的位置上,则转换成小写字母z*/

else if ((s[i]>='A' && s[i]<'Z') && (i%2==1)) s[i]=s[i]+33;/*假如s[i]为除大

写字母Z以外的字母,则直接转换成该字母的小写字母状态的下一个字母*/

i++;

}

}

7、规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了前面连续的*

号之外,将串中其它*号全部删除。在编写函数时,不得使用C语言提供的字符串函数。例如,

字符串中的内容为:****A*BC*DEF*G******,删除后,字符串中的内容应当是:****ABCDEFG。

注意:部分源程序存在文件prog.c中。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的

若干语句。

#include

#include

void fun(char *a)

{……}

main()

{ char s[81];

printf("Enter a string:\n");gets(s);

fun(s);

printf("The string after deleted:\n");puts(s);

}

本题的考核点是删除字符串中字符的算法。提示思路:先将原串中的串首连续的*号字符赋

给一字符串数组,再从原串中的第一个非*字符开始,将非*号的字符追加其后,最后将新串

覆盖原串。本评析仅供参考(计算机培训中心提示:注意题目要求并请及时存盘)。

void fun(char *a)

{ char b[81];

int i=0,j=0;

while (a[i] && (a[i]=='*')) {b[j]=a[i];j++;i++;} /*将原串中的串首连续的*号字

符赋给一字符串数组b*/

else k++;

while (a[i])

if (a[i]!='*') {b[j]=a[i];j++;i++;} /*从原串中的第一个非*字符开始,

将非*号的字符追加在数组b后*/

else i++;

b[j]='\0';j=0;i=0;

while (b[j]) /*将字符串b中的所有字符复制到a字符串中覆盖原串*/

{ a[i]=b[j];i++;j++;}

a[i]='\0';

}

10、编写一个函数 void fun(char p1[], char p2[]), 它的功能是: 实现两个字符串的连

接(不使用库函数strcat)。例如,输入下面两个字符串: FirstString-- SecondString 程序输出: FirstString--SecondString 注意:部分源程序存

在文件prog.c中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括

号中填入你编写的若干语句。

#include

#include

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

{……}

main()

{ char s1[80], s2[40] ;

clrscr() ;

printf("Enter s1 and s2:\n") ;

scanf("%s%s", s1, s2) ;

printf("s1=%s\n", s1) ;

printf("s2=%s\n", s2) ;

printf("Invoke fun(s1,s2):\n") ;

fun(s1, s2) ;

printf("After invoking:\n") ;

printf("%s\n", s1) ;

}

本题的考核点是字符串的连接。解题思路:1、定义两个字符型指针point1、point2,分别指向字符串p1和p2; 2、point1起始指向字符串p1的第一个字符,通过循环,令其指向p1串尾,为未来的连接工作做好准备;3、point2起始指向字符串p2的第一个字符,通过循环,不断将指针指向p2的下一个字符; 4、将point2指向的字符通过指针point1逐一连接在字符串p1末尾; 5、连接完毕后,将指向字符串p1末尾的指针point1指向'0',以保证指针不越界。

解法二:/* 注:第一个for()循环用于让i成为第一个字符串的结束符的下标,要注意在这个for()后要有一个分号否则出错。第二个for()的作用是将第二个字符串一个一个字符依次放到第一个字符串的未尾。此外,还要注意最后一定要有p1[i]='\0';来给字符串加上结束符*/

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

{ int i,j;

for(i=0;p1[i];i++);

for(j=0;p2[j];j++)

p1[i++]=p2[j];

p1[i]='\0';

}

11、请编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置上的字母转换成大写(若该位置上不是字母,则不转换)。例如,若输入“abc4EFG”,则应输出“aBc4EFG”。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

#include

#include

void fun(char *ss)

{……}

main()

{ char tt[81];

clrscr();

printf("\nPlease enter an string within 80 characters:\n");gets(tt);

printf("\n\nAfter changing,the string\n \"%s\"",tt);

fun(tt);

printf("\nbecomes\n \"%s\"\n",tt);

}

本题的考核点是指针、ASCII码、数组和循环语句。解题思路:通过循环语句依次判断数组下标为奇数的元素是否为小写字母,如果是则通过字符运算将其转换为大写字母。本评析仅供参考。

void fun ( char *ss )

{ int i,n=0;

char *p;

p=ss;

while(*p++!='\0') /*判断是否到了字符串的末尾*/

n++;

for(i=1;i

if(ss[i]>='a' && ss[i]<='z') /*判断该字符是否为小写字母*/

ss[i]=ss[i]-'a'+'A'; /*若上述条件成立,则将其转换为大写字母*/ }

12、请编写函数fun,函数的功能是:移动字符串中的内容,移动的规则如下:把第1到第m 个字符平移到字符串的最后,把第m+1到最后的字符移到字符串的前部。例如,字符串中原有的内容为:ABCDEFGHIJK,m的值为3,则移动后字符串中的内容应该是:DEFGHIJKABC。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

#include

#define N 80

void fun(char *w, int m)

{……}

main()

{ char a[N]= "ABCDEFGHIJK";

int m;

printf("The original string:\n");puts(a);

printf("\n\nEnter m: ");scanf("%d",&m);

fun(a,m);

printf("\nThe string after moving:\n");puts(a);

printf("\n\n");

}

本题的考核点是一维数组的应用。提示思路:本题要求把字符串中的第1到第m个字符平移到字符串的最后,把第m+1到最后的字符移到字符串的前部,我们可以根据输入的m的值,通过for循环语句,将m+1到最后的字符之间的字符依次向前平移m个存储单元,本题中是通过语句w[j-1]=w[j];实现的,然后再将1到m个字符逐一赋给数组w[i-1],即w[i-1]=ch;。

void fun(char *w, int m)

{int i=0,x,j;

char ch;

for(j=0;w[j];j++)i++;

for(x=0;x

{ch=w[0];

for(j=1;j

{ w[j-1]=w[j];

}

w[i-1]=ch; /*将m+1到最后的字符之间的字符依次向前平移m个存储单元*/

}

}

13、请编一个函数char * EXUL(char tt[]),它的功能是:将字符串tt中的大写字母都改为对应的小写字母,其它字符不变并返回修改后的字符串。例如,若输入字符串:"Ab, cD",则输出结果为:"ab, cd"。注意:此程序存贮在prog.c中。请勿改动主程序main、函数WriteData和函数compute中的任何内容,仅在函数EXUL的花括号中填入你编写的若干语句。#include

#include

#include

char* EXUL( char tt[] )

{……}

main()

{ int i;

char tt[81];

clrscr();

printf("\nPlease enter a string: ");

gets( tt );

printf( "\nThe result string is:%s\n", EXUL( tt ) );

compute();

}

/* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */

WriteData(char tt[])

{ FILE *fp;

fp = fopen("dat82.dat", "w") ;

fprintf(fp, "%s", tt);

fclose(fp);

}

compute()

{ int i;

char tt[81];

FILE *fp;

fp=fopen("c9670803.in","r");

fgets( tt, 80, fp );

fclose(fp);

EXUL(tt);

WriteData(tt);

}

本题的考核点是C语言中的指针、循环语句以及条件判断语句的使用。提示思路:使用for 循环从头到尾扫描字符串tt,如果某一个字符为大写字母,则把它改成小写。char*

EXUL( char tt[] )

{for(;*tt;tt++) /*使用for循环从头到尾扫描字符串tt*/

if ((*tt >= 'A') && (*tt <= 'Z') ) /*判断某一个字符是否为大写字母*/

*tt -= 'A' - 'a'; /*将大写字母转换成小写字母*/

}

14、请编写一个函数fun,它的功能是:比较两个字符串的长度,(不得调用C语言提供的求字符串长度的函数),函数返回较短的字符串。若两个字符串长度相同,则返回第一个字符串。例如,输入beijing shanghai↙,函数将返回beijing。

注意:部分源程序存在文件prog.c中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

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

{……}

main( )

{ char a[20],b[10],*p,*q;

int i;

printf("Input 1th string:") ;

gets( a);

printf("Input 2th string:") ;

gets( b);

printf("%s\n",fun (a, b ));

}

本题的考核点是指针、循环语句和条件语句的使用。解题思路:先分别使用循环语句计算出各个字符串的长度,再对此长度进行比较来确定返回值。

#include

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

{ int first=0,second=0;

char *p,*q;

p=s;

q=t;

while(*p++!='\0') /*使用循环语句计算出s字符串的长度*/

first++;

while(*q++!='\0') /*使用循环语句计算出t字符串的长度*/

second++;

if(first==second) /*对求出的s及t字符串的长度进行比较*/

return s;

else if (first

return s;

else

return t;

}

16、请编写函数fun,函数的功能是:将放在字符串数组中的M个字符串(每串的长度不超过N),按顺序合并组成一个新的字符串。例如,字符串数组中的M个字符串为:

AAAA

BBBBBBB

CC

则合并后的字符串的内容应是:AAAABBBBBBBCC。注意:部分源程序存在文件prog.c 中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#define M 3

#define N 80

void fun(char a[M][N],char *b)

{……}

main()

{char s[M][N]={"AAAA","BBBBBBB","CC"},p[100];

clrscr();

fun(s,p);

printf("%s",p);

}

答案:

int i,j,d;

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

b[i]=0;

for(i=0,d=0;i

for(j=0;a[i][j];j++)

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

18、规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中前面所有连续的*号全部移动到字符串的尾部。例如,字符串中的内容为:

*******A*BC*DEF*G****,移动后,字符串中的内容应当是:A*BC*DEF*G***********。在编写函数时,不得使用C语言提供的字符串函数。

注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

#include

void fun(char *a)

{……}

main()

{ char s[81],*p;

printf("Enter a string:\n");gets(s);

fun(s);

printf("The string after moveing:\n");puts(s);

}

本题的考核点是移动字符串中字符的算法。解题思路:先统计原串串首连续*的个数,再将从第一个非*字符开始至串尾的所有字符赋给一字符串,再通过一循环生成串首连续*的个数

个*追加其后,最后将新串覆盖原串。本评析仅供参考。

void fun(char *a)

{ char b[81];

int i=0,j=0,s=0,k;

while (a[i]=='*') /*统计原串串首连续*的个数*/

{i++;s++;}

while (a[i]) /*将从第一个非*字符开始至串尾的所有字符赋给字符串b*/ {b[j]=a[i];j++;i++;}

for (k=0;k

{b[j]='*';j++;}

b[j]='\0';

i=0;j=0;

while (b[j]) /*将字符串b中的所有字符复制到a字符串中覆盖原串*/

{a[i]=b[j];i++;j++;}

}

19、编写一个函数void fun ( char *s ),函数的功能是把字符串s中的所有字符前移一个位置,串中的第一个字符移到最后。例如:s 串中原来的字符串为:"Mn.123xyZ",则调用该函数后,s串中的内容为:"n.123xyZM"。注意:部分源程序保存在文件prog.c中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include

#include

#define N 81

void fun ( char *s )

{……}

main( )

{ char a[ N ] ;

clrscr( );

printf ( "Enter a string : " ); gets ( a );

printf ( "The original string is : " ); puts( a );

fun ( a );

printf ( "The string after modified : ");

puts ( a );

}

本题的考核点是c语言中循环语句的使用。解题思路:先保存原字符串的第一个字符,然后将后面的字符依次向前移一位,最后将原字符串的第一个字符添加到新字符串的最后。解法一:

void fun ( char *s )

{int i, length;

char tmp;

length = strlen( s ); /*通过strlen函数求字符数组s的长度*/

if (length == 0) return; /*如果字符串长度为0,则不进行任何处理,直接返回主函数*/

tmp = s[0]; /*变量tmp用于保存原字符串的第一个字符*/

for (i = 0;i < length - 1; i++)

s[i] = s[i + 1]; /*将字符串s中的除首字符以外的所有字符前移一个位置*/

s[length - 1] = tmp; /*将原字符串的第一个字符添加到新字符串的最后*/

}

解法二:/* 注:该题要先将字符串的头元素存到某一变量(用tmp=*s)中,然后后面的字符依向前移(用for()循环),要记得在串的未尾加一个结束符*/

fun(char *s)

{ char tmp=*s;

for(;*(s+1);s++)

*s=*(s+1);

*s=tmp;

*(s+1)='\0';

}

20、请编写一个函数fun(),它的功能是:比较两个字符串的长度,(不得调用C语言提供的求字符串长度的函数),函数返回较短的字符串。若两个字符串长度相等,则返回第1个字符串。例如,输入nanjing nanchang 为回车键),函数将返回nanjing。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun 的花括号中填入所编写的若干语句。

试题程序:

#include

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

{……}

main()

{ char a[20],b[10],*p,*q;

int i;

printf("Input 1th string: ");

gets(a);

printf("Input 2th string: ");

gets(b);

printf("%s",fun(a,b));

}

答案:

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

{ int i,j;

for(i=0;s[i]!= '\0';i++); /*求字符串的长度*/

for(j=0;t[j]!= '\0';j++);

if(i<=j) /*比较两个字符串的长度*/

return s; /*函数返回较短的字符串,若两个字符串长度相等,则返回第

1个字符串*/

else

return t;

}

【解析】本题中,第1个for循环的作用是求出s的字符个数i,第2个for循环的作用是求出t的字符个数j,因为任何循环都要控制一条语句,所以在每一个for循环条件后面必须要有一个分号。本题也可用如下技巧:

#include /*一定要注意在最前面加

#include*/ char *fun(char *s,char *t)

{

if(strlen(s)>=strlen(t)

return s;

else return t;

}

多项式类:第21—26题

21、请编写函数fun,其功能是:计算并输出下列多项式的值:

1 1 1 1 1

S=(1 - ─) + (─ - ─) +…+ (── - ──)

2 3 4 2n-1 2n

例如,在主函数中从键盘给n输入8后,输出为:s=0.662872。注意:要求n的值大于1但不大于100。部分源程序在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

double fun(int n)

{……}

main()

{ int n; double s;

printf("\nInput n: "); scanf("%d",&n);

s=fun(n);

printf("\ns=%f\n",s);

}

本题的考核点是求模运算和基本c语句的使用。提示思路:该题考查的是数学上的一个数列,其通式为:1/(2*n-1)-1/(2*n)。在给出的参考程序中,由于函数要求的返回值为双精度型,所以将sum定义为双精度型,其初值为0.0,再判断输入的n是否符合条件,如果条件为真,则执行for循环,分别计算出1.0/(2*i-1)-1.0/(2*i)相应的每一个多项式的值,同时累加到变量sum中,并将该结果返回。

double fun(int n)

{ int i;

double sum=0.0; /*定义sum为双精度型变量,并给其赋初值为0.0*/

if (n>1&&n<=100)

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

sum+=1.0/(2*i-1)-1.0/(2*i); /*计算出1.0/(2*i-1)-1.0/(2*i)相应的每一个多项式的值,同时累加到变量sum中*/

}

return sum; /*返回计算结果*/

}

22、编写函数fun,它的功是计算:s=(In(1)+In(2)+In(3)+……+In(m))^0.5,s作为函数值返回。在C语言中可调用log(n)函数求In(n)。log函数的引用说明是:double log(double x)。例如,若m的值为:20,fun函数值为:6.506583。注意:部分源程序存在文件prog.c 中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的

若干语句。

#include

#include

#include

double fun( int m)

{……}

main()

{ clrscr();

printf("%f\n",fun(20));

}

本题的考核点是公式算法。解题思路:从1至m累计log(i)的和值,最后求它的平方根。本评析仅供参考。

double fun( int m)

{ int i;

double s=0;

for (i=1;i<=m;i++) /*求In(1)~In(m)的和*/

s=s+log(i);

s=sqrt(s); /*求s的平方根*/

return (s);

}

26、编写函数fun,函数的功能是:根据以下公式计算s,计算结果作为函数值返回;n通过

形参传入。 1 1 1

S = 1 + ── + ─── + …… + ──────

1+2 1+2+3 1+2+3+…+n

例如:若n的值为11时,则函数值为:1.833333 注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

#include

#include

float fun(int n)

{……}

main()

{ int n;float s;

clrscr();

printf("\nPlease enter N:");scanf("%d",&n);

s=fun(n);

printf("the result is:%f\n",s);

}

解题思路:通过一变量来累计1至n的和值,再通过另一变量再累计分式的和值。本评析仅供参考。

float fun(int n)

{ int i;

float s=1.0,h=1;

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

{ h=h+i;/*h为每一分式的除数,i为前后相邻除数之间的增量*/

s=s+1.0/h;

}

return(s);

}

一维数组类:第29----41题

29、要求程序的功能是:把20个随机数存入一个数组,然后输出该数组中的最小值。其中确定最小值的下标的操作在fun函数中实现,请给出该函数的定义。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

#include

#define VSIZE 20

int vector[VSIZE];

int fun(int list[],int size)

{……}

main()

{ int i;

clrscr();

for (i=0;i

{ vector[i]=rand();

printf("Vector[%d]=%6d\n",i,vector[i]);

}

i=fun(vector,VSIZE);

printf("\nMininum:Vector[%d]=%6d\n",i,vector[i]);

}

本题的考核点是在组数中找出最小数及其下标算法。提示思路:通过一个循环来实现,方法是:将下标0赋给一个变量,如在循环中有比变量下标所对应的数还要小,那么就将这个数的下标赋给变量,直至找到最小数的下标。本评析仅供参考(计算机培训中心提示:注意题目要求并请及时存盘)。

int fun(int list[],int size)

{ int x,i;

x=0;

for (i=1;i

if (list[x]>list[i]) x=i;/*从前到后顺序比较list数组中的数,并将每次比较过程中较小的那个数的下标赋值给x*/

return x;

}

30、请编写一个函数 int fun(int *s, int t, int *k),用来求出数组的最大元素在数组中的下标, 用k返回。例如, 输入如下整数: 876 675 896 101 301 401 980 431 451 777 则输出结果为: 6, 980 注意:部分源程序存在文件prog.c中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

#include

int fun(int *s, int t, int *k)

{……}

main( )

{ int a[10]={876,675,896,101,301,401,980,431,451,777}, k ;

clrscr() ;

fun(a, 10, &k) ;

printf("%d, %d\n", k, a[k]) ;

}

本题的考核点是求数组中的最大元素在数组中的下标。提示思路: 1、定义变量

max_integer,用以存放数组s[]中的最大元素; 2、建立循环,查找出数组s[]中的最大元素; 3、将查找到的最大元素的下标赋给k,并传回主函数。

int fun(int *s, int t, int *k)

{ int max_integer=0; /*定义变量max_integer,用以存放数组s[]中的最大元素*/

int i=0;

max_integer = s[0]; /*假定第一个数组元素为最大*/

for(i=0; i

/*将查找到的最大元素的下标赋给k,并传回主函数*/

if(max_integer

max_integer=s[i];

*k=i;

}

}

}

32、请补充main函数,该函数的功能是:如果数组aa的前一个元素比后一个元素小,则把它保存在数组bb中并输出。例如,输入“40,51,62,33,35,52,48,95,66,73”,则结果输出“40,51,33,35,48,66”。注意:部分源程序给出如下。请勿改动主函数main 和其他函数中的任何内容,仅在main函数的横线处填入所编写的若干表达式或语句。试题程序:

#include

#define N 10

main()

{ int i,n=0;

int aa[N]={40,51,62,33,35,52,48,95,

66,73};

int bb[N];

clrscr(); ____________________

}

【答案】在以上横线处编写代码如下:

for(i=0;i< N-1;i++)

if(aa[i]

bb[n++]=aa[i];

printf("\n*** display bb ***\n");

for(i=0;i

printf("bb[%d]=%2d ", i,bb[i]);

33、请编写函数fun,其功能是:计算并输出给定数组(长度为9)中每相邻两个元素之平均值的平方根之和。例如,给定数组中的9个元素依次为12.0、34.0、4.0、23.0、34.0、45.0、18.0、3.0、11.0,输出应为:s=35.951014。注意:部分源程序在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include

#include

double fun(double x[9])

{……}

main()

{ double s,a[9]={12.0,34.0,4.0,23.0,34.0,45.0,18.0,3.0,11.0};

int i;

printf("\nThe original data is :\n");

for(i=0;i<9;i++)printf("%6.1f",a[i]); printf("\n\n");

s=fun(a);

printf("s=%f\n\n",s);

}

本题的考核点是c语言中的基本算法和for循环语句的使用。解题思路:本题要求计算并输出给定数组中每相邻两个元素之平均值的平方根之和,并作为函数值返回。在给出的参考程序中,由于函数要求的返回值为双精度型,所以先将变量avg、sum定义为双精度型,初值为0.0,然后通过for循环分别求出相邻两个元素的平均值放入变量avg中,再使用求平方根函数

sqrt()对各平均值开方求和,最终结果输出到变量sum中并返回。

double fun(double x[9])

{int i ;

double avg=0.0,sum=0.0; /*将变量avg、sum定义为双精度型,并给其赋初值为0.0*/

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

{avg=(x[i]+x[i+1])/2; /*通过for循环分别求出相邻两个元素的平均值放入变量avg中*/ sum+=sqrt(avg); /*使用求平方根函数sqrt()对各平均值开方求和,最终结果输出到变量sum*/

}

return sum; /*返回计算结果*/

}

35、请编一个函数double Acc(int k, double dd[]),它的功能是:求出数组dd中前k个数的小数部分的和,并返回此值。例如:输入4和101.91、213.87、345.79、420.83,则输出3.4。注意:此程序保存在prog.c中。请勿改动主程序main、函数WriteData和函数compute 中的任何内容,仅在函数Acc的花括号中填入你编写的若干语句。

#include

#include

#define M 20

double Acc( int k, double dd[] )

{……}

main()

{ int i, m;

double x, tt[M];

clrscr();

printf("\nPlease enter number of numbers: ");

scanf("%d", &m );

printf("\nPlease enter %d decimal numbers:\n",m);

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

{ scanf("%lf", &x ); tt[i] = x ; }

printf( "\nThe sum of their decimal part is: %lf\n", Acc(m, tt));

compute() ;

}

/* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */

WriteData(double sum)

{ FILE *fp;

fp = fopen("dat12.dat", "w") ;

fprintf(fp, "%lf", sum);

fclose(fp);

}

compute()

{ int i, m;

double x, tt[M];

FILE *fp;

fp = fopen("c9670103.in", "r");

fscanf(fp, "%d", &m );

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

{ fscanf(fp, "%lf", &x ); tt[i] = x ; }

fclose(fp);

WriteData(Acc(m, tt));

}

本题的考核点是C语言中的数据类型转换。提示思路:根据C语言的类型转换规则,如果把一个A类型的数据赋给一个B类型的数据时,C语言将先把A类型的数据转换为B类型,然后再赋值。其实C编译器对各类型的数据并没有十分严格的区分,最大的区别只是所占的位数不同。当把一个浮点型的数据赋给整型变量时,C编译器将会强制去掉浮点型数据的小数部分,此时所得到的整型数据就是浮点数据的整数部分。用浮点数据减去整型数据所得出的结果即为该浮点数据的小数部分,将这个结果累加起来就得出要返回的值。

double Acc( int k, double dd[] )

{int i;

int int_data;

double flt_data, result = 0;

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

{ int_data = dd[i]; /*求数组dd[]的整数部分*/

flt_data = dd[i] - int_data; /*求数组dd[]的小数部分*/

result += flt_data; /*通过for循环求出数组dd中前k个数的小数部分的和result*/ }

return result; /*返回数组dd中前k个数的小数部分之和result*/

}

36、给定程序prog.c中,在主函数中从键盘输入若干个数放入数组中,用0结束输入并放在最后一个元素中。下列程序中,函数fun的功能是:计算数组元素中值为正数的平均值(不包括0)。例如:数组中元素中的值依次为:39,-47,21,2,-8,15,0,则程序的运行结果为:19.250000。

#include

#include

double fun(int x[])

{……}

main()

{ int x[1000];int i=0;

clrscr();

printf("\nPlease enter some data (end with 0):");

do

{ scanf("%d",&x[i]);}

while (x[i++]!=0);

printf("%f\n",fun(x));

}

本题的考核点是C语言中不同数据类型的使用以及运算符的使用。

答案:double fun(int x[])

{double sum=0.0;

int c=0,i=0;

while (x[i]!=0)

{ if (x[i]>0) {

sum+=x[i];c++;}

i++;

}

sum/=c;

return sum;

}

38、请编写一个函数 int un(int *s,int *t,int *k),用来求出数组中值最大的元素在数组中的下标并存放在k所指的存储单元中,并且将最大值增添在数组的最后。形参t所指存储单元中存放数组中数据的个数。例如,数组中的数据如下: 876 675 896 101 301 401 980 431 451 777 则输出最大值的下标为:6,数组中的内容为: 876 675 896 101 301 401 980 431 451 777 980 注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

#define N 80

void fun(int *s,int *t,int *k)

{……}

main()

{ int a[N]={876,675,896,101,301,401,980,431,451,777},i,n,mi;

n=10;

printf("\nThe original data:\n");

for(i=0;i

fun(a,&n,&mi);

printf("The index of max is: %d\n",mi);

printf("The result :\n");

for(i=0;i

}

本题的考核点是求数组中最大元素的下标,并将最大值增添在数组的最后的算法。

提示思路:先通过一指针变量来记录数组中最大值的下标,然后再将最大值放在数组的最后,使数组长度增1。本评析仅供参考(计算机培训中心提示:注意题目要求并请及时存盘)。void fun(int *s,int *t,int *k)

{ int i=0;

*k=0;

/*从前往后顺序比较s数组中的元素,并将每次比较过程中较大的那个元素的下标存放在指针k中*/

for (i=1;i<*t;i++)

if (s[*k]

s[*t]=s[*k];/*将找到的最大值添加在数组的最后*/

*t=*t+1;/*数组长度增1*/

}

39、请编写函数fun,函数的功能是:移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。例如,一维数组中的原始内容为: 1,2,3,4,5,6,7,8,9,10;p的值为3。移动后,一维数组中的内容应为:

5,6,7,8,9,10,1,2,3,4。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

#define N 80

void fun(int *w, int p, int n)

{……}

main()

{ int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

int i,p,n=15;

printf("The original data:\n");

for(i=0; i

printf("\n\nEnter p: ");scanf("%d",&p);

fun(a,p,n);

printf("\nThe data after moving:\n");

for(i=0; i

printf("\n\n");

}

本题的考核点是一维数组的应用。

解题思路:本题要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后,可以根据输入的p值,通过for循环语句,将p+1到n-1(含n-1)之间的数组元素依次向前移动p+1个存储单元,即w[j-1]=w[j];,同时将0到p个数组元素逐一赋给数组w[n-1],也就是通过语句w[n-1]=ch;来实现此操作的。

void fun(int *w, int p, int n)

{int x,j,ch;

for(x=0;x<=p;x++)

{ch=w[0];

for(j=1;j

{

w[j-1]=w[j];

}

w[n-1]=ch; /*将0到p个数组元素逐一赋给数组w[n-1]*/

}

}

40、请编写一个函数 void fun (int x, int pp[], int *n),它的功能是:求出能整除 x 且不是奇数的各整数,并放在数组pp 中,这些除数的个数由 n 返回。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include

#include

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

{……}

main( )

{ int x, aa[1000], n, i ;

clrscr() ;

printf( "\nPlease enter an integer number:\n" ) ; scanf("%d", &x) ;

fun(x, aa, &n ) ;

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

printf("%d ", aa[i]) ;

printf("\n") ;

}

本题的考核点是C语言的指针及循环的嵌套。解题思路: 1、通过循环找出能整除 x 且不是奇数的整数; 2、在函数中的循环中,一旦找到能整除 x 且不是奇数的整数,立即将其存入数组pp[]中;3、定义计数器j,在循环查找特定整数的过程中,j对特定整数的数目进行记录; 4、循环查找完毕后,将特定整数的数目传给n。/*由于要求的数不能是奇数故编程时从0开始循环而步长为2这样正好保正i永远是偶数。这里也要注意存放结果的数组pp的下标变化方式*/

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

{ int i,j=0;

for( i=0;i<=x;i=i+2) /*i从0开始循环而步长为2这样正好保正i永远是偶数*/

if( x%i==0) /*判断x能否被i整除*/

pp[j++]=i; /*将符合条件的数存入数组pp[]中*/

*n=j; /*将统计的符合条件的数的个数传给*n*/

}

41、请编一个函数double Pdt(int n,double pp[]),它的功能是:求出数组pp中n个数的整数部分的和,并返回此值。例如:若输入4和11.91、23.87、35.79、40.83,则输出109.0,整数部分的值应小于10的16次方。注意:此程序存贮在prog.c中。请勿改动主程序main、

函数WriteData和函数compute中的任何内容,仅在函数Pdt的花括号中填入你编写的若干语句。

#include

#include

#include

#define M 20

double Pdt( int n, double pp[] )

{……}

main( )

{ int i, m;

double tt[M];

clrscr();

printf("\nPlease enter number of numbers: ");

scanf("%d", &m );

printf("\nPlease enter %d decimal numbers: ", m);

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

scanf("%lf", &tt[i] );

printf( "\nThe product of their integer part is: %lf.", Pdt(m, tt) );

compute();

}

/* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */

WriteData(double sum)

{ FILE *fp;

fp = fopen("dat62.dat", "w") ;

fprintf(fp, "%lf", sum);

fclose(fp);

}

compute( )

{ int i, n;

double pp[M];

FILE *fp;

fp = fopen("c9670603.in", "r");

fscanf(fp, "%d", &n );

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

fscanf(fp, "%lf", &pp[i] );

fclose(fp);

WriteData(Pdt(n, pp));

}

本题的考核点是C语言的类型转换规则。解题思路:根据C编译器的隐式类型转换原则,将一个A类型的数据赋给一个B类型时,先将A类型数据转换为B类型数据,然后再赋给B,因此将一个浮点型的数据赋给整型时,将得到这个浮点型数据的整数部分,我们将整数部分累加即可得出结果。

double Pdt( int n, double pp[] )

{ int i, int_data;

相关文档