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

更新时间:2024-04-18 00:06:01 阅读量: 综合文库 文档下载

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

第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\void main() {

printf(\班级:BX1109\\n\

printf(\学号:111003530901\\n\ printf(\姓名:王孟荣\\n\}

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

#include void main() {

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

printf(\scanf(\a=x+y; b=x-y; c=x*y; d=1.0*x/y;

printf(\}

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

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

3.x*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(\ scanf(\ c=21%9-(float)a+4/b*b; printf(\ }

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

int a,b,c;

printf(\ scanf(\ c=a*a-b*b;

printf(\ }

第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(\ x=(a*a+b*b)/sqrt(3*(a+b)); printf(\}

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

#include

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

scanf(\ s=(a+b)*h/2;

printf(\梯形面积s=%.2f\\n\ }

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

This is a c program.

My name is [第一个字母]

#include void main( ) {

char name;

name=getchar(); putchar(name); printf(\

printf(\ printf(\ }

第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 && x0!=0 7. 5 6 8. A

9. x<0 || x>10 && x<50 10. -1

三、程序分析题 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<5) y= 3x+5 (5≤x<50) x- (x≥50)

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

scanf(\ if(x<5) y=x*x-2;

else if(x<50) y=3*x+5; else y=x-sqrt(4*x-1);

printf(\}

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

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

scanf(\ 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(\ 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<1000 5% 1000≤n<2000 r= 8% 2000≤n<3000 10% 3000≤n<6000 15% 6000≤n

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

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

printf(\请输入奖金值:\ scanf(\ 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\}

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

scanf(\ if(a

printf(\}

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

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

printf(\输入一个少于4位的正整数:\ scanf(\

if(num>=0 && num<=9999)

{ if(num>1000 && num<=9999) { printf(\是一个4位数\\n\

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

else if(num>=100)

{ printf(\是一个3位数\\n\

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

}

else if(num>=10)

{printf(\是一个2位数\\n\

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

else

{printf(\是一个1位数\\n\ printf(\逆序数为:%d\\n\ } }

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 = =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 \main() { char ch; int k=0;

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

printf(\}

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

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

for (n=2; n<=100; n = n + 2) {

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

printf(\}

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

int x,y,z,count=0; for(x=1;x<=28;x++) for(y=1;y<=73;y++) {

z=100-x-y;

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

count++;

printf(\} }

printf(\}

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

for (x=1;x<=97;x++) { y=98-x;

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

printf(\鸡=%d,兔=%d\ } }

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

{

int n,i;

printf(\ scanf(\ printf(\ for(i=2;i<=n;i++) while(n!=i) {

if(n%i==0) { printf(\ n=n/i; }

else break; }

printf(\

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(\scanf(\

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

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

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

printf(\}

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

int i,j,k,n;

printf(\ for (n=100;n<1000;n++) {

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

if (n==i*i*i+j*j*j+k*k*k) printf(\ } }

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

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

double sum,term; /*因为位数多,所以定义为双精度 */ printf(\scanf(\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(\} 9.编写一个猜数游戏:任意设置一个整数,请用户从键盘上输入数据猜想设置的数是什么,告诉用户是猜大了还是小了。10次以内猜对,用户获胜;否则,告诉用户设置的数据是什么。

#include void main()

{int num=123,x,n;

printf(\给出数据范围的提示信息*/ for(n=1;n<=10;n++) {printf(\ scanf(\

if(x==num) {printf(\ if(x>num) printf(\ if(x

if(n==11) printf(\}

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

#include main() {

int i,j;

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

for (j=20-i;j>=1;j--) printf(\

for (j=0;j<2*i-1;j++) printf(\ printf(\ }

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

for (j=20-i;j>=1;j--) printf(\

for (j=0;j<2*i-1;j++) printf(\ printf(\ } }

第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(\ for(i=0;i

min=a[0];

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

printf(\}

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

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

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

scanf(\ if(x<0)

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

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

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

printf(\else if(a[j]<=15)

printf(\printf(\}

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(\}

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<=k-2;i+=2) { m=i;

for(j=i+2;j<=k; j+=2 ) if(a[m]>a[j]) m=j; if(m!=i)

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

puts(a); printf(\ }

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

void main()

{ int i,j,a[10][10]; for(i=0;i<10;i++) { a[i][0]=a[i][i]=1; for(j=1;j

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

for(i=0;i<10;i++) { for(j=0;j<=i;j++) printf(\ printf(\ } }

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

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

printf(\scanf(\ d=strlen(s);

for(i=0;i

for(i=0;i

printf(\}

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

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

printf(\输入一个需加密的四位数整数:\scanf(\aa[0]=a; aa[1]=a0/10; aa[2]=a00/100; aa[3]=a/1000; for(i=0;i<=3;i++)

{aa[i]+=5; aa[i]%=10; }

for(i=0;i<=3/2;i++) {

t=aa[i];

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

printf(\加密后的数字为:\for(i=3;i>=0;i--) printf(\printf(\}

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<3;i++) { for(j=0;j<4;j++)

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

printf(\数值18第一次出现的位置在%d行,第%d列\\n\}

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<4;i++) for(j=0;j<4;j++) a[i][j]=3*i+2*j-6;

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

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

for(j=0;j<4;j++) s+=a[1][j];

printf(\第二行4元素累加和为:%d\\n\for(j=0;j<4;j++) n+=a[j][3];

printf(\第四列4元素平均值为:%.2f\\n\4.0); for(i=0;i<4;i++) if(a[i][i]<0) m++;

printf(\主对角线4元素中负数的个数为:%d\\n\}

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(\

printf(\输入n个人的密码: \ for (i=0;i

printf(\出列顺序为: \ for(i=0;i

while(j

{ while(a[k]==0) /*跳过已出列的人*/ k=(k+1)%n; j++;

k=(k+1)%n; }

while(a[k]==0) /*跳过已出列的人*/ k=(k+1)%n;

printf(\

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(\ scanf(\ if (prime(n))

printf(\ else

printf(\

}

int prime(int n) {int flag=1,i;

for (i=2; i

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

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

char str1[20],str2[20]; printf(\gets(str1);

printf(\gets(str2);

if (MyStrcmp(str1,str2)>0) printf(\

else if (MyStrcmp(str1,str2)<0) printf(\ else

printf(\}

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(\ scanf(\

printf(\ scanf(\

concatenate(s1,s2,s);

printf(\ }

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) {

minValue = a[i]; minPos = i; } }

temp = a[maxPos]; a[maxPos] = a[minPos]; a[minPos] = temp; }

main() {

int a[ARRSIZE],i;

printf(\ for (i=0; i

MaxMinExchang(a, ARRSIZE); printf(\for (i=0;i

5. 写一函数,能对给定的一个二维数组(3×3)进行转置(即行列互换)。 #include #define N 3 int array[N][N]; void main()

{ void convert(int array[][3]); int i,j;

printf(\ for (i=0;i

scanf(\ printf(\ for (i=0;i

printf(\ printf(\ }

convert(array);

printf(\ for (i=0;i

printf(\ printf(\ } }

void convert(int array[][3]) {int i,j,t;

for (i=0;i

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(\ scanf(\ if (strlen(str)>N)

printf(\ else flag=0; }

sort(str);

printf(\ for (i=0;i

void sort(char str[]) {int i,j; char t;

for(j=0;j

for (i=0;(istr[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(\ gets(text);

printf(\ puts(text); letter=0; digit=0; space=0; others=0; count(text);

printf(\}

void count(char str[]) {int i;

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

if ((str[i]>='a'&& str[i]<='z')||(str[i]>='A' && str[i]<='Z')) letter++;

else if (str[i]>='0' && str [i]<='9') 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; a/=10; }

return s; }

int prime(int a)

{ int i;

for(i=2;i<=(int)sqrt(a);i++) if(a%i==0) return 0; return 1; }

main() { int i;

for(i=3;i<10000;i++) if(prime(i))

if(prime(invert(i))) printf(\printf(\}

9. 编写一个函数,实现将一个十进制数转换成八进制数。 #include #include void main() {

int i,n; char a[33];

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

printf(\ scanf(\ trans10_8(a,n);

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

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(\ scanf(\ inverse(str);

printf(\}

void inverse(char str[]) {char t; int i,j;

for (i=0,j=strlen(str);i<(int)(strlen(str)/2);i++,j--) {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

break; }

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\else if(c<0)

printf(\字符串%s 小于 字符串%s\\n\else

printf(\字符串%s 等于 字符串%s\\n\}

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<=0||m<=0) 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++;

*p='\\0'; return 1; } }

void main() {

char str[81]; int k, m, state;

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

printf(\请输入要删除的子串起始字符的序号和子串长度:\\n\scanf(\state = delSubstr(str, k, m); if(state<0)

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

printf(\删除指定子串后的字符串为:%s\\n\}

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\}

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

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\}

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;

else { p++; i++; } }

if(*p=='\\0') return -1; else return i; }

void main() {

char ch,str[80]; int poi;

printf(\请输入字符串:\gets(str);

printf(\请输入待查找的字符:\scanf(\poi=lstrchar(str,ch); if(poi==-1)

printf(\字符串中不存在指定字符!\\n\else

printf(\该字符在字符串中出现的第一个位置为%d\\n\}

7.定义一个整型二维数组并初始化,编程求该数组所有元素的和。 要求:分别用数组下标法、一级指针法、二级指针法实现。 /*数组下标法*/ #include #define M 3 #define N 4

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

int i, j, s=0;

for(i=0; i

void main() {

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

printf(\二维数组中的所有元素之和为%d\\n\}

/*一级指针法*/ #include #define M 3 #define N 4 int sum(int *pa) {

int i,s=0;

for(i=0;i

void main() {

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

printf(\二维数组中的所有元素之和为%d\\n\}

/*二级指针法*/ #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

return s; }

void main() {

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

printf(\二维数组中的所有元素之和为%d\\n\}

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<10;i+=2)

printf(\数字串中%d出现的次数为%d\\n\}

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(\}

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<='9') {

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

while(*p>='0' && *p<='9') *q=(*q)*10+(*(p++)-'0'); num+=1; q+=1; }

for(i=0,q=a; i

printf(\一共输入了%d个整数。\\n\}

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

Top