| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 388 人关注过本帖
标题:关于类的问题
只看楼主 加入收藏
教皇
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2011-10-6
结帖率:95.65%
收藏
已结贴  问题点数:6 回复次数:4 
关于类的问题
关于学生的类包括成绩 学号 名字。
名字学号军用char 型。
执行时,再输完成绩后在屏幕上出现的学号是一堆乱码!
求大神指出错误!!!
#include<iostream.h>
#include<string.h>
class student
{
 char name[8];
 char *no;
 double score[4];
 public:
  student()
  {
   char num[8]="203";
   cout<<"调用缺省值构造函数"<<endl;
   strcpy(name,"xiang");
   no=num;
   for(int i=0;i<4;i++)
     score[i]=60;
  }
  student(char na[],char n[],double s[])
  {
    cout<<"调用构造函数"<<endl;
   strcpy(name,na);
   if(n)
   {
    no=new char [(strlen(n)+1)];
    strcpy(no,n);   
   }
   for(int i=0;i<4;i++)
     score[i]=s[i];
  }
  ~student()
  {
   cout<<"调用析构函数"<<endl;

   if(no) delete []no;
  
  }
  student(student &p)
  {
   int i;
   cout<<"调用拷贝构造函数"<<endl;
   strcpy(name,p.name);
   if(p.no)
   {
    no=new char [strlen(p.no)+1];
    strcpy(no,p.no);
   
   }
   for(i=0;i<4;i++)
    score[i]=p.score[i];
  }
 void setnameno(char *na,char *no);
 void setscore(double s[]);
 double total();
 double average();
 void outputone();
 void modiscore(char c,double s);
 
};

void student::setnameno(char *na,char *n)
{
 strcpy(name,na);
 strcpy(no,n);

}
void student:: setscore(double s[])
{
 int i;
 for(i=0;i<4;i++)
     score[i]=s[i];

}
double student:: total()
{
 double sum=0;
 int i=0;
 for(i=0;i<4;i++)
     sum+=score[i];
 return sum;

}
double student:: average()
{
 double aver=0;
 int i;
 for(i=0;i<4;i++)
     aver+=score[i];
 aver=aver/4;
return aver;
}
void student:: outputone()
{
 int i;
 cout<<"名字:"<<name;
 cout<<"学号:"<<no;
 for(i=0;i<4;i++)
   switch(i)
 {
    case(0):cout<<"数学成绩:"<<score[i]<<endl;break;
    case(1):cout<<"英语成绩:"<<score[i]<<endl;break;
    case(2):cout<<"物理成绩:"<<score[i]<<endl;break;
    case(3):cout<<"C++成绩:"<<score[i]<<endl;break;
 }
}
void student:: modiscore(char c,double s)
 {
  switch(c)
  {
   case('m'):score[0]=s;break;
   case('e'):score[1]=s;break;
   case('p'):score[2]=s;break;
   case('c'):score[3]=s;break;
  }
 
}

void main()
{
 char name[8],no[8],*p,*p0;
 p=name;
 p0=no;
 double score[4];
 int i;
 student p1;
 cout<<"请输入名字和学号:"<<endl;
 cin>>name>>no;
 p1.setnameno(p,p0);
 cout<<"请输入成绩:"<<endl;
 for(i=0;i<4;i++)
     cin>>score[i];
 p1.setscore(score);
 p1.outputone();
 cout<<"总成绩为:"<<p1.total()<<endl;
 cout<<"平均成绩为:"<<p1.average()<<endl;
 p1.modiscore('m',86);
 p1.outputone();
 
}

搜索更多相关主题的帖子: double 问题 include public xiang 
2012-04-15 16:07
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:6 
写了一个类似于你的,按注释所示方法去调试,理解一下带参与不带参构造函数有什么不同。
#include <iostream>
using namespace std;

class Student
{
    public:
        Student();
        Student(char *, char *, double []);
        ~Student();

        void print_info();

    private:
        char name[8];        //姓名
        char *no;            //学号
        double score[4];    //成绩
};

Student::Student()
{
    cout << "缺省值构造函数!" << endl;

    no = new char[8]; //分配内存空间
    strcpy(name, "");
    strcpy(no, "");
    for(int i = 0; i < 4; i++)
        score[ i ] = 60;
}

Student::Student(char *name, char *no, double score[])
{
    cout << "带参构造函数!" << endl;

    this->no = new char[8]; //分配内存空间
    strcpy(this->name, name);
    strcpy(this->no, no);
    for(int i = 0; i < 4; i++)
        this->score[i] = score[i];
}

Student::~Student()
{
    cout << "调用析构函数" << endl;

    if(no)  //在这里下断点,查看两次调用这里是否执行了。
        delete [] no;
}

void Student::print_info()
{
    cout << "姓名" << name << endl;
    cout << "学号" << no << endl;
    for(int i = 0; i < 4; i++ )
    {
        switch(i)
        {
            case 0: cout<<"数学成绩:"<<score[i]<<endl; break;
            case 1: cout<<"英语成绩:"<<score[i]<<endl; break;
            case 2: cout<<"物理成绩:"<<score[i]<<endl; break;
            case 3: cout<<"C++成绩:"<<score[i]<<endl;  break;
        }
    }
}

void main()
{
    Student s1;        //在这里下断点(按F9),按F11单步执行,跟踪进构造函数按F10

    char name[8], no[8];
    double score[4];

    s1.print_info(); //输出信息

    cout << "请输入姓名和学号" << endl;
    cin >> name >> no;

    cout << "请输入成绩:" << endl;
    for(int i = 0; i < 4; i++)
        cin >> score[i];

    Student s2(name, no, score); //在这里下断点,按F11单步执行,跟踪进构造函数
    s2.print_info();
}

[ 本帖最后由 hellovfp 于 2012-4-16 11:46 编辑 ]

我们都在路上。。。。。
2012-04-16 11:43
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
student{
char num[8]="203";
no=num; //不能用成员变量char *no指针指向函数局部变量,也不能返回指向局部变量的指针,这是程序设计易犯错误!
}

另外,写大段程序的时候,请写上注释,否则没有人愿意帮你看程序的。
程序代码要注意规范,否则满篇乱麻般的代码,别人很容易被吓走的。

[ 本帖最后由 hellovfp 于 2012-4-16 13:45 编辑 ]

我们都在路上。。。。。
2012-04-16 11:59
阴阳
Rank: 4
等 级:业余侠客
帖 子:102
专家分:297
注 册:2012-4-7
收藏
得分:0 
膜拜大神

一阴一阳之谓道!
2012-04-16 12:46
教皇
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2011-10-6
收藏
得分:0 
回复 3楼 hellovfp
谢谢!!!膜拜大神!!!
2012-04-17 12:42
快速回复:关于类的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017570 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved