c语言练习1-4套

  • 格式:doc
  • 大小:100.50 KB
  • 文档页数:15

1 第1套 1.填空题 请补充main函数,该函数的功能是:把一个字符串中的所有小写字母字符全部转换成大写字母字符,其他字符不变,结果保存原来的字符串中。 例如:当str[N]="123 abcdef ABCDEF!",结果输出:"123 ABCDEF ABCDEF!"。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序: #include #include #include #define N 80 void main() { int j; char str[N]=" 123abcdef ABCDEF!"; char *pf=str; clrscr(); printf("***original string ***\n"); puts(str); 【1】; while(*(pf+j)) { if(*(pf+j)>='a'&&*(pf+j)<='z') { *(pf+j)=【2】; j++; } else 【3】; } printf("******new string******\n"); puts(str); system("pause");

} 2

【1】j=0 【2】*(pf+j)-32 【3】j++ 【解析】填空1:变量j声明时没有初始化,而后面程序用到j,所以在这里对j初始化为0。填空2:将小写字母转换为对应的大写字母的方法是,小写字母的ASCII码减去32,得到对应的大写字母的ASCII码。填空3:如果当前字符不是小写字母,则不做任何处理,使指针指向下一个字符,准备进行判断。

2. 改错题 下列给定程序中,函数fun()的功能是逐个比较a,b两个字符串对应位置中的字符,把ASCII值小或相等的字符依次存放到c数组中,形成一个新的字符串。 例如:a中的字符串为fshADfg,b中的字符串为sdAEdi,则c中的字符串应为fdAADf。 请改正程序中的错误,使它能得到正确结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include #include void fun(char *p,char *q,char *c) { int k=0; while(*p||*q) /**********************found***********************/ { if (*p<=*q) c[k]=*q; else c[k]=*p; if(*p) p++; 3

if(*q) q++ ; /**********************found***********************/ k++ } }

main() { char a[10]="fshADfg",b[10]="sdAEdi",c[80]={'\0'}; fun(a,b,c); printf("The string a:"); puts(a); printf("The string b:"); puts(b); printf("The result :"); puts(c); }

(1)错误: { if (*p<=*q)

正确:{ if (*p>=*q) (2)错误:k++ 正确:k++; 【解析】错误1:依题意,把ASCII值小或相等的字符存放到c数组中,故if语句的关系运算符应为">="。 错误2:C语言规定,每个语句要用分号结束。

3. 编程题 请编写函数fun,其功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数个位和十位上,b数的十位和个位数依次放在c数的百位和千位上。 例如,当a=16,b=35,调用该函数后,c=5361。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花 4

括号中填入所编写的若干语句。 试题程序: #include void fun(int a ,int b,long *c) {

} main() { int a,b; long c; clrscr(); printf("Input a,b;"); scanf("%d%d",&a, &b); fun(a,b,&c); printf("The result is:%ld\n",c); }

【解析】语句*c=(b%10)*1000+(b/10)*100+(a%10)*10+a/10;是将a

数的十位和个位数依次放在c数个位和十位上,b数的十位和个位数依次放在c数的百位和千位上。注意"/"和"%"的用法。

void fun(int a ,int b,long *c) { *c=(b%10)*1000+(b/10)*100+(a%10)*10+a/10; }

第2套

1.填空题 请补充main函数,该函数的功能是求方程ax2+bx+c=0的两个实数根。方程的系数a、b、c从键盘输入,如果判别式(disc=b2-4ac)小于0,则要求重新输入a、b、c的值。 例如,当a=1,b=2,c=1时,方程的两个根分别是x1=-1.00, x2=-1.00。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的 5

横线上填入所编写的若干表达式或语句。 试题程序: #include "math.h" #include main() { float a,b,c, disc,x1,x2; clrscr(); do { printf("Input a,b,c:"); scanf("%f,%f,%f",&a,&b,&c); disc=b*b-4*a*c; if(disc<0) printf("disc=%f\n Input again! \n",disc); }while(【1】); printf("*******the result*******\n"); x1=【2】; x2=【3】; printf("\nx1=%6.2f\nx2=%6.2f\n",x1,x2);

}

【1】disc<0 【2】(-b+sqrt(disc))/(2*a) 【3】(-b-sqrt(disc))/(2*a) 【解析】填空1:题目要求当判别式disc小于0时,要重新输入a、b、c的值,所以do-while循环的执行条件是disc<0。

填空2:方程02cbxax的一个实数根是:aacbbx242。填空3:方程02cbxax的另一个实数根是:aacbbx242。

2. 改错题 下列给定程序中,函数fun()的功能是根据整型形参m,计算如下公式的值。 6

y=1-1/(2×2)+1/(3×3)-1/(4×4)+…+(-1)(m+1)/(m×m) 例如:m中的值为5,则应输出0.838611。 请改正程序中的错误,使它能得到正确结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include #include double fun(int m) { double y=1.0; /**********************found***********************/ int j=1; int i; for(i=2; i<=m; i++) { j=-1*j; /**********************found***********************/ y+=1/(i * i); } return(y); }

main() { int n=5; clrscr(); printf("\nThe result is %lf\n" ,fun(n)); }

(1)错误:int j=1;

正确:double j=1.0; (2)错误:y+=1/(i * i); 正确:y+=j/(i * i); 【解析】错误1:为了做后面的除法运算,j要定义为实型数,否则除得的结果将为整数。 错误2:题中公式是加减相间的运算,通过j来实现。 7

3. 编程题 请编一个函数void fun(int tt[M][N], int pp[N]), tt指向一个M行N列的二维数组,求出二维数组每列中最大元素,并依次放入pp所指的一维数组中。二维数组中的数已在主函数中给出。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include #include #define M 3 #define N 4 void fun(int tt[M][N],int pp[N]) {

} main() { int t[M][N]={{68, 32, 54, 12},{14, 24, 88, 58},{42, 22, 44, 56}}; int p[N],i,j,k; clrscr(); printf("The riginal data is:\n"); for(i=0;i{ for(j=0;j printf("%6d",t[i][j]); printf("\n"); } fun(t,p); printf("\nThe result is:\n"); for(k=0;kprintf("%4d",p[k]); printf("\n"); }