这个程序有什么问题??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;
} 展开
两个静态变量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;
} 展开
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;
}
但你有没有注意到,你的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有什么问题???
然后你这个程序为什么没有显示出类析构中的内容呢 ??
追答
你不保存头结点,最后怎么能遍历链表输出所有学生的信息呢?
我没释放链表中的结点,当然不会析构。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询