程序设计上机实验课后答案

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

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

第3章 程序控制结构

1.1 选择结构部分

一、选择题

1 B 17 C 2 A 18 C 3 D 19 B 4 B 20 D 5 D 21 B 6 D 22 B 7 A 23 C 8 D 24 A 9 C 25 D 10 C 26 D 11 D 27 A 12 B 28 A 13 A 29 C 14 D 30 C 15 A 31 C 16 A 32 D 二、填空题 1. OK!

NO! ERROR! 2. x=1 y=0

x=2

3. ch>=’A’&& c<=’Z’ ch=ch-32 4. -1 5. x=6 6. (1)2

(2)3

CC

a=2,b=2,c=4 7. (1)a

(2)a>c&&b>c (3)a

三、程序设计题

1. #include

#define pi 3.14159 main( ) { int k;

float r,c,a;

printf(“input r,k\\n”); scanf(“%f%d”,&r,&k); switch(k) {

case 1: a=pi*r*r; printf(“area=%f\\n”,a);break; case 2: c=2*pi*r;printf(“circle=%f\\n”,c);break;

cese 3: a=pi*r*r;c=2*pi*r;printf(“area=%f circle=%f\\n”,a,c);break;

} }

2. main( ) {

int year,leap;

scanf(“%d”,&year); if(year%4==0)

{

if(year0==0) {

if(year@0==0)

leap=1; else leap=0; }

else leap=1;

}

else leap=0; if(leap)

printf(“%d is ”,year);

else printf(“%d is not ”,year); printf(“ a leap year\\n”);

}

3. #include

main() {

float x,y;

scanf(“%f”,&x); if(x<0) y=x*x;

else if(x>=0&&x<10) y=-0.5*x+10;

else y=x-sqrt(x);

printf(“y=%f”,y); }

1.2 循环结构部分

一、选择题 1 A 16 A 2 C 17 B 3 C 18 D 4 C 19 B 5 B 20 D 6 D 21 D 7 D 22 C 8 A 23 A 9 C 24 B 10 B 25 D 11 A 26 B 12 B 27 C 13 A 28 B 14 B 29 A 15 A 30 C 二、填空题

1. (1)先判断条件是否成立(为真),若成立(为真)再执行循环语句

(2)先执行循环语句,再判断条件是否成立(为真),若成立则继续执行循环,若不成立,则结束循环。do-while至少执行一次循环语句

2. (1)switch-case语句 (2)循环 3. 结束本次循环执行

4. (1)结束本次循环,后进行循环的条件判定,即不终止整个循环的执行过程

(2)终止整个循环的执行,不再进行条件判定 5. 8.18或19 6. ##2##4 7. 54321 8. k<=n 9. ACE 三、程序分析题 1. 1,2,3 2. 3,3

3. 52 4. 7891

5. s=6 6. 6

7. *

** ***

**** 8. ******

* * * * ****** 9. 1 1

四、程序设计题

1. #include

main( ) {

int n=1,m=0,k,mod_mn=1;

printf(“Please Input m value:\\n”); scanf(“%d”,&m); n=1;

for(k=0;;k++) {

mod_mn=m/(n*10);

printf(“%d”,(m-mod_mn*n*10)/n); if(mod_mn==0) break; n*=10; } }

2. #include

main( ) {

int l,m,n,answer_flag=0; n=1;

printf(“Big Rooster,Hen,Chickabiddy\\n”); for(l=0;l<=20;l++)

for(m=0;m<=(100-l*5)/3;m++) {

n=(100-l*5-m*3)*3;

if(l*m*n>0&&l+m+n==100&&(l*5+m*3+n/3)==100) {

printf(“%-4d%-4d%-4d\\n”,l,m,n); answer_flag=1; } }

if(answer_flag==0)

printf(“Not Answer”); }

程序运行结果:

Big Rooster,Hen,Chickabiddy 4 18 78 8 11 81

12 4 84

3. #include

#include main( ) {

int k,l,m,n=0;

printf(“Please Input n:\\n”); for(m=101;m<=200;m+=2) {

if(n==0) printf(“\\n”);

k=sqrt(m); for(l=2;l<=k;l++) if(m%l==0) break;

if(l>=k+1) {printf(“%d”,m); n++;

}

} }

4. #include

main( ) {

int l,m,n,answer_flag=0; n=1;

printf(“\\n1Cent Coin,2Cent Coin,5Cent Coin\\n”); for(l=0;l<=100;l++)

for(m=0;m<=(100-l)/2;m++) {

n=(100-l-m*2)/5;

if(l+m*2+n*5==100) {

printf(“%-4d%-4d%-4d\\n”,l,m,n);

answer_flag+=1; } }

if(answer_flag==0)

printf(“Not Answer”);

else printf(“Total of Exchange Method is %d”,answer_flag); }

共有541种换法。

5. #include

main( ) {

int k,l,n;

double e=1,fact_k=1;

printf(“Please Input n:”); scanf(“%d”,&n); for(k=1;k<=n;k++) {

fact_k=1;

for(l=1;l<=k;l++)

fact_k*=1;

e+=1/(double)fact_k; }

printf(“e=%lf”,e);

}

程序运行结果:

Please Input n:100

e=2.718282

6. #include

main( ) {

int k,l,m,n;

printf(“Please Input n:\\n”); scanf(“%d”,&n); for(k=1;k<=n;k++)

{

for(m=0,l=1;l<=k/2;l++)

if(!(k%l)) m+=l;

if(m==k) printf(“M”,k); }

}

程序运行结果:

6 28 496

7. #include

main( ) {

int year=0,number=0;

for(year=2000;year<3000;year++) {

if((year%4==0&&year0!=0)||year@0==0) { printf(“%d”,year);

number++;

if(number==0) printf(“\\n”); } }

printf(“\\ntotal number of leap year is %d”,number); }

8. #include

main( ) {

int k,l,n;

double sum=0,fact_k=1;

printf(“Please Input n:”); scanf(“%d”,&n); for(k=1;k<=n;k++) {

fact_k=1;

for(l=1;l<=k;l++)

fact_k*=l; sum+=fact_k; }

printf(“sum=%.2lf”,sum);

}

9. #include #include main( ) { int n,a; double x1,x2,e=1; printf(“\\nPlease Input a value:”); scanf(“%d”,&a); x1=1; for(n=1;e>0.00001;n++) { x2=(x1+a/x1)/2; e=fabs(x2-x1); x1=x2; } printf(“sqrt(%d)=%lf”,a,x1); } 10. main()

{

float a=1,b,pi,t=1; while(t>=1e-6) {

pi=pi+t; a++; b=a*a; t=1/b; }

pi=pi*6;

printf(“pi=%f”,pi); }

第4章 函数

一、选择题 1 C 16 A 31 B 2 B 17 D 32 C 3 B 18 B 33 D 4 D 19 C 34 C 5 B 20 B 35 A 6 B 21 D 36 C 7 D 22 C 37 B 8 A 23 D 38 C 9 D 24 C 39 A 10 A 25 C 11 D 26 A 12 D 27 D 13 B 28 C 14 A 29 A 15 A 30 B 二、填空题

1. 程序中的main( )函数 2. 包含它的函数 调用函数

三、程序分析题 1. 15

2. i=7;j=6;x=7 i=2;j=7;x=5; 3. 111 4. A+B=9 5. 123 6. 246

7. 1:a=1,b=1

2:a=1,b=2 3:a=1,b=3 四、程序设计题 1. void main()

{

int n;

scanf(\

printf(\}

fan(int m) {

int sum=0,i; while(m) {

i=m;m=m/10;sum+=i; }

return(sum); }

2. #include\

double add(double x, double y) { double sum;

sum=x+y; return(sum); }

void main()

{ double a,b,c;

scanf(\

c=add(a,b); printf(\}

3. #include\

double mypow(double x, int y) {

double s=1;int k; for( k=0;k

3. 13

4. person[i].sex

8. x=9

x=10 9. 9

10. input a integer number:5

5!=120 11. 777 12. 15

return(s); }

void main() {

double a=5.0;int n=2; printf(\}

4. fun(int x,int y)

{

int z;

z=fabs(x-y); return(z); }

5. isprime (int a)

{

int i;

for(i=2;i

6. #include \

main() {

int i=5;

void palin(int n); printf(\ palin(i); printf(\}

void palin(int n) {

char next; if(n<=1) {

next=getchar(); printf(\putchar(next); } else {

next=getchar(); palin(n-1); putchar(next); } }

第5章 数组

一、选择题

1 2 D 17 C 32 D 3 D 18 B 33 C 4 B 19 C 34 B 5 C 20 C 35 B 6 A 21 D 36 D 7 B 22 B 37 D 8 C 23 B 38 D 9 B 24 B 39 D 10 A 25 D 40 B 11 B 26 D 41 D 12 C 27 C 42 B 13 C 28 B 43 C 14 B 29 D 44 D 15 B 30 A 45 C C 16 C 31 A 一、填空题

1. 0、数据类型 2. 9、0

3. ① &x[i] ② i=1 ③ a[i]

4. ① &a[i] ② i%4==0 ③ printf(\5. ① k=p ② k

6. ① a[0] ② max=a[i] 7. ① 9 ② i

8. ① =a ② a ③ sum/n ④ x[n]a[k]

11. ① base%n ② base/n ③ j-- 12. ① j=i ② k=i

13. ① a[i]>b[j] ② i<3 ③ j<5 14. ① x[0] ② x[0]=t 15. 按行存放 16. 一维 17. 0 18. 0、0 19. 0、6 20. 0

21. ① i==j ② a[i][j]

22. ① p=j ② x[i][p] ③ LineMax(x) 23. ① i==j ② a[i][j] 24. ① i-- ② n

25. ① a[0][i] ② b[i][0] 26. srtcpy(s2,s1)

27. #include 28. \\0、2 29. 8 30. 5 4

31. ① j++ ② a[i]>a[j] 32. he

33. ① c=getchar( ) ② 1 34. ① j ② s[j-1]

35. ① strlen(t) ② t[k]==c ③ break 36. ① b[j]!= '\\0' ②'\\0'

9

37. ① j>=0&&t

二、程序分析题 1. 3 7 15 2. 10010 3. 852

4. 5 7 4 8 9 1

1 5 7 4 8 9 9 1 5 7 4 8 8 9 1 5 7 4 4 8 9 1 5 7 7 4 8 9 1 5

5. 1 2 0 1 2 -16. 2 5 20 7. 12 8. 321678

9. 1,2,7,6,5,4,3,8,9,10,10. 3 5 7 11. 1,0,7,0, 12. 1,6,5,7, 13. 6,4,3,2, 14. 4 15. 0650 16. 21 17. 3 5 7 18. 9 19. 5 4 20. 3 4 21. ab 22. 3 23. 20 11 24. acc,xabcc 25. 6 26. f 27. 1 28. 2 29. WORLO 30. AzyD 31. 9198 32. S**B* 33. #&*&% 34. SW*

程序设计题

1. #include

main()

10

{ float data[10]; /*存放浮点数的一维数组*/

float result1=0.0,result2=0.0; /*定义变量,分别存放正数和、负数和*/ int i;

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

scanf(\ /*逐一输入数据*/ for(i=0;i<10;i++) { if(data[i]>0.0)

result1+=data[i]; /*累加正数*/ else

result2+=data[i]; /*累加负数*/ }

printf(\ printf(\ }

2. #include

#include \#define N 101 main() {

int i,j,line,a[N];

for(i=2;i

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

for(i=2,line=0;i

if(a[i]!=0)

{printf(\ line++;} if(line==10) {printf(\line=0;} } }

3. #include

#define N 10 main()

{int i,j,min,tem,a[N]; /*input data*/

printf(\for(i=0;i

printf(\

11

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

for(j=i+1;ja[j]) min=j; tem=a[i]; a[i]=a[min]; a[min]=tem; }

/*output data*/

printf(\for(i=0;i

4. #include

main() {

int a[11]={1,4,6,9,13,16,19,28,40,100}; int temp1,temp2,number,end,i,j; printf(\for(i=0;i<10;i++) printf(\printf(\

printf(\scanf(\end=a[9];

if(number>end) a[10]=number; else

{for(i=0;i<10;i++) { if(a[i]>number) {temp1=a[i]; a[i]=number;

for(j=i+1;j<11;j++) {temp2=a[j]; a[j]=temp1; temp1=temp2; }

break; } } }

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

12

5. #include

#define N 5 main()

{ int a[N]={9,6,5,4,1},i,temp; printf(\ for(i=0;i

a[i]=a[N-i-1]; a[N-i-1]=temp; }

printf(\for(i=0;i

printf(\}

6. #include

main() {int i,j;

int a[10][10]; printf(\for(i=0;i<10;i++) {a[i][0]=1; a[i][i]=1;} for(i=2;i<10;i++) 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(\ } }

7. #include

main()

{int a,i,aa[4],t; 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;

13

}

for(i=3;i>=0;i--) printf(\}

8. #include

main()

{ int matrix[4][4]; //定义数组,存放矩阵元素

int k,j,result1=0,result2=0; //result1和result2分别存放两对角线元素和 for(k=0;k<4;k++) //逐行输入数据 {

printf(\

for(j=0;j<4;j++) //逐列输入数据 {

scanf(\

if(k==j) //累加对角线上的元素 result1+=matrix[k][j];

if(k+j==3) //累加反对角线上的元素 result2+=matrix[k][j]; } }

printf(\}

该矩阵周边12个元素之和以及矩阵主对角线及其下方(共10个) 元素之和答案略。 9. #include

#define N 4

main(){ int i,j,med; int b[N][N];

static int a[N][N]={ 1, 2, 3, 4, 5,16,17,18,19, 6, 15,24,25,20, 7, 14,23,22,21, 8, 13,12,11,10, 9 };

printf(\ for(i=0;i<=N-1;i++) { for(j=0;j<=N-1;j++) printf(\分)

for(i=0;i<=N-1;i++)for(j=0;j<=N-1;j++)b[N-1-j]=a[j]; (3分) /*Try: b[N-1-j]=a[j];

(This Is Up And Down Convert ) Try: b[N-1-j]=a[j]; (This Is Left And Right Convert) */ printf(\for(i=0;i<=N-1;i++) {for(j=0;j<=N-1;j++) printf(\printf(\} }

10. 程序提示:

输入矩阵

flag2=0;//矩阵中无鞍点

for(i=0;i

max=a[i][0];maxj=0;

用for循环语句找第i行的最大值存放在max中,其下标j保存到maxj中

for(k=0,flag1=1;k

14

if(max>a[k][maxj]) flag1=0;//max不是该列的最小元素 if(flag1) {

printf(\第%d行第%d列的%d是鞍点\\n\1,maxj+1,max); flag2=1; } }//endfor if(!flag2)

printf(\矩阵中无鞍点\\n\

11. #include

main() {

static int month_tab[2][13] = {

{0,31,28,31,30,31,30,31,31,30,31,30,31}, /*利用数组,将非闰年的每月天数列成一个表*/ {0,31,29,31,30,31,30,31,31,30,31,30,31} /*闰年的每月天数对应的表*/ };

int year, month, day; int yearday,leap,i;

printf(\

scanf(\ /*输入年、月、日*/

leap = ((year %4 == 0) &&(year 0 != 0)||(year % 400 == 0));/*判定是否为闰年*/ yearday = day ;

for (i=1;i

yearday+=month_tab[leap][i]; /*计算是该年的第几天*/ printf(\ }

12. #include

main()

{ char a[41],b[21]; //定义两个字符型数组,用以分别存放两个字符串 int j,k; //定义两个循环因子

printf(\ scanf(\

printf(\ scanf(\

while (a[i]!=’\\0’)

i++ ; /*搜索到第一个字符串的结尾处*/

while (b[j]!=’\\0’) /*将第二个字符串中的字符逐一拷贝到第一个字符串的后面*/ { a[i]=b[j] ; i++ ; j++ ; }

a[i]='\\0'; /*加字符串结尾标志*/ printf(\}

13. #include

main()

{ char str1[100],str2[100]; //str1用于存放输入的数字,str2用于存放输入的字母 char c; //存放临时数据的变量 int i=0,j=0;

15

printf(\ //输入提示

while((c=getchar())!='\\n'&&i<99&&j<99) //输入字符串,遇回车符结束 { if(c>=48&&c<=57) //对是否为~9的数字进行判断 str1[i++]=c; //输入的是数字,则存放入str1中

else if(c>=65&&c<=90||c>=97&&c<=122) //对是否为英文字母进行判断 str2[j++]=c; //输入的是字母,则存放入str2中 else ; //既不是数字,又不是字母,忽略 }

str1[i]='\\0'; //加字符串结束标志// str2[j]='\\0';

printf(\ //打印结果 printf(\}

第6章 指针

一、选择题 1 B 16 B 31 C 46 C 61 A 2 B 17 C 32 A 47 C 62 D 3 D 18 C 33 B 48 D 63 A 4 C 19 B 34 A 49 A 64 B 5 D 20 B 35 B 50 C 65 C 6 A 21 A 36 D 51 D 66 D 7 B 22 C 37 D 52 B 67 A 8 B 23 D 38 C 53 D 68 A 9 A 24 D 39 C 54 A 10 B 25 D 40 A 55 C 11 B 26 C 41 B 56 D 12 C 27 D 42 A 57 C 13 A 28 C 43 B 58 A 14 A 29 C 44 C 59 B 15 A 30 A 45 A 60 D 二、填空题 1. 0

2. p是指向整形数据的指针变量;q是指针数组,它由10个指向整形数据的指针元素组成;r是指向函数的指

针,该函数返回一个整数值;s是返回一个指针的函数,该指针指向整形数据 3. 4. 5. 6. 7. 8.

4、12 8、8 12、12 3

*(p+6) 456789 9. hELLO 10. ef

11. ① return 0 ② *p1-*p2 12. 110 13. 71

14. p=(double *)malloc(sizeof(double)) 15. br[i]

16. ① str+strlen(str)-1 ② i>strlen(str)/2 ③ huiwen(str) 17. *t

18. *pmax=*px

16

19. 10 20. 40 21. efgh 22. 3

23. 7777654321

三、程序分析题 1. 3 2. 19

3. 1,2,3,4,5,6,7,8,9,0, 4. 8,7,6,5,4,3,2,1 5. 5678901234 6. 2,3,4,5,6 7. 25

8. 6,2,3,4,5, 9. 0 10. z 11. 6789 12. 6 13. 3,4 14. AGAAGAG 15. ABCD

BCD CD D 16. 8.000000 17. 2 4 18. 3 4 5 19. 10

20. gfedcba

21. Afternoon 22. 61

23. accbbxxyy,bbxxyy 24. 20 25. 31 26. 567 27. d

28. 3,5,3,5 29. 1,3 30. 2 31. a 32. 5 3 33. 6789 34. 15

35. -5,-12,-7 36. 6385

17

37. 4 3 2 1 38. 35745 39. 9 40. 1.10 41. 8 42. 26

43. day 44. 23 45. 60 46. 2 47. 6

48. 0246802468 49. Program

gram

50. 2,5,1,2,3,-2, 51. CDABC 52. 0 0 0 8 53. aa 54. Java

dBase

C Language Pascal 55. 6 7 8

Java

9,basicjava 56. 6

57. GFEDCB 58. SO 59. 10 60. Itisis 61. goodgood! 62. 8 63. 17

64. ar=9 ar=9 ar=11 65. 6 66. 12345 67. abcfg 68. abcbcc 69. bcdefgha 70. 14 71. 10 72. 40 73. 10 28

四、程序设计题

1. #include

18

main() {

int number[10]; input(number); max_min(number); output(number); }

input(number) int number[10]; {int i;

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

scanf(\ scanf(\}

max_min(array) int array[10];

{int *max,*min,k,l; int *p,*arr_end; arr_end=array+10; max=min=array;

for(p=array+1;p*max) max=p;

else if(*p<*min) min=p; k=*max; l=*min;

*p=array[0];array[0]=l;l=*p; *p=array[9];array[9]=k;k=*p; return; }

output(array) int array[10]; { int *p;

for(p=array;p

printf(\}

2. #include

main() {

int number[20],n,m,i;

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

scanf(\scanf(\move(number,n,m); for(i=0;i

printf(\

19

printf(\}

move(array,n,m) int n,m,array[20]; {

int *p,array_end;

array_end=*(array+n-1);

for(p=array+n-1;p>array;p--) *p=*(p-1);

*array=array_end; m--;

if(m>0) move(array,n,m); }

3. #include

void main() {

int data[7]={1,2,3,4,5,6,7},temp,k,*ph,*pt;

ph=data; //定义指针指向数组data的首元素 pt=data+6; //指针指向数组的最后一个元素 while(pt>ph) {

temp=*ph; *ph=*pt;

*pt=temp; //数据进行交换 ph++; //两指针向中间移动 pt--; }

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

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

4. void move(int *p)

{ int i,j,t;

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

t=*(p+3*i+j);

*(p+3*i+j)=*(p+3*j+i); *(p+3*j+i)=t; } }

main()函数请读者自己编写。 5. #include

main()

{int i,a[15]; int *p;

void px(int *q,int n);

20

p=a;

printf(\for(;p

printf(\for(;p

printf(\void px(int *q,int n) { int *i,*j,*k; for(i=q;i

for(j=i+1;j*k) k=j;

if(k!=i) { *i+=*k;

*k=*i-*k; *i=*i-*k; } } }

6. #include

void main() {

static int a[2][3],b[3][2],result[2][2]; int *p[3],i,j,k;

p[0]=a[0];p[1]=b[0];p[2]=result[0]; //三个指针分别指向三个二维数组的起始地址 printf(\请输入第一个矩阵:\\n\

for(i=0;i<2;i++) // 通过嵌套循环输入第一个矩阵 { printf(\输入新的一行,每行三个整型数\\n\ for(j=0;j<3;j++)

scanf(\ }

printf(\第二个矩阵:\\n\

for(i=0;i<3;i++) // 通过嵌套循环输入第二个矩阵 { printf(\输入新的一行,每行三个整型数\\n\ for(j=0;j<2;j++)

scanf(\

} //下面的三重循环将两个矩阵乘起来 for(i=0;i<2;i++)

for(j=0;j<2;j++) //前两重循环穷举了resultij for(k=0;k<3;k++)

result[i][j]+=(*(p[0]+3*i+k))*(*(p[1]+2*k+j)); // aik*bkj ,结果累加入resultij for(i=0;i<2;i++) // 输出结果 {

printf(\

21

for(j=0;j<2;j++)

printf(\ }

7. #include

void main()

{ char *p[7]={\\ int code;

printf(\ scanf(\

printf(\}

8. #include

#include

void PrintArray(int * a, int n) { int i;

for(i=0; i

void BubbleSort(int a[], int n) {

int i,j,tmp; int flag;

int count = 0;

printf(\ PrintArray(a,n); for(i=0; i

flag = 0;

for(j=0; j

if(a[j] > a[j+1]) {

tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; flag = 1; } }

count++;

printf(\ PrintArray(a,n); if(flag == 0) {

return; } } }

void main() {

22

int *a,n=5,i;

a =(int *)malloc(n*sizeof(int)); for(i=0; i

9. #include

#include

void swap(char *p1,char *p2) {

char p[80];

strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p); }

main()

{ char n1[80],n2[80],n3[80],*p1,*p2,*p3;

p1=n1; // 指针p1指向字符串n1 p2=n2; // 指针p2指向字符串n2 p3=n3; // 指针p3指向字符串n3 scanf(\//输入字符串p1,p2和p3 if(strcmp(p1,p2)>0) swap(p1,p2); if(strcmp(p1,p3)>0) swap(p1,p3); if(strcmp(p2,p3)>0) swap(p2,p3);

printf(\// 利用指针输出结果 }

10. #include

void main() {

char str1[50],str2[50];

char *ps1=str1,*ps2=str2; //指针ps1和ps2分别指向字符串str1和str2 printf(\ //输入提示 scanf(\ //输入第一个字符串 printf(\ //输入提示

scanf(\ //输入第二个字符串 while(*ps1!='\\0'&&*ps2!='\\0') {

if(*ps1!=*ps2) //逐一比较两字符串中的字符,发现不等时跳出循环 break;

ps1++; //指针从当前位置向后移动一个位置 ps2++; //指针从当前位置向后移动一个位置 }

if(*ps2>*ps1)

printf(\ else if(*ps2<*ps1)

printf(\ else

printf(\}

11. #include

23

main() {

int len;

char *str[20];

printf(\scanf(\len=length(str);

printf(\}

length(p) char *p; {

int n; n=0;

while(*p!='\\0') {

n++; p++; }

return n; }

12. #include

char *month(int n) // 定义字符型指针数组 {

char *name[]={\

\ return((n<1 || n>12)? name[0] : name[n]); }

main() {

int n;

printf(\ scanf(\

printf(\ }

13. #include

#include #include

char *word[]={\#define NUM (sizeof(word)/sizeof(char *)) #define LINES 256 #define MAXLEN 1000

void del_word(char *s,int n,int len) {

while (*(s+n)=*(s+n+len)) n++; }

int getline(char *s,int len) {

24

int c; char *p=s;

while (--len>0 && (c=getchar())!='\\n') *s++=c; *s='\\0'; return(s-p); }

void writelines(char *lineptr[],int nlines) {

int i;

printf(\删除后的文本段:\\n\ for (i=0;i

printf(\}

int index(char s[],char t[]) {

int i,j,k;

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

for (j=i,k=0;t[k]!='\\0' && s[j]==t[k];j++,k++); if (t[k]=='\\0') return(i); }

return(-1); }

int readlines(char *lineptr[],int maxlines) {

int len,nlines=0; char *p,line[MAXLEN];

printf(\输入一段文本:\\n\

while ((len=getline(line,MAXLEN))>1) if (nlines>maxlines) return(-1);

else if ((p=(char *)malloc(len+1))==NULL) return(-1); else {

line[len]='\\0'; strcpy(p,line);

lineptr[nlines++]=p; }

return(nlines); }

main() {

char *lineptr[100],*p; int i,j,k,nlines;

if ((nlines=readlines(lineptr,100))>0) {

for (i=0;i

25

j=0;

while (j

p=lineptr[j++];

while ((k=index(p,word[i]))>=0) del_word(p,k,strlen(word[i])); } }

writelines(lineptr,nlines); } }

14. #include

main() {

float peven(),podd(),dcall(); float sum; int n; while (1) {

scanf(\ if(n>1) break; }

if(n%2==0) {

printf(\ sum=dcall(peven,n); } else {

printf(\ sum=dcall(podd,n); }

printf(\}

float peven(int n) {

float s; int i; s=1;

for(i=2;i<=n;i+=2) s+=1/(float)i; return(s); }

float podd(n) int n; {

float s; int i; s=0;

26

for(i=1;i<=n;i+=2) s+=1/(float)i; return(s); }

float dcall(fp,n) float (*fp)(); int n; {

float s; s=(*fp)(n); return(s); }

15. #include

#include main()

{ char str1[20],str2[20],*p1,*p2; int sum=0;

printf(\scanf(\p1=str1;p2=str2; while(*p1!='\\0') {

if(*p1==*p2)

{while(*p1==*p2&&*p2!='\\0') {p1++; p2++;} } else p1++;

if(*p2=='\\0') sum++; p2=str2; }

printf(\getch();}

16. 程序提示:报数程序段如下:

for(i=0;i

i=0;//i为现正报数的人的编号

k=0;//k为1.2.3计数时的计数变量 m=0;//m为退出的人数 while(m

if(*(p+i)!=0)k++;

if(k==3)//对退出的人的编号置0 {

*(p+i)=0; k=0; m++; }

27

i++;

if(i==n)i=0; }

17. #include

void sort(int **p,int n) {

int i,j,*temp; for(i=0;i**(p+j)) {temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp;} }

void main() {

void sort(int **p,int n);

int i,n,data[10],**p,*pstr[10]; printf(\ scanf(\ for(i=0;i

pstr[i]=&data[i];

printf(\ for(i=0;i

scanf(\ p=pstr; sort(p,n);

printf(\ for(i=0;i

printf(\ printf(\}

18. #include

void main()

{ char *p[7]={\ char **pp=p; //二级指针指向指针数组的首地址 int data;

printf(\输入0~6的整型数:\ scanf(\

printf(\ //二级指针间接引用字符串 }

第7章 结构体与共用体

一、选择题 1 B D

2 C C 3 D D 4 D D 5 D D 6 C A 7 B B 8 D C 9 B C 10 11 12 13 14 15 16 17 18 19 20 C D A C 28

C D C C A C C D D B A A D A B A 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 B B 41 42 43 44 45 46 47 48 B C C A D C A C 二、填空题 1. ① 12② 0

2. ①struct DATA d={2010,10,1}; 3. ①struct DATE d = {2006,10,1}; 4. ①成员(.)②->

5. ①内存大小②声明新的类型名 6. ①enum 7. ①100

8. ①p->no=1234

9. ①;p!=NULL;p=p->next; ②m=p->data; 10. ①struct stu_type st[N] ②i

12. ①student.no②student.birthday.year, 13. ①STDTS *p=&s1 ②p->score

15. ①strcmp(q[i].name,a)==0②q[j+1]=q[j]; 16. ①weekday②(n>=0)&&(n<=6) 17. ①w[i].b

18. ①m=a[i].n ②b[j++]=a[i]③inext 20. ①union test key

21. ①sizeof(struct A))②sizeof(union B)) 22. ①a1=inputstru();②return x; 23. ①STU *x,int n②p

24. ①strcmp(a.name,b.name)>0②strcmp c.name,d.name)>0 25. ①STU stu[N],*p;②i=0,p=stu

26. ①p=(struct node *)malloc(sizeof(struct node));②free(q) 三、程序分析题 1. 10,2

2. zhao,m,85,90 3. 2,4

4. 张飞, 50, 66.600000 5. 张飞, 30, 66.600000 6. 张飞, 50, 66.600000 7. 关羽, 25, 88.800000 8. 4 8 9. 24 10. 80

11. 2,4,3,9,12,12,11,11,18,9, 12. CC,33

13. 1001,ChangRong,1098.0 14. 5 15. 13413 16. 5

29

17. 5/8 is the 128th day in 1998. 18. 20,15 19. 200,y

20. Number=10102

Name= Fu ping Sex=F

Score=92.5 21. 1,2 22. 1234

12 34 12ff 23. 10,x 24. 5,3 25. 3,a

26. 07101 li jia 89.50

07103 li jian 90.6 07105 li dan 85.8 27. sum=425.00

average=85.00 count90=2

28. No Name Sex Score

10101 Zou pin M 75 10102 Yu bin M 82.5 20103 Li fang F 92.5 20104 Che lin F 87 30105 Wang mi M 88 29. All students are:

liu f 78 li m 88 wang f 83 The student is:

li m 88

30. number=10102 name=Zhang zhe

sex=M score=88.500000

number=10102 name=Zhang zhe sex=M score=88.500000

number=10102 name=Zhang zhe sex=M score=88.500000

31. st= 101 Zhang M 19 89.00

score= 89.00 score= 95.00

32. st= 101 Zhang M 19 89.00

st= 101 Zhang M 19 89.00 t= 101 Zhang M 19 89.00 t= 101 Zhang M 19 95.00 st= 101 Zhang M 19 89.00

30

33. date=2005/6/15

34. 101 Zhang M 19 95.00 64.00 0.00

102 Wang F 18 92.00 97.00 0.00 103 Zha0 M 19 85.00 78.00 0.00 104 Li M 20 96.00 88.00 0.00 105 Gou M 19 91.00 96.00 0.00 106 Lin M 18 93.00 78.00 0.00 107 Ma F 18 98.00 97.00 0.00 108 Zhen M 21 89.00 93.00 0.00 109 Xu M 19 88.00 90.00 0.00 110 Mao F 18 94.00 90.00 0.00 ―――――――――――――――――――

101 Zhang M 19 95.00 64.00 79.50 102 Wang F 18 92.00 97.00 94.50 103 Zha0 M 19 85.00 78.00 81.50 104 Li M 20 96.00 88.00 92.00 105 Gou M 19 91.00 96.00 93.50 106 Lin M 18 93.00 78.00 85.50 107 Ma F 18 98.00 97.00 97.50 108 Zhen M 21 89.00 93.00 91.00 109 Xu M 19 88.00 90.00 89.00 110 Mao F 18 94.00 90.00 92.00 35. st= 101 Zhang M 19 89.00

t= 101 Zhang M 19 89.00 t= 101 Zhang M 19 95.00 st= 101 Zhang M 19 95.00 36. 0 7 15

0 1 15

37. No. Name Sex Age Score

103 Zhao M 19 85.70 109 Xu M 19 89.80 108 Zhen M 21 90.10 105 Gou M 19 90.20 106 Lin M 18 91.50 102 Wang F 18 92.40 110 Mao F 18 94.90 101 Zhang M 19 95.60 104 Li M 20 96.30 107 Ma F 17 98.70 38. sequence that persons leave the circle:

3 6 9 12 2 7 11 4 10 5 1 8 The last one is 13 四、程序设计题 1. 参考程序:

#include

#define N 5/*学生的人数*/

31

struct student { char num[6]; char name[8]; int score[4]; }stu[N]; void main()

{void print(struct student stu[6]); int i,j;

for (i=0;i

{printf(\ printf(\

scanf(\ printf(\

scanf(\ for (j=0;j<3;j++)

{printf(\

scanf(\ }

printf(\}

print(stu); }

void print(struct student stu[6]) {int i,j;

printf(\ for (i=0;i

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

printf(\ printf(\ } }

2. 编程思路:

定义结构体变量a、b、c和指针变量p。

当p指向a时,将a.score表示为(*p).score。 #include void main()

{ typedef struct students { char name[10]; char sex; int score; }STDTS;

STDTS s1={\’f’,78},

s2={\’m’,88},s3={\’f’,83}; STDTS *p=&s1;

printf(\printf(\

(*p).name,(*p).sex,(*p).score); printf(\

s2.name,s2.sex,s2.score);

32

printf(\

s3.name,s3.sex,s3.score); if(p->score

if(p->score

p->name,p->sex,p->score); }

3. 编程思路

#include

#define COUNTS struct counts void main( )

{ int i, ch;

COUNTS { char vowel; int num; };

static COUNTS figure[5]={‘a’,0,’e’,0,’i’,0,’o’,0,’u’,0}; printf(\请输入一行文字(以’!’结束):\\n\ ch=getchar( );

while ( ch!=‘!’ ) { switch ( ch ) { case ‘a’:

case ‘A’: figure[0].num++; break; case ‘e’:

case ‘E’: figure[1].num++; break; case ‘i’:

case ‘I’: figure[2].num++; break; case ‘o’:

case ‘O’: figure[3].num++; break; case ‘u’:

case ‘U’: figure[4].num++; }

ch=getchar( ); }

printf(\输入的文字中各元音的个数分别为:\ for(i=0; i<5; i++)

printf(\ } 4. 参考答案

#include void main( ) { int n;

enum weekdays{sun,mon,tue,wed,thu,fri,sat} today; printf(\请输入一整数(0~6):\ scanf(\

today=(enum weekdays)n; switch(today) { case mon: case tue: case wed:

33

case thu:

case fri: printf(\工作日\ case sat:

case sun: printf(\休息日\ default: printf(\输入错\ } }

5. 解题思路。显然,需要设一个数组,有3个元素,每个元素中的信息应包括候选人的姓名(字符型)和得票

数(整型),只有结构体类型才能胜任。据此编写程序如下: #include #include

struct person { char name[20]; int count; }

leader[3]={\void main( )

{ int i,j;char leader_name[20]; for(i=0;i<=10;i++)

{ scanf(\ for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++; } printf(\ for(i=0;i<3;i++)

printf(\

6. 分析:链表由头指针代表,要释放链表可以定义一个工作指针得到头指针,然后头指针和工作指针均不断下

移,同时释放结点。

void fun(struct node *head) {struct node *p; while(head!=NULL) {p=head;

head=head->next; free(p); } }

7. 参考答案

#include #include #include #include typedef struct stu { char name[20]; double score; struct stu *next; }NODE;

NODE *create(int n);

void insertlist(NODE *h, char *s); void deletelist(NODE *h, char *s); void printlist(NODE *h); void main()

{ char chose,sname[20];

34

int n;

NODE *head=NULL; for(;;)

{ system(\

printf(\创建单链表.\\n\ printf(\在单链表中插入结点.\\n\ printf(\在单链表中删除结点.\\n\ printf(\输出单链表.\\n\ printf(\退出.\\n\

printf(\请选择命令号:\ chose=getchar(); getchar(); switch(chose)

{ case ‘1’: printf(\输入结点个数: \ scanf(\ getchar();

head=create(n); break;

case ‘2’: printf(\输入用于插入的姓名: \ gets(sname);

insertlist(head,sname); break;

case ‘3’: printf(\输入用于删除的姓名:\ gets(sname);

deletelist(head,sname); break;

case ‘4’: printlist(head);

printf(\按任意键返回主菜单.\\n\ getch(); break; case ‘0’: exit(1); default: break; } } }

NODE *create(int n) { NODE *p,*h; int i;

char inbuf[10];

h=(NODE *)malloc(sizeof(NODE)); h->next=NULL; for(i=n;i>0;i--)

{ p=(NODE *)malloc(sizeof(NODE)); printf(\输入新结点值:\\n\ gets(p->name); gets(inbuf);

p->score=atof(inbuf); p->next=h->next; h->next=p; }

35

return h; }

void insertlist(NODE *h,char *s) { NODE *p,*old,*last; char inbuf[20];

p=(NODE *)malloc(sizeof(NODE)); printf(\输入新结点值:\\n\ gets(p->name); gets(inbuf);

p->score=atof(inbuf); last=h->next;

while(strcmp(last->name,s)!=0&&last->next!=NULL) { old=last;

last=last->next; }

if(last->next!=NULL) { old->next=p; p->next=last; } else

{ last->next=p; p->next=NULL; } }

void deletelist(NODE *h,char *s) { NODE *q=h,*p=h->next;

while(strcmp(p->name,s)!=0&&p->next!=NULL) { q=p;

p=p->next; }

if(p->next!=NULL) { q->next=p->next; free(p); } else

{ printf(\无此结点!\\n按任意键返回主菜单.\\n\ getch(); } }

void printlist(NODE *h) { NODE *current=h;

while(current->next!=NULL) { current=current->next;

printf(\ } }

8. 参考答案

#include #define N 10 struct simulate

36

{

char name[10]; char number[10]; char replace[10]; char nationality[10]; int score; int grade[7]; } sim[N]; void main() {

int i,j,f; int x=0; int max,min;

struct simulate temp1; for(i=0;i

printf(\scanf(\

printf(\scanf(\

printf(\scanf(\

printf(\scanf(\for(j=0;j<7;j++) {

printf(\scanf(\} }

for(i=0;i

max=sim[i].grade[0]; min=sim[i].grade[0]; x=0;

for(j=0;j<7;j++) {

if(maxsim[i].grade[j]) min=sim[i].grade[j]; }

for(f=0;f<7;f++) x=x+sim[i].grade[f]; x=x-max-min; sim[i].score=x; }

for(i=0;i

for(j=i+1;j

37

if(sim[i].score

temp1=sim[i]; sim[i]=sim[j]; sim[j]=temp1; } }

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

printf(\

sim[i].name,sim[i].number,sim[i].replace,sim[i].nationality,sim[i].score) ; }

9. 参考答案:

#include #include struct tagPersion {

char Name[20]; /*姓名*/ char Sex; /*性别*/ char Answer; /*答案*/

struct tagPersion * Next; /*下一对象的位置*/ };

typedef struct tagPersion * LinkList; typedef struct tagPersion * LNode; typedef struct tagPersion Persion; typedef Persion Node;

int getCommand() {

int cmdID;

printf(\

printf(\录入链表\\n\ printf(\显示链表\\n\ printf(\插入结点\\n\ printf(\删除结点\\n\ printf(\退出\\n\

printf(\输入选项并按回车确认:\ scanf(\ return cmdID; }

LinkList createList(int n) {

int i; LNode p; LNode L; LNode m; if(n <= 0)

return NULL;

L = (LNode)malloc(sizeof(Node)); L->Next = NULL; p = L;

38

/*头节点*/

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

m = (LNode)malloc(sizeof(Node)); /*创建新节点*/ m->Next = NULL; p->Next = m; p = m; }

return L; /*函数返回头节点地址*/ }

void inputNode(LNode p) {

scanf(\}

void inputList(LinkList L) {

LNode p;

p = L; /*获得第一个节点的地址*/ while(p) {

inputNode(p);

p = p->Next; /*获得下一个节点的地址*/ } }

void displayList(LinkList L) {

LNode p;

p = L; /*获得第一个节点的地址*/ while(p) {

printf(\ p = p->Next; /*获得下一个节点的地址*/ } }

LNode insertNode(LinkList L, int i) {

LNode p = L; LNode s; int j = 0;

while(p&&j

p = p->Next; ++j; }

if(!p||j>i-1) /*如果要插入的节点小于1或大于当前链表节点个数,返回错误信息*/ {

printf(\位置小于1或大于表长。\\n\ return L; }

s = (LNode)malloc(sizeof(Node)); /*创建新节点并插入此节点*/

39

s->Next = p->Next; p->Next = s; return s; }

void deleteNode(LinkList L, int i) {

LNode p = L; LNode s; int j=0;

while(p->Next&&j

p = p->Next; ++j; }

if(!(p->Next)||j>i-1)

/*如果要删除的节点小于1或大于当前链表节点个数,返回错误信息*/ {

printf(\删除位置不合理。\\n\ return; }

s = p->Next;

p->Next = s->Next;

free(s); /*释放被删除节点所占据的存储空间*/ }

void deleteList(LinkList L) {

LNode p = L; LNode s = p; while(p) {

s = p->Next; free(p); p = s; } }

void main() {

int cmdID; /*存放代表用户选择菜单项的值*/ int where; /*存放插入或删除节点的位置*/ int count; /*存放链表节点个数*/ LinkList L=NULL; LNode p; while(1) {

cmdID = getCommand(); if(cmdID == 1) {

printf(\请输入链表初始结点数:\ scanf(\ L = createList(count);

40

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

Top