#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. 个人学习笔记:C语言程序结构

    个人笔记:C语言程序 函数 语句 输入输出对象 标识符 关键字 函数 一个C语言源程序,是由一个或多个函数定义顺序组成的,其中必须有一个函数名为main的主函数.C语言源程序中的函数是指完成特定数据处 ...

  2. 【做中学】第一个 Go 语言程序:漫画下载器

    原文地址: 第一个 Go 语言程序:漫画下载器: https://schaepher.github.io/2020/04/11/golang-first-comic-downloader 之前学了点 ...

  3. 第一个C语言程序

    从第一个C语言程序了解C语言 了解关键字 了解函数 注释 C语言的执行流程 标识符 C语言的学习重难点 从第一个C语言程序了解C语言 上图是一个在控制台上显示“Hello, World!”的C语言源代 ...

  4. Linux环境下使用gcc编译,gdb反汇编C语言程序

    使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64   我把过程截图如下. 首先是hello world程序: 备注: ...

  5. 最短的可通过编译的C语言程序

    要求:写一个最短的,能通过编译的C语言程序,但不要求能正确运行. 一般人首先想到的是除0.即 int main() { /; } 除0会引发SIGFPE信号(浮点异常). 我们也可以删掉return, ...

  6. VisualStudio基本使用(2)-使用VS2013来编译C语言程序

    切换到C语言程序所有目录,执行cl test.c

  7. java画图程序_图片用字母画出来_源码发布_版本二

    在上一个版本:java画图程序_图片用字母画出来_源码发布 基础上,增加了图片同比例缩放,使得大像素图片可以很好地显示画在Notepad++中. 项目结构: 运行效果1: 原图:http://imag ...

  8. java画图程序_图片用字母画出来_源码发布

    在之前写了一篇blog:java画图程序_图片用字母画出来 主要是把一些调试的截图发布出来,现在程序调试我认为可以了(当然,你如果还想调试的话,也可以下载源码自己调试). 就把源码发布出来. 项目结构 ...

  9. java画图程序_图片用字母画出来

    最近在研究怎样将图片用字母在文本编辑工具中“画”出来. 你看了这个可能还不知道我想说什么? 我想直接上图,大家一定就知道了 第一张:小猫 原图:http://www.cnblogs.com/hongt ...

随机推荐

  1. IOS即时通讯XMPP搭建openfire服务器

    一.下载并安装openfire 1.到http://www.igniterealtime.org/downloads/index.jsp下载最新openfire for mac版 比如:Openfir ...

  2. DateFormat 竟然是非线程安全的?!!!!!

    今天撸代码忽然发现一个奇怪的一场抛出,经过一番排查发现有可能DateFormat 的多线程问题造成的,网上一查DateFormat竟然非线程安全.那我原先的代码...(细思极恐)

  3. EasyUI datagrid 的checkbox设置

    参考url: http://blog.csdn.net/baronyang/article/details/9323463 我的需求: 抓取数据生成的日志,日志中有部分是抓取失败的,需要将失败的发送到 ...

  4. 用python实现模拟登录人人网

    用python实现模拟登录人人网 字数4068 阅读1762 评论19 喜欢46 我决定从头说起.懂的人可以快速略过前面理论看最后几张图. web基础知识 从OSI参考模型(从低到高:物理层,数据链路 ...

  5. 4.ICMP协议,ping和Traceroute

    1.IMCP协议介绍 前面讲到了,IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成.其中一个重要的模块就是ICMP(网络控制报文)协议. 当传送 ...

  6. 用scala实现一个基于TCP Socket的快速文件传输程序

    这是用scala实现的一个简单的文件传输程序. 服务端 package jpush import java.io.{DataInputStream, File, FileOutputStream} i ...

  7. Angular - - Angular数据类型判断

    angular.isArray 判断括号内的值是否为数组. 格式:angular.isArray(value); value: 被判断是否为数组的值. ------------------------ ...

  8. MySQL服务器的线程数查看方法

    mysql重启命令:/etc/init.d/mysql restart MySQL服务器的线程数需要在一个合理的范围之内,这样才能保证MySQL服务器健康平稳地运行.Threads_created表示 ...

  9. Spinnerd的功能和用法

    此处的Spinner其实是一个列表选择框.不过Android的列表选择框并不是需要下拉列表的,而是相当于弹出一个菜单供用户选择. Spinner和Gallery都继承了AbsSpinner,AbsSp ...

  10. jdbc数据连接池dbcp要导入的jar包

    jdbc数据连接池dbcp要导入的jar包 只用导入commons-dbcp-x.y.z.jarcommons-pool-a.b.jar