2022/2/5——浙大版《C语言程序设计(第3版)》题目集PAT错题记录(做了19道题)

习题2-4 求交错序列前N项和 (15 分)

  int i, N, flag = 1;
    float sum = 0;
    sum += i / (2 * i - 1.0) * flag;//左边是浮点型,右边是整形,要把1变成1.0完成类型转换

习题2-6 求阶乘序列前N项和 (15 分)

本题要求编写程序,计算序列 1!+2!+3!+⋯ 的前N项之和。

输入格式:

输入在一行中给出一个不超过12的正整数N。

输出格式:

在一行中输出整数结果。

输入样例:

5

输出样例:

153

//一定要细心!1.忘了加函数的参数类型 2.阶乘的sum初值为1不是0 3.忘了写输出函数 4.函数的参数值是i不是N

#include <stdio.h>
int fact(int n);
int main()
{
    int i, N, sum = 0;
    scanf("%d", &N);
    for(i = 1; i <= N; i++)
    {
        sum += fact(i);
    }
    printf("%d", sum);
    return 0;
}

int fact(int n)
{
    int i, sum = 1;
    for(i = 1; i <= n; i++)
    {
        sum *= i;
    }
    return sum;
}

练习3-3 统计学生平均成绩与及格人数 (15 分)

本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。

输入格式:

输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。

输出格式:

按照以下格式输出:

average = 成绩均值
count = 及格人数

其中平均值精确到小数点后一位。

输入样例:

5
77 54 92 73 60

输出样例:

average = 71.2
count = 4

//要考虑N==0的情况,此事 sum/N 不存在,且最开始还没讲到数组,用如下代码可以代替

int score, sum = 0;

for(int i = 0; i < N; i++)
{
    scanf("%d", &score);
    sum += score;
}

代码如下:

#include <stdio.h>
int main()
{
    int N, count = 0, i;
    float average, sum = 0;
    scanf("%d", &N);
    int a[N];
   for(i = 0; i < N; i++)
   {
       scanf("%d", &a[i]);
       sum += a[i];
       if(a[i] >= 60)
           count++;
   }
    if(N != 0)
        average = sum / N;
    else
        average = 0;
    printf("average = %.1f\ncount = %d", average, count);
    return 0;
}

练习3-5 输出闰年 (15 分)

输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。

输入格式:

输入在一行中给出21世纪的某个截止年份。

输出格式:

逐行输出满足条件的所有闰年年份,即每个年份占一行。输入若非21世纪的年份则输出"Invalid year!"。若不存在任何闰年,则输出“None”。

输入样例1:

2048

输出样例1:

2004
2008
2012
2016
2020
2024
2028
2032
2036
2040
2044
2048

输入样例2:

2000

输出样例2:

Invalid year!

//这道题直接颠覆了我的常识,我现在才知道2000年是20世纪不是21世纪,21世纪是2001-2100年

#include <stdio.h>
int main()
{
    int year, i, count = 0;
    scanf("%d", &year);
    if(year <= 2000 || year > 2100)
        printf("Invalid year!");
    else
    {
        for(i = 2001; i <= year; i++)
        {
            if((i % 4 == 0 && i % 100 != 0) || year % 400 == 0 )
            {
                printf("%d\n", i);
                count++;
            }
        }
        if(count == 0)
            printf("None");
    }
    return 0;
}

练习3-8 查询水果价格 (15 分)

给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。

首先在屏幕上显示以下菜单:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit

用户可以输入编号1~4查询对应水果的单价。当连续查询次数超过5次时,程序应自动退出查询;不到5次而用户输入0即退出;输入其他编号,显示价格为0。

输入格式:

输入在一行中给出用户连续输入的若干个编号。

输出格式:

首先在屏幕上显示菜单。然后对应用户的每个输入,在一行中按格式“price = 价格”输出查询结果,其中价格保留两位小数。当用户连续查询次数超过5次、或主动输入0时,程序结束。

输入样例1:

3 -1 0 2

输出样例1:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
price = 4.10
price = 0.00

输入样例2:

1 2 3 3 4 4 5 6 7 8

输出样例2:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
price = 3.00
price = 2.50
price = 4.10
price = 4.10
price = 10.20

//题中说显示结果为0,其实也得是0.0,忘加<stdlib.h>头文件来使用exit(0)

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i, num;
    printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n");
    for(i = 0; i < 5; i++)
    {   
        scanf("%d", &num);
        if(num == 0)
            exit(0);
        else if(num == 1)
            printf("price = 3.00\n");
        else if(num == 2)
            printf("price = 2.50\n");
        else if(num == 3)
            printf("price = 4.10\n");
        else if(num == 4)
            printf("price = 10.20\n");
        else
            printf("price = 0.00\n");
    }
    return 0;
}

习题3-2 高速公路超速处罚 (15 分)

按照规定,在高速公路上行使的机动车,达到或超出本车道限速的10%则处200元罚款;若达到或超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。

输入格式:

输入在一行中给出2个正整数,分别对应车速和限速,其间以空格分隔。

输出格式:

在一行中输出处理意见:若属于正常行驶,则输出“OK”;若应处罚款,则输出“Exceed x%. Ticket 200”;若应吊销驾驶证,则输出“Exceed x%. License Revoked”。其中x是超速的百分比,精确到整数。

输入样例1:

65 60

输出样例1:

OK

输入样例2:

110 100

输出样例2:

Exceed 10%. Ticket 200

输入样例3:

200 120

输出样例3:

Exceed 67%. License Revoked

//%%可以打印一个%。1/2 * 3.0 =0;1 * 3.0 / 2 =1.5;要掌握类型转换。保留零位小数用%.f即可,0可以省略。

习题3-3 出租车计价 (15 分)

本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:

  • 起步里程为3公里,起步费10元;
  • 超起步里程后10公里内,每公里2元;
  • 超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
  • 营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。

输入格式:

输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。

输出格式:

在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。

输入样例1:

2.6 2

输出样例1:

10

输入样例2:

5.1 4

输出样例2:

14

输入样例3:

12.5 9

输出样例3:

34

//理解错误:起步里程为3公里,起步费10元;超起步里程后10公里内,每公里2元;指的是3-7公里,每公里2块,不是指3-13公里。

#include <stdio.h>
int main()
{
    float x, money;
    int time, m;
    scanf("%f %d", &x, &time);
    if(x <= 3)
        money = 10;
    else if(x <= 10)
        money = 10 + (x - 3) * 2;
    else
        money = 10 + 7 * 2 + (x - 10) * 3;
    money += time / 5 * 2;
    m = money;
    if(money - m >= 0.5)
        money++;
    printf("%d", (int)money);
    return 0;
}

习题3-5 三角形判断 (15 分)

给定平面上任意三个点的坐标(x1​,y1​)、(x2​,y2​)、(x3​,y3​),检验它们能否构成三角形。

输入格式:

输入在一行中顺序给出六个[−100,100]范围内的数字,即三个点的坐标x1​、y1​、x2​、y2​、x3​、y3​。

输出格式:

若这3个点不能构成三角形,则在一行中输出“Impossible”;若可以,则在一行中输出该三角形的周长和面积,格式为“L = 周长, A = 面积”,输出到小数点后2位。

输入样例1:

4 5 6 9 7 8

输出样例1:

L = 10.13, A = 3.00

输入样例2:

4 6 8 12 12 18

输出样例2:

Impossible

//1.三角形的判别公式 2.求三角形面积的海伦公式

#include <stdio.h>
#include <math.h>
int main()
{
    double x1, y1, x2, y2, x3, y3, a, b, c, L, A, P;
    scanf("%lf %lf %lf %lf %lf %lf", &x1, &y1, &x2, &y2, &x3, &y3);
    a = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
    b = sqrt(pow(x3 - x1, 2) + pow(y3 - y1, 2));
    c = sqrt(pow(x3 - x2, 2) + pow(y3 - y2, 2));
    if(a + b > c && a + c > b && b + c > a)//三角形判别公式
    {
        L = a + b + c;
        P = L / 2;
        A = sqrt(P * (P - a) * (P - b) * (P - c));//海伦公式
        printf("L = %.2lf, A = %.2lf", L, A);
    }
    else
        printf("Impossible");
    return 0;
}

练习4-3 求给定精度的简单交错序列部分和 (15 分)

本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。

输入格式:

输入在一行中给出一个正实数eps。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。

输入样例1:

4E-2

输出样例1:

sum = 0.854457

输入样例2:

0.02

输出样例2:

sum = 0.826310

//i的初始值要为零,且i++要放在do-while循环体的最上面,否则就会出现下一项(应该是本项)与给定值进行比较的情况

#include <stdio.h>
int main()
{
    double eps, sum = 0, i = 0, flag = 1;
    scanf("%lf", &eps);
    do
    {
        i++;
        sum += 1 / (3 * i - 2) * flag;
        flag *= -1;
    }while(1 / (3 * i - 2) > eps);
    printf("sum = %lf", sum);
    return 0;
}

练习4-6 猜数字游戏 (15 分)

猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

输入格式:

输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。

输出格式:

在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。

输入样例:

58 4
70
50
56
58
60
-2

输出样例:

Too big
Too small
Too small
Good Guess!

//令人崩溃的一道题, 我多加了一个“!”, 结果搞了一晚上才找到问题,呜呜

#include <stdio.h>
int main()
{
    int r, N, i, num;
    scanf("%d %d", &r, &N);
    for(i = 1; i <= N; i++)
    {
        scanf("%d", &num); 
        if(num < 0)
        {
            printf("Game Over");
            return 0;
        }
        if(num == r)
        {
            if(i == 1)
            {
                printf("Bingo!");
                return 0;
            }
            else if(i <= 3)
            {
                printf("Lucky You!");
                return 0;
            }
            else
            {
                printf("Good Guess!");
                return 0;
            }
                
        }
       
        else if(num < r)
            printf("Too small\n");
        else
            printf("Too big\n");
    }
    printf("Game Over");
    return 0;
}

今日总结:

暂时来说题还是不难,关键是要细心,否则就会浪费很多时间在找错误上,如果代码逻辑没问题,很可能是自己在输出上加了料。找错误耽误了太多时间,今天只做了19道简单题,看似不少,但只要不出错的话,平均每道只要15min,也就是说最多五小时就能做完,结果我至少多花了两个小时去找那些不明显的缺漏增添,效率很低,明日继续刷题,记住教训,一定要细心!

  • 30
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值