终于完成了,哈哈!

lonelybug 2003-02-16 12:02:41
我只是把自己的课本上的一个算法用C++实现了一边,第一次用的是函数的方法,这次用的是类的方法!请大家看看,设计的是否合理,有不足之处希望大虾们不息赐教,哈哈!
>>>>>>>>>>>>>study6a.cpp<<<<<<<<<<<<<<<<
#include <iostream>
#include <stdlib.h>
#include "study6a.h"
#define maxnum 3
using namespace std;

binarysearch::binarysearch(int *numlist,int max){
list=numlist;
maxlimit=max;
}



int *binarysearch::sortlist()
{
int tempnum;
for(int pass=0;pass<=maxlimit-1;pass++)
for(int c=0;c<=maxlimit-pass-2;c++)
{
if (list[c]>list[c+1])
{
tempnum=list[c];
list[c]=list[c+1];
list[c+1]=tempnum;

}
}
return list;
}

int binarysearch::gettarget(){
int targetnum;
cout<<"属于要查找的数字"<<endl;
cin>>targetnum;
return targetnum;
}

int binarysearch::search(int target){
bool found=0;
int low=0;
int middle;
int high=maxlimit;
while((low<=high)&&(found==0))
{
middle=(low+high)/2;
if (list[middle]==target)
{
return middle+1;
found=1;
}
else
if (list[middle]>target)
high=middle-1;
else
low=middle+1;

}
if (found==0)
return 0;

}

binarysearch::~binarysearch(){}

int main(){
int stringlist[maxnum];
int *stradd=stringlist;
int target,result;
cout<<"请输入一组数字"<<endl;
for(int i=0;i<=maxnum-1;i++)
{
cin>>stringlist[i];
}
binarysearch BS(stradd,maxnum);
/*列出排列好的数组
for(int i=0;i<=maxnum-1;i++)
{
cout<<*BS.sortlist()+i<<endl;
}
*/
BS.sortlist();
target=BS.gettarget();
result=BS.search(target);
if (result==0)
{
cout<<"没有找到数字"<<target<<endl;
}
else
{
cout<<"数字"<<target<<"已经找到位置在"<<result<<endl;
}
system("pause");
return 0;
}

>>>>>>>>>>>>>study6a.h<<<<<<<<<<<<<<<<
#ifndef study6a_H_
#define study6a_H_

class binarysearch{
private:
int maxlimit;
int *list;
public:
binarysearch(int*,int);
~binarysearch();
int *sortlist();
int gettarget();
int search(int);
};
#endif
...全文
36 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
mr_oydy 2003-02-17
  • 打赏
  • 举报
回复
1,从名字上看这个类要做的是Func Obj, 所以跟本就不应该做jeff800614所说的那种构造,但要在构造里给用户指定是否在search();前调用sortlist();
2,应该提供operator()(const int target);,search的接口参数加const
3,jeff800614说得对要处理copy constor,assign operator.但应该不需要赋值操作,也就是说把它放到private:
4,这个类里的析构函数我觉得是多余的.
5,search();所返回的下标是从1开始的.但我觉得应该从0开始.没找就返回
enum{NOELEM=-1};
jeff800614 2003-02-17
  • 打赏
  • 举报
回复
封装,就我目前的理解,感觉其很大的目的就是为安全性。c的结构和类的最大区别就是,类中有private and protected区,这是对对象进行封装的必然结果。如果没有private and protected,那么就和结构没什么分别了。
另外lonelybug提的把关于构造函数的具体实现上,经mr_oydy(bach)这么一说,我觉得应该好好想想,是否有必要进行这个逻辑。按mr_oydy(bach)的说法,你构造的类从目的讲,就是一个提供操作的类,因此好像不需要拥有需要操作的数据列表,从这个角度来讲,我确实像不出什么理由来反对这个观点。
既然这样的话,那么binarysearch在进行操作时,应该使用对外部的列表的引用参数,不要使用指针参数,这样在语义上才是正确的,因为该类不拥有它。
不知mr_oydy(bach)是否赞同我这样做。如果是这样的话,析构函数也就没有实现的意义了
hddhddhdd 2003-02-16
  • 打赏
  • 举报
回复
因为你的错误太多,如果一一说来,恐怕要一两个小时.
---------------------------------------------------
哈哈
alan118 2003-02-16
  • 打赏
  • 举报
回复
要好好努力啊
qhgary 2003-02-16
  • 打赏
  • 举报
回复
gettarget(),不要设为public,不需要吧,况且不好
构造函数,还是要提供一个无参的,所以还需要一个SetList(int *lst)的函数。
chinajiji 2003-02-16
  • 打赏
  • 举报
回复
因为你的错误太多,如果一一说来,恐怕要一两个小时.
lonelybug 2003-02-16
  • 打赏
  • 举报
回复
为什么只告诉我有错误,去不具体的帮我呢!?
晨曦2003 2003-02-16
  • 打赏
  • 举报
回复
因为你的错误太多,如果一一说来,恐怕要一两个小时.
---------------------------------------------------
哈哈
---------------------------------------------------
呵呵

我相信五个星星的多半是高手。
lonelybug 2003-02-16
  • 打赏
  • 举报
回复
jeff800614(jeff):非常感谢,你的指点让我明白了不少!哈哈!终于有点开窍的感觉了!我可能还是么有掌握类的风装的概念,所以设计出来的东西好像都带有那中以前函数功能设计为主的思想!嗬嗬!没办法,我真的要一点点的改了!!
我有一个疑问,就是说你让我把用户构造类的时候的形参改道类的自身里面,就是说让把用户的那个参数拷贝到类自身的一个可控制的空间里面事吗!?那用的list=numlist;这个方法可以吗!?这不就是说吧numlist变成了类的自身可控制的一个变量了吗!?然后类里面的其他成员函数都使用的是这个呀!嗬嗬!能否帮我改一下,谢了!
lonelybug 2003-02-16
  • 打赏
  • 举报
回复
可是我用dev c++运行一切良好呀!micropentium6(小笨) 兄!
lonelybug 2003-02-16
  • 打赏
  • 举报
回复
qhgary(Shining):我可以理解要有一个没有参数的构造函数,可是如果把gettarget()改称private之后好像汇报错,而且也不能再main里面直接调用了,请问要怎么改呢!?
setlist(int *list)这个里面我应该写什么!?
谢谢了!
  • 打赏
  • 举报
回复
呵呵,编译器可以帮你找出大部分的错误的:)
lonelybug 2003-02-16
  • 打赏
  • 举报
回复
chinajiji(菜鸟叽叽):既然你知道这么多个错误为什么不说出来呢!你不说我也不可能找出来呀,希望可以支出这些错误!
nicolas2001 2003-02-16
  • 打赏
  • 举报
回复
大家讨论讨论,何必弄的气氛这么紧张?!吵架一样!
不如小生开个帖子大家弄点分如何?

什么?有作弊嫌疑???这…………
这个罪名大了

开,开玩笑,我看气氛这么紧张就来缓解一下气氛!
哈哈!

jeff800614 2003-02-16
  • 打赏
  • 举报
回复
我觉得要是避免那种情况的话,得重新设计接口。
因为在binarysearch类的构造函数中,接受来自调用方的numberlist指针,正因为该指针是在外部创建的,不属于类,因为类对它没有完全的控制,如果是用在“采用语义”情况的话,倒是可以的。不过对于更一般的情况,我想应该放弃这种方式的接口。我的一个建议是:
1、仍然采用该接口,但实现要改变,即把形参指向的内存拷贝到类自己的内存区域,也就是说类要为自己分配另外的内存来保存list,同时对类的接口进行必要的说明,这样就可以明确类的实现者和客户之间的责任,减少错误。
2、或者binareysearch也要具备自己建立list的能力。
总之,最好在类内部保存list,不要和调用哲共享。

复制构造函数和赋值运算符重载一个不能少,这是类的接口设计充足的一个重要方面。

另外我觉得排序不应该返回内部list指针,你这样和把list声明喂public有什么分别么?完全破坏了封装的概念!!

某些接口的设计也不友好,
一要让人以看就要大体了解该方法是做什么的?
二要返回恰当的类型,比如search,我觉得返回bool会更好,因为search的语义就是查看“是否“在list中有某个值。gettarget是做什么?只会混淆用户。我觉得你设计的类的接口不足、不友好;封装差;
至于实现细节我就没看。
好好努力吧,我这也是纸上谈兵。希望指正。
  • 打赏
  • 举报
回复
up
lonelybug 2003-02-16
  • 打赏
  • 举报
回复
噢!我也知道我是设计上面的错误,因为一开始我就想让各位帮我看看这个类的设计是否正确,并没有说程序有错误!所以,我就是要各位帮我理解一下类的设计我看了一些文章和书,可是我觉得只有自己动手写才可以真正的犯错误,然后才能改正,可是你们也不说,我都不知道那里错了!
micropentium6(小笨) 兄还是不错的,告诉我了我一些涉及上的问题,比如果没有拷贝构造函数,还有没有重载=(不太明白为什么要重载=),还有就是我是从main()里面吧*list给类的,micropentium6(小笨) 兄说,如果用户吧list这个指针值想了别的,或者收回的话,类并不知道,可是这用什么方法避免呢!?谢谢了!我好像真的有点学艺不精了,哈哈!还请各位大虾多多包涵,耐心指导一下了,我这人奔,所以没有办法了!写了!
chinajiji 2003-02-16
  • 打赏
  • 举报
回复
你的错误大多是程序设计方法上的错误,编译无错只是程序正确的第一步.
lonelybug 2003-02-16
  • 打赏
  • 举报
回复
我用VS.net也测试了!没有错误!我到现在也不知道你们说的错误是什么!可以看得见的!我已经改了呀!我并没有不虚心的意思,我只是想让各位大虾明白的指出来我的错误地方!我觉得这不过分吧!
就好像有个医生说你得了很多病,可是告诉你要是给你一个个检查的话需要花1-2天,所以就不给你检查了,反正你是很多病在身就是了!我想这不是病人想听到的结果吧!哈哈!就算都说出来很非各位的时间,可是说一两个还是不用太多时间的吧!哪怕说一个呢!?
再次感谢了!我真的用Dev C++和vs.net都测试没有错误!当然了vs.net有个warning说search()这个成员函数不是每个都有返回值,这点我倒是注意了,可是剩下的呢!?
21st_centry_fox 2003-02-16
  • 打赏
  • 举报
回复
现在大家都用VC6的,你也从了我们吧.
加载更多回复(3)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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