这个程序有什么问题??c++编程vc6.0下运行

/*1.设计一个学生类Stud,包括学号(no)、姓名(name)、和成绩(deg)数据成员,两个静态变量sum和num,分别存放总分和人数,另有两个普通成员函数setd... /*1. 设计一个学生类Stud,包括学号(no)、姓名(name)、和成绩(deg)数据成员,
两个静态变量sum和num,分别存放总分和人数,另有两个普通成员函数setdata()和disp(),
分别用于赋值和输出成员数据,另有一个静态成员函数avg(),它用于计算平均分。
在main()函数中定义一个对象数组用于存储输入的学生数据,要求输出这些学生数据并
计算平均分*/
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
class stud{
char *no;
char *name;
float deg;
static float sum;
static int num;
public:
stud(){}
~stud(){
delete []name;
delete []no;
cout<<"class is destroyed....."<<endl;
}
void setdata(char *a,char *b,float c){
no=(char *)malloc(sizeof(char)*(strlen(a)+1));
strcpy(no,a);
name=(char *)malloc(sizeof(char)*(strlen(b)+1));
strcpy(name,b);
deg=c;
sum+=deg;
num++;
}
void disp(){
cout<<"姓名:"<<name<<"\n学号:"<<no<<"\n成绩:"<<deg<<endl;
}
inline static float avg(){
return sum/num;
}
};
float stud::sum=0;
int stud::num=0;

typedef struct personal{
stud data;
struct personal *next;
}personal,*personall;

void main(){
int i=0;
personall Q,k;
char loop;
cout<<"press'#'for end...else for continue:";
while((loop=getchar())!='#'){
char *x;
char *y;
float z;
cout<<"输入学号:";
x=(char *)malloc(sizeof(char)*30);
cin.get(x,30).get();
cout<<"输入姓名:";
y=(char *)malloc(sizeof(char)*30);
cin.get(y,30).get();
cout<<"输入分数:";
cin>>z;
cin.get();
Q=(personall)malloc(sizeof(personal)*1);
Q->data.setdata(x,y,z);
for(;i<1;i++)k=Q;
Q=Q->next;
system("cls");
cout<<"press'#'for end...else for continue:";
} Q->next=NULL;
Q=NULL;
do{
cout<<"输出第"<<i++<<"个学生的信息\n";
k->data.disp();
k=k->next;
}while(k->next==NULL);
cout<<"\n输出平均分:"<<stud::avg()<<endl;
}
展开
 我来答
忘至白葬不情必0T
推荐于2016-11-02 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:90%
帮助的人:1.2亿
展开全部
你的程序中while循环结束后有个Q->next=NULL;
但你有没有注意到,你的while循环中并没有给Q->next赋值的语句,而while循环体内在给Q->data.setdata后还有个Q=Q->next;这时候Q已经变成一个野指针了,再Q->next=NULL;当然出错。

而且for(;i<1;i++)k=Q;有什么用我完全看不出来

#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
class stud{
char *no;
char *name;
float deg;
static float sum;
static int num;
public:
stud(){}
~stud(){
delete []name;
delete []no;
cout<<"class is destroyed....."<<endl;
}
void setdata(char *a,char *b,float c){
no=(char *)malloc(sizeof(char)*(strlen(a)+1));
strcpy(no,a);
name=(char *)malloc(sizeof(char)*(strlen(b)+1));
strcpy(name,b);
deg=c;
sum+=deg;
num++;
}
void disp(){
cout<<"姓名:"<<name<<"\n学号:"<<no<<"\n成绩:"<<deg<<endl;
}
inline static float avg(){
return sum/num;
}
};
float stud::sum=0;
int stud::num=0;

typedef struct personal{
stud data;
struct personal *next;
}personal,*personall;

void main(){
int i;
personall Q=NULL,k;
//这里用Q专门做为链表的头指针,一开始要初始化为NULL
//k始终指向链表的最后一个结点,方便插入新结点
char loop;
cout<<"press'#'for end...else for continue:";
while((loop=getchar())!='#'){
char *x;
char *y;
float z;
cout<<"输入学号:";
x=(char *)malloc(sizeof(char)*30);
cin.get(x,30).get();
cout<<"输入姓名:";
y=(char *)malloc(sizeof(char)*30);
cin.get(y,30).get();
cout<<"输入分数:";
cin>>z;
cin.get();
personall temp=(personall)malloc(sizeof(personal)*1); //再用一个personall变量来生成新结点
temp->data.setdata(x,y,z);
temp->next=NULL; //注意一定要给新结点的next域赋NULL
if(Q) //如果链表已经建立了,把新结点连在链表的最后
{
k->next=temp;
k=temp;
}
else //如果刚才生成的新结点将是链表的第一个结点
{
Q=k=temp;
}
system("cls");
cout<<"press'#'for end...else for continue:";
}
i=1;
do{
cout<<"输出第"<<i++<<"个学生的信息\n";
Q->data.disp();
Q=Q->next;
}while(Q!=NULL); //注意是Q,不是Q->next
cout<<"\n输出平均分:"<<stud::avg()<<endl;
}
更多追问追答
追问
for(;inext置为NULL有什么问题???
然后你这个程序为什么没有显示出类析构中的内容呢 ??
追答
你不保存头结点,最后怎么能遍历链表输出所有学生的信息呢?
我没释放链表中的结点,当然不会析构。
jaybestwang
2011-11-17 · TA获得超过4106个赞
知道小有建树答主
回答量:940
采纳率:0%
帮助的人:691万
展开全部
如果我先输入#,程序执行这一段
do{
cout<<"输出第"<<i++<<"个学生的信息\n";
k->data.disp();
k=k->next;
}while(k->next==NULL);
但是这时,k并没有赋值,指向的地址不知道,怎么能直接用指针呢?
追问
我这个程序的前提是输入过了数据不考虑程序的容错性
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式