C习题集

更新时间:2023-09-18 13:43:01 阅读量: 幼儿教育 文档下载

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

计算机基础课程 The

The C Programming Language

Exercises in

C程序设计题习集

2002年3月 杭州

目 录

一、C程序设计习题

⒈ 单项选择题 ???????????????????? 2 ⒉ 填 空 题 ???????????????????? 7 ⒊ 写输出结果题 ???????????????????? 10 ⒋ 程序填空题 ???????????????????? 18 ⒌ 编 程 题 ???????????????????? 27 二、C语言程序设计习题答案

⒈ 单项选择题 ???????????????????? 29 ⒉ 填 空 题 ???????????????????? 29 ⒊ 写输出结果题 ???????????????????? 29 ⒋ 程序填空题 ???????????????????? 31 ⒌ 编程题(参考) ???????????????????? 32 三、浙江省高校非计算机专业计算机等级考试试卷(C语言部分)

⒈ 95年试卷 ????????????????????? 42 ⒉ 96年试卷 ????????????????????? 45 ⒊ 96年秋试卷 ????????????????????? 48 ⒋ 99年春试卷 ????????????????????? 51 ⒌ 99年秋试卷 ????????????????????? 54

1

PART 1 C语言程序设计习题

1 单项选择题

在每小题的四个备选答案中选出一个正确的,并将正确答案号码填在题后括号内。 1. 用C语言编写的源文件经过编译,若没有产生编译错误,则系统将( )。 A、生成可执行目标文件 B、生成目标文件 C、输出运行结果 D、自动保存源文件

2. 在C集成环境执行菜单命令“运行”,若运行结束且没有系统提示信息,说明( )。 A、源程序有语法错误 B、源程序正确无误

C、源程序有运行错误 D、源程序无编译、运行错误,但仅此无法确定其正确性 3. 程序运行输出了错误的结果,可以排除下列哪一个因素( )。

A、算法错误 B、运行时输入数据错误 C、未通过编译 D、系统资源配置不当 4. 下列各个错误中,属于编译错误的是( )。

A、数组下标超界 B、“==”误写为“!=” C、死循环 D、括号不配对 5. 若int类型数据字长为4,其最大值为( )。

A、2 B、2-1 C、2-1 D、2 6. 常数的书写格式决定了常数的类型和值,03322是( )。 A、16进制int类型常数 B、8进制int类型常数 C、10进制int类型常数 D、10进制long int类型常数 7.“e2”是( )。

A、实型常数100 B、值为100的整型常数 C、非法标识符 D、合法标识符 8. 要为字符型变量a赋初值,下列语句中哪一个是正确的( )。

A、char a=?3?; B、char a=”3”; C、char a=%; D、char a=*; 9. 要为float类型变量x、y、z赋同一初值3.14,下列说明语句哪一个是正确的( )。 A、float x,y,z=3.14; B、float x,y,z=3*3.14; C、float x=3.14,y=3.14,z=3.14; D、float x=y=z=3.14; 10. 语句“float pi=3.1415926535;”将( )。

A、导致编译错误 B、说明pi为初值3.1415926535的单精度实型常数 C、导致运行时的溢出错误 D、说明pi为初值3.141593的单精度实型常数 11. 算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为( )。 A、算术运算、赋值运算、关系运算 B、算术运算、关系运算、赋值运算 C、关系运算、赋值运算、算术运算 D、关系运算、算术运算、赋值运算 12. 关系运算符中优先级最低的运算符是( )。

A、“>=”和“<=” B、“>”和“<” C、“==”和“!=” D、“<=”和“<”

2

31

31

32

32

13. 逻辑运算符中,运算优先级按从高到低依次为( )。

A、&&,!,|| B、||,&&,! C、&&,||,! D、 !,&&,|| 14. 对C程序在作逻辑运算时判断操作数真、假的表述,下列哪一个是正确的( )。 A、0为假非0为真 B、只有1为真 C、-1为假1为真 D、0为真非0为假 15. 表达式 x==0&&y!=0||x!=0&&y=0等效于( )。

A、x*y==0&&x+y!=0 B、x*y==0&&(x+y==0) C、x==0||y==0 D、x*y=0||x+y=0 16. 表达式!x||a==b等效于( )。

A、!((x||a)==b) B、!(x||y)==b C、!(x||(a==b)) D、(!x)||(a==b) 17. 下列格式符中,哪一个可以用于以8进制形式输出整数( )。 A、%d B、? C、%o D、%ld 18. 下列格式符中,哪一个可以用于以16进制形式输出整数( )。 A、d B、%8x C、?6 D、%d

19. a是int类型变量,c是字符变量。下列输入语句中哪一个是错误的( )。 A、scanf(”%d,%c”,&a,&c); B、scanf(”%d%c”,a,c); C、scanf(”%d%c”,&a,&c); D、scanf(”d=%d,c=%c”,&a,&c);

20. 字符变量ch=?A?,int类型变量K=25,语句printf(”=,ó\\n”,ch,k);输出( )。 A、65,253 B、65 253 C、65,25 D、A 25 21. 下列各语句序列中,能够且仅输出整型变量a、b中最大值的是( )。 A、if(a>b) printf(”%d\\n”,a); printf(”%d\\n”,b); B、printf(”%d\\n”,b); if(a>b) printf(”%d\\n”,a); C、if(a>b) printf(”%d\\n”,a); else printf(”%d\\n”,b); D、if(a

22. 下列各语句序列中,能够将变量u、s中最大值赋值到变量t中的是( )。 A、if(u>s)t=u; t=s; B、t=s; if(u>s)t=u; C、if(u>s)t=s; else t=u; D、t=u; if(u>s)t=s; 23. 下列各语句中,能够输出整型变量a、b中最大值的是( )。

A、printf(”%d\\n”,(a>b)?a,b); B、(a>b)? printf(”%d”,a):printf(”%d”,b); C、printf(”%d”,if(a>b)a else b); D、printf(”%d\\n”,(a>b)?a:b); 24. 下列语句应将小写字母转换为大写字母,其中正确的是( )。

A、if(ch>=?a?&ch<=?z?) ch=ch-32; B、if(ch>=?a?&&ch<=?z?)ch=ch-32; C、ch=(ch>=?a?&&ch<=?z?)?ch-32:??; D、ch=(ch>?a?&&ch

A、s=0;for(i=1;i<=10;i++) s+=i; B、s=0;i=1;for(;i<=10;i++) s=s+i; C、for(i=1,s=0;i<=10;s+=i,i=i+1); D、for(i=1;s=0;i<=10;i++) s=s+i; 26. 若sizeof(int)为2,计算1至10的乘积,下列语句序列中正确的是( )。 A、int jc=1; for(int i=2;i<=10;i++) jc*=i;

3

B、for(float jc=1,int i=2;i<=10;i++,jc*=i); C、float jc=1; for(int i=2;i<=10;jc*=i,i=i+1); D、for(float jc=1;i=2;i<=10;i++) jc*=i;

27. 下列语句中,哪一个可以输出26个大写英文字母( )。

A、 for(a=?A?;a<=?Z?;printf(”%c”,++a)); B、for(a=?A?;a=0&&i<=10) { if(i++==5)continue; printf(”%f\\n”,1.0/(i-5));} 功能相同的是( )。

A、for(;i>=0&&i<=10;i++) if(i!=5) printf(”%f\\n”,1.0/(i-5)); B、for(;i>=0&&i<=10;i++) if(i==5) printf(”%f\\n”,1.0/(i-5));

C、for(;i>=0&&i<=10;i++) if(i!=5) printf(”%f\\n”,1.0/(i-5)); else break; D、for(;i<=0&&i>=10;i++) if(i!=5) printf(”%f\\n”,1.0/(i-5));

29. 下列语句中与语句 while(1){if(i>=100)break;s+=i;i++;} 功能相同的是( )。 A、for(;i<100;i++) s=s+i; B、for(;i<100;i++;s=s+i); C、for(;i<=100;i++) s+=i; D、for(;i>=100;i++;s=s+i);

30. 下列各语句定义了数组,其中哪一个是不正确的( )。

A、char a[3][10]={”China”,”American”,”Asia”}; B、int x[2][2]={1,2,3,4}; C、float x[2][]={1,2,4,6,8,10}; D、int m[][3]={1,2,3,4,5,6}; 31. 下列各语句定义了数组,其中哪一个是正确的( )。

A、char a[10],*p=a[0] B、int d[2][]={1,2,3,4,5,6};

C、float x[][3]={1,2,4,6,8,10}; D、int m[][]={”no_1”,”no_2”,”no_3”}; 32. 数组定义为 int a[3][2]={1,2,3,4,5,6},下列表述中正确的是( )。 A、数组元素a[3][2]的值为6 B、数组元素a[6]的值为6

C、数组元素a[0]的值为1 D、a[0]不是int类型的数组元素 33. 用宏名定义一个字符串,下列表述中哪一个是正确的( )。 A、#define pi=3.14159; B、define pi=3.14159 C、#define pi ”3.14159” D、#define pi(3.14159);

34. 定义带参数的宏计算两式乘积(如x+3x-5与x-6),下列定义中哪个是正确的( )。 A、#define muit(u,v) u*v B、#define muit(u,v) u*v; C、#define muit(u,v) (u)*(v) D、#define muit(u,v)=(u)*(v) 35. 宏定义 #define div(a,b) a/b 的引用 div(x+5,y-5) 替换展开后是( )。 A、x+5/y-5 B、x+5/y-5; C、(x+5)/(y-5) D、(x+5)/(y-5); 36. 定义带参数的宏“#define jh(a,b,t) t=a;a=b;b=t”,使两个参数a、b的值交换, 下列表述中哪个是正确的( )。

A、不定义参数a和b将导致编译错误 B、不定义参数a、b、t将导致编译错误 B、不定义参数t将导致运行错误 D、不必定义参数a、b、t类型 37. 下列语句定义p为指向float类型变量d的指针,其中哪一个是正确的( )。

4

2

A、float d,*p=d; B、float d,*p=&d; C、float *p=&d,d; D、float d,p=d; 38. 对语句“int a[10],*p=a;”,下列表述中哪一个是正确的( )。

A、*p被赋初值为a数组的首地址 B、*p被赋初值为数组元素a[0]的地址 C、p被赋初值为数组元素a[1]的地址 D、p被赋初值为数组元素a[0]的地址 39. p1指向某个整型变量,要使指针p2也指向同一变量,哪一个语句是正确的( )。 A、p2=*&p1; B、p2=**p1; C、p2=&p1; D、p2=*p1; 40. 假如指针p已经指向变量x,则&*p相当于( )。

A、x B、*p C、&x D、**p 41. 假如指针p已经指向某个整型变量x,则(*p)++相当于( )。

A、p++ B、x++ C、*(p++) D、&x++ 42. 数组定义为“int a[4][5];”,引用“a+3”表示( )。

A、a数组第3列的首地址 B、a数组第0行第3列元素的值 C、a数组第3行的首地址 D、a数组第0列第3行元素的值 43. 数组定义为“int a[4][5];”,引用“a[1]+3”表示( )。

A、a数组第1行第3列元素的地址 B、a数组第1行第3列元素的值 C、a数组第4行的首地址 D、a数组第4列的首地址 44. 数组定义为“int a[4][5];”,引用“*(*a+1)+2”表示( )。 A、a[1][0]+2 B、a数组第1行第2列元素的地址 C、a[0][1]+2 D、a数组第1行第2列元素的值

45. 数组定义为“int a[4][5];”,下列哪一个引用是错误的( )。

A、*a B、*(*(a+2)+3) C、&a[2][3] D、++a 46. 共用体定义为“union data {char ch;int x;} a;”,下列哪一个是正确的( )。 A、a.ch=?x?;a=10; B、a=?x?,10; C、a.x=10;a.ch=?x?; D、a=?x?;

47. 共用体定义为“union data {char ch;int x;} a;”,下列哪一个是不正确的( )。 A、a={?x?,10}; B、a.x=10;a.x++; C、a.ch=?x?;a.ch++; D、a.x=10;a.ch=?x?; 48. 按位与运算:int a=7,b=12,c=a&b; 变量c的值是( )。 A、19 B、4 C、5 D、9 49. 按位或运算:int a=6,b=8,c=a|b; 变量c的值是( )。 A、2 B、14 C、48 D、-2 50. 按位异或运算:int a=14,b=15,c=a^b; 变量c的值是( )。 A、1 B、15 C、-1 D、29 51. 按位取反运算:int a=16,c=~a;,变量c的值是( )。 A、17 B、7 C、84 D、-17 52. 左移运算:int a=16,c=a<<2; 变量c的值是( )。 A、67 B、4 C、1 D、64 53. 右移运算:int a=16,c>>2; 变量c的值是( )。

5

A、8 B、1 C、4 D、64

54. 以“只读”方式打开文本文件a:\\aa.dat,下列语句中哪一个是正确的( )。 A、fp=fopen(”a:\\aa.dat”,”ab”); B、fp=fopen(”a:\\aa.dat”,”a”); C、fp=fopen(”a:\\aa.dat”,”wb”); D、fp=fopen(”a:\\aa.dat”,”r”); 55. 以“追加”方式打开文本文件a:\\aa.dat,下列语句中哪一个是正确的( )。 A、fp=fopen(”a:\\aa.dat”,”ab”); B、fp=fopen(”a:\\aa.dat”,”a”); C、fp=fopen(”a:\\aa.dat”,”r+”); D、fp=fopen(”a:\\aa.dat”,”w”); 56. 为读写建立一个新的文本文件a:\\aa.dat,下列语句中哪一个是正确的( )。 A、fp=fopen(”a:\\aa.dat”,”ab”); B、fp=fopen(”a:\\aa.dat”,”w+”); C、fp=fopen(”a:\\aa.dat”,”wb”); D 、fp=fopen(”a:\\aa.dat”,”rb+”);

6

2 填空题

1. 设float x=2.5,y=4.7; int a=7;,表达式 x+a%3*(int)(x+y)%2/4 的值为 。 2. 设 int x=17,y=5; 执行语句 x+=--x%--y 后x的值为 。 3. 设 int x=17,y=5; 执行语句 x%=x++/--y 后x的值为 。

4. 设 int a=7,b=6,c=5;,表达式 (a+b)>(c*c)&&b==c||c>b 的值为 。 5.设 int a=3,b=5,c=7;,表达式a>c||c>b!=0&&c==b+a 的值为 。 6.已知三角形边长a、b、c和s=(a+b+c)/2,计算其面积的算术表达式为 。

7. 已知方程ax+bx+c=0系数a、b、c且存在两个实根,计算其中一个实根的算术表达 式为 。

8. p为本金,r为5年期存款年利率,计算存款p元5年到期时本金、利息总和的算术 表达式为 。

9.将数学式 (x+1)e 写作算术表达式为 。 10.ch是字符变量,判断ch为大写英文字母的逻辑表达式为 。 11. 判断int类型变量n是否为两位整数的逻辑表达式为 。

12. 判断变量a、b的值均不为0的逻辑表达式为 。 13. 判断变量a、b是否绝对值相等而符号相反的逻辑表达式为 。

14. 判断变量a、b中必有且只有一个为0的逻辑表达式为 。

15. m是值为两位数的整型变量,判断其个位数是奇数而十位数是偶数的逻辑表达式为 。

16. 求解赋值表达式 a=5+(c=6)后表达式值、a、c的值依次为 。 17. 求解赋值表达式 a=(b=10)%(c=6),表达式值、a、b、c的值依次为 。 18. 求解逗号表达式 x=a=3,6*a后,表达式值、x、a的值依次为 。 19. 求解逗号表达式 (a=15,a*4),a+5,表达式值、a的值依次为 。 20. 求变量a、b中最大值的条件表达式为 。

21. 若 a=13、b=25、c=-17,条件表达式 ((y=(a=?a?&&s<=?z?)?s-32:s; 字符变量s的值为 。 23. 整型变量x的值为25,语句“printf(”%o”,x);”的输出结果为 。 24. 整型变量m的值为27,语句 printf(”m=%x”,m);的输出结果为 。 25. 语句printf(”s%s”,”mall”); 的输出结果为 。

7

2x

2

26. 若int k=10, 循环语句while (k=0) k=k-1; 执行_________次。

27.若int k=2, 循环语句while (k!=0) { printf(\执行_____次。 28. 若int i=10,s=0;,执行语句while(s+=i--,--i);后s、i值分别为 。 29. 程序段 int s,i; for(i=1;i<=100;s+=i,i++); 能否计算1~100的和? 原因是 。

30. 若int类型变量字长为2,程序段 int jc=1; for(int i=2;i<10;i++)jc*=i; 能否 计算10的阶乘? 原因是 。 31. 定义a为共有10个元素的静态存储int类型数组的语句为 。

32. 定义a为长度为10的字符串、同时为字符串赋初值”continue”的语句为 。

33. 定义a为共有5个元素的一维整型数组、同时定义p为指向a数组首地址的指针变 量的语句为 。

34. 定义a为4行5列的二维整型数组、同时定义p为指向a数组首地址的指针变量的 语句为 。 35. 如定义语句为“char a[]=”windows ”,b[]=”95”;”,

语句“printf(”%s”,strcat(a,b));”的输出结果为 。 36. 定义语句为 char a[15],b[]=”windows 95”;,则语句 printf(”%s”,strcpy(a,b)); 的输出结果为 。

37. 定义语句为 char a[]=”Box”,b[]=”Boss”;,语句 printf(”%d”,strcmp(a,b));输 出 。

38. 定义语句为“char a[10]=”student”;”,语句“printf(”%d”,strlen(a));”的输出 结果为 。

39. 定义语句为 char a[]=”WINDOWS”;,语句 printf(”%s”,strlwr(a));输出 。 40. 定义语句为 char a[]=”hangzhou”,*p=a;,语句 for(int i=0; *p!=?\\0?; p++,i++); 执行后i的值为 。

41. 对宏定义语句“#define f(x,y) printf(x,y)”的引用 f(”%d\\n”,m); 置换展开后为 。

42. 宏定义语句 #define f(x,y) fopen(x,y) 的引用 f(”a.txt”,”rw”); 置换展开后为 。

43. 宏定义语句 #define f(c) c>=?A?&&c<=?Z? 的引用 f(x[i]) 置换展开后为 。

44.表达式 3&5、3|5、3||5 的值分别为 、 、 。

45.设 int x=707,表达式 x^x、x|x、~x^x 的值分别为 、 、 。

46.设 int x=0707,表达式 ~x&&x、!x&&x、x>>3&~0的值分别为 、 、 。 47. 函数的参数为int类型时,虚参与实参结合的传递方式为 。

8

48. 函数的参数为floatl类型时,虚参与实参结合的传递方式为 。 49. 函数的参数为char*类型时,虚参与实参结合的传递方式为 。 50. 函数的实参为常量时,虚参与实参结合的传递方式为 。 51.对下列递归函数,函数调用f(3)的返回值是 。 int f(int n) { return((n==0)?1:f(n-1)+2);}

52.函数f定义如下,调用f(\的返回值为 。 int f(char *s) { int k=0; while(*s) k+=*s++-'0'; return k;}

53. 函数change定义如下,a=10、b=5,执行 change(a,b)后a、b的值分别为 。 void change(int a,int b) { int t=0; t=a; a=b; b=t;}

54. 开辟一个存储n个int数据的内存区、并将内存区首地址送入p(指向int类型的指 针变量)的语句为 。 55.释放由p所指向的内存区的语句为 。

56.fp为文件位置指针,将fp移到离当前位置25个字节处的语句为 。

9

3 写输出结果题

阅读下列程序,将程序运行时的输出结果填写在答案栏内。

1. #include void main()

{ char ch; int k=0;

for(ch=?A?;ch

} 输出结果:

2. #include void main( )

{ int k=0; char c='A'; do {

switch (c++) {

case 'A': k++; break; case 'B': k--;

case 'C': k+=2; break; case 'D': k=k%2; break; case 'E': k=k*10; break; default: k=k/3;

} k++;

} while(c<'G');

printf(\

} 输出结果:

3. #include void main()

{ int a[6]={12,4,17,25,27,16},b[6]={27,13,4,25,23,16},i,j; for(i=0;i<6;i++) {

for(j=0;j<6;j++) if(a[i]==b[j])break; if(j<6) printf(\ }

printf(\

} 输出结果:

4. #include void main()

{ int a[8]={1,0,1,0,1,0,1,0},i;

for(i=2;i<8;i++) a[i]+=a[i-1]+a[i-2];

10

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

} 输出结果:

5. #include void main()

{ int s=1,t=1,a,n; scanf(\ for(int i=1;i

t=t*10+1; s=s+t; 输入数据:2,4 }

s*=a; printf(\输出结果: }

6. #include

#define PR(x,y) printf(\ void main( )

{ int x=03,y=02,z=01; 输出结果: ___________ PR(\ PR(\ PR(\ } ___________

7. #include void main()

{ int a[5]={2,4,6,9,12},b[6]={2,3,4,6,8,9}; for(int i=0;i<5;i++) for(int j=0;j<6;j++)

if(*(a+i)==*(b+j)) printf(\ printf(“\\n”);

} 输出结果:

8. #include #include void main() 输出结果:

{ char str1[]=\

for(int i=0;i<4;i++) { printf(\ str1[i]=? ?;

str1[strlen(str1)-1]='\\0'; } }

11

9. #include

void main()

{ char a[5][8]; 输出结果: for(int i=0;i<5;i++) for(int j=0;j<8;j++)

if(i==0||i==4) a[i][j]='-'; else a[i][j]=' '; for(i=1;i<4;i++) {

a[i][0]='|'; a[i][5]='|'; }

for(i=0;i<5;i++) a[i][6]='\\0';

for(i=0;i<5;i++) printf(\ }

10. #include void main()

{ char a[8],temp; int i,j; 输出结果: for(i=0;i<7;i++) a[i]='a'+i; for(i=0;i<3;i++) {

temp=a[0]; for(j=1;j<7;j++) a[j-1]=a[j]; a[6]=temp;a[7]='\\0'; printf(\ } }

11. #include

void main() 输出结果:

{ int i,j,n;

for(i=0;i<4;i++) {

for(j=1;j<=i;j++) printf(\

n=7-2*i;

for(j=1;j<=n;j++) printf(\ printf(\ } }

12. #include void main()

{ char a[8],temp; int j,k;

for(j=0;j<7;j++) a[j]='a'+j; 输出结果: a[7]='\\0';

12

for(j=0;j<3;j++) { temp=a[6];

for(k=6;k>0;k--) a[k]=a[k-1]; a[0]=temp;

printf(\ } }

13. #include

void print(int,char,int); 输出结果: void main()

{ print(3,'*',1); print(2,'*',3); print(1,'*',5); print(2,'#',3); print(2,'#',3); }

void print(int begin,char pzf,int n) { char a[50];

for(int i=0;i

14. #include

void main() 运行时输入: 5 –7 3,输出结果: { int a,b,c,find(int,int,int); scanf(”%d%d%d”,&a,&b,&c);

printf(”%d\\n%d,%d,%d\\n”,find(a,b,c),a,b,c); }

int find(int a,int b,int c) { int u,s,t;

u=((u=(a>b)?a:b)>c)? u:c; t=((t=(a

15. #include

void fun1(int n,int a[][3]) 输出结果:

{ for(int i=0;i

for(int j=0;j

}

void main()

13

{ int a[3][3]={{6,4,2},{8,6,4},{9,6,3}}; fun1(3,a);

for(int i=0;i<3;i++) {

for(int j=0;j<3;j++) printf(\ printf(\ } }

16. #include int fun3(int m) { int i;

if(m==2||m==3) return 1; 输出结果: if(m<2||m%2==0) return 0;

for(i=3;i

void main() { int n;

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

if(fun3(n)==1) printf(\ }

17. #include

void sub(int *a,int *b,int *c,m,n)

{ int i,j; 输出结果: for(i=0;i

void main()

{ int i,x[5]={1,5,3,8,4},y[3]={9,-4,6},z[8]; sub(x,y,z,5,3);

for(i=0;i<8;i++) printf(\ printf(\ }

18. #include

void sort(char *a[],int n) 输出结果: { int i,j,l; char *temp; for(i=0;i

if(strcmp(a[j],a[l])<0) l=j;

14

if(l!=i) {

temp=a[i]; a[i]=a[l]; a[l]=temp; } } }

void main()

{ char *name[4],

ch[4][15]={ ”morning”,”afternoon”,”night”,”evening” }; int k;

for(k=0;k<4;k++) name[k]=ch[k]; sort(name,4); for(k=0;k<4;k++)

printf(”%s\\n”,name[k]); }

19. #include \

void pline(char *a,char c,int l,int n) 输出结果: { int i; for(i=1;i

void main() { char a[80];

int i; void (*pf)(char*,char,int,int); pf=pline;

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

(*pf)(a,'$',5-i,2*i-1); puts(a); } }

20. #include \

int binary(int x,int a[],int n) 输出结果: { int low=0,high=n-1,mid; while(low<=high) { mid=(low+high)/2;

if(x>a[mid]) high=mid-1; else if(x

return(-1); }

15

void main( )

{ static int a[]={4,0,2,3,1}; int i,t,j; for(i=1;i<5;i++) { t=a[i]; j=i-1;

while(j>=0&&t>a[j]) { a[j+1]=a[j]; j--; }

a[j+1]=t; }

printf (\ }

21. #include

#include void main( )

{ double f(double,int);

printf(\ }

double f(double x,int n) { double t;

if(n==1) t=x; else {

if(n/2*2==n)t=x*f(x,n/2); else t=x*pow(f(x,n/2),2.0); }

return t; }

22. #include

double x,u,v double t(double a,double(*f)(double)) { return(*f)(a*a); } double f(double x) { return 2.0*x; } double g(double x) { return 2.0+x; } void main()

{ x=4.0;u=t(x,f);v=t(x,g);

printf(\ }

23. #include

16

输出结果: 输出结果: void main()

{ static struct s1{ char c[4],*s; }; s1={\

static struct s2{char *cp; struct s1 ss1;} s2={\

printf(\输出结果: printf(\ printf(\ printf (\ }

24. #include

struct s1{ char *s; int i; struct s1 *s1p; }; void main()

{ static struct s1 a[]={{\ int i;

for(i=0;i<2;i++) 输出结果: { printf(\ printf(\ }

25. #include void main()

{ FILE *fp; int i;

char s1[80],s[]=\ fp=fopen(\

fwrite(s,i,1,fp); rewind(fp); fread(s1,i,l,fp); printf(\ printf(\

fseek(fp,10,1); 输出结果: printf(\ fseek(fp,1,1); printf(\ fclose(fp); }

17

4 程序填空题

根据读下列各题题意填空,写入在程序中的划线处。 1. 输入2个整数,输出它们的最小公倍数和最大公约数。 #include void main( )

{ int m,n,gbs,gys;

scanf( ⑴ );

for(gbs=m; ⑵ ; gbs=gbs+m); gys= ⑶

⑷ }

2. 输入N个实数,输出其中的最大值、最小值。

#include void main()

{ float no1,nmax,nmin; ⑴ scanf(\ nmax=no1; ⑵ for(i=2;i<=n;i++) {

scanf(\⑶ );

if(nox>nmax) nmax=nox; ⑷ }

printf(\ }

3. 输入20个数,输出它们的平均值,输出与平均值之差的绝对值为最小的数组元素。 #include ⑴ void main()

{ float a[20],pjz=0,s,t; int i,k; ⑵

for(i=0;i<20;i++) pjz+=a[i]; ⑶ s=fabs(a[0]-pjz); for(i=1;i<20;i++)

if(fabs(a[i]-pjz)

s=fabs(a[i]-pjz); t=a[i]; }

⑷ }

18

4. 输入若干个字符,分别统计数字字符的个数、英文字母的个数,当输入换行符时输 出统计结果,运行结束。

#include void main()

{ char ch; ⑴

while(( ⑵ )!='\\n') { if(ch>='0'&&ch<='9') s1++;

if(ch>='a'&&ch<='z' ⑶ ) s2++; }

⑷ }

5. 输入m,求n使 n!<=m<=(n+1)!,例如输入726,应输出n=6。 ⑴ void main()

{ int ⑵ ;

scanf( ⑶ ); for(n=2;jc<=m;n++) jc=jc*n;

printf(”n=%d\\n”, ⑷ ); }

222

6. 下列程序计算并输出方程 X+Y+Z=1989 的所有整数解。 #include void main()

{ ⑴

for(i1=-45;i1<=45;i1++)

for( ⑵ ) for(i3=-45;i3<=45;i3++)

if( ⑶ )

printf( ⑷ ,i1,i2,i3); }

7. 下列程序求n(n的值由运行时确定)个正整数的最小公倍数。 #include #include void main()

{ int *p,i,n,gbs;

⑴ p= ⑵ ; for(i=0;i

if( ⑶ ) { gbs+=*p; ⑷

19

1996 年浙江省高校非计算机专业学生 计算机等级考试试卷(二级C语言)

试题四 判断题(5分)

请判断下列5个叙述是否正确,在答卷的相应位置处填上\√\正确)或\×\错误)。 1. 系统软件就是买来的软件,应用软件就是自己编写的软件。 2. 实数类型的变量不宜进行相等比较。

3. 计算机病毒也是一种程序,它在某些条件下激活,起干扰破坏作用,并能传染到其它程序中去。

4. 软件测试的目的是为了证明程序是正确的。 5. 描述算法的语言都是计算机程序设计语言。

试题五 计算题(共16分)

㈠ 定义:int a=20,n=10; 分别写出执行下列语句后a的值:(6分) ⑴ a/=a+a; ⑵ a%=n%=7; ⑶ a+=a-=a*=a; ㈡ 定义: int x=10,y=7,z=5; 计算下列表达式的值:(6分)

⑴ x=y>x?y:z ⑵ (int)x/y/(int)z ⑶ x=x+5,y+?A?

㈢ 定义:int i=10,s=0; 分别执行下列语句后,s和i的值是多少?(4分) ⑴ while (s+=i--,--i); ⑵ while (i!=0) {i--;s+=--i;};

试题六 阅读程序题(共22分)

㈠ 求以下四段程序题运行结束后s的值:(16分) ⑴ #include void main( ) { int s, j, k;

s=0; for(j=1;j<5;j++) { k=j%3; if(k==0)continue; s+=k; } printf(\ }

⑵ #include void main( ) { int s=0, j, k;

for(j=1;j<5;j++){ k=j%3;if(k==0)break;s+=k;}printf(\ }

⑶ #include int kk ( )

{ int x=4; static int y=5; x*=2; y*=2; return(x+y); } void main( ) { int j,s=0;

for(j=0;j<2;j++) s=kk(); printf(\ }

45

⑷ #include int kk ()

{ int x=4; static int y;

y=5; x*=2; y*=2; return(x+y); }

void main( ) { int j,s=0;

for(j=0;j<2;j++) s=kk ( ); printf (\ }

㈡ 写出下面程序的输出结果:(6分) #include void main()

{ char *str1[]={\ p2=str1; p1=*(++p2)+2; *p1=++(*(++p1)); printf (\

p3[0]=p2; p3[1]=++p2; p3[2]=p2-1;p4=p3; printf(\ return; }

试题七 填充题(共20分)

㈠ 在以下嵌套结构中填空,给出李明的姓名,年龄(20),性别(男),生日(1976年5月6日),语种(C)及系别(计算机系)的信息,并输出这些信息。(12分) #include

struct date{ int month; int day; int year; };

struct student { ⑴ name[20]; ⑵ age; ⑶ sex;

⑷ date birthday; ⑸ language; ⑹ department[30]; };

void main( )

{ struct student s1= ⑺ ; printf ⑻ ; }

㈡ 将编号从⑴到⑾的11位同学围成一圈,从第一号开始,按以下规则发贺卡:

F(1)=1,F(2)=2,F(n+1)=F(n)+F(n-1) 其中F(n)表示第n张贺卡发给了第F(n)。超过11时,F(n)绕圈计算(如F(n)=13,是发给了第⑵号同学的),如果发了20张贺卡,问各位同学分别发到了多少张贺卡?请填空完成以下程序,其中x[i]表示第i号同学发到的张数。(8分) #include void main( )

{ int a, b, c, i, k, x[12]; a=0; b=1; i=1;

while( ⑴ ) { x[i]=0; i++; } i=1; while( ⑵ ) {

46

c=a+b; k= ⑶ ; if(k==0)k=11; x[k]++;a=b;b=c;i++; }

k=1; while( ⑷ ){ printf(\ }

试题八 编程题(共22分)

㈠ 按以下编程说明编写C程序(10分)

定义一个6X6的整数矩阵A(其中元素均为不超过5位的整数),从键盘上输入该矩阵A的值,对矩阵A中不包括主对角线在内的上三角部分(列号大于行号)的每个元素的值加1,然后行列对齐输出矩阵A。

㈡ 编写一个函数char *delk (char *sp),把SP所指向的字符串中所有'$'字符删除,并把处理后的字符串的指针返回。(12分)

47

1996 年秋浙江省高校非计算机专业学生 计算机等级考试试卷(二级C语言)

试题三、计算题(本题共24分)

㈠ 定义int i=3,j=5;分别将执行下述语句后i、j的值填入答卷对应行栏内(12分) ⑴ i=(--i

⑶ i*=3+2%i; j=(i

㈡ 分别将执行下述语句后i的值填入答卷的对应栏内(12分) ⑴ char c='2'; int i=0; switch (c+1-'0') { case 2: i+=1; case 3: i+=2; case 3: i+=3; }

⑵ for(i=0,j=1;j<10;j++) { if(j%2) continue; i+=j; }

⑶ static struct s{ int x, y[2];} a[]={1,2,3,4,5,6,7,8}, *p=a; int i;

i=*((int*)(p+1)+2); 试题四、阅读程序(共21分)

请写出下列程序的运行结果 ⑴ #include \ void putsymb (int); void main( ) { int i, n=7;

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

putsymb(n-1); putchar('a'+i); putchar ('\\n'); } }

void putsymb(int n) { int i;

for(i=1;i<=n;i++) putchar('*'); }

⑵ f(char *s) { int k=0;

while(*s) k+=*s++-'0'; return k; }

void main( )

{ printf(\

48

⑶ void main( )

{ int x=1,y=2; int funcl( ); y=funcl(&x,&y); x=funcl(&x, &y);

printf(\ }

funcl(int *a,int *b) { if(*a>*b) (*a)-=*b; else (*a)--; return(*a+*b); }

试题五、填充题(共21分)

阅读下列程序和说明,把应填入 () 处的内容写在答卷的对应栏内。 ⑴ 下述程序建立一个按以下格式输出的二维数组。 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 #include void main()

{ int a[5][5]={0},*p[5],i,j;

for(i=0;i<5;i++) p[i]= ⑴ ; for(i=0;i<5;i++) {

*(p[i]+i)=1; *(p[i]+ ⑵ )=1; }

for(i=0;i<5;i++) {

for(j=0;j<5;j++) printf(\⑶ ; } }

⑵ 下述程序在有序链表中插入操作S,其中Head为链表头指针,S指向待插入的节点。 struct st { int num; struct st *next; };

struct st *insert(struct st *Head, struct st *s) { struct st,*p0,*p1,*p2; p1=Head; p0=s; if(p1==NULL) {

⑴ ; p0->next=NULL; } else

while((p0->num->p1->num)&&(p1->next!=NULL)) { p2=p1; p1=p1->next; }

49

}

printf(\ }

8. 调用find函数求实参数组中最大值,再调用find函数求实参数组中最小值。 #include void main()

{ float s,a[7]={2,6,3,8,3,12,9},find(float*,int,int); s=find(a,7,1); ⑴ ⑵ printf(\ }

float find(float *p,int n,int flag) { int i; float t,fh;

if(flag>=0) fh=1; else fh=-1; ⑶ for(i=1;it*fh) t=*(p+i); ⑷ }

9. 对数组按值从大到小的顺序排序后输出。

#include void main()

{ float a[7]={2,6,3,8,3,12,9}; void sort(float*,int); ⑴

for(int i=0;i<7;i++) printf(\ printf(\ }

void sort( ⑵ ) { int i,j,k; float t; for(i=0;i

for(j=i+1;j

10. 下列程序读入时间数值,将其加1秒后输出,时间格式为:

hh: mm: ss,即时:分:秒,当小时等于24小时,置为0。 #include

struct { int hour, minute, second; } time; void main(void)

{ scanf(\⑴ ); time.second++; if( ⑵ ==60) {

20

⑶ time.second=0; if(time.minute==60) {

time.hour++; time.minute=0;

if( ⑷ ) time.hour=0; } }

printf (\ }

11. 将编号从⑴到⑾的同学围成一圈,按下列顺序贺卡:⑴、⑶、⑹、⑻、⑾、⑵、⑸ ⑺、⑽、⑴、⑷、……,计算至少发到第几张时,每位同学发到的贺卡数同样多。 #include void main()

{ int num=1,jg=2,ip=1,i,m[12]; for(i=1;i<12;i++) m[i]=0; while(1) {

m[ip]++; num++; ip+=jg; if(ip>11) ⑴

if(jg==3) jg=2; else ⑵

for(i=2;i<=11;i++) if( ⑶ ) break; if( ⑷ ) break; }

printf (\发到第%d张时每人手中贺卡数一样多\\n”, ⑸ ); }

12. 下列函数可以对一维数组按值从大到小或从小到大排序。 void sort(float *p,int n,int swich) { int fh,i,j,l; ⑴

if(swich==0) fh=-1; ⑵ ; for(i=0;i

for(j=i+1; ⑶ ;j++) if(*(p+j)*fh> ⑷ ) l=j; t=*(p+i); *(p+i)=*(p+l); *(p+l)=t; } }

13. 下列函数用矩形公式求f(x)在[a,b]的定积分: 先M等份积分区间求得积分近似值, 再2M等份求得积分近似值,再4M等份求得积分近似值,……,当两次积分近似 值之差的绝对值小于eps时返回计算结果。

float sum(float a,float b,int m,float eps) { float h,s1=0,s2,x; ⑴ while(flag) {

s2=0; x=a; h=(b-a)/m

21

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

s2+=(f(x)+f(x+h))*h/2; x=x+h; }

⑵ s1=s2; m=m*2; }

⑶ }

14. 下列函数输出一行字符:先输出kb个空格,再输出n个指定字符(由实参指定)。 #include

void print( ⑴ ) { int i;

for(i=1;i<=kb;i++) ⑵ for( ⑶ ) printf(“%c”,zf); ⑷ }

2n

15. 下列函数求任意阶多项式 a0+a1X+a2X+...+anX的值并返回多项式的值。 float sum( ⑴ ) { float y,t=1; ⑵ y=*a;

for(i=1;i<=n;i++){ ⑶ y+=*(a+i)*t; }

⑷ }

16. 下列函数在n个元素的一维数组中,找出最大值、最小值并传送到调用函数。 #include void find(p,max,min,n)

float ⑴ ; int n; { int k; ⑵ *max=*p; ⑶ for(k=1;k

if( ⑷ ) *max=t; if(t<*min) *min=t; } }

22

17. 下列函数用于将任意方阵(行数等于列数的二维数组)转置。

void mt( ⑴ ) 如数组 1 11 -3 -2 { int i,j; float t; 2 3 4 5 for(i=0;i

(a+i*n+j)=*(a+j*n+i); 1 2 7 4 ⑶ 11 3 -4 5 } -3 4 4 6 } -2 5 2 7

18. 下列程序读入六个字符串,排序后输出。 #include

void sort(char *a[],int n) { int i,j,l; char *temp; for(i=0;i

for(j=i+1;j

void main()

{ char *name[6],ch[6][30]; int k; for(k=0;k<6;k++) ⑵

for(k=0;k<6;k++) gets(name[k]); ⑶ for(k=0;k<6;k++) puts(name[k]); }

19. 下列函数用于将链表中某个节点删除,其中n为全程量,表示链表中的节点个数。 struct tabdata *del(struct tabdata *h, long num) { struct tabdata *p1,*p2; int if(h==NULL) {

printf(”\\nlist null!\\n”); ⑴ }

p1=h;

while(num!=p1->num&& ⑵ ) { p2=p1; p1=p1->next; }

if(num==p1->num) {

23

if(p1==h) h=p1->next;

else ⑶

n--; printf(”delete:%ld\\n”,num); }

else printf(”%ld not been found!\\n”,num); end: return h; }

20. 下列函数用于将链表中各节点的数据依次输出。

void print(struct student *head) { ⑴ p=head;

if(head!=NULL) do {

printf(”%ld\\n”,p->data); ⑵ } while ( ⑶ ); }

21. 已建立学生“英语”课程的成绩链表(成绩存于score域中),下列函数用于计算 平均成绩并输出。

void print(struct student *head)

{ struct student *p;float num; ⑴ ; ⑵ ; if(head!=NULL) {

for(num=0;p!=NULL; ⑶ ,i++) num+=p->score; num=num/i; printf(“%8.1f\\n”,num); } }

22. 已建立学生“英语”课程的成绩链表(成绩存于score域中,学号存于num域中), 下列函数用于输出待补考学生的学号和成绩,及补考学生人数。

void require(struct student *head) { struct student *p; ⑴ if( head!=NULL) { ⑵ while(p!=NULL) { if( ⑶ ) {

printf(”} %6.1f\\n”,p->num,p->score); x++; }

p=p->next; }

24

* * * * * * * * * * * * * * * * - | | | - - - - - - - - - - | | | -

g a b c d e f f g a b c d e e f g a b c d 10. 11.

b c d e f g a c d e f g a b d e f g a b c 7 7 7 7 7 7 7 5 5 5 5 5 3 3 3 12.

13. 14. 3 15.

* * * * * * * * * # # # # # # 16. 2 3 5 7 17. 1 5 3 8 4 9 18. afternoon 19. evening morning

night

20. 1 21. 256.000000 22. U=32.000v=18.000 23.a,d 24. 0 25. All=abcdefghijklmnop abc,def e seek1 ch=a ghi,mno 1 seek2 ch=l hi,no i seek3 ch=n

1

1 4 2 1 1 4 3 2 1 –4 6 $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 30

5,-7,3

4 程序填空题

1. ⑴ ”%d%d”,&m,&n ⑵ gbs%n!=0

⑶ m*n/gbs; ⑷ printf(”%d %d\\n”,gbs,gys); 2. ⑴ int i,n; float nox; ⑵ nmin=no1;

⑶ &nox ⑷ else if(nox

3. ⑴ #include ⑵ for(i=0;i<20;i++) scanf(”%f”,&a[i]); ⑶ pjz/=20; t=a[0]; ⑷ printf(”%f %f\\n”,pjz,t); 4. ⑴ int s1=0,s2=0; ⑵ ch=getchar()

⑶ ||ch>=’A’&&ch<=’Z’ ⑷ prnitf(”%d %d\\n”,s1,s2);

5. ⑴ #include ⑵ m,n,jc=1 ⑶ ”%d”,&m ⑷ n-2 6. ⑴ int i1,i2,i3 ⑵ i2=-45;i2<=45;i2++ ⑶ i1*i1+i2*i2+i3*i3==1989 ⑷ ”%d %d %d\\n”

7. ⑴ scanf(”%d”,&n); ⑵ (int*)malloc(n*sizeof(int)) ⑶ gbs%*(p+i)!=0 ⑷ goto l1;

8. ⑴ printf(”%f\\n”,s); ⑵ s=find(a,7,-1); “-1”也可以改为其它负数 ⑶ t=*p; ⑷ return t;

9. ⑴ sort(a,7); ⑵ float *p,int n ⑶ *(p+j)>*(p+k) ⑷ t=*(p+i); 10. ⑴ &time.hour,&time.minute,&time.second

⑵ time.second ⑶ time.minute++; ⑷ time.hour==24 11. ⑴ ip-=11; ⑵ jg=3; ⑶ m[i]!=m[1] ⑷ i==12 ⑸ num-1

12. ⑴ float t; ⑵ else fh=1 ⑶ j

2n

15. 下列函数求任意阶多项式 a0+a1X+a2X+...+anX的值并返回多项式的值。

⑴ flaot *a,int n,float x ⑵ int i; ⑶ t=t*x; ⑷ return y; 16. ⑴ *p,*max,*min ⑵ float t; ⑶ *min=*p; ⑷ t>*max 17. ⑴ flaot *a,int n ⑵ j=i+1;j ⑵ name[k]=ch[k]; ⑶ sort(name,6); 19. ⑴ goto end ⑵ p1->next!=NULL ⑶ p2->next=p1->next 20. ⑴ struct student *p; ⑵ p=p->next; ⑶ p!=NULL 21. ⑴ int i=0 ⑵ p=head ⑶ p=p->next 22. ⑴ int x=0; ⑵ p=head; ⑶ p->num<60 23. ⑴ p1->next!=NULL ⑵ p0->next=p1 ⑶ p0->next=NULL

24. ⑴ FILE *fp; ⑵ int m,e,c,i,n; ⑶ fp=fopen(”student.dat”,”W”); ⑷ fclose(fp);

31

25. ⑴ f3=fopen(\⑵ fprintf(f3,”%d\\n”,y);

⑶ fprintf(f3,”%d\\n”,y); ⑷ ”%d\\n”,x ⑸ fscanf(f1,\

5 编程题参考答案

1.编程,统计在所输入的50个实数中有多少个正数、多少个负数、多少个零。 #include \ #define N 50 void main()

{ float x; unsigned int s1,s2,s3,i; s1=s2=s3=0;

for(i=1;i<=N;i++) { scanf(\

if(x<0) s1++; else if(x==0) s2++; else s3++; }

printf(\负数%u个,零%u个,正数%u个\\n\ }

22

2. 编程,计算并输出方程 X+Y=1989 的所有整数解。 #include \ void main() { int x,y;

for(x=-45;x<=45;x++) { y=-45;

while(y<=45) {

if(x*x+y*y==1989) printf(\ y++; } } }

3.编程,输入一个10进制正整数,然后输出它所对应的八进制、十六进制数。 #include \ void main()

{ unsigned int x;

printf(\请输入一个十进制正整数:\ printf(\八进制数 %o=十六进制数%x\\n\ }

4.编程,找出1000以内的所有完数,并输出其因子。 #include \

32

void main() { int i,j,s=1;

for(i=1;i<=1000;i++,s=1) {

for(j=2;j<=i/2;j++) if(i%j==0) s+=j; // 求 i的因子和 if(s==i) {

printf(\如果i 是完数则输出其各因子 for(j=2;j<=i/2;j++)

if(i%j==0) printf(\ printf(\ } } }

5. 输入一个正整数,输出它的所有质数因子。 #include \ void main() { int m,i=2;

printf(\请输入一个整数:\

while(m!=1) if(m%i==0){ printf(\ printf(\ }

6. 输入20个整数,输出其中能被数组中其它元素整除的那些数组元素。 #include \ #define N 20 void main()

{ int a[N],i,j;

for(i=0;i

if(a[i]%a[j]==0&&i!=j) { printf(\ }

7. 输入两个数组(数组元素个数自定),输出在两个数组中都出现的元素。 #include \ #define NA 6

#define NB 8 void main()

{ float a[NA],b[NB]; int i,j;

for(i=0;i

33

if(a[i]==b[j]) { printf(\ }

8. 输入两个数组(数组元素个数自定),输出在两个数组中都不出现的元素。

#include \ #define NA 6 #define NB 8 void main()

{ float a[NA],b[NB]; int i,j;

for(i=0;i

for(j=0;j

printf(\

for(i=0;i

for(j=0;j

printf(\ }

9.编程,将字符数组S2中的全部字符拷贝到字符数组S1中。 #include \ void main()

{ char s1[20],s2[]=\ while((s1[i++]=s2[i])!='\\0'); printf(\ }

10.给定年份year,判别该年份是否闰年(定义一个宏以判别该年份是否闰年)。 #include

#define f(year) year%4==0&&year0!=0||year@0==0 void main() { int y;

printf(\请输入年份:\ if(f(y)) printf(\年为闰年\\n\ else printf(\年不是闰年\\n\ }

11.输入一行小写字母后,或输出原文,或将字母变成其下一字母(a变成b、b变成c、

34

…、x变成y、y变成z、z变成a)输出,用条件编译方法实现以上选择。 #include #define MAX 80 #define SWITCH 1 void main()

{ char str[MAX]; int i=0;

printf(\请输入文本行:\\n\ #if(SWITCH)

while(str[i]!='\\0')

if(str[i]>='a'&&str[i]<='z')

if(str[i]=='z')str[i]='a'; else str[i]++; i++; #endif

printf(\ }

12. 编写函数,处理n行n列维数组:将每一行的元素同除以该行上绝对值最大的元素。 #include \ #include \

void div(float** a,int n) { int i,j; float x; for(i=0;i

for(j=1;jfabs(x)) x=*(*(a+i)+j); for(j=0;j

return; }

void main() //函数引用示例

{ float b[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int i,j; float* c[3]; for(i=0;i<3;i++) c[i]=b[i]; div(c,3); for(i=0;i<3;i++) {

for(j=0;j<3;j++) printf(\ } }

2n

13. 编写函数,求任意阶多项式 a0+a1X+a2X+...+anX的值并返回多项式的值。 #include \

float f1(float* a,float x,int n) { int i; float t=1,y=0;

for(i=0;i

35

void main() // 函数引用示例 { float b[4]={1,2,3,4};

printf(\ }

14. 设计一个函数,使给出一个数的原码,能得到该数的补码。

#include // 假定sizeof(int)为2;

unsigned int getbit(unsigned int value) // 第1位为0表示正数的原码, { if(value>>15) return (value^0x7fff)+1; // 其补码即其原码;若value else return value; // 右移15位后为1,表示value是负数的原码,负数 } // 的补码为原码按位取反(第1位不变)后加1。 void main()

{ unsigned int y=0x800c,k; // -12的原码为(1000000000001100)2=(800c)16 k=getbit(y); // 其反码为(1111111111110011)2

printf(\其补码为(1111111111110100)2=(fff4)16 }

15. 编写函数,求m行、n列的二维数组全体元素中负数的个数。 #include

int sum(float **a,int m,int n) { int i,j; int y=0;

for(i=0;i

void main() // 函数引用示例

{ float b[2][3]={{-1,2,-3},{4,-5,-6}}; int i; float* c[2]; for(i=0;i<2;i++) c[i]=b[i]; printf(\ }

16. 编写函数,返回在一个整数组中出现次数最多的数及其出现次数。 #include

void fun(float *a,int n,int *k,float *x) { int i,j,y; *k=0;

for(i=0;i

for(j=0;j*k) { *k=y; *x=*(a+i); } }

return; }

void main() // 函数引用示例

{ float c[10]={0,4,2,4,3,2,4,-3,1.5,7.6},t; int m;

fun(c,10,&m,&t); // 若说明 float *t; int *m;

36

printf(\元素%f出现次数为%d\\n\引用为 fun(c,10,m,t); 将产生 } // 悬挂指针的错误,即t、m不只指向确定的存储单元。

17.编一个程序,打入月份号,输出该月的英文月名,要求用指针数组处理。 #include void main()

{ static char *month_name[12]={\ \ int n;

printf(\请输入月份号:\ if(n<1||n>12) printf(\月份号输入错误!\\n\

else printf(\月的英文表示是%s\\n\ }

18.编写递归函数,将输入的以“?”结束的字符串按与输入相反的顺序输出。 #include void pline() { char ch;

if((ch=getchar())!='?') { pline(); putchar(ch); } return; }

void main() // 函数引用示例

{ pline(); printf(\ 19. 编写函数,在n个元素的一维数组中,统计比相邻元素大的数组元素个数并将统计数返回(不考虑a[0]和a[n-1]),要求以指针变量而不是数组名作参数。 #include

int num(float *x,int n) { int i,k=0;

for(i=1;i*(x+i-1)&&*(x+i)>*(x+i+1)) k++; return k; }

void main() // 函数引用示例 { float a[10]={1,3,4,2,6,7,12,5,9,8}; printf(\ }

20. 编写函数,在n个元素的一维数组中,找出最大值、最小值并传送到调用函数。 #include

void num(float *b,int n,float *max,float *min) { *max=*b; *min=*b;

for(int i=1;i

37

if(*(b+i)>*max) *max=*(b+i); if(*(b+i)<*min) *min=*(b+i); }

return; }

void main() // 函数引用示例

{ float a[10]={1,3,4,2,6,7,12,5,9,8},x,y;

num(a,10,&x,&y); printf(\最大值为%.f,最小值为%.f。\\n\ }

21. 编写一个函数,统计m行n列二维数组中有多少个正数、多少个负数,多少个零,并

返回统计结果。

#include

void sub(float** a,int m,int n,int *fs,int *lin,int *zs) { int i,j; *fs=*lin=*zs=0;

for(i=0;i

else if(*(*(a+i)+j)==0) (*lin)++; else (*zs)++; return; }

void main() // 函数引用示例

{ float b[5][3]={{-1,5,2},{3,0,-2},{0,-3,5},{4,7,-8},{3,4,5}},*c[5]; int i,k1,k2,k3;

for(i=0;i<5;i++) c[i]=b[i]; sub(c,5,3,&k1,&k2,&k3); printf(\负数%d个,零%d个,正数%d个。\\n\ }

22. 编写函数,在给定的一行以‘.’结束的字符中,找出最长的单词并输出。 #include void find(char *str)

{ char *p1,*p2,*p3; int k1=0,k2=0; // k1为最长串的长度,初值为0。 p1=p2=p3=str; // p3指向最长串首字符,p1指向当前处理串首字符, while(*p2!='.') // p2为移动指针,*p2为空格表示查找到单词尾部。 if(*p2!=' ') { k2++; p2++; }

else if(k2>k1) { p3=p1; p1=++p2; k1=k2; k2=0; } else { k2=0; p1=++p2; }

for(k2=0;k2<=k1;k2++) printf(\ printf(\ }

void main() // 函数引用示例 { char a[40]; int i=0;

while((a[i++]=getchar())!='.'); find(a); }

38

23. 编写函数print,打印一个学生的成绩数组,该数组中有若干个学生的数据记录,每个记录包括num,name,score[3]。 #include

struct student { char num[7],name[9];int score[3];}; // 尾部分号不得遗漏 void print(struct student* s,int n)

{ int i; // 运算符‘*’、‘&’的优先级均低于运算符‘.’ for(i=0;i

void main()

{ struct student t[4]; int i; for(i=0;i<4;i++)

scanf(\ &t[i].score[1],&t[i].score[2]); print(t,4); }

24. 把文本文件d1.dat复制到文本文件d2.dat中,要求仅复制d1.dat中的英文字符。 #include void main()

{ FILE *fpd1,*fpd2; char ch;

fpd1=fopen(\ while(fscanf(fpd1,\

if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z') fprintf(fpd2,\ fclose(fpd1); fclose(fpd2); }

25. 编程,把文本文件d1.dat复制到d2.dat(其中空格字符不复制)。 #include void main()

{ FILE *fpd1,*fpd2; char ch;

fpd1=fopen(\ while(fscanf(fpd1,\ if(ch!=' ') fprintf(fpd2,\ fclose(fpd1); fclose(fpd2); }

26. 编程,把文本文件d1.dat复制到d2.dat(其中大写英文字母要转换为小写字母)。 #include void main()

39

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

Top