弱弱的第一篇博客,大一上C语言结业设计—学生信息管理系统
运行界面先放出来
首先是头文件部分
#include <stdio.h>
#include <windows.h>
#include <string.h>
然后呢,是定义的两个全局变量
struct student
{
char name[9];
char num[20];
char sex[5];
char age[5];
char brithday[20];
char native_place[50];
char department[50];
char major[50];
char rewards_punished[50];
};
typedef struct student STUDENT;
STUDENT stu[100];
int total_student;
然后就是主函数啦,哈哈哈,短小精悍
int main()
{
Init();
MainMenu();
return 0;
}
然后呢就是函数部分
首先是加载界面
//打印加载界面,花里胡哨的sleep函数可以延迟
void Init()
{
int i;
char heihei[] = { "L o a d i n g ..." };
system("color 9");
printf("\n\t ");
printf("\t\t\t\tWelcome to use this system !\n");
printf("\n\t ");
printf("\t\t\t\t");
for (i = 0; i < strlen(heihei); i++)
{
printf("%c", heihei[i]);
Sleep(100);
}
printf("\n");
}
然后是主菜单部分
打印主菜单
void PrintMenu()
{
int i;
printf("\n\t ");
for (i = 0; i < 50; i++)
{
printf("* ");
Sleep(10);
}
printf("\n");
printf("\t\t\t\t\t0.Exit\n");
printf("\t\t\t\t\t1.ScanfStdudent Information\n");
printf("\t\t\t\t\t2.PrintStudent Information\n");
printf("\t\t\t\t\t3.SortStudent Information\n");
printf("\t\t\t\t\t4.AddStudent Information\n");
printf("\t\t\t\t\t5.DeleteStudent Information\n");
printf("\t\t\t\t\t6.ModifyStudent Information\n");
printf("\t\t\t\t\t7.Search For student\n");
printf("\t\t\t\t\t8.WriteToFile\n");
printf("\n\t ");
for (i = 0; i < 50; i++)
{
printf("* ");
Sleep(10);
}
printf("\n");
}
主菜单函数
void MainMenu()
{
int flag;
PrintMenu();
do{
printf("\n\t ");
printf("\t\t\t\tPlease input your choose:(0 ~ 8):");
scanf("%d",&flag);
}while(flag < 0 || flag > 8);
fflush(stdin);
switch(flag)
{
case 0:
flag = 0;
break;
case 1:
total_student = ScanfInformation(stu);
Quit();
break;
case 2:
system("cls");
PrintInformation(stu);
Quit();
break;
case 3:
system("cls");
SortStudent();
Quit();
break;
case 4:
system("cls");
AddInformation();
Quit();
break;
case 5:
system("cls");
DeleteInformation();
Quit();
break;
case 6:
system("cls");
ModifyInformation();
Quit();
break;
case 7:
system("cls");
SubMenu();
Quit();
break;
case 8:
system("cls");
WriteToFile();
Quit();
break;
default:
printf("\t\t\t\tInvalid operator!\n");
}
}
接下来就是输入输出数据啦
为什么已经是全局变量还要用指针呢?不用不就是白学了
int ScanfInformation(STUDENT *p)
{
int num=0;
do{
printf("Please input student's name:\n");
scanf("%s",p->name);
printf("Please input student's num:\n");
scanf("%s",p->num);
printf("Please input student's sex:\n");
scanf("%s",p->sex);
printf("Please input student's age:\n");
scanf("%s",p->age);
printf("Please input student's brithday:\n");
scanf("%s",p->brithday);
printf("Please input student's native_place:\n");
scanf("%s",p->native_place);
printf("Please input student's department:\n");
scanf("%s",p->department);
printf("Please input student's major:\n");
scanf("%s",p->major);
printf("Please input student's rewards_punished:\n");
scanf("%s",p->rewards_punished);
fflush(stdin);
p++;
num++;
printf("\t\t\t\t\tHave inputed %d student's information.\n",num);
}while(Choose());
return num;
}
判断是否继续输入
int Choose()
{
char choose;
do{
printf("\t\t\t\t\tContinue ? Please choose (Y/y or N/n):\n");
scanf("%c",&choose);
fflush(stdin);
}while(choose != 'Y' || choose != 'y' || choose != 'N' || choose != 'n');
system("cls");
if(choose == 'Y' || choose == 'y')
return 1;
else
return 0;
}
输出函数
void PrintInformation(STUDENT *p)
{
int i;
printf("This is the information of student:\n");
for (i = 0; i < 120; i++)
{
printf("*");
Sleep(10);
}
printf("\n");
for(i = 0; i < total_student; i++,p++)
{
printf("%-2s %-2s %-2s %-2s %-2s %-2s %-2s %-2s %-2s\n",
p->name,
p->num,
p->sex,
p->age,
p->brithday,
p->native_place,
p->department,
p->major,
p->rewards_punished);
}
}
Quit函数用判断是否返回主菜单
按Esc退出
void Quit()
{
char ch;
int i;
printf("\n\t ");
for (i = 0; i < 50; i++)
{
printf("* ");
Sleep(10);
}
printf("\n\n\t\t\t\t\tPress any key to return Mainmenu\n\n\t\t\t\t\tExit please press Esc\n");
scanf("%c",&ch);
fflush(stdin);
if (ch == 0x1b)
{
_exit(0);
}
MainMenu();
}
排序函数
功能都是建立在排序的基础上哦
我用的是选择排序法,因为插入排序忘了。快排马马虎虎。为什么不直接排呢?行数不够
void SortStudent()
{
int i,j;
for(i = 1;i < total_student;i++)
{
j = i - 1;
stu[total_student] = stu[i];
while(j >= 0 && strcmp(stu[total_student].num,stu[j].num) < 0)
{
Swap2(j+1,j);
j--;
}
stu[j+1] = stu[total_student];
}
printf("\t\t\t\t\tStudent Information have sorted!\n");
}
交换结构体的函数`
void Swap2(int i,int k)
{
Swap1(stu[i].name,stu[k].name);
Swap1(stu[i].num,stu[k].num);
Swap1(stu[i].sex,stu[k].sex);
Swap1(stu[i].age,stu[k].age);
Swap1(stu[i].brithday,stu[k].brithday);
Swap1(stu[i].native_place,stu[k].native_place);
Swap1(stu[i].department,stu[k].department);
Swap1(stu[i].major,stu[k].major);
Swap1(stu[i].rewards_punished,stu[k].rewards_punished);
}
交换两个字符串的函数
void Swap1(char a[],char b[])
{
char temp[100];
strcpy(temp,a);
strcpy(a,b);
strcpy(b,temp);
}
接下来是添加学生信息
思想:在结构体数组末尾输入要添加的学生信息,比较学号大小,找到要插入的位置,再把总的学生人数加1.
void AddInformation()
{
int i;
printf("Please input student's name:\n");
scanf("%s",stu[total_student].name);
printf("Please input student's num:\n");
scanf("%s",stu[total_student].num);
printf("Please input student's sex:\n");
scanf("%s",stu[total_student].sex);
printf("Please input student's age:\n");
scanf("%s",stu[total_student].age);
printf("Please input student's brithday:\n");
scanf("%s",stu[total_student].brithday);
printf("Please input student's native_place:\n");
scanf("%s",stu[total_student].native_place);
printf("Please input student's department:\n");
scanf("%s",stu[total_student].department);
printf("Please input student's major:\n");
scanf("%s",stu[total_student].major);
printf("Please input student's rewards_punished:\n");
scanf("%s",stu[total_student].rewards_punished);
fflush(stdin);
for(i = 0;i < total_student;i++)
{
if(strcmp(stu[i].num,stu[total_student].num) > 0)
Swap2(i,total_student);
}
total_student++;
}
删除学生信息
思想:根据输入的学号找到学生,然后用自己定义的Swap2函数,循环把这个学生交换到末尾,然后总的学生-1,不输出他,哈哈哈哈哈哈假装删除了。。没得事,下次输入数据覆盖了就好了,哈哈哈
void AddInformation()
{
int i;
printf("Please input student's name:\n");
scanf("%s",stu[total_student].name);
printf("Please input student's num:\n");
scanf("%s",stu[total_student].num);
printf("Please input student's sex:\n");
scanf("%s",stu[total_student].sex);
printf("Please input student's age:\n");
scanf("%s",stu[total_student].age);
printf("Please input student's brithday:\n");
scanf("%s",stu[total_student].brithday);
printf("Please input student's native_place:\n");
scanf("%s",stu[total_student].native_place);
printf("Please input student's department:\n");
scanf("%s",stu[total_student].department);
printf("Please input student's major:\n");
scanf("%s",stu[total_student].major);
printf("Please input student's rewards_punished:\n");
scanf("%s",stu[total_student].rewards_punished);
fflush(stdin);
for(i = 0;i < total_student;i++)
{
if(strcmp(stu[i].num,stu[total_student].num) > 0)
Swap2(i,total_student);
}
total_student++;
}
修改学生信息
这个很简单啦,就是根据学号找到学生,在重新输入一次就好了
void ModifyInformation()
{
int i;
printf("Please input the num that you want to modify:\n");
scanf("%s",stu[total_student].num);
for(i = 0;i < total_student;i++)
{
if(strcmp(stu[i].num,stu[total_student].num)==0)
{
printf("Have find!\n");
printf("Please input student's name:\n");
scanf("%s",stu[total_student].name);
printf("Please input student's sex:\n");
scanf("%s",stu[total_student].sex);
printf("Please input student's age:\n");
scanf("%s",stu[total_student].age);
printf("Please input student's brithday:\n");
scanf("%s",stu[total_student].brithday);
printf("Please input student's native_place:\n");
scanf("%s",stu[total_student].native_place);
printf("Please input student's department:\n");
scanf("%s",stu[total_student].department);
printf("Please input student's major:\n");
scanf("%s",stu[total_student].major);
printf("Please input student's rewards_punished:\n");
scanf("%s",stu[total_student].rewards_punished);
fflush(stdin);
Swap2(i,total_student);
printf("This student's information have modified!\n");
}
}
}
然后就是查找函数部分啦
这里有一个子菜单
用来输入查找的姓名或者学号。
void SubMenu()
{
PrintSubMenu();
int flag;
char target[20];
do{
printf("\n\t ");
printf("\t\t\t\t\tPlease input your choose:(1 ~ 2):");
scanf("%d",&flag);
}while(flag < 1 || flag > 2);
fflush(stdin);
switch(flag)
{
case 1:
system("cls");
printf("Please input student's name:\n");
scanf("%s",target);
fflush(stdin);
Search(target);
Back();
break;
case 2:
system("cls");
printf("Please input student's num:\n");
scanf("%s",target);
fflush(stdin);
Search(target);
Back();
break;
default:
printf("Invalid operator!\n");
}
}
其实只有一个查找函数,哈哈哈哈哈哈哈哈哈没想到把,二分法查找要把学号改成longlong,而且还要再写一个查找名字的函数,行数已经够了,这样更省事嘛。嘻嘻,用的也是指针,不用白不用嘛,学了就要用。
打印子菜单
void PrintSubMenu()
{
int i;
printf("\n\t ");
for (i = 0; i < 50; i++)
{
printf("* ");
Sleep(10);
}
printf("\n");
printf("\t\t\t\t\t\t1.Search By Name\n");
printf("\t\t\t\t\t\t2.Search By num\n");
printf("\n\t ");
for (i = 0; i < 50; i++)
{
printf("* ");
Sleep(10);
}
printf("\n");
}
子菜单的返回函数
void Back()
{
char choose;
int i;
printf("\n\t ");
for (i = 0; i < 50; i++)
{
printf("* ");
Sleep(10);
}
do{
printf("\n\n\t\t\t\tDo you want re-query?(Y/y or N/n):\n");
scanf("%c",&choose);
fflush(stdin);
}while(choose != 'Y' || choose != 'y' || choose != 'N' || choose != 'n');
if (choose == 'Y' || choose == 'y')
{
SubMenu();
}
else
MainMenu();
}
查找函数
思想:输入学生的姓名,或者学号,查找符合条件的所有学生
void Search(char a[])
{
int flag = 0,sum = 0;
int i;
STUDENT *p = stu;
for(i = 0;i < total_student;i++,p++)
{
if(strcmp(p->name,a)==0 || strcmp(p->num,a)==0)
{
printf("%-2s %-2s %-2s %-2s %-2s %-2s %-2s %-2s %-2s\n",
p->name,
p->num,
p->sex,
p->age,
p->brithday,
p->native_place,
p->department,
p->major,
p->rewards_punished);
printf("\n");
flag = 1;
sum ++;
}
}
if(flag == 0)
printf("Not Find!");
else
printf("Find %d student!\n",sum);
}
最后一个保存数据函数
就是循环写入txt文件啦
void WriteToFile()
{
FILE *fp;
int i;
if((fp = fopen("StudentInformation_system.txt","w")) == NULL)
{
printf("\t\t\t\t\tFail to open score.txt!\n");
}
else
{
fprintf(fp,"Total students is : %d",total_student);
fprintf(fp,"\n\n");
for(i = 0;i<total_student;i++)
{
fprintf(fp,"%-2s\t\t %-2s\t\t %-2s\t\t %-2s\t\t %-2s\t\t %-2s\t\t %-2s\t\t %-2s\t\t %-2s\t\t",
stu[i].name,
stu[i].num,
stu[i].sex,
stu[i].age,
stu[i].brithday,
stu[i].native_place,
stu[i].department,
stu[i].major,
stu[i].rewards_punished);
fprintf(fp,"\n");
}
fclose(fp);
printf("\t\t\t\t\tThe student's information have been saved!\n");
}
}