本帖最后由 dxxds 于 2013-11-23 12:06 编辑
找工作的时候,渐渐发现,很多人对C++非常恐惧,觉得很难啊什么的。
想当年在学校,一个指针,吓跑多少妹子和基佬。
所以,本人想换个方式,给大家入门。
语言嘛,就是拿来叙述事儿的:
我去买了俩鸡蛋。
冬天再大的风也掀不起妹子们那厚重的裙子了……
……
是吧,这就是语言啊。
程序语言呢,就是咱给机器讲故事了,然后某工具翻译给机器,机器看懂后,听你的话。
首先,机器绝对会听你的话,其次,翻译工具很好找,最后,就剩下我教你怎么讲故事了。
不知道现在看帖子的人,有没有自己的翻译工具(编译器)。
有的人,就用自己顺手的(推荐VC6以上,不包含VC6)
没有的人,就去下载一个小编译器吧,入门用的,不用很复杂,DEVCPP,FREE C++这样的就够了。
C FREE 5 比DEVC++ 好用不少,附一個下載鏈接
http://pan.baidu.com/share/link?shareid=336810&uk=1292274826
C FREE 5 在此下載
我在这里用DEVCPP给大家示范
打开编辑器,选文件,选源代码。
这样就开了一个未命名文件。记事本,WORD操作该会的,这里一样,后面就不多说了。
先来一段代码
#include *本站禁止HTML标签噢*
using namespace std;
int main()
{
cout<<"故事开始"<<endl;
cout<<"故事结束";
return 0;
}
这是很基础的一段。大家的英文底子不能太差啊,单词的意思一定要知道才行。
这次先给大家翻译解释,以后不翻译了。
include :包含,就是把要使用的功能所在的文件加到你的代码里。
iostream :IO 是 in/out ,stream流,目前用到的 in就是让你在电脑讲故事时对你的询问有一个回答,回答就给in到电脑里了,out就是让你故事里的事物输出到显示器上。 当然iostream功能不止这点儿,你们先记这么多、
int:integer的缩写,整数,占用电脑四个字节,一可以储存一段数字。一个字节范围0-255,int的最大表示范围就是255*255*255*255.
main:很关键的,主函数,所有故事都是从这里开始讲。
cout :读作 C OUT,向显示器输出一段话,<<就是碗里的东西向外倒。
endl :就是 end line 结束一行,然后自行回车换行了。
return:把函数结果交出去。
编写代码的时候,要记着在每一个语句后加分号";",表示句子结束,这也是现今绝大多数语言的规矩。
目前的解释就是这样了,以后所有的代码,都是基于这个往后编的。
可以试着让电脑执行这段代码了,按F9编译运行(C-FREE 用 F5),我们把文件起个名字存起来,就叫stroy_1.cpp吧。
可以看到,命令行窗口出现了,就又立刻消失了。于是大家纷纷表示,我看不到啊。
电脑太听话了啊,干完活就知道立刻退下,好孩子~~
咱们现在让它干完活先留在这,等你吭一声再走。
那就在 return 0 前面加一句 system("pause>nul ")
像这样。
int main()
{
cout<<"故事开始"<<endl;
cout<<"故事结束";
system("pause>nul");
return 0;
}
pause:很好理解,暂停了的意思,这是一段DOS命令,可以让程序停下来。
system:负责执行这个命令,以后有啥别的命令也可以在这里打
现在这样,我们就看到它把故事讲出来了,哦~ 是样的。
然后,随意按一个键盘按键,就退出了。
好,先将这些,下节讲更多内容。
本帖最后由 dxxds 于 2013-11-23 12:38 编辑
毕竟是入门教程,也不会讲的多深入了(模板和STL什么的另开贴讲)
我只是在这里讲了讲C++的大概语法,至于一些细节(有的也挺重要的),例如public或者private继承方式什么的等等
我就不讲了,主体学会了,这些细节你们自己找书看一下就会一下明白,我就不在这里费篇章了
而且C++细节也很多,我也讲不完
本来以为自己的教程会有很多篇,现在发现,似乎主体都讲的差不多了,那本节就不讲新东西了
用一个数据结构中最简单的结构作为本教程的结尾好啦
那就是~~~~超简单的动态链表!
链表作为C语言和C++都必须掌握的一部分内容被视为考试和面试强力杀招和法宝让无数新手头痛不已
所以本着救世主义精神和佛光普照的伟大行为为大家放出这段实际上是很初级的内容教程
《超级玛丽的奇幻冒险》之自创角色篇
那就上代码,这里依然写了超详尽的注释内容,让你一看就懂
#include *本站禁止HTML标签噢*
using namespace std;
class DIY_Role
{
public:
int ID;
int HP; //血量
int AT; //攻击力
DIY_Role* next_role; //下一个角色
DIY_Role() //构造函数,就是对象被创建后自动运行的那玩意
{
next_role = NULL; //弄成空,防止出意外
HP = 0; AT = 0; //初始化一下,写不写都行
++S_ID; ID = S_ID; //编号赋值
}
static int S_ID; //静态 全局 唯一 用它给每一个对象的id赋值
};
int DIY_Role::S_ID = 0;
DIY_Role* head = NULL; //头节点
DIY_Role* create_role()
{
//目前 head p1 p2都是空的,就是说你一个角色都还没创建,所以现在得先创建一个,然后再循环创建
//也就是说,创建分为两部分,分别是创建头节点,和创建后续节点
DIY_Role* p1=NULL; //本节点
DIY_Role* p2=NULL; //将要创建的下一个节点
p2 = new DIY_Role; //创建了一个了
cout<<"请输入角色的血量(输入0表示停止创建)"<<endl; //显然,角色的血量必须大于0
cin>>p2->HP;
if(p2->HP == 0)
{
delete p2; //把刚才new出来的资源删掉
p2 = NULL; //p2现在依然指向刚才new的地方,所以让它指回安全的地方去
cout<<"创建结束"<<endl;
}
else
{
cout<<"请输入角色的攻击力"<<endl; //攻击力可以为零和负数
cin>>p2->AT;
}
head = p2; //因为是第一个,head肯定指向它
p1 = p2; //p1自然也指向它
//以上就把第一个节点建立好了,从第二个节点开始,循环建立就行了,上下的区别就是下面不在操作head
while(true)
{
p1 = p2; //把循环末尾创建的P2交给P1 然后P2创建新的
p2 = new DIY_Role;
cout<<"请输入角色的血量(输入0表示停止创建)"<<endl;
cin>>p2->HP;
if(p2->HP == 0)
{
delete p2;
p2 = NULL;
break;
}
else
{
cout<<"请输入角色的攻击力"<<endl;
cin>>p2->AT;
p1->next_role = p2; //new出来的新交给本节点的下一个节点 用next_role记下地址
}
}
}
int main()
{
create_role();
return 0;
}
好详细的注释啊,我都觉得没啥好讲的了
你们自己运行一下,看看结果
显然现在我们是成功创建了3个角色
那我们看看它们
所以写一个show函数来显示
//显示一下你所创建的所有role
void show_role(DIY_Role* head)
{
if( head!=NULL )
for( DIY_Role* p = head; p != NULL ; p = p->next_role)
{
cout<<"角色"<<p->ID<<" 血量:"<<p->HP<<" 攻击力:"<<p->AT<<endl;
}
else
cout<<"没有角色啊 ╮(╯▽╰)╭"<<endl;
}
然后在main里用它
int main()
{
create_role();
show_role(head);
return 0;
}
再看一次结果
那现在创建和遍历就都有了
下面再来一个查找
DIY_Role* find_role(DIY_Role* head,int f_id)
{
DIY_Role* p1 = head;
DIY_Role* p2 = p1; //p2表示目标节点 p1表示目标节点的父节点
while(head!=NULL && p2->ID != f_id ) //寻找节点,一直找到末尾
{
p1 = p2;
if(p2->next_role != NULL)
p2=p2->next_role;
else
break; //说明p2->next_role是空的 也就是找到末尾了
}
if(p2->ID == f_id) //说明找到了
{
cout<<"角色"<<p2->ID<<" 血量:"<<p2->HP<<" 攻击力:"<<p2->AT<<endl;
}
else
{
cout<<"没找到"<<endl;
p1 = NULL; //没找到就返回空吧
}
return p1; //返回目标节点的父节点或者NULL
}
这样就有了一个查找函数
返回父节点是为了后续能有更多操作,目前用p->next来表示目标节点
现在按着增删改查的顺序慢慢加函数
该到“改”了
void updata(DIY_Role* head,int u_id)
{
//为了简便,我就直接让数字自加1000了,懂得应用就行
//实际上比较好的方法是用一个专门接受要修改的数字的函数来封装这个函数,我就不弄了
//两部分,头节点和后续节点
if(head!=NULL && head->ID == u_id)
{
head->HP += 1000;
head->AT += 1000;
return;
}
DIY_Role* p = find_role(head,u_id);
if(p!=NULL)
{
p->HP += 1000;
p->AT += 1000;
}
}
最后就是删了,这个稍微注意一下参数部分的写法
void delete_role(DIY_Role*& head,int d_id)
{
//删除也分为两部分 删头节点和删后续节点
DIY_Role* p = head;
if(head!=NULL && head->ID == d_id)
{
head = head->next_role;
cout<<"id:"<<head->ID<<endl;
delete p;
return; //强制结束 此语句适用于void函数
}
//删后续节点
p = find_role(head,d_id);
if( p ) // p!=NULL
{
DIY_Role* p2 = p->next_role; //用一个临时指针保存一下目标节点
p->next_role=p2->next_role; //把目标节点的下一个节点交给父节点,保持链表连续
delete p2; //可以删了目标节点了
p2 = NULL; //这个不写也行
cout<<"OK~ 删掉了"<<endl;
}
else
{
cout<<"没找到要删的角色"<<endl; // ╮(╯▽╰)╭
}
}
参数部分我又用了*又用了&
表示我需要修改全局head本身
好了,烂代码就这么多
这代码的确很烂,比教科书的要差
但是烂有烂的好处,就是写的够直接,我尽一切可能去掉了不必要的旁支写法,基础差的人也能看懂。
那, 本入门教程就到此结束了
[查看全文]
