浙大版《C语言程序设计实验与习题指导(第4版)》题目集 实验3-7 统计学生成绩 (15 分)

该程序用于读取多个学生的百分制成绩并按规则转换成五分制,统计各等级成绩分布。输入包含学生人数及成绩,输出为A、B、C、D、E等级的计数。示例输入7个成绩,输出为10231,表示A等级10人,B等级2人,C等级3人,D等级1人,E等级1人。

本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:

  • 大于等于90分为A;
  • 小于90且大于等于80为B;
  • 小于80且大于等于70为C;
  • 小于70且大于等于60为D;
  • 小于60为E。

输入格式:

输入在第一行中给出一个正整数N(≤1000),即学生人数;第二行中给出N个学生的百分制成绩,其间以空格分隔。

输出格式:

在一行中输出A、B、C、D、E对应的五分制成绩的人数分布,数字间以空格分隔,行末不得有多余空格。

输入样例:

7
77 54 92 73 60 65 69

结尾无空行

输出样例:

1 0 2 3 1

结尾无空行

#include<stdio.h>
 
int main(void)
{
	int A=0,B=0,C=0,D=0,E=0;
	int i,N,score;
	scanf("%d\n",&N);
	for(i=1;i<=N;i++){
        scanf("%d",&score);
		if(score>=90 && score<=100){
			A++;
		}else if(score>=80 && score<90){
			B++;
		}else if(score>=70 && score<80){
			C++;
		}else if(score>=60 && score<70){
			D++;
		}else{
			E++;
		}
	}
	printf("%d %d %d %d %d",A,B,C,D,E);
	return 0;	
 }

 

<think>好的,用户需要关于C语言实现学生信息链表的示例代码或解析,特别是浙大4实验11-2-1的内容。首先,我需要确认用户的具体需求。他们可能正在学习数据结构,需要完成一个实验作业,涉及到链表的创建、插入、遍历等操作。用户提到的参考引用中有谭浩强的《C程序设计》和Arrays类的相关方法,这可能内存管理和数据结构有关。 接下来,我应该检查已有的引用内容是否有帮助。引用[1]提到了使用指针和循环输入数据,这在处理链表节点时可能会用到。引用[3]讨论了数组的排序和操作,但链表和数组不同,可能需要不同的方法。不过,用户需要的是链表的实现,所以重点应放在指针操作和动态内存配上。 用户提到浙大的教材,但我的现有引用中没有直接相关的资料,可能需要依靠常见的C链表实现方法。通常,学生信息链表包括结构体定义、创建节点、插入节点、遍历链表等步骤。需要确保代码符合C语言标准,避免使用C++的特性。 可能的步骤包括: 1. 定义学生信息的结构体,包含学号、姓名、成绩等。 2. 编写创建节点的函数,使用malloc动态配内存。 3. 实现插入节点的函数,可能需要按学号排序插入。 4. 遍历链表并输出信息。 5. 释放链表内存,防止泄漏。 需要注意指针的正确使用,比如头指针的处理,以及next指针的指向。此外,输入函数如scanf的安全使用,避免缓冲区溢出,尤其是在读取字符串时。 用户可能遇到的问题包括内存泄漏、指针错误(如野指针)、输入处理不当等。在示例代码中应加入错误检查,比如malloc是否成功。同时,根据引用[1]中的例子,使用指针p++来遍历数组,类似地,链表的遍历需要移动指针到下一个节点。 最后,确保代码简洁易懂,符合教材中的风格,可能使用浙大常见的变量命名方式。完成代码后,生成相关问题,帮助用户深入理解链表操作和可能的优化方法。</think>根据《C程序设计》中关于指针和动态内存管理的知识[^1],以下给出学生信息链表的实现解析及示例代码: ### 实现步骤解析 1. **定义学生信息结构体** ```c struct Student { char id[12]; // 学号 char name[20]; // 姓名 float score; // 成绩 struct Student* next; // 指针域 }; ``` 2. **创建链表头节点** ```c struct Student* create_head() { struct Student* head = (struct Student*)malloc(sizeof(struct Student)); head->next = NULL; return head; } ``` 3. **插入学生信息(头插法)** ```c void insert_node(struct Student* head) { struct Student* new_node = (struct Student*)malloc(sizeof(struct Student)); printf("输入学号:"); scanf("%s", new_node->id); printf("输入姓名:"); scanf("%s", new_node->name); printf("输入成绩:"); scanf("%f", &new_node->score); new_node->next = head->next; head->next = new_node; } ``` 4. **遍历链表** ```c void traverse_list(struct Student* head) { struct Student* p = head->next; while(p != NULL) { printf("学号:%s\t姓名:%s\t成绩:%.1f\n", p->id, p->name, p->score); p = p->next; } } ``` 5. **内存释放** ```c void free_list(struct Student* head) { struct Student* p; while(head != NULL) { p = head; head = head->next; free(p); } } ``` ### 完整示例代码 ```c #include <stdio.h> #include <stdlib.h> struct Student { char id[12]; char name[20]; float score; struct Student* next; }; int main() { struct Student* head = create_head(); int n; printf("输入学生数量:"); scanf("%d", &n); for(int i=0; i<n; i++) { insert_node(head); } printf("\n学生信息列表:\n"); traverse_list(head); free_list(head); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值