c 哪里出错了?

cl90326 2009-03-21 11:44:30
#include <stdio.h>
typedef struct
{
char number[10];
char *name;
int scores[5];
int total;
}student;
void input(student *p)
{
int i;
printf("number,name:");
scanf("%s,%s",&(*p).number,&(*p).name);
for(i=0;i<5;i++)
{
printf("请输入第%d门课成绩:",i+1);
scanf("%d",&(*p).scores[i]);
}
}

void output(student *p)
{
int i;
printf("number:%s\n",(*p).number);
printf("name:%s\n",(*p).name);
for(i=0;i<5;i++)
printf("%5d",(*p).scores[i]);
}

void last(student *p)
{
int t=0,i;
for(i=0;i<5;i++)
{
t=t+(*p).scores[i];
}
(*p).total=t;
}

main()
{
int t=0,i,j,order[5],temp;
student std[5],*p;
p=std;
for(p=std,i=0;i<5;i++,p++)
{
input(p);
last(p);
}
for(i=0;i<4;i++)
{
order[i]=i;
for(j=1;j<5;j++)
{
if(std[order[i]].total<std[order[j]].total)
{
temp=order[i];
order[i]=order[j];
order[j]=temp;
}
}
}
for(i=0,p=std;i<5;i++,p++)
output(p);
}
输入5个学生的成绩,并计算总分
将总分排序后,按从大到小的顺序输出。帮我看看,总是运行不成功
...全文
178 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxj1234567 2009-04-01
  • 打赏
  • 举报
回复
#include <stdio.h>
typedef struct
{
char number[10];
char *name; //没有必要用指针,用了反而与后面不符
int scores[5];
int total;
}student;
void input(student *p)
{
int i;
printf("number,name:");
scanf("%s,%s",&(*p).number,&(*p).name); /*字符串输入不加&符号,且
字符串输入时,遇到空白符,才结
束,因此,两个字符串读入时,若
第一个未读满10个字符,将继续读。建议分开读入或加空格*/

for(i=0;i <5;i++)
{
printf("请输入第%d门课成绩:",i+1);
scanf("%d",&(*p).scores[i]);
}
}

void output(student *p)
{
int i;
printf("number:%s\n",(*p).number);
printf("name:%s\n",(*p).name);
for(i=0;i <5;i++)
printf("%5d",(*p).scores[i]);//加\n
}

void last(student *p)
{
int t=0,i;
for(i=0;i <5;i++)
{
t=t+(*p).scores[i];
}
(*p).total=t;
}

main()
{
int t=0,i,j,order[5],temp;//t 无用 order[5]没必要,后面的排序方法无效
student std[5],*p;
p=std;
for(p=std,i=0;i <5;i++,p++) //刚赋值,p=std多余。
{
input(p);
last(p);
}
for(i=0;i <4;i++)
{
order[i]=i;
for(j=1;j <5;j++)
{
if(std[order[i]].total <std[order[j]].total)
{
temp=order[i];
order[i]=order[j];
order[j]=temp;
}
}
}
for(i=0,p=std;i <5;i++,p++)
output(p);
}
修改后如下:
#include <stdio.h>
typedef struct
{
char number[10];
char name[20];
int scores[5];
int total;
}student;
void input(student *p)
{
int i;
printf("number,name:");
scanf("%s %s",(*p).number,(*p).name);
for(i=0;i <5;i++)
{
printf("请输入第%d门课成绩:",i+1);
scanf("%d",&(*p).scores[i]);
}
}
void output(student *p)
{
int i;
printf("number:%s\n",(*p).number);
printf("name:%s\n",(*p).name);
for(i=0;i <5;i++)
printf("%5d\n",(*p).scores[i]);
}

void last(student *p)
{
int t=0,i;
for(i=0;i <5;i++)
{
t=t+(*p).scores[i];
}
(*p).total=t;
}

int main()
{
int i,j;
student std[5],*p;
student temp;
p=std;
for(i=0;i <5;i++,p++)
{
input(p);
last(p);
}

for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
if(std[j].total <std[j+1].total)
{
temp=std[j];
std[j]=std[j+1];
std[j+1]=temp;
}
}

}
for(i=0,p=std;i <5;i++,p++)
output(p);
return 0;
}
zxj1234567 2009-04-01
  • 打赏
  • 举报
回复
#include <stdio.h>
typedef struct
{
char number[10];
char *name; //没有必要用指针,用了反而与后面不符
int scores[5];
int total;
}student;
void input(student *p)
{
int i;
printf("number,name:");
scanf("%s,%s",&(*p).number,&(*p).name); /*字符串输入不加&符号,且
字符串输入时,遇到空白符,才结
束,因此,两个字符串读入时,若
第一个未读满10个字符,将继续读。建议分开读入或加空格*/

for(i=0;i <5;i++)
{
printf("请输入第%d门课成绩:",i+1);
scanf("%d",&(*p).scores[i]);
}
}

void output(student *p)
{
int i;
printf("number:%s\n",(*p).number);
printf("name:%s\n",(*p).name);
for(i=0;i <5;i++)
printf("%5d",(*p).scores[i]);//加\n
}

void last(student *p)
{
int t=0,i;
for(i=0;i <5;i++)
{
t=t+(*p).scores[i];
}
(*p).total=t;
}

main()
{
int t=0,i,j,order[5],temp;//t 无用 order[5]没必要,后面的排序方法无效
student std[5],*p;
p=std;
for(p=std,i=0;i <5;i++,p++) //刚赋值,p=std多余。
{
input(p);
last(p);
}
for(i=0;i <4;i++)
{
order[i]=i;
for(j=1;j <5;j++)
{
if(std[order[i]].total <std[order[j]].total)
{
temp=order[i];
order[i]=order[j];
order[j]=temp;
}
}
}
for(i=0,p=std;i <5;i++,p++)
output(p);
}
修改后如下:
#include <stdio.h>
typedef struct
{
char number[10];
char name[20];
int scores[5];
int total;
}student;
void input(student *p)
{
int i;
printf("number,name:");
scanf("%s %s",(*p).number,(*p).name);
for(i=0;i <5;i++)
{
printf("请输入第%d门课成绩:",i+1);
scanf("%d",&(*p).scores[i]);
}
}
void output(student *p)
{
int i;
printf("number:%s\n",(*p).number);
printf("name:%s\n",(*p).name);
for(i=0;i <5;i++)
printf("%5d\n",(*p).scores[i]);
}

void last(student *p)
{
int t=0,i;
for(i=0;i <5;i++)
{
t=t+(*p).scores[i];
}
(*p).total=t;
}

int main()
{
int i,j;
student std[5],*p;
student temp;
p=std;
for(i=0;i <5;i++,p++)
{
input(p);
last(p);
}

for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
if(std[j].total <std[j+1].total)
{
temp=std[j];
std[j]=std[j+1];
std[j+1]=temp;
}
}

}
for(i=0,p=std;i <5;i++,p++)
output(p);
return 0;
}
tanlee007 2009-03-28
  • 打赏
  • 举报
回复
#include <stdio.h>
typedef struct
{
char number[10];
char name[10];
int scores[5];
int total;
}student;
void input(student *p)
{
int i;
printf("number,name:");
scanf("%s%s",&(*p).number,&(*p).name);
for(i=0;i <5;i++)
{
printf("请输入第%d门课成绩:",i+1);
scanf("%d",&(*p).scores[i]);
}
}

void output(student *p)
{
int i;
printf("number:%s\n",(*p).number);
printf("name:%s\n",(*p).name);
for(i=0;i <5;i++)
printf("%5d",(*p).scores[i]);
}

void last(student *p)
{
int t=0,i;
for(i=0;i <5;i++)
{
t=t+(*p).scores[i];
}
(*p).total=t;
}

main()
{
int i,j,order[5],temp;
student std[5],*p;
for(p=std,i=0;i <5;i++,p++)
{
input(p);
last(p);
}
for(i=0;i <4;i++)
{
order[i]=i; ///执行第一次时只是初始化了order[0]
for(j=1;j <5;j++)
{
if(std[order[i]].total <std[order[j]].total) /////请问执行这儿时order[1]有值吗?没有值的嘛怎么执行呢?
{ /////你只是交换下标不起作用的要交换值呀!std[5]里的顺序仍没
temp=order[i]; /////变
order[i]=order[j];
order[j]=temp;
}
}
}
for(i=0,p=std;i <5;i++,p++)
output(p);
}

这是调试好的程序:
#include<stdio.h>
#include<iostream>
using namespace std;
typedef struct
{
char number[10];
char name[10];
int scores[5];
int total;
}student;
void input(student *p)
{
int i;
printf("number,name:");
scanf("%s%s",&(*p).number,&(*p).name);
for(i=0;i <5;i++)
{
printf("请输入第%d门课成绩:",i+1);
scanf("%d",&(*p).scores[i]);
}
}

void output(student *p)
{
int i;
printf("number:%s\n",(*p).number);
printf("name:%s\n",(*p).name);
for(i=0;i <5;i++)
printf("%5d",(*p).scores[i]);
printf("total=%d",p->total);
cout<<endl;
}

void last(student *p)
{
int t=0,i;
for(i=0;i <5;i++)
{
t=t+(*p).scores[i];
}
(*p).total=t;
}

void main()
{
int i,j,order[5];
student temp;
student std[5],*p;
for(p=std,i=0;i <5;i++,p++)
{
input(p);
last(p);
}
for(i=0;i <4;i++)
{
for(j=i+1;j <5;j++) ////比较的时候当下的值应该和它以后的值比较
{
if(std[i].total <std[j].total)
{
temp=std[i]; ////需要交换值啊!
std[i]=std[j];
std[j]=temp;
}
}
}
for(i=0,p=std;i <5;i++,p++)
output(p);
system("pause");
}

seamanhanshan 2009-03-23
  • 打赏
  • 举报
回复
简单看了眼。
scanf("%s,%s",&(*p).number,&(*p).name);
(*p).number用p->number好看些。
那个last函数无返回值,你调用的起啥作用。
li_lary 2009-03-23
  • 打赏
  • 举报
回复
#include <stdio.h>
typedef struct
{
char number[10];
char name[10];
int scores[5];
int total;
}student;
void input(student *p)
{
int i;
printf("number,name:");
scanf("%s%s",&(*p).number,&(*p).name);
for(i=0;i <5;i++)
{
printf("请输入第%d门课成绩:",i+1);
scanf("%d",&(*p).scores[i]);
}
}

void output(student *p)
{
int i;
printf("number:%s ",(*p).number);
printf("name:%s\n",(*p).name);
printf("各科成绩为:\n");
for(i=0;i <5;i++)
printf("%5d ",(*p).scores[i]);
printf("总分为:%5d\n",p->total);
}

void last(student &p)
{
int t=0,i;
for(i=0;i <5;i++)
{
t=t+p.scores[i];
}
p.total=t;
}

int main()
{
int i,j;
student std[5],*p,q;
for(p=std,i=0;i <5;i++,p++)
{
input(p);
last(*p);
}
for(i=0;i <=4;i++)
{

for(j=i;j<5;j++)
{
if(std[i].total <std[j].total)
{
q=std[i];
std[i]=std[j];
std[j]=q;
}
}
}
for(i=0,p=std;i <5;i++,p++)
output(p);
return 0;
}
你的进行student比较的时候出的问题,这是我改你你看一下
王大狼山 2009-03-23
  • 打赏
  • 举报
回复
我是菜鸟 发现两个问题
char *name;
直接赋值个字符串应该不行

再就是你那个排序 order数组到底想交换什么?
结构体排序是把每个成员值都要交换吧

百度了下 有的说用链表 有的直接交换值 还有的说是拷贝内存块 (那位大牛帮忙下个看下怎么做的)
我用一个指针数组做了下 没做出来 明天再看看

shanghai19132 2009-03-21
  • 打赏
  • 举报
回复
scanf("%s,%s",&(*p).number,&(*p).name);

这样写的话,你输入的时候就也要在数据之间输入"'"号
cl90326 2009-03-21
  • 打赏
  • 举报
回复
我又改了下,函数单独测试没问题
不知道为什么
放在一起就不行了
#include <stdio.h>
typedef struct
{
char number[10];
char name[10];
int scores[5];
int total;
}student;
void input(student *p)
{
int i;
printf("number,name:");
scanf("%s%s",&(*p).number,&(*p).name);
for(i=0;i<5;i++)
{
printf("请输入第%d门课成绩:",i+1);
scanf("%d",&(*p).scores[i]);
}
}

void output(student *p)
{
int i;
printf("number:%s\n",(*p).number);
printf("name:%s\n",(*p).name);
for(i=0;i<5;i++)
printf("%5d",(*p).scores[i]);
}

void last(student *p)
{
int t=0,i;
for(i=0;i<5;i++)
{
t=t+(*p).scores[i];
}
(*p).total=t;
}

main()
{
int i,j,order[5],temp;
student std[5],*p;
for(p=std,i=0;i<5;i++,p++)
{
input(p);
last(p);
}
for(i=0;i<4;i++)
{
order[i]=i;
for(j=1;j<5;j++)
{
if(std[order[i]].total<std[order[j]].total)
{
temp=order[i];
order[i]=order[j];
order[j]=temp;
}
}
}
for(i=0,p=std;i<5;i++,p++)
output(p);
}

输入5个学生学号姓名,5门课成绩,算出总分后
按从高到低的顺序输出,帮忙看下哪出错了;
每个函数单独试了下,都没问题,放在一起就不行了
jack_za123 2009-03-21
  • 打赏
  • 举报
回复
scanf 格式问题嘛,中间有逗号,输入的时候就要用逗号隔开
cl90326 2009-03-21
  • 打赏
  • 举报
回复
为什么啊?
fkeujjpdc 2009-03-21
  • 打赏
  • 举报
回复
scanf("%s,%s",&(*p).number,&(*p).name);
改为scanf("%s%s",&(*p).number,&(*p).name);
把%s与%s之间的逗号去掉
fkeujjpdc 2009-03-21
  • 打赏
  • 举报
回复
scanf("%s,%s",&(*p).number,&(*p).name);
改为scanf("%s,%s",&(*p).number,&(*p).name);
把%s与%s之间的逗号去掉

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧