目录
一、总结
没写代码久了,重新看了一遍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