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

Mister.Hu(巷里人家)

Go abroad!

 
 
 

日志

 
 
关于我

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

网易考拉推荐

C++强化【7】  

2015-08-28 17:38:21|  分类: Senior |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

实例79:统计数据

#include <iostream>

using namespace std;

#define ROW 20

#define COL 2

void main()

{

         int people[ROW][COL]={{0,0},{1,1},{1,2},{0,2},{0,1},{0,0},

         {1,0},{1,2},{1,1},{1,0},{0,2},{0,1},{0,0},

         {0,2},{1,2},{1,1},{1,0},{1,2},{0,2},{1,1}};

         int *num=new int[6];//分别为ABC的男女

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

                   num[i]=0;

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

         {

                   switch(*(*(people+i)+1))

                   {

                   case 0://A

                            if(*(*(people+i)+0)==0)//

                                     (*num)++;

                            else

                                     (*(num+1))++;

                            break;

                   case 1://B

                            if(*(*(people+i)+0)==0)//

                                     (*(num+2))++;

                            else

                                     (*(num+3))++;

                            break;

                   case 2://C

                            if(*(*(people+i)+0)==0)//

                                     (*(num+4))++;

                            else

                                     (*(num+5))++;

                            break;

                   default:

                            break;

                   }

         }

         cout<<"来自ABC的男女人数依次为:";

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

                   cout<<*(num+i)<<" ";

         cout<<endl;

         cout<<"来自A国的人数有:"<<(*num)+(*(num+1))<<endl;

         cout<<"来自B国的人数有:"<<(*(num+2))+(*(num+3))<<endl;

         cout<<"来自C国的人数有:"<<(*(num+4))+(*(num+5))<<endl;

}

注:本例主要用指针定义了两个数组,一个是计数的一维数组int *num=new int[6],一个是记录的二维数组int people[ROW][COL]。在swtich函数中,*(*(people+i)+1)表示的是数组people的第i行第1列(实际是第二列)的值,该值用于记录国家。*(*(people+i)+0表示数组people的第第i行第0列的值,该值用于记录男女。对于计数函数,(*num)num[0],用于记录A国男的的人数,*(num+1) num[1],用于记录A国女的的人数,依次类推,整个程序就简单了。

本程序完全可以改成纯数组的代码,如下:

#include <iostream>

using namespace std;

#define ROW 20

#define COL 2

void main()

{

         int people[ROW][COL]={{0,0},{1,1},{1,2},{0,2},{0,1},{0,0},

         {1,0},{1,2},{1,1},{1,0},{0,2},{0,1},{0,0},

         {0,2},{1,2},{1,1},{1,0},{1,2},{0,2},{1,1}};

         int num[6];//分别为ABC的男女

         for(int j=0;j<6;j++)

                   num[j]=0;

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

         {

                   switch(people[i][1])

                   {

                   case 0://A

                            if(people[i][0]==0)//

                                     num[0]++;

                            else

                                     num[1]++;

                            break;

                   case 1://B

                            if(people[i][0]==0)//

                                     num[2]++;

                            else

                                     num[3]++;

                            break;

                   case 2://C

                            if(people[i][0]==0)//

                                     num[4]++;

                            else

                                     num[5]++;

                            break;

                   default:

                            break;

                   }

         }

         cout<<"来自ABC的男女人数依次为:";

         for(int k=0;k<6;k++)

                   cout<<num[k]<<" ";

         cout<<endl;

         cout<<"来自A国的人数有:"<<num[0]+num[1]<<endl;

         cout<<"来自B国的人数有:"<<num[2]+num[3]<<endl;

         cout<<"来自C国的人数有:"<<num[4]+num[5]<<endl;

}

实例80:指针应用常见问题(传送的是地址还是值)

#include <iostream>

using namespace std;

 

void change(int a, int b)

{

         int temp;

         temp=a;

         a=b;

         b=temp;

}

void change(int *a, int *b)

{

         int temp;

         temp=*a;

         *a=*b;

         *b=temp;

}

int main()

{

         int aa=10,bb=2;

         int *point1=&aa;

         int *point2=&bb;

         cout<<"原数据:"<<aa<<" "<<bb<<endl;

         change(aa,bb);//值传递

         cout<<"值传递交换结果:"<<aa<<" "<<bb<<endl;

         change(point1,point2);//地址传递

         cout<<"地址传递交换结果:"<<aa<<" "<<bb<<endl;

         return 0;

}

注:在上面定义的两个重载函数(函数名字相同参数类型不同)中,分别演示了交换地址和交换值,而实际上,只有交换地址的那个函数即void change(int *a, int *b)才能交换成功。

注意,int *point1=&aa;int *point1;point1=&aa;是一样的。

注意,与函数void change(int *a, int *b)参数类型对应的是change(point1,point2)而不是change(*point1,*point2),如果用后者,则交换也会失败。因为,point1point2对应的才是地址。不要被int *point1=&aa;搞混而认为*point1是地址,*point1对应的是aa的值即10.

实例81:将A段内存复制到B段内存

#include <iostream>

using namespace std;

 

struct person

{

         int age;

         char name[10];

};

int main()

{

         person p1,p2;

         person *pp;

         pp=&p1;//取地址

         p1.age=10;

         strcpy(p1.name,"John");

 

         p2.age=pp->age;

         strcpy(p2.name,pp->name);

         cout<<"pp2age:"<<p2.age<<endl;

         cout<<"pp2name:"<<p2.name<<endl;

         return 0;

}

注:首先定义了两个结构变量person p1,p2,并将结构p1的地址赋值给pp,然后对结构p1进行赋值,并利用指针pp将赋值后的p1的变量值取出赋值给p2。注意,pp->age可以由(*pp).age实现,pp->name可以由(*pp).name来实现。

实例82:将内存的数据倒转过来

#include <iostream>

using namespace std;

void inv(int *a,int length)

{

         int temp;

         int i,j;

         for(i=0;i<=(length-1)/2;i++)

         {

                   j=length-1-i;

                   temp=a[i];

                   a[i]=a[j];

                   a[j]=temp;

         }

}

int main()

{

         int memo[10]={3,4,5,6,7,8,9,9};

         cout<<"原内存数据:";

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

                   cout<<memo[i];

         cout<<endl;

         inv(memo,10);//反转

         cout<<"反转后的内存数据:";

         for(int k=0;k<10;k++)

                   cout<<memo[k];

         cout<<endl;

         return 0;

}

注:输出的结果为:


关键在于函数inv,其实质是对内存地址的反转,也可将函数变为void inv(int a[],int length),结果相同。inv(memo,10)实质是将memo数组的首地址赋值给了指针*a,然后,下面的a[i]将与memo[]具有相同的意义。

实例83:将数据隐藏于内存

#include <iostream>

using namespace std;

//隐藏数据

void main()

{

         char ch[]="HIellolvoe,,Wco+r+l d";

         int i=0;

         while(i<strlen(ch))//没有到字符数组末尾

         {

                   if(i%2==0)//读出位于偶数位的数据

                            cout<<ch[i];

                   else

                   {        }

                   i++;//读下一位

         }

}

注:非常简单的一个小代码,可以用于密文的解密。

实例84:输出本机内存数据排序

#include <iostream>

using namespace std;

 

union test

{

         int aa;

         char ch;

};

void main()

{

         test _test;//组合

         _test.aa=0x00000001;

         cout<<"本机的内存数据排列顺序为:";

         if(_test.ch==1)

                   cout<<"先低后高"<<endl;

         else if(_test.ch==0)

                   cout<<"先高后低"<<endl;

}

注:在这里主要需要了解union组合体的意义。组合体内的变量占用内存的大小是元素中最大的。也就是说,上例中test所占用的内存大小只是int型的大小,Char型字符则位于int型的第一字节处(因为char型大小为1字节,而int大小为4字节)。

然后需要对高端先存和低端先存做一个了解。比如00000001,高端先存的内存为00000001,而低端先存的内存为01000000.因此,利用组合内的ch调出第一字节处的值,即可判断本机的内存数据排序了。

 

实例85:寻找地址(指针加减法)

#include <iostream>

using namespace std;

int main()

{

         int num[]={0,1,2,3,4,5,6};

         int *ptr;

         ptr=&num[0];

         cout<<ptr<<" "<<*(ptr++)<<endl;

         cout<<ptr+1<<" "<<*(ptr)<<endl;

         cout<<ptr+2<<" "<<*(ptr+1)<<endl;

         cout<<ptr+3<<" "<<*(ptr+2)<<endl;

         cout<<ptr+4<<" "<<*(ptr+3)<<endl;

         cout<<ptr+5<<" "<<*(ptr+4)<<endl;

         cout<<ptr+6<<" "<<*(ptr+5)<<endl;

         return 0;

}

注:输出时,首先输出的是地址,其次输出的是地址对应的值。在这里注意*(ptr++),是先输出ptr指向的值后再对ptr1,因此,实际上cout<<ptr<<" "<<*(ptr++)<<endl;输出的是0,而之后的cout<<ptr+1<<" "<<*(ptr)<<endl;输出的是1.

 

实例86:删除数组中的指定元素

#include <iostream>

using namespace std;

int main()

{

         char ch[]="ajfdklsafj";

         for(int i=strlen(ch)/2;i<strlen(ch);i++)//删除第strlen(ch)/2个元素

                   ch[i]=ch[i+1];

         cout<<ch<<endl;

         return 0;

}

输出结果中,删除了中央元素l,输出结果为ajfdksafj。如果要删除指定位置的元素,仅需将strlen(ch)/2改为该元素位置即可。

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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