九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

从易到难编写C++程序,(6)问题:利用问题(5)的随机数生成实现发牌

要求,输出一副扑克中抽出的4张牌,以<>表示方块,%表示梅花,&表示红心,^表示黑桃,按类似下面的方式输出:最好在同一排输出4张扑克。

*********************

*    <>5                     *

*                                *

*                                *

*                                *

*********************

阅读全文....

从易到难编写C++程序,(5)问题:实现满足各种需求的随机整数生成类RandCreater

因为在问题(3)中需要解决这个随机数产生的问题,我感觉还比较复杂,当然光是需要产生一个普通的整数还是比较简单,但是有的时候不仅仅是需要这样。现在实现以下几个要求,为这个类定义一些接口。目前只要求所有产生的都是整数。

1,RandCreater(int i) 在 0~i 范围内

2,RandCreater(int i,int j)在i~j范围内

3,RandCreater(LargeInt linta)在0~ivec范围内 LargeInt的意义见问题(4)

4,RandCreater(LargeInt linta, LargeInt lintb) 在linta~lintb范围内

5,产生的数有两种形式,(1)可以是内置类型的int,(2)也可以产生问题(4)定义的LargeInt。

暂定接口,觉得不适合可以更改。

阅读全文....

从易到难编写C++程序,(4)问题:实现一个大整数表示的BigInt类

因为在问题(3)中需要解决这个的问题,我感觉还比较复杂,单独拿出来作为一个问题也不为过。而且以后进一步研究一些东西也需要。

要求让这个容器有大部分内建类型拥有的功能,越多越好,并且符合它自己的定义。

起码的功能包括起码的逻辑运算>,<,==,移位,>>,<<,算数运算+,-,*,/,输入输出运算<<,>>,迭代器,

初始化方式:BigInt  binta;    默认构造函数,binta为0;

BigInt binta(lintb), binta是bintb的一个副本

BigInt binta(int) ,binta通过把int表示成大整数支持的格式构建自己。

BigInt binta(int n,int i);linta包含n位值为i。

暂定接口,不适合可以更改

 

阅读全文....

从易到难编写C++程序,(1)个人解答(2):把键盘输入的字符串逆序输出。

/*Copyright (c) 2007,九天雁翎

* All rights reserved.

* 从易到难编写C++程序,()个人解答():把键盘输入的字符串逆序输出。

* 完成日期:2007年6月12日*/


//我以前处理的非常复杂的,因为我是通过学习C++ Primer学习C++

//关于IO的细节内容在这本书里面都放在附录部分,所以我了解并不深

//不知道还有个noskipws可以控制流的输入

//其实因为我以前看过钱能的一本教材,里面对IO流的细节讲的还比较多

//我当时也的确详细看并且调试了,就自以为都还算比较了解了,所以没有看C++ Primer的附录

//因为实在受不了以前那个方案的复杂性,所以特意思考了一下,本来想用Cgetchar()解决问题

//后来又不想用C的库函数,看了一下附录,原来可以这样啊

#include "stdafx.h"

#include <iostream>

#include <vector>

#include <iomanip>

using namespace std;

 

int main()

{

    vector<char> cvec;

    char ch;

    cin>>noskipws>>ch;          //不为操作符跳过空白的输入。参见C++ Primer附录标准库

 

    while(ch != '!')       //不习惯用EOF作结尾,因为有些缺陷

    {

       cvec.push_back(ch);

       cin>>ch;

    }

//个人感觉这样输出比调用逆排序算法后再正向输出要效率高些,毕竟不用先排序

    for(vector<char>::reverse_iterator r_it = cvec.rbegin();

       r_it != cvec.rend();++r_it)

    {

       cout<< *r_it;

    }

 

    return 0;

}

 

阅读全文....

学习C++的再思考(3)

因为用了近2个月的时间好好的看完了C++ Primer,最近有点盲目,一方面自己感觉自己还有太多的不足,另一方面却不知道何去何从,是先开始Effective C++之旅,深入语言的细节,形成良好的编程风格和习惯,为将来编写健壮的程序打下良好的基础呢?还是先从数据结构与算法开始,利用他们来熟悉刚刚塞入肚子里面却没有来的及消化的那么多东西?要不就直接开始windows API的学习,可以开始编写一些有实际意义的东西呢?还不也可以看看C++ 沉思录,编程珠玑类的书来加深自己对 C++的理解?或者干脆就可以开始大范围接触一些源代码,来学习人家的编程思路呢?也可以先学学OOP,了解一下C++ 最重要的机制?要不学习下boost库的知识也可以为将来编程带来很多思维上的飞跃阿。该怎么去呢? 我自己迷惑了,所以郁闷了,不过我准备多面出击吗?精力不够啊。那么就稍微多面一点吧,首先看看TC++PL,同时编编有意思的程序,同时看看C++沉思录,Effective C++什么的。当程序员很多人都说累,因为要一直学东西。不过我倒比较喜欢这种终身学习的状态,因为这样不会让我感到空虚。

阅读全文....

按weskercn的思路写的程序,问题(2)解答:把键盘输入的16,10,8进制数转换为2进制输出

 //因为不能回复,老是提示校检码错误,所以单独发出来。

#include "stdafx.h"

#include <iostream>

#include <string>

#include <cstdlib>

#include <bitset>

#include <iomanip>

#include <cassert>

#include <limits>

using namespace std;

typedef enum _transmode

{

HEX_MODE = 1,

DEC_MODE,

OCT_MODE

}transmode;

int main()

{

    string instr;           //这就是输入,string类型

    long outlong;           //转换成进制的长整数

    int n_Numformat;

    cout<<"Please chose the input number format(1-Hex,2-Dec,3-Oct)"<<endl;

    cin>>n_Numformat;

    cout<<"Please input the number to be transformed:";

    cin>>instr;

    switch(n_Numformat)   //这里你的风格好于我

    {

    case HEX_MODE:

    n_Numformat = 16;

    break;

    case DEC_MODE:

    n_Numformat = 10;

    break;

    case OCT_MODE:

    n_Numformat = 8;

    break;

    default:

    cout<<"Error input number,exit"<<endl;

    exit(1);

}

    outlong = strtol(instr.c_str(),NULL,n_Numformat);

    assert(outlong != 0);  //假如转换失败,断言错误,这是你的方法的最好的地方

    bitset<numeric_limits<long>::digits> abit(outlong);

    cout<<"The binary number is"<<abit<<endl; //没有管格式了

    return 0;

}

 

阅读全文....

关于C++的学习再思考(2)

好像什么都会变成系列片。。。。如同我的文章,呵呵

不过上次的确太偏激了,因为突然的感悟,仔细想想,要想好好的掌握一门语言,特别是C++这种建构庞大的语言,不了解一些细节是不行的,当然,也许可以编程,但是效率呢,所以最好的办法还是,实践与彻底的学习相并重最好,C++可不是剪刀那么简单的东西:)  因此,我可能会把浅谈C++类继续下去,谈谈继承的问题,当然,也许是很久以后。

阅读全文....

从易到难编写C++程序,(3)问题:实现一个复杂的猜数字游戏

其实这个程序在刚学C的时候就做过了,不过这次用C++再做一次,也想办法提出点难点的要求,比如首先要求用户输入数字的范围(可能在内置类型可表示的范围外),然后用户确定在多少范围内就算才对,也就是说允许误差值,此时用户开始猜数字,输出是否正确与此时用户第几次尝试。比如先输入10000,表示范围为0~10000,再输入100,而随机生成的数字为5000,只要用户猜的数字在4900~5100以内都算对。当然,要提示用户猜的数字是大了还是小了。

阅读全文....

从易到难编写C++程序,(2)个人解答:把键盘输入的16,10,8进制数转换为2进制输出。

/*Copyright (c) 2007,九天雁翎

* All rights reserved.

* 从易到难编写C++程序,(2)问题:把键盘输入的16108进制数转换为2进制输出。

* 完成日期:200769*/


#include "stdafx.h"

#include <iostream>

#include <string>

#include <cstdlib>

#include <bitset>

#include <iomanip>

#include <cassert>

#include <limits>

using namespace std;

const size_t MAXLENGTH = numeric_limits<long>::digits; //定义MAXLENGTH为可保存long的二进制位数

int main()

{

    long inlong;            //输入

    int format;

    cout<<"Please choose the number type you want to input(1-Oct,2-Dec,3-Hex):";   //这里顺序由小到大,不知道合理不

    cin>>format;

    assert( format == 1 || format == 2 || format == 3 );      //假如有不听话的用户,断言错误,呵呵

    cout<<"Please input the number to be transformed:";

    if(format == 1)

    {

       cin>>oct>>inlong;         //利用iostream转换成进制避免了用c的库函数

    }

    else if(format == 2)

    {

       cin>>dec>>inlong;

    }

    else if(format == 3)

    {

       cin>>hex>>inlong;        //利用iostream转换进制避免了用c的库函数

    }

    //这种方法我发现一个很明显的缺点,那就是没有办法判断输入是否正确

    //也许是我的知识匮乏,希望有高手指点,怎么在这种情况判断输入时是否合乎逻辑

    //比如进制就不能出现,等的情况

    bitset<MAXLENGTH> abit(inlong); //利用bitset的构造函数完成进制到进制的转换

    cout<<"The binary number is:"<<endl;

    for(size_t i = MAXLENGTH; i != 0; --i)      //因为是bitset类型,所以输出是反的,有点奇怪

    {

       if( (i % 8 == 0) && i != MAXLENGTH)

       {

           cout<<" ";

       }

       cout<<abit[i-1];       //会发现只有位,因为第一位是符号位啊

    }

    return 0;

}

阅读全文....