C语言程序设计(谭浩强第五版)——习题

第3章 最简单的C程序设计——顺序程序设计

  1. 购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少月能还清。
    设d为300 000元,p为6000元,r为1%。
    对求得的月份取小数点后一位,对第 2位小数按四舍五入处理。
/*
购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少月能还清。
设d为300 000元,p为6000元,r为1%。
对求得的月份取小数点后一位,对第 2位小数按四舍五入处理。
*/ 
/*
计算还清月数m的公式为:
	m=(lgp-lg(p-d*r))/(lg(1+r))
可以改写为
	m=(lg(p/(p-d*r)))/(lg(1+r)) 
C的库函数中求对数的函数为1og10,是求以10为底的对数,log(p)表示log以e为底的p。 
*/ 

#include<stdio.h> 
#include<math.h>
int main()
{
	float d=300000,p=6000,r=0.01,m;
	m=log10(p/(p-d*r))/log10(1+r);
	printf("m=%6.1f\n",m);
	return 0;
}
  1. 请编程序将 China 译成密码,密码规律是;
    用原来的字母后面第 4个字母代替原来的字母。
/*请编程序将 China 译成密码,密码规律是;
用原来的字母后面第 4个字母代替原来的字母。
例如,字母 A后面第4个字母是 E,用E代替 A。因此,China 应译为 Glmre。
请编一程序,用赋初值的方法使cl,c2,c3,c4,c5这5个变量的值分别为'C','h','i','n','a',
经过运算,使 cl,c2,c3,c4,c5分别变为'G',1','m','r','e'。
分别用 putchar 函数和 printf 函数输出这5个字符。
*/ 

#include<stdio.h> 
int main()
{
	char c1='C',c2='h',c3='i',c4='n',c5='a';
	c1=c1+4;
	c2=c2+4;
	c3=c3+4;
	c4=c4+4;
	c5=c5+4;
	printf("password is %c%c%c%c%c\n",c1,c2,c3,c4,c5) ;
	return 0;
}
  1. 设圆半径r=1.5,圆柱高 h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。
    用 scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后 2位数字。
/*设圆半径r=1.5,圆柱高 h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。
用 scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后 2位数字。
*/ 

#include<stdio.h> 
int main()
{
	float h,r,l,s,sq,vq,vz;
	float pi=3.141526;
	printf("请输入圆半径r,圆柱高h:");
	scanf("%f,%f",&r,&h);
	l=2*pi*r;
	s=r*r*pi;
	sq=4*pi*r*r;
	vq=3.0/4.0*pi*r*r*r;
	vz=pi*r*r*h;
	printf("圆周长为:			l=%6.2f\n",l);
	printf("圆面积为:			s=%6.2f\n",s);
	printf("圆球表面积为:			sq=%6.2f\n",sq);
	printf("圆球体积为:			vq=%6.2f\n",vq);
	printf("圆柱体积为:			vz=%6.2f\n",vz);
}
  1. 编程序,用getchar函数读入两个字符给cl和c2,然后分别用putchar函数和printf 函数输出这两个字符。
/*
编程序,用getchar函数读入两个字符给cl和c2,然后分别用putchar函数和printf 函数输出这两个字符。
思考以下问题∶
(1)变量cl和c2应定义为字符型还是整型?或二者皆可?
(2)要求输出cl和c2值的ASCII码,应如何处理?用putchar函数还是printf函数?
(3)整型变量与字符变量是否在任何情况下都可以互相代替?如∶char cl,c2;与int cl,c2;是否无条件地等价?
*/

#include<stdio.h>
int main()
{
	char c1,c2;
	printf("请输入两个字符c1,c2:");
	c1=getchar();
	c2=getchar();
	printf("用putchar语句输出结果为:");
	putchar(c1);
	putchar(c2);
	printf("\n");
	printf("用printf语句输出结果为:");
	printf("%c %c\n",c1,c2);
	return 0;
}

8(1).

#include<stdio.h>
int main()
{
	int c1,c2;
	printf("请输入两个整数c1,c2:");
	scanf("%d,%d",&c1,&c2);
	printf("按字符输出结果:\n");
	printf("%c,%c\n",c1,c2);
	printf("按ASCII码输出结果为:\n");
	printf("%d,%d\n",c1,c2);
	return 0;
}

8(2).

#include<stdio.h>
int main()
{
	char c1,c2;
	int i1,i2;
	printf("请输入两个字符c1,c2:");
	scanf("%c,%c",&c1,&c2);
	i1=c1;
	i2=c2;
	printf("按字符输出结果:\n");
	printf("%c,%c\n",i1,i2);
	printf("按整数输出结果:\n");
	printf("%d,%d\n",i1,i2);
	return 0;
}

8(3).

#include<stdio.h>
int main()
{
	char c1,c2;
	int i1,i2;
	printf("请输入两个字符i1,i2:");
	scanf("%d,%d",&i1,&i2);
	c1=i1;
	c2=i2;
	printf("按字符输出结果:\n");
	printf("%c,%c\n",c1,c2);
	printf("按整数输出结果:\n");
	printf("%d,%d\n",c1,c2);
	return 0;
}

第4章 选择结构程序设计

  1. 有3个整数a,b,c,由键盘输入,输出其中最大的数。
/*
有3个整数a,b,c,由键盘输入,输出其中最大的数。
*/

#include<stdio.h>
int main()
{
	int a,b,c;
	printf("请输入3个整数:");
	scanf("%d,%d,%d",&a,&b,&c);
	if(a<b)
		if(b<c)
			printf("max=%d\n",c) ;
		else
			printf("max=%d\n",b);
	else if(a<c)
		printf("max=%d\n",c);
	else
		printf("max=%d\n",a);
	return 0;
		
}

4(1).

// 使用条件表达式

#include<stdio.h>
int main()
{
	int a,b,c,temp,max;
	printf("请输入3个整数:");
	scanf("%d,%d,%d,",&a,&b,&c);
	temp=(a>b)?a:b;
	max=(temp>c)?temp:c;
	printf("max=%d\n",max);
	return 0;
}
  1. 从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。
    要求在输入数据后先对其进行检查是否为小于1000的正数。若不是,则要求重新输入。
/*
从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。
要求在输入数据后先对其进行检查是否为小于1000的正数。若不是,则要求重新输入。 
*/

#include<stdio.h>
#include<math.h>
#define M 1000
int main()
{
	int i,k;
	printf("请输入一个小于%d的整数i:",M);
	scanf("%d",&i);
	if(i>M)
	{
		printf("输入的数据不符合要求,请重新输入。");
		scanf("%d",&i) ;
	}
	k=sqrt(i);
	printf("%d的平方根的整数部分是%d\n",i,k);
}

5(1).

// 加入while可以多次检查 

#include<stdio.h>
#include<math.h>
#define M 1000
int main()
{
	int i,k;
	printf("请输入一个小于%d的整数i:",M);
	scanf("%d",&i);
	while(i>M)
	{
		printf("输入的数据不符合要求,请重新输入一个小于%d的整数i:",M);
		scanf("%d",&i) ;
	}
	k=sqrt(i);
	printf("%d的平方根的整数部分是%d\n",i,k);
}
  1. 有一个函数∶
    y=x(x<1)
    y=2x-1 (1≤x<10)
    y=3x-11(x≥10)
    写程序,输入x的值,输出y相应的值。
/*有一个函数∶
y=x(x<1)
y=2x-1 (1≤x<10)
y=3x-11(x≥10)
写程序,输入x的值,输出y相应的值。
*/

#include<stdio.h>
int main()
{
	int x,y;
	printf("输入x:");
	scanf("%d",&x);
	if(x<1)
	{
		y=x;
		printf("x=%3d,	y=x=%d\n",x,y);
	}
	else if(x<10)
	{
		y=2*x-1;
		printf("x=%3d,	y=2*x-1=%d\n",x,y);
	}
	else
	{
		y=3*x-11;
		printf("x=%3d,	y=3*x-11=%d\n",x,y);	
	}
	return 0;
}
  1. 给出一百分制成绩,要求输出成绩等级’A’、‘B’、‘C’、‘D’、‘E’。
    90分以上为’A’,80~89分为’B’,70~70分为’C’,60~69分为’D’,60分以下为’E’。
/*
给出一百分制成绩,要求输出成绩等级'A'、'B'、'C'、'D'、'E'。
90分以上为'A',80~89分为'B',70~70分为'C',60~69分为'D',60分以下为'E'。
*/ 

#include<stdio.h> 
int main()
{
	float score;
	char grade;
	printf("请输入学生成绩:");
	scanf("%f",&score);
	while(score>100|score<0)
	{
		printf("\n输入有误,请重输");
		scanf("%f",&score);
	}
	switch((int)(score/10))
	{
		case 10:
		case 9: grade='A';break;
		case 8: grade='B';break;
		case 7: grade='C';break;
		case 6: grade='D';break;
		case 5:
		case 4:
		case 3:
		case 2:
		case 1:
		case 0:	grade='E';
	}
	printf("成绩是%5.1f,相应的等级是%c\n",score,grade);
	return 0;
}
  1. 给一个不多于5位的正整数,要求∶
    ①求出它是几位数;
    ②分别输出每一位数字;
    ③按逆序输出各位数字,例如原数为321,应输出123。
/*
给一个不多于5位的正整数,要求∶
①求出它是几位数;
②分别输出每一位数字;
③按逆序输出各位数字,例如原数为321,应输出123。
*/

#include<stdio.h>
#include<math.h>
int main()
{
	int num,indiv,ten,hundred,thousand,ten_thousand,place; // 分别代表个位、十位、百位、千位、万位和位数
	printf("请输入一个整数(0~99999):") ;
	scanf("%d",&num);
	if(num>9999)
		place=5;
	else if(num>999)
		place=4;
	else if(num>99)
		place=3;
	else if(num>9)
		place=2;
	else place=1;
	printf("位数:%d\n",place);
	printf("每位数字为:");
	ten_thousand=num/10000;
	thousand=(int)(num-ten_thousand*10000)/1000;
	hundred=(int)(num-ten_thousand*10000-thousand*1000)/100;
	ten=(int)(num-ten_thousand*10000-thousand*1000-hundred*100)/10;
	indiv=(int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10);
	switch(place)
	{
		case 5: 
				printf("%d,%d,%d,%d,%d",ten_thousand,thousand,hundred,ten,indiv);
			 	printf("\n反序数字为:");
			 	printf("%d,%d,%d,%d,%d",indiv,ten,hundred,thousand,ten_thousand);
			 	break;
		case 4: 
				printf("%d,%d,%d,%d",thousand,hundred,ten,indiv);
			 	printf("\n反序数字为:");
			 	printf("%d,%d,%d,%d",indiv,ten,hundred,thousand);
			 	break;
		case 3: 
				printf("%d,%d,%d",hundred,ten,indiv);
			 	printf("\n反序数字为:");
			 	printf("%d,%d,%d",indiv,ten,hundred);
			 	break;
		case 2: 
				printf("%d,%d",ten,indiv);
			 	printf("\n反序数字为:");
			 	printf("%d,%d",indiv,ten);
			 	break;
		case 1: 
				printf("%d",indiv);
			 	printf("\n反序数字为:");
			 	printf("%d",indiv);	 	
				break;
	}
	return 0;
}
  1. 企业发放的奖金根据利润提成。
    利润I低于或等于100 000元的,奖金可提成10%;
    利润高于100 000元,低于200 000元(100 000<I≤200 000)时,低于100 000元的部分按10%提成,
    高于100 000元的部分,可提成7.5%;200 000<I≤400 000 时,低于200 000元的部分仍按上述办法提成(下同)。
    高于 200 000元的部分按5%提成;
    400 000<I≤600 000元时,高于400 000元的部分按3%提成;
    600 000<I≤1 000 000 时,高于600 000元的部分按1.5%提成;
    I>100000时,超过1000 000元的部分按1%提成。
    从键盘输入当月利润I,求应发奖金总数。
    要求∶
    (1)用if语句编程序。(2)用switch语句编程序。
/*
企业发放的奖金根据利润提成。
利润I低于或等于100 000元的,奖金可提成10%;
利润高于100 000元,低于200 000元(100 000<I≤200 000)时,低于100 000元的部分按10%提成,
高于100 000元的部分,可提成7.5%;200 000<I≤400 000 时,低于200 000元的部分仍按上述办法提成(下同)。
高于 200 000元的部分按5%提成;
400 000<I≤600 000元时,高于400 000元的部分按3%提成;
600 000<I≤1 000 000 时,高于600 000元的部分按1.5%提成;
I>100000时,超过1000 000元的部分按1%提成。
从键盘输入当月利润I,求应发奖金总数。
要求∶
(1)用if语句编程序。(2)用switch语句编程序。
*/

#include<stdio.h> 
int main()
{
	int i;
	double bonus,bon1,bon2,bon4,bon6,bon10;
	bon1=100000*0.1;
	bon2=bon1+100000*0.075;
	bon4=bon2+100000*0.05;
	bon6=bon4+100000*0.03;
	bon10=bon6+400000*0.015;
	printf("请输入利润i:");
	scanf("%d",&i);
	if(i<=100000)
		bonus=i*0.1;
	else if(i<=200000)
		bonus=bon1+(i-100000)*0.0075;
	else if(i<=400000)
		bonus=bon2+(i-200000)*0.05;
	else if(i<=1000000)
		bonus=bon4+(i-400000)*0.03;
	else if(i<=1000000)
		bonus=bon6+(i-600000)*0.015;
	else
		bonus=bon10+(i-1000000)	*0.01;
	printf("奖金是:%10.2f\n",bonus);
	return 0;
}

10(2) 用switch语句编程序。

#include<stdio.h> 
int main()
{
	int i;
	double bonus,bon1,bon2,bon4,bon6,bon10;
	int branch;
	bon1=100000*0.1;
	bon2=bon1+100000*0.075;
	bon4=bon2+200000*0.05;
	bon6=bon4+200000*0.03;
	bon10=bon6+400000*0.015;
	printf("请输入利润i:");
	scanf("%d",&i);
	branch=i/100000;
	if(branch>10)branch=10;
	switch(branch)
	{
		case 0:
			bonus=i*0.1;
			break;
		case 1:
			bonus=bon1+(i-100000)*0.075;
			break;
		case 2:
		case 3:
			bonus=bon2+(i-200000)*0.05;
			break;
		case 4:
		case 5:
			bonus=bon4+(i-400000)*0.03;
			break;
		case 6:
		case 7:
		case 8:
		case 9:
			bonus=bon6+(i-600000)*0.015;
			break;
		case 10:
			bonus=bon10+(i-1000000)	*0.01;
	}	
	printf("奖金是:%10.2f\n",bonus);
	return 0;
}
  1. 输入 4个整数,要求按由小到大的顺序输出。
// 输入 4个整数,要求按由小到大的顺序输出。

#include<stdio.h>
int main()
{
	int t,a,b,c,d;
	printf("请输入4个数:");
	scanf("%d,%d,%d,%d",&a,&b,&c,&d);
	printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
	if(a>b)
		{t=a;a=b;b=t;
		}
	if(a>c)
	{
		t=a;a=c;c=t;
	}
	if(a>d)
	{
		t=a;a=d;d=t;
	} 
	if(b>c)
	{
		t=b;b=c;c=t;
	}
	if(b>d)
	{
		t=b;b=d;d=t;
	}
	if(c>d)
	{
		t=c;c=d;d=t;
	}
	printf("排序顺序如下:\n");
	printf("%d	%d	%d	%d	\n",a,b,c,d);
	return 0;
}
  1. 有4个圆塔,圆心分别为(2,2)、(一2,2)、(一2.—2)、(2,—2),圆半径为1 。
    这 4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。
/*
有4个圆塔,圆心分别为(2,2)、(一2,2)、(一2.—2)、(2,—2),圆半径为1 。
这 4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。
 
*/

#include<stdio.h> 
int main()
{
	int h=10;
	float x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=2,y4=-2,x,y,d1,d2,d3,d4;
	printf("请输入一个点(x,y):");
	scanf("%f,%f",&x,&y);
	d1=(x-x4)*(x-x4)+(y-y4)*(y-y4); // 求该点到各中心点距离
	d2=(x-x1)*(x-x1)+(y-y1)*(y-y1); 
	d3=(x-x2)*(x-x2)+(y-y2)*(y-y2);
	d4=(x-x3)*(x-x3)+(y-y3)*(y-y3);
	if(d1>1&&d2>1&&d3>1&&d4>1)h=0;
	printf("该点高度为%d\n",h);
	return 0;
}

第5章 循环结构程序设计

  1. 输入两个正整数m和n,求其最大公约数和最小公倍数。
// 输入两个正整数m和n,求其最大公约数和最小公倍数。

#include<stdio.h>
int main()
{
	int p,r,n,m,temp;
	printf("请输入两个正整数n,m:");
	scanf("%d,%d",&n,&m);
	if(n<m)
	{
		temp=n;
		n=m;
		m=temp;
	}
	p=n*m;
	while(m!=0) 
	{
		r=n%m;
		n=m;
		m=r;
	}
	printf("它们的最大公约数为:%d\n",n);
	printf("它们的最小公倍数为:%d\n",p/n);
	return 0;
}
  1. 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
// 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

#include<stdio.h>
int main()
{
	char c;
	int letters=0,space=0,digit=0,other=0;
	printf("请输入一行字符:\n");
	while((c=getchar())!='\n')
	{
		if(c>='a'&&c<='z'||c>='A'&&c<='Z')
			letters++;
		else if(c==' ')
			space++;
		else if(c>='0'&&c<='9')
			digit++;
		else 
			other++;
	}
	printf("字母数:%d\n空格数:%d\n数字数:%d\n其他字符数:%d\n",letters,space,digit,other);
	return 0;
}
  1. 求S,=a+aa+aaa+…+aa…a(n个a)之值,其中a是一个数字,n表示a的位数,n由键盘输入,
    例如∶2+22+222+2222+22222(此时n=5)
/*
求S,=a+aa+aaa+…+aa…a(n个a)之值,其中a是一个数字,n表示a的位数,n由键盘输入,
例如∶2+22+222+2222+22222(此时n=5)。
*/

#include<stdio.h>
int main()
{
	int a,n,i=1,sn=0,tn=0;
	printf("a,n=:");
	scanf("%d,%d",&a,&n);
		while(i<=n)
		{
			tn=tn+a; // 赋值后的tn为i个a组成数的值
			sn=sn+tn;// 赋值后的sn为多项式前i想之和 
			a=a*10;
			++i;
		 } 
		 printf("a+aa+aaa+...=%d\n",sn);
		 return 0;
}
  1. ∑ n = 1 20 n ! \sum_{n=1}^{20} n! n=120n!(即求1!+2!+3!+4!+…+20!) 。
// 求\sum_{n=1}^{20} n!(即求1!+2!+3!+4!+...+20!) 。

#include<stdio.h> 
int main()
{
	double s=0,t=1;
	int n;
	for(n=1;n<=20;n++)
	{
		t=t*n;
		s=s+t;
	}
	printf("1!+2!+3!+4!+...+20!=%22.15e\n",s);
	return 0;
}
  1. ∑ k = 1 100 k + ∑ k = 1 50 k 2 + ∑ k = 1 10 1 k \sum_{k=1}^{100}k+ \sum_{k=1}^{50}k^2+\sum_{k=1}^{10}\frac{1}{k} k=1100k+k=150k2+k=110k1
// 求\sum_{k=1}^{100}k+ \sum_{k=1}^{50}k^2+\sum_{k=1}^{10}\frac{1}{k}。

#include<stdio.h> 
int main()
{
	int n1=100,n2=50,n3=10;
	double k,s1=0,s2=0,s3=0;
	for(k=1;k<=n1;k++)		// 计算1~100的和 
	{
		s1=s1+k;
	}
	for(k=1;k<=n2;k++)		// 计算1~50个数的平方和 
	{
		s2=s2+k*k;
	}
	for(k=1;k<=n3;k++)		// 计算1~10的各倒数和 
	{
		s3=s3+1/k;
	}
	printf("sum=%15.6f\n",s1+s2+s3);
	return 0;
}
  1. 输出所有的"水仙花数"。所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。
    例如,153 是一水仙花数,因为 153 = 1 3 + 5 3 + 3 3 153=1^3+5^3+3^3 153=1353+33
/*
输出所有的"水仙花数"。所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。
例如,153 是一水仙花数,因为153=1^3+5^3+3^3。
*/

#include<stdio.h>
int main()
{
	int i,j,k,n;
	printf("parcissus numbers are ");
	for(n=100;n<1000;n++)
	{
		i=n/100;
		j=n/10-i*10;
		k=n%10;
		if(n==i*i*i+j*j*j+k*k*k)
			printf("%d ",n);
	}
	printf("\n");
	return 0;
}
  1. 一个数如果恰好等于它的因子之和,这个数就称为"完数"。
    例如,6的因子为1,2,3,而6=1十2十3,因此6是"完数"。
    编程序找出1000之内的所有完数,并按下面格式输出其因子∶
    6 its factors are 1 2 3
/*
一个数如果恰好等于它的因子之和,这个数就称为"完数"。
例如,6的因子为1,2,3,而6=1十2十3,因此6是"完数"。
编程序找出1000之内的所有完数,并按下面格式输出其因子∶
6 its factors are 1 2 3
*/

#include<stdio.h> 
int main()
{
	int s,i,m;
	for(m=2;m<1000;m++)
	{
		s=0;
		for(i=1;i<m;i++)
		{
			if((m%i)==0)
				s=s+i;
		}
		if(s==m)
		{
			printf("%d,its factors are ",m)	;
			for(i=1;i<m;i++)
				if(m%i==0)
					printf("%d ",i);
			printf("\n");
		}	
	}
	return 0;
}
  1. 有一个分数序列∶ 2 1 , 3 2 , 5 3 , 8 5 , 13 8 , 21 13 , . . . \frac{2}{1},\frac{3}{2},\frac{5}{3},\frac{8}{5},\frac{13}{8},\frac{21}{13},... 12,23,35,58,813,1321,...
    求出这个数列的前20项之和。
/*
有一个分数序列∶2/1,3/2,5/3,8/5,13/8,21/13,... 
求出这个数列的前20项之和。
*/ 

#include<stdio.h>
int main()
{
	int i,n=20;
	double a=2,b=1,s=0,t;
	for(i=1;i<=20;i++)
	{
		s=s+a/b;
		t=a;
		a=a+b;
		b=t;
	}
	printf("sum=%16.10f\n",s);
	return 0;
}
  1. 一个球从100m高度自由落下,每次落地后反跳回原高度的一半,再落下,再反弹。
    求它在第 10次落地时,共经过多少米,第10次反弹多高。
/*
一个球从100m高度自由落下,每次落地后反跳回原高度的一半,再落下,再反弹。
求它在第 10次落地时,共经过多少米,第10次反弹多高。
*/

#include<stdio.h>
int main()
{
	double sn=100,hn=sn/2;
	int n;
	for(n=2;n<=10;n++)
	{
		sn=sn+2*hn;		//第n次落地时共经过的米数 
		hn=hn/2;		//第n次反跳高度 
	}
	printf("第10次落地时共经过%f米\n",sn);
	printf("第10次反弹%f米\n",hn);
	return 0;
}
  1. 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘了多少个桃子。
/*
猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,就只剩一个桃子了。
求第1天共摘了多少个桃子。 
*/

#include<stdio.h>
int main()
{
	int day,x1,x2;
	day=9;
	x2=1;
	while(day>0)
	{
		x1=(x2+1)*2;	// 第1天的桃子数时第2天桃子数加1后的2倍 
		x2=x1;
		day--;
	}
	printf("total=%d\n",x1);
	return 0;
}
  1. 用迭代法求 x = a x=\sqrt a x=a 。求平方根的迭代公式为
    x n + 1 = 1 2 ( x n + a x n ) x_{n+1}=\frac{1}{2}(x_n+\frac{a}{x_n}) xn+1=21(xn+xna)
    要求前后两次求出的x的差的绝对值小于 1 0 − 5 10^{-5} 105
/*
用迭代法求x=sqrt(a)。求平方根的迭代公式为
x_{n+1}=\frac{1}{2}(x_n+\frac{a}{x_n})
要求前后两次求出的x的差的绝对值小于10^{-5}。
*/
/*
解∶用迭代法求平方根的算法如下∶
(1)设定一个x的初值x_0;
(2)用以上公式求出x的下一个值x_1;
(3)再将x1代入以上公式右侧的x_n,求出x的下一个值x_2;
(4)如此继续下去,直到前后两次求出的x值(x_n和x_{n+1})满足以下关系∶
|x_{n+1}-x_n|<10^{-5}
为了便于程序处理,今只用x_0和x_1,先令x的初值x_0=a/2(也可以是另外的值),求出x1;
如果此时|x_1-x_0|≥10^{-5},就使x_1→x。,然后用这个新的x。
求出下一个x1;如此反复,直到|x1-x0|<10^{-5}为止。
*/

#include<stdio.h>
#include<math.h> 
int main()
{
	float a,x0,x1;
	printf("enter a positive number:");
	scanf("%f",&a);
	x0=a/2;
	x1=(x0+a/x0)/2;
	do
	{
		x0=x1;
		x1=(x0+a/x0)/2;
	}while(fabs(x0-x1)>=1e-5);
	printf("The square root of %5.2f is %8.5f\n",a,x1);
	return 0;
}

14.用牛顿迭代法求下面方程在1.5附近的根∶
2 ∗ x 3 − 4 ∗ x 2 + 3 ∗ x − 6 = 0 2*x^3-4*x^2+3*x-6=0 2x34x2+3x6=0

/*
用牛顿迭代法求下面方程在1.5附近的根∶
2*x^3-4*x^2+3*x-6=0
*/
/*
解:牛顿迭代法又称牛顿切线法,它采用以下的方法求根∶
先任意设定一个与真实的根接近的值x0 作为第1次近似根,
由 x0求出 f(x0),过(x0,f(x0))点做 f(x)的切线,交 x 轴于x1;
把 x1作为第2次近似根,再由x1求出 f(x1),过(x1,f(x1))点做f(x)的切线,交x轴于x2,
再求出 f(x2),再作切线……如此继续下去,直到足够接近真正的根x^*为止。 

f'(x0)=\frac{f(x0)}{x1-x0}
因此x1=x0-\frac{f(x0)}{f'(x0)}
这就是牛顿迭代公式。可以利用它由 x。求出z,然后由z1 求出x……


在本题中
f(x)= 2*x^3-4*2^2+3*x-6 可以写成以下形式∶
f(x)=((2*x-4)*x+3)*x-6 同样,f(x)可写成
f' (x)=6*x2-8x+3=(6*x-8)*x+3
用这种方法表示的表达式在运算时可节省时间。
例如,求 f(x)只需要进行3次乘法和3次加法;而原来的表达式要经过多次指数运算、对数运算和乘法、加法运算,花费时间较多。

*/

#include<stdio.h>
#include<math.h>
int main()
{
	double x1,x0,f,f1;
	x1=1.5;
	do
	{
		x0=x1;
		f=((2*x0-4)*x0+3)*x0-6;
		f1=(6*x0-8)*x0+3;
		x1=x0-f/f1;
	}while(fabs(x1-x0)>=1e-5);
	printf("The root of equation is %5.2f\n",x1);
	return 0;
}
  1. 用二分法求下面方程在(-10,10)之间的根∶
    2 ∗ x 3 − 4 ∗ x 2 + 3 ∗ x − 6 = 0 2*x^3-4*x^2+3*x-6=0 2x34x2+3x6=0
/*
用二分法求下面方程在(-10,10)之间的根∶
2*x^3-4*x^2+3*x-6=0
*/
/*
解∶二分法的思路为∶先指定一个区间[x1,x2],如果函数f(x)在此区间是单调变化,
可以根据 f(x1)和f(x2)是否同符号来确定方程 f(x)=0在[x1,x2]区间是否有一个实根。
若f(x1)和f(x2)不同符号,则f(x)=0在[x1,x2]区间必有一个(且只有一个)实根;
如果f(x1)和 f(x2)同符号,说明在[x1,x2]区间无实根,要重新改变x1和 x2的值。
当确定[x1,x2]有一个实根后,采取二分法将[x1,x2]区间一分为二,再判断在哪一个小区间中有实根。
如此不断进行下去,直到小区间足够小为止。 
算法如下∶
(1)输入x1和x2的值。
(2)求出f(x1)和f(x2)。
(3)如果 f(x1)和f(x2)同符号,说明在[x1,x2]区间无实根,返回(1),重新输入x1和x2的值;若 f(x1)和f(x2)不同符号,则在[x1,x2]区间必有一个实根,执行(4)。
(4)求x1和 x2间的中点∶x0=(x1+x2)/2。 
(5)求出 f(x0)。
(6)判断 f(x0)与f(x1)是否同符号。
	①如同符号,则应在[x0,x2]中去找根,此时x1已不起作用,用x0代替x1,用f(x0)代替f(x1)。
	②如 f(x0)与f(x1)不同符号,说明应在[x1,x0]中去找根,此时x2已不起作用,用x0代替x2,用f(x0)代替f(x2)。
(7)判断f(x0)的绝对值是否小于某一个指定的值(例如10^{-5})。若不小于10^{-5},就返回(4),重复执行(4)、(5)、(6);若小于10^{-5},则执行(8)。
(8)输出x0的值,它就是所求出的近似根。
*/

#include<stdio.h>
#include<math.h>
int main()
{
	float x0,x1,x2,fx0,fx1,fx2;
	do
	{
		printf("enter x1 & x2:");
		scanf("%f,%f",&x1,&x2);
		fx1=x1*((2*x1-4)*x1+3)-6;
		fx2=x2*((2*x2-4)*x2+3)-6;
	}while(fx1*fx2>0);
	do
	{
		x0=(x1+x2)/2;
		fx0=x0*((2*x0-4)*x0+3)-6;
		if((fx0*fx1)<0)
		{
			x2=x0;
			fx2=fx0;
		}
		else
		{
			x1=x0;
			fx1=fx0;
		}
	}while(fabs(fx0)>=1e-5);
	printf("x=%6.2f\n",x0);
	return 0;
}
  1. 输出以下图案∶
/*
输出以下图案∶
   *
  ***
 *****
*******
 *****
  ***
   *
*/

#include<stdio.h>
int main()
{
	int i,j,k;
	for(i=0;i<=3;i++)
	{
		for(j=0;j<=2-i;j++)
		{
			printf(" ");
		 } 
		for(k=0;k<=2*i;k++)
			printf("*");
		printf("\n");
	}
	for(i=0;i<=2;i++)
	{
		for(j=0;j<=i;j++)	
			printf(" ");
		for(k=0;k<=4-2*i;k++)
			printf("*");
		printf("\n");
	}
	return 0;
}
  1. 两个乒乓球队进行比赛,各出3人。甲队为A,B,C3人,乙队为X,Y,Z3人。
    已抽签决定比赛名单。
    有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程序找出3对赛手的名单。
/*
两个乒乓球队进行比赛,各出3人。甲队为A,B,C3人,乙队为X,Y,Z3人。
已抽签决定比赛名单。
有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程序找出3对赛手的名单。
*/

#include<stdio.h>
int main()
{
	char i,j,k; // i是a的对手,j是b的对手,k是c的对手
	for(i='x';i<='z';i++) 
	{
		for(j='x';j<='z';j++)
		{
			if(i!=j)
				for(k='x';k<='z';k++)
				{
					if(i!=k&&j!=k)
						if(i!='x'&&k!='x'&&k!='z')
						{
							printf("A--%c\nB--%c\nC--%c\n",i,j,k);
							return 0; 
						}

				}
		}
	}
	return 0;
}

第6章 利用数组处理批量数据

  1. 用筛选法求 100 之内的素数。
// 用筛选法求 100 之内的素数。
 
/*
解∶所谓"筛选法"指的是"埃拉托色尼(Eratosthenes)筛法"。埃拉托色尼是古希腊的著名数学家。
他采取的方法是,在一张纸上写上1~1000 的全部整数,然后逐个判断它们是否素数,找出一个非素数,就把它挖掉,最后剩下的就是素数

具体做法如下∶
(1)先将1挖掉(因为1不是素数)。
(2)用2 除它后面的各个数,把能被 2整除的数挖掉,即把2的倍数挖掉。
(3)用3除它后面各数,把3的倍数挖掉。
(4)分别用4,5…各数作为除数除这些数以后的各数。这个过程一直进行到在除数后面的数已全被挖掉为止。

上面的算法可表示为∶
(1)挖去1;
(2)用下一个未被挖去的数 p 除 p后面各数,把p 的倍数挖掉;
(3)检查 p是否小于\sqrt n 的整数部分(如果 n=1000,则检查 p<31是否成立),如果是,则返回(2)继续执行,否则就结束;
(4)剩下的数就是素数。
用计算机解此题,可以定义一个数组 a。
a[1]~a[n]分别代表1~n这n个数。如果检查出数组 a 的某一元素的值是非素数,就使它变为0.最后剩下不为0的就是素数。
*/ 

#include<stdio.h>
#include<math.h>
int main()
{
	int i,j,n,a[101];
	for(int i=1;i<=100;i++)
	{
		a[i]=i;
	}
	a[1]=0;
	for(i=2;i<sqrt(100);i++)
	{
		for(j=i+1;j<=100;j++)
		{
			if(a[i]!=0&&a[j]!=0)
			{
				if(a[j]%a[i]==0)
				{
					a[j]=0;     //挖掉非素数 
				}
			}
		}
	}
	printf("\n");
	for(i=2,n=0;i<=100;i++)
	{
		if(a[i]!=0) 
		{
			printf("%5d",a[i]);
			n++;
		}
		if(n==10)
		{
			printf("\n");
			n=0;
		}
	}
	printf("\n");
	return 0;
}
  1. 用选择法对 10个整数排序。
// 用选择法对 10个整数排序。

/*
解:选择排序的思路为∶设有10个元素 a[1]~a[10],将 a[1]与 a[2~a[10]比较,若a[1]比a[2]~a[10]都小,则不进行交换,即无任何操作。
若 a[2]~a[10]中有一个以上比a[1]小,则将其中最大的一个(假设为a[i]与a[1]交换,此时 a[1]中存放了10个中最小的数。
第 2轮将 a[2]与 a[3]~a[10]比较,将剩下9个数中的最小者a[i]与a[2]对换,此时a[2]中存放的是10个中第二小的数。
依此类推,共进行9轮比较,a[1]~a[10]就已按由小到大的顺序存放了。
*/

#include<stdio.h>
int main()
{
	int i,j,min,temp,a[11];
	printf("enter data:\n");
	for(i=1;i<=10;i++)
	{
		printf("a[%d]=",i);
		scanf("%d",&a[i]);
	}
	printf("\n");
	printf("The orignal numbers:\n");
	for(i=1;i<=10;i++)
	{
		printf("%5d",a[i]);
	}
	printf("\n");
	for(i=1;i<=9;i++)
	{
		min=i;
		for(j=i+1;j<=10;j++)
		{
			if(a[min]>a[j])
			{
				min=j;
			}
		}
		temp=a[i];
		a[i]=a[min];
		a[min]=temp;
	}
	printf("\nThe sorted numbers:\n");
	for(i=1;i<=10;i++)
	{
		printf("%5d",a[i]);
	}
	printf("\n");
	return 0;
}
  1. 求一个3×3的整型矩阵对角线元素之和。
// 求一个3×3的整型矩阵对角线元素之和。

#include<stdio.h> 
int main()
{
	int a[3][3],sum=0;
	int i,j;
	printf("enter data:\n");
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
			scanf("%3d",&a[i][j]);
		}
	}
	for(i=0;i<3;i++)
	{
		sum=sum+a[i][i];
	}
	printf("sum=%6d\n",sum);
	return 0;
}
  1. 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。
// 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。

/*
解∶假设数组 a有n个元素,而且已按升序排列,在插入一个数时按下面的方法处理∶
(1)如果插人的数 num 比 a数组最后一个数大,则将插入的数放在 a数组末尾。
(2)如果插入的数 num不比 a 数组最后一个数大,则将它依次和a[0]~a[n-1]比较,
直到出现a[i]>num为止,这时表示 a[0]~a[i-1]各元素的值比 num小,a[i]~a[n-1]各元素的值比num大。


*/
#include<stdio.h>
int main()
{
	int a[11]={1,4,6,9,13,16,19,28,40,100};
	int temp1,temp2,number,end,i,j;
	printf("array a:\n");
	for(i=0;i<10;i++)
	{
		printf("%5d",a[i]);
	}
	printf("\n");
	printf("insert data:");
	scanf("%d",&number);
	end=a[9];
	if(number>a[9])
	{
		a[10]=number;
	}
	else
	{
		for(i=0;i<10;i++)
		{
			if(a[i]>number)
			{
				temp1=a[i];
				a[i]=number;
				for(j=i+1;j<11;j++)
				{
					temp2=a[j];
					a[j]=temp1;
					temp1=temp2;
				}
				break;
			}
		}
	}
	printf("New array a:\n");
	for(i=0;i<11;i++)
	{
		printf("%5d",a[i]);
	}
	printf("\n");
	return 0;
}
  1. 将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。
    要求改为1,4,5,6,8。
/*
将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。
要求改为1,4,5,6,8。

*/ 

#include<stdio.h> 
#define N 5
int main()
{
	int a[N],i,temp;
	printf("enter array a:\n");
	for(i=0;i<N;i++)
	{
		scanf("%d",&a[i]);
	}
	printf("array a:\n");
	for(i=0;i<N;i++)
	{
		printf("%4d",a[i]);
	}
	for(i=0;i<N/2;i++)
	{
		temp=a[i];
		a[i]=a[N-i-1];
		a[N-i-1]=temp;
	}
	printf("\nNow,array a:\n");
	for(i=0;i<N;i++)
	{
		printf("%4d",a[i]);
	}
	printf("\n");
	return 0;
}
  1. 输出杨辉三角(要求输出十行)
// 输出杨辉三角(要求输出十行) 
/*
杨辉三角各行系数有以下规律:
(1)各行第一个数都是1。
(2)各行最后一个数都是1。
(3)从第三行起,除了上面指出的第一个数和最后一个数外,其余各数是上一行同列和前一列
两个数之和。
a[i][j]=a[i-1][j]+a[i-1][j-1] 
*/
#include<stdio.h>
#define N 10
int main()
{
	int i,j,a[N][N];
	for(i=0;i<N;i++)
	{
		a[i][i]=1; 	// 对角线上元素值为1
		a[i][0]=1; // 第1列元素值为1 
	}
	for(i=2;i<N;i++)
		for(j=1;j<=i-1;j++)
		{
			a[i][j]=a[i-1][j-1]+a[i-1][j];
		}
	for(i=0;i<N;i++)
	{
		for(j=0;j<=i;j++)
		{
			printf("%6d",a[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	return 0;
}
  1. 输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。
    例如,三阶魔方阵为
    8 1 6
    3 5 7
    4 9 2
    要求输出1~n^2的自然数构成的魔方阵。
/*
输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。
例如,三阶魔方阵为
8 1 6 
3 5 7 
4 9 2
要求输出1~n^2的自然数构成的魔方阵。

*/

/*
解:魔方阵中各数的排列规律如下:
(1)1放在第一行中间一列。
(2)从2开始至n*n为止,各数依次按此规则存放:每一个数存放的行比前一个数的行数减一,
列数加一。
(3)如果上一个数的行数是1,则下一个数的行数是n。
(4)上一个数的列数为n时,下一个数的列数为1,行数减一。
(5) 如果按上面规则确定的位置上已经有数,或者上一个数时第1行第n列时,则把下一个数
放在上一个数的下面。 
*/

#include<stdio.h> 
int main()
{
	int a[15][15],i,j,k,p,n;
	p=1;
	while(p==1)
	{
		printf("enter n(n=1--15):"); 
		scanf("%d",&n) ;
		if((n!=0)&&(n<15)&&(n%2!=0))
		{
			p=0;
		}
	}
	// 初始化
	for(i=1;i<=n;i++) 
	{
		for(j=1;j<=n;j++)
		{
			a[i][j]=0;
		}
	}
	// 建立魔方阵 
	j=n/2+1;
	a[1][j]=1;
	for(k=2;k<=n*n;k++)
	{
		i=i-1;
		j=j+1;
		if((i<1)&&(j>n))
		{
			i=i+2;
			j=j-1;
		}
		else
		{
			if(i<1)i=n;
			if(j>n)j=1;
		}
		if(a[i][j]==0)
		{
			a[i][j]=k;
		}
		else{
			i=i+2;
			j=j-1;
			a[i][j]=k;
		}
	}
	// 输出魔方阵
	for(i=1;i<=n;i++) 
	{
		for(j=1;j<=n;j++)
		{
			printf("%5d",a[i][j]);
		}
		printf("\n");
	}
	return 0;
}
 
  1. 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。
// 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。

/*
解:先找出一行中值最大的元素,然后检查它是否为该列中的最小值,如果是,则是鞍点(不需要再找别的鞍点了),
输出该鞍点,如果不是,再找下一行的最大数……如果每一行的最大数都不是鞍点,则此数组无鞍点。 
*/ 

#include<stdio.h>
#define N 4
#define M 5		// 数组为4行5列
 
int main()
{
	int i,j,k,a[N][M],max,maxj,flag;
	printf("please input matrix:\n");
	for(i=0;i<N;i++) 	// 输入数组
	{
		for(j=0;j<M;j++)
		{
			scanf("%d",&a[i][j]);
		}
	 } 
	 for(i=0;i<N;i++)
	 {
	 	max=a[i][0];	// 开始时假设a[i][0]最大 
	 	maxj=0;			// 将列号0赋给maxj保存
		for(j=0;j<M;j++) 	// 找出第i行中的最大数
		{
			if(a[i][j]>max)
			{
				max=a[i][j]; // 本行最大数存在max中 
				maxj=j;		// 将最大数所在的列数存在maxj中 
			}
		 } 
		flag=1;
		for(k=0;k<N;k++)
		{
			if(max>a[k][maxj]) // 将最大数和其同列元素相比
			{
				flag=0;
				continue;
			 } 
		}
		if(flag) 
		{
			printf("a[%d][%d]=%d\n",i,maxj,max);
			break;
		}
	}
		if(!flag)
		{
			printf("It is not exist!\n");
		 } 
		return 0;
}

/*
测试1
please input matrix:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
a[0][4]=5 
*/
/*
测试2 
please input matrix:
1 2 3 4 11
2 4 6 8 12
3 6 9 19 15
4 8 12 16 7
It is not exist!
*/

  1. 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出"无此数"。
// 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出"无此数"。
 
#include<stdio.h> 
#define N 15
int main()
{
	int i,number,loca,top,bott,mid,a[N],flag=-1,sign;
	char c;
	printf("enter data:\n");
	scanf("%d",&a[0]);
	i=1;
	while(i<N)
	{
		scanf("%d",&a[i]);
		if(a[i]>=a[i-1])
			i++;
		else
			printf("enter this data again:\n");
	}
	printf("\n");
	for(i=0;i<N;i++)
	{
		printf("%5d",a[i]);
	}
	printf("\n");
	while(flag)
	{
		printf("input number to look for:");
		scanf("%d",&number);
		sign=0; // sign=0表示尚未找到
		top=0;
		bott=N-1;
		if((number<a[0])||(number>a[N-1]))
			loca=-1;	// 超范围 
		while((!sign)&&(top<=bott))
		{
			mid=(bott+top)/2;
			if(number==a[mid])
			{
				loca=mid;
				printf("Has found %d, its position is %d\n",number,loca+1);
				sign=1;
			}
			else if(number<a[mid])
				bott=mid-1;
			else 
				top=mid+1;
		}
		if(!sign||loca==-1)
			printf("cannot find %d.\n",number);
		printf("continue or not(Y/N)?");
		scanf(" %c",&c);
		if(c=='N'||c=='n')
			flag=0;
	}
	return 0;
}
  1. 有一篇文章,共有3行文字,每行有 80个字符。要求分别统计出其中英文大写母、小写字母、数字、空格以及其他字符的个数。
// 有一篇文章,共有3行文字,每行有 80个字符。要求分别统计出其中英文大写母、小写字母、数字、空格以及其他字符的个数。 

#include<stdio.h> 
int main()
{
	int i,j,upp,low,dig,spa,oth;
	char text[3][80];
	upp=low=dig=spa=oth=0;
	for(i=0;i<3;i++)
	{
		printf("please input line %d:\n",i+1);
		gets(text[i]);
		for(j=0;j<80&&text[i][j]!='\0';j++)
		{
			if(text[i][j]>='A'&&text[i][j]<='Z')
				upp++;
			else if(text[i][j]>='a'&&text[i][j]<='z')
				low++;
			else if(text[i][j]>='0'&&text[i][j]<='9')
				dig++;
			else if(text[i][j]==' ')
				spa++;
			else
				oth++;
		}
	}
	printf("\nupper case: %d\n",upp);
	printf("lower case: %d\n",low);
	printf("digit     : %d\n",dig);
	printf("space     : %d\n",spa);
	printf("other     : %d\n",oth);
	return 0;
}
  1. 输出以下图案。
/* 输出以下图案。

      *****
       *****
        *****
         *****
          *****
*/
#include<stdio.h> 
int main()
{
	char a[5]={'*','*','*','*','*'};
	int i,j,k;
	char space=' ';
	for(i=0;i<5;i++)
	{
		printf("\n");
		printf("      ");
		for(j=1;j<=i;j++)
			printf("%c",space);
		for(k=0;k<5;k++)
			printf("%c",a[k]);
	}
	printf("\n");
	return 0;
}
  1. 有一行电文,已按下面规律译成密码∶
    A→Z a→z B→Y b→y C→X c→x :
    即第1个字母变成第 26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要
    求编程序将密码译回原文,并输出密码和原文。
/*
有一行电文,已按下面规律译成密码∶
A→Z a→z B→Y b→y C→X c→x :
即第1个字母变成第 26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要
求编程序将密码译回原文,并输出密码和原文。
*/

// 用两个字符数组分别存放原文和密码

#include<stdio.h> 
int main()
{
	int j,n;
	char ch[80],tran[80];
	printf("input cipher code:");
	gets(ch);
	printf("\ncipher code  :%s",ch);
	j=0;
	while(ch[j]!='\0')
	{
		if((ch[j]>='A')&&(ch[j]<='Z'))
			tran[j]=155-ch[j];
		else if((ch[j])>='a'&&(ch[j]<='z'))
			tran[j]=219-ch[j];
		else 
			tran[j]=ch[j];
		j++;
	}
	n=j;
	printf("\noriginal text:");
	for(j=0;j<n;j++)
		putchar(tran[j]);
	printf("\n");
	return 0;
}

12.(1) 只用一个字符数组

// 只用一个字符数组

#include<stdio.h> 
int main()
{
	int j,n;
	char ch[80];
	printf("input cipher code:\n");
	gets(ch) ;
	printf("\ncipher code:%s\n",ch);
	j=0;
	while(ch[j]!='\0') 
	{
		if((ch[j]>'A')&&(ch[j]<='Z'))
			ch[j]=155-ch[j];
		else if((ch[j]>='a')&&(ch[j]<='z')) 
			ch[j]=219-ch[j];
		else 
			ch[j]=ch[j];
		j++;
	}
	n=j;
	printf("original text:");
	for(j=0;j<n;j++)
		putchar(ch[j]);
	printf("\n");
	return 0;
}
  1. 编一程序,将两个字符串连接起来,不要用strcat函数。
// 编一程序,将两个字符串连接起来,不要用strcat函数。

#include<stdio.h>
int main()
{
	char s1[80],s2[40];
	int i=0,j=0;
	printf("input string1:");
	scanf("%s",s1);
	printf("input string2:");
	scanf("%s",s2);
	while(s1[i]!='\0')
		i++;
	while(s2[j]!='\0')
	{
		s1[i++]=s2[j++];
	}
	s1[i]='\0';
	printf("\nThe new string is:%s\n",s1);
	return 0;
 } 
  1. 编一个程序,将两个字符串sl和 s2 比较,若s1>s2,输出一个正数;若sl=s2,输出0;若s1<s2,输出一个负数。
    不要用strcpy 函数。两个字符串用gets 函数读入。输
    出的正数或负数的绝对值应是相比较的两个字符串相应字符的 ASCII码的差值。
    例如,“A"与"C"相比,由于"A”<“C”,应输出负数,同时由于’A’与’C’的 ASCII码差值为 2,因此应输出-2。同
    理∶"And"和"Aid"比较,根据第 2个字符比较结果,'n’比’i’大5,因此应输出5。
/*
编一个程序,将两个字符串sl和 s2 比较,若s1>s2,输出一个正数;若sl=s2,输出0;若s1<s2,输出一个负数。
不要用strcpy 函数。两个字符串用gets 函数读入。输
出的正数或负数的绝对值应是相比较的两个字符串相应字符的 ASCII码的差值。
例如,"A"与"C"相比,由于"A"<"C",应输出负数,同时由于'A'与'C'的 ASCII码差值为 2,因此应输出-2。同
理∶"And"和"Aid"比较,根据第 2个字符比较结果,'n'比'i'大5,因此应输出5。 
*/

#include<stdio.h> 
int main()
{
	int i,resu;
	char s1[100],s2[100];
	printf("input string1:");
	gets(s1);
	printf("\ninput string2:");
	gets(s2);
	i=0;
	while((s1[i]==s2[i])&&(s1[i]!='\0'))
		i++;
	if(s1[i]=='\0'&&s2[i]=='\0')
		resu=0;
	else
		resu=s1[i]-s2[i];
	printf("\nresult:%d.\n",resu);
	return 0;
}
  1. 编写一个程序,将字符数组 s2 中的全部字符复制到字符数组 sl中。不用 strcpy 函数。
    复制时,‘\0’也要复制过去。’\0’后面的字符不复制。
/*
编写一个程序,将字符数组 s2 中的全部字符复制到字符数组 sl中。不用 strcpy 函数。
复制时,'\0'也要复制过去。'\0'后面的字符不复制。
*/

#include<stdio.h>
#include<string.h>
int main()
{
	char s1[80],s2[80];
	int i;
	printf("input s2:");
	scanf("%s",s2);
	for(i=0;i<=strlen(s2);i++)
		s1[i]=s2[i];
	printf("s1:%s\n",s1);
	return 0;
}
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值