C语言实训
2020春C语言实训
下面直接上代码, 我用的是Dev-c编译的。 不知道在VS2017上会不会跑起来, Dev-c是肯定可以的。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义一个学生
typedef struct _Student {
char name[20];
int age;
int id;
int score;
} Student;
//节点
typedef struct _Node {
Student stu;
struct _Node* pNext;//指向下一个元素
} Node;
Node *g_pHead = NULL;//头节点 用来保存头节点地址
int main() {
while(1) {
welcome();
char ch=getch();
switch(ch) {
case '1': {//录入学生信息
InputStudent();
break;
}
case '2': {//打印学生信息
PrintStudent();
break;
}
case '3': {//保存学生信息
SaveStudent();
break;
}
case '4': {//读取学生信息
ReadStudent();
break;
}
case '5': {//统计学生信息
int num=CountStudent();
printf("学生总人数为%d个学生\n",num);
break;
}
case '6': {//查找学生信息
FindStudent();
break;
}
case '7': {//修改学生信息
ModifyStudent();
break;
}
case '8': {//删除学生信息
DeleteStudet();
break;
}
case '0': {//录入学生信息
printf("Bye-Bye");
return 0;
}
default: {
printf("输入有误请重新输入!");
system("pause");
system("cls");
break;
}
break;
}
}
return 0;
}
//删除学生信息
void DeleteStudet() {
//其实删除学生就是删除一个节点;
printf("请输入要删除学生的学号:");
int num;
scanf("%d",&num);
Node* p1,*p2; //定义的临时变量 代表头的节点
//先判断查找的学生的节点是不是位于头节点。
if(g_pHead->stu.id==num) {
p1=g_pHead;
//释放那一个头
free(g_pHead);
g_pHead=g_pHead->pNext;
//然后再释放中间变量p1
free(p1);
return;
}
//不是头节点的化
Node* p=g_pHead;
while(p->pNext!=NULL) {
if(p->pNext!=num) {
p2=p->pNext;
p->pNext=p->pNext->pNext;
free(p2);
return;
}
p=p->pNext;
if(p->pNext==NULL) {
break;
}
}
if(p->pNext==NULL) {
printf("没有找到这个学生!\n");
}
}
//修改信息
void ModifyStudent() {
printf("请输入要修改学生的学号:");
int Num;
scanf("%d",&Num);
Node* p=g_pHead;
while(p!=NULL) { //strcmp比较字符串
if(p->stu.id==Num) {
printf("请输入要修改学生的姓名:");
scanf("%s",p->stu.name);
printf("请输入要修改学生的年龄:");
scanf("%d",&p->stu.age);
printf("请输入要修改学生的成绩:");
scanf("%d",&p->stu.score);
printf("修改成功\n");
break;
}
p=p->pNext;
}
if(p->pNext==NULL) {
printf("没有找到该学生信息!\n");
}
printf("*********************************************************\n");
system("pause");
//添加清屏
system("cls");
}
//查找学生信息
void FindStudent() {
//因为是要查看这个学生所以要返回这个学生的节点
int nStuNum;
char szName[20];
printf("请输入要查找学生的学号:");
scanf("%d",&nStuNum);
printf("请输入要查找学生的姓名:");
scanf("%s",szName);
Node* p=g_pHead;
while(p!=NULL) { //strcmp比较字符串
if(p->stu.id==nStuNum||0==strcmp(p->stu.name,szName)) {
break;
}
p=p->pNext;
}
if(p!=NULL) {
printf("*学号\t*姓名\t*\t年龄\t*\t成绩\t\t*\n");
printf("*%d\t*%s\t*\t%d\t*\t%d\t\t*\n",
p->stu.id,
p->stu.name,
p->stu.age,
p->stu.score
);
} else {
printf("没有找到!\n");
}
printf("*********************************************************\n");
system("pause");
//添加清屏
system("cls");
}
//统计学生信息
int CountStudent() {
int nCount=0;
//遍历循环
Node* p=g_pHead;
//因为指针域最后为空
while(p!=NULL) {
nCount++;
p=p->pNext;
}
return nCount;
}
//读取文件
void ReadStudent() {
//打开文件
FILE *fp=fopen("D:\\stuinfo.bat","r");
if(fp==NULL) {
printf("文件打开失败\n");
return;
}
//读取文件
Student stu;
while(fread(&stu,1,sizeof(Student),fp)) { //如果不是结束文件就继续读
//创建一个新的节点
Node* pNewNode=(Node*)malloc(sizeof(Node));
pNewNode->pNext=NULL;
memcpy(pNewNode,&stu,sizeof(Student));
if(g_pHead==NULL) {
g_pHead = pNewNode;
} else {
pNewNode->pNext=g_pHead;
g_pHead=pNewNode;
}
}
//关闭wenjian
fclose(fp);
printf("读取成功\n");
printf("*********************************************************\n");
system("pause");
//添加清屏
system("cls");
}
//保存信息
void SaveStudent() {
//打开文件
FILE* fp=fopen("D:\\stuinfo.bat","w");
if(fp==NULL) {
printf("文件打开失败\n");
return;
}
Node* p=g_pHead;
//只要不为空就往下走
while(p!=NULL) {
fwrite(&p->stu,1,sizeof(Student),fp);
p=p->pNext;//输入完把下一个当作头,
}
printf("文件保存成功\n");
//关闭wenjian
printf("*********************************************************\n");
system("pause");
//添加清屏
system("cls");
}
void PrintStudent() {
printf("*********************************************************\n");
printf("\t欢迎学生使用高效学生成绩管理系统v1.0\t\t*\n");
printf("*********************************************************\n");
printf("*学号\t*姓名\t*\t年龄\t*\t成绩\t\t*\n");
printf("*********************************************************\n");
//遍历链表
Node* p=g_pHead;
//只要不为空就往下走
while(p!=NULL) {
//* 23 * 马志勇 * 23 * 32*
printf("*%d\t*%s\t*\t%d\t*\t%d\t\t*\n",
p->stu.id,
p->stu.name,
p->stu.age,
p->stu.score
);
p=p->pNext;//输入完把下一个当作头,
}
printf("*********************************************************\n");
system("pause");
//添加清屏
system("cls");
}
//录入学生信息
//录入学生信息
void InputStudent() {
//创建一个新节点
//保存内容
Node* pNewNode=(Node*)malloc(sizeof(Node)); //分配内存
pNewNode->pNext=NULL;
if(g_pHead==NULL) {
g_pHead = pNewNode;
} else {
pNewNode->pNext=g_pHead;
g_pHead=pNewNode;
}
printf("请输入学生姓名:");
scanf("%s",pNewNode->stu.name);//数据存到新的节点里面
printf("请输入学生年龄:");
scanf("%d",&pNewNode->stu.age);
printf("请输入学生学号:");
scanf("%d",&pNewNode->stu.id);
printf("请输入学生成绩:");
scanf("%d",&pNewNode->stu.score);
printf("录入完成\n");
system("pause");
//添加清屏
system("cls");
}
//欢迎界面
void welcome() {
printf("*********************************************************\n");
printf("*\t\t欢迎使用高校学生管理系统\t\t*\n");
printf("*********************************************************\n");
printf("*\t\t请选择功能选项:\t\t\t\t*\n");
printf("*********************************************************\n");
printf("*\t\t1.录入学生信息\t\t\t\t*\n");
printf("*\t\t2.打印学生信息\t\t\t\t*\n");
printf("*\t\t3.保存学生信息\t\t\t\t*\n");
printf("*\t\t4.读取学生信息\t\t\t\t*\n");
printf("*\t\t5.统计学生信息\t\t\t\t*\n");
printf("*\t\t6.查找学生信息\t\t\t\t*\n");
printf("*\t\t7.修改学生信息\t\t\t\t*\n");
printf("*\t\t8.删除学生信息\t\t\t\t*\n");
printf("*\t\t0.退出管理系统\t\t\t\t*\n");
printf("*********************************************************\n");
}