高教c语言程序设计(2011版)课后编程题答案(五篇材料)

时间:2019-05-12 17:53:34下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《高教c语言程序设计(2011版)课后编程题答案》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《高教c语言程序设计(2011版)课后编程题答案》。

第一篇:高教c语言程序设计(2011版)课后编程题答案

第三章顺序结构

3.30 编写程序,把560分钟换算成用小时和分钟表示,然后进行输出。※程序如下※

main(){

int hour,minute;hour=560/60;minute=560%60;

printf(“hour=%d,minute=%d”,hour,minute);}

3.31 编写程序,输入两个整数:1500和350,求出它们的商数和余数并进行输出。※程序如下※

#include main(){

int num1,num2,i,j;/* 定义变量 i-商,j-余数 */ printf(“input num1 and num2:n”);scanf(“%d%d”,&num1,&num2);i=n }

3.32 编写程序,读入三个双精度数,求它们的平均值并保留此平均值小数点后一位数,对小数点后第二位数进行四舍五入,最后输出结果。

※程序如下※

main(){

double a,b,c,average=0;

printf(“input a,b,c(double):n”);scanf(“%lf%lf%lf”,&a,&b,&c);average=(a+b+c)/3;average=average*10;average=average+0.5;average=(int)average;average=average/10;

printf(“average=%lf”,average);} 3.33 编写程序,读入三个整数给a,b,c,然后交换它们中的数,把a中原来的值给b,把b中原来的值给c,把c中的值给a。※程序如下※

main(){

int a,b,c,t=0;

printf(“input a b c:n”);

scanf(“%d%d%d”,&a,&b,&c);t=c;c=b;b=a;a=t;

printf(“a=%d b=%d c=%d”,a,b,c);} 第四章选择结构

4.21 当a>0时,请将以下语句改写成switch语句。if(a<30)m=1;else if(a<40)m=2;else if(a<50)m=3;else if(a<60)m=4;else m=5;

※程序如下※

main(){ int a;

printf(“Enter a:n”);scanf(“%d”,&a);switch(a/10){

case 0: case 1:

case 2: printf(“m=1”);break;case 3: printf(“m=2”);break;case 4: printf(“m=3”);break;case 5: printf(“m=4”);break;default: printf(“m=5”);} }

4.22 编写程序,输入一位学生的生日(年:y0、月:m0、日:d0);并输入当前的日

期(年:y1、月:m1、日:d1);输出该生的实足年龄。

※程序如下※ 这道题仅做参考!!系统不一样无法运行!

main(){

int y0,y1,m0,m1,d0,d1,age=0;printf(“Your Birthday(yyyy-mm-dd):n”);scanf(“%d-%d-%d”,&y0,&m0,&d0);printf(“Current Date(yyyy-mm-dd):n”);scanf(“%d-%d-%d”,&y1,&m1,&d1);if(d1

printf(“nAge=%d”,age);}

4.23 编写程序,输入一个整数,打印出它是奇数还是偶数。

※程序如下※

main(){ int i;

printf(“input a integer:n”);scanf(“%d”,&i);

if(i%2==0)/*条件判断*/ printf(“%d is a even”,i);else

printf(“%d is a odd”,i);}

—————————————————————————————————— 4.24 编写程序,输入a、b、c三个数,打印出最大者。

※程序如下※

main(){

int a,b,c,max = 0;

printf(“input(int)a b and c:n”);scanf(“%d%d%d”,&a,&b,&c);max = a;

if(max

—————————————————————————————————— 4.25 有一函数:

编写一程序,要求输入x的值,输出y的值。分别

(1)不嵌套的if语句(2)嵌套的if语句

(3)if_else语句(4)switch语句 ※程序如下※

源程序一:(1)不嵌套的if语句

main(){

float x;

printf(“input x:n”);scanf(“%f”,&x);if(x>-5&&x<0)printf(“y=%f”,x);if(x==0)

printf(“y=%f”,x-1);if(x>0&&x<10)printf(“y=%f”,x+1);if(x<=-5||x>=10)printf(“input error”);}

源程序二:(2)嵌套的if语句

main(){

float x;

printf(“input x:n”);scanf(“%f”,&x);if(x>-5&&x<10){

if(x==0)printf(“y=%f”,x-1);if(x<0)printf(“y=%f”,x);if(x>0)printf(“y=%f”,x+1);}

if(x<=-5||x>=10)printf(“input error”);}

源程序三:(3)if_else语句

main(){

float x;

printf(“input x:n”);scanf(“%f”,&x);if(x>-5&&x<10)if(x<0)

printf(“y=%f”,x-1);else if(x==0)printf(“y=%f”,x);else

printf(“y=%f”,x+1);else

printf(“input error”);}

源程序四:(4)switch语句 */ main(){

int flag;float x;

printf(“Enter x:n”);scanf(“%f”,&x);

if(x>-5 &&x<0)flag=-1;if(x==0)flag=0;

if(x>0 &&x<10)flag=1;switch(flag){

case-1: printf(“y=%f”,x);break;case 0: printf(“y=%f”,x-1);break;case 1: printf(“y=%f”,x+1);break;} }/* 第五章循环结构

三、编程题

5.17 编写程序,求1-3+5-7+...-99+101的值。※程序如下※ main(){

int i,sum=0,s=1;

for(i=1;i<=101;i+=2){

sum=sum+i*s;

s=-s;/*控制符号交替变换*/ }

printf(“sum=%d”,sum);}

5.18 编写程序,求e的值,e=1+1/1!+1/2!+1/3!+1/4!+...+1/n!(1)用for循环,计算前50项(2)用while循环,要求直至最后一项的值小于1e-4。※程序如下※ 源程序一:(1)用for循环实现 main(){

int i,n;

double sum=1,t=1;printf(“input n:n”);scanf(“%d”,&n);for(i=1;i<=n;i++){

t=t*i;/* 实现阶乘*/ sum=sum+1/t;}

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

源程序二:(2)用while循环实现 #include main(){ int i;

doubel sum=1,t=1;

while(fabs(1.0/t)>1e-4)/* fabs求浮点型数据的绝对值 */ { t=t*i;

sum=sum+1/t;i++;}

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

5.19 编写程序,输出从公元1000年至2000年所有闰年的年号 每输出3个年号换一行。

判断公元年是否闰年的条件是:

(1)公元年数如能被4整除,而不能被100整除,则是闰年。(2)公元年数能被400整除也是闰年。※程序如下※ main(){

int i,j=0;

for(i=1000;i<=2000;i++){

if((i%4==0)&&(i%100!=0)||(i%400==0))/* 判断是否是闰年的条件 */ {

printf(“&d ”,i);j++;

if(j%3==0)/* 控制换行 */ printf(“n”);} } }

5.20 编写程序,打印以下图形: * *** ***** ******* ***** *** * ※程序如下※ #include main(){

int i,j;

for(i=1;i<=7;i++)/*控制行数*/ {

for(j=1;j<=7;j++)/*控制星数*/ {

if((j<=fabs(4-i))||(j>7-fabs(4-i)))printf(“ ”);else

printf(“*”)}

printf(“n”);} } #include #include main(){ int i,j,k;

for(i=-3;i<=abs(i);i++)

{for(j=0;j<=abs(i);j++)printf(“ ”);

for(k=0;k<=7-abs(i);k++)printf(“*”);printf(“n”);} } 第六章字符型数据

6.21 请编写程序,输入一行字符(用回车结束),输出每个字符以及与之对应的ASCII代码值,每行输出三队.※程序如下※

#include main(){

int i=0;char ch;

while((ch=getchar())!='n'){

printf(“%4c%4d”,ch,ch);i++;

if(i%3==0)printf(“n”);} } 6.21 请编写程序,输入一行数字字符(用EOF结束),每个数字字符的前后都有空格。

请编程,把这一行中的数字转换成一个整数。例如,若输入: 2 4 8 3 代表Enter键)

则输出整数:2483

※程序如下※

#include main(){

char ch;

while((ch=getchar())!=EOF){

if(ch==' ')continue;else

printf(“%c”,ch);} }

6.22 请编写程序统计输入的行数,输入用EOF结束输入。※程序如下※

#include main(){

char ch;int i=0;

while((ch=getchar())!=EOF){

if(ch=='n')i++;}

printf(“%d”,i);}

6.23 请编写程序统计输入的一行中小写字母的个数。

※程序如下※

#include main(){

int i=0;char ch;

while((ch=getchar())!='n'){

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

printf(“%d”,i);}

6.24 请编写输出以下图案的程序,图案的行数由输入的值确定。A BBB CCCCC DDDDDDD EEEEEEEEE

※程序如下※

#include main(){

int i,j,k,n;

printf(“Enter n(integer):n”);scanf(“%d”,&n);for(i=1;i<=n;i++){

for(j=n;j>i;j--)printf(“ ”);

for(k=1;k<=2*i-1;k++)printf(“%c”,64+i);printf(“n”);} } 第七章函数

7.14 以下fun函数用以判断n是否是素数,fun函数中有逻辑错,请调试改正。fun(int n){

int k,yes;

for(k=2;k<=n/2;k++)if(n%k==0)return yes=0;return yes=1;}

※正确答案是:

fun(int n){

int k,yes=1;

for(k=2;k<=n/2;k++)if(n%k==0)return yes=0;return yes;}

main(){

int n,yes;

printf(“Enter n(int):n”);scanf(“%d”,&n);yes=fun(n);

if(yes==1)printf(“%d is a prime”,n);else printf(“%d is not a prime”,n);}

7.15 编写函数 int mymod(int a, int b)用以求a被b除之后的余数。

※程序如下※

#include int mymod(int a, int b){

int remainder;remainder=a%b;return remainder;}

main(){

int a,b;

printf(“Enter a b(int):n”);scanf(“%d%d”,&a,&b);

printf(“余数=%d”,mymod(a,b));}

7.16 编写程序求:1-1/2+1/3-1/4+1/5-1/6+1/7-...1/n

※程序如下※

main(){ int n;float a;

float sum(int n);scanf(“%d”,&n);a=sum(n);

printf(“%10.5f”,a);}

float sum(int n){

float s=0;int i,t=1;

for(i=1;i

s=s+1/i*t;t=-t;}

return s;}

7.17 编写函数,根据整型形参m的值,计算如下公式的值。t=1-1/(2 x 2)-1/(3 x 3)-...-1/(m x m)

例如:若m=5,则应输出0.536389。

※程序如下※

main(){

float t=1;float f2(int);int i,m;

scanf(“%d”,&m);for(i=2;i<=m;i++)t=t-f2(i);

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

float f2(int m){

float s;

s=1.0/(m*m);return s;}

7.18 编写函数用以求表达式x2-5x+4,x作为参数传给函数,调用此函数求: y1=22-5*2+4

y2=(x+15)2-5*(x+15)+4 y3=sin2x-5*sinx+4

※程序如下※

#include #include float fun(float x){

float y;

y=pow(x,2)-5*x+4;return y;}

main(){

float x,y1,y2,y3;clrscr();

printf(“Enter x:n”);scanf(“%f”,&x);

y1=fun(2);

y2=fun((x+15));y3=fun(sin(x));

printf(“y1=%fny2=%fny3=%fn”,y1,y2,y3);} 第八章地址和指针

8.17 请编写函数,其功能是对传送过来的两个浮点数求出和值与差值,并通过形参传

送回调用函数。

※程序如下※

#include sum_sub(float a,float b,float *sum, float *sub){

*sum=a+b;*sub=a-b;}

main(){

float a,b,sum,sub;/*定义变量sum求和,变量sub求差*/ printf(“Enter a b(float):n”);scanf(“%f%f”,&a,&b);

sum_sub(a,b,&sum,&sub);

printf(“sum=%f,sub=%f”,sum,sub);}

8.18 请编写函数,对传送过来的三个数选出最大和最小数,并通过形参传回调用函数。

※程序如下※

#include max_min(double a,double b,double c,double *max,double *min){

*max = a;/* 假定a的值为最大,把a值赋给指针变量*max */ if(*max

*min = a;/* 假定a的值为最小,把a值赋给指针变量*min */ if(*min>b)*min = b;if(*min>c)*min = c;}

main(){

double a,b,c,max,min;

printf(“Enter a b c(double):n”);scanf(“%lf%lf%lf”,&a,&b,&c);max_min(a,b,c,&max,&min);

printf(“max=%lf,min=%lf”,max,min);} 第九章函数

9.27 输入一行数字字符,请用数组元素作为计数器来统计每个数字字符的个数.用下标为 0元素统计字符“1”的个数,下标为1的元素统计字符“2”的个数,...※程序如下※

#include void count(int a[]){ int i;char ch;

while((ch=getchar())!='n')for(i=0;i<10;i++)if(i==ch-'0')if(i==0)a[9]++;else a[i-1]++;}

main(){

int i,a[10]={0};count(a);

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

printf(“a[%d]=%dn”,i,a);}

9.28 编写函数,对具有10个整数的数组进行如下操作:从第n个元素开始直到最后一个元

素,依次向前移动一个位置.输出移动后的结果.※程序如下※ fun(int a[],int n){ int i;

for(i=n;i<9;i++)a=a[i+1];}

main(){

int a[10]={0,1,2,3,4,5,6,7,8,9},n,i;scanf(“%d”,&n);fun(a,n);

for(i=0;i<9;i++)printf(“%d ”,a);}

9.29 编写函数把数组中所有奇数放在另一个数组中返回.※程序如下※

#include #include int fun(int a[],int b[]){

int i,j=0;for(i=0;i<10;i++)if(a%2==1)b[j++]=a;return(j);}

main(){

int i,j,a[10],b[10];clrscr();

printf(“n****Enter 10 integer number:****n”);for(i=0;i<10;i++)scanf(“%d”,&a);j=fun(a,b);

printf(“****Output the odd arrage***:n”);for(i=0;i

9.30 编写函数对字符数组中的输入字母,按由大到小的字母顺序进行排序。

※程序如下※

#include void alpha_sort(char a[],int n);void alpha_rout(char a[],int n);main(){

char a[20];int n;clrscr();

printf(“****The original alphabetic is****:n”);gets(a);n=strlen(a);alpha_sort(a,n);alpha_rout(a,n);}

void alpha_sort(char a[],int n){

int i,j,p,t;

for(j=0;j

for(i=j+1;i

t=a[j];a[j]=a[p];a[p]=t;} } }

void alpha_rout(char a[],int n){ int i;

printf(“n****The alphabetic of sorting is****:n”);for(i=0;i

9.31 输入若干有序数放在数组中。然后输入一个数,插入到此有序数列中,插入后,数组中的数仍然有序。请对以下三种情况运行你的程序,以便验证你的程序是否

正确。

(1)插在最前(2)插在最后(3)插在中间

※程序如下※

#include #define M 10

void sort(int a[M],int b[M+1],int n){ int i;

for(i=0;i

if(a[0]>a[M-1]){

if(n

else { if(n>a)b=a;else { b=n;break;} } }

if(i

for(;i

main(){

int i,n,a[M],b[M+1];clrscr();

printf(“Enter ten integer number(be sorted):n”);for(i=0;i

printf(“Enter a numbern”);scanf(“%d”,&n);sort(a,b,n);

printf(“Result of insertn”);for(i=0;i<=M;i++)printf(“%d ”,b);}

9.32 编写函数把任意十进制整数转换成二进制数.提示:把十进制数不断除2除,余数放

在一个一维数组中,直到商数为零.在主函数中进行输出,要求不得按逆序输出.※程序如下※

#include int dec_bin(int a[],int decimal)/*变量decimal表示十进制数*/ {

int i=0,remainder;while(decimal>0){

remainder=decimal%2;decimal=decimal/2;a[i++]=remainder;if(decimal<2){

a=decimal;break;} }

return(i);}

main(){

int i,j,decimal,a[64];

printf(“Enter decimal number:n”);scanf(“%d”,&decimal);j=dec_bin(a,decimal);for(i=j;i>=0;i--)printf(“%d”,a);}

9.33 编写函数调用随机函数产生0到19之间的随机数,在数组中存入15个互不重复的整

数。要求在主函数中输出结果。若已定义x为int类型,调用随机函数步骤如下:

#include “stdio.h”

.x=rand()%20 /*产生0到19的随机数*/

※程序如下※

#include void rand1(int a[]){

int i=0,j,x,flag;while(i<15){

flag=1;

x=rand()%20;for(j=0;j

if(flag==1)a=x;i++;} }

main(){

int i,a[15];clrscr();rand1(a);

for(i=0;i<15;i++)printf(“%d ”,a);}

9.34 求任意方阵每行、每列、两对角线上元素之和。

※程序如下※

#include #define M 3

void line_sum(int a[M][M],int a1[]){

int i,j,k;

for(i=0,k=0;i

a1[k]=0;

for(j=0;j

void column_sum(int a[M][M],int a2[]){

int i,j,k;

for(i=0,k=0;i

a2[k]=0;

for(j=0;j

void diagonal_sum(int a[M][M],int a3[]){

int i,j;

for(i=0;i

a3[0]+=a[j];if(i+j==M-1)a3[1]+=a[j];} }

main(){

int i,j,a[M][M],a1[M],a2[M],a3[2]={0};clrscr();i=M;

printf(“****Enter %d x %d phalanx****n”,i,i);for(i=0;i

printf(“line%d=%dn”,i,a1);for(i=0;i

printf(“column%d=%dn”,i,a2);for(i=0;i<2;i++)

printf(“diagonal%d=%dn”,i,a3);}

9.35 求两个矩阵的和

#include #define M 4

void add(int a[M][M],int b[M][M],int c[M][M]){

int i,j;

for(i=0;i

for(j=0;j

main(){

int i,j,k,a[M][M],b[M][M],c[M][M]={0};i=M;printf(“****Enter NO.1 Matrix(%d x %d)****n”,i,i);for(i=0;i

printf(“****Enter NO.2 Matrix(%d x %d)****n”,i,i);for(i=0;i

printf(“****Output result Matrix(%d x %d)****n”,i,i);for(i=0;i

for(j=0;j

9.36 编写函数打印出以下形式的乘法九九表。** A MULTIPLICATION TABLE **(1)(2)(3)(4)(5)(6)(7)(8)(9)

---------------------------(1)1 2 3 4 5 6 7 8 9

(2)2 4 6 8 10 12 14 16 18(3)3 6 9 12 15 18 21 24 27(4)4 8 12 16 20 24 28 32 36(5)5 10 15 20 25 30 35 40 45(6)6 12 18 24 30 36 42 48 54(7)7 14 21 28 35 42 49 56 63(8)8 16 24 32 50 48 56 64 72(9)9 18 27 36 45 54 63 72 81

---------------------------

※程序如下※

#include main(){

int i,j;clrscr();

printf(“** A MULTIPLICATION TABLE **n”);printf(“(1)(2)(3)(4)(5)(6)(7)(8)(9)n”);

printf(“---------------------------n”);for(i=1;i<=9;i++){

printf(“t(%d)”,i);for(j=1;j<=9;j++)printf(“%4d”,i*j);printf(“n”);}

printf(“---------------------------n”);}

9.37 调用随机函数为5 x 4的矩阵置100以内的整数,输出该矩阵,求出每行元素之和

并把和值最大的那一行与第一行上的元素对调。若已定义x为int类型,调用随机

函数步骤如下:

#include “stdio.h”

.x=rand()%100 /*产生0到100的随机数*/

※程序如下※ #include #include void rand1(int *p){

int i,j;

for(i=0;i<5;i++)for(j=0;j<4;j++,p++)*p=rand()%100;}

void exchange(int a[5][4]){

int i,j,max,temp,b[5]={0};for(i=0;i<5;i++)for(j=0;j<4;j++)b+=a[j];

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

if(b

temp=a[j];a[j]=a[max][j];a[max][j]=temp;} }

main(){ int i,j,a[5][4];clrscr();rand1(a);

printf(“****The origient Matrix****n”);for(i=0;i<5;i++){

for(j=0;j<4;j++)printf(“%5d”,a[j]);printf(“n”);}

exchange(a);

printf(“****The exchange Matrix****n”);for(i=0;i<5;i++){

for(j=0;j<4;j++)printf(“%5d”,a[j]);printf(“n”);} }

9.38 调用随机函数为5 x 5 的矩阵置100以内的整数,输出该矩阵,然后逆置该矩阵。

即将第一列的元素放在第一行上、第二列的元素放在第二行上、其它依次类推。

※程序如下※

#include #include void Rand1(int *p){

int i,j;

for(i=0;i<5;i++)for(j=0;j<5;j++,p++)*p=rand()%100;}

void Reverse_Matrix(int a[5][5]){

int i,j,temp;for(i=0;i<5;i++)for(j=0;j

temp=a[j];a[j]=a[j];a[j]=temp;} }

main(){

int i,j,a[5][5];clrscr();Rand1(a);

printf(“****The Result of rand()Function()****n”);for(i=0;i<5;i++){

for(j=0;j<5;j++)printf(“%5d”,a[j]);printf(“n”);}

Reverse_Matrix(a);

printf(“****The Result of Reverse Matrix Function()****n”);for(i=0;i<5;i++){

for(j=0;j<5;j++)printf(“%5d”,a[j]);printf(“n”);} } 第十章字符串

10.19 请编写函数mygets和myputs,其功能分别与gets和puts相同,函数中用getchar

和putchar读入和输出字符。

※程序如下※

#include void mygets(char *p){

char ch;

while((ch=getchar())!='n')*(p++)=ch;p[0]=0;}

void myputs(char *p){

char ch;

while(*p!='')putchar(*(p++));}

main(){

char *s;clrscr();mygets(s);myputs(s);}

10.20 请编写函数,判断一字符串是否是回文。若是回文函数返回值为1;否则返回值

为0。回文是顺读和倒读都一样的字符串。

※程序如下※ #include main(){

char a[200],*p;int i,j,flag=1;clrscr();

scanf(“%s”,a);p=a;

j=strlen(a);

for(i=0;i<=j/2;i++,j--)if(*(p+i)!=*(p+j-1)){

flag=0;break;}

if(flag)

printf(“Yes”);else

printf(“No”);}

10.21 请编写函数,删除字符串中指定位置上的字符。删除成功函数返回被删字符;否

则返回空值。

※程序如下※

#include #include del(char *p,int n){ int i;char ch;

if(n<=strlen(p))ch=*(p+n-1);else ch='0';

for(i=n-1;i

main(){ int n;char *s;clrscr();

printf(“****The string is ****n”);gets(s);

printf(“Enter n(0--%d)n”,strlen(s));scanf(“%d”,&n);

printf(“****The deleted char is****n”);printf(“%c”,del(s,n));getch();} 第十一章对函数的进一步讨论

11.11 编写程序outch,程序读入一行字符,根据命令行中的参数进行不同的输出。若

有以下命令行: outch-2

程序对读入的一行字符输出最后两个字符。若有以下命令行: outch +6

程序对所读入的一行字符输出开头6个字符。若命令行中没有参数,则隐含规定 输出最后10个字符。为简单起见,命令行中的参数中只包含一位数字。

※程序如下※ #include #include main(int argc,char *argv[]){ int i;

char s[64];

printf(“Enter a string:n”);gets(s);

while(argc>0){

if(argc==1){

for(i=strlen(s)-10;i

if(argv[1][0]=='-'){

for(i=strlen(s)-(argv[1][1]-'0');i

if(argv[1][0]=='+'){

for(i=0;i<(argv[1][1]-'0');i++)printf(“%c”,s);break;} } }

11.12 请写递归函数,把输入的一个整数转换成二进制数输出。

※程序如下※

#include dec_bin(int n,int a[]){

static int i=0;if(n==0||n==1){ a=n;return i;} else {

a[i++]=n%2;

return dec_bin(n/2,a);} }

main(){

int i,j,n,a[64];

printf(“Enter n(integer)n”);scanf(“%d”,&n);j=dec_bin(n,a);for(i=j;i>=0;i--)printf(“%d”,a);}

11.13 请用递归算法,求1+2+3+...n,n由键盘输入。

※程序如下※

fun(int n){

int sum;if(n==1)return 1;else {

sum=n+fun(n-1);return sum;} }

main(){

int n,sum;clrscr();

printf(“Enter n(1+2+3+...+n):n”);scanf(“%d”,&n);sum=fun(n);

printf(“sum=%d”,sum);}

11.14 请用递归函数,求裴波拉契级数,求n阶裴波拉契级数的公式如下。

※程序如下※ #include fac(int n){

long t;

if(n==0||n==1)return 1;else {

t=fac(n-1)+fac(n-2);return t;} }

main(){ int n;

printf(“Enter n :n”);scanf(“%d”,&n);printf(“%ld”,fac(n));} 第十三章编译预处理和动态存储分配

13.10 编写出一个宏定义MYALPHA(C),用以判断C是否是字母字符,若是得1,否则得0。

※程序如下※

#include #include #define MYALPHA(C)isalpha(C)?1:0 main(){

char ch;clrscr();

ch=getchar();if(MYALPHA(ch))

printf(“%c is a alpha”,ch);else

printf(“%c is not a alpha”,ch);}

13.11 请写出一个宏定义swap(t,x,y)用以交换t类型的两个参数。提示:用复合语句的形式。

※程序如下※

#include #define swap(t,x,y){t=x;x=y;y=t;}

main(){

int a,b,t;clrscr();

printf(“Enter a and b:n”);scanf(“%d%d”,&a,&b);swap(t,a,b);

printf(“a=%dnb=%d”,a,b);}

13.12 请编写程序,利用malloc函数开辟动态存储单元,存放输入的三个整数。然后按

从小到大的顺序输出这三个数。

※程序如下※

#include #include

void main(){

int *pData =(int*)malloc(sizeof(int)*3);int t;

printf(“Please input three integral numbern”);scanf(“%d%d%d”,pData,pData+1,pData+2);

for(int i=0;i<2;i++)for(int j=i+1;j<3;j++)

if(*(pData+i)> *(pData+j)){

t = *(pData+j);

*(pData+j)= *(pData+i);*(pData+i)= t;}

printf(“%dt%dt%dn”,*pData,*(pData+1),*(pData+2));} 第十四章结构体、共用体和用户定义类型 14.12 设有以下结构类型说明:struct stud {

char num[5],name[10];int s[4];double ave;};

请编写:

(1)函数readrec把30名学生的学号、姓名、四项成绩以及平均分放在一个结构

体数组中,学生的学号、姓名和四项成绩由键盘输入,然后计算平均分放

在结构体对应的域中。

(2)函数writerec输出30名学生的记录。

(3)main函数调用readrec函数和writerec函数,实现全部程序功能(注:不允

许使用全局变量,函数之间的数据全部使用参数传递)。

※程序如下※

#include #define STUDNUM 30 struct stud { char num[5],name[10];int s[4];double ave;};

void readrec(struct stud *pStud, int num){ int i;

printf(“tNumtNametS1tS2tS3tS4n”);

for(i=0;i

printf(“%d:t”,i);

scanf(“%s%s%d%d%d%d”,pStud->num,pStud->name,&(pStud->s[0]), &(pStud->s[1]),&(pStud->s[2]),&(pStud->s[3]));

pStud->ave=(pStud->s[0]+pStud->s[1]+pStud->s[2]+pStud->s[3])/4.0;

pStud++;} }

void writerec(struct stud *pStud, int num){ int i;

printf(“tNumtNametS1tS2tS3tS4n”);

for(i=0;i

printf(“%d:”,i);

printf(“t%st%st%dt%dt%dt%dt%lfn”,pStud->num,pStud->name, pStud->s[0],pStud->s[1],pStud->s[2],pStud->s[3],pStud->ave);

pStud++;} }

void main(){

struct stud student[STUDNUM];readrec(student,STUDNUM);writerec(student,STUDNUM);}

14.13 已知head指向一个带头节点的单向链表,链表中每个节点包含数据区域(data)

和指针域(next),数据域为整型。请分别编写函数,在链表中查找数据域值 最大的节点。

※程序如下※

#include #include

struct node {

int data;

struct node *next;};

struct node *SearchMax(struct node *head){

int max;

struct node *pMaxNode,*pNode;

pNode = head;pMaxNode = NULL;while(pNode!= NULL){

if(pNode->data > max || pMaxNode == NULL){

max = pNode->data;pMaxNode = pNode;}

pNode = pNode->next;}

return pMaxNode;}

void main(){

struct node *head,*tail,*pNode;int data;

printf(“Please input datanEnter 'Exit' to quit.n”);

head = tail = NULL;

while(scanf(“%d”,&data)> 0){

pNode =(struct node*)malloc(sizeof(struct node));pNode->data = data;pNode->next = NULL;

if(head == NULL)head = tail = pNode;else {

tail->next = pNode;tail = pNode;} }

if(head!= NULL)

printf(“Maxnimum data is %dn”, SearchMax(head)->data);

while(head!= NULL){

pNode = head;head = head->next;free(pNode);} }*/

第二篇:《C语言程序设计教程》课后题答案

《C语言程序设计教程》课后题答案

第一章

一选择题

1.A 2.B 3.C 4.D 5.B 6.C 二.填空题 1.程序 2.算法

3.main或主 4.编译 5.编译 6..obj 7.库函数

8.文本或ASCII码

三、编程题

1.参考代码如下: #include void main(){

printf(“金n木n水n火n土n”);} 2.参考代码如下: #include void main(){ int a,b;

scanf(“%d%d”,&a,&b);

printf(“%d+%d=%dn”,a,b,a+b);

printf(“%d-%d=%dn”,a,b,a-b);

printf(“%d*%d=%dn”,a,b,a*b);

printf(“%d/%d=%dn”,a,b,a/b);} 3.参考代码如下: #include void main(){

float a,b,h,s;

scanf(“%f%f%f”,&a,&b,&h);

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

printf(“s=%fn”,s);}

第二章

一选择题 答案及分析: 1.B,略

2.A,-8在内存中是以补码(设两个字节)形式存储的 3.A,C语言有32个关键字(参见课本第18页),且C语言标识符是区分大小写字母的 4.A,略

5.D,八进制数据中不能出现数码8 6.B,字符常量应该用单引号括起来,答案D超出了ASCII取值范围(ASCII的取值范围为[0,255])

7.C,该字符串中转义字符有三个:、22和 n,普通字符有三个:a、,和0,所以字符串长度为6 8.C,略

9.D,C语言没有read函数和%D格式符号,且scanf函数第二个形参为地址列表

10.B,根据题意,scanf函数输入数据时分隔符号不应该是逗号,应该是空格或回车符,且输入数据时分一行或几行均可

11.A,scanf函数中不允许出现%8.4,%6.2和%8这样的格式符号

12.C,既要保证5位小数位,还得保证整数位不变,这样数据12345.67800用10列不能完全显示出来,按C语言规定,12345.67800原样输出

13.B,printf函数中格式符号%d,%o,%x表示对应的整型数据分别按十进制,八进制和十六进制输出

14.C,按C语言规定,scanf函数形参双引号中,如果包含非格式符号,在输入数据时要求原样输入 二.填空题 答案及分析:

1.int

float

double(略)

2.65,89,printf函数中如果格式符号是%d,则输出相应字符的ASCII十进制数值

3.a=98,b=765.000000,c=4321.000000,scanf函数中的格式符号%2d%3f%4f,表示将键盘输入的数据9876543210按2,3,4位分割,然后再分别赋给变量a,b,c 4.scanf(“%lf%lf%lf”,&a,&b,&c);double类型的变量对应的格式符号是%lf

三、编程题

1.参考代码如下: #include void main(){

int a=97;

printf(“%cn”,a);

printf(“%dn”,a);

printf(“%on”,a);

printf(“%xn”,a);} 程序分析:通过printf函数中不同的格式符号,即%c(字符),%d(十进制),%o(八进制),%x(十六进制)输出相应的值。2.参考代码如下: #include void main(){

int h,m,minute;

scanf(“%d:%d”,&h,&m);

minute=h*60+m;

printf(“minute=%dn”,minute);} 程序分析:输入形式为10:27,故scanf函数双引号中两个格式符号%d之间必须加入“:”。3.参考代码如下: #include void main(){

float r=6371000,s,v;

s=4*3.1415926*r*r;

v=3.1415926*4/3*r*r*r;

printf(“s=%fnv=%f”,s,v);} 程序分析:C语言中的π不代表3.1415926,可以用各种常量的形式体现出来。4.参考代码如下: #include void main(){

int m100,m50,m20,m10,m5,m1,m;

scanf(“%d”,&m);

m100=m/100;

m50=(m-m100*100)/50;

m20=(m-m100*100-m50*50)/20;

m10=(m-m100*100-m50*50-m20*20)/10;

m5=(m-m100*100-m50*50-m20*20-m10*10)/5;

m1=m-m100*100-m50*50-m20*20-m10*10-m5*5;

printf(“%d元发工资,人名币各票面的张数为:n”,m);

printf(“100元的张数:%dn”,m100);

printf(“50元的张数:%dn”,m50);

printf(“20元的张数:%dn”,m20);

printf(“10元的张数:%dn”,m10);

printf(“5元的张数:%dn”,m5);

printf(“1元的张数:%dn”,m1);} 程序分析:人民币的面值分别为100元,50元,20元,10元,5元和1元,工资4367元除以100后得到的商就为100元张数,余数再除以50,得到的商为50元的张数,余数再除20,„„,以此类推就会得出人民币各面值相应的张数。5.参考代码如下: #include void main(){

float r1,r2,r3,r;

scanf(“%f%f%f”,&r1,&r2,&r3);

r=r1*r2*r3/(r1*r2+r2*r3+r1*r3);

printf(“三个电阻并联后的总电阻为%fn”,r);} 程序分析:首先将计算并联电阻值的公式变换一下;再就是考虑要保留小数位,故变量类型设置为实型,注意格式符号为%f。6.参考代码如下: #include void main(){

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

scanf(“%d”,&x);

a=x%10;

b=x/10%10;

c=x/100%10;

d=x/1000;

y=a*1000+b*100+c*10+d;

printf(“%d逆置各位数后的值为%dn”,x,y);} 程序分析:1234除以10的余数就是4,商再除以10的余数就是3,1234除以100再除以10取余就是2,1234除以1000就是1。也可以用其他的表达式求出各位数值,例如输入数据1234中的4,可以用公式a=x-d*1000-c*100-b*10来计算。7.参考代码如下: #include void main(){

float F,C;

printf(“请输入华氏温度:”);

scanf(“%f”,&F);

C=5.0/9*(F-32);

printf(“华氏温度%f对应的摄氏温度为%fn”,F,C);} 程序分析:5/9的值为0,所以要写成5.0/9,5/9.0或5.0/9.0,还要注意变量类型为实型,且对应的格式符号为%f。8.参考代码如下: #include void main(){

char ch1,ch2,ch3;

printf(“请输入三个数字字符:”);

scanf(“%c%c%c”,&ch1,&ch2,&ch3);

printf(“将数字字符转换为数字%d,%d,%dn”,ch1-'0',ch2-48,ch3-'0');} 程序分析:通过键盘输入三个数字字符时要连续输入,不要加任何分隔符号,例如121等,另外,数字字符输出时遇到格式符号%d将输出相应数字字符的ASCII值,但任何一个数字字符的ASCII值减去字符0的ASCII值,再对应%d格式符号输出时,就是数字字符对应的数字,例如'2'-'0'=2。

9.不能得到指定的输出结果,参考代码如下: void main(){

int a, b, c,x, y;

scanf(“%d%d%d”,&a,&b,&c);

x=a*b;

y=x*c;

printf(“a=%d,b=%d,c=%dn”,a,b,c);

printf(“x=%d,y=%dn”,x,y);}

程序分析:scanf(“%d,%d,%d”,a,b,c);scanf函数第二类形参是地址列表,所以语句改为scanf(“%d,%d,%d”,&a,&b,&c);而这个语句对应的键盘输入形式为2,3,4。为了满足题目要求,scanf语句改为scanf(“%d%d%d”,&a,&b,&c)。另外,printf函数双引号只能出现一对,且双引号中需要在相应的位置上添加a=等这样的字符串才能原样输出;还有整型变量对应格式符号是%d等。

第三章

一选择题

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

零 2.passwarm 3.525252 4.fabs(x)>5 5.x%y==0 6.if((1<=x&&x<=10||200<=x&&x<=210)&&x%2==1)printf(“%d”,x);7.k=1 8.Right!1

Right!1 9.$$$ a=0 10.a=2,b=1 11.0

“%f%f”

a=b;13.“%c”,&ch

'A'<=ch&&ch<='Z'

ch 14.死循环 15.345 16.7 3-1 17.x>=0

x

j%3!=0 24.b=i+1 25.8 5 2 26.d=1.0

k++ k<=n

三、编程题

1.参考代码如下: #include void main(void){ float x,y;printf(“Please input the value of x:”);scanf(“%f”,&x);if(x>-5&&x<0)

y=x;else if(x==0)

y=x-1;else if(x>0&&x<10)

y=x+1;printf(“y=%f”,y);} 2.参考代码如下: #include void main(void){

float a,b,c;

printf(“请输入三角形三边的长度:n”);

scanf(“%f%f%f”,&a,&b,&c);

if(a+b>c&&b+c>a&&a+c>b)

if(a==b&&a==c)

printf(“该三角形是等边三角形n”);

else if(a==b&&a!=c)

printf(“该三角形是等腰三角形n”);

else

printf(“该三角形是一般三角形n”);

else

printf(“不能构成三角形n”);} 3.参考代码如下: #include void main(void){

float M,N,menoy;

printf(“请输入购买金额:”);

scanf(“%f”,&M);

if(M<100)

N=0;

else if(M>=100&&M<200)

N=1.5;

else if(M>=200&&M<300)

N=2.5;

else if(M>=300&&M<400)

N=3.5;

else if(M>=400&&M<500)

N=4.5;

else if(M>=500&&M<600)

N=5.5;

else

N=6;

menoy=M*(1-N/100);

printf(“实际支付金额:%f,返还的金额:%fn”,menoy,M-menoy);} 4.参考代码如下: #include void main(void){

float M,N,menoy;

int in;

printf(“请输入购买金额:”);

scanf(“%f”,&M);

in=M/100;

switch(in)

{

case 0:N=0;break;

case 1:N=1.5;break;

case 2:N=2.5;break;

case 3:N=3.5;break;

case 4:N=4.5;break;

case 5:N=5.5;break;

default :N=6;break;

}

menoy=M*(1-N/100);

printf(“实际支付金额:%f,返还的金额:%fn”,menoy,M-menoy);} 5.参考代码如下: #include void main(void){

float x,max;

printf(“Enter a number:”);

scanf(“%f”,&x);

max=x;

while(x>0)

{

printf(“Enter a number:”);

scanf(“%f”,&x);

if(x>max)

max=x;

}

if(max>0)

printf(“The largest number entered was %fn”,max);} 6.参考代码如下: #include void main(void){

float M,N,menoy;

printf(“请输入购买金额:”);

scanf(“%f”,&M);

while(M>0)

{

if(M<100)

N=0;

else if(M>=100&&M<200)

N=1.5;

else if(M>=200&&M<300)

N=2.5;

else if(M>=300&&M<400)

N=3.5;

else if(M>=400&&M<500)

N=4.5;

else if(M>=500&&M<600)

N=5.5;

else

N=6;

menoy=M*(1-N/100);

printf(“实际支付金额:%f,返还的金额:%fn”,menoy,M-menoy);

printf(“请输入购买金额:”);

scanf(“%f”,&M);

} } 7.参考代码如下: #include void main(void){

float number,positivesum=0,negativesum=0,total=0;

int i;

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

{

scanf(“%f”,&number);

if(number>=0)positivesum+=number;

else negativesum+=number;

total+=number;

}

printf(“positive sum %f,negative sum %f,total %fn”,positivesum,negativesum,total);} 8.参考代码如下: #include void main(void){

int i,sum=0,k=1;

for(i=1;i<=101;i+=2)

{

sum=sum+k*i;

k=-k;

}

printf(“1-3+5-7+...-99+101=%dn”,sum);} 9.参考代码如下: #include void main(void){

float i,sum=0,k=1;

for(i=1;k>=1e-4;i++)

{

sum=sum+k;

k=k/i;

}

printf(“e=%fn”,sum);} 10.参考代码如下: #include void main(void){

float i,sum=0,n=2,d=1,temp;

for(i=1;i<=20;i++)

{

sum=sum+n/d;

temp=n;

n=n+d;

d=temp;

}

printf(“sum=%fn”,sum);} 11.参考代码如下: #include #include void main(void){

float apple,watermelon,pear;

for(apple=1;apple<100;apple++)

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

{

pear=100-apple-watermelon;

if(fabs(apple*0.4+watermelon*4+pear*0.2-40.0)<1e-6)

printf(“apple:%.0f,watermelon:%.0f,pear:%.0fn”,apple,watermelon,pear);

} }

12.参考代码如下: #include void main(void){

int i,j,k;

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

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

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

if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)

printf(“%dn”,i*100+j*10+k);} 或:

#include void main(void){

int a,b,c,i;

for(i=100;i<1000;i++)

{

a=i/100;

b=i/10%10;

c=i%10;

if(i==(a*a*a+b*b*b+c*c*c))

printf(“%dn”,i);

} } 13.参考代码如下: #include void main(void){

int a,b,c,d;

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

for(b=0;b<10;b++)

for(c=0;c<10;c++)

for(d=0;d<10;d++)

if(a*1000+b*100+c*10+d==(a*10+b+c*10+d)*(a*10+b+c*10+d))

printf(“%dn”,a*1000+b*100+c*10+d);} 或:

#include void main(void){

int a,b,c,d,i;

for(i=1000;i<10000;i++)

{

a=i/1000;

b=i/100%10;

c=i/10%10;

d=i%10;

if(i==(a*10+b+c*10+d)*(a*10+b+c*10+d))

printf(“%dn”,i);

} } 14.参考代码如下: #include void main(void){

int i,j;

for(i=1;i<=4;i++)//先控制打印前4行

{

for(j=1;j<=4-i;j++)

printf(“ ”);

for(j=1;j<=2*i-1;j++)

printf(“*”);

printf(“n”);

}

for(i=1;i<=3;i++)//再控制打印后3行

{

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

printf(“ ”);

for(j=1;j<=2*(4-i)-1;j++)

printf(“*”);

printf(“n”);

} }

第四章

一选择题

1.A,如果没有给s[1]赋值,按C语言规定,s[1]下标变量中的数据是一个随机数

2.C,“China”字符串末尾还有一个,故占6个字节

3.D,scanf函数中格式符号若是%c,则把输入的第一个字符'1'赋给变量c,然后遇到格式符号%d,则把后续的23(遇到空格结束)赋值给变量i,遇到格式符号%s,则把后续的字符串“456”(遇到空格结束)赋值给变量s

4.D,C语言规定,数组在定义时就已经分配好了所占内存空间,所以int x[5]在内容中占的字节数为4*5=20

5.B,内层循环变量j每次都从0开始,使得在外层循环变量i每取一个值时,n[0]和n[1]的值都得重新计算

6.B,这是求十进制数18对应二进制数的程序,将每次18除以2得到的余数依次放到数组a[0]到a[4]中,最后按a[4]到a[0]这样的顺序输出

7.B,第一个for循环给a[0]到a[9]赋值为0到9,第二个for循环给p[0]到p[2]赋值为0,2,6,第三个for循环使k=k+p[0]*2+p[1]*2+p[2]*2=5+4+12=21

8.D,C语言规定,定义二维数组时不能省略第二维下标值,但可以省略第一维下标值

9.B,略

10.A,每行的第4列元素的值都为0

11.C,略

12.D,C语言规定,字符数组不能用s=“abcd”这样的赋值语句赋值

13.C,float类型的变量对应格式符号通常为%f,不是%d

14.A,每行的第3列元素的值均为0

15.D,略

16.C,A这种赋值形式无法放置字符串末尾的,B和D不符合C语言规定,即字符数组不能用s=“good”这样赋值语句赋值

17.A,这是字符数组str初始化的形式,str[0]到str[5]分别为字符s,t,r,i,n,g,str[6]到str[11]的值均为,函数strlen是统计字符串包含字符的个数,遇到(不包括)结束,所以str长度为6

18.C,x数组比y数组多了一个字符

19.A,数组名就是数组第一个元素的地址,所以scanf(“%s”,&s);中得删除数组名前面的& 20.D,puts和putchar函数只有一个参数,printf函数中格式符号%s应该对应的是数组名

21.D,程序功能是输出第2和第3个字符串

22.A,双层循环完成的功能是求s的值,s=(((a[0][0]*10+a[0][2])*10+a[1][0])*10+a[1][2]=(((6*10+3)*10+8)*10+5=6385 二.填空题 1.a=1234 b=5 答案分析:C语言规定,使用scanf函数通过键盘输入数据时,除了格式符号和转义字符,其他符号要原样输入。

2.Hello 答案分析:b[5]=0等于b[5]= '',是因为字符的ASCII值就是0,而printf(“%sn”,b);的功能是输出字符串,但遇到空格或等字符时结束输出,所以答案为Hello。

3.j<3;b[j][i]=a[i][j];i<3 答案分析:通过两个数组下标变量位置的变换来完成程序功能。

4.a[age]++ i=18;i<=25 答案分析:用数组a来存储每个年龄段的人数,并通过a[age]++来实现。5.c[i]=n%base;b[d] 答案分析:十进制整数转换为n进制采用的是除以n取余法,使用变量base存放某个进制的值,c数组存放每次计算的余数。最后一个for循环输出不同进制所对应的数码符号。6.break;i>=8 答案分析:如果找到某个数,则通过break语句终止循环。7.-850,2,0 答案分析:程序功能是查找并输出二维数组中最小值及其下标值。8.a[i]>b[j] i<3 j<5 答案分析:数组a和b的长度可以相等或不等,通过i<3或j<5来看哪个数组的值还没有放进c数组中。

9.a[i][j]

j=0;j<4;j++ j==3 printf(“n”);

答案分析:用数组a最后一列,即第4列来保存每行的和,通过printf(“n”);语句来控制按3行来输出。10.fi

答案分析:略 11.GDABC 答案分析:略 12.s[i++] 答案分析:while(s[i])表示当s[i]中的字符不为时进入循环体,否则退出while循环。

13.ahAMa 答案分析:通过scanf(“%s”,a);给字符数组赋值时遇到空格或回车符号将终止输入。程序功能是将字符串中的字符a,大写变成小写,小写变成大写,其他字符保持不变。14.LBLMNP 答案分析:执行strcat(a,b);语句后,a数组的值为“ABLMNP”,b数组的值为“LMNP”;在执行while(a[j++]!=0)b[j]=a[j];时,b[j]中的j值是前面a[j++]中j++执行后的值,即while循环首先执行b[1]=a[1]= 'B',然后是b[2]=a[2]= ' L',b[3]=a[3]= 'M',„„,b[0]中的字符保持不变,仍是' L'。15.'' i++ 答案分析:因为while(str[i])是通过字符串末尾的来判断字符串是否读取结束,所以字符数组str最后要有一个字符串结束符号。16.b[j]=a[j][0];b[j]=a[j][k]

答案分析:用b数组存储每行中的最大字符,最终b[0]存放第一行字符中的最大字符,b[1] 存放第一行字符中的最大字符,„„。b[j]=a[j][0]的作用是在查找一串字符中最大字符前,先把这串字符第一个字符放到b[j]中,然后通过循环和条件判断来实现最大字符的查找。17.a[k++]=a[j] 答案分析:略

三、编程题

1.参考代码如下: #include void main(void){

int array[31],total=0;

int i,j=1;

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

{

array[i]=2*j;

j++;

total=total+array[i];

}

array[30]=total/30;

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

printf(“%d,”,array[i]);} 答案分析:由于平均值要放在数组array的末尾,所以在定义数组时要多定义一个元素,即array[31]。另,为了保持数组类型一致性,故平均值也只取整数值。2.参考代码如下: #include #include #include void main(){

int i,j,k,a[20],temp;

srand(time(NULL));

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

{

a[i] = rand()% 101;//产生[0,100]之间的随机数,取整后赋给a[i]

printf(“%d ”,a[i]);

}

printf(“n”);

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

{

k=i;

for(j=i+1;j<20;j++)

if(a[j]

if(k!=i)temp=a[i],a[i]=a[k],a[k]=temp;

}

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

printf(“%d ”,a[i]);} 程序分析:略

3.参考代码如下: #include #include #include void main(){

int i,maxi,a[30];

srand(time(NULL));

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

{

a[i] = rand()% 101;

//产生[0,100]之间的随机数,取整后赋给a[i]

printf(“%d ”,a[i]);

}

printf(“n”);

maxi=0;

for(i=1;i<30;i++)

if(a[maxi]

for(i=maxi+1;i<30;i++)//将最大数后边的数据依次前移一个位置

a[i-1]=a[i];

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

printf(“%d ”,a[i]);} 程序分析:略

4.参考代码如下: #include void main(){

int i,n=0,a[30],x;

scanf(“%d”,&x);//输入要转换的数据

do

{

a[n]=x%2;//取余数

n++;

x=x/2;

//整除

}while(x!=0);

for(i=n-1;i>=0;i--)//输出

printf(“%d”,a[i]);} 程序分析:利用十进制数除以2取余数的方法计算对应的二进制数。5.参考代码如下: #include #include void main(){

int right[17]= {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2},s=0,i,y;

char num[18],check[11]= {'1','0','X','9','8','7','6','5','4','3','2'};

printf(“请输入身份证号码的前17位:”);

gets(num);

//输入身份证号码

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

//对前17位数字的权求和

s=s+(num[i]-'0')*right[i];

y=s%11;

//计算模

printf(“last number is %cn”,check[y]);} 程序分析:身份证前17位是以字符串的形式输入的,利用表达式num[i]-'0'可以得到每个字符对应的数字;然后算出y值,再将对应的验证码输出即可,例如若y=10,则输出字符2。6.参考代码如下: #include void main(){

int a[20][20]= {0},i,j,n;

scanf(“%d”,&n);

//输入要打印的杨辉三角形的行数

for(i=0;i

//对第一列和对角线元素赋值

a[i][0]=a[i][i]=1;

for(i=2;i

//求对角线以下、第一列右边的元素值

for(j=1;j

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

for(i=0;i

//打印杨辉三角形

{

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

printf(“%8d”,a[i][j]);

printf(“n”);

} } 程序分析:杨辉三角形数据矩阵的第一列和对角线上数值均为1,通过for(i=0;i

7.参考代码如下: #include #include #include void main(){

int a[5][6],i,j,max,min;

srand(time(NULL));

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

{

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

{

a[i][j]=rand()%51;产生[0,50]之间的随机数,取整后赋给a[i][j]

printf(“%4d”,a[i][j]);

}

printf(“n”);

}

max=min=a[0][0];

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

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

{

if(max

max=a[i][j];

if(min>a[i][j])

min=a[i][j];

}

printf(“max=%d,min=%dn”,max,min);} 程序分析:先产生30个随机整数放到二维数组a中,然后假设第一个数即是最小数也是最大数,再通过双重循环和条件判断来找到这30个整数的最大值和最小值。8.参考代码如下: #include #include #include void main(){

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

srand(time(NULL));

printf(“请输入n(n*n)的值:”);

scanf(“%d”,&n);

for(i=0;i

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

{

a[i][j]=rand()%51;产生[0,50]之间的随机数,取整后赋给a[i][j]

a[j][i]=a[i][j];

}

for(i=0;i

{

for(j=0;j

printf(“%4d”,a[i][j]);

printf(“n”);

} } 程序分析:通过for(j=0;j<=i;j++)来控制只遍历数值方阵的下三角数据(包括主对角线上的数据),通过a[j][i]=a[i][j];语句完成与下三角对应位置的上三角数组元素的赋值,从而形成对称矩阵。

9.参考代码如下: #include void main(){

char str[80],c;

int i=0;

while((c=getchar())!='n')//接受从键盘输入的字符,直到遇到回车

{

str[i]=c;

//将接受到的字符存入字符数组中

i++;

}

str[i]='';

puts(str);

//检验以上程序的结果是否正确 } 程序分析:gets函数功能是从键盘输入字符串,遇到回车符号结束输入,所以通过while((c=getchar())!='n')来决定键盘输入的每一个字符是否放在数组str中。最后通过str[i]='';语句来添加字符串的结束标志''。10.参考代码如下: #include void main(){

char str[80],temp;

int i,j;

gets(str);

for(i=0;str[i];i++);

//测试字符串长度

i--;

//i为最后一个字符所在下标

for(j=0;j

//对换对称位置的字符

temp=str[i],str[i]=str[j],str[j]=temp;

puts(str);

//输出处理好的字符串 } 程序分析:略

11.参考代码如下: #include void main(){ char month[12][20]= {“****”,“January”,“February”,“March”,“April”,“May”,“June”,“July”, “August”,“September”,“October”,“November”,“December”};

int a,b,c,d,e,number;

printf(“请输入3位正整数,0或负数结束:”);

scanf(“%d”,&number);

while(number>0)

{

a=number/100;

b=number/10%10;

c=number%10;

d=a+b+c;

e=d%12;

if(e==0)printf(“%d=%d+%d+%d=%d,%d%%%d=%d,%sn”,number,a,b,c,d,d,12,e,month[e]);

else printf(“%d=%d+%d+%d=%d,%d%%%d=%d,%sn”,number,a,b,c,d,d,12,e,month[e]);

scanf(“%d”,&number);

} } 程序分析:按照题意先给month数组赋初值,再通过公式把一个3位整数的每位数值提取出来,计算这三个数的和d,然后d除以12取余数,最后输出余数作为下标的对应month数组的数组元素即可。12.参考代码如下: #include void main(){

char str[80];

int i;

gets(str);

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

;

printf(“字符串的长度为%dn”,i);程序分析:通过for(i=0;str[i]!='';i++);中变量i值的递增来遍历数组,最终i的值就是字符串的长度。

第五章

一.选择题

1-5 DDBCB

6-10 BACAA

11-15DBBCD 二.填空题 1.How does she 2.*(p+i*4+j)

printf(“n”)3.*(++p)4.num+1 q

*q>max

*q

n++

b[n]= ''

三、编程题

1.参考代码如下: #include #include #include void main(){

int i,a[20],b[20],*pa,*pb,temp;

srand(time(NULL));

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

{

a[i] = rand()% 101;

b[i] = rand()% 101;

}

printf(“数组a:”);

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

printf(“%d ”,a[i]);

printf(“n”);

printf(“数组b:”);

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

printf(“%d ”,b[i]);

printf(“n”);

pa=a;

pb=b;

for(i=0;i<20;i++)//对换数组a和数组b相同位置的元素

{

temp=*pa;

*pa=*pb;

*pb=temp;

pa++;

pb++;

}

printf(“对换后n”);

printf(“数组a:”);

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

printf(“%d ”,a[i]);

printf(“n”);

printf(“数组b:”);

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

printf(“%d ”,b[i]);} 2.参考代码如下: #include main(){

char str1[80],str2[80],*p1,*p2;

int j;

printf(“input two kinds of string:n”);

gets(str1);

gets(str2);

for(p1=str1,p2=str2;*p1&&*p2;p1++,p2++)/*比较每一对字符,直到出现'',退出循环 */

{

if(*p1!=*p2)break;

/* 若某一对字符不同,则已分出大小,退出循环*/

}

j= *p1-*p2;

/*j为结束比较时那对字符的ASCII码差值 */

if(j>0)

printf(“%dn”,1);

else if(j<0)

printf(“%dn”,-1);

else

printf(“%dn”,0);} 3.参考代码如下: #include int main(){

int a[4][4],temp;

int(*p)[4];

int i,j;

p=a;

//为行指针p赋初值

printf(“Enter array elements:n”);

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

//输入数组元素的值

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

scanf(“%d”,*(p+i)+j);

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

for(j=0;j

{

temp=*(*(p+i)+j);

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

*(*(p+j)+i)=temp;

}

//转置矩阵

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

//输出数组元素的值

{

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

printf(“%4d”,p[i][j]);

printf(“n”);

}

return 0;} 4.参考代码如下: #include int main(){

char str[80],*sp;

int count[26]= {0},i,a;

gets(str);

for(sp=str;*sp;sp++)//用指针访问字符串

{

a=*sp-97;

//将a字符的个数统计在数组count下标为0的单元,依次类推

count[a]++;

}

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

if(count[i]!=0)

printf(“%c=%d ”,i+97,count[i]);

return 0;} 5.参考代码如下: #include int main(){

char str[80],*spf,*spr;

int flag=1;

gets(str);

for(spr=str;*spr;spr++)

//让指针spr指到字符串的末尾

;

spr--;

//用指针spr指到字符串最后一个字符

for(spf=str;spf

if(*spf!=*spr)

flag=0;

if(flag)

printf(“YESn”);

else

printf(“NOn”);

return 0;} 6.参考代码如下: #include #include int main(){

char name[5][15];

char *p[5];//定义指针数组

char *temp;

int i,j,k;

printf(“Enter 5 strings:n”);

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

{

gets(name[i]);//读入5个字符串

p[i]=name[i];//指针数组元素指向字符串

}

for(i=0;i<4;i++)//用选择排序法排序

{

k=i;

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

if(strcmp(p[j],p[k])<0)k=j;

if(k!=i)

{

temp = p[i];

p[i]=p[k];

p[k]=temp;//改变指针的指向

}

}

printf(“nThe sorted result:n”);

printf(“------------------------n”);

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

puts(p[i]);//按指针指向顺序输出

return 0;}

第六章

一.选择题

1-5 CBCDA

6-10 AADBB

11-15BBDBD

16-20 AABAA 二.填空题 1.四

auto, register, static, extern 2.5 6 3.8,17 4.1 2 6 24 120 5.return 1 return n+sum(n-1)

三、编程题

1.参考代码如下: #include #include int prime(int m){

int i,k;

if(m==1)return 0;

else

{

k=sqrt(m);

for(i=2;i<=k;i++)

if(m%i==0)

break;

if(i<=k)return 0;

else return 1;

} } int main(){

int i;

for(i=101;i<200;i+=2)

if(prime(i))

printf(“%d ”,i);} 2.参考代码如下: #include #include float fun(float x){

float y;

if(x>-5&&x<0)

y=x;

else if(x==0)

y=x-1;

else if(x>0&&x<10)

y=x+1;

return y;} void main(){

float x;

printf(“请输入x的值:”);

scanf(“%f”,&x);

printf(“%fn”,fun(x));} 3.参考代码如下: void tran(int x){ int i,s[20]={0};for(i=0;x;i++){

s[i]=x%8;

x/=8;} i--;for(;i>=0;i--)

printf(“%d”,s[i]);printf(“n”);} void main(){

int dec;

printf(“请输入一个十进制数:”);

scanf(“%d”,&dec);

tran(dec);} 4.参考代码如下: #include void swap(int a[],int n){

int *pf,*pr,temp;

for(pf=a,pr=a+n-1;pf

{

temp=*pf;

*pf=*pr;

*pr=temp;

} } void main(){

int array[20],n,i;

printf(“请输入要处理的数据的个数:”);

scanf(“%d”,&n);

printf(“请输入%d个数:”,n);

for(i=0;i

scanf(“%d”,&array[i]);

swap(array,n);

printf(“对换后的数据为:”);

for(i=0;i

printf(“%d ”,array[i]);} 5.参考代码如下: #include void swap2w(int a[][5]){

int i,j,temp;

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

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

{

temp=a[i][j];

a[i][j]=a[5-i-1][j];

a[5-i-1][j]=temp;

} } void main(){

int a[5][5],n,i,j;

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

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

scanf(“%d”,&a[i][j]);

swap2w(a);

printf(“对换后的数据为:n”);

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

{

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

printf(“%d ”,a[i][j]);

printf(“n”);

} } 6.参考代码如下: #include int huiwen(char str[]){

char *spf,*spr;

int flag=1;

for(spr=str;*spr;spr++)

//让指针spr指到字符串的末尾

;

spr--;

//用指针spr指到字符串最后一个字符

for(spf=str;spf

if(*spf!=*spr)

flag=0;

return flag;}

int main(){

char str[80];

gets(str);

if(huiwen(str))

printf(“YESn”);

else

printf(“NOn”);

return 0;} 7.参考代码如下: #include int delch(char str[],char ch){

int i,j;

for(i=0;str[i];i++)

if(ch==str[i])

for(j=i+1;str[j];j++)

//删除字符

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

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

//移动字符串末尾的'' }

int main(){

char str[80],c;

gets(str);

scanf(“%c”,&c);

delch(str,c);

puts(str);

return 0;} 8.参考代码如下: #include int he(int n){

if(n==1)

return 1;

else

return n+he(n-2);} int main(){

int i,s=0;

for(i=1;i<=19;i+=2)

s=s+he(i);

printf(“%dn”,s);

return 0;} 9.参考代码如下: #include int feb(int n){int f;

if(n==1||n==0)

return 1;

else

{

f=feb(n-1)+feb(n-2);

return f;

} } int main(){

int n;

scanf(“%d”,&n);

printf(“%d”,feb(n));

return 0;}

第七章

一.选择题

1-5BDDCC

6-10 BBDCB

11-15BBDCB

16-18 DBB 二.填空题 1.30

2.ARRAY a,b,c;3.2 3 4.a c 5.p->name &p->post_code

struct communication *

p->post_code

三、编程题

1.参考代码如下: #include #define N 4 /*结构体类型定义*/ struct student {

char no[10];

char name[10];

float score[3];

float total;};//主函数 int main(){

struct student stu[N];//定义结构体数组,存储4个学生信息

struct student temp;

//定义结构体变量,用于交换数据的临时存储空间

int i,j,k;/*从键盘输入学生信息*/

puts(“Enter students' info:”);

for(i=0;i

{

printf(“student #%d:n”,i+1);

gets(stu[i].no);

//输入学号

gets(stu[i].name);

//输入姓名

scanf(“%f%f%f”,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);

//输入3门课的成绩

getchar();

//接收输入缓冲区的字符

stu[i].total=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];//计算总成绩

}

/*用选择排序法,对学生成绩进行排序*/

for(i=0;i

{

k=i;

for(j=i+1;j

{

if(stu[j].total>stu[k].total)k=j;

else if(stu[j].total==stu[k].total)//若总成绩相等,按英语成绩排序

{

if(stu[j].score[2]>stu[k].score[2])

k=j;

}

}

/*交换学生信息*/

if(k!=i)

{

temp=stu[i];

//结构体变量赋值

stu[i]=stu[k];

stu[k]=temp;

}

} //输出排好序的学生信息

printf(“nThe sorted list:n”);printf(“%-12s%-22s%-10s%-10s%-10s%-10sn”,“no”,“name”,“course1”,“course2”,“course3”,“Total”);

for(i=0;i

{

printf(“%-12s%-22s”,stu[i].no,stu[i].name);

printf(“%-10.1f %-10.1f%-10.1f”,stu[i].score[0],stu[i].score[1],stu[i].score[2]);

printf(“%-10.1fn”,stu[i].total);

}

return 0;} 2.参考代码如下: #include #define N 45 /*结构体类型定义*/ struct student {

char no[10];

char name[20];

int age;

float score;};//主函数 int main(){

struct student stu[N];//定义结构体数组,存储45个学生信息

int maxi=0;

//存储成绩最高的学生信息的下标

int i;

/*从键盘输入学生信息*/

puts(“Enter students' info:”);

for(i=0;i

{

printf(“student #%d:n”,i+1);

gets(stu[i].no);

//输入学号

gets(stu[i].name);

//输入姓名

scanf(“%d%f”,&stu[i].age,&stu[i].score);

//输入年龄和一门课的成绩

getchar();

//接收输入缓冲区的字符

if(stu[maxi].score

maxi=i;

} //输出成绩最高的学生信息

printf(“nThe highest score is:n”);

printf(“%-12s%-22s%-10s%-10sn”,“no”,“name”,“age”,“course”);

printf(“%-12s%-22s”,stu[maxi].no,stu[maxi].name);

printf(“%-10d %-10.1f%”,stu[maxi].age,stu[maxi].score);

return 0;} 3.参考代码如下: #include /*共用体类型定义*/ union cch {

unsigned int a;

char b[4];};//主函数 int main(){

union cch x;//定义共用体类型变量

scanf(“%u”,&x.a);

printf(“%cn”,x.b[0]);//低字节

printf(“%cn”,x.b[1]);

printf(“%cn”,x.b[2]);

printf(“%cn”,x.b[3]);

return 0;} //测试数据:1431989597 4.参考代码如下: #include #define N 3 struct person {

char name[15];//姓名

char job[30];//职业

char addr[30];

union

{

float score;//班级编号

char title[10];//职称

} cate;};struct person per[N];//定义结构体数组,存储人员信息 /*人员数据录入函数input()*/ void input(){

int i;

for(i=0;i

{

printf(“Enter name: ”);

gets(per[i].name);

// getchar();

printf(“Enter job,if teacher,first character should be 't',if student,should be 's': ”);

gets(per[i].job);

// getchar();

if(per[i].job[0]=='s')

{

printf(“Enter student's score: ”);

scanf(“%f%*c”,&per[i].cate.score);

}

else if(per[i].job[0]=='t')

{

printf(“Enter teacher's title: ”);

gets(per[i].cate.title);

}

printf(“Enter address: ”);

gets(per[i].addr);

} } /*人员数据打印函数print()*/ void print(){

int i;

printf(“name

job

addr

score/titlen”);

printf(“------------------n”);

for(i=0;i

{

printf(“%-10s”,per[i].name);

printf(“%-15s”,per[i].job);

printf(“%-15s”,per[i].addr);

if(per[i].job[0]=='s')

printf(“%fn”,per[i].cate.score);

else if(per[i].job[0]=='t')

printf(“%sn”,per[i].cate.title);

} } void sort(){

int i,j,k;

struct person temp;

for(i=0;i

{

k=i;

for(j=i+1;j

if(strcmp(per[k].name,per[j].name)>0)

k=j;

if(k!=i)

{

temp=per[i];

per[i]=per[k];

per[k]=temp;

}

} } //主函数 int main(){

input();

sort();

print();}

第八章

一.单选题

1-5 BABAD

6-10 DDDCD

D 二.填空题 1.二进制 文本

2.pf=fopen(“D:zk04data xfile.dat”,“w”)3.二进制 文本

文件结束符 非0值

三、编程题

1.参考代码如下: #include FILE *fopenfun(char *file,char *model){

FILE *fp;

if((fp = fopen(file, model))== NULL)

{

printf(“Cannot open file of %s.n”,file);

exit(0);

}

else return fp;} main(){

FILE *fp;

char c;

int digcou=0,capcou=0,smacou=0,othercou=0;

/* 定义整型变量为计数器并初始化为0 */

fp = fopenfun(“file.txt”,“r”);/* 打开文件 */

while((c = fgetc(fp))!=EOF)/* 从文件中读字符 */

{

if(c>='0' && c<='9')

digcou++;

/* 统计数字字符 */

else if(c>='A' && c<='Z')

capcou++;

/* 统计大写字母 */

else if(c>='a' && c<='z')

smacou++;

/* 统计小写字母 */

else

othercou++;

/* 统计其它字符 */

}

printf(“数字字符有%d个n”,digcou);

/* 输出字符个数 */

printf(“大写字母有%d个n”,capcou);

printf(“小写字母有%d个n”,smacou);

printf(“其它字符有%d个n”,othercou);

fclose(fp);/* 关闭文件 */ } 2.参考代码如下: #include FILE *fopenfun(char *file,char *model){

FILE *fp;

if((fp = fopen(file, model))== NULL)

{

printf(“Cannot open file of %s.n”,file);

//打开文件出错显示提示信息

exit(0);

//调用exit函数终止程序运行

}

else return fp;} #define SIZE 10 struct student /* 定义结构体*/ {

long num;

char name[10];

int age;

char address[10];} stu[SIZE], out;/* 存盘函数:将学生的信息以数据块形式写入文件 */ void fsave(){

FILE *fp;

int i;

fp=fopenfun(“student.dat”,“wb”);

for(i=0;i

if(fwrite(&stu[i], sizeof(struct student), 1, fp)!= 1)

printf(“File write error.n”);

/* 写过程中的出错处理 */

fclose(fp);

/* 关闭文件 */ } //主函数 main(){

FILE *fp;

int i;

for(i=0;i

/* 从键盘读入学生的信息*/

{

printf(“Input student %d:”, i+1);

scanf(“%ld%s%d%s”,&stu[i].num, stu[i].name, &stu[i].age, stu[i].address);

}

fsave();

/* 调用函数保存学生信息 */

fp = fopenfun(“student.dat”, “rb”);

printf(“ No.Name

Age

Addressn”);

while(fread(&out, sizeof(out), 1, fp))

/*读入数据块*/

printf(“%8ld %-10s %4d %-10sn”, out.num, out.name, out.age, out.address);

fclose(fp);/* 关闭文件 */ } 3.参考代码如下: #include FILE *fopenfun(char *file,char *model){

FILE *fp;

if((fp = fopen(file, model))== NULL)

{

printf(“Cannot open file of %s.n”,file);

//打开文件出错显示提示信息

exit(0);

//调用exit函数终止程序运行

}

else return fp;} #define SIZE 5 struct student /* 定义结构体*/ {

long num;

char name[10];

float score[5];

float aver;} stu[SIZE], out;/* 存盘函数:将学生的信息以数据块形式写入文件 */ void fsave(){

FILE *fp;

int i;

fp=fopenfun(“student.dat”,“wb”);

for(i=0;i

if(fwrite(&stu[i], sizeof(struct student), 1, fp)!= 1)

printf(“File write error.n”);

/* 写过程中的出错处理 */

if(fwrite(&out, sizeof(struct student), 1, fp)!= 1)/*写入5门课的平均成绩 */

printf(“File write error.n”);

fclose(fp);

/* 关闭文件 */ } //主函数 main(){

FILE *fp;

float average[5]={0},t;

int i,j;

for(i=0;i

/* 从键盘读入学生的信息*/

{

printf(“Input student %d:”, i+1);

scanf(“%ld%s”,&stu[i].num, stu[i].name);

for(j=0,t=0;j<5;j++)

{scanf(“%f%*c”,&stu[i].score[j]);

t=t+stu[i].score[j];

average[j]+=stu[i].score[j];

}

stu[i].aver=t/5;

}

out.num=0;strcpy(out.name,“5course'ave”);

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

out.score[j]=average[j]/SIZE;

fsave();

/* 调用函数保存学生信息 */

fp = fopenfun(“student.dat”, “rb”);

printf(“ No.Name

course1 course2 course3 course4 course5n”);

while(fread(&out, sizeof(out), 1, fp))

/*读入数据块*/

{printf(“%8ld %-12s”, out.num, out.name);

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

printf(“%8.2f”, out.score[j]);

printf(“n”);

}

fclose(fp);/* 关闭文件 */ } 4.参考代码如下 #include FILE *fopenfun(char *file,char *model){

FILE *fp;

if((fp = fopen(file, model))== NULL)

{

printf(“Cannot open file of %s.n”,file);

//打开文件出错显示提示信息

exit(0);

//调用exit函数终止程序运行

}

else return fp;} #define SIZE 5 struct warehouse /* 定义结构体*/ {

char KNO[10];

int KNOM };//主函数 main(){

FILE *fpr,*fpw;

struct warehouse t;

fpr=fopenfun(“CK.txt”,“r”);

fpw=fopenfun(“XK.txt”,“w”);

while(!feof(fpr))

{

fscanf(fpr,“%s%d”,t.KNO,&t.KNOM);

if(t.KNOM>100)

fprintf(fpw,“%s %dn”,t.KNO,t.KNOM);

}

fclose(fpr);/* 关闭文件 */

fclose(fpw);/* 关闭文件 */ }

第九章

1.(1)30(2)3(3)9(4)29 2.(1)1(2)1(3)1(4)7(5)15(6)6 3.参考代码如下 #include void main(){

char a,b;

a='C';

b=a&0125;

//0125的二进制为01010101

printf(“%dn”,b);} 4.参考代码如下 #include void main(){int i,bit;

/* 定义循环变量i和位1/0标志变量bit */ unsigned int n,mask;

/* 定义欲转换的整数n和屏蔽字变量mask */ mask=0x80000000;

/* 初始屏蔽字,从左边最高位开始检查 */ printf(“Enter a integer of Hexadecimal :”);scanf(“%x”,&n);

/* 输入要转换的整数 */ printf(“binary of %x is:”,n);for(i=0;i<32;i++)

/* 循环检查32位,并输出结果 */ { if(i%8==0&&i!=0)printf(“,”);/*习惯上二进制每8位用“,”分隔以便查看*/

bit=(n&mask)?1:0;

/* n&mask非0,该位为1;否则该位为:0 */

printf(“%1d”,bit);

/* 输出1或0 */

mask=mask>>1;

/* 右移1位得到下一个屏蔽字 */

}

printf(“n”);} 5.参考代码如下 #include void main(){

unsigned int value,res;

int n1,n2;

printf(“请输入一个整数:n”);

scanf(“%u”,&value);

printf(“输入n1、n2:n”);

scanf(“%d”,&n1);

scanf(“%d”,&n2);

if(n1>=n2||n2>32)

printf(“输入有误!n”);

res =((value <<(n1-1))>>(31-n2+n1))<<(32-n2);

//先向左移n1-1位,再将结果向右移n1-1+32-n2,再将结果左移32-n2位。

printf(“%un”,res);}

第十章

编程题

1.参考代码如下: #include #define rem(a,b)(a)%(b)void main(){

int x,y,z;

scanf(“%d%d”,&x,&y);

z=rem(x,y);

printf(“%dn”,z);} 2.参考代码如下: #include #define cube(x)(x)*(x)*(x)#define judge(x,y)(x)*(y)<50?1:0 void main(){

int x,y,z;

scanf(“%d%d”,&x,&y);

z=cube(x);

printf(“%d,%dn”,z,judge(x,y));} 3.参考代码如下: #include #define calc(year)(year)%4==0&&(year)%100!=0||(year)%400==0 #define judge(year)calc(year)?1:0 void main(){

int year;

scanf(“%d”,&year);

if(judge(year))

printf(“%d is leap year!n”,year);

else

printf(“%d is not a leap year!n”,year);} 4.参考代码如下: #include #define judge(a,b,c)a+b>c&&b+c>a&&a+c>b #define s(a,b,c)(a+b+c)/2 #define area(a,b,c)sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c))void main(){

float a,b,c;

scanf(“%f%f%f”,&a,&b,&c);

if(judge(a,b,c))

printf(“The triangle area is %f!n”,area(a,b,c));

else

printf(“It's not a triangle!n”);}

第十一章

一.单选题

1-5 CBBDD

D 二.填空题

1.struct link *next;2.①struct student * ②tail->next ③head 3.Answer:3 4.①break ②(struct data *)malloc(struct data)③while(1)④p!=NULL ⑤p=p->link 5.①x ②p ③s

三、编程题

1.参考代码如下:

#include

#include

#include

#define N 3

typedef struct

{

char no[11];

char name[15];

float score[N];

float sum;} studdatatype;typedef struct z1

{

studdatatype studdata;

struct z1 *next;} STUDENT;/*以下是函数原型*/ STUDENT *create();

void print(STUDENT *head);

main(){

STUDENT *head;

head=create();

print(head);

/*I/O函数*/

/*动态内存分配函数及其他函数说明*/

/*字符串函数*/

/*定义常数*/

/*学生数据类型*/

/*定义结点数据类型*/

/*创建链表*/

/* 显示所有记录*/

/*定义链表头指针*/

} /*创建链表*/ STUDENT *create(){

STUDENT *head,*p,*listp;

char no[11];

head=(STUDENT *)malloc(sizeof(STUDENT));//建立头结点

head->next=NULL;

listp=head;//当前指针指到头结点

printf(“输入一个学生信息(学号(* 结束)、姓名,三门课成绩:”);

scanf(“%s”,&no);

while(no[0]!='*')

{

p=(STUDENT *)malloc(sizeof(STUDENT));//建立新结点

strcpy(p->studdata.no,no);

//将输入的数据存储到新结点的数据域

scanf(“%s”,p->studdata.name);scanf(“%f%f%f”,&p->studdata.score[0],&p->studdata.score[1],&p->studdata.score[2]);

p->studdata.sum=p->studdata.score[0]+p->studdata.score[1]+p->studdata.score[2];

p->next=NULL;

//将新结点的指针域置为空

listp->next=p;

//将新结点连接到当前指针的后面

listp=p;

//将新结点作为当前结点

printf(“输入一个学生信息(学号(* 结束)、姓名,三门课成绩:”);

scanf(“%s”,&no);

//输入下一个学生的成绩

}

return head;} /*输出链表中结点信息*/ void print(STUDENT *head){

int i=0;

/* 统计记录条数*/

STUDENT *p;

/*移动指针*/

system(“cls”);

/*清屏*/

p=head->next;

/*初值为第一个结点的指针*/

printf(“nnn*******************************STUDENT********************n”);

printf(“| rec| no

|

name

| sc1| sc2| sc3|

sum |n”);

printf(“|----|----------|---------------|----|----|----|--------|n”);

while(p!=NULL)

{

i++;

printf(“|%4d|%-10s|%-15s|%4.0f|%4.0f|%4.0f|%8.2f|n”,i,p->studdata.no, p->studdata.name,p->studdata.score[0],p->studdata.score[1],p->studdata.score[2],p->studdata.sum);

p=p->next;

}

printf(“********************************end***********************n”);}

2.参考代码如下:

/*查找成绩最高的学生信息*/ void searchmaxscore(STUDENT *h){

STUDENT *p,*pmax;

p=pmax=h->next;

while(p!=NULL)/*当指针不为空时,循环继续*/

{

if(pmax->studdata.sum

studdata.sum)

pmax=p;

p=p->next;

/*移动指针,指向下一结点*/

}

printf(“nnnThe highest total score of the students' information :n”);

printf(“*******************************STUDENT********************n”);

printf(“| no

|

name

| sc1| sc2| sc3|

sum |n”);

printf(“|----------|---------------|----|----|----|--------|n”);

printf(“|%-10s|%-15s|%4.0f|%4.0f|%4.0f|%8.2f|n”, pmax->studdata.no, pmax->studdata.name,pmax->studdata.score[0],pmax->studdata.score[1],pmax->studdata.score[2],pmax->studdata.sum);

printf(“********************************end***********************n”);}

3.参考代码如下:

/*用插入法按由大到小排序函数*/ STUDENT *sort(STUDENT *h){

STUDENT *p,*q,*t,*h1;

/*定义临时指针*/

h1=h->next->next;

/*从原表的第二个学生结点开始处理*/

h->next->next=NULL;

/*将原表的第一个学生结点作为有序表的第一个结点*/

while(h1!=NULL)

/*当还有元素没有插入到有序表时,进行排序*/

{

t=h1;

/*取未排序的第一个结点*/

h1=h1->next;

/*h1指针后移*/

p=h->next;

/*设定移动指针p,从第一个结点开始*/

q=h->next;

/*设定移动指针q做为p的前驱,指向第一个结点*/

while(p!=NULL && t->studdata.sum < p->studdata.sum)/*作总分比较*/

{

q=p;

/*待排序点值小,则有序表指针后移*/

p=p->next;

}

if(p==q)

/*p==q,说明待排序点值大,应排在首位*/

{

t->next=p;

/*待排序点的后继为p*/

h->next=t;

/*新头结点为待排序点*/

}

else

/*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/

{

t->next=p;

/*t的后继是p*/

q->next=t;

/*q的后继是t*/

}

}

printf(“sort sucess!!n”);

return h;

}

/*排序成功*/ /*返回头指针*/

第三篇:c语言编程题答案

六、编程题参考答案

1.编程,统计在所输入的50个实数中有多少个正数、多少个负数、多少个零。#include “stdio.h” #define N 50 void main(){ float x;unsigned int s1,s2,s3,i;s1=s2=s3=0;for(i=1;i<=N;i++){ scanf(“%f”,&x);if(x<0)s1++;else if(x==0)s2++;else s3++;} printf(“负数%u个,零%u个,正数%u个n”,s1,s2,s3);}

2.编程,计算并输出方程 X2+Y2=1989 的所有整数解。#include “stdio.h” void main(){ int x,y;for(x=-45;x<=45;x++){ y=-45;while(y<=45){ if(x*x+y*y==1989)printf(“%d*%d+%d*%d=%dn”,x,x,y,y,1989);y++;} } }

3.编程,输入一个10进制正整数,然后输出它所对应的八进制、十六进制数。#include “stdio.h” void main(){ unsigned int x;printf(“请输入一个十进制正整数:”);scanf(“%u”,&x);printf(“%d=八进制数 %o=十六进制数%xn”,x,x,x);}

4.编程,找出1000以内的所有完数,并输出其因子。#include “stdio.h” void main(){ int i,j,s=1;for(i=1;i<=1000;i++,s=1){ for(j=2;j<=i/2;j++)if(i%j==0)s+=j;// 求 i的因子和

if(s==i){ printf(“%d=1”,i);// 如果i 是完数则输出其各因子

for(j=2;j<=i/2;j++)if(i%j==0)printf(“+%d”,j);printf(“n”);} } }

5.输入一个正整数,输出它的所有质数因子。#include “stdio.h” void main(){ int m,i=2;printf(“请输入一个整数:”);scanf(“%d”,&m);while(m!=1)if(m%i==0){ printf(“%d ”,i);m/=i;} else i++;printf(“n”);}

6.输入20个整数,输出其中能被数组中其它元素整除的那些数组元素。#include “stdio.h” #define N 20 void main(){ int a[N],i,j;for(i=0;i

7.输入两个数组(数组元素个数自定),输出在两个数组中都出现的元素。#include “stdio.h” #define NA 6 #define NB 8 void main(){ float a[NA],b[NB];int i,j;for(i=0;i

8.输入两个数组(数组元素个数自定),输出在两个数组中都不出现的元素。#include “stdio.h” #define NA 6 #define NB 8 void main(){ float a[NA],b[NB];int i,j;for(i=0;i

9.编程,将字符数组S2中的全部字符拷贝到字符数组S1中。#include “stdio.h” void main(){ char s1[20],s2[]=“Good morning!”;int i=0;while((s1[i++]=s2[i])!='');printf(“%sn”,s1);}

10.给定年份year,判别该年份是否闰年(定义一个宏以判别该年份是否闰年)。#include #define f(year)year%4==0&&year%100!=0||year%400==0 void main(){ int y;printf(“请输入年份:”);scanf(“%d”,&y);if(f(y))printf(“%d 年为闰年n”,y);else printf(“%d 年不是闰年n”,y);}

11.输入一行小写字母后,或输出原文,或将字母变成其下一字母(a变成b、b变成c、„、x变成y、y变成z、z变成a)输出,用条件编译方法实现以上选择。#include #define MAX 80 #define SWITCH 1 void main(){ char str[MAX];int i=0;printf(“请输入文本行:n”);scanf(“%s”,str);#if(SWITCH)while(str[i]!='')if(str[i]>='a'&&str[i]<='z')if(str[i]=='z')str[i]='a';else str[i]++;i++;#endif printf(“%sn”,str);}

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

#include “stdio.h” #include “math.h” void div(float** a,int n){ int i,j;float x;for(i=0;ifabs(x))x=*(*(a+i)+j);for(j=0;j

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

13.编写函数,求任意阶多项式 a0+a1X+a2X2+...+anXn 的值并返回多项式的值。#include “stdio.h” float f1(float* a,float x,int n){ int i;float t=1,y=0;for(i=0;i

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

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

unsigned int getbit(unsigned int value)//第1位为0表示数的原码,{ if(value>>15)return(value^0x7fff)+1;//其补码即其原码;若value else return value;//右移15位后为1,表示value是负数的原码,负数

} //的补码为原码按位取反(第1位不变)后加1。

void main(){ unsigned int y=0x800c,k;k=getbit(y);printf(“%xn”,k);}

15.编写函数,求m行、n列的二维数组全体元素中负数的个数。#include int sum(float **a,int m,int n){ int i,j;int y=0;for(i=0;i

{ float b[2][3]={{-1,2,-3},{4,-5,-6}};int i;float* c[2];for(i=0;i<2;i++)c[i]=b[i];printf(“%dn”,sum(c,2,3));} 16.编写函数,返回在一个整数组中出现次数最多的数及其出现次数。#include void fun(float *a,int n,int *k,float *x){ int i,j,y;*k=0;for(i=0;i*k){ *k=y;*x=*(a+i);} } return;} void main()// 函数引用示例

{ float c[10]={0,4,2,4,3,2,4,-3,1.5,7.6},t;int m;fun(c,10,&m,&t);// 若说明float *t;int *m;printf(“元素%f出现次数为%dn”,t,m);// 引用为 fun(c,10,m,t)将

} // 产生悬挂指针的错误,即t、m不只指向确定的存储单元。

17.编一个程序,打入月份号,输出该月的英文月名,要求用指针数组处理。#include void main(){ char *month_name[12]={“January”,“February”,“March”,“April”, “May”, “June”,“July”,“August”,“September”,“October”, “Novenber”,“December”};int n;printf(“请输入月份号:”);scanf(“%d”,&n);if(n<1||n>12)printf(“月份号输入错误!n”);else printf(“%d月的英文表示是%sn”,n,month_name[n-1]);}

18.编写递归函数,将输入的以“?”结束的字符串按与输入相反的顺序输出。#include void pline(){ char ch;if((ch=getchar())!='?'){ pline();putchar(ch);} return;} void main()// 函数引用示例 { pline();printf(“n”);}

19.编写函数,在n个元素的一维数组中,统计比相邻元素大的数组元素个数并将统计数返回(不考虑a[0]和a[n-1]),要求以指针变量而不是数组名作参数。#include int num(float *x,int n){ int i,k=0;for(i=1;i*(x+i-1)&&*(x+i)>*(x+i+1))k++;return k;} void main()// 函数引用示例

{ float a[10]={1,3,4,2,6,7,12,5,9,8};printf(“%dn”,num(a,10));}

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

#include void num(float *b,int n,float *max,float *min){ *max=*b;*min=*b;for(int i=1;i*max)*max=*(b+i);if(*(b+i)<*min)*min=*(b+i);} return;} void main()// 函数引用示例

{ float a[10]={1,3,4,2,6,7,12,5,9,8},x,y;num(a,10,&x,&y);printf(“最大值为%f,最小值为%f。n”,x,y);}

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

返回统计结果。

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

{ float b[5][3]={{-1,5,2},{3,0,-2},{0,-3,5}, {4,7,-8},{3,4,5}},*c[5];int i,k1,k2,k3;for(i=0;i<5;i++)c[i]=b[i];sub(c,5,3,&k1,&k2,&k3);printf(“负数%d个,零%d个,正数%d个。n”,k1,k2,k3);}

22.编写函数,在给定的一行以'.'结束的字符中,找出最长的单词并输出。#include void find(char *str){ char *p1,*p2,*p3;int k1=0,k2=0;// k1为最长串的长度,初值为0。

p1=p2=p3=str;// p3指向最长串首字符,p1指向当前处理串首字符,while(*p2!='.')// p2为移动指针,*p2为空格表示查找到单词尾部。

if(*p2!=' '){ k2++;p2++;} else if(k2>k1){ p3=p1;p1=++p2;k1=k2;k2=0;} else { k2=0;p1=++p2;} for(k2=0;k2<=k1;k2++)printf(“%c”,*(p3+k2));printf(“n”);return;} void main()// 函数引用示例 { char a[40];int i=0;while((a[i++]=getchar())!='.');find(a);}

23.编写函数print,打印一个学生的成绩数组,该数组中有若干个学生的数据记录,每个记录包括num,name,score[3]。#include struct student { char num[7],name[9];int score[3];};// 尾部分号不得遗漏

void print(struct student* s,int n){ int i;// 运算符'*'、'&'的优先级均低于运算符'.' for(i=0;i

printf(“%s %s %4d%4d%4dn”,(*(s+i)).num,(*(s+i)).name,(*(s+i)).score[0],(*(s+i)).score[1],(*(s+i)).score[2]);return;} void main(){ struct student t[4];int i;for(i=0;i<4;i++)

scanf(“%s%s%d%d%d”,&t[i].num,&t[i].name,&t[i].score[0], &t[i].score[1],&t[i].score[2]);print(t,4);} 24.把文本文件d1.dat复制到文本文件d2.dat中,要求仅复制d1.dat中的英文字符。

#include void main(){ FILE *fpd1,*fpd2;char ch;fpd1=fopen(“d1.dat”,“r”);fpd2=fopen(“d2.dat”,“w”);while(fscanf(fpd1,“%c”,&ch)!=EOF)if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')fprintf(fpd2,“%c”,ch);fclose(fpd1);fclose(fpd2);}

25.编程,把文本文件d1.dat复制到d2.dat(其中空格字符不复制)。#include void main(){ FILE *fpd1,*fpd2;char ch;fpd1=fopen(“d1.dat”,“r”);fpd2=fopen(“d2.dat”,“w”);while(fscanf(fpd1,“%c”,&ch)!=EOF)if(ch!=' ')fprintf(fpd2,“%c”,ch);fclose(fpd1);fclose(fpd2);}

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

#include void main(){ FILE *fpd1,*fpd2;char ch;fpd1=fopen(“d1.dat”,“r”);fpd2=fopen(“d2.dat”,“w”);while(fscanf(fpd1,“%c”,&ch)!=EOF){ if(ch>='A'&&ch<='Z')ch=ch+32;fprintf(fpd2,“%c”,ch);} fclose(fpd1);fclose(fpd2);}

27.把文本文件d1.dat复制到文本文件d2.dat中,要求仅复制d1.dat中除英文字符和数字以外的其它内容。#include void main(){ FILE *fpd1,*fpd2;char ch;fpd1=fopen(“d1.dat”,“r”);fpd2=fopen(“d2.dat”,“w”);while(fscanf(fpd1,“%c”,&ch)!=EOF)

if(!(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z'||ch>='0'&&ch<='9'))fprintf(fpd2,“%c”,ch);fclose(fpd1);fclose(fpd2);}

28.求出1至100之间的素数(只能被1和自身整除的数)并顺序写入文件su.dat。

#include #include void main(){ FILE *fp;int i,j,k=2;fp=fopen(“su.dat”,“w”);fprintf(fp,“%4d%4d”,2,3);for(i=5;i<100;i=i+2){ for(j=3;j<=sqrt(i);j=j+2)if(i%j==0)break;if(j>sqrt(i)){ fprintf(fp,“%4d”,i);k++;if(k%10==0)fprintf(fp,“n”);} } fclose(fp);}

29.磁盘文件a1和a2,各自存放一个已按字母顺序排好的字符串,编程合并二个文件到a3 文件中,合并后仍保持字母顺序。#include #include void main(){ FILE *fp1,*fp2,*fp3;int i,j,k;char c1,c2;fp1=fopen(“a1”,“r”);fp2=fopen(“a2”,“r”);// 首先从文件a1、a2中各读入一个字符分别送入变量c1、c2,下面将作

// 循环比较,直到读到文件尾标志为止。

fp3=fopen(“a3”,“w”);c1=fgetc(fp1);c2=fgetc(fp2);do { if(c1

30.顺序文件C.DAT每个记录包含学号(8位字符)和成绩(三位整数)两个数据项。从文件读入学生成绩,将大于或等于60分的学生成绩再形成一个新的文件SCORE60.DAT保存在A盘上,并显示出学生总人数、平均成绩和及格人数。#include #include void main(){ FILE *fp1,*fp2;char s[9];int x,zrs=0,pjcj=0,jgrs=0;fp1=fopen(“c.dat”,“r”);fp2=fopen(“a:score60.dat”,“w”);fscanf(fp1,“%s%d”,s,&x);do { zrs++;pjcj+=x;if(x>=60){ jgrs++;fprintf(fp2,“%s %dn”,s,x);} fscanf(fp1,“%s%d”,s,&x);} while(!feof(fp1));printf(“总人数:%d平均成绩:%d 及格人数:%dn”,zrs,pjcj/zrs,jgrs);fclose(fp1);fclose(fp2);} 31.程序清单:

typedef int datatype;typedef struct node {datatype data;struct node *next;}linklist;„„

INVERT(linklist *head){linklisk *p,*q;p=head->next;if(p!=NULL){head->next=NULL;do {q=p->next;p->next=head->next;head->next=p;p=q;} while(p!=NULL);} } 32.程序清单:

PURGE(linklist *head){linklist *p,*q;q=head->next;if(q==NULL)return;p=q->next;while(p!=NULL)if(p->data==q->data){q=p->next;free(p);p=q->next;} else {q=p;p=p->next;} }

33、程序清单: #include main(){static char x[]=”computer”;char *p;for(p=x;p

34、#include #include main(){int m;char str[80],str2[80];printf(“input a string:n”);gets(str2);printf(“intput m:n);scanf(“%d”,&m);if(strlen(str2)

35、程序清单:

float search(float(pointer)[4],int n){float *pt;pt=*(pointer+n);return(pt);}

36、Main(){int score[][4]={{60,76,80,90},{45,86,57,90},{58,95,80,71},{78,50,60,85}};int(*p)[4],j,k,flag;p=score;for(j=0,j<4;j++)if(*(*(p+j)+k)<60)flag=1;if(flag==1){printf(“NO.%dis fail,svoreare:n”,j);for(k=0,;k<4;k++)printf(“%5d”, *(*(p+j)+k);

printf(“n”);} }

37、程序清单: main(){int b[16],x,k,r,I;printf(“enter a integer :n”): scanf(“%d”,&x);

printf(%6d’s binary number is:n”,x);k=-1;do {r=x%2;k++;*(b+k;x/=2;}while(x!=0 for(I=k;I>=0;I--)printf(“%d”,*(b+i)printf(“n”);} 38、float p(int n,int x){flaot t,t1,t2;if(n==0)return(1);else if(n==1)return(x);else {t1=(2*n-1)*x*(p((n-1),x));t2=(n-1)*p((n-2),x);t=(t1-t2)/n);return(t);}}

39、main(){int a[5][5],I,j,k=0,m,n;m=n/2+1;for(I=0,I=I;j--){k++;a[n-I-1][j]=k;} for(j=n-2-I;j>=I+1;j--){k++;a[I][j];}} for(I=0;I main(){int m[16],n,I,t,count=0;long a,k;printf(“result is:n”);for(n=10;n<200;n++){k=0;t=1;a=n*n;for(I=1;a!=0;I++){m[I]=a%10;a/=10;} for(;I>1;I--){k+=m[I-1]*t;t=t*10;} if(k==n*n)printf(“%2d:%10d%10dn”,++count,n,N*n);}}

41、void convert(char *a,int n){int I;if((I=n/10)!=0)convert(a+1,i);*a=n%10+’0’;}

42、#include main(){FILE *fp;char str[100],fikename[10];int I=0;if((fp=fopen(“upper.txt”,”w”))==NULL){printf(“can not open filen”);exit(0);} printf(“enter a string:n”);gets(str);while(str[I]!=’!’)

{if(str[I]>=’a’&&str[I]<=’z’)str[I]=str[I]-32;fputc(str[I],fp);I++;} fclose(fp);}

43、#include “stdio.h” FILE *fp;main(){int p=0,n=0,z=0,temp;fp=fopen(“number.dat”,”r”);if(fp==NULL)printf(“file not foundn”);else {while(!feof(fp)){fscanf(fp,”%d”,&temp);if(temp>0)p++;else if(temp<0)n++;else z++;} fclose(fp);printf(“posive:%3d,negtive:%3d,zero:%3dn:,p,n,z);} }

44、main(){unsigned rightrot(unsigned a,int n)

unsigned int m,b;

int n;

printf(“enter mand n:”);

scanf(%x,%d”,&m,&n);

printf(“m=%x,n=%dn”,m,n);

b=rightrot(m,n);

printf(“b=%xn”,b);} unsigned rightrot(unsigned a,int n){int rb;while(n0){rb=(a&1)<<(16-1);a=a>>1;a=a|rb;} return a;}

45、解:PX(X,N)=X-X2+X3-X4+„„+(-1)N-1XN =X*(1-X-X2+X3-X4+„„+(-1)N-1XN-1 =X*(1-PX(X,N-1)程序清单:

double px(double x,int n){if(n==1)return x;else return(x*(1-px(x,n-1));}

46、程序清单:

double opwer1(double x,int n){if(n==0)return 1;else return(x*power1(x,n-1);}

47、Printfn(int n){if(n=0&&n<=9)printf(“%d”,n);else {printf(“%d”,x%10);printn(x/10);} }

48、程序清单: t(int n){int m;printf(“%d”,x%10);m=x/10;if(m>0)r(m);}

49、程序清单:

int ack(int m,int n){if(m==0)return(n+1);else if(n==0)return(ack(m-1,1);else return(ack(m-1,ack(m,n-1)));} 50、Void intobin(int x){if(x/2>0)intobin(x/2);printf(“%d”,x%2);}

51、Void intobin(int x){if(x/8>0)intobin(x/8);printf(“%d”,x%8);}

52、Void intobin(int x){ if(x/16>0)intobin(x/16);printf(“%c”,(x%16>=9)?x%16+55:x%16+48);}

53、Main(){int x;printf(“enter a number:n”);

scanf(“%d”,&x);if(x!=0){if(x>0){ x=x%2;if(x)printf(“this number is a plus odd numbern”);else printf(“this number is a plus even numbern”);} else { x=x%2;if(x)printf(“this number is a plus odd numbern”);else printf(“this number is a plus even numbern”);} else printf(“this number is zeron”);}

54、Main(){int x,y,max;printf(“please input two number:n”);

scanf(“%d,%d”,&x,&y);if(a>b)max=a;else max=b;printf(“max=%d”,max);}

55、Main(){int j;for(j=999;j>=100;j--)if(555555%j==0)break;printf(“%d”,j);}

56、Main(){int I,count,j,sum;sum=count=0;for(I=0;I<10;I++){printf(“input ingter:n);scanf(“%d”,&j);if(j<0)continue;count++;sum=sum+j;} if(count)printf(“plus number:%d,average value :%.2f”,count,1.0*sum/count);else printf(“plus number:0,average value :0”);}

57、Main(){int year;printf(“%d”,&year);if(year<0)printf(“year is not a yaern”): else if((year%4==0&&year%100!=0)||year%400==0)printf(“year is leap year!n”);else printf(“year is not leap year!n”);}

58、main(){int n,j,k;printf(“input n:n”);

scanf(“%d”,&n);for(j=0;j

printf(“n”);} }

59、main(){int n,I,j,k;printf(“input n:n”);

scanf(“%d”,&n);for(I=0;I

printf(“n”);} } 60、Main(){ int I;float sum=1;for(I=2;I<=1000;I++)sum=sum+1.0/I;printf(“%f”,sum);} 61、Mypower(float x,int n){int I;float po=1;for(I=1,I<=n;I++)po=po*x;printf(“%f”,po);} 62、Main(){int I,j,max;int a[3][4]={};max=a[0][0];for(I=0;I<3;I++)for(j=0;j<4;j++)if(max char *strcat(char *str1,char *str2){}连接后字符串的头指针为str1。#include char *strcat(char *str1,char *str2){char *str1;while(*p!=’’)p++;while(*p++=*str2++);return(str1);} 64、#include char *revstr(char *s){} #include char *revstr(char *s){char *p=s,c;while(*p)p++;p--;while(s

8、略 69、略

70、#include #include main(){char str[80];printf(“input a string :n”);gets(str);insert(str);printf(“result is :%s”,str);} insert(char *s){int I;for(I=strlen(s);I>0;I--){*(s+2*I)=*(s+I);*(s+2*I-1)=’’;} } 71、Main(){int x;scanf(“%d”,&x);if(x%5==0&&x%7==0)printf(“yes”);else printf(“no”);} 72、#include main(){int day=0,buy=2;float sum=0,ave;do { sum=sum+buy*0.8;day++;buy=buy*2;}while(buy<=100);ave=sum/day;printf(“%f”,ave);} 73、#include main(){int I;for(I=1;I<100;I++)if(I*I==I||I*I%100==I)printf(%3d”,I);} 74、#include main(){char s[80]=””;int I,j;for(I=j=0;s[I]!=’’;I++)

if(c[I]!=’c’)s[j++]=s[I];

s[j]=’’;puts(s);} 79、main(){ int a[10];int i,j,m,f,h;int n,s;for(i=0;i<10;i++)a[i]=0;a[9]=1;printf(“please input n:n”);scanf(“%d”,&n);for(i=2;i<=n;i++){m=0;for(j=9;j>=0;j--){if(!(a[j]==0)){ f=a[j];h=(f*i%10+m)/10;a[j]=(f*i%10+m)%10;

m=f*i/10+h;} else { a[j]=a[j]+m;m=0;} } } i=0;while(a[i]==0)i++;printf(“%d!= ”,n);for(j=i;j<10;j++)printf(“%d”,a[j]);printf(“n”);} 80、#include #define N 100 main(){int a,j,jinwei,temp;int num1[N],num2[N];int i;printf(“PLEASE INPUT ONE NUMBER:n”);i=2;while(1){scanf(“%d”,&a);if(a==-1)break;num1[i++]=a;} num1[0]=i-1;i=2;printf(“PLEASE INPUT OTHER NUMBER:n”);while(1){scanf(“%d”,&a);if(a==-1)break;num2[i++]=a;} num2[0]=i-1;for(i=2;i<=num1[0];i++)printf(“%d”,num1[i]);printf(“+”);for(i=2;i<=num2[0];i++)printf(“%d”,num2[i]);printf(“=”);jinwei=0;if(num1[0]>num2[0]){j=num2[0];for(i=num1[0];i>=2;i--){ if(j>=2){ temp=jinwei;jinwei=(num1[i]+num2[j]+jinwei)/10;num1[i]=(num1[i]+num2[j]+temp)%10;

j--;} else { temp=jinwei;jinwei=(num1[i]+jinwei)/10;num1[i]=(num1[i]+temp)%10;

} } num1[1]=jinwei;for(i=1;i<=num1[0];i++)printf(“%d”,num1[i]);} else { j=num1[0];for(i=num2[0];i>=2;i--){ if(j>=2){temp=jinwei;jinwei=(num1[j]+num2[i]+jinwei)/10;num2[i]=(num1[j]+num2[i]+temp)%10;j--;} else {temp=jinwei;jinwei=(num2[i]+jinwei)/10;num2[i]=(num2[i]+temp)%10;} }

num2[1]=jinwei;for(i=1;i<=num2[0];i++)printf(“%d”,num2[i]);} } 81、include #define N 10 main(){int a,j,jinwei,temp;int num1[N],num2[N];int ji[2*N];int i;int k,k1,k2;int jinwei1,jiashu;for(i=0;i<2*N;i++)ji[i]=0;printf(“PLEASE INPUT ONE NUMBER:n”);i=1;while(1){scanf(“%d”,&a);if(a==-1)break;num1[i++]=a;} num1[0]=i-1;

printf(“PLEASE INPUT OTHER NUMBER:n”);i=1;while(1){scanf(“%d”,&a);if(a==-1)break;num2[i++]=a;} num2[0]=i-1;jinwei=0;k=2*N;for(i=num1[0];i>=1;i--){k1=k;k--;k2=k;jinwei=0;for(j=num2[0];j>=1;j--){ k1--;jiashu=(num1[i]*num2[j]+jinwei)%10;jinwei=(num1[i]*num2[j]+jinwei)/10;jinwei1=0;k2=k1;while(1){temp=jinwei1;jinwei1=(ji[k2]+jiashu+temp)/10;ji[k2]=(ji[k2]+temp+jiashu)%10;if(jinwei1==0)break;else {k2--;jiashu=0;} }

} k1--;temp=jinwei;jinwei=(temp+ji[k1])/10;ji[k1]=(temp+ji[k1])%10;if(jinwei!=0)ji[--k1]= jinwei;} printf(“nn”);for(i=1;i<=num1[0];i++)printf(“%d”,num1[i]);printf(“*”);

for(i=1;i<=num2[0];i++)printf(“%d”,num2[i]);printf(“=”);for(i=k1;i<2*N;i++)printf(“%d”,ji[i]);} 82、int count;int perm(char as[],char tem1[],int k,int num,int curr,int m){ int i,t;if(curr==0){if(num==0){printf(“{}”);count++;} else { count++;printf(“{”);for(i=0;i

第四篇:C语言程序设计习题试题(编程题)

C语言程序设计习题(编程类)

1、从键盘输入任意的字符,按下列规则进行分类计数。

第一类 '0','1','2','3','4','5','6','7','8','9'

第二类 '+','-','*','/','%','='

第三类 其它字符

当输入字符''时先计数,然后停止接收输入,打印计数的结果。参考答案:

#include void main(){ int class1, class2, class3; char ch;

class1=class2=class3=0; /* 初始化分类计数器 */ do { ch=getch(); switch(ch){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': class1++; break; /* 对分类1计数 */ case '+': case '-': case '*': case '/': case '%': case '=': class2++; break; /* 对分类2计数 */ default: class3++; break; /* 对分类3计数 */ } }while(ch!= ''); /* 字符''在C程序中要使用转义符'' */ printf(“class1=%d, class2=%d, class3=%dn”, class1, class2, class3); }

2、从键盘输入十个整数,用插入法对输入的数据按照从小到大的顺序进行排序,将排序后的结果输出。参考答案: void main(){ int i,j,num,a[10]; for(i=0;i<10;i++){ printf(“Enter No.%d:”, i+1); scanf(“%d”,&num);

for(j=i-1;j>=0&&a[j]>num;j--)a[j+1]=a[j]; a[j+1]=num; } for(i=0;i<10;i++)printf(“No.%d=%dn”, i+1, a[i]); }

3、输入一个正整数,要求以相反的顺序输出该数。例如输入12345,输出位54321。参考答案: void main(){ int n;

printf(“Please enter n:”); scanf(“%d”,&n); while(n>0){ printf(“%d”,n%10); n=n/10; } }

4、编写程序,读入一个整数N;若N为非负数,则计算N到2×N之间的整数和;若N为一个负数,则求2×N到N之间的整数和。分别利用for和while写出两个程序。参考答案: void main(){ int i,n;

long s1=0,s2=0;

printf(“Please enter N:”); scanf(“%d”,&n); if(n>=0)for(i=n;i<=2*n;i++)s1=s1+i; else for(i=n;i>=2*n;i--)s1=s1+i; i=n; if(i>=0)while(i<=2*n)s2=s2+i++; else while(i>=2*n)s2=s2+i--;

printf(“Result1=%ld result2=%ldn”,s1,s2); }

5、一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,•所得的商被17除余15,最后得到一个商是a的2倍。编写程序求这个自然数。参考答案: void main(){ int i,n,a;

for(i=0; ;i++){ if(i%8==1){ n=i/8; if(n%8==1){ n=n/8;

if(n%8==7)a=n/8; } } if(i%17==4){ n=i/17;

if(n%17==15)n=n/17; } if(2*a==n){ printf(“result=%dn”,i); break; } } }

6、编写程序,输出用一元人民币兑换成1分、2分和5分硬币的不同兑换方法。参考答案: void main(){ int f1,f2,f5,count=0; for(f5=0;f5<=20;f5++)for(f2=0;f2<=(100-f5*5)/2;f2++){ f1=100-f5*5-f2*2; if(f5*5+f2*2+f1==100)printf(“No.%2d >> 5: %4d 2: %2d 1: %2dn”,++count,f5,f2,f1); } }

7、将一个数的数码倒过来所得到的新数叫原数的反序数。如果一个数等于它的反序数,则称它为对称数。求不超过1993的最大的二进制的对称数。参考答案: void main(){ int i,j,n,k,a[16]={0}; for(i=1;i<=1993;i++){ n=i;k=0;

while(n>0)/* 将十进制数转变为二进制数 */ { a[k++]=n%2; n=n/2; } for(j=0;j=k){ printf(“ %d: ”,i); for(j=0;j

8、十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14 块,第十个小孩20块。然后所有的小孩同时将自己手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次调整后大家手中的糖的块数都一样?每人各有多少块糖? 参考答案: void main(){ int i,count=0,a[11]={0,10,2,8,22,16,4,10,6,14,20}; while(1){ for(i=1;i<=10;i++)a[i-1]=a[i-1]/2+a[i]/2; a[10]=a[10]/2+a[0]; for(i=1;i<=10;i++)if(a[i]%2==1)a[i]++; for(i=1;i<10;i++)if(a[i]!=a[i+1])break; if(i==10)break; else { a[0]=0; count++; } } printf(“count=%d number=%dn”,count,a[1]); }

9、输入5×5的数组,编写程序实现:(1)求出对角线上各元素的和;

(2)求出对角线上行、列下标均为偶数的各元素的积;(3)找出对角线上其值最大的元素和它在数组中的位置。参考答案: void main(){ int i,j,s1=0,s2=1,a[5][5]; for(i=0;i<5;i++)for(j=0;j<5;j++){ printf(“%d %d: ”,i,j); scanf(“%d”,&a[i][j]); } for(i=0;i<5;i++){ for(j=0;j<5;j++)printf(“%5d”,a[i][j]); printf(“n”); } j=0;

for(i=0;i<5;i++){ s1=s1+a[i][i];

if(i%2==0)s2=s2*a[i][i]; if(a[i][i]>a[j][j])j=i; } printf(“SUN=%dnACCOM=%dna[%d]=%dn”,s1,s2,j,a[j][j]); }

10、编写程序,以字符形式输入一个十六进制数,将其变换为一个十进制整数后输出。参考答案:

#include “stdio.h” void main(){ int i,n=0,a[4]={0};

printf(“Please enter a digit:”);

for(i=0;i<4 &&(a[i]=getchar())!='n';i++); for(i=0;i<4;i++)if(a[i]>=48&&a[i]<=57)a[i]=a[i]-48; else if(a[i]>=65&&a[i]<=69)a[i]=a[i]-55; else if(a[i]>=97&&a[i]<=102)a[i]=a[i]-87; else printf(“input Error!”); for(i=0;i<4;i++)n=n*16+a[i]; printf(“%d”,n); }

11、编写程序,输入一个十进制整数,将其变换为二进制后储存在一个字符数组中。参考答案: void main(){ int i,n,k=16,a[16]={0}; printf(“Please enter a digit:”); scanf(“%d”,&n);

while(n>0)/* 将十进制数转变为二进制数 */ { a[--k]=n%2; n=n/2; } for(i=0;i<16;i++)printf(“%2d”,a[i]); }

12、对数组A中的N(0<N<100=个整数从小到大进行连续编号,输出各个元素的编号。要求不能改变数组A中元素的顺序,且相同的整数要具有相同的编号。例如数组是:A=(5,3,4,7,3,5,6)则输出为:(3,1,2,5,1,3,4)参考答案: void main(){ int i,j,k,n,m=1,r=1,a[2][100]={0}; printf(“Please enter n:”); scanf(“%d”,&n); for(i=0;i

for(j=i;j

13、求这样一个三位数,该三位数等于其每位数字的阶乘之和。

即: abc = a!+ b!+ c!参考答案: void main(){ int a[5],i,t,k;

for(i=100;i<1000;i++){ for(t=0,k=1000;k>=10;t++){ a[t]=(i%k)/(k/10); k/=10; } if(f(a[0])+f(a[1])+f(a[2])==i)printf(“%d ”,i); } } f(m)int m;

{ int i=0,t=1;

while(++i<=m)t*=i; return(t); }

14、编写一个函数实现将字符串str1和字符串str2合并,合并后的字符串按其ASCII码值从小到大进行排序,相同的字符在新字符串中只出现一次。参考答案:

#include “string.h” strcmbn(a,b,c)/* 数组合并函数:将数组a、b合并到 */ char a[],b[],c[]; { char tmp; int i,j,k,m,n; m=strlen(a); n=strlen(b);

for(i=0;i

tmp=a[i]; a[i]=a[k]; a[k]=tmp; } for(i=0;i

tmp=b[i]; b[i]=b[k]; b[k]=tmp; } i=0;j=0;k=0;

while(ib[j])c[k++]=b[j++]; /* 将a[i]、b[j]中的小者存入c[k] */ else { c[k++]=a[i++]; if(a[i-1]==b[j])j++; /* 如果a、b当前元素相等,删掉一个 */ } while(i

15、编写函数,采用递归方法实现将输入的字符串按反序输出。参考答案:

#include “stdio.h” strout(s)char *s; { if(*s!=''){ strout(s+1); /* 递归调用strout函数,字符串首地址前移一个字符 */ putch(*s); /* 输出字符串首地址所指向的字符 */ } else return; /* 遇到字符串结束标志结束递归调用 */ }

16、编写函数,采用递归方法将任一整数转换为二进制形式。参考答案: turn(n,a,k)int n,a[ ],k; { if(n>0){ a[k]=n%2; turn(n/2,a,k-1); } else return; } void main(){ int i,n,a[16]={0};

printf(“nPlease enter n:”); scanf(“%d”,&n); turn(n,a,15);

for(i=0;i<16;i++)printf(“%d”,a[i]); }

17、将一个数的数码倒过来所得到的新数,叫作原数的反序数,如果一个数等于它的反序数,则称它为对称数。编写程序,采用递归算法求不超过1993的最大的二进制的对称数。

参考答案:

smmt(char s[ ])/* 指针s指向字符串的第一个字符 */ { char *p; p=s; while(*p!='')p++;

p--; /* 指针p指向字符串的最后一个字符 */ if(p==s)return(1); /* 两个指针指向同一个字符表示字符串对称 */ else { if(*s!=*p)

return(0); /* 两个指针指向字符不等表示字符串不对称 */ else { *p='';

smmt(s+1); /* 取掉首尾比较过的字符继续比较 */ } } }

18、编写程序,读入一个以符号“.”结束的长度小于20字节的英文句子,检查其是否为回文(即正读和反读都是一样的,不考虑空格和标点符号)。例如:

读入句子:MADAM I'M ADAM.它是回文,所以输出:YES 读入句子:ABCDBA).它不是回文,所以输出:NO 参考答案:

#include “stdio.h” void main(){ char s[21],*p,*q; gets(s); p=s; q=s;

while(*q!='')q++; q-=2;

while(p=q)printf(“YESn”); }

19、编写程序,其中包括一个函数,此函数的功能是:对一个长度为N 的字符串从其第K个字符起,删去M个字符,组成长度为N-M的新字符串(其中N、M<=80,K<=N)。例如输入字符串“We are poor students.”,利用此函数进行删除“poor”的处理,输出处理后的字符串是“We are students.”。参考答案: strcut(s,m,k)char s[ ]; int m,k; { char *p; int i;

p=s+m; /* 指针p指向要被删除的字符 */ while((*p=*(p+k))!='')/* p+k指向要前移的字符 */ p++; }

20、编写一个函数insert(s1,s2,ch),实现在字符串s1中的指定字符ch位置处插入字符串s2。

参考答案: insert(s1,s2,ch)char s1[],s2[],ch; { char *p,*q; p=s1;

while(*p++!=ch); while(*s2!=''){ q=p;

while(*q!='')q++; while(q>=p)*(q+1)=*q--; *++q=*s2++; p++; } }

21、编写程序将输入的两行字符串连接后,将串中全部空格移到串首后输出。参考答案: strcnb(s1,s2)char s1[],s2[]; { char *p; int i=1; p=s1;

while(*p!='')p++;

while((*p++=*s2++)!=''); /* 将s2接于s1后面 */ p=s1;

while(*p!='')/* 扫描整个字符串 */ { if(*p==' ')/* 当前字符是空格进行移位 */ { while(*(p+i)==' ')i++; /* 寻找当前字符后面的第一个非空格 */ if(*(p+i)!=''){ *p=*(p+i); /* 将非空格移于当前字符处 */ *(p+i)=' '; /* 被移字符处换为空格 */ } else break; /* 寻找非空格时到字符串尾,移位过程结束 */ } p++; } }

22、编写程序,输入字符串,分别统计字符串中所包含的各个不同的字符及其各自字符的数量。如:输入字符串: abcedabcdcd 则输出:a=2 b=2 c=3 d=3 e=1。参考答案:

#include “stdio.h” struct strnum { int i; char ch; } void main(){ char c; int i=0,k=0;

struct strnum s[100]={0,NULL}; while((c=getchar())!='n'){ for(i=0;s[i].i!=0;i++){ if(c==s[i].ch){ s[i].i++; break; } } if(s[i].i==0){ s[k].ch=c; s[k++].i=1; } } i=0;

while(s[i].i>0){ printf(“%c=%d ”,s[i].ch,s[i].i); i++; } }

23、编写程序,读入磁盘上C语言源程序文件“test8.c”,删去程序中的注释后显示。参考答案:

#include “stdio.h” FILE *fp; void main(){ int c, d;

if((fp = fopen(“d: c est8.c”,“r”))== NULL)exit(0); while((c=fgetc(fp))!= EOF)if(c=='/')/* 如果是字符注释的起始字符'/' */ if((d=fgetc(fp))== '*')/* 则判断下一个字符是否为'*' */ in_comment(); /* 调用函数处理(删除)注释 */ else /* 否则原样输出读入的两个字符 */ { putchar(c); putchar(d); } else if(c==''' || c=='“')/* 判断是否是字符'或” */ echo_quote(c); /* 调用函数处理字符'或“包含的字符 */ else putchar(c); } in_comment(){ int c, d; c=fgetc(fp); d=fgetc(fp);

while(c!='*' || d!='/'){ /* 连续的两个字符不是 * 和 / 则继续处理注释 */ c = d;

d = fgetc(fp); } } echo_quote(c)int c; /* c中存放的是定界符'或” */ { int d; putchar(c);

while((d=fgetc(fp))!=c)/* 读入下一个字符判断是否是定界符c */ { putchar(c); /* 当不是定界符c时继续循环 */ if(d=='')/* 若出现转义字符 */ putchar(fgetc(fp)); /* 则下一个字符不论是何均原样输出 */ } putchar(d); } 12

第五篇:C语言经典编程题(推荐)

C语言经典编程题

题目01:在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同的单词。

[cpp] view plain copy print?

1.2.3.4.5.6.7.8.9.int main(){

// 用数组定义一个字符串

char array[50] = “zha junju zhamengjun z mengjun”;

char *str = array;// 定义指针变量str,指向数组array

int len = 0;// 定义变量len,用于计数

int max = 0;// 定义变量max,存放最长单词的长度

char *p = 0;// 定义指针变量p,指向最长单词的首字符

10.11.// 判断指针当前指向的字符是不是''

12.while(*str!= '')13.{

14.if(*str!= ' ')// 判断字符是不是空格 15.{

16.len++;// 计数加1 17.18.// 判断最大长度跟len长度的大小

19.if(max < len){

20.max = len;// 如果max小于len,将len赋值给max

21.p = str1];

46.} 47.else

48.{

49.sumDaysOfMonth += pingYear[monthDay;// 定义整型变量days,存储一个月内相隔的天数

54.int sumDays = 0;// 定义整型变量sumDays,存储两个时间点相隔的总天数

55.56.// 得到两个时间点相隔的总天数

57.sumDays = sumDaysOfYear + sumDaysOfMonth + days;58.59.printf(“两个时间点相隔%d天n”, sumDays);60.61.// 根据相隔的天数,判断小明遇到的人

62.if((sumDays % 2 == 0)&&(sumDays % 3 == 0))63.{

64.printf(“小明既结识了帅哥又结识了美女!n”);65.}

66.else if(sumDays % 2 == 0)67.{

68.printf(“小明结识了帅哥!n”);69.}

70.else if(sumDays % 3 == 0)71.{

72.printf(“小明结识了美女!n”);73.} 74.else

75.{

76.printf(“小明没有结识帅哥和美女n”);77.} 78.}

心得体会:(1)利用for循环遍历,if条件来判断是平年还是闰年,求出相隔年数的累加的天数(2)同理,利用第一步的方法,求出相隔月数的累加的天数,只是要注意每月的天数,根据平年和闰年的不同分别保存在两个不同的数组中,以便利于累加

(3)将输入的日减1,计算出当月相隔的天数,最后求出两个日期相隔的总天数。(4)根据总天数取余2和3,判断出小明当天结识的是美女还是帅哥。

题目05:提示用户输入一个正整数n,利用while循环计算并输出:1-2+3-4+5-6+7…+n的和。

[cpp] view plain copy print?

1.2.3.4.5.6.7.8.9.int main(){

// 1.定义变量存储用户输入的整数

int n = 0;

// 2.判断n是否为正整数

while(n <= 0){

// 2.1 提示输入

printf(“输入一个正整数:n”);

10.11.// 2.2 让用户输入

12.scanf(“%d”, &n);13.} 14.15.// 3.计算阶乘

16.int sum = 0;// 存储计算结果

17.int current = 0;// 当前要累加的数值

18.while(current < n){ 19.current++;20.21.// 如果是偶数,就减

22.if(current % 2 == 0){ 23.sum-= current;24.} else { // 如果是奇数,就加

25.sum += current;26.} 27.} 28.29.// 4.输出结果 30.printf(“%dn”, sum);31.32.return 0;33.}

心得体会:

(1)确保从键盘上输入的是一个整数(用while来判断);(2)用while循环来遍历从1到n的值;

(3)通过奇偶性判断所要累加数值的正负性,奇数就累加,偶数就累减。

题目06:提示用户输入一个正整数n,计算并输出n的阶乘结果:1*2*3*…*n。

[cpp] view plain copy print?

1.2.3.4.5.6.7.8.9.int main(){

// 1.定义变量存储用户输入的整数

int n = 0;

// 2.判断n是否为正整数

while(n <= 0){

// 2.1 提示输入

printf(“输入一个正整数:n”);

10.11.// 2.2 让用户输入

12.scanf(“%d”, &n);13.} 14.15.// 3.计算阶乘

16.int result = 1;// 存储计算结果

17.int current = 1;// 当前的乘数

18.while(current <= n){

19.result *= current;// 累乘每次的乘数

20.current++;// 乘完一次就++

21.} 22.23.// 4.输出阶乘结果

24.printf(“%d!= %dn”, n, result);25.26.return 0;27.}

心得体会:

(1)可以利用for循环或者while循环进行遍历,利用累乘即可求出值。(2)还可以利用递归来做,更简单。

题目07:编写一个函数,判断某个字符串是否为回文。回文就是从左边开始读 和 从右边开始读 都是一样的,比如“abcba” [cpp] view plain copy print?

1.2.3.4.5.6.7.8.9.int main(){

printf(“%dn”, isHuiwen(“a”));

return 0;}

/*

返回1代表是回文

返回0代表不是回文

10.*/ 11.int isHuiwen(char *str)

12.{

13.// 1.定义一个指向变量left指向字符串的首字符

14.char *left = str;

15.// 2.定义一个指向变量right指向字符串的末字符

16.char *right = str + strlen(str)1)+ count(n);// 求出每一个阶乘的累加和

58.} 59.60.// 定义和求出一个累加和

61.int count(int n)

62.{

63.if(n == 1)64.return 1;

65.return count(n1;22.23.// 如果左边元素的下标 < 右边元素的下标

24.while(left < right)25.{

26.// 利用中间变量交换两个元素的值

27.int temp = array[left];28.array[left] = array[right];29.array[right] = temp;30.31.// 交换一次后,左边元素下标增加,右边元素下标减小

32.33.left++;34.right--;35.} 36.}

心得体会:

(1)首先要明白一点,为什么不能通过sizeof(array)/ sizeof(int)来求出数组元素的个数?因为当数组作为参数传递的时候,函数的参数array实际上当做变量来存储传来的数组首元素的地址。而每一个指针变量占用8个字节。

(2)分别拿出数组首元素和数组尾元素,然后利用中间变量交换两个元素的值。(3)利用while循环,遍历数组元素,并使left< right保证循环到中间即可,否则每个元素又进行一次交换,结果值没有改变。

(4)函数reverse不需要返回值,因为改变了形参数组也就改变了外面的实参数组,因为数组是按址传递的。

下载高教c语言程序设计(2011版)课后编程题答案(五篇材料)word格式文档
下载高教c语言程序设计(2011版)课后编程题答案(五篇材料).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    C语言编程100题

    经典C语言程序设计100例 【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组......

    C语言程序设计题

    【第1题】题目:请编写函数fun,对长度为7的字符串,除首、尾字符外,将其余5个字符按将序排列。例如,雨来的字符串为CEAedca,排序后输出为CedcEAa。 Int fun(char *s,int num) { Int......

    C语言程序设计教程课后习题答案

    C语言程序设计教程课后习题答案第一章 C语言程序设计概述 -习题答案 1 算法的描述有哪些基本方法?答 1、自然语言 2、专用工具2 C语言程序的基本结构是怎样的?举一个例子说明。......

    c语言编程题(精选五篇)

    实验2 数据类型和标准输入与输出 (1)编写程序,输入摄氏温度,转换为华氏温度。转换公式如下: 华氏度 = 32 + 摄氏度 × 1.8 #include "stdio.h" void main { int s; double h;......

    C语言期末考试编程题范文

    1.打印出所有的“水仙花数”,并按照一行5个的格式输出。所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1*1*1+5*5*5+3*3*3......

    c语言程序设计课后习题答案 第7章

    /*练习7-1*/ #include main { int a[10],n,sum=0,i; float ave; printf("enter n:n"); scanf("%d",&n); printf("enter %d ge zheng shu:n",n); for(i=0;i......

    c语言课后答案 (范文大全)

    第7章数组习题解答 一、在以下每一题的四个选项中,请选择一个正确的答案。 【题7.1】 C 【题7.2】 D 【题7.3】 D 【题7.4】 D 【题7.5】 C 【题7.6】 C 【题7.7】 C 【题7.8......

    c语言课后答案

    c语言课后答案 第一章习题答案一、选择题 1~5:BDCDA 6~10:DABBB 11~12:CC 二、填空题1、main() 2、函数首部 ,函数体3、函数4、编辑、编译、连接、运行5、.cpp、.obj、 .exe......