注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mister.Hu(巷里人家)

Go abroad!

 
 
 

日志

 
 
关于我

A campus photograph palyer,an enthusiastic reader,a solitary writer,a future traffic engineer.

网易考拉推荐

C++强化【9】  

2015-09-06 11:12:07|  分类: Senior |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

实例95:姓名测试

#include <iostream>

#include <string>

using namespace std;

 

void name_test(char *ch,string &str)

{

        string str_first[26]={"曹魏","东吴","蜀汉","土番","秦宋","大金","明朝","鲜卑","五代",\

                 "晚清","西周","赵国","大辽","夏商","战国","春秋","东晋","羌族",\

                 "民国","齐国","闽国","南燕","大理","西凉","南唐","蒙古"};

        string str_mid[26]={"阴毒","疯骚","猥琐","豪门","白痴","天才","自卑","美貌","花痴",\

                 "英勇","臭屁","卖国","饭桶","变态","热血","嗜血","旷世","守财",\

                 "血手","平庸","爱国","亡命","暴力","多情","自恋","逍遥"};

        string str_late[26]={"道士","和尚","财主","屠夫","马夫","嫔妃","兵士","酒鬼","地主",\

                 "医师","农夫","稳婆","更夫","书生","乞丐","帝或后","臣相","流氓",\

                 "戏子","土匪","守墓人","媒婆","庖丁","诗人","歌妓","讼师"};

        for(int i=0;i<3;i++)

        {

                 if(ch[i]<='z'&&ch[i]>='a')

                         ch[i]-=(32+65);//变成大写,再取差值

                 else

                         ch[i]-=65;

                 switch(i)

                 {

                 case 0:

                         str+=str_first[ch[i]];

                         break;

                 case 1:

                         str+=str_mid[ch[i]];

                         break;

                 case 2:

                         str+=str_late[ch[i]];

                         break;

                 default:

                         break;

                 }

        }

}

void main()

{

        char ch[3]={" "};

        string str_result;

        cout<<"请输入您姓名中姓氏、中间字、最后字的首字母:";

        cin>>ch[0]>>ch[1]>>ch[2];

        cout<<ch[0]<<ch[1]<<ch[2];

        cout<<"您在古代的身份是:";

        name_test(ch,str_result);

        cout<<str_result<<endl;

}

注:这里主要关注点放在函数的参数string &str上,这里采用的形参调用,其作用类似与指针,但由于其不涉及内存,故比指针安全。(下面还会有介绍)注意,如果没有&,则在主函数调用时,是调用不出结果的,尽管它在函数name_test中有结果,但不能引用到主函数中去,弥补办法是在函数name_test最后加上        cout<<str<<endl;不过这不是从原理上解决问题。

 

实例96:宝宝改名(函数参数直接引用变量(形参引用))

#include <string>

#include <iostream>

 

using namespace std;

 

void change_name(string &name,string later)

{

        name=later;

}

void main()

{

        string cur_name;//当前名字

        string exp_name;//期望名字

        cout<<"宝宝当前名字叫什么?请输入:";

        cin>>cur_name;

        cout<<"想给宝宝改成什么样的名字呢?请输入:";

        cin>>exp_name;

        change_name(cur_name,exp_name);

        cout<<"改名成功,宝宝当前名字叫"<<cur_name<<endl;

}

注:形参引用在此再一次出现,注意,这里由于要输出的是name,所以只需要对name进行形参引用,如果去掉&,同样会出现修改不成功的现象。

 

实例97:求最长字符串

//求最长字符

#include<cctype>

#include<iostream>

using namespace std;

#define M 1000

const char *extra="$";

void main()

{

        char *ch=new char[M];

        int start = 0;//最长字符的开始

        int left = 0;//每段字符的左边值

        int length = 0;//当前字符串的长度

        int length_max = 0;//最长字符的长度

        cin>>ch;//输入字符串

        if(isalpha(ch[strlen(ch)-1]))//是字母

        {

                 //加一个不是字母的元素,以找到最后一个字符子串

                 strcat(ch,extra);

        }

        for(int i=0; i<strlen(ch); i++)

        {

                 if(isalpha(ch[i]))//是字母

                 {

                         length++;//当前字符串长度加1

                 }

                 else//不是字母

                 {

                         if(length>length_max)//如果当前字符串的长度大于最大字符的长度

                         {//更新开始

                                  start=left;

                                  length_max=length;

                         }

                         left=i+1;//新的左边值

                         length=0;//新的字符串长度从0开始增加

                 }

        }

        cout<<"最长字符串:";

        for(int j=start;j<start+length_max;j++)

                 cout<<ch[j];

        cout<<endl;

        delete ch;

        ch=NULL;

}

注:这个程序的目的是在一个字符串中寻找出最长的一串连续的字母出来。首先,是给结尾为字母的字符串加上一个非字母字符进行字符串的结束。如果不加,则会出现在下面的循环体系中,直接在    if(isalpha(ch[i]))//是字母

                 {

                         length++;//当前字符串长度加1

                 }

内进行循环而不跳到else中去,这样,会导致start0,即下面输不出结果。

第二步,进入主循环体,即for循环体,循环的思维为,从头开始判断是否为字母,如果是,则将字符串长度加1,并继续循环判断下一个;如果不是,则进入else,此时相当于一个连续的字符串已经中断了,因此先判断这个中断的字符串长度是否大于之前的最大字符串长度,如果大于,还要额外进行startlength_max的更新。

然后,再为下一次循环做准备,这里需要更新leftlength,需要注意的是,只要进行新的一个字符串的循环,不管是否大于之前的最大字符串长度,都需要更新leftlength

最后即可输出startlength_max对应的ch[]字符串,此字符串即为最长的连续字母。

实例99:头文件

头文件:(099.h

#include <iostream>

using namespace std;

int add(int a,int b);

源文件(099.cpp

#include "099.h"

int a=0;

float b=0;

int add(int a,int b)

{

        return a+b;

}

void main()

{}

注:头文件其实就是将函数头以及定义的函数放置在新的一个文件中,与主函数分开,然后在主函数中,直接调用#include "头文件"即可。注意,不要在头文件中定义函数的内容,防止发生重定义错误。

实例100:函数重载

#include <iostream>

#include <string>

using namespace std;

 

string str_dos[5]={"cd","copy","format","mem","rd"};

string str_meaning[5]={"改变当前目录","拷贝文件","格式化磁盘","查看内存状况","删除目录"};

 

void decode(int a)

{

        cout<<"解释为:"<<str_meaning[a]<<endl;

}

void decode(string str)

{

        for(int i=0;i<5;i++)

        {

                 if(str_dos[i]==str)

                 {

                         cout<<"解释为:"<<str_meaning[i]<<endl;

                         i=5;

                }

        }

}

void main()

{

        int index;//命令序号

        string str_code;//命令

        int choice;

        while(1)

        {

                 cout<<"0-按序号解释,1-按命令解释,请选择:";

                 cin>>choice;

                 switch(choice)

                 {

                 case 0:

                         cout<<"请输入序号04的一种:";

                         cin>>index;

                         decode(index);

                         break;

                 case 1:

                         cout<<"请输入命令为cdcopyformatmemrd的一种:";

                         cin>>str_code;

                         decode(str_code);

                         break;

                 default:

                         break;

                 }

                 cout<<"0-继续,1-退出,是否继续?";

                 int x;

                 cin>>x;

                 if(x==0)

                 {}

                 else if(x==1)

                 {

                         cout<<"退出成功"<<endl;

                         break;

                 }

        }

}

注:这里主要定义了重载函数decode(),需要注意的是,String[]表示字符串组成的数组,如string str_dos[5]={"cd","copy","format","mem","rd"};char[]表示的是字符组成的字符串数组,如char ch[5]=”hello”

实例101:函数重载陷阱案例

#include <iostream>

using namespace std;

 

int add(int a,int b)

{return a+b;}

 

int add(int a,int b,int c=10)

{return a+b+c;}

 

double add(double a,double b)

{return a+b;}

 

void main()

{

        cout<<"2+3="<<add(2,3)<<endl;

        cout<<"2+3+4="<<add(2,3,4)<<endl;

        cout<<"2.2+3.3="<<add(2.2,3.3)<<endl;

}

注:执行上面的函数,会出行ambiguous call to overloaded functionerror,原因就是,重载函数int add(int a,int b)int add(int a,int b,int c=10)重定义了。如果把int add(int a,int b,int c=10)改为int add(int a,int b,int c)则是合理的。

 

实例102main()后执行代码

#include <iostream>

using namespace std;

 

void add()

{

        cout<<"2+3="<<2+3<<endl;

}

 

void substract()

{

        cout<<"2-3="<<2-3<<endl;

}

int add1()

{

        cout<<"2+3="<<2+3<<endl;

        return 0;

}

 

int sub1()

{

        cout<<"2-3="<<2-3<<endl;

        return 0;

}

void main()

{

        atexit(add);

        atexit(substract);

        _onexit(add1);

        _onexit(sub1);

        cout<<"main"<<endl;

}

注:cout<<"main"<<endl;是最后一行代码,但执行时是第一个执行的。atexit()型注册函数只能注册void型函数,而_onexit()型注册函数可以注册int型函数。先注册的函数后被执行。故,最终输出的结果为:

实例103:阶乘计算1100的积

#include <iostream>

using namespace std;

 

double jiecheng(int n)

{

        if(n==0)//0的阶乘

                 return 1;

        else

                 return n*jiecheng(n-1);

}

 

int main()

{

        int m=100;

        cout<<jiecheng(m)<<endl;

        return 0;

}

注:核心在于递归函数的使用,即函数自身调用自身。


  评论这张
 
阅读(32)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016