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");
}