趁着放假无事,开始用C语言开发一些小的项目,巩固基础知识的同时学习新的知识。

学生成绩管理系统实现的功能有:成绩录入、学生成绩查询、删除、修改、通过文件保存等。

开发这样一个系统需要具备的知识:线性表(链表)、文件操作、排序(如果需要成绩排序)。

开发环境为VS2015;在Linux下没有conio.h的头文件,需要修改与getch()函数相关的代码。

具体代码如下#include

#include

#include

#include

/*学生信息结构体*/

typedef struct Node

{

char Name[10];//学生姓名

char ID[15];//学生学号

int Score[3];//三科成绩(数学、英语、数据结构)

float Ave_Sco;

struct Node *next;

}Lnode;

void Display(); /*界面显示函数*/

void GetScore(Lnode *&h); /*成绩录入函数*/

void PrintScore(Lnode *h); /*成绩打印函数*/

void ModifyScore(Lnode *h); /*成绩修改函数*/

void FindInf(Lnode *h); /*查找信息*/

void Delete(Lnode *h); /*删除函数*/

void Quit(Lnode *h); /*退出函数*/

void SaveInf(Lnode *h);

void LoadInf(Lnode *h);

/*初始化链表*/

void InitList(Lnode *&head)

{

head = (Lnode *)malloc(sizeof(Lnode));

if (head == NULL)

{

printf("error!");

exit(1);

}

head->next = NULL; //使头节点指针域为空

}

int main()

{

Lnode *ScoreList; //建立成绩链表,所有学生信息存放在此链表

int Function;

char flag;

int t = 0;

InitList(ScoreList);

LoadInf(ScoreList);

while (1)

{

Display();

printf("请选择操作: ");

scanf("%d", &Function);

switch (Function)

{

case 1: while (1)

{

GetScore(ScoreList);

printf("是否继续输入 (Y/N)");

scanf("%s", &flag);

if (flag == 'N' || flag == 'n')break;

} system("cls"); break;

case 2: PrintScore(ScoreList);_getch(); system("cls"); break;

case 3: ModifyScore(ScoreList);system("cls"); break;

case 4: FindInf(ScoreList); _getch(); system("cls"); break;

case 5: Delete(ScoreList); _getch(); system("cls"); break;

case 6: Quit(ScoreList); break;

default: printf("Error!!! 请重新输入:");

break;

} //switch结束

}

return 0;

}

/*系统界面显示*/

void Display()

{

printf("\t\t**********************************************\n");

printf("\t\t*************欢迎使用成绩管理系统*************\n");

printf("\t\t**********************************************\n");

printf("\t\t\t\t1、录入成绩\n");

printf("\t\t\t\t2、打印成绩\n");

printf("\t\t\t\t3、修改成绩\n");

printf("\t\t\t\t4、查找学生信息\n");

printf("\t\t\t\t5、删除学生信息\n");

printf("\t\t\t\t6、退出系统\n");

printf("\n\n\n\n\n\n");

}

/*成绩录入*/

void GetScore(Lnode *&h)

{

Lnode *p, *q = h;

char name[10], id[15];

int Math, English, Datastruct;

p = (Lnode *)malloc(sizeof(Lnode));//为学生信息申请节点

printf("请依次输入学生信息:\n");

printf("姓名 学号 数学 英语 数据结构\n");

scanf("%s %s %d %d %d", &name, &id, &Math, &English, &Datastruct);

for (; q->next != NULL; q = q->next){;} //移动到尾节点

strcpy(p->Name, name);

strcpy(p->ID, id);

p->Score[0] = Math;

p->Score[1] = English;

p->Score[2] = Datastruct;

p->Ave_Sco = ((float)((p->Score[0] + p->Score[1] + p->Score[2]) - 150)) / 30;

p->next = NULL;

q->next = p;

q = p;

}

/*成绩打印*/

void PrintScore(Lnode *h)

{

Lnode *p = h->next;

printf("%-14s%-8s%-8s%-8s%-8s%-8s\n","排名", "学号", "姓名", "数学", "英语", "数据结构", "平均绩点");

while (p != NULL)

{

printf("%-14s%-8s%-8d%-8d%-8d%.2f\n", p->ID, p->Name, p->Score[0], p->Score[1], p->Score[2], p->Ave_Sco);

p = p->next;

}

}

/*成绩修改*/

void ModifyScore(Lnode *h)

{

Lnode *p = h->next;

char name[10], id[15];

int Math, English, Datastruct;

printf("请输入学生姓名:");

scanf("%s", name);

printf("请输入学生学号:");

scanf("%s", id);

while (p)

{

if (strcmp(p->Name, name)==0 && strcmp(p->ID, id)==0)

{

printf("当前学生信息:\n");

printf("%-14s%-8s%-8s%-8s%-8s\n", "学号", "姓名", "数学", "英语", "数据结构");

printf("%-14s%-8s%-8d%-8d%-8d\n", p->ID, p->Name, p->Score[0], p->Score[1], p->Score[2]);

printf("请输入更正后的数学成绩:");

scanf("%d", &Math);

printf("请输入更正后的英语成绩:");

scanf("%d", &English);

printf("请输入更正后的数据结构成绩:");

scanf("%d", &Datastruct);

p->Score[0] = Math;

p->Score[1] = English;

p->Score[2] = Datastruct;

break;

}

else

{

p = p->next;

}

}//while循环结束

}

/*信息查找*/

void FindInf(Lnode *h)

{

Lnode *p = h->next;

char name[10], id[15];

printf("请输入学生姓名:");

scanf("%s", name);

printf("请输入学生学号:");

scanf("%s", id);

while (p)

{

if (strcmp(p->Name, name) == 0 && strcmp(p->ID, id) == 0)

{

printf("当前学生信息:\n");

printf("%-14s%-8s%-8s%-8s%-8s\n", "学号", "姓名", "数学", "英语", "数据结构");

printf("%-14s%-8s%-8d%-8d%-8d\n", p->ID, p->Name, p->Score[0], p->Score[1], p->Score[2]);

break;

}

else

{

p = p->next;

}

}//while循环结束

}

/*删除*/

void Delete(Lnode *h)

{

Lnode *p = h, *q;

q = p->next;

char name[10], id[15];

printf("请输入学生姓名:");

scanf("%s", name);

printf("请输入学生学号:");

scanf("%s", id);

while (q)

{

if (strcmp(q->Name, name) == 0 && strcmp(q->ID, id) == 0)

{

p->next = q->next;

free(q); //删除p节点

printf("删除成功\n");

break;

}

else

{

p = p->next;

q = q->next;

}

}//while循环结束

}

/*退出系统*/

void Quit(Lnode *h)

{

SaveInf(h); //退出时保存信息

exit(0);

}

/*打开文件*/

void LoadInf(Lnode *h)

{

Lnode *p = h;

Lnode *q; //临时变量 用于保存从文件中读取的信息

FILE* file = fopen("./Information.dat", "rb");

if (!file)

{

printf("文件打开失败!");

return ;

}

/*

使用feof判断文件是否为结束要注意的问题:

当读取文件结束时,feof函数不会立即设置标志符为-1,而是

需要再读取一次后,才会设置。所以要先读一次。

*/

q = (Lnode *)malloc(sizeof(Lnode));

fread(q, sizeof(Lnode), 1, file);

while (!feof(file)) //一直读到文件末尾

{

p->next = q;

p = q;

q = (Lnode *)malloc(sizeof(Lnode));

fread(q, sizeof(Lnode), 1, file);

} //while循环结束

p->next = NULL;

fclose(file);

}

/*保存信息到文件中*/

void SaveInf(Lnode *h)

{

Lnode *p = h->next;

int flag;

FILE* file = fopen("./Information.dat", "wb");

if (!file)

{

printf("文件打开失败!");

return;

}

while (p != NULL)

{

flag = fwrite(p, sizeof(Lnode), 1, file); //将p的内容写到文件中

if (flag != 1)

{

break;

}

p = p->next;

}

fclose(file);

}

虽然是很简单的小项目,还是有很多问题。

一:链表相关

在写成绩录入和成绩打印功能时,发现始终只能保存(没加入文件保存)最后一个数据,确定链表的相关操作没有问题,仔细判断逻辑关系后,发现是每次在头节点传到GetScore()函数,为新节点申请内存后,直接将数据保存在了新申请的节点里面,没有将链表移动到尾节点,导致每次录入成绩,都会覆盖前一次输入的数据。解决办法是链表传到函数后,先移动到最后一个节点,将新申请的节点挂接在最后一个节点之后。

/*成绩录入*/

void GetScore(Lnode *&h)

{

Lnode *p, *q = h;

char name[10], id[15];

int Math, English, Datastruct;

p = (Lnode *)malloc(sizeof(Lnode));//为学生信息申请节点

printf("请依次输入学生信息:\n");

printf("姓名 学号 数学 英语 数据结构\n");

scanf("%s %s %d %d %d", &name, &id, &Math, &English, &Datastruct);

for (; q->next != NULL; q = q->next){;} //移动到尾节点

//保存数据

strcpy(p->Name, name);

strcpy(p->ID, id);

p->Score[0] = Math;

p->Score[1] = English;

p->Score[2] = Datastruct;

p->Ave_Sco = ((float)((p->Score[0] + p->Score[1] + p->Score[2]) - 150)) / 30;

//始终指向最后一个节点

p->next = NULL;

q->next = p;

q = p;

}

二、文件操作

用文件保存遇到的问题主要是每次打印数据时除正常数据外,始终多一行乱码。判断方法是while(!feof(file))。排除错误时确定了两种可能性:多保存了一行;多读取了一行。经过某度feof()与EOF的关系后,确定是多读取了一行数据。

用feof()函数进行文件尾判断时,当文件已经到达尾部后,还需要在读取一次后,feof()函数才会返回-1,所以会出现多读一次的情况;解决办法时,在循环读取之前先将第一个数据读取出来,然后在正常读取。即注意多读一次的问题。

/*打开文件*/

void LoadInf(Lnode *h)

{

Lnode *p = h;

Lnode *q; //临时变量 用于保存从文件中读取的信息

FILE* file = fopen("./Information.dat", "rb");

if (!file)

{

printf("文件打开失败!");

return ;

}

/*

使用feof判断文件是否为结束要注意的问题:

当读取文件结束时,feof函数不会立即设置标志符为-1,而是

需要再读取一次后,才会设置。所以要先读一次。

*/

q = (Lnode *)malloc(sizeof(Lnode));

fread(q, sizeof(Lnode), 1, file);

while (!feof(file)) //一直读到文件末尾

{

p->next = q;

p = q;

q = (Lnode *)malloc(sizeof(Lnode));

fread(q, sizeof(Lnode), 1, file);

} //while循环结束

p->next = NULL;

fclose(file);

}

查找学生链表c语言,【查找链表面试题】面试问题:C语言实现学生… - 看准网...相关推荐

  1. c语言面试题东软,【东软集团程序员Java东软集团C语言面试题】面试问题:东软java面… - 看准网...

    当天我很早的就来到面试地点,其实我们还有课<算法分析与设计>,但是我们逃了吧,逃课的不止我一人,还有王凯,还有唐建军,王川,还有我的好友刘冠春.他们逃课也许是为了对面试做一个充分的准备吧, ...

  2. C语言 编程判断花瓶是谁打碎的,【数组编程面试题】面试问题:C语言解决是谁… - 看准网...

    逛贴吧偶遇一道很新颖的C语言编程题,想到自己的C语言荒废了很久,便决定花点时间解决一下练练手. 具体题目如下: 实验题目(4)[见实验教材实验五的题目6]:编写程序exp5_6.c,请判断花瓶是谁打碎 ...

  3. C语言单链成绩表,【查找链表面试题】面试问题:C语言基于单链… - 看准网

    传说中讲课通俗而不庸俗,说话风流而不下流的小编又来了哦,今天的主要内容是:C语言基于单链表得学生成绩管理系统.首先给大家总结下为什么你们学习C语言会觉得难,尤其是对于单链表这块,主要原因得是因为一下两 ...

  4. c语言 指针 字符串 回文 strcmp,【查找字符串面试题】面试问题:C语言指针题集… - 看准网...

    1. 若有说明:int a=2, *p=&a, *q=p;,则以下非法的赋值语句是(). A. p=q;           B. *p=*q;        C. a=*q;         ...

  5. 如何利用python在yi'ge_【GE查找Python面试题】面试问题:使用 TVM … - 看准网

    以下内容翻译自:Remote Profile and Test Deep Learning Cross Compilation on Mobile Phones with TVM RPC TVM 堆栈 ...

  6. linux链表概念,【链表Linux面试题】面试问题:进程的基本概念… - 看准网

    一.背景 1.操作系统(Operator System)的概念: 任何计算机都包含一个基本的程序集合,称为操作系统(简称OS).笼统的理解,操作系统包括: 1)内核,其含有内核管理.进程管理.驱动管理 ...

  7. c语言设计期末考试试题及答案,C语言程序的设计期末考试试题(含答案).pdf

    一.单项选择题 (本大题共20题,每题2 分,共40 分) 1.以下不是C语言的特点的是() A C B . 语言简洁.紧凑 .能够编制出功能复杂的程序 C.C语言可以直接对硬件进行操作 D.C语言移 ...

  8. c语言fwrite写字符串数组,【字符串数组面试题】面试问题:C语言 文… - 看准网...

    1.文件中存储的学生信息按照班级编号升序排列,每个班级的人数可以不同,要求读取文件中所有学生的成绩,计算每个班级的平均成绩,将班级编号和平均成绩输出. 存储格式: 145811  fuxin      ...

  9. 多线程面试题c Linux,【多线程Linux面试题】面试问题:小伙用C语言熬… - 看准网...

    记得聊天室可是大学的热门开发小项目啊,只要是老师布置的小组项目开发,那么其中肯定有聊天室,O(∩_∩)O哈哈哈~ 小编今天介绍的这个项目课程呢,就是教你开发一款聊天室,正在学习C语言的小伙伴一定不要错 ...

最新文章

  1. 长春工业大学计算机专科吧,长春工业大学是几本 学生评价怎么样好不好(10条)...
  2. tableView下沉
  3. C++ 创建对象时带括号和不带括号的区别
  4. 顶尖机器学习学习路线,6个月让你的技术成为行业TOP5%
  5. javascript-布尔-空与未定义-查看数据类型
  6. sort函数用于vector向量的排序
  7. Swift来了,是不是能够入手IOS开发了?
  8. Ubuntu图标变成问号
  9. SQL中between过滤数据
  10. 网页监控提醒工具WebMonitor
  11. MXF 媒体交换文件格式
  12. Latex的一些排版技巧
  13. sqli-labs(54-65)终章
  14. YIQ、YUV、YCrCb 与 RGB关系
  15. [收集编辑]管理故事216则
  16. 聊聊ThoughtWorks面试(郑大版 社招)+ PS:应届生简单流程介绍
  17. c3p0连接池的详细配置
  18. android APK瘦身全面总结——如何从32.6M到13.6M
  19. Ubuntu20安装erlang和rabbitmq
  20. Android 12 Watchdog(1) 介绍与启动

热门文章

  1. River Hopscotch
  2. KubeSphere中部署Minio服务
  3. fastapi 的启动方式
  4. kafka集群部署成功后,创建生产者往指定主题里面发送消息时出错
  5. mysql的四个默认数据库是什么版本,MySQL5.7数据库字符集和排序规则有四个级别的默认设置:服务器,数据库,表和列。...
  6. java计算两个时间段的重合天数
  7. Linux kms 模式设置,linux – 使用KMS设置控制台视频分辨率
  8. Oracle统计产生日志数据增长增量
  9. linux malloc free 内存碎片_内存申请malloc/new与内存释放free/delete的区别
  10. wxpython textctrl_wxpython中Textctrl回车事件无效的解决方法