课后习题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;
}