首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

小弟我刚学C语言不久 想试着写个学生成绩管理系统有有关问题求教

2012-02-13 
我刚学C语言不久 想试着写个学生成绩管理系统有问题求教。RT 先上代码,写了一半,编译+连接都成,但运行就出

我刚学C语言不久 想试着写个学生成绩管理系统有问题求教。
RT 先上代码,写了一半,编译+连接都成,但运行就出问题了,求解答。
///////////////////////////////////////////////////
  //头文件 & 宏定义//
///////////////////////////////////////////////////

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#include <string.h>

#include <malloc.h>

#include <windows.h>

#define N 32 // 最大学生数

#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] = { {"高数"}, {"英语"}, {"计算机"}};

int n = 0 ; // 实际存放的学生数

system("cls");

printf("*****欢迎进入学生信息录入窗口*********\n");

head = NULL;  

pOne = pTwo = (STU *)malloc(LEN); // 开辟一个新单元

if (pOne == NULL)

{
printf("申请存储空间失败\n");

return(head) ;
}

  while (flag)

{
printf("\n\n请输入第%d个学生的信息:\n", n + 1);

printf("\n请输入学号:");  
 
scanf("%d", &(pOne -> StuId));

{
if (pOne -> StuId < 0)

{
getchar();

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

getchar();

scanf("%f", &pOne -> StuScore[i]);

if (pOne -> StuScore[i] < 0 || pOne -> StuScore[i] > 100)

{
getchar();

printf("错误的输入!请输入0--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')


pOne -> next = NULL; flag = 0; 
 
printf("你总共录入了%d个学生信息。\n\n", n);

printf("\n请稍等……\n\n");

Sleep(3000); // 等待3秒

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\n");

if (head == NULL)

{
printf("\n很抱歉,没有学生信息可以输出.\n"); // 还没有录入任何信息

printf("\n正在返回主菜单\n请稍等……\n");

Sleep(3000); // 等待3秒

Menu(); // 返回主菜单
}

else 
{

printf("****************************学生信息显示**************************\n\n");

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("%-.1f", p -> StuScore[i]);

printf("%-.1f%-.1f\n", p -> ScoreTotal, p -> ScoreAve);

p = p -> next;
}

printf("******************************显示结束**************************** \n\n");

printf("\n正在返回主菜单\n请稍等……\n");

Sleep(3000); // 等待3秒

Menu(); // 返回主菜单

}
}


////////////////////////// 查询模块 ////////////////////////////////

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%-.2s\t%-.2s", 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 ////////////////////////////
///////////////////////////////////////////////////////////////////////

[解决办法]
出啥问题总该描述一下吧
[解决办法]
在创建新的节点之前,检查你的LEN值是否正确。
[解决办法]

探讨

出啥问题总该描述一下吧

[解决办法]
太长了。。。
[解决办法]
调试一下,非常有可能是字串处理的地方出了问题
譬如在获取字符串的时候 最好getchar()回收回车键
或者使用fflush(stdin)

[解决办法]
这个功能用脚本语言实现更容易些。

热点排行