学生成绩管理系统问题
跟论坛混这么久了 想试着写个学生成绩管理系统。写了一半就出现问题了求解答。代码如下:
///////////////////////////////////////////////////
//头文件 & 宏定义//
///////////////////////////////////////////////////
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <windows.h>
#define N 32 // 最大学生数
int n = 0 ; // 实际存放的学生数
#define LEN sizeof(STU)
////////////////////////////////////////////////
//结构体//
////////////////////////////////////////////////
typedef struct student
{
int StuId; // 学号
char StuName[10]; // 姓名
char StuSex[4]; // 性别
float StuScore[3]; // 三门课(高数、英语、计算机)的成绩
float ScoreTotal; // 每个学生的总成绩
float ScoreAve; // 每个学生的平均成绩
struct student *next; // 结构体指针
}STU;
////////////////////////////////////////////////////////////
////////////////////子函数声明//////////////////////////////
////////////////////////////////////////////////////////////
STU *LinkListInit(); // 链表初始化
void Menu(); // 主界面函数
STU *StuInput(); // 信息录入函数
void StuOutput(STU *); // 信息输出函数
void StuSearch(STU *); // 信息查询函数
void StuSave(STU *); // 信息保存函数
STU *StuLoad(); // 文件数据读取函数
///////////////////////////////////////////////////////////
// 主函数模块 //
///////////////////////////////////////////////////////////
int main()
{
STU *HEAD;
int i; char ch[10]; static count = 0;
HEAD = LinkListInit(); // 表头设置为空
for (i = 0; i < 35; i++)
printf("%c", 2); printf("\n\n");
printf("*****欢迎登录系学生成绩管理系统***\n\n");
for (i = 0; i < 35; i++)
printf("%c", 2); printf("\n\n");
printf("请输入密码:"); // 密码验证
gets(ch);
if (strcmp(ch, "1") == 0)
Menu(HEAD); // 进入主界面
else
{
count++; // 登录次数统计
if (count >= 4) exit(0); // 退出程序
main(); // 返回主函数
}
return 0;
}
////////////////// 链表初始化模块 ////////////////////
STU *LinkListInit()
{
return NULL; // 返回空指针
}
////////////////////// 主界面模块 ////////////////////
void Menu(STU *HEAD)
{
int i;
system("cls");
printf("**********************\n");
printf(" ***欢迎进入主菜单***\n");
printf("**********************\n\n\n");
printf("本系统有如下功能-->\n\n\n0.退出系统\n");
printf("1.信息录入\n2.信息显示\n3.信息查询\n");
printf("4.信息修改\n5.信息删除\n6.信息添加\n");
printf("7.信息排序\n8.信息保存\n9.数据装载\n\n\n");
printf("请选择:");
scanf("%d", &i);
if (i < 0 || i > 9)
{
printf("请输入0--9中的一个数:");
scanf("%d", &i);
}
switch (i)
{
case 0: exit(0); // 退出系统
case 1: HEAD = StuInput(); break;
case 2: StuOutput(HEAD); break;
case 3: StuSearch(HEAD); break;
case 4: break;
case 5: break;
case 6: break;
case 7: break;
case 8: StuSave(HEAD); break;
case 9: HEAD = StuLoad(); break;
}
}
////////////////////// 信息录入模块 ///////////////////////
STU *StuInput()
{
STU *head, *pOne, *pTwo; // 准备建立链表
int flag = 1; // 信息录入控制开关
int i; float sum = 0;
char ch; char course[3][8] = { {"高数"}, {"英语"}, {"计算机"}};
system("cls");
printf("*****欢迎进入学生信息录入窗口*********\n");
head = NULL;
pOne = pTwo = (STU *)malloc(LEN); // 开辟一个新单元
if (pOne == NULL)
{
printf("申请存储空间失败\n");
return(head) ;
}
while (flag)
{
printf("\n请输入学号:");
scanf(" %d", &(pOne -> StuId));
{
if (pOne -> StuId < 0)
{
printf("\n学号必须大于零,请重新输入:");
scanf("%d", &(pOne -> StuId));
}
}
printf("\n请输入姓名:");
scanf(" %s", pOne -> StuName);
printf("\n请输入性别:");
scanf(" %s", pOne -> StuSex);
for (i = 0; i < 3; i++)
{
printf("\n请输入%s成绩:", *(course + i));
scanf(" %f", &pOne -> StuScore[i]);
if (pOne -> StuScore[i] < 0 || pOne -> StuScore[i] > 100)
{
printf("错误的输入!请输入1--100的数:\n");
scanf(" %f", &pOne -> StuScore[i]);
}
sum += pOne -> StuScore[i];
}
pOne -> ScoreTotal = sum; // 学生总成绩
pOne -> ScoreAve = (float)sum / 3; // 平均成绩
sum = 0;
n++; // 录入学生数增加一个
if (n == 1) head = pOne;
else
{
pTwo -> next = pOne;
pTwo = pOne;
}
system("cls");
printf("\n\n是否继续录入学生信息?(Y / N):");
getchar();
ch = getchar();
if (ch == 'N' || ch == 'n')
{
pTwo -> next = NULL; flag = 0;
printf("你总共录入了%d个学生信息。\n\n", n);
Menu();
}
else pOne = (STU *)malloc(LEN); // 再开辟一个新单元
if (pOne == NULL)
{
printf("申请存储空间失败\n");
return (head) ;
}
}
return (head);
}
////////////////////////// 信息输出模块 ////////////////////////////
void StuOutput(STU *head)
{
STU *p; // 自由指针
int i;
system("cls");
p = head; // 指向标头
printf("******欢迎进入学生信息显示窗口*********\n");
if (head == NULL)
{
printf("很抱歉,没有学生信息可以输出."); // 还没有录入任何信息
return ; //返回主函数
}
else
{
printf("学号 姓名 性别 高数 英语 计算机 总成绩 平均成绩\n");
printf("__________________________________________________________________\n");
while (p != NULL)
{
printf("%-3d\t%s\t%s", p -> StuId, p -> StuName, p -> StuSex);
for (i = 0; i < 3; i++)
printf("\t%-.2f", p -> StuScore[i]);
printf("\t%-.2f\t%-.2f\n", p -> ScoreTotal, p -> ScoreAve);
p = p -> next;
}
}
}
////////////////////////// 查询模块 ////////////////////////////////
void StuSearch(STU *head)
{
STU *p; int i, id; char name[20];
p = head;
system("cls");
printf("*****欢迎进入查询窗口******\n\n");
printf("按学号查询请输入1\n按姓名查询请按2\n请选择:");
scanf("%d", &i);
switch (i)
{
case 1:
printf("请输入你要查找的学号:");
scanf("%d", &id);
if (p == NULL) { printf(" 很抱歉, 没有信息供您查询."); return; }
else while (p != NULL)
{
if (p -> StuId == id)
{
printf("找到了,你需要的信息是:\n");
printf("学号 姓名 性别 高数 英语 计算机 总成绩 平均成绩\n");
printf("__________________________________________________________________\n");
printf("%d\t%s\t%s", p -> StuId, p -> StuName, p -> StuSex);
for (i = 0; i < 3; i++)
printf("\t%f", p -> StuScore[i]);
printf("\t%f\t%f\n", p -> ScoreTotal, p -> ScoreAve);
}
p = p -> next;
}
if (p == NULL) printf("不存在你需要的信息!\n");
case 2:
printf("请输入你要查找的姓名:");
getchar();
scanf("%s", name);
if (p == NULL) { printf(" 很抱歉, 没有信息供您查询."); return; }
else while (p != NULL)
{
if (strcmp((p -> StuName), name) == 0)
{
printf("找到了,你需要的信息是:\n");
printf("学号 姓名 性别 高数 英语 计算机 总成绩 平均成绩\n");
printf("__________________________________________________________________\n");
printf("%d\t%s\t%s", p -> StuId, p -> StuName, p -> StuSex);
for (i = 0; i < 3; i++)
printf("\t%-.2f", p -> StuScore[i]);
printf("\t%-.2f\t%-.2f\n", p -> ScoreTotal, p -> ScoreAve);
}
p = p -> next;
}
if (p == NULL) printf("不存在你需要的信息!\n");
default : printf("目前只有两种查询方式。\n");
}
}
////////////////////////////// 信息保存模块 //////////////////////////////////
void StuSave(STU *head)
{
FILE *fp;
STU *p;
char filename[20];
printf("请输入一个文件名来保存信息:");
scanf("%s", filename);
if ((fp = fopen(filename, "w")) == NULL)
{
printf("Can not open file !");
exit(0);
}
printf("正在保存……\n");
p = head;
if (head == NULL)
{
printf("请注意要求保存的信息为空!\n");
return ;
}
while (p != NULL)
{
if ((fwrite(p, LEN, 1, fp)) != 1)
printf("File write error!");
p = p -> next;
}
fclose(fp);
printf("保存完成!\n");
}
/////////////////////////////// 文件数据读取模块 //////////////////////////////
STU *StuLoad()
{
FILE *fp;
STU *head = NULL, *pOne, *pTwo;
char filename[20];
printf("******欢迎进入文件数据装载窗口******\n");
printf("请输入你要读取的文件名:");
scanf("%s", filename);
if ((fp = fopen(filename, "r")) == NULL);
{
printf("Can not open file !");
return (head);
}
pOne = (STU *)malloc(LEN); // 申请存储空间
if (pOne == NULL)
{
printf("申请失败!\n");
return (head);
}
head = pOne;
while (!feof(fp))
{
if ((fread(pOne, LEN, 1, fp)) != 1);
{
printf("读取数据失败!\n");
break;
}
pTwo = (STU *)malloc(LEN);
pOne -> next = pTwo;
pOne = pOne -> next;
}
fclose(fp);
printf("成功读取文件数据!\n");
return (head);
}
///////////////////////////////////////////////////////////////////////
/////////////////////////// END ////////////////////////////
///////////////////////////////////////////////////////////////////////
就第一个录入功能可以 后面写好的几个都不成?是什么问题? 一堆乱码。是我的程序结构有问题?诚心求教!
[ 本帖最后由 有容就大 于 2012-1-7 09:00 编辑 ]