C++学习方法导论

转载请注明出处:转载自 至尊明帅的博客 原文地址:http://zi-jin.com/?p=10

很多同学都在为学C++而烦恼,现在我希望能提供一些帮助大家学C++的东西。

第一部分:准备工作

1.我不想一开始就介绍很多概念性的东西(但有一些是必须的),想先让大家亲自体验,然后引出概念。希望大家喜欢这种方式。

2.大家看到这篇文章前应该已经看过有关C++语言的书籍,如学校课本,本文并不是代替课本,或许只是引导你如何去看课本及其他书籍。

3.本文说的C++均指标准C++。(这句话是写给看得懂这句话的人看的,现在大家可以不用在此纠结。)

4.C++是一门语言,是人与机器的沟通方式。遵循C++语言规范写出来的东西叫代码,它必须经过编译器编译成机器能执行的指令。

5.其实如果你能把C++ Primer这本书看完,不需要任何其他资料就能了解整个C++语言了,但真的一开始就抱着那么大一本砖头书看也不知道好不好,反正我没试过,我觉得学习过程中还是要以培养兴趣为主。

6.如有任何疑问,欢迎在下面留言:http://zi-jin.com/archives/10#comment

第二部分:从大家都看过的一个C++程序说起:

1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
int main()
{
    int a;
    cin >> a;
    cout << "received number is " << a;
    return 0;
}

1.“int”是什么?
int a;
表示声明(Declare)一个整数型变量(interger),其名称为“a”,就像数学里面“设长方形的长为a,宽为b”,值得注意的是你不能“设长方形的长为a,宽为a”。因为标识符(Identifier)在其作用域(Scope)内必须是唯一的,从其英文名可以看出,我们必须凭这个名字而找到准确的事物。
声明多个整数型变量时,可以写成:int a, b, c, d, e;
在C++中,你必须先声明一个变量,才能使用它。
这句话是什么意思?就是上面那个程序中,如果没有“int a;”这个语句,那编译时就会报错,通常的提示是:[未声明的标识符 'a'](error: ‘a’ was not declared in this scope)
解决方法?你是把int a;删掉了引起的这个问题,把它重新加上去呗……
除了int外,C++还有其他基本内置类型。下面都提一下:
bool 布尔型
其值为true或false,用来表示一个条件是否成立。比如我可以声明以下一组变量来简单的表示一个人的基本特征:bool bMale, bTall, bStrong, bHealthy, bMarried;

char 字符型
通常用单引号里面一个字符给它赋值(建议这么做),一个字符占一个字节。另外建议了解一下“转义符”(Escape)。如果你不知道为什么’\0′等于0的话那就是还不够了解。

wchar_t 宽字符型
通常用单引号里面一个字符或2个字符给它赋值(建议这么做),一个宽字符占2个字节。有很多人都不知道 wchar_t w = ‘ab’; 这样赋值。

short 短整形
一般占2个字节

int 整形
一般在多少位CPU上工作就占多少位。比如在32位机器上就占4个字节(8位为1字节)。建议不了解的同学搜索一下字、字节、位、双字等单位。

long 长整形
一般占4个字节

float 单精度浮点数
发现有很多同学学了很久C++还不知道如何用C++来表示整数之外的数……建议同学了解一下float在内存中是如何存储的(问搜索引擎)。

double 双精度浮点数
这个也用来表示浮点数,而且推荐使用这个,因为现在32位机器一般处理double比float更快。同样建议同学了解一下double在内存中是如何存储的。

long double 扩展进度浮点数
这个提供的精度一般没有必要,而且还需要承担额外的效率代价。

char型和各种整型前面可以加signed 或 unsigned 说明符
一般不加默认为signed
加unsigned就成了无符号型
有符号型可以表示的数据范围一般是 -2^(n-1) ~ 2^(n-1)-1
无符号型可以表示的数据范围一般是 0 ~ 2^n – 1
如 char 可以表示 -128~127
unsigned char 可以表示 0~255
特别说明:signed a; unsigned b; 一般分别等价于 signed int a; unsigned int b;

除了以上这些基本内置类型外,你还可以使用“typedef”来自定义类型,以及枚举类型(enum)、结构体(struct)、类(class)、联合(union)等

声明变量的格式一般为:
typename identifier [, identifier2, identifier3, ...];
声明时也可以给变量定义,如:
int a = 1, b = 2;

2.函数(function)是什么?
从其英文名可以看出函数其实是一个“功能”,它是用来被调用的,它能根据你提供给它的东西得到一个结果并告诉你、对你提供的东西进行诸多处理、或者只是你对一组常用的语句进行的“打包”。
函数包括参数(parameter)、函数体(function body)、返回类型(return type)。
其声明格式通常为:
return_type function_name(parameters);
声明不包括函数体,定义才包括函数体,定义格式通常为:
return_type function_name(parameters)
{
function_body
}
其中parameters的格式一般为parameter[, parameter2, parameter3, ...] *值得注意的是函数并不一定要有确切数目的参数,感兴趣的可以先自行搜索“C++ 不定参数”来了解
函数体是一个块(Block),块就是用一对花括号括起来的语句序列,可以为空,块就是一个作用域,块中还能有块。
参数就是你提供给它的东西,函数体就是它的实现过程,返回类型是指定它将返回什么类型的结果。
返回类型除了你声明时能用的类型外,还包括一个void类型,即表示不返回东西。
下面来看这样一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
void out(char *str)
{
    cout << str;
}
int main()
{
    out("I'm a parameter of function \"out\".");
    return 0;
}

如果窗口一闪而过,解决办法:
1.从Terminal或CMD中调用程序
2.在return 0; 的前面加一条 scanf(“%d”);
3.对于Windows系统,在return 0; 的前面加一条 system(“pause”);

上面这个例子如果不明白 \”out\” 是什么意思,请搜索“转义符”
如果不明白 char *str 是什么意思没关系,其实这是指针
你要明白的仅仅只是函数的格式以及调用

下面来介绍如何在一个函数func1中调用另一个函数func2的同时func2也调用func1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
void func1(bool bCallFunc2)
{
    if (bCallFunc2)
        func2(false);
    cout << "Func1\n";
}
void func2(bool bCallFunc1)
{
    if (bCallFunc1)
        func1(false);
    cout << "Func2\n";
}
int main()
{
    func1(true);
    func2(true);
    return 0;
}

这个是编译不过的,不管你如何调换func1和func2的顺序都没用。
解决方法是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
void func2(bool);
 
void func1(bool bCallFunc2)
{
    if (bCallFunc2)
        func2(false);
    cout << "Func1\n";
}
void func2(bool bCallFunc1)
{
    if (bCallFunc1)
        func1(false);
    cout << "Func2\n";
}
int main()
{
    func1(true);
    func2(true);
    return 0;
}

函数名和变量名一样也是标识符,也必须要先声明后引用,以上解决办法就是在func1和func2的定义之前加上func2的声明(上面已经介绍了函数声明的格式)

另外还有一个有趣的,那就是一个函数可以调用它自己,看例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
void func(int cnt)
{
    if (cnt <= 0)
        return;
    cout << "Called once\n";
    func(cnt - 1);
}
 
int main()
{
    func(10);
}

编译并运行后可以看到会输出10行”Called once”,学过循环控制语句的同学当然还知道其他方法实现这一点。但现在这里是介绍递归函数。通常利用循环控制语句执行效率要比递归函数高。

3.“main”是什么?

4.“#include”是什么?“#include <iostream>”和“#include “iostream””有什么区别?

5.命名空间(namespace)是什么?“#include <iostream>”和“#include <iostream.h>”有什么区别?

6.“using namespace std”是什么?

7.“cin”和“cout”是什么?

第二部分:
1.作用域(Scope)

To be continued…

WordPress文章ID重复利用环保节约方案

写博客经常会删掉以前的一些日志,就浪费了很多ID。

于是提供重复利用文章ID的方法:

注意!写本文章时使用的WP版本为3.2.1

用文本编辑器打开 /wp-includes/post.php 文件,找到 wp_insert_post 函数(3.2.1版直接找到2584行),看到如下代码:

1
2
3
4
5
6
		if ( !empty($import_id) ) {
			$import_id = (int) $import_id;
			if ( ! $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE ID = %d", $import_id) ) ) {
				$data['ID'] = $import_id;
			}
		}

在下面添加一部分,变成:

1
2
3
4
5
6
7
8
9
10
11
12
13
		if ( !empty($import_id) ) {
			$import_id = (int) $import_id;
			if ( ! $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE ID = %d", $import_id) ) ) {
				$data['ID'] = $import_id;
			}
		}
                else
                {
                    $sowicm_pid = 1;
                    while ($wpdb->get_var($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE ID = %d", $sowicm_pid)))
                        ++$sowicm_pid;
		    $data['ID'] = $sowicm_pid;
                }

看,这篇文章的地址在经过这样修改之后就不是 http://zi-jin.com/archives/5xx 而是 http://zi-jin.com/archives/1 了。
Enjoy it!

博客重生

Featured

07年的时候注册了一个域名shuaiqixiaozi.com,开始写博客,在网上搜索博客方面的东西,学习,与其他博客建立关系,基本上了解到大多数写博客就是为了访问量,为了PageRank,为了ads赚点钱。看各种文章并照着做,发的日志很多都是网上有的东西,甚至直接照搬过来的东西,然后还SEO优化,不到一个月,我博客的PR就升到2了,然后也放些广告什么的,网游充值提成什么的,以及淘宝网购提成。

但毕竟对这些不感兴趣,现在回过头来看,以前那博客简直就是一坨屎。上面的东西都是为了别人用谷歌、百度能搜索到你的博客,其实并没有真正写博客的习惯,经常很长时间一点内容都没有,要写也不知写啥,有东西也没想到要写到博客上。
后来博客改用WordPress,没再弄过广告什么的了,PR降到0,然后又回升到PR3,那时候还看到别的网站上显示我博客网站价值有十多万RMB,也不知道他那个价是怎么估的。

10年的时候决定把博客域名换成zi-jin.com,但搜索引擎们还是一直收录原来那个,而不管新的这个,由于zi-jin.com和shuaiqixiaozi.com显示的内容始终是一模一样的,估计还以为zi-jin.com是抄袭的然后惩罚(确实有这个机制)。
换了zi-jin.com之后,准备做一个技术博客,但也是没写什么,顶多就是偶尔把自己做的一些东西发上来。现在感觉这博客这么多年都扮演着一个鸡肋角色。还每年要花我那么多钱……

早些天因为准备做sowicm.com我的个人主页,规划结果是以后我做的东西都放到sowicm.com,那zi-jin.com连它最后一点作用都失去了……于是不得不重新为博客定位了,定位的结果是从面对搜索引擎改向面对圈子,比如朋友圈子、技术圈子,最好能形成一批固定的读者。并且用博客代替以前的QQ空间,逐步把QQ空间的日志都迁移过来。并养成写博客的好习惯,哈哈。
然后现在第一步,非常重要的工作,就是建立一套优秀的Categories

【至尊沙漏】 – 闹铃闹钟软件 – 定时提醒 – 延时提醒 – 规律提醒 – 执行命令

至尊沙漏是一个提醒工具。
运行后只在托盘处显示一个图标:

SNAGHTMLeee17d

最新版本:1.1.2

更新日志:

1.1.2 更新:
    ·新增“下次启动时”(当次提醒)和“每次启动时”(规律提醒)2种提醒方式
    ·修正了自动运行的实例不播放声音的问题

1.1.1 更新:
    ·修正了更新数据库的问题

1.1.0 更新:
    ·加入了导入数据的功能
    ·3处细节调整
    ·修正了自动启动与手动启动的使用的数据不同的错误

Continue reading

我11岁时写的科幻故事《摘自上帝的<史记>》

摘自上帝的《史记》

(一)

    相传,一万年前,地球上就出现了人类,(一万年前当然有人啦,孩子啊,你知道的太少了)而且只有人类这种动物;土星上出现了狮子;土星上出现了老虎;金星上出现了狐狸……那时候,太阳系各星球距离很近,差不多才十丈。

    一次偶然,人类发现把树木接起来,就能爬到另一个星球上。于是各星球之间有了来往,但战争就从那时开始爆发……

(二)

    最先引起战争的是老虎,当老虎来到羊群的星球后,发现羊身上有一种非常诱人的香味,让他们馋涎欲滴。他们终于忍耐不住,扑了过去……

    之后,老虎又来到土星挑衅,霎时,狮吼虎嚎之声四周响起,真可谓惊天地、泣鬼神,震耳欲聋(汗。。。)

    “喂,你们什么意思?跑到哪里,就把战争带到哪里。”狮王。

    “怎么了?强者就是王者!”虎王,“弟兄们,我们以后改吃狮肉!”

    “欺狮太甚!”狮王,“弟兄们,那我们就尝尝虎肉!”这不是典型的小学生日常生活对白么……

    一阵厮杀后,狮、虎已陷入不可收拾的局面。随即,血花成河,尸骨成堆。不好,一头老虎从左侧偷袭狮王,狮后见势不妙,猛扑过来挡了一爪,便西去了。狮王见大势已去,马上仓皇逃走了,临走时发誓不报此仇,誓不为狮!

(三)

    有人说,狮王逃到了地球;也有人说,狮王隐居在木星。目前无法确定,但根据后来狮王带领狮虎大军来看,第二个说法比较合理,因为狮虎就是雄狮与雌虎交配后所生的动物,而且他们都是战斗力超高的家伙,各方面都是集狮子和老虎的优点于己身!

    随后,狮王联合豹、狼、人、象、狈、狐、猪、貂、蛇、龙等组成反虎联盟,大家选举了一条精通战术、作战能力超强、威望极高的龙担任盟长,选了一头狮虎担任副盟长,准备讨伐木星了。

    虎王派虎军师潜入联盟内部,找到狮虎副盟长进行说服。虎军师没说几句,狮虎副盟长便爽快地答应做内应。在小学生眼里,可能那些什么心术啊城府啊都是浮云,故事的丰富才是最重要的~~~不管多老套的情节都必须出来凑凑热闹

    次日,联盟大军从各路赶来,把木星围得水泄不通。龙盟长一声令下,大伙儿发起总攻,老虎族的誓死坚守,但终究寡 不敌众,只得逃至不属于联盟的冥王星。昔日勃勃生机的木星,如今已苍凉寂静。另一方面,正当虎王抱怨狮虎副盟长不守信用之时,狮虎副盟长出现在了虎王大 营,为自己辩解,说是已经有人怀疑,所以未有举动。(烂啊…烂!)狮虎副盟长还让虎王反守为攻。说完便回去了。

(四)

    时间到达下一月,虎王再次相信了狮虎副盟长的话,率虎群攻之,这次,虎王与狮虎来了个里应外合,一举歼灭很多联 盟军,龙盟长及整个龙族全被狮虎族暗杀。狮虎副盟长也率领狮虎族投靠了虎王。与此同时,联盟组织发生内讧。豹狼狈三族把责任全推给狮王,怪他管教无方,才 导致如今下场,并扬言要处刑;象人狐三族哪肯,坚决反对;猪貂蛇则站在中间立场。不久后,联盟瓦解。而就在这时,虎王那边,成立了“唯虎独尊”军,原虎王 担任军长,原狮虎副盟长成了这里的军师。又过了几个月,唯虎独尊军侵占了两三个星球后,军长称帝,国号“天虎”。(看来那时候果然挺喜欢玩《三国志10》的)此时,人族也已壮大,象狮狐猪蛇都已归顺,貂羊鹿马狗等族也视之为宗主,继虎帝之后也称帝,国号“龍”。豹狼二族也成立了一个小国,狼帝诞生,(诞生。。。。。。)国号“地狼”。这下,天子并存,此时此景,与三国末期甚是相近。

    虽然天虎只是两族组成,但势力仍是最大,千军万马,浩浩荡荡,好不壮观。龍有六个成员族、十五个盟族(龍为盟主国,龍帝为盟长),虽然种族多,但势力只属第二。三国成立后,一场不为人知的空前灾难即将降临……(看到这个“不为人知”,我爆笑了。。。)

(五)

    一日,地狼派遣一小队人马,潜入龍内部……

    一个月后,地狼向龍发战书,龍帝马上答应,并立刻调兵遣将前往前线。谁知,地狼早已联系好天虎,把龍重重包围, 来个瓮中捉鳖,一月前的那小队人马已把龍的军粮一把火给烧得灰飞烟灭了。一只狐狸向龍帝进谏:“陛下,如今之势,我军不是打不赢,而是缺乏军粮,有碍士气 与战斗力啊!”又道:“现在,何不把羊族充当军粮呢?给他们一个为国效忠的机会。”“混帐!羊族也是国中一员,怎能吃他们的肉!”“是…是…是”“要吃也 得吃虎肉、狼肉、豹肉和狮虎肉!”龍帝站在城墙上大喊:“弟兄们,如果饿的话,就冲出去尝尝虎狼豹和狮虎的肉吧!”士兵们听后,勇气倍增,冲到城外,奋勇 杀敌,以敌人的血肉来充饥。不烧军粮则已,这一烧,不仅没能影响到龍军士气,反倒使其士气倍增。龍军以势如破竹之势打得虎军落花流水。虎帝也受了重伤,狮 虎军师跑到奄奄一息的虎帝旁,忙叫医生。“不用了,朕快死了,以后天虎就交到你手上了,朕最遗憾的是见不到统一了……”话没说完,虎帝便归天了。而狮虎帝 觉察到自己年岁已高,心有余而力不足,不能完成大任,但国内也无一能委以大任之人,狮虎帝叹道:“先帝呀,现在如何是好,当初您总是重视兵力,从不培养人 才,举国上下全身一些有勇无谋之人呀!”他经过一番痛苦的思想斗争之后,决定退位让贤给原虎帝的长子,自己退隐深山。新即位的虎帝,马上派使者到地狼国, 要求再次联合攻打龍国。豹军师对狼帝说:“陛下,现在的虎帝不能信任,他虽有勇无谋,但跟随他爸数十年,总还懂一些小手段,他准备利用我们!再说,他父亲 都打不赢龍国,何况是他!”“胜败乃兵家常事,总不能因为输一次就不去打吧?”狼帝没有听豹军师的劝阻,与天虎一起卷土重来。

    龍国议事大殿内——

    “报——圣上,天虎和地狼再次联合攻打我们了!”

    “来得正好,准备反击!”狮元帅。

    “慢,陛下,这战,鄙人有一计能使我军不战而胜!”狐军师。

    “阁下快快说来听听。”

    “新即位的虎帝是个有勇无谋的匹夫,而且具探子回报,豹族与狼族之间已有了一条裂缝,只需……,便可不用一兵一卒而轻易取胜。”

    “军师果然高明!”龍帝与众臣齐声称赞。

    次日,天虎和地狼军撤退了,而且豹族投奔了龍国。(至于军师的计策,就留给聪明的大家去想吧。)(那时候好像在谁家看了一本益智故事书,里面的办法全都要读者去想,于是也模仿了这种写法,汗~~~)

(六)

    经过上一节的战役,龍国愈来愈强大,势力可以与天虎媲比。在这泱泱大国里,曾经的十五个盟族也相继投靠了,龍国已发展成二十三个民族了,堪称第一大国。不久,成千上万种不同的生物都投靠了。

(七)

    突然,日月失光。生物陷入一片混乱,原来是上帝责罚生物,以此告诫不能打仗,又把生物全集中到了地球。天虎也投降龍国。人类接受了上帝之命,成了万物之主……(真够仓促的。。。)

(八)

    昔日,上帝谴责万物打仗。如今,天下如此混乱(……),已不是异族打仗,而是人与人之间的自相残杀。地球也开始向上帝诉苦,上帝也开始后悔当初选人类掌管地球……但以他现在的力量已无法挽回,也无法像那日一样制止了,因为他已没有能力管辖人类!所以他只得派遣了一些人来挽救地球……(最后一段,好像是谁说写这个故事最后一定要给别人以启示什么什么的所以加上去的,现在看来,不要还更好~~~)

附点评:

~~~~同学你好:

    文中的一切,多为你的想象。

    从内容看,你有了一定的编织故事的能力。

    全文分为8个小节,内容有所变化,层次上也有一种递进感。

    整体结构还是比较完整的,其中的人物似乎多了一点。

    这样的短篇作品,人物不宜太多,要在材料上有所甄别遴选。

    注意两点:

    一、突出一两个人物形象,突出一两个横截面即可;

    二、在文字上要多提炼、锤敲,力求有新的突破。

    多联系!

                    李迎兵

三个白痴

他如风一般自由 似风筝翱翔天空

他去了哪里…让我们去寻觅

我们被固定的路途牵引 他却在独辟自己的蹊径

路途艰难却毫无忧烦

我们为明日愁颜 他只顾畅享当今

让每一刻壮美不凡 他来自何处

触动你我心弦却又消失不见

他去了哪里 让我们去寻觅

烈日之下 他如同一片林荫

大漠之中 他便似一片绿洲

对受伤的心 他是良药一剂

恐惧着 我们都泥足于井底

无畏着 他畅游于海天之际

毫不迟疑的迎接潮汐

他如一片浮云独自飘逸 却是我们最好的知己

他去了哪里…让我们去寻觅

我看电影几乎第一次落泪…《三傻大脑宝莱坞》   谨以此文纪念!真是良药一剂啊!