C程序设计教程与实验课后习题答案-- 给呆呆

更新时间:2023-12-29 01:18: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 2 3 4 B

B

C

B

二、填空题 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 6 C

A C

7 8 B

A

9 10 C

C

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

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 2 3 4 5 6 7 A

D

D

B

A

D

C

二 填空题 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

8 9 D

B

10 A

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/aglx.html

Top