| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1701 人关注过本帖
标题:各种不懂得C++类定义问题 求解答,书上居然木有介绍
只看楼主 加入收藏
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
结帖率:62.07%
收藏
已结贴  问题点数:18 回复次数:34 
各种不懂得C++类定义问题 求解答,书上居然木有介绍
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
class heapify
{
public:
    heapify(int n);
    void heapify_init(int *s,int n);
    void heapify_output();
private:
    void heapify_build();
    void heapify_max();
    int *a;
    int n1;
    int n2;
};

heapify::heapify(int n)
{
    a=new int[n];
    n1=n;
}

void heapify::heapify_max(int i)
{
    int left=2*i+1,right=2*i+2,largest,key;
    largest=i;
    if(left<=n2&&*(a+left)>*(a+i))
        largest=left;
    if(right<=n2&&*(a+right)>*(a+largest))
        largest=right;
    if(i!=largest){
        key=*(a+largest);
        *(a+largest)=*(a+i);
        *(a+i)=key;
        heapify::heapify_max(largest);      ----------------------》这个地方进行自我调用 前缀heapify::  可以不可以省略
    }
}

void heapify::heapify_build()
{
    for(i=n2/2;i>=0;i--)
        heapify_max(i);     --------》私有函数调用私有函数 heapify_max也就是上面的一个函数,这个地方要不加上heapify :: 说明
}

void heapify::heapify_init(int *s,int n)
{
    n2=n;
    if(n>n1){
        printf("overflow");
        exit(0);
    }
    for(int i=0;i<n;i++)
        *(a+i)=*(s+i);
    heapify_build();
}

最后一个问题,这个类成员函数的互相调用是否也存在作用域的问题
也就是像C语言一样,如果函数调用另外一个函数,而这个被调用函数是在后面定义的,那么就必须在调用函数内声明被调用函数
是否要有  heapify::这个前缀
今天总算是鼓起勇气提笔写第一个正式的C++程序,发觉好混乱 好不适应

[ 本帖最后由 朱三哥 于 2013-4-27 12:51 编辑 ]
搜索更多相关主题的帖子: void private include public 
2013-04-27 12:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
信邪没有?

授人以渔,不授人以鱼。
2013-04-27 13:09
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
回复 2楼 TonyDeng
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
class heapify
{
public:
    heapify(int n);                      //构造函数
    ~heapify() {delete [] a;}
    void heapify_init(int *s,int n);     //初始化堆操作
    void heapify_output();
private:
    void heapify_build();               //建立最大堆
    void heapify_max(int i);            
    int *a;                             //数组堆的首地址
    int n1;                             //数组的大小的上限
    int n2;                             //已使用堆的大小
};

heapify::heapify(int n)
{
    a=new int[n];
    n1=n;
}

void heapify::heapify_max(int i)                      // 比较节点和节点的左右节点,看是否节点是最大的,如果不是则将节点值置为最大
{
    int left=2*i+1,right=2*i+2,largest,key;           //置换后,查看被交换的左节点或者右节点是否满足最大堆的要求,如果不满足则调整
    largest=i;
    if(left<=n2&&*(a+left)>*(a+i))
        largest=left;
    if(right<=n2&&*(a+right)>*(a+largest))
        largest=right;
    if(i!=largest){
        key=*(a+largest);
        *(a+largest)=*(a+i);
        *(a+i)=key;
        heapify_max(largest);
    }
}

void heapify::heapify_build()               //堆的建立,调整0-n2/2节点使其满足最大堆的属性,因为n2/2之后的元素都是叶子节点,其为自身      
{
    for(int i=n2/2;i>=0;i--)
        heapify_max(i);
}

void heapify::heapify_init(int *s,int n)
{
    n2=n;
    if(n>n1){
        printf("overflow");
        exit(0);
    }
    for(int i=0;i<n;i++)
        *(a+i)=*(s+i);
    heapify_build();
}

void heapify::heapify_output()
{
    for(int i=0;i<n2;i++)
        cout << *(a+i) << ' ';
    cout <<endl;
}

void main()
{
    int a[20];
    heapify myheapify(20);
    for(int i=0;i<20;i++){
        cin >> *(a+i);
        if(*(a+i)==-1)
            break;
    }
    myheapify.heapify_init(a,i);
    myheapify.heapify_output();
}


我的第一个C++程序,楼上的 你瞅瞅看
编译合格,结果正确


[ 本帖最后由 朱三哥 于 2013-4-27 13:50 编辑 ]

哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2013-04-27 13:49
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
感觉就是在用C捏造程序

哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2013-04-27 13:52
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:8 
回复 4楼 朱三哥
你这是最基本的类的声明实现,确实对于没有牵扯到继承、多态来讲,它和c的区别不是很大,形式也差不多,但是牵扯到c++的核心时候,那就是差别千万里。

Maybe
2013-04-27 13:56
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
恩,正在努力开垦,打算将数据结构 都用C++实现一遍

只不过这个一个那么小的程序  就写了那么长  手有点累

哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2013-04-27 13:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
用C++实现这种数据结构有什么好处?

授人以渔,不授人以鱼。
2013-04-27 14:04
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
回复 7楼 TonyDeng
不清楚,练个语法呗

哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2013-04-27 14:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你懂C练C++的语法干嘛?

授人以渔,不授人以鱼。
2013-04-27 14:14
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
回复 9楼 TonyDeng
要开发图形界面的软件

哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2013-04-27 14:21
快速回复:各种不懂得C++类定义问题 求解答,书上居然木有介绍
数据加载中...
 
   



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

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