c语言答案。

课后习题1.5

请参照本章例题,编写一个C程序,输出以下信息:

**************************

         Very Good!

**************************

数*号可看出,Very前面9空格,Good前面……

*也是输出的一部分,别光打印Very Good!

#include<stdio.h>

int main()

{

 printf("**************************\n");

 printf(" Very Good!\n");

 printf("**************************");

 return 0;

}

 

*******************************************************

课后习题3.7

要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.

例如,字母"A"后面第4个字母是"E"."E"代替"A"。

#include <stdio.h>

int main()

{

 char a[5]={'C','h','i','n','a'};

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

 {

  a[i]+=4;

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

 }

 return 0;

 }

 

*********************************************************

课后习题6.4

求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。

#include <stdio.h>

int main() {

 long long int sn,sum,n,i;

 sum=1;

 sn=0;

 scanf("%lld",&n);

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

  sum=sum*i;

  sn=sn+sum;

 }

 printf("%lld",sn);

}

*********************************************************

课后习题6.5

求以下三数的和,保留2位小数 1~a之和 1~b的平方和 1~c的倒数和

#include <stdio.h>

int main() {

 int a, b, c, i;

 double sum;

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

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

  sum=((1+a)*a)/2;

 }

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

  sum+=i*i;

 }

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

  sum+=(1.0/i);

 }

 printf("%.2lf\n", sum);

 return 0;

}

*********************************************************

课后习题6.6

打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。

例如:153是一个水仙花数,因为153=1^3+5^3+3^3。

#include <stdio.h>

int main() {

 int i,l,m,n;

 for(i=100; i<=900; i++) {

  m=i/100;

  n=(i-m*100)/10;

  l=i%10;

  if(i==m*m*m + n*n* n+ l*l*l) {

   printf("%d ", i);

  }

 }

 return 0;

}

*********************************************************

课后习题6.7

一个数如果恰好等于它的因子之和,这个数就称为"完数"。

例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。

编程序找出N之内的所有完数,并按下面格式输出其因子:

#include <stdio.h>

int main()

{

 int n,m,i,j,s;

 scanf("%d",&n);

 for(m=6;m<n;m++)//6是第一个完数 

 {

  s=1;

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

  {

   if(m%i==0)

   s=s+i;//找到所以的因子并让其相加 

  }

   if(m-s==0)

   {

    printf("%d its factors are 1 ",m);

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

    {

     if(m%j==0)

     printf("%d ",j);

    }//是完数就输出所以因子 

    printf("\n");

   }

  }

 return 0;

}*********************************************************

课后习题6.8

有一分数序列:2/1 3/2 5/3 8/5 13/8 21/13...... 

求出这个数列的前N项之和,保留两位小数

#include<stdio.h>

int main() {

 int N;

 int i;

 double t,num,sum=0;

 double a=1,b=2;

 scanf("%d",&N);

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

  num=b/a;

  sum=sum+num;

  t=b;

  b=a+b;

  a=t;

 }

 printf("%.2f\n",sum);

 return 0;

}

*********************************************************

课后习题6.9

一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。

它在第N次落地时反弹多高?共经过多少米?保留两位小数

 #include <stdio.h>

int main() {

 int i,size;

 double high,sum=0.0;

 scanf("%lf %d",&high,&size);

 for(i=1; i<=size; i++) { //用 for()循环来模拟反弹的过程,

  if(i==1) {

   sum+=high; //第一次落地时

  } else {

   sum+=high*2; //中间过程都是两倍的反弹高度。

  }

  high=high/2; //反弹高度

 }

 printf("%.2lf %.2lf",high,sum);

 return 0;

}

*********************************************************

课后习题6.10

猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。

第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。

到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。

#include <stdio.h>

int main()

{

 int n,m=1;

 scanf("%d",&n);

 for(int i=9;i>0;i--)

 {

  m=2*(m+1);

 

 }

  printf("%d",m);

 return 0;

 }

*********************************************************

课后习题7.1

用筛法求N之内的素数。

#include <stdio.h>

int main() {

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

 int ar[1000];

 scanf("%d",&n);

 for(a=2; a<=n; a++) ar[a]=a;

 for(b=2; b<=n; b++) for(d=b+1; d<=n; d++) if(d%b==0) ar[d]=0;

 for(e=2; e<=n; e++) if(ar[e]!=0) printf("%d\n",ar[e]);

 return 0;

}

*********************************************************

课后习题7.2

用选择法对10个整数从小到大排序。

#include <stdio.h>

int main() {

 int a[10];

 int i,t,j;

 for(i=0; i<10; i++) scanf("%d", &a[i]);

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

  for(j=i; j<10; j++) {

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

    t=a[i];

    a[i]=a[j];

    a[j]=t;

   }

  }

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

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

 }

 return 0;

}

 

课后习题7.3

求一个3×3矩阵对角线元素之和。

#include <stdio.h>

int main() {

 int a[3][3],sum1=0,sum2=0;

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

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

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

  }

 }

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

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

   if(i==j) sum1+=a[i][j];

  }

 }

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

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

   if(i==j+2||j==i+2||i==j&&i==1&&j==1) sum2+=a[i][j];

  }

 }

 printf("%d %d\n",sum1,sum2);

 return 0;

}

课后习题7.5

输入10个数字,然后逆序输出。

#include <stdio.h>

int main() {

 

 int a[10];

 int i;

 for(i=0; i<10; i++) scanf("%d",&a[i]);

 for(i=9; i>=0; i--) { //最后一个数字后没有空格

  if(i!=0) printf("%d ",a[i]);

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

 }

 return 0;

}

 

*********************************************************

课后习题8.1

写两个函数hcf和lcd,分别求两个整数的最大公约数和最小公倍数,

用主函数调用这两个函数,并输出结果两个整数由键盘输入。

#include <stdio.h>

int hc(int a,int b)

{

  if(a==b)

  {

   return a;

  }

  else if(a>b)

  {

   return hc(a-b,b); 

  }

  else

  {

   return hc(b-a,a);

  }  

}

 

int lcd(int a,int b)

{

 int i=1;

 while((a*i)%b!=0)

 {

  i++;

  }

 return i*a; 

}

int main()

{

 int a,b;

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

 int i=hc(a,b);

 int j=lcd(a,b);

 printf("%d %d",i,j);

 return 0;

 }

*********************************************************

课后习题8.2

求方程ax^2+bx+c=0的根,用三个函数gz,ez和sz分别求当b^2-4ac大于0、等于0和小于0时的根,

并输出结果。从主函数输入a、b、c的值。(输出保留3位小数)

#include<stdio.h>

#include<math.h>

float x1, x2, disc, p, q;

void gz(float a, float b)

{

 float m = sqrt(disc);

 x1 = (-b + sqrt(disc)) / (2 * a);

 x2 = (-b - sqrt(disc)) / (2 * a);

}

 

void ez(float a, float b)

{

 x1 = x2 = (-b) / (2 * a);

}

 

void sz(float a, float b)

{

 p = -b / (2 * a);

 q = sqrt(-disc) / (2 * a);

}

 

int main()

{

 int a, b, c;

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

 disc = b*b - 4 * a*c;

 

 if (disc > 0)

 {

  gz(a, b);

  printf("x1=%.3f x2=%.3f\n", x1, x2);

 }

 else if (disc == 0)

 {

  ez(a, b);

  printf("x1=%.3f x2=%.3f\n", x1, x2);

 }

 else

 {

  sz(a, b);

  printf("x1=%.3f+%.3fi x2=%.3f-%.3fi\n", p, q, p, q);

 }

 return 0;

}

*********************************************************

课后习题8.3

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

#include<stdio.h>

int prime(int a);//函数声明

int main() {

 int n,i;

 scanf("%d",&n);

 if(prime(n)==1) //return返回值1

  printf("prime");

 else

  printf("not prime") ;

}

int prime(int a) {

 int i;

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

  if(a%i==0)

   return 0;//a%i==0不成立

  else

   return 1;//a%i==0成立

}

*********************************************************

课后习题8.4

写一个函数convert,使给定的一个二维数组(3×3)转置,即行列互换。

#include<stdio.h>

void change(int a[3][3]) {

 int i, j, t;

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

  for(j=0; j<i; j++) { //这里是 j<i 而不是 j<3,如果是 j<3 的话,那么有的值就会换两次,即没变;

   t=a[i][j];//数组里面不能将行列互换,只能借助另外的参数;

   a[i][j]=a[j][i];//即不能写成 a[i][j]=a[j][i]; a[j][i]=t;

  }

 }

}

int main() {

 int a[3][3];

 int i, j;

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

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

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

  }

 }

 change (a);

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

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

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

  }

  printf("\n");

 }

 return 0;

}

*********************************************************

课后习题8.5

写一函数inverse,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。

#include<stdio.h>

#include <string.h>

void inverse(char a[])

{

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

 {

  

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

 }

}

int main()

{

 char a[50];

 scanf("%s",&a);

 inverse(a);

 return 0;

}

*********************************************************

课后习题8.6

写一函数concat,将两个字符串连接

#include<stdio.h>

#include<string.h>

int main() {

 char str1[100],str2[100];

 gets(str1);

 gets(str2);

 strcat(str1,str2);

 puts(str1);

 return 0;

}

*********************************************************

课后习题8.7

写一函数cpy,将一个字符串中的元音字母复制到另一个字符串,然后输出。

#include <stdio.h>

#include <string.h>

char ycopy(char x[], char y[]); //定义复制函数 

int main()

{

 char a[20], b[20];

 gets(a); //输入字符串

 b[20]=ycopy(a, b); //调用复制函数

 puts(b); //输出复制后的字符串

 return 0;

}

//元音复制函数

char ycopy(char x[], char y[]) {

 int m, i, j;

 m=strlen(x);

 for (i=0, j=0; i<m; i++) {

  if (x[i]=='a'||x[i]=='A') y[j++]=x[i];

  else if (x[i]=='e'||x[i]=='E') y[j++]=x[i];

  else if (x[i]=='i'||x[i]=='I') y[j++]=x[i];

  else if (x[i]=='o'||x[i]=='O') y[j++]=x[i];

  else if (x[i]=='u'||x[i]=='U') y[j++]=x[i];

 }

 y[j] = '\0';

 return y[j];

}

 

*********************************************************

课后习题8.8

写一函数insert,输入一个四位数字,要求输出这四个数字字符,

但每两个数字间空格。如输入1990,应输出"1 9 9 0"。

#include<stdio.h>

#include<string.h>

int main() {

 char a[10];

 gets(a);

 for(int i=0; i<strlen(a); i++) printf("%c ",a[i]);

 return 0;

}

*********************************************************

课后习题8.9

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

在主函数中输入字符串以及输出上述结果。 只要结果,别输出什么提示信息。

#include<stdio.h>

#include<string.h>

int str(char p[]) {

 int i=0,a=0,b=0,c=0,d=0;

 while(p[i]!='\0') {

  if(p[i]>='a'&&p[i]<='z'||p[i]>='A'&&p[i]<='Z') {

   (a)++;

  } else if(p[i]>='0'&&p[i]<='9') {

   (b)++;

  } else if(p[i]==' ') {

   (c)++;

  } else {

   (d)++;

  }

  i++;

 }

 printf("%d %d %d %d",a,b,c,d);

 return 0;

}

int main() {

 char p[30];

 gets(p);

 str(p);

}

 

*********************************************************

课后习题9.2

输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。

#include<stdio.h>

#define s(a,b) a%b

 

int main() {

 int x,y;

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

 printf("%d",s(x,y));

 return 0;

}

*********************************************************

课后习题9.3

三角形面积=SQRT(S*(S-a)*(S-b)*(S-c)) 其中S=(a+b+c)/2,a、b、c为三角形的三边。

定义两个带参的宏,一个用来求area,另一个宏用来求S。

写程序,在程序中用带实参的宏名来求面积area。

#include <stdio.h>

#include<math.h>

#define s(a,b,c) (a+b+c)/2

#define area(a,b,c,s) sqrt(s*(s-a)*(s-b)*(s-c))

int main() {

 float x,y,z;

 scanf("%f%f%f",&x,&y,&z);

 printf("%.3f",area(x,y,z,s(x,y,z)));//先算小括号,然后大括号;

 return 0;

}

*********************************************************

课后习题9.4

给年份year,定义一个宏,以判别该年份是否闰年。

提示:宏名可以定义为LEAP_YEAR,形参为y,即定义宏的形式为 #define LEAP_YEAR(y) 

(读者设计的字符串)

#include<stdio.h>

 #define LEAP_YEAR(y) (y%4==0 && y%100!=0) || (y%400==0)?'L':'N'

int main()

{

 int y;

 scanf("%d",&y);

 int l=LEAP_YEAR(y);

 printf("%c",l);

 

 return 0;

}*********************************************************

课后习题9.6

请设计输出实数的格式,包括:⑴一行输出一个实数;

⑵一行内输出两个实数;⑶一行内输出三个实数。实数用"6.2f"格式输出。使用宏定义

#include<stdio.h>

 #define pr1(x) printf("%.2f\n",x)

  #define pr2(x) printf("%6.2f\t%6.2f\n",x,x)

   #define pr3(x) printf("%6.2f\t%6.2f\t%6.2f\n",x,x,x)

 

int main()

{

 float x;

 scanf("%f",&x);

 pr1(x);

 pr2(x);

 pr3(x);

 return 0;

}

*********************************************************

课后习题9.8

分别用函数和带参的宏,从三个数中找出最大的数。

#include<stdio.h>

#define max(a,b,c) a>=(b>=c?b:c)?a:(b>=c?b:c)

int main() {

 float m(float a,float b,float c);

 float t1,t2,a,b,c;

 scanf("%f %f %f",&a,&b,&c);

 t1=max(a,b,c);

 printf("%.3f\n",t1);

 t2=m(a,b,c);

 printf("%.3f",t2);

 return 0;

}

float m(float a,float b,float c) {

 float x;

 x=(a>=(b>=c?b:c)?a:(b>=c?b:c));

 return (x);

}

课后习题9.10

输入一行电报文字,将字母变成其下一字母(如’a’变成’b’……’z’变成’a’其它字符不变)。

#include<stdio.h>

#include<string.h>

int main() {

 char a[50];

 gets(a);

 for(int i=0; i<strlen(a); i++) {

  if(a[i]>='a'&&a[i]<'z'||a[i]>='A'&&a[i]<'Z') {

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

  } else if(a[i]=='z'||a[i]=='Z') {

   a[i]+=1;

  } else a[i]=a[i];

 }

 puts(a);

 return 0;

}

*********************************************************

课后习题10.1

输入三个整数,按由小到大的顺序输出。使用指针

#include<stdio.h>

int main() {

 int a,b,c,t=0;

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

 if(a>b) {

  t=a;

  a=b;

  b=t;

 }

 

 if(a>c) {

  t=a;

  a=c;

  c=t;

 }

 

 if(b>c) {

  t=b;

  b=c;

  c=t;

 }

 

 printf("%d %d %d ",a,b,c);

 return 0;

}

*********************************************************

课后习题10.2

输入三个字符串,按由小到大的顺序输出

#include <stdio.h>

#include<string.h> 

int main()

{

 char a[85],b[85],c[85],t[85];

 while(gets(a)!=NULL) {

  gets(b);//gets()输入函数 gets(c);

//三次比较

  if(strcmp(a,b)>0) {

   strcpy(t,a);

   strcpy(a,b);

   strcpy(b,t);

  }

  if(strcmp(a,c)>0) {

   strcpy(t,a);

   strcpy(a,c);

   strcpy(c,t);

  }

  if(strcmp(b,c)>0) {

   strcpy(t,b);

   strcpy(b,c);

   strcpy(c,t);

  }

  puts(a);//puts()输出函数 puts(b); puts(c);

 }

 return 0;

}

 

 

 

 

*********************************************************

课后习题10.3

输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。

写三个函数; ①输入10个数;②进行处理;③输出10个数。使用指针

#include <stdio.h>

int main() {

 void change(int *x);

 int a[10],i,j;

 for(i=0; i<10; i++) scanf("%d",&a[i]);

 change(a);

 for(i=0; i<10; i++) printf("%d ",a[i]);

}

void change(int *a) {

 int *min,*max,*p,t;

 max=min=a;

 for(p=a+1; p<a+10; p++) if(*p>*max) max=p;

 t=a[9];

 a[9]=*max;

 *max=t;// 最大值与第一个数交换

 for(p=a+1; p<a+10; p++) if(*p<*min) min=p;

 t=a[0];

 a[0]=*min;

 *min=t;// 最小值与第一个数交换

}

*********************************************************

课后习题10.4

有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数。写一函数move:

实现以上功能,在主函数中输入n个数和输出调整后的n个数。

#include<stdio.h>

void move(int *a,int n,int m)

{

 int t[100];

 int i;

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

 {

  t[i]=a[i];

 }

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

 {

  a[i]=t[n-m+i];

 }

 for(i=m;i<n;i++)

 {

  a[i]=t[i-m];

 }

}

 

int main()

{

 int a[20];

 int n,m;

 int i;

 scanf("%d",&n); 

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

  {

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

  }

  scanf("%d",&m);

  move(a,n,m);

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

  {

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

  }

 

 return 0;

}

*********************************************************

课后习题10.5

有n人围成一圈,顺序排号。

从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,

问最后留下的是原来的第几号的那位。使用指针

#include <stdio.h>

int main() {

 int a[50], i, n, count, flag=0;

 scanf("%d", &n);

 count=n;

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

  a[i]=1;//所有人都在圈内,为1

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

  if (i==n+1)

   i=1;//如果i超出了n个人,让他重新回到1

 

  if (a[i]!=0) flag++;

  else continue;

 

  if (flag%3==0) {

   a[i]=0;

   count--;

  }

 

  if (count==1)//表示只剩下一个人在圈内

   break;

 }

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

  if (a[i]!=0)

   printf("%d", i);//注意这里是输出i,一开始写的a[i],调试了老半天

 return 0;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
北理工乐学C语言答案主要包含以下内容: 1. C语言的基础知识:包括C语言的起源和发展、C语言的编译与执行过程、C语言的数据类型、运算符和表达式、控制结构等。这些知识点是学习C语言的基础,掌握好这些知识对于进一步学习和应用C语言非常重要。 2. C语言的语法规则:包括C语言的注释方式、标识符的命名规则、变量的定义和声明、函数的定义和调用等。熟悉和掌握C语言的语法规则可以帮助我们编写出规范的C语言程序,并且减少错误的发生。 3. C语言的输入输出:包括C语言中的标准输入输出函数scanf和printf的使用方法,以及文件的输入输出操作。掌握C语言的输入输出是进行程序开发和调试的基础,也是与用户进行交互的重要手段。 4. C语言的函数与模块化编程:包括C语言中函数的定义、函数的参数传递、函数的返回值等。学会如何使用函数可以使程序的结构更加清晰,提高代码的复用性和可维护性。 5. C语言的数组与指针:包括C语言中数组和指针的概念、数组和指针的使用方法,以及二维数组和指针的关系等。了解和掌握数组和指针的用法可以更好地处理复杂的数据结构和算法。 6. C语言的字符串处理:包括C语言中字符串的定义和表示方法,以及字符串相关的函数库的使用。字符串处理在实际编程中非常常见,掌握字符串处理的技巧可以提升程序的效率和可读性。 北理工乐学C语言答案综合了以上内容,帮助学习者全面理解和掌握C语言的基本知识和技巧,为进一步学习和应用C语言打下坚实的基础。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值