博文

原创 C++流式输出输出的的格式控制(2009-03-01 11:05:00)

摘要:C++流式输出输出的的格式控制

    对于流数据的输入输出格式,C++提供了两种不同的控制方式,一种是使用ios_base类提供的setf、width等函数设置输入输出格式,另一种是通过重载的格式控制符“<<”、“>>”以及流格式控制对象进行设置。
    本文只介绍:用函数设置或者恢复格式
    大部分流的输入输出格式可以用setf函数来设置。该函数有两种重载形式。其但参数的setf原型为:
    fmtflage setf(fmtfalg flag)
    参数flag说明所要设置的格式,由ios_base给出,可取如下枚举常量:
    enum{
    left        =0x0001,    //在域中靠左输出
    right        =0x0002,    //在域中靠右输出
    internal    =0x0004,    //符号靠左数值靠右输出,中间默认以空格填充   
    dec            =0x0008,    //数值以十进制输出
    hex            =0x0010,    //以16进制输出
    oct ......

阅读全文(2677) | 评论:0

基类对象的初始化(2007-04-10 01:26:00)

摘要:基类对象的初始化
1、类等级:
类X是类Y的基类,X被称为类Y的直接基类。若类Y是类Z的直接基类,称类X是类Z的间接基类。这样,类X、Y、Z形成了一个类等级。
在类等级中,若以各类只有一个直接基类,这种继承关系称为单继承。若一个类有多个直接基类,这种继承关系称为多继承。
在一个派生类中,要访问派生类成员同名的基类成员,使用:类名::成员 的方式。其中类名可以是某个间接基类的类名。
2、基类对象的初始化
在建立一个类等级后,通常是通过创建某个派生类的对象来使用者各类等级,包括隐含地使用基类的数据和函数。但是基类往往有构造函数或有参数化的构造函数。
派生类初始化积累构造函数的问题:
C++在派生类的构造函数中提供初始化基类的机制(用表达式的方式)
C++中,派生类构造函数的声明为: 
派生类构造函数(变元表):基类(变元表){……….} 
每个派生类只会负责其直接基类的调用。

如果基类使用缺省的构造函数或不带参数的构造函数,那么派生类构造函数中“:”后面的“基类(变元表)”项可省去,但是派生类构造函数执行时仍然会隐式地调用基类构造函数执行。
执行构造函数时,先执行基类的构造函数,在执行派生类的构造函数。
执行析构函数时,先执行派生类的析构函数,在执行基类的析构函数。


......

阅读全文(2535) | 评论:0

关于虚基类(2007-04-10 01:23:00)

摘要:    多继承:指一个派生类有两个或两个以上间接基类

    多继承派生类中,可能存在多个间接基类对象。
    引入虚基类解决这一问题。

    虚基类的定义示例:
    class L{ ……
            public: int next;
            ………}
    class B: virtual public L{……};
    class B: virtual public L{……};
    class C: public A, public B{
            public:
            void f(){next=0;}//派生类中的基类对象只有一个实例。
            };
  虚基类构造函数的调用问题:
    1、虚基类构造函数的调用在非虚基类......

阅读全文(2350) | 评论:0

练习:递归实现汉诺塔(2006-06-11 23:28:00)

摘要://递归实现汉诺塔 
//devcpp4.9.9.2环境
//2006 06 10 
//使用系统的运行时栈
#include <cstdlib>
#include <iostream>

using namespace std;

void hanoi(int n,char a,char b,char c)
{
     if(n==1)
         cout<<n<<" "<<a<<" "<<c<<endl;
       else
     {
         hanoi(n-1,a,c,b);
         cout<<n-1<<" "<<a<<" "<<c<<endl;
         hanoi(n-1,b,a,c);
     }
}    

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

阅读全文(3016) | 评论:0

总结:函数模版(template)的使用(2006-06-11 23:18:00)

摘要:
1、c++是强类型语言,不容易实现“为每个函数实例都显式定义一个函数”
2、宏定义和模扳提供了这种方法
3、宏定义的方法
    #define min(a,b)   ((a)<(b)?(a):(b))
    这种方法对于简单的min()调用可以正常工作
    但是,复杂调用时行为不可预期!!因为它的机制并不像函数调用那样工作,而只是简单地提供参数的替换
    结果是,它的参数都被替换两次:一次在参数的测试中,另一次在宏的返回值被计算期间。
4、函数模版提供了一种用来自动生成各种类型函数实例的方法。
   程序员对于函数接口中的全部或者部分类型进行参数化(parameterize),而函数保持不变。

5、例1:求两个数中较小者
template <class Type>
    Type minm(Type a,Type b)
    {
         return a<b?a:b;
    }
    
int main()
{
    minm(10;20);
    minm(10.0,20,0);
    return 0;
}

6、例2    STL库中堆栈的用法   <stack>
///////6.1 ......

阅读全文(9263) | 评论:0

练习:选择排序(2006-05-16 23:46:00)

摘要://对数组进行选择排序
/*
选择排序的过程为:
在桌上的牌中找出最小的一张牌,拿在手中;
重复这种操作,直到把所有牌都拿在手中。
*/

#include <iostream.h>

int *SeleSort(int a[],int n)
{
    int *b=new int(n);
//    b[0]=a[0];
    int t=a[0];
    for(int i=0;i<n;i++)
    {
        t=a[i];
        for(int j=i;j<n;j++)
        {
            if(t>a[j])
            {int k;  k=a[j];  a[j]=t;  t=k;}
        }
        b[i]=t;
    }
    ret......

阅读全文(2198) | 评论:0

练习:插入排序(2006-05-16 23:45:00)

摘要:/*
数组的插入排序
从一堆牌的上面开始拿牌,每次拿一张牌,
按排序原则把牌放到手中正确的位置。
桌上的牌拿完后,手中的牌也就排好序了

*/
//对数组的前N个元素进行插入(有小到大)排序
#include <iostream.h>
int *InsertionSort(int a[],int n)
{
    int *b;
    b=new int(n);
    b[0]=a[0];
    for(int i=1;i<n;i++)
    {
        for(int j=i-1;j>=0;j--)
        {
            if(a[i]<b[j])
                b[j+1]=b[j];
            else
            {
             &nb......

阅读全文(2168) | 评论:0

练习:交换排序(2006-05-16 23:41:00)

摘要://对数组进行交换排序
/*
交换排序的过程为:
    (1)先拿两张牌放到手中。如果左边的牌要排在右边的牌的后面,就交换这两张牌的位置。
    (2)然后拿下一张牌,并比较最右边两张牌,如果有必要就交换这两张牌的位置。
    (3)重复第(2)步,直到把所有的牌都拿到手中。
    (4)如果不再需要交换手中任何两张牌的位置,就说明牌已经排好序了;
    否则,把手中的牌放到桌上,重复(1)至(4)步,直到手中的牌排好序。
*/
#include <iostream.h>
int *ExchSort(int a[],int n)
{
    int count=1;
    while(count!=0)
    {
        count=0;
        for(int i=0;i<n;i++)
        {
            int t;
            if(a[i]>a[i+1])
            ......

阅读全文(2223) | 评论:0

关于C++的见解[转](2006-05-05 15:26:00)

摘要:  将算法独立抽象出来,在C++中算不上新鲜:STL中就封装了不少高效、健壮、灵活的泛型组件及对应的基础算法,工艺之高、适用性之强,非寻常我辈所轻易能及。这里不打算(也暂没有能力打算)以STL这样的工业级要求来谈论算法封装,只因最近尝翻大师名著,阅者水平有限,仅嗅触至皮毛,理智薄弱,感情却蓬勃发展:也欲尝试“封装”的味道。选择了最简易的穷举算法,抽其骨架,炮制成class,套上一实际例子,观之run之,抽象程度颇低,效率损失弥彰;然却也自觉有可爱之处,遂作此文以记之。诚惶诚恐,便于名目之前加“闲谈”二字,倘果因技术问题招致痛骂,则试以此二字为护文符,聊且一挡。

 

    众所周知,穷举法可视为最简单的搜索:即是在一个可能存在可行状态(可行解)的状态全集中依次遍历所有的元素,并判断是否为可行状态。例如,要设计一个“从一堆苹果中找出蓝色的苹果”这样的穷举算法,则定义:

    (1) 状态全集:一堆苹果

    (2) 可行状态:蓝色的苹果

    噢,好,我们现在已经抽取了两个基本概念,迫不及待要开始穷举了,但……怎么做呢?穷举的关键是“依次遍历”,即做到不重、不漏。呃,我们可以让听话的苹果们排成一行,放在“苹果数组”中,然后呢,我们就可以按照0号苹果、1号苹果、2号苹果、...、n号苹果这样的顺序成功遍历。好,我们解决了遍历苹果的问题……慢,我们现在是设计一个算法的抽象模型,如果一切待穷举的对象都已经活生生地摆在那里,当然有可能把它们全部收集起来并排队,但如果开始的时候我们并不知道所有要穷举的对象,比如我们或许要通过一台安装在探测飞船内的计算机在全宇宙范围内穷举出除地球以外有生命的星球,那么我们的计算机可能是随着飞船的前行方能不断地得到新星球的信息,而不是停在地球的时候就获得全宇宙的星球信息(就算可能,内存或许也装不下如此大的数据量——哪怕宇宙真的是有限“大”的)。所以我们不应当要求穷举进行之前就能获得状态全集中的所有状态,这样一来,我们的“苹果数组”计划就宣告流产了。现在再看看我们激动人心的星球搜......

阅读全文(1457) | 评论:0