#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3
#define LEN (Student*) malloc(sizeof(Student))
/* 学生数据结构 */
typedef struct node
{
char num[];
char name[];
int score[N];
int sum;
double ave;
struct node *next;
} Student; /* 头指针 */
Student *head = NULL;
/* 临时指针 */
Student *tmp = NULL;
/* 课程名称 */
char CLASSNAME[N][] = {"大物", "高数", "c语言"};
/* 命令开关 */
int SWITCH[] = {, , , , , , , , , , , , , , , };
/* 函数声明 */
int Menu();
Student* Init();
int CheckNUM(char*);
int CheckName(char*);
int CheakScore(int score);
int Same_NUM(char*);
void InputNodeInfo(Student*);
void OutputNodeInfo(Student*);
Student* SearchFrontNode(Student*);
void DeleteNode(Student*);
void InsertBefore();
void InputList();
Student* SearchID(char*);
Student* SearchName(char*);
void SearchDeleteNode();
void OutList();
void SearchPrintNode();
void Compute();
int CmpID(Student*, Student*, int);
int CmpSum(Student*, Student*, int);
int CmpScore(Student*, Student*, int);
Student* SearchMaxNode(int (*cmp)(Student*, Student*, int), int);
Student* Sort(int (*cmp)(Student*, Student*, int), int);
void OutputToFile(FILE*, Student*, int);
void InsertAfter(Student*);
void SaveToFile();
void LoadFile();
void CopyFile();
void InsertToFile();
void FreeList(Student* p);
void Stat();
void Quit(); /* 主函数 */
int main()
{
int n; while ()
{
n = Menu();
{
if (n == || n == || SWITCH[])
{
switch (n)
{
/* 执行初始化 */
case :
head = Init();
printf("LOOK...初始化成功\n");
break;
/* 创建链表 ,输入学生信息*/
case :
InputList();
break;
/* 查找学号或姓名删除信息 */
case :
SearchDeleteNode();
break;
/* 输出全部学生信息 */
case :
system("cls");
OutList();
break;
/* 按姓名查找学生信息*/
case :
SearchPrintNode();
break;
/* 保存到文件 */
case :
SaveToFile();
break;
/* 从文件中读取学生信息*/
case :
if (SWITCH[])
{
head = Init();
LoadFile();
}
else
{
printf("当前文件未保存\n");
}
break;
/* 计算所有学生的总分和平均分 */
case :
Compute();
SWITCH[] = ;
printf("计算完毕\n");
break;
/* 插入一个学生信息到链表 */
case :
InsertBefore();
SWITCH[] = ;
SWITCH[] = ;
break;
/* 复制文件 */
case :
CopyFile();
break;
/* 排序,按总分排序并打印学生信息 */
case :
if (SWITCH[])
{
head = Sort(CmpSum, );
system("cls");
OutList();
}
else
{
printf("请先计算总分!\n");
}
break;
/* 尾部添加一个学生信息到文件中 */
case :
InsertToFile();
SWITCH[] = ;
printf("尾部添加完毕!\n");
break;
/* 按学号搜索..学生信息*/
case :
if (SWITCH[])
{
head = Sort(CmpID, );
system("cls");
OutList();
}
else
{
printf("请先计算总分!\n");
}
break;
/* 分类汇总 */
case :
system("cls");
Stat();
break;
/* 结束 */
case :
Quit();
break;
default:
printf("无效命令!\n");
fflush(stdin);
}
system("pause");
}
else
{
printf("你必须首先初始化!\n");
system("pause");
}
}
} system("pause");
return ;
} /* 菜单 */
int Menu()
{
int n;
system("cls");
fflush(stdin);
printf("*********************************************************************\n");
printf("*********************************************************************\n");
printf("【01】 初始化........\n");
printf("【02】 输入学生信息\n");
printf("【03】 查找学号或姓名删除信息\n");
printf("【04】 输出全部学生信息\n");
printf("【05】 按姓名查找学生信息\n");
printf("【06】 保存到文件\n");
printf("【07】 从文件中读取学生信息\n");
printf("【08】 计算所有学生的总分和平均分\n");
printf("【09】 插入一个学生信息到链表中\n");
printf("【10】 复制文件\n");
printf("【11】 按总分排序并打印学生信息\n");
printf("【12】 尾部添加一个学生信息到文件中\n");
printf("【13】 按学号搜索..学生信息\n");
printf("【14】 分类汇总\n");
printf("【15】 退出\n");
printf("********************************************************************\n");
printf("请输入命令编号: ");
scanf("%d", &n);
return n;
} /* 初始化 */
Student* Init()
{
int i;
Student *head;
head = LEN;
head->next = NULL; /* 命令开关初始化 */
for (i = ; i < ; i++)
{
SWITCH[i] = ;
} SWITCH[] = ;
SWITCH[] = ;
return head;
} /* 检查学号 */
int CheckNUM(char* s)
{
int i; if (strlen(s) == || strlen(s) > ) return ; for (i = ; i < strlen(s); i++)
{
if (s[i] < '' || s[i] > '') return ;
} return ;
} /* 检查姓名 */
int CheckName(char* s)
{
int i; if (strlen(s) == || strlen(s) > ) return ; for (i = ; i < strlen(s); i++)
{
if (!(s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z')) return ;
} return ;
} /* 检查分数 */
int CheakScore(int score)
{
if (score > || score <= ) return ;
return ;
} /* 检查相同学号 */
int Same_NUM(char* s)
{
Student *p = head->next;
while(p != NULL)
{
if (strcmp(s, p->num) == ) return ;
p = p->next;
}
return ;
} /* 给p指向的节点输入信息 */
void InputNodeInfo(Student* p)
{
fflush(stdin); /* 学号 */
printf("\n请输入学号: ");
do
{
gets(p->num); if (!CheckNUM(p->num))
{
printf("数据不标准,请重新输入学号: ");
}
else if (Same_NUM(p->num))
{
printf("检测到此学号存在,请重新输入: ");
}
}while (!(CheckNUM(p->num) && !Same_NUM(p->num))); /* 姓名 */
printf("请输入姓名: ");
do
{
gets(p->name);
if (!CheckName(p->name))
{
printf("数据不标准,请重新输入姓名: ");
}
}
while (!CheckName(p->name)); /* 成绩 */
int i;
for (i = ; i < N; i++)
{
printf("请输入 %s 成绩: ", CLASSNAME[i]);
do
{
fflush(stdin);
scanf("%d", &p->score[i]); if (!CheakScore(p->score[i]))
{
printf("数据不标准,请重新输入 %s 成绩: ", CLASSNAME[i]);
}
}
while (!CheakScore(p->score[i]));
} /* 总分及平均分 */
p->sum = -;
p->ave = -;
} /* 输出p指向节点的信息 */
void OutputNodeInfo(Student* p)
{
int i;
printf("\n");
printf("姓名: %s\n", p->name);
printf("学号: %s\n", p->num); for (i = ; i < N; i++)
{
printf("%s 成绩: %d\n", CLASSNAME[i], p->score[i]);
} /* 计算过才输出 */
if (SWITCH[]) printf("总分: %d\n", p->sum);
if (SWITCH[]) printf("平均分: %.2lf\n", p->ave);
} /* 返回r的前一个节点 */
Student* SearchFrontNode(Student* r)
{
Student *p = head;
while (p->next != r) p = p->next;
return p;
} /* 删除r指向的节点 */
void DeleteNode(Student* r)
{
Student *p = SearchFrontNode(r);
p->next = r->next;
} /* 头插法插入节点 */
void InsertBefore()
{
Student *s = LEN;
InputNodeInfo(s);
s->next = head->next;
head->next = s;
} /* 输入链表 */
void InputList()
{
int n;
printf("有多少个学生信息要输入? ");
scanf("%d", &n); while (n--)
{
InsertBefore();
}
} /* 按学号查找 */
Student* SearchID(char* num)
{
Student *p = head->next; while (p != NULL)
{
if (strcmp(p->num, num) == ) break;
p = p->next;
} return p;
} /* 按姓名查找 */
Student* SearchName(char* name)
{
Student *p = head->next; while (p != NULL)
{
if (strcmp(p->name, name) == ) break;
p = p->next;
} return p;
} /* 按学号或姓名查找删除节点 */
void SearchDeleteNode()
{
Student *p;
fflush(stdin);
char str[];
char sure[]; /* 输入合法性判断 */
printf("请输入你要删除的学生的 姓名 或 学号: ");
do
{
gets(str); if (!(CheckNUM(str) || CheckName(str)))
{
printf("数据不标准,请重新输入姓名或学号: ");
}
}
while (!(CheckNUM(str) || CheckName(str))); /* 判断是姓名还是学号 */
if (str[] >= '' && str[] <= '')
{
p = SearchID(str); if (p == NULL)
{
printf("对不起,找不到这个学号\n");
}
else
{
OutputNodeInfo(p);
printf("确认删除? (输入\"y\"确认,任意键取消): ");
if (strcmp(gets(sure), "y") == )
{
DeleteNode(p);
printf("删除成功\n");
SWITCH[] = ;
}
fflush(stdin);
}
}
else
{
p = SearchName(str); if (p == NULL)
{
printf("对不起,找不到这个姓名\n");
}
else
{
OutputNodeInfo(p);
printf("确认删除? (输入\"y\"确认,任意键取消): ");
if (strcmp(gets(sure), "y") == )
{
DeleteNode(p);
printf("删除成功!\n");
SWITCH[] = ;
}
fflush(stdin);
}
}
} /* 输出链表 */
void OutList()
{
Student *p = head->next; /* 空表处理 */
if (p == NULL)
{
printf("暂无学生信息!\n");
} while (p != NULL)
{
OutputNodeInfo(p);
p = p->next;
}
} /* 按姓名查找记录并打印 */
void SearchPrintNode()
{
Student *p = head->next;
int ok = ;
char name[];
fflush(stdin); /* 姓名合法性判断 */
printf("请输入你要查找的学生姓名: ");
do
{
gets(name); if (!CheckName(name))
{
printf("数据不标准,请重新输入姓名: ");
}
}
while (!CheckName(name)); /* 按姓名查找节点 */
while (p != NULL)
{
if (strcmp(p->name, name) == )
{
ok = ;
OutputNodeInfo(p);
}
p = p->next;
} if (ok)
{
printf("对不起,找不到这个姓名\n");
}
} /* 计算总分和均分 */
void Compute()
{
int i;
Student *p = head->next; while (p != NULL)
{
int sum = ; for (i = ; i < N; i++)
{
sum += p->score[i];
} p->sum = sum;
p->ave = sum * 1.0 /N;
p = p->next;
}
} /* 比较学号 */
int CmpID(Student* a, Student* b, int k)
{
return strcmp(a->num, b->num);
} /* 比较总分 */
int CmpSum(Student* a, Student* b, int k)
{
return b->sum - a->sum;
} /* 比较各科分数 */
int CmpScore(Student* a, Student* b, int k)
{
return b->score[k] - a->score[k];
} /* 选择最大元素 */
Student* SearchMaxNode(int (*cmp)(Student* a, Student* b, int k), int k)
{
Student *p = head->next;
Student *max = p; while (p != NULL)
{
if (cmp(p, max, k) < )
{
max = p;
}
p = p->next;
} return max;
} /* 排序 */
Student* Sort(int (*cmp)(Student* a, Student* b, int k), int k)
{
Student *newhead = LEN;
Student *p = newhead;
Student *max; while (head->next != NULL)
{
max = SearchMaxNode(cmp, k);
p->next = max;
DeleteNode(max);
p = p->next;
} /* 表尾处理 */
p->next = NULL;
return newhead;
} /* 将s插入链表尾部 */
void InsertAfter(Student* s) {
Student *p = head; while (p->next != NULL) p = p->next; s->next = NULL;
p->next = s;
} /* 保存到文件 */
void SaveToFile()
{
/* 处理尾部添加表尾情况 */
if (SWITCH[])
{
InsertAfter(tmp);
} FILE *fp;
int i;
Student *p;
char file[];
fflush(stdin);
printf("请输入要保存的文件名: ");
gets(file); if ((fp = fopen(file, "wt")) == NULL)
{
printf("写文件错误.......!\n");
return;
}
for(p = head->next;p!=NULL;p=p->next)
fprintf(fp,"%s %s \n",p->name,p->num);
for(i=;i<;i++)
{
fprintf(fp,"%d\n",p->score[i]);
}
printf("文件保存成功!\n");
fclose(fp);
SWITCH[] = ; /* 处理尾部添加情况 */
if (SWITCH[])
{
DeleteNode(tmp);
SWITCH[] = ;
}
} /* 从文件中读入记录 */
void LoadFile()
{
int i;
FILE *fp;
char file[];
fflush(stdin);
printf("请输入文件名: ");
gets(file); if ((fp = fopen(file, "rt")) == NULL)
{
printf("对不起,无法打开文件!\n");
return;
} /* 文件未结束时读入数据 */
while (!feof(fp))
{
Student *s = LEN;
fscanf(fp, "%s", s->name);
fscanf(fp, "%s", s->num); for (i = ; i < N; i++)
{
fscanf(fp, "%d", &s->score[i]);
} s->next = head->next;
head->next = s;
} printf("文件读取成功!\n");
fclose(fp);
} /* 复制文件 */
void CopyFile()
{
FILE *fp1, *fp2;
char ch, file1[], file2[];
fflush(stdin);
/* 读入源文件 */
printf("请输入源文件名: ");
gets(file1); if ((fp1 = fopen(file1, "rb")) == NULL)
{
printf("对不起,无法打开文件!\n");
return;
} /* 读入目标文件 */
printf("请输入目标文件名: ");
gets(file2); if ((strcmp(file1, file2) == ) || ((fp2 = fopen(file2, "wb")) == NULL))
{
printf("对不起,无法创建文件!\n");
return;
} /* 逐个字符拷贝 */
while (!feof(fp1))
{
ch = fgetc(fp1); if (ch != EOF)
fputc(ch, fp2);
} fclose(fp1);
fclose(fp2);
printf("文件拷贝成功!\n");
} /* 尾部添加记录到文件中 */
void InsertToFile()
{
tmp = LEN;
InputNodeInfo(tmp);
SWITCH[] = ;
} /* 分类统计 */
void Stat()
{
int i, j, n = ;
int sum[N] = {};
Student *p = head->next; if (p == NULL)
{
printf("暂无学生信息,无法统计\n");
return;
} /* 统计各科总分 */
while (p != NULL)
{
/* 记录学生总数 */
n++; for (i = ; i < N; i++)
{
sum[i] += p->score[i];
} p = p->next;
} /* 各科分别输出 */
for (i = ; i < N; i++)
{
printf("%s 总均分: %.2lf\n", CLASSNAME[i], sum[i] * 1.0 / n);
head = Sort(CmpScore, i);
j = ;
p = head->next; while (p != NULL)
{
j++;
printf("第%d名 %s %d\n", j, p->name, p->score[i]);
p = p->next;
} printf("\n");
}
} /* 释放链表 */
void FreeList(Student* p)
{
if (p->next != NULL)
{
FreeList(p->next);
}
free(p);
} /* 退出 */
void Quit()
{
if (!SWITCH[])
{
printf("请先保存文件!\n");
return;
}
if (head != NULL)
{
FreeList(head);
}
exit();
}

学生管理系统(C语言)的更多相关文章

  1. 学生管理系统 Python语言

    def show_student(): print(('*'*20).center(55)) print('1.添加学生信息'.center(50)) print('2.修改学生信息'.center( ...

  2. 学生管理系统-火车订票系统 c语言课程设计

    概要: C 语言课程设计一---学生管理系统 使使用 C 语言实现学生管理系统.系统实现对学生的基本信息和考试成绩的 管理.采用终端命令界面,作为系统的输入输出界面.采用文件作为信息存储介质. 功能描 ...

  3. #006 C语言大作业学生管理系统第三天

    还差最后两部分 读取文件 恢复删除的学生信息 先学会处理文件的 知识点,再继续跟着视频做这个作业. 应该明天周六能把视频里手把手教的学生管理系统敲完 第二周尽量自己能完成C语言课本最后面那道学生管理系 ...

  4. c语言之学生管理系统

    0x00 学生管理系统 说到学生管理系统,对于每一个初学c语言的人都是一道不得不过的砍.不过,学习c,我觉得每个人都应该写一个学生管理系统,至于为什么,我想倘若连一个学生管理系统都写不好,哪么他的c是 ...

  5. 学生管理系统(C语言简单实现)

    仅供借鉴.仅供借鉴.仅供借鉴(整理了一下大一C语言每个章节的练习题.没得题目.只有程序了) 文章目录 1 .实训名称 2.实训目的及要求 3. 源码 4.实验小结 1 .实训名称 实训12:文件 2. ...

  6. #007 C语言大作业学生管理系统第四天

    第四天还差恢复已删除学生功能 对于我来说,已经开始很复杂了. 小细节太重要了,边写边出错 1 #include<stdio.h> #include<stdlib.h> #inc ...

  7. #004 C语言大作业学生管理系统试着做

    链表不会用 文件不会使 在这种情况下就边写边做 希望这个月能做完这个作业 #include<stdio.h> #include<stdlib.h> #include<st ...

  8. C语言学生管理系统

    想练习一下链表,所以就有了这个用C写的学生管理系统 没有把它写入文件,才不是因为我懒哈哈哈,主要是为了练习链表的 #include<stdio.h> #include<stdlib. ...

  9. C语言小练习 微型学生管理系统

    很简陋,没有做输入校验,以写出来为第一目的,中间出了不少问题,尤其是结构体内字符串赋值的时候(理解不透彻),字符串比较用strcmp不能直接==判定,逻辑也很重要,不然会出现莫名其妙的问题. 涉及知识 ...

  10. 【IOS开发笔记02】学生管理系统

    端到端的机会 虽然现在身处大公司,但是因为是内部创业团队,产品.native.前端.服务器端全部坐在一起开发,大家很容易做零距离交流,也因为最近内部有一个前端要转岗过来,于是手里的前端任务好像可以抛一 ...

随机推荐

  1. [转] 如何让CloudStack使用KVM创建Windows实例成功识别并挂载数据盘

    在使用kvm给windows虚拟机动态挂载virtio类型的硬盘时候遇到问题,通过下面的文章知道需要安装virtio驱动,从而解决问题使挂在正常,在此处mark一下 问题产生背景: 使用CloudSt ...

  2. PHPCMS快速建站系列之自定义分页函数

    内容分页的实现方法:{pc:content action="lists" catid="$catid" order="id DESC" nu ...

  3. RACSingle 有效的两种方式

    第一种当然是subscribeNext 另外还有一种就是作为Command的enablesingle也相当于被订阅了.

  4. Web开发者应当开始学习HTML5的新功能

    据国外媒体报道,谷歌开发者业务部门高管马克·皮尔格雷姆(Mark Pilgrim)在WWW2010会议上表示,尽管还需要进一步完善,HTML5已经获得大多数平台支持,适合完成大多数任务. 但并非所有人 ...

  5. Mac下使用Brew搭建PHP(LNMP/LAMP)开发环境

    Mac下搭建lamp开发环境很容易,有xampp和mamp现成的集成环境.但是集成环境对于经常需要自定义一些配置的开发者来说会非常麻烦,而且Mac本身自带apache和php,在brew的帮助下非常容 ...

  6. android 类似QQ底部输入框弹出键盘和面板冲突 布局闪动处理方案(转)

    先看下效果 差不多就是解决这种冲突,布局闪动的 作者的githup :https://github.com/Jacksgong/JKeyboardPanelSwitch Android键盘面板冲突 布 ...

  7. IIS8中添加WCF支持几种方法小结[图文]

    方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不支持WCF服务svc请求,后来发现IIS8缺少 ...

  8. 解析STL中典型的内存分配

    1 vector 在C++中使用vector应该是非常频繁的,但是你是否知道vector在计算内存分配是如何么? 在c++中vector是非常类似数组,但是他比数组更加灵活,这就表现在他的大小是可以自 ...

  9. jQuery wrap wrapAll wrapInner使用

    jQuery wrap wrapAll wrapInner使用 <%@ page language="java" import="java.util.*" ...

  10. Eclipse中TODO的分类,以及自动去除

    Window-Preference-Java-Compiler-Task Tags; 这里面进行TaskTag标签的定义,默认支持FIXME.TODO.XXX三种:优先级高的在taskview中 会显 ...