C-学生个人消费管理系统
VS2017
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <stdbool.h>
#include <string.h>
#pragma warning(disable:4996)
typedef struct Student
{
int S_id; //学号
char S_name[10]; //姓名
double S_money; //消费额
Student *next;
}student;
#define HEAD "编 号 姓 名 金 额\n"
#define PRT "%5d%10s%12.2lf\n"
student *S_Mphead = NULL; //全局链表头
student *S_MTphead = NULL; //全局链表头用于加载文件
int S_save = 0; //保存标签
void S_readf(void); //读取文件
void S_main(void); //入口
void S_creation(student *S_p); //创建学生信息
void S_load(void); //加载文件
void S_delete(student *S_p); //删除学生信息
void S_view(student *S_p); //查看学生信息
void S_search(student *S_p); //搜索学生信息
void S_psave(student *S_p); //保存学生信息
void S_destory(student *S_p, student *S_pp); //销毁链表
int main(void)
{
S_readf();
S_main();
system("pause");
return 0;
}
//入口
void S_main(void)
{
char ch;
int i;
printf("\n\n");
for (i = 0; i < 20; i++)
{
printf("*");
}
printf("STUDENTS CONSUMPTION");
for (i = 0; i < 20; i++)
{
printf("*");
}
printf("\n\n\n");
printf(" 1> creat\n\n");
printf(" 2> load\n\n");
printf(" 3> delete\n\n");
printf(" 4> search\n\n");
printf(" 5> save\n\n");
printf(" 6> view\n\n");
printf(" 7> exit\n\n\n");
for (i = 0; i < 60; i++)
{
printf("*");
}
printf("\n");
printf("请输入标签:");
scanf("%c", &ch);
getchar();
fflush(stdin);
switch (ch)
{
case '1':
S_creation(S_Mphead);
break;
case '2':
S_load();
break;
case '3':
S_delete(S_Mphead);
break;
case '4':
S_search(S_Mphead);
break;
case '5':
S_psave(S_Mphead);
break;
case '6':
S_view(S_Mphead);
break;
case '7':
S_destory(S_Mphead, S_MTphead);
break;
default:
printf("输入有误!按任意键重新输入!\n");
getch();
system("cls");
S_main();
break;
}
}
//读取文件信息
void S_readf(void)
{
FILE *fp = NULL;
student *S_phead = NULL;
student *S_pp = NULL;
student *S_temp = NULL;
S_phead = (student *)malloc(sizeof(student));
S_phead->next = NULL;
if (!(fp = fopen("student.txt", "r+b")))
{
printf("读取文件失败!按任意键退出!\n");
getch();
exit(1);
}
fgetc(fp);
if (feof(fp)) //为空
{
S_Mphead = S_phead;
}
else
{
S_Mphead = S_phead;
rewind(fp); //将光标移回首位
while (!feof(fp))
{
S_pp = (student *)malloc(sizeof(student));
fread(S_pp, sizeof(student), 1, fp);
S_pp->next = NULL;
S_phead->next = S_pp;
S_temp = S_phead;
S_phead = S_pp;
}
S_temp->next = NULL;
free(S_pp);
S_pp = NULL;
}
fclose(fp);
fp = NULL;
}
//创建信息
void S_creation(student *S_p)
{
student *S_phead = S_p;
student *S_pp = NULL;
printf("\n");
printf("***************************\n");
while (S_phead->next != NULL)
{
S_phead = S_phead->next;
}
while (1)
{
S_pp = (student *)malloc(sizeof(student));
printf("请输入学号:");
scanf("%d", &S_pp->S_id);
getchar();
fflush(stdin);
if (S_pp->S_id == 0)
{
system("cls");
S_main();
}
printf("\n");
printf("请输入姓名:");
scanf("%s", S_pp->S_name);
getchar();
fflush(stdin);
printf("\n");
printf("请输入消费金额:");
scanf("%lf", &S_pp->S_money);
getchar();
fflush(stdin);
S_pp->next = NULL;
S_phead->next = S_pp;
S_phead = S_pp;
printf("***************************");
printf("\n");
S_save = 1;
}
}
//加载文件
void S_load(void)
{
char S_loadf[100];
student *S_phead = NULL;
student *S_pp = NULL;
FILE *fp = NULL;
S_phead = (student *)malloc(sizeof(student));
S_phead->next = NULL;
S_MTphead = S_phead;
printf("请输入加载文件路径:");
scanf("%s", S_loadf);
getchar();
fflush(stdin);
if (!(fp = fopen(S_loadf, "r")))
{
printf("打开文件失败!按任意键退出!\n");
getchar();
exit(1);
}
S_pp = (student *)malloc(sizeof(student));
while (EOF != fscanf(fp, "%d%s%lf", &S_pp->S_id, &S_pp->S_name, &S_pp->S_money))
{
S_pp->next = NULL;
S_phead->next = S_pp;
S_phead = S_pp;
S_pp = (student *)malloc(sizeof(student));
}
free(S_pp);
S_pp = NULL;
S_phead = S_MTphead->next;
while (S_phead != NULL)
{
printf(PRT, S_phead->S_id, S_phead->S_name, S_phead->S_money);
S_phead = S_phead->next;
}
printf("按任意键返回主菜单!\n");
getch();
system("cls");
S_main();
}
//删除
void S_delete(student *S_p)
{
student *S_phead = S_p;
student *S_pp = S_phead;
student *S_ptemp = NULL;
char S_ch[10];
char S_key[2];
printf("***************************\n");
printf("请输入需要删除的姓名:");
scanf("%s", S_ch);
fflush(stdin);
while (S_pp->next != NULL)
{
if (strcmp(S_pp->next->S_name, S_ch) == 0)
{
printf(HEAD);
printf(PRT,S_pp->next->S_id,S_pp->next->S_name,S_pp->next->S_money);
printf("是否删除Y/N?");
scanf("%s", S_key);
getchar();
fflush(stdin);
if (strcmp(S_key, "0") == 0)
{
S_delete(S_Mphead);
}
else if (strcmp(S_key, "Y") == 0)
{
S_ptemp = S_pp->next;
S_pp->next = S_ptemp->next;
free(S_ptemp);
S_ptemp = NULL;
printf("删除成功!按任意键继续!\n");
getch();
}
else if (strcmp(S_key, "N") == 0)
{
S_pp = S_pp->next;
}
else
{
printf("输入有误,请重新输入!");
}
continue;
}
S_pp = S_pp->next;
}
printf("没有可删除信息!按任意键返回主菜单!\n");
S_save = 1;
getch();
fflush(stdin);
system("cls");
S_main();
}
//查看学生信息
void S_view(student *S_p)
{
student *S_phead = S_p->next;
printf("\n");
printf("***************************\n");
printf(HEAD);
while (S_phead != NULL)
{
printf(PRT, S_phead->S_id, S_phead->S_name, S_phead->S_money);
S_phead = S_phead->next;
}
printf("***************************\n");
printf("按任意键返回主菜单!");
getch();
system("cls");
S_main();
}
//搜索
void S_search(student *S_p)
{
student *S_phead = S_p->next;
char S_ch[10];
printf("请输入需要查找的姓名:");
scanf("%s", S_ch);
getchar();
printf(HEAD);
while (S_phead != NULL)
{
if (strcmp(S_phead->S_name, S_ch) == 0)
{
printf(PRT, S_phead->S_id, S_phead->S_name, S_phead->S_money);
}
S_phead = S_phead->next;
}
printf("按任意键返回主菜单!\n");
getch();
system("cls");
S_main();
}
//保存
void S_psave(student *S_p)
{
student *S_phead = S_p->next;
FILE *fp = NULL;
if (S_save == 1)
{
if (!(fp = fopen("student.txt", "ab")))
{
printf("保存文件失败!按任意键退出!\n");
getch();
exit(1);
}
while (S_phead != NULL)
{
fwrite(S_phead, sizeof(student), 1, fp);
S_phead = S_phead->next;
}
printf("保存成功!按任意键返回主菜单!\n");
S_save = 0;
getch();
system("cls");
S_main();
}
else
{
printf("无需保存!按任意键返回主菜单!\n");
getch();
system("cls");
S_main();
}
}
//销毁链表
void S_destory(student *S_p, student *S_pp)
{
student *S_phead = S_p;
student *S_temp = NULL;
while (NULL != S_phead)
{
S_temp = S_phead->next;
free(S_phead);
S_phead = NULL;
S_phead = S_temp;
}
S_phead = S_pp;
while (NULL != S_phead)
{
S_temp = S_phead->next;
free(S_phead);
S_phead = NULL;
S_phead = S_temp;
}
exit(1);
}