自学C语言后自己编写的一个学生信息管理系统 ,虽然很简单,但是遇到一些问题。之前写过一些小程序,都很顺利,当开始写一些稍微有一点规模的程序后,就会遇到各种各样的问题。学习还是要多实践,以后要多写一些大规模的程序,这样才能多发现问题和不足,才能更好更快的成长。
头文件
#pragma once
#ifndef MYSYSTEM_H_
#define MYSYSTEM_H_
#define SIZENAME 20
#define SIZESEX 6
//定义学生数据结构
typedef struct Stu
{
int number; //学号
char name[SIZENAME]; //姓名
char sex[SIZESEX]; //性别
int age; //年龄
double score; //成绩
}Student;
//创建学生链表
struct ListNode
{
Student stu;
struct ListNode * next;
};
struct ListNode * headnode ;
//读取文件
void readFile(void);
//菜单显示
void showMenu(void);
//获得选择
int getChoice(int n);
//清除字符
void clear(void);
//获取姓名和性别
char * s_gets(char * st, int n);
//添加学生信息
void addInfo(void);
//删除学生信息
int deletInfo(void);
//查找学生信息
struct ListNode * searchInfo(void);
//修改学生信息
void modifyInfo(void);
//保存学生信息到文件
void saveInfo(void);
//查看所有信息
void allInfo(void);
//清理缓存
void clearSpace(void);
//暂停,按任意键继续
inline static void pause(void)
{
while (getchar() != '\n')
continue;
}
//延时函数
void delay(int n);
#endif
函数定义
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#include"mysystem.h"
//extern struct ListNode * headnode;
/***************************************
功能:读取文件,将文件数据存入链表中
****************************************/
void readFile(void)
{
FILE * fp;
struct ListNode * current, *temp;
current = NULL;
if ((fp = fopen("student.dat", "rb")) == NULL)
{
fprintf(stderr, "\n\t------------打开文件失败--------------\n");
pause();
return;
}
while (!feof(fp))
{
if (ferror(fp))
{
fprintf(stderr, "\n\t------------读取文件错误------------\n");
delay(3);
break;
}
temp = (struct ListNode *)malloc(sizeof(struct ListNode));
if (!(fread(&(temp->stu), sizeof(Student), 1, fp)))
break;
temp->next = NULL;
if (headnode == NULL)
{
headnode = temp;
current = headnode;
printf("\t学号\t姓名\t性别\t年龄\t成绩\n");
}
else
{
current->next = temp;
current = current->next;
}
printf("\t%d\t%s\t%s\t%d\t%.2lf\n", current->stu.number, current->stu.name, current->stu.sex,
current->stu.age, current->stu.score);
}
pause();
if (fclose(fp))
fprintf(stderr, "Can't close file!\n");
}
/***************************************
功能:显示菜单
****************************************/
void showMenu(void)
{
printf("------------------学生管理系统------------------\n");
printf("\t\t1.添加学生信息\n");
printf("\t\t2.删除学生信息\n");
printf("\t\t3.查找学生信息\n");
printf("\t\t4.修改学生信息\n");
printf("\t\t5.保存学生信息\n");
printf("\t\t6.查看所有学生信息\n");
printf("\t\t7.退出\n");
printf("------------------------------------------------\n");
}
/***************************************
功能:读取选项
****************************************/
int getChoice(int n)
{
int choice;
printf("请输入您的选择:");
while (1)
{
if (scanf_s("%d", &choice))
{
clear();
if (choice < 1 || choice>n)
{
printf("请选择1-%d:", n);
continue;
}
else
return choice;
}
else
{
printf("输入出错,请选择1-%d:", n);
clear();
}
}
}
/***************************************
功能:清除多余的字符
****************************************/
void clear(void)
{
while (getchar() != '\n')
continue;
}
/***************************************
功能:获取字符串
****************************************/
char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if (ret_val)
{
find = strchr(st, '\n');
if (find)
*find = '\0';
else
clear();
}
return ret_val;
}
/***************************************
功能:添加学生的信息
****************************************/
void addInfo(void)
{
struct ListNode * new;
struct ListNode * current;
new = (struct ListNode *)malloc(sizeof(struct ListNode));
//学号、姓名、性别、年龄、成绩
printf("请输入学号:");
scanf_s("%d", &new->stu.number);
clear();
printf("请输入姓名:");
s_gets(new->stu.name, SIZENAME);
printf("请输入性别:");
s_gets(new->stu.sex, SIZESEX);
printf("请输入年龄:");
scanf_s("%d", &new->stu.age);
clear();
printf("请输入成绩:");
scanf_s("%lf", &new->stu.score);
clear();
new->next = NULL;
if (headnode == NULL)
headnode = new;
else
{
current = headnode;
while (current->next)
{
current = current->next;
}
current->next = new;
}
}
/***************************************
功能:删除学生的信息
****************************************/
int deletInfo(void)
{
int number;
struct ListNode * Pre, *Current, *Next;
if (headnode == NULL)
{
printf("没有信息!\n");
pause();
}
else
{
printf("请输入学号:");
scanf_s("%d", &number);
clear();
Current = headnode;
Pre = headnode;
if (headnode->stu.number == number) //判断头结点数据
{
headnode = headnode->next;
free(Current);
return 1;
}
while (Current)
{
if (Current->stu.number == number)
break;
Pre = Current;
Current = Current->next;
}
if (Current == NULL)
{
printf("无此学号信息!\n");
pause();
}
else
{
Next = Current->next;
free(Current);
Pre->next = Next;
return 1;
}
}
return 0;
}
/***************************************
功能:查找学生的信息
****************************************/
struct ListNode * searchInfo(void)
{
int number;
struct ListNode * Current;
Current = headnode;
if (headnode == NULL)
{
printf("没有信息!\n");
pause();
}
else
{
printf("请输入学号:");
scanf_s("%d", &number);
clear();
while (Current && (Current->stu.number != number))
Current = Current->next;
if (Current == NULL)
{
printf("查无此学号!\n");
pause();
}
}
return Current;
}
/***************************************
功能:修改学生的信息
****************************************/
void modifyInfo(void)
{
int choice;
struct ListNode * search;
search = searchInfo();
if (search)
{
system("cls");
printf("学生原信息:\n");
printf(" 学号 姓名 性别 年龄 成绩\n");
printf("%6d %15s %7s %5d %6.2lf\n", search->stu.number, search->stu.name, search->stu.sex,
search->stu.age, search->stu.score);
/*修改菜单*/
while (1)
{
printf("***************************************\n");
printf("请选择您需要修改的内容:\n");
printf("1.学号 2.姓名 3.性别\n");
printf("4.年龄 5.成绩 6.退出\n");
printf("***************************************\n");
choice = getChoice(6);
switch (choice)
{
case 1:
printf("请输入学号:");
scanf_s("%d", &search->stu.number);
clear();
break;
case 2:
printf("请输入姓名:");
s_gets(search->stu.name, SIZENAME);
break;
case 3:
printf("请输入性别:");
s_gets(search->stu.sex, SIZESEX);
break;
case 4:
printf("请输入年龄:");
scanf_s("%d", &search->stu.age);
clear();
break;
case 5:
printf("请输入成绩:");
scanf_s("%lf", &search->stu.score);
clear();
break;
case 6:goto ENDMODIFY;
}
system("cls");
printf("修改后的学生信息:\n");
printf(" 学号 姓名 性别 年龄 成绩\n");
printf("%6d %15s %7s %5d %6.2lf\n", search->stu.number, search->stu.name, search->stu.sex,
search->stu.age, search->stu.score);
}
ENDMODIFY:
system("cls");
printf("\n\t------------修改成功-----------\n");
delay(5); //延时
}
}
/***************************************
功能:保存学生的信息
****************************************/
void saveInfo(void)
{
FILE * fp;
struct ListNode * current = NULL;
if ((fp = fopen("student.dat", "wb")) == NULL)
{
fprintf(stderr, "打开文件失败!\n");
return;
}
current = headnode;
while (current)
{
fwrite(&(current->stu), sizeof(Student), 1, fp);
current = current->next;
}
if (fclose(fp))
fprintf(stderr, "Can't close file!\n");
}
/***************************************
功能:查看所有学生信息
****************************************/
void allInfo(void)
{
struct ListNode * Current;
Current = headnode;
if (headnode == NULL)
{
printf("\n\t------------没有信息-------------\n");
return;
}
printf(" 学号 姓名 性别 年龄 成绩\n");
while (Current)
{
printf("%6d %15s %7s %5d %6.2lf\n", Current->stu.number, Current->stu.name, Current->stu.sex,
Current->stu.age, Current->stu.score);
Current = Current->next;
}
}
/***************************************
功能:清理链表内存
****************************************/
void clearSpace(void)
{
struct ListNode * Current, *Next;
Current = headnode;
while (Current)
{
Next = Current->next;
free(Current);
Current = Next;
}
headnode = NULL;
}
/***************************************
功能:延时n秒
****************************************/
void delay(int n)
{
clock_t start = clock();
clock_t end = clock();
while ((end - start) / CLOCKS_PER_SEC < n)
{
end = clock();
}
}
主函数
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include"mysystem.h"
int main(void)
{
int choice;
struct ListNode * search;
headnode = NULL;
//读取文件
readFile();
while (1)
{
system("cls"); //清屏
showMenu();
choice = getChoice(7);
switch (choice)
{
case 1:addInfo();
system("cls");
printf("\n\t-----------添加成功------------\n");
delay(3); //延时
break;
case 2:if (deletInfo())
{
system("cls");
printf("\n\t-----------删除成功------------\n");
delay(3); //延时
}
break;
case 3:
search=searchInfo();
if (search)
{
printf(" 学号 姓名 性别 年龄 成绩\n");
printf("%6d %15s %7s %5d %6.2lf\n", search->stu.number, search->stu.name, search->stu.sex,
search->stu.age, search->stu.score);
pause();
}
break;
case 4:modifyInfo();
break;
case 5:saveInfo();
system("cls");
printf("\n\t-----------保存成功------------\n");
delay(3); //延时
break;
case 6:system("cls");
allInfo();
pause();
break;
case 7:goto END;
}
}
END:system("cls");
printf("\n\t-----------Bye------------\n");
clearSpace();
system("pause");
return 0;
}