#include <stdio.h>
#include <windows.h>//实现代码框大小和颜色改变
#include <stdlib.h>
#define LEN sizeof(struct Student)
typedef struct stu{
char number[20]; //学号
char name[10]; //姓名
char sex[4]; //性别
int Chinese; //语文成绩
int Math; //数学成绩
int English; //英语成绩
int total; //总分
}stu;
//嵌套
struct Student{
//数据域 (保存数据)
stu date;
//指针域 (传递)
struct Student* next; //指向下一个结点的指针(保存下一个的值)
};//链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,
//还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,
//一般以head来表示,存放的是一个地址
//链表把结构体变量和结构体变量通过指针链接在一起,(静态链表)如studen1.next=&studen2;studen2.next=&studen3;就这样子链接在一起
struct Student* head = NULL;//因为还有没申请空间首位一样都是null
struct Student* end = NULL;//定义两个结构体变量初始化,结构体指针指向空地址,并且全局 ,
void Add(){
system("cls");//1.3.0程序运行的时候都会将上一次运行输出的内容给清除掉
int count;
printf("请输入要录入信息的个数:");
scanf("%d",&count);
struct Student *s1,*s2,*temp;//定义了三个结构体指针
s1=s2=(struct Student*)malloc(LEN);// LEN sizeof(struct Student)开辟动态内存分配赋给s1,s2.
//函数返回值: 成功:返回开辟好的空间首地址。失败:返回NULL
//申请完后s1,s2,temp就是结构体变量
//结构体变量申请前必须被初始化
if(head==NULL){//新建节点申请内存失败失败
head = s1;//让从s1开始,开辟的空间属于文件里面的数据结构的线性结构。
}else{
end->next = s1 ;//指向下一个结点s1
}
int i = 1;
while(count>0){
printf("请输入第%d位学生信息:\n",i++);
printf("学号:\n");
scanf("%s",&s1->date.number);//等价于(*s1).name及指向结构体中的数量 /下面同理可得 ->更加方便就是指向
printf("姓名:\n");
scanf("%s",&s1->date.name);
printf("性别:\n");
scanf("%s",&s1->date.sex);
printf("语文成绩:\n");
scanf("%d",&s1->date.Chinese);
printf("数学成绩:\n");
scanf("%d",&s1->date.Math);
printf("英语成绩:\n");
scanf("%d",&s1->date.English);
s1->date.total=s1->date.Chinese+s1->date.English+s1->date.Math;
count--;
s2->next=s1;//s2链接s1
s2=s1;//把s1的数据赋给s2,存起来
s1=(struct Student*)malloc(LEN);//在申请一个新空间
printf("添加成功!\n");
system("pause");//1.3.1system("PAUSE") 就是暂停程序的执行,等待任意健继续执行。
system("cls");//清空
}
s2->next= NULL;//s2的建立下一个结点被赋予null
end = s2;//然后就成了尾结点。
printf("全部添加成功!\n");
system("pause");
}
void View(){
system("cls");
struct Student *VS;
printf("输入要查询信息的学生学号:\n");
char num[10];
int flag=1;
scanf("%s",&num);
for(VS=head;VS!=NULL;){
if(strcmp(VS->date.number,num)==0){
printf("成功找到!\n");
printf("学号:%s\t姓名:%s\t性别:%s\n",VS->date.number,VS->date.name,VS->date.sex);
printf("语文:%d\t数学:%d\t英语:%d",VS->date.Chinese,VS->date.Math,VS->date.English);
flag=0;
break;
}
VS=VS->next;//遍历链表数据与输入number对比找到是否一样的。
}
if(flag){
printf("不好意思,未找到!\n");
}
system("pause");
}
void ViewAll(){
system("cls");
struct Student *VA;
if(head!=NULL){//遍历链表全部打出来 只要不是空的就执行
printf("所有学生成绩如下:\n");
for(VA=head;VA!=NULL;){
printf("学号:%s\t姓名:%s\t性别:%s\n",VA->date.number,VA->date.name,VA->date.sex);
printf("语文:%d\t数学:%d\t英语:%d\n",VA->date.Chinese,VA->date.Math,VA->date.English);
VA=VA->next;
}
}else{
printf("该系统中还未录入信息");
}
system("pause");
}
void Repair(){
system("cls");
struct Student *RS;
char num[10];
int flag = 1;
printf("输入要修改成绩学生的学号:\n");
scanf("%s",num);
for(RS=head;RS!=NULL;){//遍历加不是空null
if(strcmp(RS->date.number,num)==0){
printf("成功找到该学生");
printf("学号:%s\t姓名:%s\t性别:%s\n",RS->date.number,RS->date.name,RS->date.sex);
printf("语文:%d\t数学:%d\t英语:%d\n",RS->date.Chinese,RS->date.Math,RS->date.English);
flag = 0;
printf("学号:\n");
scanf("%s",&RS->date.number);
printf("姓名:\n");
scanf("%s",&RS->date.name);
printf("性别:\n");
scanf("%s",&RS->date.sex);
printf("语文成绩:\n");
scanf("%d",&RS->date.Chinese);
printf("数学成绩:\n");
scanf("%d",&RS->date.Math);
printf("英语成绩:\n");
scanf("%d",&RS->date.English);
printf("修改成功");
system("pause");
}
RS=RS->next;
}
if(flag){
printf("输入信息有误,未查询到");
system("pause");
}
}
void Delete(){
system("cls");
int flag =1;
while(flag){
printf("请输入要删除的学生学号:");//把链表前距离点和后距离点相连接即可
char num[10];
scanf("%s",&num);
struct Student * DS,*temp;
for(DS=head;DS!=NULL;){//遍历链表
if(strcmp(DS->date.number,num)==0){
if(DS==head){//如果第一次就找到要删除的结点,就让他的尾针指向下一个
head = DS->next;
flag = 0;
printf("删除成功!\n");
system("pause");
}else{
flag = 0;
printf("删除成功!\n");
temp->next= DS->next;//把temp的下一个结点给 Ds的下一个结点,就可以孤立要删除的Ds
free(DS);//释放多余空间
system("pause");
}
}
temp = DS;//链表传递给两个链表距离很近在一起
DS=DS->next;
}
if(flag){
printf("未找到该学生学号!\n");
system("pause");
}
}
}
void xueshengmima(const char* pa1)
{
int i=0,ret;
printf("进入学生系统请输入密码:>");
while(1)
{
scanf("%s", pa1);
ret = strcmp(pa1, "12345");//比较两个字符串是否一样
//ret=0如果string1小于string2则返回<0的数字
//如果string1等于string2则返回0
//如果string1大于string2则返回>0的数字
if (ret == 0) {
printf("密码正确!\n");
break;
}else{
printf("这个密码是错误!\n");
printf("请输入正确的密码:\n" ) ;
}
}
//C语言中,exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束,跳回操作系统。exit(0) 表示程序正常退出;exit(1)、exit(-1)表示程序异常退出。
}
void laoshimima(const char* pa2)
{
int i=0,ret;
printf("进入老师系统请输入密码:>");
while(1)
{
scanf("%s", pa2);
ret = strcmp(pa2, "abcde");//比较两个字符串是否一样
//ret=0如果string1小于string2则返回<0的数字
//如果string1等于string2则返回0
//如果string1大于string2则返回>0的数字
if (ret == 0) {
printf("密码正确!\n");
break;
}else{
printf("这个密码是错误!\n");
printf("请输入正确的密码:\n" ) ;
}
}
}
void jiemianxitong (){
char str1[15];
char str2[15];
strcpy(str1,"12345");
strcpy(str2,"abcde");//strncpy字符串拷贝操作(前n个字符)
//12345拷贝进去字符串
const char* pa1 = str1;//是指向pa的指针然后把str赋给他
const char* pa2 = str2;
printf("*************************************************************************************************\n") ;
printf("*\t\t\t\t\t 教务系统欢迎你!\t\t\t\t\t*\n") ;
printf("*\t\t\t\t\t1.管理员管理系统\t\t\t\t\t*\n");
printf("*\t\t\t\t\t2.学生管理系统\t\t\t\t\t\t*\n");
printf("*\t\t\t\t\t3. 退出系统\t\t\t\t\t\t*\n") ;
printf("*************************************************************************************************\n") ;//都要换行
//声明和调用老师的密码和学生的密码
printf("请选择进入哪一个系统");
int choice;
void xueshengmima();
loop:
scanf("%d",&choice);
void laoshiMenu();
void xueshengMenu();
switch (choice){
case 1:
laoshimima(pa2);
laoshiMenu();
case 2:
xueshengmima(pa1);
xueshengMenu();
case 3:
printf("感谢唐学长和卢丝姐对学弟的大力支持无私帮助,有了你们方能成就这个系统");
printf("88祝你生活愉快!!!");
exit(0);
//C语言中,exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束,跳回操作系统。exit(0) 表示程序正常退出;exit(1)、exit(-1)表示程序异常退出
default:
printf("输入有误,请重新选择:");
goto loop;
}
system("pause");
system("cls");
}
void laoshiMenu(){
void laoshiMenu();
void xueshengMenu();
void jiemianxitong();
void Add();
void View();
void ViewAll();
void Delete();
void Repair();
system("cls");
printf("1、学生信息录入\n");
printf("2、学生单个成绩查询\n");
printf("3、查询全部学生成绩\n");
printf("4、修改学生信息\n");
printf("5、删除学生信息\n");
printf("6、总分排行和统计学生数量\n") ;
printf("7、退出系统\n");
printf("8.切换系统\n");
int choice;
printf("请选择要使用的功能:\n");
loop:
scanf("%d",&choice);
switch (choice) {
case 1:
Add();//添加 1.3
laoshiMenu();
case 2:
View();
laoshiMenu();
case 3:
ViewAll();
laoshiMenu();
case 4:
Repair();
laoshiMenu();
case 5:
Delete();
laoshiMenu();
case 6:
laoshiMenu();
case 7:
printf("感谢唐学长和卢丝姐对学弟的大力支持无私帮助,有了你们方能成就这个系统");
exit(0);
case 8:
jiemianxitong();
xueshengMenu();
default:
printf("输入有误,请重新选择:");
goto loop; //无条件跳转到输入位置即可重新进行选择
}
}
void xueshengMenu(){
void xueshengMenu();
void laoshiMenu();
void jiemianxitong();
void Add();
void View();
void ViewAll();
void Delete();
void Repair();
system("cls");
printf("1、学生单个成绩查询\n");
printf("2、查询全部学生成绩\n");
printf("3、总分排行和统计学生数量\n");
printf("4、退出系统\n");
printf("5、切换系统\n");
int choice;
printf("请选择要使用的功能:\n");
loop:
scanf("%d",&choice);
switch (choice) {
case 1:
View();
xueshengMenu();
case 2:
ViewAll();
xueshengMenu();
case 3:
xueshengMenu();
case 4:
printf("感谢唐学长和卢丝姐对学弟的大力支持无私帮助,方能成就这个系统");
exit(0);
case 5:
jiemianxitong();
laoshiMenu();
default:
printf("输入有误,请重新选择:");
goto loop; //无条件跳转到输入位置即可重新进行选择
}
}
int main(){
//1.0把所有函数声明有一边
void Menu();//菜单
void Add();//添加
void View();//查询
void Delete();//删除
void Repair();//修改
void ViewAll();//查询全部
void jiemianxitong();
void xueshengmima();
void laoshimima();
jiemianxitong ();
}
呕心沥血熬了周末两天,写出了这个接近500行代码,对于我这个初学编程(C语言都没学完)的人有多困难就不多说了吧,再次之中我还请教了编程协会的大佬在此再次感谢学长学姐他们的帮助