在教学中积累的习题及参考答案,想与同行分享
1、求一元二次方程的根(root.cpp) #include "stdio.h" #include "math.h" main()
{ float a,b,c,d,x1,x2,p,q; scanf("%f,%f,%f",&a,&b,&c); if (fabs(a)<=1e-6)
printf("is not a quadratic\n"); else
{d=b*b-4*a*c; if (fabs(d)<=1e-6)
printf("has two equal roots:%8.4f\n",-b/(2*a)); else
if (d>1e-6) {x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); printf("has two real roots:\n");
printf("x1=%8.4f and x2=%8.4f\n",x1,x2);
}
else
{p=-b/(2*a); q=sqrt(-d)/(2*a); printf("has complex roots:\n"); printf("x1=%8.4f+%8.4fi\n",p,q); printf("x2=%8.4f-%8.4fi\n",p,q); }
} }
在教学中积累的习题及参考答案,想与同行分享
2、已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与利润提成的关系如下(计量单位:元):
profit≤1000
没有提成;
提成10%; 提成15%; 提成20%;
1000<profit≤2000 2000<profit≤5000 5000<profit≤10000 10000<profit
提成25%。
算法设计要点: 为使用switch语句,必须将利润profit与提成的关系,转换成某些整数与提成的关系。分析本题可知,提成的变化点都是1000的整数倍(1000、2000、5000、 ),如果将利润profit整除1000,则当: profit≤1000 对应0、1 1000<profit≤2000 对应1、2
2000<profit≤5000 对应2、3、4、5
5000<profit≤10000 对应5、6、7、8、9、10 10000<profit 对应10、11、12、
为解决相邻两个区间的重叠问题,最简单的方法就是:利润profit先减1(最小增量),然后再整除1000即可: profit≤1000 对应0 1000<profit≤2000 对应1 2000<profit≤5000 对应2、3、4 5000<profit≤10000 对应5、6、7、8、9 10000<profit 对应10、11、12、……
main()
{ long profit; int grade; float salary=500; printf("Input profit: "); scanf("%ld", &profit);
grade= (profit–1) / 1000; /*利润-1再整除1000,转化成switch中的case标号 */
switch(grade)
{ case 0: break; /*profit≤1000 */ case 1: salary += profit*0.1; break;
/*1000<profit≤2000 */
在教学中积累的习题及参考答案,想与同行分享
case 2: case 3:
case 4: salary += profit*0.15; break; /*2000<profit≤5000 */ case 5: case 6: case 7: case 8:
case 9: salary += profit*0.2; break; /*5000<profit≤10000 */ default: salary += profit*0.25; }
printf("salary=%.2f\n", salary);
}
/*10000<profit */
3、求一个数的阶乘(lx5_00.cpp) #include "stdio.h" main()
{int i;float p=1; for (i=1;i<=50;i++) p=p*i;
printf("%le",p); /*输出用指数形式表示*/ } 4、译密码:译码有约定:即将输入的字母译成该字母之后的第四个字母,其它字符不变,
如A译成E,a译成z,China!择成Glmre!,参考程序如下:(lx5_0.cpp)
#include "stdio.h" main() {char c;
while ((c=getchar())!='\n')
{if (c>='a' && c<='z' || c>='A' && c<='Z') {c=c+4;
if (c>'Z' && c<='Z'+4 || c>'z') c=c-26; }
printf("%c",c); }
printf("\n"); }
5、求Fibonacci数列的前40个数。(lx5_1.cpp)
在教学中积累的习题及参考答案,想与同行分享
分析:该数列的生成方法为:F1=1,F2=1,Fn=Fn-1+Fn-2(n>=3),即从第3个数开始,每个数等于前2个数之和。
main()
{ long int f1=1,f2=1;
int i=1; /*定义并初始化循环控制变量i*/ for( ; i<=20; i++ ) /*1组2个,20组40个数*/ { printf(“%15ld%15ld”, f1, f2); /*输出当前的2个数*/ if(i%2==0) printf(“\n”); /*输出2次(4个数),换行*/ f1 += f2; f2 += f1; /*计算下2个数*/ }
}
6、输出10~100之间的全部素数。(lx5_2.cpp)
分析:所谓素数n是指除1和n之外,不能被2~(n-1)之间的任何整数整除。
main()
{ int i=11, j, counter=0;
for( ; i<=100; i+=2) /*外循环:为内循环提供一个整数i*/ { for(j=2; j<=i-1; j++) /*内循环:判断整数i是否是素数*/ if(i%j==0) /*i不是素数:因为能被2~(i-1)之间的某个数整除*/ break; /*强行结束内循环,执行下面的if语句*/ if(counter%10==0) /*每输出10个数换一行*/ printf("\n");
if( j >= i ) /*整数i是素数:输出,计数器加1*/ { printf("%6d",i); counter++; } }
}
在教学中积累的习题及参考答案,想与同行分享
7、输出九九乘法表 (lx5_3.cpp) main() { int i,j,p=1; for (j=1;j<=9;j++) { printf("\n"); for (i=1;i<=j;i++) { p=j*i;
printf("\t%d*%d=%d",i,j,p); } } }
8、输入一行字符,分别统计出其中的英文字母、空格、数字和其它字符的个数。#include"stdio.h" (zy5_2.cpp) main() { char c;
int letter=0,space=0,number=0,other=0; printf("input a row of letter:\n"); while ((c=getchar())!='\n')
{ if (c>='a' && c<='z'||c>='A' && c<='Z') letter++; else if (c==' ') space++;
else if (c>='0' && c<='9') number++;