| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1022 人关注过本帖
标题:[求助]我写了个小程序!不过还有很多问题!请大家帮忙修改下!
只看楼主 加入收藏
a87505265
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2007-3-3
收藏
 问题点数:0 回复次数:11 
[求助]我写了个小程序!不过还有很多问题!请大家帮忙修改下!

/* 《学生成绩小档案》程序
未解决问题: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编辑过]

搜索更多相关主题的帖子: 录入 字母 include 
2007-03-08 09:00
luckdog0426
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-3-1
收藏
得分:0 
为什么不把总成绩sum也加入结构中呢??
2007-03-08 09:05
a87505265
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2007-3-3
收藏
得分:0 
呵呵应该是忘记了,我回来一定加上,谢谢提醒!
不过这不是主要问题啊!

初学者 电子书下载! http:///in.asp?id=a87505265
2007-03-08 09:13
luckdog0426
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-3-1
收藏
得分:0 
for(i=0;i<count-1;i++){
for(j=1;j<count-1;j++){
if(stu[i].average<stu[j].average) //从大到小排序
{
temp=stu[j];
stu[j]=stu[i];
stu[i]=temp;
}
}
}
这样不知道行不??
2007-03-08 09:15
a87505265
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2007-3-3
收藏
得分:0 
for(j=1;j<count-1;j++){
把j=0改成j=1是减少了一次无用的循环。
但把count-i改成count-1如果人数多的话是不是增加了无用的循环?

初学者 电子书下载! http:///in.asp?id=a87505265
2007-03-08 09:52
a87505265
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2007-3-3
收藏
得分:0 
没人帮忙吗?自己顶下!

初学者 电子书下载! http:///in.asp?id=a87505265
2007-03-08 19:29
windguo
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-7-31
收藏
得分:0 
关于第1个问题,原因应该是search是int格式,当你输入字母得时候使得程序识别不出来而引起得吧。
解决方法还没想到(因为本人也是菜鸟)。。。。。。。。
2007-03-08 23:15
sztonyyang
Rank: 1
等 级:新手上路
帖 子:106
专家分:0
注 册:2007-3-1
收藏
得分:0 
有点复杂了 只能看看自己能多学点呵呵

生活就是拼搏! C语言QQ群社:23644804
2007-03-08 23:40
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
收藏
得分:0 

前两个问题已经给你解决了 至于最后一个问题 应该是从新出入的时候注意i的值不能在是0了
#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);
if(stu[i].num>32767||stu[i].num<-32768) {
printf("不能输入字符");break;}
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]);
if(stu[i].score[j]>32767||stu[i].score[j]<-32768) {
printf("不能输入字符");break;}
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("请选择项目序号:");
fflush(stdin);
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);
}


羊肉串 葡萄干 哈密瓜!!
2007-03-09 01:17
a87505265
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2007-3-3
收藏
得分:0 
第一个问题还是我对fflush理解的不是很好啊!
其实我对C里很多函数都不太了解!希望大家能贴些关于这个的文章或书名来看看!


第二个问题用stu[i].num>32767||stu[i].num<-32768这个办法还真是不错!呵呵
(我看的程序不多,没什么经验)
不过其实我是想在不退出循环的情况下,提示错误,提示重新输入的!
把我弄的晕晕的!

第三个问题,版主说的我能理解,是不是要从主菜单入手?我在想想吧!

初学者 电子书下载! http:///in.asp?id=a87505265
2007-03-09 14:07
快速回复:[求助]我写了个小程序!不过还有很多问题!请大家帮忙修改下!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043237 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved