C语言程序设计(谭浩强第五版)——习题
第3章 最简单的C程序设计——顺序程序设计
- 购房从银行贷了一笔款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;
}
- 请编程序将 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;
}
- 设圆半径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);
}
- 编程序,用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章 选择结构程序设计
- 有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;
}
- 从键盘输入一个小于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);
}
- 有一个函数∶
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;
}
- 给出一百分制成绩,要求输出成绩等级’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;
}
- 给一个不多于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;
}
- 企业发放的奖金根据利润提成。
利润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;
}
- 输入 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;
}
- 有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章 循环结构程序设计
- 输入两个正整数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;
}
- 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
// 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
#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;
}
- 求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;
}
- 求 ∑ 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;
}
- 求 ∑ 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;
}
- 输出所有的"水仙花数"。所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。
例如,153 是一水仙花数,因为 153 = 1 3 + 5 3 + 3 3 153=1^3+5^3+3^3 153=13+53+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;
}
- 一个数如果恰好等于它的因子之和,这个数就称为"完数"。
例如,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;
}
- 有一个分数序列∶ 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;
}
- 一个球从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天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第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;
}
- 用迭代法求 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} 10−5。
/*
用迭代法求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 2∗x3−4∗x2+3∗x−6=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;
}
- 用二分法求下面方程在(-10,10)之间的根∶
2 ∗ x 3 − 4 ∗ x 2 + 3 ∗ x − 6 = 0 2*x^3-4*x^2+3*x-6=0 2∗x3−4∗x2+3∗x−6=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;
}
- 输出以下图案∶
/*
输出以下图案∶
*
***
*****
*******
*****
***
*
*/
#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;
}
- 两个乒乓球队进行比赛,各出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章 利用数组处理批量数据
- 用筛选法求 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;
}
- 用选择法对 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;
}
- 求一个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;
}
- 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。
// 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。
/*
解∶假设数组 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;
}
- 将一个数组中的值按逆序重新存放。例如,原来顺序为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。
(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;
}
- 输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。
例如,三阶魔方阵为
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;
}
- 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。
// 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。
/*
解:先找出一行中值最大的元素,然后检查它是否为该列中的最小值,如果是,则是鞍点(不需要再找别的鞍点了),
输出该鞍点,如果不是,再找下一行的最大数……如果每一行的最大数都不是鞍点,则此数组无鞍点。
*/
#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!
*/
- 有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;
}
- 有一篇文章,共有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;
}
- 输出以下图案。
/* 输出以下图案。
*****
*****
*****
*****
*****
*/
#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;
}
- 有一行电文,已按下面规律译成密码∶
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;
}
- 编一程序,将两个字符串连接起来,不要用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;
}
- 编一个程序,将两个字符串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;
}
- 编写一个程序,将字符数组 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;
}