| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1696 人关注过本帖
标题:[求助]一个好累人的类程序
只看楼主 加入收藏
ysgyh
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2006-2-4
收藏
 问题点数:0 回复次数:21 
[求助]一个好累人的类程序

哪位高手能帮帮我啊,这个问题我想了好久,可总是达不到我的心意。
我想要用类写一个程序,目的是能输入学生的姓名,成绩,和出生年月日。然后能显示每人学生的属性。可是当我输入姓名为tom 时就 出现错误输出。
所以姓名只能用一个字母表示,否则出错。除此之外,当输入两个学生时,其它属性输出也不正确,都以第二次输入的输出。太气人了。
程序如下,如果哪位朋友有时间的话,请看一下,帮我改一下,谢谢了!!!
#include<iostream.h>

class Cstudent
{
public:
int p;//p 的作用将在类外定义的函数中的i传回类,再传给另一个构造函数。总觉的这里不爽,可又不知怎么改好。
student()
{struct student
{char name[60];
float grade;
int biryear;
int birmonth;
int birday;
};
};
get_student();
cout_student();
private:
char name[60];
float grade;
int biryear;
int birmonth;
int birday;
};
Cstudent::get_student()
{
int i,j;
cout<<"请输入要输入学生的数目"<<endl;
cin>>i;
p=i;
cout<<"请依次输入学生的姓名,成绩和出生年月日"<<endl;
for(j=0;j<i;j++)
{
cin>>name[j]>>grade>>biryear>>birmonth>>birday;
}
}
Cstudent::cout_student()
{int i=p,j;
cout<<"学生的姓名,成绩和出生年月日如下"<<endl;
for(j=0;j<i;j++)
{cout<<name<<"的成绩为"<<grade<<"出生年月日为"<<biryear<<"年"<<birmonth<<"月"<<birday<<"日"<<endl;
}
}
void main()
{
Cstudent one;
one.student();
one.get_student();
one.cout_student();
}

搜索更多相关主题的帖子: tom 累人 姓名 属性 
2006-03-07 23:44
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
收藏
得分:0 

个人认为,你的程序有多出不合理之处,这是我的一
种改法,初学C++能力有限,希望能给你点启发
/*****************************************/

#include<iostream.h>

class Cstudent
{
public:

struct student
{char name[60][16];
float grade;
int biryear;
int birmonth;
int birday;
};

void get_student(int j);
void cout_student(int j);
private:
char name[60][16];
float grade;
int biryear;
int birmonth;
int birday;
};

void Cstudent::get_student(int j)
{
cout<<"输入学生的姓名,成绩和出生年月日"<<endl;
cin>>name[j]>>grade>>biryear>>birmonth>>birday;
}

void Cstudent::cout_student(int j)
{

cout<<name[j]<<"的成绩为"<<grade<<"出生年月日为"<<biryear<<"年"<<birmonth<<"月"<<birday<<"日"<<endl;

}

void main()
{ int i;
const MAX=100;
cout<<"请输入要输入学生的数目"<<endl;
cin>>i;

Cstudent student[MAX];//student 的每一个元素都是一个对象
for(int j=0;j<i;j++) student[j].get_student(j);
for(j=0;j<i;j++) student[j].cout_student(j);
}


天行健,君子以自强不息!!QQ:68660681
2006-03-08 10:00
名人
Rank: 1
等 级:新手上路
威 望:1
帖 子:205
专家分:0
注 册:2006-3-3
收藏
得分:0 

#include<iostream.h>

class Cstudent
{
public:
Cstudent();
public:
struct student {
char name[60];
float grade;
int biryear;
int birmonth;
int birday;
};
student stdArr[100];
get_student();
cout_student();
int get_studentCnt();
set_studentCnt(int);
private:
char name[60];
float grade;
int biryear;
int birmonth;
int birday;
int studentCnt;
};

Cstudent::Cstudent()
{
for (int i=0; i<60; ++i)
name[i] = 0;
grade = 0;
biryear = 0;
birmonth = 0;
birday = 0;
}

Cstudent::get_studentCnt()
{
return studentCnt;
}

Cstudent::set_studentCnt(int icnt)
{
studentCnt = icnt;
}

Cstudent::get_student()
{
int stdCnt;

cout<<"请输入要输入学生的数目"<<endl;
cin>>stdCnt;
set_studentCnt(stdCnt);
cout<<"请依次输入学生的姓名,成绩和出生年月日"<<endl;
for(int i=0;i<stdCnt;i++)
{
cin>>stdArr[i].name
>>stdArr[i].grade
>>stdArr[i].biryear
>>stdArr[i].birmonth
>>stdArr[i].birday;
}
}
Cstudent::cout_student()
{
cout<<"学生的姓名,成绩和出生年月日如下"<<endl;
for(int i=0;i<get_studentCnt();i++) {
cout<<stdArr[i].name
<<"的成绩为"
<<stdArr[i].grade<<"出生年月日为"
<<stdArr[i].biryear<<"年"
<<stdArr[i].birmonth<<"月"
<<stdArr[i].birday<<"日"<<endl;
}
}
void main()
{
Cstudent *one = new Cstudent();

one->get_student();
one->cout_student();
}


未必钱多乐便多,财多累己招烦恼。 清贫乐道真自在,无牵无挂乐逍遥。
2006-03-08 11:34
名人
Rank: 1
等 级:新手上路
威 望:1
帖 子:205
专家分:0
注 册:2006-3-3
收藏
得分:0 

如果你想每输入一个学生的信息就出现一次“请依次输入学生的姓名,成绩和出生年月日”的提示那么get_student()
函数的(cout<<"请依次输入学生的姓名,成绩和出生年月日"<<endl;)这句代码放到循环内便可


未必钱多乐便多,财多累己招烦恼。 清贫乐道真自在,无牵无挂乐逍遥。
2006-03-08 11:49
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
收藏
得分:0 

1. 类声明头文件
//TestInstance.h
#ifndef TESTINSTANCE_H_
#define TESTINSTANCE_H_

//structure
typedef struct student
{
char name[15];
float grade;
int biryear;
int birmonth;
int birday;
}student;

//class
class CStudent
{
public:
CStudent();
CStudent(int num, int size);
~CStudent();
void DisplayStudent() const;
void DisplayStudent(int i) const;
bool LocateStudent(student& infor, int i) const;

private:
void CreateData();
void ClearBuffer(); //clear cin buffer
void Inputdata(int i);
private:
student *stu;
int number; //student number
int spaceSize; //space size
};

#endif

2. 类声明实现文件
//TestInstance.cpp

#include "TestInstance.h"

#include <IOMANIP>
#include <IOSTREAM>
#include <exception>
using namespace std;
//student class
CStudent::CStudent()
{
stu = new student;
if (stu == NULL)
exit(-1);

number = 0;
}

CStudent::CStudent(int num, int size)
{
if (num >size)
{
size = num+1;
}
stu = new student[size];
if (stu == NULL)
exit(-1);

number = num;
spaceSize = size;
CreateData();
}

CStudent::~CStudent()
{
delete stu;
}

void CStudent::DisplayStudent() const
{
cout << "//----------------------------------------------------------------------//\n";
cout << setw(15) << "name" << setw(8) << "grade" << setw(15) << "birthday" << endl;;
cout << "//----------------------------------------------------------------------//\n";
for (int i=0; i<number; i++)
{
cout << setw(15) << stu[i].name << setw(8) << stu[i].grade
<< setw(12) << stu[i].biryear << "-" << stu[i].birmonth << "-" << stu[i].birday << endl;
}
cout << "//----------------------------------------------------------------------//\n";
}

void CStudent::DisplayStudent(int i) const
{
cout << "//----------------------------------------------------------------------//\n";
cout << setw(15) << "name" << setw(8) << "grade" << setw(15) << "birthday" << endl;;
cout << "//----------------------------------------------------------------------//\n";

cout << setw(15) << stu[i+1].name << setw(8) << stu[i+1].grade
<< setw(12) << stu[i+1].biryear << "-" << stu[i+1].birmonth << "-" << stu[i+1].birday << endl;

cout << "//----------------------------------------------------------------------//\n";
}
bool CStudent::LocateStudent(student& infor, int i) const
{
if (i < 1 || i > number)
{
cout << "Invalid index!!";
return false;
}
infor.birday = stu[i-1].birday;
infor.birmonth = stu[i-1].birmonth;
infor.biryear = stu[i-1].biryear;
infor.grade = stu[i-1].grade;
strcpy(infor.name, stu[i-1].name);

DisplayStudent(i-1);
return true;
}

void CStudent::Inputdata(int i)
{
cout << "\nPlease Input student " << i+1 << " name: ";
cin.get(stu[i].name, 15);
ClearBuffer();

cout << "Please Input student " << i+1 << " grade: ";
cin >> stu[i].grade;
while (stu[i].grade < 0.00 || stu[i].grade > 100.00)
{
cout << "Invalid data!\n";
cin >> stu[i].grade;
ClearBuffer();
}

cout << "Please Input student " << i+1 << " year: ";
cin >> stu[i].biryear;
while (stu[i].biryear < 1900 || stu[i].biryear > 2006)
{
cout << "Invalid data!\n";
cin >> stu[i].biryear;
ClearBuffer();
}

cout << "Please Input student " << i+1 << " month(1-12): ";
cin >> stu[i].birmonth;
while (stu[i].birmonth < 1 || stu[i].birmonth > 12)
{
cout << "Invalid data!\n";
cin >> stu[i].birmonth;
ClearBuffer();
}

cout << "Please Input student " << i+1 << " day: ";
cin >> stu[i].birday;
switch (stu[i].birmonth)
{
case 2:
while (stu[i].birday < 1 || stu[i].birday > 28)
{
cout << "Invalid data!\n";
cin >> stu[i].birday;
ClearBuffer();
}
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
while (stu[i].birday < 1 || stu[i].birday > 31)
{
cout << "Invalid data!\n";
cin >> stu[i].birday;
ClearBuffer();
}
break;
case 4:
case 6:
case 9:
case 11:
while (stu[i].birday < 1 || stu[i].birday > 30)
{
cout << "Invalid data!\n";
cin >> stu[i].birday;
ClearBuffer();
}
break;
default:
break;
}
ClearBuffer();
}

void CStudent::CreateData()
{
for (int i=0; i<number; i++)
{
Inputdata(i);
}
}

void CStudent::ClearBuffer()
{
cin.clear();
while (!isspace(cin.get()))
continue;
}

//end of student class

3. main函数
//Test.cpp
//Test some instance

#include "TestInstance.h"
#include <IOSTREAM>
#include <exception>
using namespace std;

int main(int argc, char* argv[])
{

CStudent stu(3, 5);
stu.DisplayStudent();
student stu2;
stu.LocateStudent(stu2, 2);
stu.DisplayStudent();

return 0;
}


谷底深深行 ,峰顶漫漫步......@_@
2006-03-08 11:59
wanglff
Rank: 2
等 级:新手上路
威 望:5
帖 子:375
专家分:0
注 册:2005-12-21
收藏
得分:0 

看了你们写的我觉得还是maoguoqing
的易读性好
怎么maoguoqing
你不用构造函数来实现对象的初始化呢?

自强不息:)
2006-03-08 12:15
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
收藏
得分:0 

用构造函数初始化对象需要多个参数
不太方便


天行健,君子以自强不息!!QQ:68660681
2006-03-08 12:20
wanglff
Rank: 2
等 级:新手上路
威 望:5
帖 子:375
专家分:0
注 册:2005-12-21
收藏
得分:0 

说的也是
又是名字又是成绩又是出生年月
可是也可以用默认参数

自强不息:)
2006-03-08 12:25
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
收藏
得分:0 
我将各个成员变量的非法输入都进行了判断,于是程序变大了,呵呵!!

谷底深深行 ,峰顶漫漫步......@_@
2006-03-08 12:31
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
收藏
得分:0 
原闻其详!

天行健,君子以自强不息!!QQ:68660681
2006-03-08 12:33
快速回复:[求助]一个好累人的类程序
数据加载中...
 
   



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

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