C程序设计教程课后习题答案吉顺如版

第1章习题 一、选择题

1、A 2、D 3、C 4、D 5、B 6、C 7、C 8、B 9、B 10、A 二、填空题 1、一,函数体

2、main(主) ,main(主) 3、编译,目标 4、.c ,.obj ,.exe

5、缩进,无影响,/* */ 三、程序分析题 1、

***************** Very good!

***************** 2、

a=12,b=5 a=17,b=22 3、

r= 5.50,s=95.033098

四、编程题

1.用printf()函数在屏幕上输出自己的班级、学号、姓名。 #include"stdio.h" void main() {

printf("班级:BX1109\n");

printf("学号:[1**********]1\n"); printf("姓名:王孟荣\n"); }

2.从键盘输入两个整数,计算它们的和、差、积、商,并在屏幕上输出结果。

#include void main() {

int x,y,a,b,c; float d;

printf("Please Input Two Integers:\n"); scanf("%d%d",&x,&y); a=x+y; b=x-y; c=x*y; d=1.0*x/y;

printf("a=%d\nb=%d\nc=%d\nd=%f\n",a,b,c,d); }

第2章习题 一、选择题 1~5 BCDCD 6~10 DBBCA 二、填空题

1.单精度浮点型、双精度浮点型、字符型 2.0

3.x%10*10+x/10 4.5.5 5.5.7 20

6.sin(sqrt(x*x))/(a*b) 7. ,

8.1111011 173 7B 9.3 3 10.3

三、程序分析题 1. 7,8,10 2. 1,3 3. 5 F

4. (int)i=12, 12.50 5. 4 61 57 9 112

四、编程题

1.编写程序,求表达式c=21%9-(float)a+4/b*b的值,假设表达式中a 和b 的值分别由键盘输入。

#include void main( ) {

int a,b; float c;

printf("Please input data a,b: "); scanf("%d%d",&a,&b); c=21%9-(float)a+4/b*b; printf("c=%5.2f\n", c); }

2. 编写程序,从键盘输入两个整数存入变量a 和b 中,求a2-b2的值并输出。 #include void main( ) {

int a,b,c;

printf("Please input data a,b: "); scanf("%d%d",&a,&b); c=a*a-b*b;

printf("c=%d\n", c); }

第3章习题 一、选择题 1 D

2 C

3 A 、B

4 A

5 B

6 B

7 B 、C

8 B

9 D

10 D

二、填空题

1. 有穷性 确定性 可行性 2. #

3. 从终端(键盘)输入一个字符 4. m d 5. 97,g

6. 123.456000, 123.46, 123

7. 格式控制符不正确(输入数据时不能控制列宽和小数位数) 8. 63,63,77,3f 9. %f%f &x,&y

10. ch ch 三、程序分析题 1. c=11

2. a=123 f=457 3. x=345 y=3.460000 4. a=1,b=3 a=3,b=1

5. (题目需修改为:从键盘输入一个除a 和z 以外的小写字母)

程序的功能:从键盘输入一个除a 和z 以外的小写字母,求出该字母对应的大写字母的前趋和后继字母,然后顺序输出此三个大写字母,每个字母所占列宽为3。 运行结果: 假如输入:f ' 输出: E F G

四、编程题

1.编写程序,计算的值并输出(保留3位小数) ,其中a 、b 的值由键盘输入。 #include #include void main( ) { float a, b,x;

scanf("%f%f", &a, &b); x=(a*a+b*b)/sqrt(3*(a+b)); printf("x=%.3f\n",x); }

2.编写程序,从键盘输入一个梯形的上底a 、下底b 和高h ,输出梯形的面积s 。

#include

#include void main( ) { float a, b,h,s;

scanf("%f,%f,%f", &a,&b,&h); s=(a+b)*h/2;

printf("梯形面积s=%.2f\n",s); }

3.编写程序,在屏幕上输入你姓名的第一个字母,显示出该字母以及下面的信息: Hello!

This is a c program.

My name is [第一个字母]

#include void main( ) {

char name;

name=getchar(); putchar(name); printf("\nHello!\n");

printf("This is a c program.\n"); printf("My name is %c\n",name); }

第4章习题 一、选择题 1 B

2 B

3 C

4 B

5 C

6 A C

7 B

8 A

9 C

10 C

二、填空题 1. ! && || 2. 1 3. a b 4. 1 5. 0

6. x%4= =0 && x%100!=0 7. 5 6 8. A

9. x10 && x

三、程序分析题 1. No 2. -2 3. 5 3 2

4. #& 5. (1)2 (2)3 CC

a=2,b=2,c=4 四、编程题

1. 有一个函数如下: x2-2 (x

编写程序,输入x 的值,计算相应的y 值输出(保留3位小数) 。 #include #include void main() { float x,y;

scanf("%f", &x); if(x

else if(x

printf("x=%f, y=%.3f\n", x,y); }

2.编写一个程序,根据输入的三角形的三条边判断是否能组成三角形,如果可以则输出它的面积和三角形类型(等边、等腰、直角、一般三角形)。 #include #include void main( )

{ float a, b, c, s, area;

scanf("%f,%f,%f", &a,&b,&c); if(a+b>c && b+c>a && a+c>b) { s=(a+b+c)/2;

area=sqrt(s*(s*(s-a)*(s-b)*(s-c))); printf("area=%f\n",area); if(a==b && b==c)

printf("等边三角形\n");

else if(a==b || a==c || b==c) printf("等腰三角形\n");

else if((a*a + b*b== c*c)||(a*a + c*c== b*b)||(b*b + c*c == a*a)) printf("直角三角形\n");

else printf("一般三角形\n"); }

else printf("不能组成三角形\n"); }

3.设奖金税率r 有如下的要求 (n代表奖金) : 0 n

用switch 多分支选择语句编写程序,输入奖金值,计算并输出相应的税率和实际应得奖金值。

#include void main( ) { float n, r, s; int m;

printf("请输入奖金值:"); scanf("%f", &n); if(n>=6000) m=6; else m=n/1000; switch(m)

{ case 0: r=0; break; case 1: r=0.05; break; case 2: r=0.08; break; case 3:

case 4:

case 5: r=0.1; break; case 6: r=0.15; break; }

s=n-r*n;

printf("税率r=%.0f%%, 奖金值n=%.2f, 实际应得奖金值s=%.2f\n",r*100, n, s); }

4. 从键盘输入任意4个数a 、b 、c 、d ,按照从大到小的顺序排列后重新输出。 #include void main( ) { int a, b, c, d,t;

scanf("%d,%d,%d,%d", &a,&b,&c,&d); if(a

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

5. 给出一个不超过4位数的正整数,判断它是几位数,并按逆向输出各位数字。例1234,输出为4321。 #include void main( )

{ int num,i,j,k,m;

printf("输入一个少于4位的正整数:"); scanf("%d",&num);

if(num>=0 && num

{ if(num>1000 && num

m=num%10; /*求个位上的数字*/ k=num/10%10; /*求十位上的数字*/ j=num/100%10; /*求百位上的数字*/ i=num/1000; /*求千位上的数字*/ printf("逆序数为:%d%d%d%d\n",m,k,j,i); }

else if(num>=100)

{ printf("是一个3位数\n");

m=num%10; /*求个位上的数字*/ k=num/10%10; /*求十位上的数字*/ j=num/100; /*求百位上的数字*/ printf("逆序数为:%d%d%d\n",m,k,j);

}

else if(num>=10)

{printf("是一个2位数\n");

m=num%10; /*求个位上的数字*/ k=num/10; /*求十位上的数字*/ printf("逆序数为:%d%d\n",m,k); }

else

{printf("是一个1位数\n"); printf("逆序数为:%d\n",num); } }

else printf("是一个无效的数\n"); }

第5章习题 一、选择题 1 B

2 C

3 B

4 C

5 A

6 B

7 D

8 B

9 A

10 B

二 填空题

1. 循环 switch 2. 4,7 3. 6 4. # # 5. 0 2 6. 18 7. 1

8. sum=80 9. c=getchar() n:m

10. i %13= =0 break

三 程序分析题 1. output1:21 6 output2: 5 6 output3: 5 7 7 2. n=7 3. Max=18 Min=3 4. 1*1=1

2*1=2 2*2=4

3*1=3 3*2=6 3*3=9 5. 0 1 2 3 1 2 3 0 2 3 0 1 3 0 1 2 四、编程题

1. 从键盘上输入若干字符,以按Enter 键结束,统计其中字符A 或a 的个数。 #include "stdio.h" main() { char ch; int k=0;

while((ch=getchar())!='\n') { if(ch=='A' || ch=='a') k=k+1; }

printf("%d\n",k); }

2. 利用=×…的前100项之积计算p 的值。 #include main() {

double term, result = 1; /*累乘项初值应为1*/ int n;

for (n=2; n

term=(double)( n * n)/((n-1)*(n+1)); /*计算累乘项*/ result = result * term; }

printf("result = %f\n", 2*result); }

3. 用1元5角钱人民币兑换5分、2分和1分的硬币(每一种都要有)共100枚,问共有几种兑换方案?每种方案各换多少枚? #include main() {

int x,y,z,count=0; for(x=1;x

z=100-x-y;

if(5*x+2*y+z==150) {

count++;

printf("%d,%d,%d\n",x,y,z); } }

printf("count=%d\n",count); }

4. 鸡兔同笼,共有98个头,386只脚,编程求鸡、兔各多少只。 #include main() { int x, y;

for (x=1;x

if(2*x+4*y==386)

printf("鸡=%d,兔=%d",x,y); } }

5. 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 #include main()

{

int n,i;

printf("\nplease input a number:\n"); scanf("%d",&n); printf("%d=",n); for(i=2;i

if(n%i==0) { printf("%d*",i); n=n/i; }

else break; }

printf("%d",n);

6. 从键盘任意输入一个4位数x ,编程计算x 的每一位数字相加之和。例如,输入x 为1234,则由1234分离出其千位1、百位2、十位3、个位4,然后计算1+2+3+4=10,并输出10。 #include #include main() {

int i1,i2,i3,i4,k,n;

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

k=fabs(n); /*取绝对值*/ i1=k/1000; /*分离出千位*/

i2=(k-i1*1000)/100; /*分离出百位*/

i3=(k-i1*1000-i2*100)/10; /*分离出十位*/ i4=k%10; /*分离出个位*/

printf("The sum of the total bit is %d\n",i1+i2+i3+i4); }

7. 打印出所有" 水仙花数" ,所谓" 水仙花数" 是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,因为153=13+53+33。 #include void main() {

int i,j,k,n;

printf("parcissus numbers are:\n"); for (n=100;n

i=n/100; j=n/10-i*10; k=n%10;

if (n==i*i*i+j*j*j+k*k*k) printf("%d\n",n); } }

8. 利用泰勒级数sin(x)≈计算sin(x) 的值。要求最后一项的绝对值小于10-5,并统计出此时累加了多少项(x 由键盘输入)。 #include #include main() {

int n=1,count=1; float x;

double sum,term; /*因为位数多,所以定义为双精度 */ printf("Input x: "); scanf("%f", &x); sum=x;

term=x; /*赋初值*/ do {

term=-term*x*x/((n+1)*(n+2)); sum=sum+term; /*累加 */ n=n+2; count++;

}while(fabs(term)>=1e-5);

printf("sin(x)=%.1f,count=%d\n",sum,count); } 9.编写一个猜数游戏:任意设置一个整数,请用户从键盘上输入数据猜想设置的数是什么,告诉用户是猜大了还是小了。10次以内猜对,用户获胜;否则,告诉用户设置的数据是什么。

#include void main()

{int num=123,x,n;

printf("hint:0

if(x==num) {printf("Win!\n");break;} if(x>num) printf("bigger!\n"); if(x

if(n==11) printf("Lost!the number is %d\n",x); }

10. 编程输出以下图案。 * *** ***** ******* ***** *** *

#include main() {

int i,j;

for(i=1;i

for (j=20-i;j>=1;j--) printf("%c",' ');

for (j=0;j

for (i=3;i>=1;i--) {

for (j=20-i;j>=1;j--) printf("%c",' ');

for (j=0;j

第6章习题 一、选择题 1 D

2 A

3 D

4 B

5 D

6 C

7 B

8 D

9 B

10 D

二 填空题 1. 0 2. 14 m

3.10 7 4. 数据类型

5. strcpy(S2,S1) #include 6. 0 3 7. 7,6 8. sum=0 i==j a[i][j] 9. 4 10. Tony

三 程序分析题 1. max=85 min=5 sum=180 aver=30.00 2. a=2 b=2 c=2 d=2 e=1 f=2 g=2 3. j=45

4. Ti_saCPorm Tss_Pgm 5. 1 1 1 5

四、编程题

1.从键盘输入15个整数,存放在数组中,找出其中最小数并指出其所在的位置。 #include #define N 15 main()

{int min,i,j,a[N];

printf("Enter N integers:\n"); for(i=0;i

min=a[0];

for(i=1;ia[i]) { min=a[i]; j=i; }

printf("%d,%d",min,j); }

2.将输入的十进制正整数化为十六进制数。 #include main() {

int i,x,j,a[20];

printf("请输入一个正整数:"); while(1) {

scanf("%d",&x); if(x

printf("数据输入错误,请重新输入一个正整数:"); else break; } i=0; while(x) {

a[i]=x%16; x=x/16; i++; }

for(j=i-1;j>=0;j--) if(a[j]

printf("%d",a[j]); else if(a[j]

printf("%c",a[j]+'A'-10); printf("\n"); }

3.从键盘输入一行字符,统计其中有多少单词,假设单词之间以逗号分隔。 #include void main() {

char string[81];

int i,num=0,word=0; char c;

gets(string);

for (i=0;(c=string[i])!='\0';i++) if(c==',') word=0; else if(word==0) { word=1; num++; }

printf("There are %d words in the line.\n",num); }

4.从键盘输入一字符串,放在字符数组a 中,将字符数组a 中下标值为偶数的元素按从小到大排序。

#include #include void main() {

char a[80],t,m; int i,j,k;

printf("请输入一字符串:"); gets(a); k=strlen(a);

for(i=0;i

for(j=i+2;ja[j]) m=j; if(m!=i)

{t=a[i];a[i]=a[m];a[m]=t;} }

puts(a); printf("\n"); }

5.编写程序输出以下杨辉三角形(要求输出10行)。 1 1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1 … … … … … …

#include #include

{ int i,j,a[10][10]; for(i=0;i

a[i][j]=a[i-1][j-1]+a[i-1][j]; }

for(i=0;i

6.编程将s 数组中的字符串的正序和反序进行连接,形成一个新串放在t 数组中。例如,当s 数组中字符串为"ABCD" 时,则t 数组中的内容应为:"ABCDDCBA" 。 #include #include main() {

char s[100], t[100]; int i,d;

printf("Please enter string S:"); scanf("%s",s); d=strlen(s);

for(i=0;i

for(i=0;i

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

7.某公司在传输数据过程中为了安全要对数据进行加密,若传递的是四位的整数,对其进行加密的规则为:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。如:输入数字7659,则加密后的数字为4012 #include main()

{ int a,i,aa[4],t;

printf("输入一个需加密的四位数整数:"); scanf("%d",&a); aa[0]=a%10; aa[1]=a%100/10; aa[2]=a%1000/100; aa[3]=a/1000; for(i=0;i

aa[i]%=10; }

for(i=0;i

t=aa[i];

aa[i]=aa[3-i]; aa[3-i]=t; }

printf("加密后的数字为:"); for(i=3;i>=0;i--) printf("%d",aa[i]); printf("\n"); }

8.编写程序查找数值18在以下二维数组中第一次出现的位置。 3 4 5 18 8 12 16 54 43 34 18 7

#include main()

{ int i,j,a[3][4]={{3,4,5,18}, {8,12,16,54}, {43,34,18,7}}; for(i=0;i

if(a[i][j]==18) break; if(j

printf("数值18第一次出现的位置在%d行, 第%d列\n",i+1,j+1); }

9.设有4行4列的数组a ,其元素a[i][j]=3*i+2*j-6。编写程序,实现如下功能: (1) 求第二行4元素的累加和; (2) 求第四列4元素的平均值;

(3) 求主对角线4元素中负数的个数。 #include void main()

{ int a[4][4],i,j,s=0,m=0; float n=0;

for(i=0;i

printf("原始数组为:\n"); for(i=0;i

{ for(j=0;j

printf("%3d",a[i][j]);

printf("\n");

}

for(j=0;j

s+=a[1][j];

printf("第二行4元素累加和为:%d\n",s);

for(j=0;j

n+=a[j][3];

printf("第四列4元素平均值为:%.2f\n",n/4.0);

for(i=0;i

if(a[i][i]

m++;

printf("主对角线4元素中负数的个数为:%d\n",m);

}

10.约瑟夫环问题:编号为1,2,3,...,n 的n 个人按顺时针方向围坐一圈,每人持有一个正整数密码。一开始任选一个正整数m 作为报数上限值,从第一个人开始按顺时针报数,报到m 时停止,报m 的人出列,将他的密码作为新的m 值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计程序求出出列顺序。

分析:设整型数组a 中保存n 个人的密码,对应的人出列后,数组元素置0作为标志。顺时针确定下一个人的方法,可将下标加1,再对n 求余。

#include

#define N 100

main()

{ int a[100];

int i,j,m,n,k=0;

printf("输入人数n 和任选的一个正整数m:");

scanf("%d%d",&n,&m);

printf("输入n 个人的密码: ");

for (i=0;i

scanf("%d",&a[i]);

printf("\n出列顺序为: ");

for(i=0;i

{ j=1;

while(j

{ while(a[k]==0) /*跳过已出列的人*/

k=(k+1)%n;

j++;

k=(k+1)%n;

}

while(a[k]==0) /*跳过已出列的人*/

k=(k+1)%n;

printf("%d ",k+1);

m=a[k];

a[k]=0;

}

}

第7章习题

一、选择题

1

A 2 D 3 D 4 B 5 A 6 D 7 C 8 D 9 B 10 A

二 填空题

1. main()

2. main()

3.函数首部

4. 解决函数必须“定义在前,使用在后”的原则问题

5. int

6. 定义 调用

7. 地址传递 值传递

8. return void

9. void f(float a,float b) float f(float a,float b)

10. static

三 程序分析题

1. a=48

2. 8,17

3. 2721

4. BASIC

C

COBOL

FORTRAN

PASCAL

Smalltalk

5. 6

1 2 3

6 5 4

四、编程题

1.写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。

#include

#include

void main()

{int prime(int);

int n;

printf("Input an integer:");

scanf("%d",&n);

if (prime(n))

printf("\n %d is a prime.\n",n);

else

printf("\n %d is not a prime.\n",n);

int prime(int n)

{int flag=1,i;

for (i=2; i

if (n%i==0)

flag=0;

return(flag);

}

2.写一个函数,用于实现函数strcmp()的功能,能将两个字符串进行比较,将两个字符串中第一个不相同字符的ASCII 码值之差作为函数的返回值。

#include

int MyStrcmp(char s[], char t[]);

main()

{

char str1[20],str2[20];

printf("Input string:");

gets(str1);

printf("Input another string:");

gets(str2);

if (MyStrcmp(str1,str2)>0)

printf("str1>str2\n");

else if (MyStrcmp(str1,str2)

printf("str1

else

printf("str1=str2\n");

}

int MyStrcmp(char s[], char t[])

{

int i;

for (i=0;s[i]==t[i]; i++)

if (s[i]=='\0') return 0 ;

return (s[i]-t[i]);

}

3. 写一个函数,用于实现函数strcat()的功能, 能将两个字符串连接。

#include

void main()

{void concatenate(char string1[],char string2[],char string[]);

char s1[100],s2[100],s[100];

printf("input string1:");

scanf("%s",s1);

printf("input string2:");

scanf("%s",s2);

concatenate(s1,s2,s);

printf("\nThe new string is %s\n",s);

}

void concatenate(char string1[],char string2[],char string[])

{int i,j;

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

string[i]=string1[i];

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

string[i+j]=string2[j];

string[i+j]='\0';

}

4. 从键盘任意输入10个整数,用函数编程实现将其中最大数与最小数的位置对换后,再输出调整后的数组。

#include

#define ARRSIZE 10

void MaxMinExchang(int a[], int n)

{

int maxValue=a[0], minValue=a[0], maxPos=0, minPos=0;

int i, temp;

for (i=1; i

{

if (a[i] > maxValue)

{

maxValue = a[i];

maxPos = i;

}

else if (a[i]

{

minValue = a[i];

minPos = i;

}

}

temp = a[maxPos];

a[maxPos] = a[minPos];

a[minPos] = temp;

}

main()

{

int a[ARRSIZE],i;

printf("Input %d Numbers:\n",ARRSIZE);

for (i=0; i

scanf("%d", &a[i]);

MaxMinExchang(a, ARRSIZE);

printf("After MaxMinExchange:\n");

for (i=0;i

printf("%4d", a[i]);

printf("\n") ;

}

5. 写一函数,能对给定的一个二维数组(3×3)进行转置(即行列互换)。

#include

#define N 3

int array[N][N];

void main()

{ void convert(int array[][3]);

int i,j;

printf("input array:\n");

for (i=0;i

for (j=0;j

scanf("%d",&array[i][j]);

printf("\noriginal array :\n");

for (i=0;i

{for (j=0;j

printf("%5d",array[i][j]);

printf("\n");

}

convert(array);

printf("convert array:\n");

for (i=0;i

{for (j=0;j

printf("%5d",array[i][j]);

printf("\n");

}

}

void convert(int array[][3])

{int i,j,t;

for (i=0;i

for (j=i+1;j

{t=array[i][j];

array[i][j]=array[j][i];

array[j][i]=t;

}

}

6. 写一函数,能用“起泡法”对输入的10个字符按由小到大顺序排序。

#include

#include

#define N 10

char str[N];

void main()

{void sort(char str[]);

int i,flag;

for (flag=1;flag==1;)

{printf("input string:\n");

scanf("%s",str);

if (strlen(str)>N)

printf("string too long,input again!");

else

flag=0;

}

sort(str);

printf("string sorted:\n");

for (i=0;i

printf("%c",str[i]);

printf("\n");

}

void sort(char str[])

{int i,j;

char t;

for(j=0;j

for (i=0;(i

if(str[i]>str[i+1])

{t=str[i];

str[i]=str[i+1];

str[i+1]=t;

}

}

7. 编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数。

#include

int letter,digit,space,others;

void main()

{void count(char str[]);

char text[80];

printf("input string:\n");

gets(text);

printf("string:");

puts(text);

letter=0;

digit=0;

space=0;

others=0;

count(text);

printf("\nletter:%d\ndigit:%d\nspace:%d\nothers:%d\n",letter,digit,space,others);

}

void count(char str[])

{int i;

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

if ((str[i]>='a'&& str[i]='A' && str[i]

letter++;

else if (str[i]>='0' && str [i]

digit++;

else if (str[i]==32)

space++;

else

others++;

}

8. 编写程序输出3~10000内的可逆素数。可逆素数是指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。如157和751均为素数,它们是可逆素数。要求调用两个子函数实现。

#include

#include

#include

int invert(int a)

{

int s=0;

while(a>0)

{

s=10*s+a%10;

a/=10;

}

return s;

}

int prime(int a)

{

int i;

for(i=2;i

if(a%i==0)

return 0;

return 1;

}

main()

{

int i;

for(i=3;i

if(prime(i))

if(prime(invert(i)))

printf("%5d",i);

printf("\n");

}

9. 编写一个函数,实现将一个十进制数转换成八进制数。

#include

#include

void main()

{

int i,n;

char a[33];

void trans10_8(char x[],int m);

printf("\nInput a positive integer:");

scanf("%d",&n);

trans10_8(a,n);

for (i=strlen(a)-1;i>=0;i--)

printf("%c",a[i]);

printf("\n");

}

void trans10_8 (char x[],int m)

{

int r,i=0;

while(m>0)

{

r=m%8;

x[i]=r+48;

m=m/8;

i++;

}

x[i]='\0';

}

10. 编写一个函数,实现对由实参传来的一个字符串,将其字符顺序颠倒后重新存放。 #include

#include

void main()

{void inverse(char str[]);

char str[100];

printf("input string:");

scanf("%s",str);

inverse(str);

printf("inverse string:%s\n",str);

}

void inverse(char str[])

{char t;

int i,j;

for (i=0,j=strlen(str);i

{t=str[i];

str[i]=str[j-1];

str[j-1]=t;

}

}

第八章编程题答案

1.输入2个字符串,每个字符串的长度均不超过80字符,用自己实现的cmpstr()函数完成这两个字符串的大小比较,cmpstr()函数的功能和字符串比较函数strcmp()的功能相同。 #include

#include

int cmpstr(char *s1, char *s2)

{

char *p, *q;

p=s1;

q=s2;

while(*p!='\0' && *q!='\0')

{

if(*p==*q)

{

p++;

q++;

}

else

}

return *p-*q;

}

void main()

{

char str1[81], str2[81];

int c;

printf("请输入第1个字符串:");

gets(str1);

printf("请输入第2个字符串:");

gets(str2);

c=cmpstr(str1,str2);

if(c>0)

printf("字符串%s 大于 字符串%s\n",str1,str2);

else if(c

printf("字符串%s 小于 字符串%s\n",str1,str2);

else

printf("字符串%s 等于 字符串%s\n", str1, str2);

}

3.定义一个函数delSubstr(),删除字符串中第k 个字符开始的m 个字符,例如删除字符串abcde 第2个字符开始的3个字符,则删除后结果为ae ;又如删除字符串abcde 第4个字符开始的5个字符,则删除后结果为abc 。

#include

#include

int delSubstr(char *str, int k, int m)

{

char *p, *q;

if(k

return -1;

else if(k>strlen(str))

return -2;

else if(k+m>strlen(str))

{

str[k-1]='\0';

return 1;

}

else

{

p=str+k-1;

q=str+k+m-1;

while(*q!='\0')

*p++=*q++;

return 1;

}

}

void main()

{

char str[81];

int k, m, state;

printf("请输入字符串:\n");

gets(str);

printf("请输入要删除的子串起始字符的序号和子串长度:\n");

scanf("%d%d", &k, &m);

state = delSubstr(str, k, m);

if(state

printf("要删除子串起始字符的序号或子串长度输入错误!\n");

else

printf("删除指定子串后的字符串为:%s\n", str);

}

4.定义一个函数delSpechar(),使用字符指针删除字符串中的所有指定字符(如把字符串“I love you!”中的o 字符删除,得到“I lve yu!”)。

#include

#include

void delSpechar(char *str, char ch)

{

char *p, *q;

p=str;

while(*p!='\0')

{

if(*p==ch)

{

q=p;

while(*q!='\0')

{

*q=*(q+1);

q++;

}

}

else

p++;

}

}

void main()

char str[81], ch;

printf("请输入一个字符串:");

gets(str);

printf("请输入要从字符串中删除的字符:");

ch = getchar();

delSpechar(str, ch);

printf("删除所有指定字符后的字符串为:%s\n", str);

}

5.求整型二维数组a[M][N]中的最大元素值及最大元素的位置(用指针法引用数组元素)。 #include

#define M 3

#define N 4

void max(int (*pa)[N], int *pRow, int *pCol)

{

int i, j;

for(i=0; i

for(j=0; j

if(pa[i][j]>pa[*pRow][*pCol])

{

*pRow = i;

*pCol = j;

}

}

void main()

{

int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};

int row=0, col=0;

max(a, &row, &col);

printf("二维数组中的最大元素值为a[%d][%d]=%d\n", row, col, a[row][col]);

}

6.已知字符串str[80],编写函数lstrchar(),实现在数组str 中查找字符ch 首次出现的位置,如果字符串中找不到该字符,则返回-1。

#include

#include

int lstrchar(char *str1, char ch1)

{

char *p,i=1;

p=str1;

while(*p!='\0')

{

if(*p==ch1)

break;

{

p++;

i++;

}

}

if(*p=='\0')

return -1;

else

return i;

}

void main()

{

char ch,str[80];

int poi;

printf("请输入字符串:");

gets(str);

printf("请输入待查找的字符:");

scanf("%c",&ch);

poi=lstrchar(str,ch);

if(poi==-1)

printf("字符串中不存在指定字符!\n");

else

printf("该字符在字符串中出现的第一个位置为%d\n", poi);

}

7.定义一个整型二维数组并初始化,编程求该数组所有元素的和。

要求:分别用数组下标法、一级指针法、二级指针法实现。

/*数组下标法*/

#include

#define M 3

#define N 4

int sum(int b[M][N])

{

int i, j, s=0;

for(i=0; i

for(j=0; j

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

return s;

}

void main()

{

int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};

printf("二维数组中的所有元素之和为%d\n", sum(a));

}

/*一级指针法*/

#include

#define M 3

#define N 4

int sum(int *pa)

{

int i,s=0;

for(i=0;i

s=s+*pa++;

return s;

}

void main()

{

int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};

printf("二维数组中的所有元素之和为%d\n", sum(a[0]));

}

/*二级指针法*/

#include

#define M 3

#define N 4

int sum(int (*pa)[N])

{

int i,j,s=0;

for(i=0;i

{

for(j=0;j

s=s+(*pa)[j];

pa++;

}

return s;

}

void main()

{

int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};

printf("二维数组中的所有元素之和为%d\n", sum(a));

}

8.输入一行数字字符存入字符数组str[80]中,用num[10]中的数组元素作为计数器来统计每个数字字符的个数。用下标为0的元素统计字符“0”的个数,用下标为1的元素统计字符“1”出现的次数,„„。输出每个奇数字符出现的次数。

#include

void count(char *str, int num[])

{

int i=0;

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

{

switch(str[i])

{

case '0': num[0]++; break;

case '1': num[1]++; break;

case '2': num[2]++; break;

case '3': num[3]++; break;

case '4': num[4]++; break;

case '5': num[5]++; break;

case '6': num[6]++; break;

case '7': num[7]++; break;

case '8': num[8]++; break;

case '9': num[9]++; break;

}

i++;

}

}

void main()

{

char str[80],*p=str;

int num[10]={0}, i;

printf("请输入一行数字字符:");

gets(p);

count(p,num);

for(i=1;i

printf("数字串中%d出现的次数为%d\n",i,num[i]);

}

9.在主函数中输入10个不等长字符串,用另一函数sort()对它们排序,然后在主函数中输出已排好序的字符串。要求:每个字符串长度均不超过30字符,用指针数组进行处理。 #include

#include

#define M 10

#define N 31

void sort(char *pstr[])

{

int i,j;

char *t;

for(i=0; i

{

for(j=0; j

if(strcmp(pstr[j],pstr[j+1])>0)

{

t = pstr[j];

pstr[j] = pstr[j+1];

pstr[j+1] = t;

}

}

}

void main()

{

char str[M][N], *pstr[M]={NULL};

int i;

printf("请输入10个字符串,每个字符串均不超过30个字符:\n");

for(i=0; i

{

gets(str[i]);

pstr[i]=str[i];

}

sort(pstr);

printf("排好序的字符串从小到大依次为:\n");

for(i=0; i

printf("%s\n", pstr[i]);

}

10.输入一个字符串,内有数字字符和非数字字符如123a345bcd567,将其中连续的数字作为一个整数,依次存放到整型数组a 中,例如,123放在a[0],345放在a[1]中,567放在a[2]中,„„,统计共有多少个整数,并输出这些整数。

#include

#include

void main()

{

char ch[1000],*p=ch;

int a[50],*q=a,num=0,i;

gets(ch);

for( ; *p!='\0'; p++)

if(*p>='0' && *p

{

*q=(*p)-'0';

p++;

while(*p>='0' && *p

*q=(*q)*10+(*(p++)-'0');

num+=1;

q+=1;

}

for(i=0,q=a; i

printf("%d ",*q);

printf("\n一共输入了%d个整数。\n",num); }

第1章习题 一、选择题

1、A 2、D 3、C 4、D 5、B 6、C 7、C 8、B 9、B 10、A 二、填空题 1、一,函数体

2、main(主) ,main(主) 3、编译,目标 4、.c ,.obj ,.exe

5、缩进,无影响,/* */ 三、程序分析题 1、

***************** Very good!

***************** 2、

a=12,b=5 a=17,b=22 3、

r= 5.50,s=95.033098

四、编程题

1.用printf()函数在屏幕上输出自己的班级、学号、姓名。 #include"stdio.h" void main() {

printf("班级:BX1109\n");

printf("学号:[1**********]1\n"); printf("姓名:王孟荣\n"); }

2.从键盘输入两个整数,计算它们的和、差、积、商,并在屏幕上输出结果。

#include void main() {

int x,y,a,b,c; float d;

printf("Please Input Two Integers:\n"); scanf("%d%d",&x,&y); a=x+y; b=x-y; c=x*y; d=1.0*x/y;

printf("a=%d\nb=%d\nc=%d\nd=%f\n",a,b,c,d); }

第2章习题 一、选择题 1~5 BCDCD 6~10 DBBCA 二、填空题

1.单精度浮点型、双精度浮点型、字符型 2.0

3.x%10*10+x/10 4.5.5 5.5.7 20

6.sin(sqrt(x*x))/(a*b) 7. ,

8.1111011 173 7B 9.3 3 10.3

三、程序分析题 1. 7,8,10 2. 1,3 3. 5 F

4. (int)i=12, 12.50 5. 4 61 57 9 112

四、编程题

1.编写程序,求表达式c=21%9-(float)a+4/b*b的值,假设表达式中a 和b 的值分别由键盘输入。

#include void main( ) {

int a,b; float c;

printf("Please input data a,b: "); scanf("%d%d",&a,&b); c=21%9-(float)a+4/b*b; printf("c=%5.2f\n", c); }

2. 编写程序,从键盘输入两个整数存入变量a 和b 中,求a2-b2的值并输出。 #include void main( ) {

int a,b,c;

printf("Please input data a,b: "); scanf("%d%d",&a,&b); c=a*a-b*b;

printf("c=%d\n", c); }

第3章习题 一、选择题 1 D

2 C

3 A 、B

4 A

5 B

6 B

7 B 、C

8 B

9 D

10 D

二、填空题

1. 有穷性 确定性 可行性 2. #

3. 从终端(键盘)输入一个字符 4. m d 5. 97,g

6. 123.456000, 123.46, 123

7. 格式控制符不正确(输入数据时不能控制列宽和小数位数) 8. 63,63,77,3f 9. %f%f &x,&y

10. ch ch 三、程序分析题 1. c=11

2. a=123 f=457 3. x=345 y=3.460000 4. a=1,b=3 a=3,b=1

5. (题目需修改为:从键盘输入一个除a 和z 以外的小写字母)

程序的功能:从键盘输入一个除a 和z 以外的小写字母,求出该字母对应的大写字母的前趋和后继字母,然后顺序输出此三个大写字母,每个字母所占列宽为3。 运行结果: 假如输入:f ' 输出: E F G

四、编程题

1.编写程序,计算的值并输出(保留3位小数) ,其中a 、b 的值由键盘输入。 #include #include void main( ) { float a, b,x;

scanf("%f%f", &a, &b); x=(a*a+b*b)/sqrt(3*(a+b)); printf("x=%.3f\n",x); }

2.编写程序,从键盘输入一个梯形的上底a 、下底b 和高h ,输出梯形的面积s 。

#include

#include void main( ) { float a, b,h,s;

scanf("%f,%f,%f", &a,&b,&h); s=(a+b)*h/2;

printf("梯形面积s=%.2f\n",s); }

3.编写程序,在屏幕上输入你姓名的第一个字母,显示出该字母以及下面的信息: Hello!

This is a c program.

My name is [第一个字母]

#include void main( ) {

char name;

name=getchar(); putchar(name); printf("\nHello!\n");

printf("This is a c program.\n"); printf("My name is %c\n",name); }

第4章习题 一、选择题 1 B

2 B

3 C

4 B

5 C

6 A C

7 B

8 A

9 C

10 C

二、填空题 1. ! && || 2. 1 3. a b 4. 1 5. 0

6. x%4= =0 && x%100!=0 7. 5 6 8. A

9. x10 && x

三、程序分析题 1. No 2. -2 3. 5 3 2

4. #& 5. (1)2 (2)3 CC

a=2,b=2,c=4 四、编程题

1. 有一个函数如下: x2-2 (x

编写程序,输入x 的值,计算相应的y 值输出(保留3位小数) 。 #include #include void main() { float x,y;

scanf("%f", &x); if(x

else if(x

printf("x=%f, y=%.3f\n", x,y); }

2.编写一个程序,根据输入的三角形的三条边判断是否能组成三角形,如果可以则输出它的面积和三角形类型(等边、等腰、直角、一般三角形)。 #include #include void main( )

{ float a, b, c, s, area;

scanf("%f,%f,%f", &a,&b,&c); if(a+b>c && b+c>a && a+c>b) { s=(a+b+c)/2;

area=sqrt(s*(s*(s-a)*(s-b)*(s-c))); printf("area=%f\n",area); if(a==b && b==c)

printf("等边三角形\n");

else if(a==b || a==c || b==c) printf("等腰三角形\n");

else if((a*a + b*b== c*c)||(a*a + c*c== b*b)||(b*b + c*c == a*a)) printf("直角三角形\n");

else printf("一般三角形\n"); }

else printf("不能组成三角形\n"); }

3.设奖金税率r 有如下的要求 (n代表奖金) : 0 n

用switch 多分支选择语句编写程序,输入奖金值,计算并输出相应的税率和实际应得奖金值。

#include void main( ) { float n, r, s; int m;

printf("请输入奖金值:"); scanf("%f", &n); if(n>=6000) m=6; else m=n/1000; switch(m)

{ case 0: r=0; break; case 1: r=0.05; break; case 2: r=0.08; break; case 3:

case 4:

case 5: r=0.1; break; case 6: r=0.15; break; }

s=n-r*n;

printf("税率r=%.0f%%, 奖金值n=%.2f, 实际应得奖金值s=%.2f\n",r*100, n, s); }

4. 从键盘输入任意4个数a 、b 、c 、d ,按照从大到小的顺序排列后重新输出。 #include void main( ) { int a, b, c, d,t;

scanf("%d,%d,%d,%d", &a,&b,&c,&d); if(a

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

5. 给出一个不超过4位数的正整数,判断它是几位数,并按逆向输出各位数字。例1234,输出为4321。 #include void main( )

{ int num,i,j,k,m;

printf("输入一个少于4位的正整数:"); scanf("%d",&num);

if(num>=0 && num

{ if(num>1000 && num

m=num%10; /*求个位上的数字*/ k=num/10%10; /*求十位上的数字*/ j=num/100%10; /*求百位上的数字*/ i=num/1000; /*求千位上的数字*/ printf("逆序数为:%d%d%d%d\n",m,k,j,i); }

else if(num>=100)

{ printf("是一个3位数\n");

m=num%10; /*求个位上的数字*/ k=num/10%10; /*求十位上的数字*/ j=num/100; /*求百位上的数字*/ printf("逆序数为:%d%d%d\n",m,k,j);

}

else if(num>=10)

{printf("是一个2位数\n");

m=num%10; /*求个位上的数字*/ k=num/10; /*求十位上的数字*/ printf("逆序数为:%d%d\n",m,k); }

else

{printf("是一个1位数\n"); printf("逆序数为:%d\n",num); } }

else printf("是一个无效的数\n"); }

第5章习题 一、选择题 1 B

2 C

3 B

4 C

5 A

6 B

7 D

8 B

9 A

10 B

二 填空题

1. 循环 switch 2. 4,7 3. 6 4. # # 5. 0 2 6. 18 7. 1

8. sum=80 9. c=getchar() n:m

10. i %13= =0 break

三 程序分析题 1. output1:21 6 output2: 5 6 output3: 5 7 7 2. n=7 3. Max=18 Min=3 4. 1*1=1

2*1=2 2*2=4

3*1=3 3*2=6 3*3=9 5. 0 1 2 3 1 2 3 0 2 3 0 1 3 0 1 2 四、编程题

1. 从键盘上输入若干字符,以按Enter 键结束,统计其中字符A 或a 的个数。 #include "stdio.h" main() { char ch; int k=0;

while((ch=getchar())!='\n') { if(ch=='A' || ch=='a') k=k+1; }

printf("%d\n",k); }

2. 利用=×…的前100项之积计算p 的值。 #include main() {

double term, result = 1; /*累乘项初值应为1*/ int n;

for (n=2; n

term=(double)( n * n)/((n-1)*(n+1)); /*计算累乘项*/ result = result * term; }

printf("result = %f\n", 2*result); }

3. 用1元5角钱人民币兑换5分、2分和1分的硬币(每一种都要有)共100枚,问共有几种兑换方案?每种方案各换多少枚? #include main() {

int x,y,z,count=0; for(x=1;x

z=100-x-y;

if(5*x+2*y+z==150) {

count++;

printf("%d,%d,%d\n",x,y,z); } }

printf("count=%d\n",count); }

4. 鸡兔同笼,共有98个头,386只脚,编程求鸡、兔各多少只。 #include main() { int x, y;

for (x=1;x

if(2*x+4*y==386)

printf("鸡=%d,兔=%d",x,y); } }

5. 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 #include main()

{

int n,i;

printf("\nplease input a number:\n"); scanf("%d",&n); printf("%d=",n); for(i=2;i

if(n%i==0) { printf("%d*",i); n=n/i; }

else break; }

printf("%d",n);

6. 从键盘任意输入一个4位数x ,编程计算x 的每一位数字相加之和。例如,输入x 为1234,则由1234分离出其千位1、百位2、十位3、个位4,然后计算1+2+3+4=10,并输出10。 #include #include main() {

int i1,i2,i3,i4,k,n;

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

k=fabs(n); /*取绝对值*/ i1=k/1000; /*分离出千位*/

i2=(k-i1*1000)/100; /*分离出百位*/

i3=(k-i1*1000-i2*100)/10; /*分离出十位*/ i4=k%10; /*分离出个位*/

printf("The sum of the total bit is %d\n",i1+i2+i3+i4); }

7. 打印出所有" 水仙花数" ,所谓" 水仙花数" 是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,因为153=13+53+33。 #include void main() {

int i,j,k,n;

printf("parcissus numbers are:\n"); for (n=100;n

i=n/100; j=n/10-i*10; k=n%10;

if (n==i*i*i+j*j*j+k*k*k) printf("%d\n",n); } }

8. 利用泰勒级数sin(x)≈计算sin(x) 的值。要求最后一项的绝对值小于10-5,并统计出此时累加了多少项(x 由键盘输入)。 #include #include main() {

int n=1,count=1; float x;

double sum,term; /*因为位数多,所以定义为双精度 */ printf("Input x: "); scanf("%f", &x); sum=x;

term=x; /*赋初值*/ do {

term=-term*x*x/((n+1)*(n+2)); sum=sum+term; /*累加 */ n=n+2; count++;

}while(fabs(term)>=1e-5);

printf("sin(x)=%.1f,count=%d\n",sum,count); } 9.编写一个猜数游戏:任意设置一个整数,请用户从键盘上输入数据猜想设置的数是什么,告诉用户是猜大了还是小了。10次以内猜对,用户获胜;否则,告诉用户设置的数据是什么。

#include void main()

{int num=123,x,n;

printf("hint:0

if(x==num) {printf("Win!\n");break;} if(x>num) printf("bigger!\n"); if(x

if(n==11) printf("Lost!the number is %d\n",x); }

10. 编程输出以下图案。 * *** ***** ******* ***** *** *

#include main() {

int i,j;

for(i=1;i

for (j=20-i;j>=1;j--) printf("%c",' ');

for (j=0;j

for (i=3;i>=1;i--) {

for (j=20-i;j>=1;j--) printf("%c",' ');

for (j=0;j

第6章习题 一、选择题 1 D

2 A

3 D

4 B

5 D

6 C

7 B

8 D

9 B

10 D

二 填空题 1. 0 2. 14 m

3.10 7 4. 数据类型

5. strcpy(S2,S1) #include 6. 0 3 7. 7,6 8. sum=0 i==j a[i][j] 9. 4 10. Tony

三 程序分析题 1. max=85 min=5 sum=180 aver=30.00 2. a=2 b=2 c=2 d=2 e=1 f=2 g=2 3. j=45

4. Ti_saCPorm Tss_Pgm 5. 1 1 1 5

四、编程题

1.从键盘输入15个整数,存放在数组中,找出其中最小数并指出其所在的位置。 #include #define N 15 main()

{int min,i,j,a[N];

printf("Enter N integers:\n"); for(i=0;i

min=a[0];

for(i=1;ia[i]) { min=a[i]; j=i; }

printf("%d,%d",min,j); }

2.将输入的十进制正整数化为十六进制数。 #include main() {

int i,x,j,a[20];

printf("请输入一个正整数:"); while(1) {

scanf("%d",&x); if(x

printf("数据输入错误,请重新输入一个正整数:"); else break; } i=0; while(x) {

a[i]=x%16; x=x/16; i++; }

for(j=i-1;j>=0;j--) if(a[j]

printf("%d",a[j]); else if(a[j]

printf("%c",a[j]+'A'-10); printf("\n"); }

3.从键盘输入一行字符,统计其中有多少单词,假设单词之间以逗号分隔。 #include void main() {

char string[81];

int i,num=0,word=0; char c;

gets(string);

for (i=0;(c=string[i])!='\0';i++) if(c==',') word=0; else if(word==0) { word=1; num++; }

printf("There are %d words in the line.\n",num); }

4.从键盘输入一字符串,放在字符数组a 中,将字符数组a 中下标值为偶数的元素按从小到大排序。

#include #include void main() {

char a[80],t,m; int i,j,k;

printf("请输入一字符串:"); gets(a); k=strlen(a);

for(i=0;i

for(j=i+2;ja[j]) m=j; if(m!=i)

{t=a[i];a[i]=a[m];a[m]=t;} }

puts(a); printf("\n"); }

5.编写程序输出以下杨辉三角形(要求输出10行)。 1 1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1 … … … … … …

#include #include

{ int i,j,a[10][10]; for(i=0;i

a[i][j]=a[i-1][j-1]+a[i-1][j]; }

for(i=0;i

6.编程将s 数组中的字符串的正序和反序进行连接,形成一个新串放在t 数组中。例如,当s 数组中字符串为"ABCD" 时,则t 数组中的内容应为:"ABCDDCBA" 。 #include #include main() {

char s[100], t[100]; int i,d;

printf("Please enter string S:"); scanf("%s",s); d=strlen(s);

for(i=0;i

for(i=0;i

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

7.某公司在传输数据过程中为了安全要对数据进行加密,若传递的是四位的整数,对其进行加密的规则为:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。如:输入数字7659,则加密后的数字为4012 #include main()

{ int a,i,aa[4],t;

printf("输入一个需加密的四位数整数:"); scanf("%d",&a); aa[0]=a%10; aa[1]=a%100/10; aa[2]=a%1000/100; aa[3]=a/1000; for(i=0;i

aa[i]%=10; }

for(i=0;i

t=aa[i];

aa[i]=aa[3-i]; aa[3-i]=t; }

printf("加密后的数字为:"); for(i=3;i>=0;i--) printf("%d",aa[i]); printf("\n"); }

8.编写程序查找数值18在以下二维数组中第一次出现的位置。 3 4 5 18 8 12 16 54 43 34 18 7

#include main()

{ int i,j,a[3][4]={{3,4,5,18}, {8,12,16,54}, {43,34,18,7}}; for(i=0;i

if(a[i][j]==18) break; if(j

printf("数值18第一次出现的位置在%d行, 第%d列\n",i+1,j+1); }

9.设有4行4列的数组a ,其元素a[i][j]=3*i+2*j-6。编写程序,实现如下功能: (1) 求第二行4元素的累加和; (2) 求第四列4元素的平均值;

(3) 求主对角线4元素中负数的个数。 #include void main()

{ int a[4][4],i,j,s=0,m=0; float n=0;

for(i=0;i

printf("原始数组为:\n"); for(i=0;i

{ for(j=0;j

printf("%3d",a[i][j]);

printf("\n");

}

for(j=0;j

s+=a[1][j];

printf("第二行4元素累加和为:%d\n",s);

for(j=0;j

n+=a[j][3];

printf("第四列4元素平均值为:%.2f\n",n/4.0);

for(i=0;i

if(a[i][i]

m++;

printf("主对角线4元素中负数的个数为:%d\n",m);

}

10.约瑟夫环问题:编号为1,2,3,...,n 的n 个人按顺时针方向围坐一圈,每人持有一个正整数密码。一开始任选一个正整数m 作为报数上限值,从第一个人开始按顺时针报数,报到m 时停止,报m 的人出列,将他的密码作为新的m 值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计程序求出出列顺序。

分析:设整型数组a 中保存n 个人的密码,对应的人出列后,数组元素置0作为标志。顺时针确定下一个人的方法,可将下标加1,再对n 求余。

#include

#define N 100

main()

{ int a[100];

int i,j,m,n,k=0;

printf("输入人数n 和任选的一个正整数m:");

scanf("%d%d",&n,&m);

printf("输入n 个人的密码: ");

for (i=0;i

scanf("%d",&a[i]);

printf("\n出列顺序为: ");

for(i=0;i

{ j=1;

while(j

{ while(a[k]==0) /*跳过已出列的人*/

k=(k+1)%n;

j++;

k=(k+1)%n;

}

while(a[k]==0) /*跳过已出列的人*/

k=(k+1)%n;

printf("%d ",k+1);

m=a[k];

a[k]=0;

}

}

第7章习题

一、选择题

1

A 2 D 3 D 4 B 5 A 6 D 7 C 8 D 9 B 10 A

二 填空题

1. main()

2. main()

3.函数首部

4. 解决函数必须“定义在前,使用在后”的原则问题

5. int

6. 定义 调用

7. 地址传递 值传递

8. return void

9. void f(float a,float b) float f(float a,float b)

10. static

三 程序分析题

1. a=48

2. 8,17

3. 2721

4. BASIC

C

COBOL

FORTRAN

PASCAL

Smalltalk

5. 6

1 2 3

6 5 4

四、编程题

1.写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。

#include

#include

void main()

{int prime(int);

int n;

printf("Input an integer:");

scanf("%d",&n);

if (prime(n))

printf("\n %d is a prime.\n",n);

else

printf("\n %d is not a prime.\n",n);

int prime(int n)

{int flag=1,i;

for (i=2; i

if (n%i==0)

flag=0;

return(flag);

}

2.写一个函数,用于实现函数strcmp()的功能,能将两个字符串进行比较,将两个字符串中第一个不相同字符的ASCII 码值之差作为函数的返回值。

#include

int MyStrcmp(char s[], char t[]);

main()

{

char str1[20],str2[20];

printf("Input string:");

gets(str1);

printf("Input another string:");

gets(str2);

if (MyStrcmp(str1,str2)>0)

printf("str1>str2\n");

else if (MyStrcmp(str1,str2)

printf("str1

else

printf("str1=str2\n");

}

int MyStrcmp(char s[], char t[])

{

int i;

for (i=0;s[i]==t[i]; i++)

if (s[i]=='\0') return 0 ;

return (s[i]-t[i]);

}

3. 写一个函数,用于实现函数strcat()的功能, 能将两个字符串连接。

#include

void main()

{void concatenate(char string1[],char string2[],char string[]);

char s1[100],s2[100],s[100];

printf("input string1:");

scanf("%s",s1);

printf("input string2:");

scanf("%s",s2);

concatenate(s1,s2,s);

printf("\nThe new string is %s\n",s);

}

void concatenate(char string1[],char string2[],char string[])

{int i,j;

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

string[i]=string1[i];

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

string[i+j]=string2[j];

string[i+j]='\0';

}

4. 从键盘任意输入10个整数,用函数编程实现将其中最大数与最小数的位置对换后,再输出调整后的数组。

#include

#define ARRSIZE 10

void MaxMinExchang(int a[], int n)

{

int maxValue=a[0], minValue=a[0], maxPos=0, minPos=0;

int i, temp;

for (i=1; i

{

if (a[i] > maxValue)

{

maxValue = a[i];

maxPos = i;

}

else if (a[i]

{

minValue = a[i];

minPos = i;

}

}

temp = a[maxPos];

a[maxPos] = a[minPos];

a[minPos] = temp;

}

main()

{

int a[ARRSIZE],i;

printf("Input %d Numbers:\n",ARRSIZE);

for (i=0; i

scanf("%d", &a[i]);

MaxMinExchang(a, ARRSIZE);

printf("After MaxMinExchange:\n");

for (i=0;i

printf("%4d", a[i]);

printf("\n") ;

}

5. 写一函数,能对给定的一个二维数组(3×3)进行转置(即行列互换)。

#include

#define N 3

int array[N][N];

void main()

{ void convert(int array[][3]);

int i,j;

printf("input array:\n");

for (i=0;i

for (j=0;j

scanf("%d",&array[i][j]);

printf("\noriginal array :\n");

for (i=0;i

{for (j=0;j

printf("%5d",array[i][j]);

printf("\n");

}

convert(array);

printf("convert array:\n");

for (i=0;i

{for (j=0;j

printf("%5d",array[i][j]);

printf("\n");

}

}

void convert(int array[][3])

{int i,j,t;

for (i=0;i

for (j=i+1;j

{t=array[i][j];

array[i][j]=array[j][i];

array[j][i]=t;

}

}

6. 写一函数,能用“起泡法”对输入的10个字符按由小到大顺序排序。

#include

#include

#define N 10

char str[N];

void main()

{void sort(char str[]);

int i,flag;

for (flag=1;flag==1;)

{printf("input string:\n");

scanf("%s",str);

if (strlen(str)>N)

printf("string too long,input again!");

else

flag=0;

}

sort(str);

printf("string sorted:\n");

for (i=0;i

printf("%c",str[i]);

printf("\n");

}

void sort(char str[])

{int i,j;

char t;

for(j=0;j

for (i=0;(i

if(str[i]>str[i+1])

{t=str[i];

str[i]=str[i+1];

str[i+1]=t;

}

}

7. 编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数。

#include

int letter,digit,space,others;

void main()

{void count(char str[]);

char text[80];

printf("input string:\n");

gets(text);

printf("string:");

puts(text);

letter=0;

digit=0;

space=0;

others=0;

count(text);

printf("\nletter:%d\ndigit:%d\nspace:%d\nothers:%d\n",letter,digit,space,others);

}

void count(char str[])

{int i;

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

if ((str[i]>='a'&& str[i]='A' && str[i]

letter++;

else if (str[i]>='0' && str [i]

digit++;

else if (str[i]==32)

space++;

else

others++;

}

8. 编写程序输出3~10000内的可逆素数。可逆素数是指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。如157和751均为素数,它们是可逆素数。要求调用两个子函数实现。

#include

#include

#include

int invert(int a)

{

int s=0;

while(a>0)

{

s=10*s+a%10;

a/=10;

}

return s;

}

int prime(int a)

{

int i;

for(i=2;i

if(a%i==0)

return 0;

return 1;

}

main()

{

int i;

for(i=3;i

if(prime(i))

if(prime(invert(i)))

printf("%5d",i);

printf("\n");

}

9. 编写一个函数,实现将一个十进制数转换成八进制数。

#include

#include

void main()

{

int i,n;

char a[33];

void trans10_8(char x[],int m);

printf("\nInput a positive integer:");

scanf("%d",&n);

trans10_8(a,n);

for (i=strlen(a)-1;i>=0;i--)

printf("%c",a[i]);

printf("\n");

}

void trans10_8 (char x[],int m)

{

int r,i=0;

while(m>0)

{

r=m%8;

x[i]=r+48;

m=m/8;

i++;

}

x[i]='\0';

}

10. 编写一个函数,实现对由实参传来的一个字符串,将其字符顺序颠倒后重新存放。 #include

#include

void main()

{void inverse(char str[]);

char str[100];

printf("input string:");

scanf("%s",str);

inverse(str);

printf("inverse string:%s\n",str);

}

void inverse(char str[])

{char t;

int i,j;

for (i=0,j=strlen(str);i

{t=str[i];

str[i]=str[j-1];

str[j-1]=t;

}

}

第八章编程题答案

1.输入2个字符串,每个字符串的长度均不超过80字符,用自己实现的cmpstr()函数完成这两个字符串的大小比较,cmpstr()函数的功能和字符串比较函数strcmp()的功能相同。 #include

#include

int cmpstr(char *s1, char *s2)

{

char *p, *q;

p=s1;

q=s2;

while(*p!='\0' && *q!='\0')

{

if(*p==*q)

{

p++;

q++;

}

else

}

return *p-*q;

}

void main()

{

char str1[81], str2[81];

int c;

printf("请输入第1个字符串:");

gets(str1);

printf("请输入第2个字符串:");

gets(str2);

c=cmpstr(str1,str2);

if(c>0)

printf("字符串%s 大于 字符串%s\n",str1,str2);

else if(c

printf("字符串%s 小于 字符串%s\n",str1,str2);

else

printf("字符串%s 等于 字符串%s\n", str1, str2);

}

3.定义一个函数delSubstr(),删除字符串中第k 个字符开始的m 个字符,例如删除字符串abcde 第2个字符开始的3个字符,则删除后结果为ae ;又如删除字符串abcde 第4个字符开始的5个字符,则删除后结果为abc 。

#include

#include

int delSubstr(char *str, int k, int m)

{

char *p, *q;

if(k

return -1;

else if(k>strlen(str))

return -2;

else if(k+m>strlen(str))

{

str[k-1]='\0';

return 1;

}

else

{

p=str+k-1;

q=str+k+m-1;

while(*q!='\0')

*p++=*q++;

return 1;

}

}

void main()

{

char str[81];

int k, m, state;

printf("请输入字符串:\n");

gets(str);

printf("请输入要删除的子串起始字符的序号和子串长度:\n");

scanf("%d%d", &k, &m);

state = delSubstr(str, k, m);

if(state

printf("要删除子串起始字符的序号或子串长度输入错误!\n");

else

printf("删除指定子串后的字符串为:%s\n", str);

}

4.定义一个函数delSpechar(),使用字符指针删除字符串中的所有指定字符(如把字符串“I love you!”中的o 字符删除,得到“I lve yu!”)。

#include

#include

void delSpechar(char *str, char ch)

{

char *p, *q;

p=str;

while(*p!='\0')

{

if(*p==ch)

{

q=p;

while(*q!='\0')

{

*q=*(q+1);

q++;

}

}

else

p++;

}

}

void main()

char str[81], ch;

printf("请输入一个字符串:");

gets(str);

printf("请输入要从字符串中删除的字符:");

ch = getchar();

delSpechar(str, ch);

printf("删除所有指定字符后的字符串为:%s\n", str);

}

5.求整型二维数组a[M][N]中的最大元素值及最大元素的位置(用指针法引用数组元素)。 #include

#define M 3

#define N 4

void max(int (*pa)[N], int *pRow, int *pCol)

{

int i, j;

for(i=0; i

for(j=0; j

if(pa[i][j]>pa[*pRow][*pCol])

{

*pRow = i;

*pCol = j;

}

}

void main()

{

int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};

int row=0, col=0;

max(a, &row, &col);

printf("二维数组中的最大元素值为a[%d][%d]=%d\n", row, col, a[row][col]);

}

6.已知字符串str[80],编写函数lstrchar(),实现在数组str 中查找字符ch 首次出现的位置,如果字符串中找不到该字符,则返回-1。

#include

#include

int lstrchar(char *str1, char ch1)

{

char *p,i=1;

p=str1;

while(*p!='\0')

{

if(*p==ch1)

break;

{

p++;

i++;

}

}

if(*p=='\0')

return -1;

else

return i;

}

void main()

{

char ch,str[80];

int poi;

printf("请输入字符串:");

gets(str);

printf("请输入待查找的字符:");

scanf("%c",&ch);

poi=lstrchar(str,ch);

if(poi==-1)

printf("字符串中不存在指定字符!\n");

else

printf("该字符在字符串中出现的第一个位置为%d\n", poi);

}

7.定义一个整型二维数组并初始化,编程求该数组所有元素的和。

要求:分别用数组下标法、一级指针法、二级指针法实现。

/*数组下标法*/

#include

#define M 3

#define N 4

int sum(int b[M][N])

{

int i, j, s=0;

for(i=0; i

for(j=0; j

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

return s;

}

void main()

{

int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};

printf("二维数组中的所有元素之和为%d\n", sum(a));

}

/*一级指针法*/

#include

#define M 3

#define N 4

int sum(int *pa)

{

int i,s=0;

for(i=0;i

s=s+*pa++;

return s;

}

void main()

{

int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};

printf("二维数组中的所有元素之和为%d\n", sum(a[0]));

}

/*二级指针法*/

#include

#define M 3

#define N 4

int sum(int (*pa)[N])

{

int i,j,s=0;

for(i=0;i

{

for(j=0;j

s=s+(*pa)[j];

pa++;

}

return s;

}

void main()

{

int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};

printf("二维数组中的所有元素之和为%d\n", sum(a));

}

8.输入一行数字字符存入字符数组str[80]中,用num[10]中的数组元素作为计数器来统计每个数字字符的个数。用下标为0的元素统计字符“0”的个数,用下标为1的元素统计字符“1”出现的次数,„„。输出每个奇数字符出现的次数。

#include

void count(char *str, int num[])

{

int i=0;

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

{

switch(str[i])

{

case '0': num[0]++; break;

case '1': num[1]++; break;

case '2': num[2]++; break;

case '3': num[3]++; break;

case '4': num[4]++; break;

case '5': num[5]++; break;

case '6': num[6]++; break;

case '7': num[7]++; break;

case '8': num[8]++; break;

case '9': num[9]++; break;

}

i++;

}

}

void main()

{

char str[80],*p=str;

int num[10]={0}, i;

printf("请输入一行数字字符:");

gets(p);

count(p,num);

for(i=1;i

printf("数字串中%d出现的次数为%d\n",i,num[i]);

}

9.在主函数中输入10个不等长字符串,用另一函数sort()对它们排序,然后在主函数中输出已排好序的字符串。要求:每个字符串长度均不超过30字符,用指针数组进行处理。 #include

#include

#define M 10

#define N 31

void sort(char *pstr[])

{

int i,j;

char *t;

for(i=0; i

{

for(j=0; j

if(strcmp(pstr[j],pstr[j+1])>0)

{

t = pstr[j];

pstr[j] = pstr[j+1];

pstr[j+1] = t;

}

}

}

void main()

{

char str[M][N], *pstr[M]={NULL};

int i;

printf("请输入10个字符串,每个字符串均不超过30个字符:\n");

for(i=0; i

{

gets(str[i]);

pstr[i]=str[i];

}

sort(pstr);

printf("排好序的字符串从小到大依次为:\n");

for(i=0; i

printf("%s\n", pstr[i]);

}

10.输入一个字符串,内有数字字符和非数字字符如123a345bcd567,将其中连续的数字作为一个整数,依次存放到整型数组a 中,例如,123放在a[0],345放在a[1]中,567放在a[2]中,„„,统计共有多少个整数,并输出这些整数。

#include

#include

void main()

{

char ch[1000],*p=ch;

int a[50],*q=a,num=0,i;

gets(ch);

for( ; *p!='\0'; p++)

if(*p>='0' && *p

{

*q=(*p)-'0';

p++;

while(*p>='0' && *p

*q=(*q)*10+(*(p++)-'0');

num+=1;

q+=1;

}

for(i=0,q=a; i

printf("%d ",*q);

printf("\n一共输入了%d个整数。\n",num); }


相关内容

  • 大学课后习题答案
  • [大学四年100万份资料大集合] http://www.3che.com/forum.php?mod=viewthread&tid=7083&fromuid=582866 新视野大学英语课后习题答案1-4册全集 http://www.3che.com/forum.php?mod=vi ...

  • 超多大学课后习题答案与大家分享啦~~
  • 超多大学课后习题答案与大家分享啦~~.txt男人应该感谢20多岁陪在自己身边的女人.因为20岁是男人人生的最低谷,没钱,没事业:而20岁,却是女人一生中最灿烂的季节.只要锄头舞得好,哪有墙角挖不到?2500份课后答案,很值得收藏,这里只介绍了一部分. 还有很多,可以去课后答案网(http://bbs ...

  • 大学课本课后习题答案
  • 注册可用 公共课程 http://www.10xiao.com/forum-6-1.html 新视野大学英语读写教程第四册答案 http://www.10xiao.com/thread-7-1-1.html 新视野大学英语读写教程第三册答案 http://www.10xiao.com/thread- ...

  • 2015年英语类3D电子书(题库)
  • 2015年英语类3D电子书(题库)共428种 英语类考试 大学英语考试 大学英语四级               1.[圣才视频]大学英语四级考试真题解析班(网授)[免费下载] 8.[3D题库]2015年12月大学英语四级题库[历年真题+章节题库+模拟试题][免费下载] ...

  • 编译原理教程课后习题答案--第八章
  • 第八章 符号表与错误处理 8.1 完成下列选择题: (1) 编译程序使用区别标识符的作用域. a. 说明标识符的过程或函数名 b. 说明标识符的过程或函数的静态层次 c. 说明标识符的过程或函数的动态层次 d. 标识符的行号 (2) 在目标代码生成阶段,符号表用于. a. 目标代码生成 b. 语义检 ...

  • 大学物理简明教程课后习题参考答案-陈执平
  • 大物课后习题参考答案???1-1 一质点在xy平面内运动,在t?0 s时 它的位置矢量r?(?4i?5j)m,经Δt?5s后,其位移Δr?(6i?8j)m,求:(1) t?5 s时的位矢:(2)在Δt时间内质点的平均速度.解 (1)据题意,在t??t时刻,该质点的位矢为 ???r1?r??r?(?4 ...

  • 定量分析简明教程(第一版)课后练习题答案第七章
  • 第七章习题答案 7-1 (1) B (2) B (3) C (4) C, D (5) A (6) C, D, E 7-2 (1) 用于定量测定的理论依据是光吸收定律. (2)可见光的波长范围是波长300nm光. (3)下列水溶液选择性吸收光的颜色为: A,CuSO4:黄色: B,K2Cr2O7:青蓝 ...

  • 大学英语4课后习题答案
  • Unit 4 Section A. The Telecommunications Revolution <读写教程 IV>: Ex. II, p. 95 1. The living standards in the developing world will be greatly imp ...

  • 管理学教程(戴淑芬版)第三版课后习题答案
  • 管理学教程(戴淑芬)第三版答案 (2010-12-31 18:24:39) 转载 标签: 杂谈 思考题答案 第一章管 理 概 述 一.判断题 对 对 错 错 错 错 对 错 对 错 错 对 错 错 错 二.简答题 1.组织的活动有两类- - -作业活动和管理活动.组织是直接通过作业活动来达成组织目标 ...

  • 数据结构课程 课后习题答案
  • <数据结构简明教程>练习题及参考答案 练习题1 1. 单项选择题 (1)线性结构中数据元素之间是()关系. A. 一对多 B.多对多 C.多对一 D.一对一 答:D (2)数据结构中与所使用的计算机无关的是数据的()结构. A. 存储 B.物理 C.逻辑 D.物理和存储 答:C (3)算 ...