C代码和Python代码:学生成绩管理程序

这篇博客总结了如何使用C语言和Python实现学生成绩管理程序。作者回顾了Python的列表和字典,并指出C语言中链表可以采用列表和字典嵌套来模拟。文章详细介绍了Python内置的sorted()函数用于成绩排序,并推荐了一篇关于lambda和sorted函数的文章。接着,博客分别展示了在VS2017环境下运行的C代码和Pycharm中运行的Python3.74代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、总结

没写代码久了,重新看了一遍python的列表和字典

关于C的链表:
链表的节点可以用列表和字典嵌套来实现

关于排序:
sorted()是python自带的函数,
用sorted()来排序是一个比较简便的方法
可参考:《python中的lambda函数与sorted函数》
博主写得很详细

二、C代码

运行环境:VS2017
以下是代码:

/*
学生成绩管理程序
编制一个统计学生考试分数的管理程序。
设学生成绩已以一个学生一个记录的形式存储在文件中,
每位学生记录包含的信息有:姓名,学号和各门功课的成绩。
程序具有以下几项功能:求出各门课程的总分,平均分,按姓名,
按学号寻找其记录并显示,浏览全部学生成绩和按总分由高到低显示学生信息等。
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define	SWN		3	/* 课程数 */
#define NAMELEN		20	/* 姓名最大字符数 */
#define CODELEN		10	/* 学号最大字符数 */
#define FNAMELEN	80	/* 文件名最大字符数 */
#define BUFLEN		80	/* 缓冲区最大字符数 */
/* 课程名称表 */
char schoolwork[SWN][NAMELEN + 1] = {
    "Chinese","Mathematic","English" };
struct record
{
   
	char	name[NAMELEN + 1];	/* 姓名 */
	char 	code[CODELEN + 1];	/* 学号 */
	int 	marks[SWN];		/* 各课程成绩 */
	int total;			/* 总分 */
}stu;

struct node
{
   
	char	name[NAMELEN + 1];	/* 姓名 */
	char 	code[CODELEN + 1];	/* 学号 */
	int 	marks[SWN];		/* 各课程成绩 */
	int 	total;			/* 总分 */
	struct	node *next;		/* 后续表元指针 */
}*head;	/* 链表首指针 */

int total[SWN];		/* 各课程总分 */
FILE *stfpt;		/* 文件指针 */
char stuf[FNAMELEN];	/* 文件名 */

/* 从指定文件读入一个记录 */
int readrecord( FILE *fpt, struct record *rpt)
{
   
	char buf[BUFLEN];
	int i;
	if ( fscanf_s(fpt, "%s", buf, BUFLEN) != 1)
		return 0;	/* 文件结束 */
	strncpy_s(rpt->name, buf, NAMELEN);

	fscanf_s(fpt, "%s", buf, BUFLEN);
	strncpy_s(rpt->code, buf, CODELEN);

	for (i = 0; i < SWN; i++)
		fscanf_s(fpt, "%d", &rpt->marks[i]);


	for (rpt->total = 0, i = 0; i < SWN; i++)
		rpt->total += rpt->marks[i];
	return 1;
}

/* 对指定文件写入一个记录 */
void writerecord( FILE *fpt, struct record *rpt)
{
   
	int i;
	fprintf(fpt, "%s\n", rpt->name);
	fprintf(fpt, "%s\n", rpt->code);
	for (i = 0; i < SWN; i++)
		fprintf(fpt, "%d\n", rpt->marks[i]);
	return;
}

/* 显示学生记录 */
void displaystu( struct record *rpt)
{
   
	int i;
	printf("\nName   : %s\n", rpt->name);
	printf("Code   : %s\n", rpt->code);
	printf("Marks  :\n");

	for (i = 0; i < SWN; i++)
		printf("       %-15s : %4d\n", schoolwork[i], rpt->marks[i]);
	printf("Total  : %4d\n", rpt->total);
}

/* 计算各单科总分 */
int totalmark( char *fname)
{
   
	FILE *fp;
	struct record s;
	int count, i;
	errno_t err;
	err = fopen_s(&fp, fname, "r");
	if ( err != 0)
	{
   
		printf("Can't open file %s.\n", fname);
		return 0;
	}
	for (i = 0; i < SWN; i++)
		total[i] = 0;
	count = 0;
	while (readrecord(fp, &s) != 0)
	{
   
		for (i = 0; i < SWN; i++)
			total[i] += s.marks[i];
		count++;
	}
	fclose(fp);
	return count;	/* 返回记录数 */
}

/* 列表显示学生信息 */
void liststu( char *fname)
{
   
	FILE *fp;
	stru
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值