貌似是动态内存分配出错了,大家帮忙看一下吧,谢谢

黑咖日记 2009-05-03 02:57:33
我是新手,好不容易写出来程序,结果总是运行的时候出错,大家帮忙看一下吧,谢谢
#include "stdafx.h"
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
#include<string>
using std::string;
#include<iomanip>
using std::setw;
class Class
{
private:
student *s;
int ave_c,ave_os;
int number;
int cm;
public:
void order_c();
Class();
Class(int,int);
virtual ~Class();
void operate();
void append();
void change();
void showclass();
int getnumber();
int getcm();
void setnumber(int);
void setcm(int);
void average_c();
int get_average_c();
void average_os();
int get_average_os();
};
Class::Class()
{
}
Class::Class(int num,int m)
{
s=new student[m];
number=num;
cm=m;
}

Class::~Class()
{
delete []s;
}

void Class::operate()
{
int a;
do{
cout<<"====================operate===================="<<endl
<<"请输入操作命令(1.添加记录 2.更改记录 3.显示本班记录 0.退出)";
cin>>a;
switch(a)
{
case 1:append();break;
case 2:change();break;
case 3:showclass();break;
}
}while(a!=0);
}
void Class::append()
{
char order;
for(int i=0;i<cm;i++)
{
int num,cscore,osscore;
string n;
cout<<"请输入学号:";
cin>>num;
cout<<"请输入姓名:";
cin>>n;
cout<<"请输入c语言成绩:";
cin>>cscore;
cout<<"请输入操作成绩:";
cin>>osscore;
if((*(s+i)).getnumber()==0)
{
(*(s+i)).setnumber(num);
(*(s+i)).setname(n);
(*(s+i)).setc(cscore);
(*(s+i)).setos(osscore);
// (*(s+i)).setstudent(num,n,cscore,osscore);
cout<<"继续添加信息吗?(任意键继续,n退出):"<<endl;
cin>>order;
}
if(order=='n') break;
}
}
void Class::change()
{
int i,a;
for(;i!=0;)
{
int number;
int newnumber;
string newname;
int newc;
int newos;
for(int flag=0;flag!=1;)
{
cout<<"请输入待修改信息的学号:";
cin>>number;
for(int o=0;o<cm;o++)
{
if((*(s+o)).getnumber()==number)
{flag=1;}
}
if(flag==1)
{
cout<<"请输入新学号:";
cin>>newnumber;
cout<<"请输入新姓名:";
cin>>newname;
cout<<"请输入新的数学成绩:";
cin>>newc;
cout<<"请输入新的c语言成绩:";
cin>>newos;
for(int o=0;o<cm;o++)
{
if((*(s+o)).getnumber()==number)
{
(*(s+o)).setnumber(newnumber);
(*(s+o)).setname(newname);
(*(s+o)).setc(newc);
(*(s+o)).setos(newos);
}
}
}
else cout<<"您输入了错误号码,请再次输入正确学号:"<<endl;
}
cout<<"按任意数字键继续,退出修改请按0:";
cin>>a;
if(a==0) break;
}

}

void Class::showclass()
{
cout<<".................成绩表................."
<<endl<<"学号.....姓名..........c语言成绩...操作成绩......总分"<<endl;
for(int i=0;i<cm;i++)
{
(*(s+i)).showstudent();
}
cout<<"……………………………………………………………………………………………………"<<endl;
}

void Class::average_c()
{
int t=0,i,a=0;
for(i=0;i<=cm;i++)
{
t=t+((*(s+i)).getcscore());
if((*(s+i)).getnumber()!=0) a++;
}
ave_c=t/a;
cout<<"c语言总分:"<<t<<" 总人数:"<<a<<" 平局分:"<<ave_c<<endl;
}
void Class::setcm(int m)
{
cm=m;
}
void Class::setnumber(int n)
{
number=n;
}
int Class::getnumber()
{
return number;
}
int Class::getcm()
{
return cm;
}
int Class::get_average_c()
{
return ave_c;
}
void Class::average_os()
{
int t=0,i,a=0;
for(i=0;i<=cm;i++)
{
t=t+((*(s+i)).getosscore());
if((*(s+i)).getnumber()!=0) a++;
}
ave_os=t/a;
cout<<"操作系统总分:"<<t<<" 总人数:"<<a<<" 平局分:"<<ave_os<<endl;
}
int Class::get_average_os()
{
return ave_os;
}

class grade
{
private:
Class t[3];
int gradescore;
public:
void operate();
void showgrade();
void gradetotalscore();
grade();
virtual ~grade();
};
grade::grade()
{
/* Class t1(1,3),t2(2,4),t3(3,5);
t[0]=t1;
t[1]=t2;
t[2]=t3;(不知注释部分的声明方法对不对?)*/
t[0]=Class(1,3);
t[1]=Class(2,4);
t[2]=Class(3,5);
gradescore=0;
}
grade::~grade()
{
}

void grade::showgrade()
{
int i;
for(i=0;i<3;i++)
{
t[i].showclass();
}
}

void grade::operate()
{
int i;
for(;i!=0;)
{
cout<<"请输入班级(1.一班 2.二班 3.三班 0.退出 10.显示年纪成绩):";
cin>>i;
switch(i)
{
case 1:t[0].operate();break;
case 2:t[1].operate();break;
case 3:t[2].operate();break;
case 10:showgrade();break;
}
}
}

class student
{
private:
int number;
static int m;
string name;
int c;
int os;
int total;
public:
void total_score();
int get_total_score();
student();
virtual ~student();
void setnumber(int);
void setname(string);
void setc(int);
void setos(int);
int getnumber();
string getname();
int getcscore();
int getosscore();
void showstudent();
};
student::student()
{
number=m+1;
m++;
name="...";
c=0;
os=0;
total=0;
}
student::~student()
{

}

void student::setnumber(int num)
{
number=num;
}

void student::setname(string n)
{
name=n;
}

void student::setc(int cscore)
{
c=cscore;
}
void student::setos(int osscore)
{
os=osscore;
}

int student::getnumber()
{
return number;
}
string student::getname()
{
return name;
}

int student::getcscore()
{
return c;
}
int student::getosscore()
{
return os;
}

void student::showstudent()
{
cout<<setw(3)<<number<<setw(10)<<name<<setw(19)<<c<<setw(11)<<os<<setw(10)<<total<<endl;
}

void student::total_score()
{
total=c+os;
}

int student::get_total_score()
{
return total;
}

int student::m=0;
int main(int argc, char* argv[])
{
grade g1,g2,g3,g4;
g1.showgrade();
int grade_number;
for(;grade_number!=0;)
{
cout<<"请输入年级(1.大一 2.大二 3.大三 4.大四 0.退出 10.显示全部记录):";
cin>>grade_number;
switch(grade_number)
{
case 1:g1.operate();break;
case 2:g2.operate();break;
case 3:g3.operate();break;
case 4:g4.operate();break;
case 10:g1.showgrade();g2.showgrade();g3.showgrade();g4.showgrade();break;
}
}
return 0;
}
...全文
231 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
coldiceangel 2009-05-05
  • 打赏
  • 举报
回复
粗略地看了下你的代码,在VS2005下做了些修改,目前可以编译运行,你的许多for循环最好用do-while代替

代码如下:

//#include "stdafx.h"
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include <string>
using std::string;
#include <iomanip>
using std::setw;

class student
{
private:
int number;
static int m;
string name;
int c;
int os;
int total;
public:
void total_score();
int get_total_score();
student();
student(student &);
student operator= (student &another);
virtual ~student();
void setnumber(int);
void setname(string);
void setc(int);
void setos(int);
int getnumber();
string getname();
int getcscore();
int getosscore();
void showstudent();
};

student::student()
{
number = m + 1;
m++;

name="...";
c=0;
os=0;
total=0;
}
student::student(student &another)
{
number = another.number;
m = another.m;

name = another.name;
c = another.c;
os = another.os;
total = another.total;
}

student student::operator= (student &another)
{
student temp;
temp.number = another.number;
temp.m = another.m;
temp.name = another.name;
temp.c = another.c;
temp.os = another.os;
temp.total = another.total;
return temp;
}
student::~student()
{

}

void student::setnumber(int num)
{
number=num;
}

void student::setname(string n)
{
name=n;
}

void student::setc(int cscore)
{
c=cscore;
}
void student::setos(int osscore)
{
os=osscore;
}

int student::getnumber()
{
return number;
}
string student::getname()
{
return name;
}

int student::getcscore()
{
return c;
}
int student::getosscore()
{
return os;
}

void student::showstudent()
{
cout <<setw(3) <<number <<setw(10) <<name <<setw(19) <<c <<setw(11) <<os <<setw(10) <<total <<endl;
}

void student::total_score()
{
total=c+os;
}

int student::get_total_score()
{
return total;
}

int student::m=0;

class Class
{
private:
student *s;
int ave_c, ave_os;
int number;
int cm;
public:
void order_c();
Class();
Class(int,int);
Class(Class &);
Class& operator= (Class &);
virtual ~Class();
void operate();
void append();
void change();
void showclass();
int getnumber();
int getcm();
void setnumber(int);
void setcm(int);
void average_c();
int get_average_c();
void average_os();
int get_average_os();
};
Class::Class()
: s(NULL),
ave_c(0),
ave_os(0),
number(0),
cm(0)
{
}
Class::Class(int num,int m)
{
s=new student[m];
number=num;
cm=m;
}

Class::Class(Class &another)
{
if (s == NULL)
{
s = new student[another.cm];
}
for (int i = 0; i < another.cm; ++i)
{
*(s + i) = *(another.s + i);
}
number = another.number;
cm = another.cm;
ave_c = another.ave_c;
ave_os = another.ave_os;
}

Class& Class::operator =(Class &another)
{
if(this->s == NULL)
{
this->s = new student[another.cm];
}
this->number = another.number;
this->cm = another.cm;
this->ave_c = another.ave_c;
this->ave_os = another.ave_os;
for (int i = 0; i < another.cm; ++i)
{
*(this->s + i) = *(another.s + i);
}
return *this;
}
Class::~Class()
{
delete []s;
}

void Class::operate()
{
int a;
do{
cout << "====================operate====================" << endl
<< "请输入操作命令(1.添加记录 2.更改记录 3.显示本班记录 0.退出)";
cin >> a;
switch(a)
{
case 1:append();break;
case 2:change();break;
case 3:showclass();break;
}
}while(a!=0);
}
void Class::append()
{
char order;
for(int i=0;i <cm;i++)
{
int num,cscore,osscore;
string n;
cout <<"请输入学号:";
cin >> num;
cout <<"请输入姓名:";
cin >>n;
cout <<"请输入c语言成绩:";
cin >> cscore;
cout <<"请输入操作成绩:";
cin >> osscore;
if((*(s+i)).getnumber()==0)
{
(*(s+i)).setnumber(num);
(*(s+i)).setname(n);
(*(s+i)).setc(cscore);
(*(s+i)).setos(osscore);
// (*(s+i)).setstudent(num,n,cscore,osscore);
cout <<"继续添加信息吗?(任意键继续,n退出):" <<endl;
cin>>order;
}
if(order=='n') break;
}
}
void Class::change()
{
int i = 1,a;
for(;i!=0;)
{
int number;
int newnumber;
string newname;
int newc;
int newos;
for(int flag=0;flag!=1;)
{
cout <<"请输入待修改信息的学号:";
cin>>number;
for(int o=0;o <cm;o++)
{
if((*(s+o)).getnumber()==number)
{flag=1;}
}
if(flag==1)
{
cout <<"请输入新学号:";
cin>>newnumber;
cout <<"请输入新姓名:";
cin>>newname;
cout <<"请输入新的数学成绩:";
cin>>newc;
cout <<"请输入新的c语言成绩:";
cin>>newos;
for(int o=0;o <cm;o++)
{
if((*(s+o)).getnumber()==number)
{
(*(s+o)).setnumber(newnumber);
(*(s+o)).setname(newname);
(*(s+o)).setc(newc);
(*(s+o)).setos(newos);
}
}
}
else cout <<"您输入了错误号码,请再次输入正确学号:" <<endl;
}
cout <<"按任意数字键继续,退出修改请按0:";
cin>>a;
if(a==0) break;
}

}

void Class::showclass()
{
cout <<".................成绩表................."
<<endl <<"学号.....姓名..........c语言成绩...操作成绩......总分" <<endl;
for(int i=0;i <cm;i++)
{
(*(s+i)).showstudent();
}
cout <<"……………………………………………………………………………………………………" <<endl;
}

void Class::average_c()
{
int t=0,i,a=0;
for(i=0;i <=cm;i++)
{
t=t+((*(s+i)).getcscore());
if((*(s+i)).getnumber()!=0) a++;
}
ave_c=t/a;
cout <<"c语言总分:" <<t <<" 总人数:" <<a <<" 平局分:" <<ave_c <<endl;
}
void Class::setcm(int m)
{
cm=m;
}
void Class::setnumber(int n)
{
number=n;
}
int Class::getnumber()
{
return number;
}
int Class::getcm()
{
return cm;
}
int Class::get_average_c()
{
return ave_c;
}
void Class::average_os()
{
int t=0,i,a=0;
for(i=0;i <=cm;i++)
{
t=t+((*(s+i)).getosscore());
if((*(s+i)).getnumber()!=0) a++;
}
ave_os=t/a;
cout <<"操作系统总分:" <<t <<" 总人数:" <<a <<" 平局分:" <<ave_os <<endl;
}
int Class::get_average_os()
{
return ave_os;
}

class grade
{
private:
Class t[3];
int gradescore;
public:
void operate();
void showgrade();
void gradetotalscore();
grade();
virtual ~grade();
};
grade::grade()
{
/* Class t1(1,3),t2(2,4),t3(3,5);
t[0]=t1;
t[1]=t2;
t[2]=t3;(不知注释部分的声明方法对不对?)*/

t[0]=Class(1,3);
t[1]=Class(2,4);
t[2]=Class(3,5);
gradescore=0;
}
grade::~grade()
{
}

void grade::showgrade()
{
int i;
for(i=0;i <3;i++)
{
t[i].showclass();
}
}

void grade::operate()
{
int i = 5;
for(;i!=0;)
{
cout <<"请输入班级(1.一班 2.二班 3.三班 0.退出 10.显示年纪成绩):";
cin>>i;
switch(i)
{
case 1:t[0].operate();break;
case 2:t[1].operate();break;
case 3:t[2].operate();break;
case 10:showgrade();break;
}
}
}

int main(int argc, char* argv[])
{
grade g1,g2,g3,g4;
g1.showgrade();
int grade_number = 5;
for(;grade_number!=0;)
{
cout <<"请输入年级(1.大一 2.大二 3.大三 4.大四 0.退出 10.显示全部记录):";
cin>>grade_number;
switch(grade_number)
{
case 1:g1.operate();break;
case 2:g2.operate();break;
case 3:g3.operate();break;
case 4:g4.operate();break;
case 10:g1.showgrade();g2.showgrade();g3.showgrade();g4.showgrade();break;
}
}
return 0;
}
iam68620963 2009-05-04
  • 打赏
  • 举报
回复
你跟踪调试一下,看看到底是哪一部分出了错,我们才好帮你看啊..
这么多,看都看晕了,
imsane 2009-05-04
  • 打赏
  • 举报
回复
把class student类里面的name成员定义为static类型,
再main()前添加一行:
string student::name = "...";
fellatioyzx 2009-05-04
  • 打赏
  • 举报
回复
调试信息和错误输出时什么样子至少发上来看看吧。。。
imsane 2009-05-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 christdeer 的帖子:]
我是新手,好不容易写出来程序,结果总是运行的时候出错,大家帮忙看一下吧,谢谢
#include "stdafx.h"
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include <string>
using std::string;
#include <iomanip>
using std::setw;
class Class
{
private:
student *s;
int ave_c,ave_os;
int number;
int cm;
public:
void order_c();
Class();
Class(int,in…
[/Quote]


在student::student()这个函数出错了,
你把name = "...";这句去掉看看。
haiphong 2009-05-04
  • 打赏
  • 举报
回复
t[0].setnumber(1);
t[0].setcm(3);
haiphong 2009-05-04
  • 打赏
  • 举报
回复
t[0]=Class(1,3);
t[1]=Class(2,4);
t[2]=Class(3,5);
着个定义就有问题.
hjjdebug 2009-05-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 christdeer 的帖子:]
我是新手,好不容易写出来程序,结果总是运行的时候出错,大家帮忙看一下吧,谢谢
t[0]=Class(1,3);
t[1]=Class(2,3);
t[2]=Class(3,3);
[/Quote]
你将临时对象Class 付给t[0],t[1],t[2], 需要重载=操作符,否则临时变量被销毁,
t[i]中的s指针 指向一个无定义区域,引起运行错误。
黑咖日记 2009-05-03
  • 打赏
  • 举报
回复
我把程序精简了一下。。。(我不清楚我删掉的部分会不会与问题有关。。。)大家再帮帮忙吧
#include "stdafx.h"
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
#include<string>
using std::string;
#include<iomanip>
using std::setw;
class Class
{
private:
student *s;
int number;
int cm;
public:
Class();
Class(int,int);
virtual ~Class();
void showclass();
int getnumber();
int getcm();
void setnumber(int);
void setcm(int);
};
Class::Class()
{
}
Class::Class(int num,int m)
{
s=new student[m];
number=num;
cm=m;
}

Class::~Class()
{
delete []s;
}

void Class::showclass()
{
cout<<".................成绩表................."
<<endl<<"学号.....姓名..........c语言成绩...操作成绩......总分"<<endl;
for(int i=0;i<cm;i++)
{
(*(s+i)).showstudent();
}
cout<<"……………………………………………………………………………………………………"<<endl;
}

void Class::setcm(int m)
{
cm=m;
}
void Class::setnumber(int n)
{
number=n;
}
int Class::getnumber()
{
return number;
}
int Class::getcm()
{
return cm;
}

class grade
{
private:
Class t[3];
int gradescore;
public:
void operate();
void showgrade();
grade();
virtual ~grade();
};
grade::grade()
{
/* Class t1(1,3),t2(2,4),t3(3,5);
t[0]=t1;
t[1]=t2;
t[2]=t3;(不知注释部分的声明方法对不对?)*/
t[0]=Class(1,3);
t[1]=Class(2,4);
t[2]=Class(3,5);
gradescore=0;
}
grade::~grade()
{
}

void grade::showgrade()
{
int i;
for(i=0;i<3;i++)
{
t[i].showclass();
}
}

class student
{
private:
int number;
static int m;
public:
student();
virtual ~student();
void setnumber(int);
int getnumber();
void showstudent();
};
student::student()
{
number=m+1;
m++;
}
student::~student()
{
}
void student::setnumber(int num)
{
number=num;
}

int student::getnumber()
{
return number;
}

void student::showstudent()
{
cout<<setw(3)<<number<<setw(10)<<name<<setw(19)<<c<<setw(11)<<os<<setw(10)<<total<<endl;
}

int student::m=0;
int main(int argc, char* argv[])
{
grade g1,g2,g3,g4;
g1.showgrade();
int grade_number;
for(;grade_number!=0;)
{
cout<<"请输入年级(1.大一 2.大二 3.大三 4.大四 0.退出 10.显示全部记录):";
cin>>grade_number;
switch(grade_number)
{
case 1:g1.operate();break;
case 2:g2.operate();break;
case 3:g3.operate();break;
case 4:g4.operate();break;
case 10:g1.showgrade();g2.showgrade();g3.showgrade();g4.showgrade();break;
}
}
return 0;
}
lpf000 2009-05-03
  • 打赏
  • 举报
回复
写的出来 就应该可以自己研究 压缩问题撒,要肯动脑,
黑咖日记 2009-05-03
  • 打赏
  • 举报
回复
晕,怎么都是这句话。
我已经说了啊,好像是动态内存那里错了,在class类中(况且,要是我明白哪里错了,就不会在这里问了吧)
na2650945 2009-05-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 christdeer 的回复:]
大家再帮忙看看啊。。。。
[/Quote]
代码要有缩进。
对错误要有描述。
黑咖日记 2009-05-03
  • 打赏
  • 举报
回复
大家再帮忙看看啊。。。。
黑咖日记 2009-05-03
  • 打赏
  • 举报
回复
那我怎么才能实现给学生编号这个功能啊?
我本来是想创建一个数组的,用s=new student()的话实现不了啊
lingyin55 2009-05-03
  • 打赏
  • 举报
回复
确实是你的new用错了
s=new student[m]; /////生成一个类对象没有[]这种用法,你只能调用student的构造函数。
看了了你的class student,只有一个默认构造函数,所以这里只能用s = new student();


[Quote=引用 4 楼 christdeer 的回复:]
编译连接的时候没有问题,但是运行的时候就出现错误提示框(而且是在要显示学生信息信息的时候跳出来一个错误提示),所以我也不太肯定错在哪里
我已经说了,可能是在动态分配内存地方出错了,就是class类中
[/Quote]
黑咖日记 2009-05-03
  • 打赏
  • 举报
回复
编译连接的时候没有问题,但是运行的时候就出现错误提示框(而且是在要显示学生信息信息的时候跳出来一个错误提示),所以我也不太肯定错在哪里
我已经说了,可能是在动态分配内存地方出错了,就是class类中
lpf000 2009-05-03
  • 打赏
  • 举报
回复
楼主像这样长的,自己研究下,把问题压缩一下,发关键代码撒,貌似不会有什么大问题
  • 打赏
  • 举报
回复
这么长,楼主你描述一下出问题的地方啊。
自己也应该学着单步调试。
Paradin 2009-05-03
  • 打赏
  • 举报
回复
好长。up
随着通信电子技术的迅速发展,信息技术给家居行业产生了深远的影响,家居环境的智能化监控已经成为智能家居的一个重要的发展方向。人们逐渐对自己的生活提出一种更高的要求,他们需要一种智能化、可交互,并且融合现代创新科技的产品来改善他们的生活环境,使他们生活更加安全、舒适、便捷、智能。本文根据智能家居的发展背景和研究现状,并且从实用性和可行性角度出发,研究设计了一种基于STM32单片机的智能家居系统。该系统由一个多功能综合的技术系统组成,各个多功能子系统间具有协同配合能力。基于STM32单片机实现的功能子系统包括:智能温度检测,智能湿度检测,智能烟雾/火灾检测智能检测,无线传输,人机交互机构,风扇调节,报警模块。 整个系统分为前端51单片机采集板和后端STM32单片机接收板。 采集板使用DHT11温湿度传感器、MQ烟雾传感器完成室内家居环境的采集。然后通过nRFL24L01将采集到的数据发送给后端。接收板使用LCD1602完成数据显示、使用蜂鸣器模块报警,使用风扇驱动模块调节室内家居环境。本文完成了智能家居控制系统前端、后端软硬件的设计,使用Altium designer绘制了电路原理图,使用Keil C完成了51单片机和STM32单片机的编程与调试。 最后,对本文设计的基于STM32的智能家居控制系统进行部署调试。试验结果表明,该系统可成功应用在智能家居环境检测调节和火灾安全防护的领域,可提高家居生活智能化水平。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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