初学者求解指针错误

昼夜勤作息 2012-02-18 01:15:30
【代码如下】
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define COUNT 2 //录入学生个数
#define MESSAGE printf("\n%s\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",p->Name,p->Nom,p->Math,p->Physics,p->English,p->Chinese,p->PE,p->Total,p->Average);

struct St
{
char Name[30];//数据域
int Nom;
float Math;
float Physics;
float English;
float Chinese;
float PE;
float Total;//个人总分
float Average;//个人平均分
int Fail;//挂科数
struct St * pNext;//指针域
};

int i;

//造节点及录入学生信息
struct St * Make(void)
{
char name[30];
int nom;
float math;
float physics;//用于存放节点内数据
float english;
float chinese;
float pE;
float total;
float average;

//造一个不存放数据的头结点
struct St * pHead = (struct St *)malloc(sizeof(struct St));

if (pHead==NULL)
{
printf("分配内存失败!");
exit(-1);
}

struct St * pList = pHead;
pList -> pNext = NULL;

for (i=0;i<COUNT;++i)
{
printf("请录入第%d个学生成绩:\n",i+1);
printf("姓名:");
scanf("%s",name);

printf("学号:");
scanf("%d",&nom);

printf("数学:");
scanf("%f",&math);

printf("物理:");
scanf("%f",&physics);

printf("英语:");
scanf("%s",&english);

printf("语文:");
scanf("%s",&chinese);

printf("体育:");
scanf("%s",&pE);

total = math + physics + english + chinese + pE;
average = total / 5;

struct St * pNew = (struct St *)malloc(sizeof(struct St));
if (pNew==NULL)
{
printf("分配内存失败!\n");
exit(-1);
}

//给数据域赋值
strcpy(pNew->Name,name);
pNew->Nom = nom;
pNew->Math = math;
pNew->Physics = physics;
pNew->English = english;
pNew->Chinese = chinese;
pNew->PE = pE;
pNew->Total = total;
pNew->Average = average;

pList->pNext = pNew;
pNew->pNext = NULL;
pList = pNew;

}
return pHead;//返回头节点地址。
}

//求数学平均成绩
void Math_average (St * pHead)
{
float Maths_total = 0.0;//班级数学总分
float Maths_average;
struct St * p = pHead->pNext;

while ( p != NULL )
{
Maths_total += p->Math;
p = p->pNext;
}

Maths_average = Maths_total / COUNT;
printf("\t\t班级数学平均分为:%.4f\n",Maths_average);

return;
}

//找有两门以上功课不及格的学生
void fail(St * pHead)
{
struct St * p = pHead->pNext;

while ( p != NULL )
{
p->Fail = 0;

if ( (p->Math)<60 )
p->Fail++;

if ( (p->Physics)<60 )
p->Fail++;

if ( (p->English)<60 )
p->Fail++;

if ( (p->Chinese)<60 )
p->Fail++;

if ( (p->PE)<60 )
p->Fail++;

p = p->pNext;
}

printf("\n\t成绩欠佳的学生为:\n");
printf("\n姓名\t学号\t数学\t物理\t英语\t语文\t体育\t总分\t平均分\n");

p = pHead->pNext;
while ( p != NULL )
{
if ( (p->Fail)>2 )
MESSAGE

p = p->pNext;
}

return;
}

//找成绩优良的学生
void excellent (St * pHead)
{
struct St * p = pHead->pNext;

printf("\n\t成绩优良的学生为:\n");
printf("\n姓名\t学号\t数学\t物理\t英语\t语文\t体育\t总分\t平均分\n");

while (p != NULL)
{
if ( (p->Average)>85 )
MESSAGE
else if ( (p->Math)>80 && (p->Physics)>80 )
if ( (p->English)>80 && (p->Chinese)>80 )
if ( (p->PE)>80 )
MESSAGE

p = p->pNext;
}
return;
}

int main (void)
{
struct St * phead = NULL;//定义一个头指针用于存放头结点的地址。
phead = Make();
Math_average(phead);
fail(phead);
excellent (phead);
return 0;
}
/*
在VC++6.0的运行结果:
——————————————————————————————————————
请录入第1个学生成绩:
姓名:周杰伦
学号:0001
数学:88
物理:88
英语:88
语文:88
体育:88
请录入第2个学生成绩:
姓名:李克勤
学号:0002
数学:55
物理:55
英语:55
语文:55
体育:55
班级数学平均分为:71.5000

成绩欠佳的学生为:

姓名 学号 数学 物理 英语 语文 体育 总分 平均分

周杰伦 1 88.00 88.00 -33612000.00 -33612000.00 -33612000.00
-100835824.00 -20167164.00

李克勤 2 55.00 55.00 -33608916.00 -33608916.00 -33608916.00
-100826640.00 -20165328.00

成绩优良的学生为:

姓名 学号 数学 物理 英语 语文 体育 总分 平均分
Press any key to continue
——————————————————————————————————————
*/
【问题:为何英语到平均分会乱码?为何优秀不显示?如何写指针才最优?最后谢谢。】
...全文
132 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
blackboy002 2012-02-23
  • 打赏
  • 举报
回复
建议使用vc来调试一把,一步一步检查
昼夜勤作息 2012-02-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 liaojet 的回复:]
将其中的后三个中%s改为%f,就ok了!!!!

引用楼主 lzq_111 的回复:
【代码如下】
printf("姓名:");
scanf("%s",name);

printf("学号:");
scanf(" %d",&nom);

printf("数学:");
scanf(" %f",&math);

printf("物理:");
scanf(" ……
[/Quote]
首先谢谢你,刚刚调试时我也看到了。
自信男孩 2012-02-18
  • 打赏
  • 举报
回复
单步调试吧,或者使用打印语句来确定错误出在那个地方。你可能需要在多个地方插入打印语句。
Liaojet 2012-02-18
  • 打赏
  • 举报
回复
将其中的后三个中%s改为%f,就ok了!!!!
[Quote=引用楼主 lzq_111 的回复:]
【代码如下】
printf("姓名:");
scanf("%s",name);

printf("学号:");
scanf(" %d",&nom);

printf("数学:");
scanf(" %f",&math);

printf("物理:");
scanf(" %f",&physics);

printf("英语:");
scanf(" %s",&english);

printf("语文:");
scanf(" %s",&chinese);

printf("体育:");
scanf(" %s",&pE);
……
[/Quote]
ProgrammingRing 2012-02-18
  • 打赏
  • 举报
回复
单步调试吧……
hanyunqi 2012-02-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hanyunqi 的回复:]

printf("学号:");
scanf("%d",&nom);

printf("数学:");
scanf("%f",&math);

printf("物理:");
scanf("%f",&physics);

printf("英语:");
scanf("%s",&english);

printf("语文:");
scanf("%s"……
[/Quote]
看错了,不好意思
hanyunqi 2012-02-18
  • 打赏
  • 举报
回复
擦,看错了,不好意思
hanyunqi 2012-02-18
  • 打赏
  • 举报
回复
printf("学号:");
scanf("%d",&nom);

printf("数学:");
scanf("%f",&math);

printf("物理:");
scanf("%f",&physics);

printf("英语:");
scanf("%s",&english);

printf("语文:");
scanf("%s",&chinese);

printf("体育:");
scanf("%s",&pE);
这里错了,去掉"&"
jixingzhong 2012-02-18
  • 打赏
  • 举报
回复
初步判断一下问题可能的位置,然后加个断点,单步调试,或者输出一些调试信息分析一下吧。

分析问题是很重要的技能。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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