/* 《学生成绩小档案》程序
未解决问题:1.主目录输入字母后出现死循环。
2.学号和成绩输入字母后无错误提示。
3.第二次用主菜单录入学生信息后显示错误.
*/
#include"stdio.h"
struct student //定义一个结构
{
int num;
char name[30];
int score[3];
double average;
};
static int count=0; //学生人数计数器
void input(struct student stu[]) //录入功能
{
double sum=0; //单个学生成绩的和
int i=0,j; //计数器
char y; //判断是否继续的变量
do //do-whike 控制是否继续
{
sum=0;
printf("输入学号:");
scanf("%d",&stu[i].num);
fflush(stdin);
printf("输入名子:");
gets(stu[i].name);
fflush(stdin);
for(j=0;j<3;j++) //学生成绩
{
printf("输入该学生第%d门课的成绩:",j+1);
scanf("%d",&stu[i].score[j]);
fflush(stdin);
sum+=stu[i].score[j];
}
stu[i].average=sum/3.0; //每个学生平均成绩
printf("\n是否继续录入(Y/N):");
i++;
count++;
scanf("%c",&y);
fflush(stdin);
}while((y=='y')||(y=='Y'));
}
void display(struct student stu[]) //显示功能
{
int i,j;
printf("目前的学生信息为:\n");
printf("学号 姓名 JAVA HTML SQLSEVER 平均成绩\n");
for(i=0;i<count;i++)
{
printf("%4d%10s",stu[i].num,stu[i].name);
for(j=0;j<3;j++)
{
printf("%10d",stu[i].score[j]);
}
printf("%10.2lf\n",stu[i].average);
}
}
void sort(struct student stu[]) //按平均成绩排序功能
{
int i,j;
struct student temp;
for(i=0;i<count-1;i++)
{
for(j=0;j<count-i;j++)
{
if(stu[j].average<stu[j+1].average) //从大到小排序
{
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
printf("成绩从高到低排序后");
display(stu);
}
void insert(struct student stu[]) //插入功能 , 使用了插入排序
{
printf("插入前");
sort(stu); //首先排序
printf("请输入要插入的学生信息:\n");
char y;
int i,j;
struct student in; //声明一个要插入的结构
do
{
int sum=0;
fflush(stdin);
printf("请输入学号:");
scanf("%d",&in.num);
fflush(stdin);
printf("请输入名子:");
gets(in.name);
for(i=0;i<3;i++)
{
fflush(stdin);
printf("输入该学生第%d门课的成绩:",i+1);
scanf("%d",&in.score[i]);
sum+=in.score[i];
}
in.average=sum/3.0;
for(i=0;i<count;i++) //找到第一个小于要插入平均成绩的位置
{
if(stu[i].average<in.average)
break;
}
for(j=count;j>i;j--) // 为要插入的结构留出位置
{
stu[j]=stu[j-1];
}
stu[i]=in;
count++;
printf("\n是否继续录入(Y/N):");
fflush(stdin);
scanf("%c",&y);
}while((y=='y')||(y=='Y'));
printf("插入后成绩从高到低");
display(stu);
}
void del(struct student stu[])
{
struct student temp; //声明一个临时结构
int i=0,j=0;
char y;
int dnum;
do
{
printf("请输入要删除学生的学号:");
fflush(stdin);
scanf("%d",&dnum);
for(i=0;i<count;i++) //找到要删除学生的学号
{
if(dnum==stu[i].num)
break;
}
for(j=i;j<count;j++) //后面的学生上移
{
stu[j]=stu[j+1];
}
stu[count-1]=temp; //覆盖
count--;
printf("\n是否要继续删除(Y/N):");
fflush(stdin);
scanf("%c",&y);
}while((y=='y')||(y=='Y'));
printf("删除后");
display(stu);
}
int menu()
{
struct student stu[30];
int search;
printf("\n");
printf(" 《学生成绩小档案》\n");
printf(" ★(1):录入学生信息。\n");
printf(" ★(2):显示学生信息。\n");
printf(" ★(3):按平均成绩从高到低排序并显示。\n");
printf(" ★(4):插入学生信息并保持成绩从高到低有序并显示。\n");
printf(" ★(5):删除已录入学生信息并显示。\n");
printf(" ★(6)退出程序\n\n");
printf("请选择项目序号:");
scanf("%d",&search);
switch(search)
{
case 1:input(stu);break;
case 2:display(stu);break;
case 3:sort(stu);break;
case 4:insert(stu);break;
case 5:del(stu);break;
case 6:return -1;
default:printf("输入错误!请重新输入!");
}
printf("\n");
}
main()
{
int opinion;
struct student stu[30]; //声明结构数组变量
do
{
if(opinion)
opinion=menu();
}while(opinion!=-1);
}
******************************************************************8
问题:
1。如果在主菜单输入字母会陷入死循环!请问为什么会这样?
2。学号和成绩输入字母或其它字符后出现错误。
我不想改输入的格式!我想在输入字母或其它字符后出现错误提示,然后提示重新输入。
我自己也想过这个问题,但在循环内我真的想不出!(希望尽量不要用GOTO)
3。在录入学生信息后,然后回到主菜单,再次录入学生信息后,也会出现错误!
可能还有其它不完善的地方,请大家帮忙修改下!
最好写上注示,先谢过了!
PS:刚看完那本《C语言程序设计》想写点东西!所以写了这个。
我现在只能写一些小问题,对于图形的编写完全不懂!
请问哪些书对图形编写有帮助,给小弟介绍下啊!
[此贴子已经被作者于2007-3-8 9:32:09编辑过]