第四天还差恢复已删除学生功能

  对于我来说,已经开始很复杂了。

小细节太重要了,边写边出错


  1 #include<stdio.h>
#include<stdlib.h>
#include<string.h> #define StuIdlen 12//学生学号长度
#define StuNamelen 12//学生姓名长度
typedef struct Stu
{
char StuName[StuNamelen];
char StuId[StuIdlen];
int score;
struct Stu* pNext;//下一个指针
}Stu_data; //学生数据类型
//声明链表的头和尾
Stu_data* g_pHead =NULL;
Stu_data* g_pEnd =NULL; //初始化0
void show_main();//展示功能面板 声明
void AddStu( char *iStuName,char *iStuId,int iscore);//添加学生信息
//清空列表
void FreeLinkData();
//打印数据
void showStu_data();
//链表头添加一个节点
void HeadAddStu( char *iStuName,char *iStuId,int iscore);//添加学生信息
//查找指定学生
Stu_data* FindStu(char* iStuId);
//指定位置插入节点
void InsertNode(Stu_data* pTemp,char *iStuName,char *iStuId,int iscore);
//查找指定的学生信息
void FindStudata(char* iStuId);
//删除指定的学生信息
void DeleteStuNode(Stu_data* pNode);
//保存信息进文件
void SaveStuToFile();
//读取文件中学生的信息
void ReadStuFormFile();
int main()
{ int chose;
int run =;//永真run
show_main();//调用
while(run)//永真执行操作
{
printf("*****************请输入指令(帮助10)*********************\n");
scanf("%d",&chose); switch(chose)
{
case :
printf("*****************1.增加学生信息***************************\n");
char iStuName[StuNamelen];
char iStuId[StuIdlen];
int iscore;
printf("输入学生姓名:");
scanf("%s",iStuName);
getchar();
printf("输入学生学号:");
scanf("%s",iStuId);
printf("输入学生成绩:");
scanf("%d",&iscore);
AddStu(iStuName,iStuId,iscore);
printf("*******************增加信息成功***************************\n"); break;
case :
printf("*****************11.增加学生信息(头添加)******************\n");
/*char iStuName[StuNamelen];
char iStuId[StuIdlen];
int iscore;
*/
printf("输入学生姓名:");
scanf("%s",iStuName);
getchar();
printf("输入学生学号:");
scanf("%s",iStuId);
printf("输入学生成绩:");
scanf("%d",&iscore);
HeadAddStu(iStuName,iStuId,iscore);
printf("*******************增加信息成功***************************\n");
//头添加
break;
case :
{ Stu_data* pTemp =NULL;
printf("输入指定学号");
scanf("%s",iStuId);
pTemp=FindStu(iStuId);
if(NULL!=pTemp)
{ scanf("%s",iStuId);
printf("输入学生姓名:");
scanf("%s",iStuName);
getchar();
printf("输入学生学号:");
scanf("%s",iStuId);
printf("输入学生成绩:");
scanf("%d",&iscore);
InsertNode(pTemp,iStuName,iStuId,iscore);
printf("*******************信息插入成功***************************\n");
}
break;
}
case :
printf("*****************2.查找指定的学生信息*********************\n");
printf("输入学生学号:");
scanf("%s",iStuId);
FindStudata(iStuId);
printf("*******************信息显示成功***************************\n");
break;
case :
printf("*****************3.修改指定的学生信息*********************\n");
printf("输入学生学号:");
scanf("%s",iStuId);
//查找
Stu_data* pTemp = FindStu(iStuId) ;
//打印
char c;
if(NULL != pTemp)
{
getchar();
printf("是否修改学号?Y/N\n");
scanf("%c",&c);
//修改学号
if('Y'==c){
printf("修改学号:") ;
scanf("%s",iStuId);
strcpy(pTemp->StuId,iStuId);
}
getchar();
printf("是否修改名字?Y/N\n");
scanf("%c",&c);
//修改名字
if('Y'==c){
printf("修改名字:") ;
scanf("%s",iStuName);
strcpy(pTemp->StuName,iStuName);
}
getchar();
printf("是否修改分数?Y/N\n");
scanf("%c",&c);
//修改分数
if('Y'==c){
printf("修改分数:");
scanf("%d",&iscore);
pTemp->score=iscore;
} }
printf("*******************信息修改成功***************************\n");
break;
case :
printf("*****************4.保存业主的信息到文件中*****************\n");
//保存函数
SaveStuToFile(); printf("*******************信息成功保存***************************\n");
break;
case :
ReadStuFormFile();
break;
case :
printf("*****************6.删除指定的学生的信息*******************\n");
printf("输入学生学号:");
scanf("%s",iStuId);
//查找
pTemp = FindStu(iStuId); //删除这个节点
if(NULL !=pTemp)
{
//调用学生删除函数 DeleteStuNode(pTemp); }
break;
case :
printf("*****************9.显示所有的学生的信息*******************\n");
showStu_data();
printf("*******************信息显示成功***************************\n");
break;
case :
printf("*****************0.退出系统*******************************\n");
run=;
break;
case :
show_main();//调用
break;
default:
printf("*****************!.输入错误*******************************\n");
break;
} }
FreeLinkData();
system("PAUSE");
return ;
} void show_main()//展示功能面板 定义
{
printf("*******************学生管理系统***************************\n");
printf("*******************系统功能如下***************************\n");
printf("*****************1.增加学生信息(尾添加)*******************\n");
printf("*****************11.增加学生信息(头添加)******************\n");
printf("*****************111.增加学生信息(指定位置添加)***********\n");
printf("*****************2.查找指定的学生信息*********************\n");
printf("*****************3.修改指定的学生信息*********************\n");
printf("*****************4.保存业主的信息到文件中*****************\n");
printf("*****************5.读取文件中的业主的信息*****************\n");
printf("*****************6.删除指定的学生的信息*******************\n");
printf("*****************7.恢复删除的学生的信息*******************\n");
printf("*****************9.显示所有的学生的信息*******************\n");
printf("*****************10.查看面板******************************\n");
printf("*****************0.退出系统*******************************\n");
printf("**********************************************************\n"); }
void AddStu(char *iStuName,char *iStuId,int iscore)
{ //检验合法性质
if(NULL == iStuName||NULL == iStuId||iscore<)
{
printf("输入学生信息错误");
return ;
}
//逻辑判断-
//创建一个节点 Stu_data* pTemp=malloc(sizeof(Stu_data));
//节点成员附初始值
strcpy(pTemp->StuName,iStuName);
strcpy(pTemp->StuId,iStuId); pTemp->score=iscore;
pTemp->pNext=NULL;
// 接在链表上
if(g_pHead==NULL||g_pEnd==NULL)
{
g_pHead =pTemp;//link
g_pEnd =pTemp;//向后移动
}
else
{
g_pEnd->pNext = pTemp;
g_pEnd=pTemp;
} }
void FreeLinkData() //清空列表
{
Stu_data* pTemp = g_pHead;//记录节点
while(g_pHead !=NULL)
{
g_pHead=g_pHead->pNext;//向后移动了一个 free(pTemp);//删除节点 }
}
void showStu_data()//展示链表 showStu_data();
{
Stu_data* pTemp = g_pHead;
while(pTemp != NULL)
{
printf("学号:%15s,姓名:%10s,分数:%5d\n",pTemp->StuId,pTemp->StuName,pTemp->score);
pTemp=pTemp->pNext;//向后移动了一个
}
}
//链表头添加一个节点
void HeadAddStu( char *iStuName,char *iStuId,int iscore)//添加学生信息
{
//检测合法性
if(NULL == iStuName||NULL == iStuId||iscore < )
{
printf("学生信息输入错误");
return ;
}
//创建一个节点
Stu_data* pTemp = malloc(sizeof(Stu_data));
//成员赋值
strcpy(pTemp->StuName,iStuName);
strcpy(pTemp->StuId,iStuId);
pTemp->score = iscore;
pTemp->pNext = NULL;
if(NULL == g_pHead||NULL == g_pEnd)
{//链表为空
g_pHead = pTemp;
g_pEnd =pTemp; }
else
{
//新节点的下一个指向头先连后断
pTemp->pNext = g_pHead;
g_pHead=pTemp;
}
}
//查找指定学生
Stu_data* FindStu(char* iStuId)//201801013 12356
{
//检测参数合法性
if(NULL == iStuId)
{
printf("学号输入错误");
return NULL;
}
//遍历链表
Stu_data* pTemp=g_pHead;
while(pTemp)
{
if( == strcmp(pTemp->StuId,iStuId))
{
return pTemp;
}
pTemp=pTemp->pNext;
}
printf("查无此节点\n");
printf("*******************信息显示失败***************************\n");
return NULL;
} //指定位置插入节点
void InsertNode(Stu_data* pTemp,char *iStuName,char *iStuId,int iscore)
{
//创建一个节点
Stu_data* pnewTemp = malloc(sizeof(Stu_data));
//成员赋值
//成员赋值
strcpy(pnewTemp->StuName,iStuName);
strcpy(pnewTemp->StuId,iStuId);
pnewTemp->score = iscore;
pnewTemp->pNext = NULL;
if(pTemp==g_pEnd)//是尾节点
{
printf("是尾戒点\n");
g_pEnd->pNext=pnewTemp;
g_pEnd=pnewTemp; }
else
{
//先连后断
pnewTemp->pNext=pTemp->pNext;
pTemp->pNext=pnewTemp; }
}
//查找指定的学生信息
void FindStudata(char* iStuId)
{
Stu_data* pTemp=FindStu(iStuId);
if(pTemp ==NULL)
{
return ;
}
printf("学号:%15s,姓名:%10s,分数:%5d\n",pTemp->StuId,pTemp->StuName,pTemp->score);
}
//删除指定的学生信息
void DeleteStuNode(Stu_data* pNode)
{ //只有一个节点
if(g_pHead == g_pEnd)
{
free(g_pHead);
g_pHead = NULL;
g_pEnd = NULL;
}
//只有两个节点
else if(g_pHead->pNext==g_pEnd)
{
if(g_pHead==pNode)
{ free(g_pHead);
g_pHead=g_pEnd; }
else
{
free(g_pEnd);
g_pEnd=g_pHead;
g_pHead->pNext=NULL; }
}
//常规情况
else
{
Stu_data* pTemp=g_pHead;
if(g_pHead == pNode)//删除 特殊在头部
{
//记住头
pTemp=g_pHead;
g_pHead = g_pHead->pNext;
free(pTemp);
pTemp = NULL;
return;
}
//判断头
while(pTemp)
{
if(pTemp->pNext == pNode)
{
//删除 特殊在尾巴
if(pNode == g_pEnd)
{
free(pNode);
pNode == NULL;
g_pEnd = pTemp;
g_pEnd->pNext = NULL;
return ;
}
//删除
else
{
//记住删除的节点
Stu_data* p =pTemp->pNext;
pTemp->pNext = pNode->pNext;
//释放节点
free(p);
p = NULL;
return ; } }
pTemp=pTemp->pNext;
}
}
}
//保存信息进文件
void SaveStuToFile()
{
//判断链表是否为NULL
FILE* pFile = NULL;
Stu_data* pTemp = g_pHead;
char strBuf[] = {};
char strScore[] = {};
if(NULL == g_pHead)
{
printf("没有学生\n");
return ;
}
//打开文件
pFile = fopen("dat.dat","wb+");
if (NULL == pFile)
{
printf("打开文件失败\n");
return;
}
//操作文件指针
while(pTemp)
{
//学号赋值进去
strcpy(strBuf,pTemp->StuId);
strcat(strBuf,".");
//姓名赋值进去
strcat(strBuf,pTemp->StuName);
strcat(strBuf,".");
//分数赋值进去
itoa(pTemp->score,strScore,);
strcat(strBuf,strScore);
strcat(strBuf,"."); fwrite(strBuf,,strlen(strBuf),pFile);
fwrite("\r\n",,strlen("\r\n"),pFile);
pTemp = pTemp->pNext;
}
//关闭文件
fclose(pFile); }
//读取文件中学生的信息
void ReadStuFormFile()
{
FILE* pFile = fopen("dat.dat","rb+");
if(NULL == pFile)
{
printf("文件打开失败");
return; }
char strBuf[]={};
//操作指针,读取函数
char strName[StuNamelen] = {};
char strId[StuIdlen] = {};
char strScore[] = {}; int nCount =;
int j = ;
while(NULL != fgets(strBuf, , pFile))
{ int i = ;
nCount = ;
j = ;
for(i = ;strBuf[i] !='\r';i++)
{
if( == nCount)//没到点
{
strId[i] = strBuf[i];
printf("学号:%s,\n",strId);
if('.'== strBuf[i])
{
strId[i] = '\0';
nCount++;
}
}
else if ( == nCount)//第一个点
{ strName[j] = strBuf[i]; printf("姓名:%s,\n",strName);
if('.'== strBuf[i])
{
strName[j] ='\0';
nCount++;
j = ;
continue;
}
j++;
}
else //第二个点 (2 == nCount)
{
//int j=0;
if('.'== strBuf[i]){
strScore[j] ='\0';
nCount++;
j = ;
continue;
}
strScore[j] = strBuf[i];
printf("分数:%s,\n",strScore);
j++;
}
}
//插入到链表中
AddStu(strName,strId,atoi(strScore));
}
//关闭
fclose(pFile);
}

#007 C语言大作业学生管理系统第四天的更多相关文章

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

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

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

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

  3. 【C】C语言大作业——学生学籍管理系统

    文章目录 学生管理系统 界面 主界面 登陆界面 注册界面 管理界面 学生界面 退出界面 链接 注意 学生管理系统 学C语言时写的一个大作业,弄了一个带图形界面的,使用的是VS配合EasyX图形库进行实 ...

  4. C语言大作业---学生信息管理系统

    xxxx信息管理系统 简介 因为大作业规定的踩分项就那么多,为了不浪费时间 + 得分,就写成这样.现在看看,命名不规范,书写风格糟糕,全塞在一个源代码中······ 不过,应付大作业是没问题的 实验报 ...

  5. BMP图像直方图均衡算法(C语言大作业)

    万丈高楼平地起 C语言大作业 一.学习笔记篇 1.学习MarkDown MarkDown注重写作本身,而非花俏的界面 编辑器:vscode 插件:Markdown,Markdown Preview 2 ...

  6. 从零开始的C程序设计大作业——学生成绩管理系统

    前言 学生成绩管理系统可以说是C语言程序设计的结课的必备大作业了.花了些时间,费了些头发肝了下,完成了两个系统,一个是控制台版本的,另一个用easyx图形库进行了优化. 先放出完成后的演示图片占个坑. ...

  7. C++项目作业 学生管理系统

    /*Student.h*/#pragma once #include<string.h> using namespace std; #include<string> class ...

  8. 大一上C语言期末大作业-成绩管理系统

    都过了半年的作业了,觉得做过去得留下点什么,所以整理了代码发一下博客. 声明:程序在DevC++下用c文件模式可以正常编译使用.(控制台程序) 程序结构:

  9. c++大作业--学籍管理系统--

    1.题目描写叙述 学籍管理系统: 依据信息管理系统的业务流程.要求以及所要实现的目标,完毕下面功能: (1)建立学生档案的管理和维护.实现计算机自己主动化管理体制. (2)建立学生成绩管理机制,在计算 ...

随机推荐

  1. tiny210 tslib 测试(基于 ft5x06 触摸屏),解决触摸无效问题

    1. 拷贝至开发板 将上次实验中的 tmp 文件夹拷贝到开发板,可以通过 nfs 来传输,并将 tmp/lib 下的所有 .so 文件拷贝至 开发板的 /usr/lib 中,并且确保库的映射关系正确. ...

  2. ARM 汇编指令 DCD

    简介 DCD:数据定义( Data Definition )伪指令 一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化. 语法格式: 标号 DCD(或 DCDU) 表达式 DCD(或 ...

  3. mybatis逆向工程(MyBatis Generator)

    mybatis逆向工程(MyBatis Generator) 1. 什么是mybatis逆向工程 mybatis官方为了提高开发效率,提高自动对单表生成sql,包括 :mapper.xml.mappe ...

  4. 安装并使用Jupyter Notebook

      Jupyter Notebook是一个交互式笔记本,支持运行 40 多种编程语言.笔者在写博客文章时,常常需要贴代码,一贴就是一大堆代码,这样不便于读者阅读,而使用Jupyter Notebook ...

  5. “笨方法”学习Python笔记(1)-Windows下的准备

    Python入门书籍 来自于开源中国微信公众号推荐的一篇文章 全民Python时代,豆瓣高级工程师告诉你 Python 怎么学 问:请问你目前最好的入门书是那本?有没有和PHP或者其他语言对比讲Pyt ...

  6. [转]比特币测试链——Testnet介绍

    本文转自:https://blog.csdn.net/wkb342814892/article/details/80796398 testnet使用详解需求需要搭建一个简单的交易测试场景,用于生成可查 ...

  7. Android Studio 基础控件使用

    TextView android:gravity="center" //文字对其方式 top bottom left right center android:textColor= ...

  8. C#程序实现软件开机自动启动的两种常用方法

    C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法函数的示例与实例带详细注释 方法一:将软件的快捷方式创建到计算机的自动启动目录下(不需要管理员权限) 1.必要引用 ...

  9. Java中重写与重载

    重写(覆盖):发生在子类与父类之间:方法名相同方法的个数.类型相同返回值类型小于等于父类的返回值类型 重载:发生在一个类中:方法名相同方法的个数.类型不同返回值类型可以相同也可以不相同

  10. angular 分页插件的使用

    html: <pagination total-items="totalItems" ng-model="currentPage" items-per-p ...