PTA 浙大版《C语言程序设计(第3版)》题目集 习题9-6 按等级统计学生成绩

习题9-6 按等级统计学生成绩

题目要求

实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。

函数接口定义

int set_grade( struct student *p, int n );

其中p是指向学生信息的结构体数组的指针,该结构体的定义为:

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

n是数组元素个数。学号num、姓名name和成绩score均是已经存储好的。set_grade函数需要根据学生的成绩score设置其等级grade。等级设置:85-100为A,70-84为B,60-69为C,0-59为D。同时,set_grade还需要返回不及格的人数。

主程序样例

#include <stdio.h>
#define MAXN 10

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

int set_grade( struct student *p, int n );

int main()
{   struct student stu[MAXN], *ptr;
    int n, i, count;

    ptr = stu;
    scanf("%d\n", &n);
    for(i = 0; i < n; i++){
       scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
    } 
   count = set_grade(ptr, n);
   printf("The count for failed (<60): %d\n", count);
   printf("The grades:\n"); 
   for(i = 0; i < n; i++)
       printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
    return 0;
}

/* 你的代码将被嵌在这里 */#include <stdio.h>
#define MAXS 15

void StringCount( char *s );
void ReadString( char *s ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    StringCount(s);

    return 0;
}

/* Your function will be put here */
输入样例:
10
31001 annie 85
31002 bonny 75
31003 carol 70
31004 dan 84
31005 susan 90
31006 paul 69
31007 pam 60
31008 apple 50
31009 nancy 100
31010 bob 78
输出样例
The count for failed (<60): 1
The grades:
31001 annie A
31002 bonny B
31003 carol B
31004 dan B
31005 susan A
31006 paul C
31007 pam C
31008 apple D
31009 nancy A
31010 bob B

函数实现代码

int set_grade( struct student *p, int n )
{
	int i, D_cnt = 0;
	for(i=0; i<n; i++){
		if(p[i].score <= 100 && p[i].score >= 85)
			p[i].grade = 'A';
		else if(p[i].score <= 84 && p[i].score >= 70)
			p[i].grade = 'B';
		else if(p[i].score <= 69 && p[i].score >= 60)
			p[i].grade = 'C';
		else if(p[i].score <= 59 && p[i].score >= 0){
			p[i].grade = 'D';
			D_cnt++;
		}
	}
	return D_cnt;
}

学而不思则罔,思而不学则殆。

<think>好的,我现在需要解决用户关于浙大《C语言程序设计实验与习题指导(第4)》中实验6-1近似求PI的解法的问题。首先,我要回忆一下这个题目的具体要求。实验6-1通常涉及使用某种数学方法来近似计算π的值,常见的方法可能有莱布尼茨级数、蒙特卡洛方法或者泰勒展开等。不过用户提到的是近似求PI,可能使用的是级数展开的方式。 接下来,我需要确认题目的具体内容。假设题目要求根据给定的公式来计算π的近似值,直到最后一项小于给定的阈值ε为止。例如,莱布尼茨公式是:π/4 = 1 - 1/3 + 1/5 - 1/7 + ...,但可能有不同的变种。因此,我需要先明确题目中的公式是什么样子的。 假设题目中的公式是类似这样的展开式:π/2 = 1 + 1/3 + (1*2)/(3*5) + (1*2*3)/(3*5*7) + ...,这可能是某个特定的级数展开式。或者可能是其他形式的级数。这时候,我需要用户提供更多的信息,但根据常见的实验题,可能采用的是这样的递推公式。 然后,我需要考虑如何用C语言实现这个级数的计算。通常需要用到循环结构,每次迭代计算下一项,直到最后一项小于给定的ε。需要注意的问题包括分子和分母的递推关系、符号的变化(如果有的话)、以及如何累加各项的和。 例如,假设每一项的分子是前一项的分子乘以一个递增的数,而分母则是前一项的分母乘以另一个递增的数。比如,分子从1开始,每次乘以k,而分母从3开始,每次乘以(2k+1)。这时候,每一项的形式就是term = term * k / (2k+1),其中k从1开始递增,直到term < ε。 然后,将所有的term累加起来,总和乘以2得到π的近似值,因为这样的级数可能收敛到π/2。因此,最终结果需要乘以2。 在代码实现中,需要注意以下几点: 1. 初始化变量:sum初始化为第一项(比如1),term初始化为1,或者根据具体级数的起始项调整。 2. 循环条件:当最后一项的绝对值不小于ε时继续循环。 3. 在每次循环中更新term的值,并累加到sum中。 4. 最后根据级数的关系乘以相应的系数得到π的近似值。 例如,可能的代码结构如下: ```c #include <stdio.h> int main() { double epsilon; scanf("%lf", &epsilon); double sum = 1.0; // 初始项 double term = 1.0; int k = 1; while (term >= epsilon) { term = term * k / (2*k + 1); sum += term; k++; } double pi = 2 * sum; printf("%.6f\n", pi); return 0; } ``` 这里需要注意,循环的条件可能要根据term的绝对值是否大于等于ε来决定是否继续。如果级数中有
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值