一. PTA测试题
PTA:5.1小结测试题
第一版:
#include <stdio.h>
#include <math.h>
int main(){
double pi,e;
scanf("%lf",&e);
double funpi(double a);
pi=funpi(e);
printf("pi = %f",pi);
return 0;
}
double funpi(double a){
double m=1.0,n=0.0,b=1.0;
double flag=1.0;
do{
b=b+2.0;
flag=-flag;
n=flag*1.0/b;
m=m+n;
}while(fabs(n)>=a);
m=m+n;
m=m*4;
return m;
}
运行结果:
看出来错哪里了吗?
dowhile循环结束后就不应该加m=m+n;了,在循环内已经加过了。如果是用while循环才用加。(当时有点背题了,不带脑子了)
感觉现在做题还是慢得不行啊,一是自己的脑子不够集中,二是思考的时候思路不连贯,太零散。
正确版
#include <stdio.h>
#include <math.h>
int main(){
double pi,e;
scanf("%lf",&e);
double funpi(double a);
pi=funpi(e);
printf("pi = %f",pi);
return 0;
}
double funpi(double a){
double m=1.0,n=0.0,b=1.0;
double flag=1.0;
do{
b=b+2.0;
flag=-flag;
n=flag*1.0/b;
m=m+n;
}while(fabs(n)>=a);
m=m*4;
return m;
}
PTA:5.3小结测试题
R1-2 全局变量只能定义在程序的最前面,即第一个函数的前面。(对 )错
错因总结
忘了吧,全局变量定义在函数外即可,定义在程序头,程序尾,或程序中间。
R2-1
下列程序的输出结果是( D )。正确答案:C
# include <stdio.h>
int f(int n)
{
static int k, s;
n--;
for(k=n; k>0; k--)
s += k;
return s;
}
int main(void)
{
int k;
k=f(3);
printf("(%d,%d)", k, f(k));
return 0;
}
A.(6,6) B.(6,12) C.(3,6) D.(3,3)
错因总结:我是先算出了f(3)=3,认为既然k=3后,f(k)应该也是等于3。然而此时的f(3)已经不等于3了,因为k的值已经是3,而k又为静态常量。所以此时的f(3)应当等于6.
2-2
函数f定义如下,执行语句“sum=f(5)+f(3);”后,sum的值应为( B )。正确答案:C
int f(int m)
{
static int i=0;
int s=0;
for(;i<=m;i++)
s+=i;
return s;
}
A.16 B.21 C.15 D.8
错因分析:
算完f(5)后,i=5,算f(3),i=5>3, f(3)都进不了循环。
PTA函数最终测试题
选择题:
R2-1
下列程序的输出结果是(D)。
fun(int a, int b, int c)
{
c = a * b; }
int main(void)
{
int c;
fun(2, 3, c);
printf(“%d\n”, c);
return 0;
}
(1分)
A.0 B.1 C.6 D.无法确定
题目解析:函数只能传数值,不能传变量。主函数中的函数c与定义中的函数c不相通,不能用名字相同的变量c传递。这题的printf c的值应该是int c之后随便塞进来的。
R2-4
在C语言程序中,若对函数类型未加显式说明,则函数的隐含类型为(C)。记住啊
A.void B.double C.int D.char
R2-5
以下不正确的说法是(D )。C,形参只能是变量
A.形参应与对应的实参类型一致
B.实参可以是任何类型
C.形参可以是常量、变量或表达式
D.实参可以是常量、变量或表达式
填空题:
R5-1
输出 80 到 120之间的满足给定条件的所有整数。条件为构成该整数的每位数字都相同,要求定义和调用函数is(n)判断整数n的每位数字是否都相同,若相同则返回1,否则返回0。请将函数补充完整。 运行示例: 88 99 111
在#include <stdio.h>
int main(void)
{
int i;
int is(int n);
for(i = 80; i <= 120; i++)
if( is(i) )
printf("%d ", i);
printf("\n");
return 0;
}
int is(int n)
{
int old, digit;
old = n % 10;
do{
digit = n % 10;
if( digit!=old//填空) return 0;
old=digit;//填空
n = n / 10;
}while(n != 0);
return 1; //填空
}
做题情况分析:
是的,我居然第一,第二个空都没有填出来。
因为脑子里想的是 digit==old,但是这又和后面的return 0;不相搭配。想到了 digit!=old,但是第一个 old = n % 10,digit = n % 10得出来得都是最后一位数,又觉得这样写没意义。
结果分析::
看来答案后发觉第一轮循环是真的没用,但是后面的数值交换后就有用了。懂了,本题的设计思想就是第一轮走空(可以走空不能走错噢,循环体给后面的几轮数值用。
R5-2
输入一个整数,将它逆序输出。要求定义并调用函数reverse(long number),它的功能是返回number的逆序数。例如reverse(12345)的返回值是54321。请将函数补充完整。运行示例如下:
-123 (输入整数-123)
-321 (逆序后输出-321)
自己填的第一版:
long reverse(long number)
{
int flag;
int res
;
flag = number < 0 ? -1 : 1;
if( flag==-1// ) number = - number;
while(number != 0){
res = number%10;//这里错了 答案:res = number%10+res;
number /= 10;//
}
return flag*res;
}
这题是一整个数一起输出,不是单位输出的。
二.PTA习题集
7-29 二分法求多项式单根
给我重做
写题过程:
第一版:完全没有考虑两端是根
#include <stdio.h>
double a1,a2,a3,a0;//定义全局变量,差点把这4个数当函数写,发现这种函数写不出来
double f(double x);
int main(){
double a,b,mid;
scanf("%lf %lf %lf %lf",&a1,&a2,&a3,&a0);
scanf("%lf %lf",&a,&b);
if(f(a)*f(b)<0){
mid=(a+b)/2;
while(f(mid)!=0){
//据题目意思,f(mid)为0时,mid为根
if(f(mid)*f(b)<0){
a=mid;
}
else if(f(mid)*f(a)<0){
b=mid;
}
mid=(a+b)/2;
}
printf("%.2f",mid);
}
return 0;
}
double f(double x){
double result;
result=a1*x*x*x+a2*x*x+a3*x+a0;
return result;
}
第二版:
#include <stdio.h>
double a1,a2,a3,a0;
double f(double x);
int main(){
double a,b,mid;
scanf("%lf %lf %lf %lf",&a1,&a2,&a3,&a0);
scanf("%lf %lf",&a,&b);
if(f(a)*f(b)<=0){
mid=(a+b)/2;
if (f(a) == 0) //判断两端根部分
{
printf("%.2f",&a);
return 0;
}
if (f(b) == 0)
{
printf("%.2f", b);
return 0;
}
while(f(mid)!=0){
if(f(mid)*f(b)<0){
a=mid;
}
else if(f(mid)*f(a)<0){
b=mid;
}
mid=(a+b)/2;
}
printf("%.2f",mid);
}
return 0;
}
double f(double x){
double result;
result=a1*x*x*x+a2*x*x+a3*x+a0;
return result;
}
第三版:能通过测试的版本
#include <stdio.h>
double a1,a2,a3,a0;
double f(double x);
int main(){
double a,b,mid;
scanf("%lf %lf %lf %lf",&a1,&a2,&a3,&a0);
scanf("%lf %lf",&a,&b);
if(f(a)*f(b)<=0){
mid=(a+b)/2;
if (f(a