标题:C++ 求助 关于结构数组 [ C++ 语言]
只看楼主
Lauibo
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-9-30
结帖率:0
已结贴  问题点数:20 回复次数:2 
C++ 求助 关于结构数组 [ C++ 语言]
我发现 当我编辑其他analyze[i].apower[j]的值时,analyze[0].apower[j] analyze[1].apower[j]的值会自动改变
动态数组的值会自动改变吗???
(这种情况不会每次都发生,是不是会来一次,需要多测几次)
以下是代码和一次运算的结果(中间跳过了一些行,关键部分已标出)
为什么我在处理i=2 的情况,依然改变了i=0时的值
ps 这个程序大致目标是把一个数拆成2的幂

#include <iostream>
#include<cstdlib>
#include<ctime>
#include<cmath>
#define RAND_MAX INT_MAX
using namespace std;

int main()
{
    int nbheap,i,j,nb0,nbrm,numheap,limt,k;
    cin>>nbheap;
    int* heap=new int [nbheap];
    nb0=0;
    srand(time(NULL));
    //cin>>limt;
    for (i=0;i<nbheap;i++)
        heap[i]=rand()%100+1;

    for (i=0;i<nbheap;i++) cout<<i+1<<":"<<heap[i]<<" ";
    for (i=0;i<nbheap;i++) if (heap[i]==0) nb0++;
    cout<<"\n";
    int biggest=heap[0];
    for (i=1;i<nbheap;i++) if (heap[i]>biggest) biggest=heap[i];

    int power,max_1=0;
    i=0;

    while (1==1)
    {
     if ((biggest>=pow(2,i))&&(biggest<pow(2,i+1))) break;
     else i++;
    }
   cout<<biggest<<endl;
   max_1=i;
   cout<<max_1<<endl;

   struct structure
  {
    int num,num1;
    int max_index=0;
    int* apower=new int[max_index+1];
  };
  int* powertotal=new int[max_1+1];
  structure* analyze=new structure[nbheap];
  for (i=0;i<nbheap;i++) analyze[i].max_index=max_1;
  for (i=0;i<nbheap;i++) analyze[i].num=heap[i];
  for (i=0;i<nbheap;i++) analyze[i].num1=heap[i];
  for (i=0;i<nbheap;i++)
    for (j=0;j<max_1+1;j++)
     analyze[i].apower[j]=0;
  for (i=0;i<nbheap;i++)
    {
      cout<<"i="<<i<<" 当前:"<<analyze[i].num1<<endl;
      for (j=0;j<max_1+1;j++)
        cout<<"2^"<<j<<":"<<analyze[i].apower[j]<<"   ";
      cout<<"\n";
    }

   power=0;
   for (i=0;i<max_1+1;i++) powertotal[i]=0;
   for (i=0;i<nbheap;i++)
   {
    while (analyze[i].num1!=0)
     {
     cout<<"总: i="<<i<<" 当前:"<<analyze[i].num1<<" power="<<power<<" "<<endl;
       for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[0].apower[j]<<"   ";
             cout<<"\n";
       for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[1].apower[j]<<"   ";
             cout<<"\n";
             cout<<"\n";
       if (analyze[i].num1>=pow(2,power)&&analyze[i].num1<pow(2,power+1))
        {
          cout<<"if:  ";
          cout<<"i="<<i<<" 当前:"<<analyze[i].num1<<" power="<<power<<" "<<endl;
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[0].apower[j]<<"   ";
             cout<<"\n";
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[1].apower[j]<<"   ";
             cout<<"\n";
          analyze[i].apower[power]++;
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[0].apower[j]<<"   ";
             cout<<"\n";
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[1].apower[j]<<"   ";
             cout<<"\n";
          analyze[i].num1=analyze[i].num1-pow(2,power);
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[0].apower[j]<<"   ";
             cout<<"\n";
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[1].apower[j]<<"   ";
             cout<<"\n";
          powertotal[power]=powertotal[power]+1;
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[0].apower[j]<<"   ";
             cout<<"\n";
             cout<<"\n";
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[1].apower[j]<<"   ";
             cout<<"\n";
              cout<<"\n";
          power=0;
        }
       else
       {
            cout<<"else:  ";
            power++;
            cout<<"i="<<i<<" 当前:"<<analyze[i].num1<<" power="<<power<<" "<<endl;
            for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[0].apower[j]<<"   ";
             cout<<"\n";
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[1].apower[j]<<"   ";
             cout<<"\n";
              cout<<"\n";
       }
     }
  }
  for (i=0;i<max_1+1;i++)
    cout<<"2^"<<i<<":"<<powertotal[i]<<"   ";
 cout<<"\n";
 cout<<"\n";
  cout<<"\n";
   cout<<"\n";
for (i=0;i<nbheap;i++)
{
    cout<<analyze[i].num<<": ";
    for (j=0;j<max_1+1;j++)
     cout<<"2^"<<j<<":"<<analyze[i].apower[j]<<" ";
    cout<<"\n";
 return 0;
}
5
1:38 2:17 3:10 4:9 5:10
38
5

总: i=0 当前:38 power=2
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

else:  i=0 当前:38 power=3
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

总: i=0 当前:38 power=3
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

else:  i=0 当前:38 power=4
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

总: i=0 当前:38 power=4
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

else:  i=0 当前:38 power=5
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

总: i=0 当前:38 power=5
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

if:  i=0 当前:38 power=5
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:1

2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

总: i=0 当前:6 power=0
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

else:  i=0 当前:6 power=1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

总: i=0 当前:6 power=1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

else:  i=0 当前:6 power=2
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

总: i=0 当前:6 power=2
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

if:  i=0 当前:6 power=2
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:1   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:1   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:0   2^2:1   2^3:0   2^4:0   2^5:1

2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

总: i=0 当前:2 power=0
2^0:0   2^1:0   2^2:1   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

else:  i=0 当前:2 power=1
2^0:0   2^1:0   2^2:1   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

总: i=0 当前:2 power=1
2^0:0   2^1:0   2^2:1   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

if:  i=0 当前:2 power=1
2^0:0   2^1:0   2^2:1   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:1   2^2:1   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:1   2^2:1   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0
2^0:0   2^1:1   2^2:1   2^3:0   2^4:0   2^5:1

2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

总: i=1 当前:17 power=0
2^0:0   2^1:1   2^2:1   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

else:  i=1 当前:17 power=1
2^0:0   2^1:1   2^2:1   2^3:0   2^4:0   2^5:1
2^0:0   2^1:0   2^2:0   2^3:0   2^4:0   2^5:0

if:  i=2 当前:2 power=1
2^0:0   2^1:1   2^2:1   2^3:0   2^4:0   2^5:1
2^0:1   2^1:0   2^2:0   2^3:0   2^4:1   2^5:0
2^0:0   2^1:1   2^2:1   2^3:0   2^4:0   2^5:2
2^0:1   2^1:0   2^2:0   2^3:0   2^4:1   2^5:0

2^0:0   2^1:1   2^2:1   2^3:0   2^4:0   2^5:2
2^0:1   2^1:0   2^2:0   2^3:0   2^4:1   2^5:0
2^0:0   2^1:1   2^2:1   2^3:0   2^4:0   2^5:2

2^0:1   2^1:0   2^2:0   2^3:0   2^4:1   2^5:0

总: i=3 当前:9 power=0
2^0:0   2^1:1   2^2:1   2^3:0   2^4:0   2^5:2
2^0:1   2^1:0   2^2:0   2^3:0   2^4:1   2^5:0

else:  i=3 当前:9 power=1
2^0:0   2^1:1   2^2:1   2^3:0   2^4:0   2^5:2
2^0:1   2^1:0   2^2:0   2^3:0   2^4:1   2^5:0



38: 2^0:0 2^1:1 2^2:1 2^3:0 2^4:0 2^5:2
17: 2^0:1 2^1:0 2^2:0 2^3:0 2^4:1 2^5:0
10: 2^0:0 2^1:2 2^2:0 2^3:1 2^4:0 2^5:0
9: 2^0:1 2^1:0 2^2:0 2^3:1 2^4:0 2^5:1
10: 2^0:0 2^1:1 2^2:0 2^3:1 2^4:0 2^5:0
搜索更多相关主题的帖子: power for i++ cout 当前 
2017-09-30 03:45
大神仙下凡
Rank: 2
等 级:论坛游民
帖 子:12
专家分:10
注 册:2017-9-21
得分:10 
看了一眼,有点晕。把一个数写成以2为底的幂的形式有这么复杂吗;类似于把十进制的数转化成二进制吧!
2017-09-30 08:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
你这错误也太多了吧,我改了15分钟才将语法错误改掉,使之可以编译通过,代码更是乱得如同说梦话。
你所遇到的问题其实是数组越界了,比如第一个越界处
struct structure
{
    int num,num1;
    int max_index=0;
    int* apower=new int[max_index+1]; // 这里 max_index+1 == 0
};
……
for (j=0;j<max_1+1;j++)
    cout<<"2^"<<j<<":"<<analyze[i].apower[j]<<"   "; // 这里j最大是6呀

我不知道你想完成什么功能,是不是将一个整数分解成2的幂的和,比如 38 = 0*2^0 + 1*2^1 + 1*2^2 + 0*2^3 + 0*2^4 + 1*2^5 ?
程序代码:
#include <iostream>
using namespace std;

void foo( unsigned n )
{
    for( unsigned i=0; i!=sizeof(n)*CHAR_BIT; ++i, n>>=1 )
        cout << (i!=0?" + ":"") << (n&1) << "*2^" << i;
    cout << endl;
}

int main( void )
{
    foo( 38 );
}

2017-09-30 08:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-481048-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031728 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved