// 学生管理系统2.cpp : 定义控制台应用程序的入口点。
//

#include “stdio.h”
#include “stdlib.h”
#include “string.h”
#include <conio.h> /调用getch的头文件;getch用于暂停程序/
int saveflag = 0;
#define PT “※\t%-5s\t%-5s\t%-5s\t%-5s\t%-5s\t%-5s\t※\n”,p->data.num,p->data.name,p->data.sex,p->data.age,p->data.zy,p->data.score

/*
是否需要存盘的标志变量
/ struct employee
{
char num[10];
char name[15];
char sex[4];
char age[4];
char zy[5];
char score[3];
};
typedef struct node
{
struct employee data;
struct node next;
}Node, Link; //Link l (注意是:字母l不是数字1)
void add(Link l);
void disp(Link l); //查看所有信息
void del(Link l); //删除功能
Node
Locate(Link l, char findmess[], char nameornum[]);
void Qur(Link l); //查询功能
void Sort(Link l); //排序
void Modify(Link l); //修改功能
void save(Link l); //将单链表l中的数据写入文件
void printe(Node p); //本函数用于打印链表中某个节点的数据内容
//以下4个函数用于输出中文标题
void printstart();
void Wrong();
void Nofind();
void printc();
void menu()
{
printf("\t
**************************************************************\n");
printf("\t* \n");
printf("\t
学生信息管理系统_结构体数组实现 \n");
printf("\t
\n");
printf("\t
[1] 增加学生信息 [2] 删除学生信息 \n");
printf("\t
[3] 查询学生信息 [4] 修改学生信息 \n");
printf("\t
[5] 排序 [6] 保存学生信息 \n");
printf("\t
[7] 显示数据 [0] 退出系统 \n");
printf("\t
\n");
printf("\t
\n");
printf("\t
****************************************************************\n");
} //void menu菜单结束
void Disp(Link l) //显示单链表l中存储的学生记录,内容为employee结构中定义的内容
{
int count = 0;
Node p;
p = l->next; // l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息
if (!p) /
pNULL,NUll在stdlib中定义为0/
{
printf("\n===>提示:没有学生记录可以显示!\n");
return;
}
printf("\t\t\t\t显示结果\n");
printstart(); //打印横线
printc(); //打印各学科标题
printf("\n");
while § //逐条输出链表中存储的学生信息
{
printe§; p = p->next;
}
printstart(); printf("\n");
system(“pause”);
} //void Disp结束
void printstart()
{
printf("-------------------------------------------------------------------------------------------\n");
}
void Wrong()
{
printf("\n=====>提示:输入错误!\n");
}
void Nofind()
{
printf("\n=====>提示:没有找到该学生!\n");
}
void printc() / 本函数用于输出中文 /
{
printf("※\t学号\t姓名\t性别\t年龄\t专业\t分数\t※\n");
}
void printe(Node p)/ 本函数用于打印链表中某个节点的数据内容
/
{
printf(PT);
}
//Locate(l,findmess,“num”);
/* 该函数用于定位连表中符合要求的结点,并返回该指针*/
Node* Locate(Link l, char findmess[], char nameornum[])
{
Node r; if (strcmp(nameornum, “num”) == 0) / 按学号查询 /
{
r = l->next;
while (r != NULL)
{
if (strcmp(r->data.num, findmess) == 0) /
若找到findmess值的学号/
return r;
r = r->next;
}
}
else if (strcmp(nameornum, “name”) == 0) / 按名字*/
{
r = l->next;
while (r != NULL)
{
if (strcmp(r->data.name, findmess) == 0) /若找到findmess值的名字/
return r;
r = r->next;
}
}
return 0; /若未找到,返回一个空指针/
}
//add()函数中,无节点时,r指向list头,有节点时,r指向末尾节点
void Add(Link l)
{
Node *p, *r, *s;
char num[10];

r = l;
s = l->next; //链表没有节点时, s=null;/链表有节点时,指向第一个节点
while (r->next != NULL) //如果存在后继结点时,r指针后移一个r = r->next; /*将指针移至于链表最末尾,准备添加记录*/
while (1)
{printf("请你输入学号(以'0'返回上一级菜单:)");scanf("%s", num);if (strcmp(num, "0") == 0)  /*输入'0',跳出while(1),即跳出add()函数*/break;s = l->next; /*每次从第一个节点开始找,看num是否重复。学号重复时,返回主菜单*/while (s){if (strcmp(s->data.num, num) == 0){printf("=====>提示:学号为'%s'的学生已经存在,若要修改请你选择'4 修改'!\n", num);return;}s = s->next;} //while(s) p = (Node *)malloc(sizeof(Node)); //生成没赋值的新节点 p     printf("请你输入学生姓名:");scanf("%s", p->data.name);   getchar();printf("请你输入学生性别:");scanf("%s", p->data.sex);    getchar();printf("请你输入学生年龄:");scanf("%s", &p->data.age);   getchar();printf("请你输入学生专业:");scanf("%s", &p->data.zy);    getchar();printf("请你输入学生分数:");scanf("%s", &p->data.score); getchar();p->next = NULL;  /*表明这是链表的尾部结点*/r->next = p;     /*将新建的结点加入链表尾部中*/r = p;}

}
void Del(Link l)
{
int sel;
Node *p, *r;
char findmess[20];
if (!l->next) /*当list无后继结点时,提示和结束返回del() */
{
printf("\n=====>提示:没有记录可以删除!\n");
getch();
return;
}
printf("\n=====>1按学号删除\n=====>2按姓名删除\n");
scanf("%d", &sel);
if (sel == 1) //按学号删除
{
printf(“请你输入要删除的工号:”);
scanf("%s", findmess);
p = Locate(l, findmess, “num”);
if §
{
r = l;
while (r->next != p)
r = r->next; //从第一个结点找起,直到发现r->next=p, 是待删除结点,跳出循环
r->next = p->next; //r r->next§ p->next
free§;
printf("\n=====>提示:该学生已经成功删除!\n");
}
else
Nofind(); //显示一句话
} //if(sel1)
else if (sel == 2) //按姓名删除
{
printf(“请你输入要删除的姓名:”);
scanf("%s", findmess);
p = Locate(l, findmess, “name”);
if §
{
r = l;
while (r->next != p)
r = r->next;
r->next = p->next; //r r->next§ p->next
free§;
printf("\n===>提示:该学生已经成功删除!\n");

 }elseNofind();
}
elseWrong(); //显示输入错误的话
system("pause");

}
void Qur(Link l)
{
char z, t[10];
Link p;
int ch/选择/, s = 0/记录符合条件的信息条数/;
p = l;
printf(“请选择查询方式:\n”);
printf("\tKaTeX parse error: Expected 'EOF', got '\t' at position 9: <1>按专业查询\̲t̲<2>按年龄查询\n");
printf("\tKaTeX parse error: Expected 'EOF', got '\t' at position 9: <3>按姓名查询\̲t̲<4>按学号查询\n");
printf("\t$<0>返回主菜单\n");
printf(“请输入序号:”);
scanf("%d", &ch);
switch (ch)
{
case 1:
{
printf(“请输要查询的专业:”);
scanf("%s", t);
while (p != NULL)
{
if (strcmp(p->data.zy, t) == 0)
{
s++;
if (s == 1)/只输出一条以下输出内容/
printc();
printf(PT);
}
p = p->next;
}

}; break;
case 2:
{printf("请输要查询的年龄:");scanf("%s", t);while (p != NULL){if (strcmp(p->data.age, t) == 0){s++;if (s == 1)printc();printf(PT);}p = p->next;}
}; break;
case 3:
{printf("请输要查询的姓名:");scanf("%s", t);while (p != NULL){if (strcmp(p->data.name, t) == 0){s++;if (s == 1)printc();printf(PT);}p = p->next;}
}; break;
case 4:
{printf("请输要查询的学号:");scanf("%s", t);while (p != NULL){if (strcmp(p->data.num, t) == 0){s++;if (s == 1)printc();printf(PT);}p = p->next;}
}; break;
case 0:return; break;
}
if (s == 0)/*信息表中不存在要搜索的信息*/printf("不存在此信息!\n");
printf("是否继续查询?(Y/N)\n");/*选择是否继续执行本功能*/
scanf("%c", &z);
if (z == 'y' || z == 'Y')Qur(l);
elseprintf("按任意键返回主菜单\n");
return;

}
void Modify(Link l) //修改功能
{
Node p;
char findmess[20];
if (!l->next)
{
printf("\n=====>提示:没有资料可以修改!\n");
return;
}
printf(“请你输入要修改的学生学号:”);
scanf("%s", findmess);
p = Locate(l, findmess, “num”);
if §
{
printf(“请输入学生新学号(原来是%s):”, p->data.num);
scanf("%s", p->data.num); getchar();
printf(“请输入学生新姓名(原来是%s):”, p->data.name);
scanf("%s", p->data.name); getchar();
printf(“请输入学生新性别(原来是%s):”, p->data.sex);
scanf("%s", p->data.sex); getchar();
printf(“请输入学生新年龄(原来是%s):”, p->data.age);
scanf("%s", &p->data.age); getchar();
printf(“请输入学生新专业(原来是%s):”, p->data.zy);
scanf("%s", &p->data.zy); getchar();
printf(“请输入学生新分数(原来是%s):”, p->data.score);
scanf("%s", &p->data.score); getchar();
printf("\n=====>提示:资料修改成功!\n"); //shoudsave=1;
}
else
Nofind();
}
void Sort(Link l)
{
Link p, i, q, j;
char ch;
p = (Link)malloc(sizeof(Node));
p = q = l->next;
printf(“原信息如下:\n”);
Disp(l);
printf(“是否进行排序?(Y/N):”);
getchar();
scanf("%c", &ch);
if (ch == ‘N’ || ch == ‘n’)
return;
while (q->next != NULL)/
用于进行结点中内容的判断和交换/
{
i = q->next;/使i指向q的后一结点/
while (i != NULL)
{
if (strcmp(q->data.num, i->data.num)>0)/符合条件则通过下列方式对结点中内容进行交换/
{
j->data = q->data;
q->data = i->data;
i->data = j->data;
}
i = i->next;
}
q = q->next;
}/while/
printf(“排序完成!\n”);
printf(“即将返回主菜单!”);
return;
}
void Save(Link l)
{
FILE fp;
Node *p; //实现保存操作的临时的结构体指针变量
int count = 0;
fp = fopen(“student.txt”, “wb”);
if (fp == NULL)
{
printf("\n=====>提示:重新打开文件时发生错误!\n");
return;
}
p = l->next; //p指向第一个记录结点
while §
{
if (fwrite(p, sizeof(Node), 1, fp) == 1) //将第一个记录结点值写入文件
{
p = p->next; //依次写入第二个结点的值,
count++; //文件的记录数+1
}
else
break;

} //while(p)
if (count>0)
{printf("\n=====>提示:文件保存成功.(有%d条记录已经保存.)\n", count);
}
else
{system("cls");printf("保存文件失败,'0'条记录被保存!\n");
}
fclose(fp);

} // void Save结束
void main()
{
Link list;/定义链表/
// struct node list;
FILE fp; / 文件指针 /
int choose; /
保存选择结果变量
/
char ch; /保存(y,Y,n,N)/
int count = 0; /保存文件中的记录条数(或结点个数)/
struct node p, r; /定义记录指针变量/
printf("\t\t\t\t学生信息管理系统\n\t\t\t\t\n");
list = (struct node)malloc(sizeof(struct node));
if (!list)
{
printf("\n allocate memory failure “); /如没有申请到,打印提示信息/
return; /返回主界面/
}
list->next = NULL;
r = list;
fp = fopen(“student.txt”, “rb”);
if (fp == NULL)
{
printf(”\n=====>提示:文件还不存在,是否创建?(y/n)\n");
scanf("%c", &ch);
if (ch == ‘y’ || ch == ‘Y’)
fp = fopen(“student.txt”, “ab+”);
else
exit(0);
} // if(fpNULL)
printf("\n===>提示:文件已经打开,正在导入记录…\n");
while (!feof(fp)) //没有到文件尾时,循环
{
p = (struct node)malloc(sizeof(struct node));
if (!p)
{
printf(" memory malloc failure!\n"); /没有申请成功/
return; /退出/
}
if (fread(p, sizeof(struct node), 1, fp)) / 读文件的已有内容放入结点中/
{
p->next = NULL;
r->next = p;
r = p; /* 将该结点挂入链表中, r指向最后的节点*/
count++;
}
} //while(!feof(fp))
fclose(fp); /* 关闭文件*/
printf("\n=====>提示:记录导入完毕,共导入%d条记录\n", count);
while (1)
{
system(“cls”);
menu();
printf("\t\t====>请选择:");
scanf("%d", &choose);
if (choose == 0)
{
if (1)
{
printf("\n=====>提示:资料已经改动,是否将改动保存到文件中(y/n)?\n");
scanf("%c", &ch);
if (ch == ‘y’ || ch == ‘Y’)
Save(list);
} //if
printf("\n=====>提示:你已经退出系统,谢谢使用本系统,再见!\n");
break;
}//if
switch (choose)
{
case 1:Add(list); break;
case 2:Del(list); break;
case 3:Qur(list); break;
case 4:Modify(list); break;
case 5:Sort(list); break;
case 6:Save(list); break;
case 7:system(“cls”); Disp(list); break;
default:Wrong(); getchar(); break;
}
}
}

C语言--------学生管理系统(源代码)相关推荐

  1. c语言实现学生管理系统,C语言学生管理系统源代码

    <C语言学生管理系统源代码>由会员分享,可在线阅读,更多相关<C语言学生管理系统源代码(12页珍藏版)>请在人人文库网上搜索. 1.C语言学生成绩管理系统源代码,保证能用#in ...

  2. c语言编程学生管理系统的代码,C语言学生管理系统源代码.doc

    C语言学生成绩管理系统源代码,保证能用-- #include "malloc.h" #include "stdio.h" #include "stdl ...

  3. C语言-学生管理系统源代码

    一.学生管理系统算法分析(增删改查) 1.插入学生信息(需要具备数据结构基础) 建立头结点.建立新结点函数.建立新结点并插入数据 void InsertStudent() {//插入函数int x;s ...

  4. c语言学生管理系统常见问题,关于C语言学生管理系统问题

    关于C语言学生管理系统问题 我弄了两天啦~就快疯掉啦~本来那个txt文件还可以储存的~但现在又不能啦~还有那个输出所有学生的信息~我不会弄啊~~望各位达人伸出援手啊~~小弟感激不尽 #include ...

  5. C语言学生管理系统(期末作业,超详细哟,拿走不谢!!!)

    C语言学生管理系统 前言 很多学校都选择C语言作为学生编程入门语言,许多老师都会布置C语言期末大作业,作业题目很多就是学生信息管理系统,以前都是练习小题目,几十行代码就能搞定,而完整的写完这个系统我用 ...

  6. C语言学生管理系统(开源)

    大一课设 - 一个不算糟糕的C语言学生管理系统(附报告书) 大一的时候可真美好啊,当时为了实现一个项目熬夜写一个星期都不觉得累,反而单人完成项目之后还异常兴奋,有种难言的喜悦感,也挺佩服当时的自己的, ...

  7. java学生信息管理系统排序_JAVA学生管理系统源代码(最新整理)

    <JAVA学生管理系统源代码(最新整理)>由会员分享,可在线阅读,更多相关<JAVA学生管理系统源代码(最新整理)(10页珍藏版)>请在人人文库网上搜索. 1.JAVA 学生管 ...

  8. C语言学生管理系统心得

    心得: 10天基本完成了学生管理系统,任务很紧,还好坚持了下来.考核前一天改bug到凌晨三点多,虽然现在依然功能未能完善,逻辑上还有问题.但是总体的感受是,并没有想象中那样,困难到无法实现,收获真的很 ...

  9. C语言学生管理系统(将数据保存至TXT文档)附源码

    C语言学生管理系统(将数据保存至TXT文档) 在大一学习完C语言之后,回家遇到疫情,便有了用C语言写一个学生管理系统的想法,在家花费了一些时间,刚开始写了一点,后来可能是因为学艺不精就没写完,开学到现 ...

  10. 学生管理程序c语言数组,c语言学生管理系统(c语言学生信息管理系统)

    要求:1记录学生班级姓名,性别,职务住址情况,数据输入数据删除排序查. #include /*引用库函数*/ #include #include #include typedef struct /*定 ...

最新文章

  1. windows2003的一些设置之一
  2. 监听网页微信扫码支付成功_网付扫码点餐新福利,消费者点餐可获微信支付金币奖励...
  3. 信息安全工程师笔记-综合知识冲刺(二)
  4. 华为业务板块_复盘丨华为Mate30发布 电子板块再爆涨停潮
  5. 吴恩达教授机器学习课程笔记【七】- Part 7 最优模型选择
  6. springboot 嵌入式容器
  7. 软件测试(七):自动化测试、安全测试、性能测试
  8. C++:round函数用法
  9. 12306自动抢票软件代码实现
  10. Java、JSP教师信息管理系统
  11. num find matlab,matlab中find函数的使用说明
  12. JanusGraph删除shema操作Java api
  13. Linux添加开机自启服务
  14. 什么叫横向比较和纵向比较
  15. 微信小程序云开发之Node部署
  16. strace命令使用方式
  17. 洛谷:P3654 First Step (ファーストステップ)
  18. 同态加密中的一些技术概念
  19. 李彦宏: 《硅谷商战》 节选
  20. Unity中OnTriggerEnter2D 和OnCollisionEnter2D 的使用情形及容易掉的坑

热门文章

  1. python装饰器两层和三层_python装饰器为什么要双层嵌套函数
  2. 苹果充电器怎么辨别真假_9款热门充电器盘点——苹果、Anker、Thinkplus、紫米、小米、锤子,谁更值得买?...
  3. opencv怎么2个摄像头_内脏脂肪过高怎么办?从2个方法入手,坚持3个月甩掉小肚腩...
  4. 数据结构与程序的关系_java主程:数据结构和算法的区别别再搞混了,否则开除...
  5. 前后端分离项目部署_不用Docker前后端分离项目如何快速部署
  6. 如何将新的token发给前端比较好_前端工程师为什么要学习编译原理?
  7. oracle设置memory_target,oracle初始化参数之memory_target
  8. html 椭圆特效,HTML帖图常用到的特效《椭圆形》(国外英语资料).doc
  9. java设计模式 观察者模式_JAVA设计模式之观察者模式
  10. 安卓和php开发融云聊天室,聊天室