| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1193 人关注过本帖
标题:[求助]一个c++的问题
只看楼主 加入收藏
chengstone
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
帖 子:562
专家分:226
注 册:2004-4-3
结帖率:0
收藏
 问题点数:0 回复次数:2 
[求助]一个c++的问题

最近在学c++ 遇到了一个小问题 所以发上来 很想知道怎么做

描述课程类和学生类. 学生有名字,学生最多可学五门课程,学生实际学的门数,可以给定学生的名字,可以得到学生的名字,可以得到学生给定课程的成绩,可以得到学生所学课程的平均成绩,可以给学生增加一门课(同时在该课程中增加一个学生). 课程最多有30个学生,课程有实际学生数,课程有实际学生名单,课程有学分数,课程有每个学生成绩,课程可以得到学分数,课程可以设置学分数,课程可以得到班平均成绩,课程可以得到某个学生成绩. 这个题是钱能c++程序设计里p311 第2题

由于我是面向对象编程刚入门 对于面向对象程序设计还是一知半解 尤其是对类的内部编写还没曾编过 希望朋友们不吝赐教 帮我把上面那个类写出来 其实有写数据成员和成员函数我可以写出来 但是有一些 我想了半天实在没办法了 所以才将这个题发到网上来 希望能够跟c++前辈学习一下

搜索更多相关主题的帖子: 课程 
2005-02-02 20:58
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
你到底有什么问题?

给你一个提示,这是  object  互相之间关系的问题,也就是你中有我,我中有你。
通常可以用 friend class  来实现不同类 class 之间的数据互相访问。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-02-03 12:12
chengstone
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
帖 子:562
专家分:226
注 册:2004-4-3
收藏
得分:0 

今天刚刚把这个程序做了出来 由于没有编译器 所以发上来 各位看一看 原题的程序很弱 如果一个学生同时学两门课程的话 就没有办法了 所以我把程序稍微改动了一下 增加了一些东西 支持多学生同时学多课程的类程序 不过里面还有些问题 我还没有搞清楚 我不明白学分是搞什么的? 既然每个学生的课程都有相应的成绩 那为什么还要用学分呢 所以在程序里 涉及到学分的 我都没有做 而且题里要求做的成员函数里也没有用到学分 我想应该对程序影响不大吧 课程类里的条件“课程有学分数”,“课程可以得到学分数,课程可以设置学分数”这里都涉及到学分 程序里都没有用到 所以我没有做 至于“课程可以设置学分数”我理解为给定成绩 这个我在课程类里写出了相应的成员函数 就是void Lession::sendscore(float x,Student& s) 对于学生类的一个条件“可以得到学生所学课程的平均成绩”,我理解为比如一个学生同时学数学和英语 那么学生所学课程的平均成绩就是数学成绩和英语成绩相加再做除法 以求出平均成绩 因为每个课程只有一个成绩 应该涉及不到一个课程里面的平均成绩吧 那样的话 岂不是成了[成绩除以一]了 对应的成员函数是 float Student::lessionAverage() 程序如下: class Lession; //先声明课程类 在学生类里要用到 课程类的名字 class Student { int num; //学生实际学的门数 初始化为0 char name[20]; //学生的名字 Lession *head[5]; //这里的作用是为了在学生同时学很多课程的时候方便查找成绩用到的 //由于每个学生最多只能学5门课 所以定义了5个课程类的指针 以指向 //该生所学的课程类对象 在这里我原来是用动态链表来实现的 不过实 //现起来很不方便 而且要定义析构函数和拷贝构造函数 所以我就用了 //指针数组来完成操作了 public: //构造函数 初始化所学课程门数 学生名字 和课程指针数组 Student(char *s="no name") { num=0; givename(s); for(int i=0;i<5;i++)head[i]=NULL; } //给定学生的名字 void givename(char *s) { cout<<"学生的名字是:"<<s<<endl; strcpy(name,s); name[sizeof(name)-1]='\0'; } //得到学生的名字 char *showname(){ return name; } //这个友元函数的作用是输出学生的成绩 friend float findscore(Student& t,Lession& s); //得到指定课程的学生成绩,用到了上面的友元函数 float putscore(Lession& s){ return findscore(*this,s); } //得到该生所有课程的平均成绩 float lessionAverage() { float n=0; for(int i=0;i<num;i++) { int k=head[i]->numOfstudents; //用到了课程类指针 k的值为该课程的学生数 for(int j=0;j<k;j++) if(!strcmp(name,head[i]->namelist[j]))break; //在学生名单中查找该生的位置 n+=head[i]->scoreOfstudents[j]; //算出各科成绩之和 } return n/(float)num; //最终算出平均成绩 } //给学生增加一门课(同时在该课程中增加一个学生) void addlession(Lession& s) //参数s可以给学生增加不同的课程 { int i,j; for(i=0;i<s.numOfstudents;i++) //在该课程中查找学生名单 if(!strcmp(name,s.namelist[j]))break; if(i==s.numOfstudents) //如果该生没学过此课程 { if(num<5) //如果该生没学满5门课 { if(s.numOfstudents<30) //如果该课程的学员未达到规定的30人 { head[num++]=&s; //将此课程对象地址赋予head 方便以后查找 j=s.numOfstudents++; strcpy(s.namelist[j],name); //将该生的名字写入课程学生名单 s.namelist[j][sizeof(name)-1]='\0'; s.scoreOfstudents[j]=0; //该生所学课程成绩初始化为0 } else cout<<"该课程人数已满,请选择学习其他课程"<<endl; } else cout<<"该生已学五门课程,不能再学其他课程"<<endl; } else return; } } //课程类定义 class Lession { int numOfstudents; //实际学生数 char namelist[30][20]; //实际学生名单 float scoreOfstudents[30]; //每个学生的成绩 int count; //虽然没用上 但还是定义了 学分数 public: Lession(){ numOfstudents=0; } //构造函数 初始化实际学生数 //这个友元函数的作用是输出学生的成绩 friend float findscore(Student& t,Lession& s); //由于学生类中增加一门课程的操作使用了课程类中的私有成员 所以定义成友元 friend void Student::addlession(Lession& s); //给指定学生s 设置成绩x void sendscore(float x,Student& s) { int i; for(i=0;i<numOfstudents;i++) if(!strcmp(namelist[i],s.name))break; //查找学生名单 if(i==numOfstudents) cout<<"该生没有学习该课程,无法给定成绩"<<endl; else scoreOfstudents[i]=x; } //课程得到班平均成绩 float average() { float n=0; for(int i=0;i<numOfstudents;i++) n+=scoreOfstudents[i]; return n/(float)numOfstudents; } //得到某个学生成绩 float putscore(Student& t){ return findscore(t,*this); } } //完成读取成绩实际操作的函数 在课程类和学生类中被声明为友元 float findscore(Student& t,Lession& s) { int i; for(i=0;i<s.numOfstudents;i++) if(!strcmp(t.name,s.namelist[i]))break; if(i==s.numOfstudents)cout<<"该生没有学习该课程,无法取得成绩!"<<endl; else return s.scoreOfstudents[i]; } 原题中还有一部分 上次我没有打出来 剩余的部分是: 现有数学课,张三学数学,成绩为3.1分,李四学数学,成绩为4.5分。求其平均成绩,求张三的数学成绩。 现有物理课,学时数为4,张三学物理,成绩为4分。求张三所学课程的平均成绩。

所做主程序如下: //第一题 void main() { Student person("Zhang3"); //有一学生张三 Student other("Li4"); //有一学生李四 Lession math; //现有数学课 person.addlession(math); //张三学数学 other.addlession(math); //李四学数学 math.sendscore(3.1,person); //张三成绩3.1分 math.sendscore(4.5,other); //李四成绩4.5分 cout<<"数学班的平均成绩是:" <<math.average()<<endl //班平均成绩 <<"张三的数学成绩是:" <<person.putscore(math) //张三的数学成绩 <<endl; } //第二题 void main() { Lession wuli; //本人英语不好 物理只好用拼音代替了 Student person("Zhang3"); //有一学生张三 person.addlession(wuli); //张三学物理 wuli.sendscore(4,person); //成绩为4分 cout<<"张三所学课程的平均成绩是:" <<person.lessionAverage() //张三所学课程的平均成绩 <<endl; }

可以将上面两个主函数 混在一起 成为一个完整的程序 不知道 以上的程序算不算完整


qq:69558139
2005-02-16 20:41
快速回复:[求助]一个c++的问题
数据加载中...
 
   



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

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