| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1246 人关注过本帖
标题:如何运用指针数组求某段区间中数值的最小值?
只看楼主 加入收藏
yxb0001
Rank: 2
等 级:论坛游民
帖 子:50
专家分:35
注 册:2009-9-9
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
如何运用指针数组求某段区间中数值的最小值?
已知某数组a,假设其符合某条件的指针数组是**nn,求指针数组元素*(nn+i)与*(nn+i+1)所指向的数组a的元素值
**(nn+i)与**(nn+i+1)之间的最小的元素值。

#include<iostream.h>
#include<stdlib.h>

int a[30]={2,0,6,23,1,3,41,0,5,6,0,99,11,21,4,33,22,0,12,7,5,9,1,8,67,0,9,3,6,23};
int *p,i,j=0,**nn,**dd;
int **y,*bb;
int k=0;
int r,f,g=0;

int main()
{
    y = (int **)calloc(30,sizeof(int *));
    nn=(int **)calloc(30,sizeof(int*));
    dd=(int **)calloc(30,sizeof(int*));
    bb=(int *)calloc(1,sizeof(int));

   
     p=&a[0];
     
    for(i=0;i<20;i++)
    {
        if(*(p+i)!=0)
        {
            *(y+j)=p+i;
            
            cout<<**(y+j)<<" ";

            j++;
        }
    }
    cout<<"\n";//数组a非0元素的指针数组**y,元素j

    for(i=0;i<j-2;i++)
    {
        if((**(y+i)*3)>**(y+i+2))
        {
            *(nn+k)=*(y+i);            
            cout<<**(nn+k)<<" ";
            k++;
        }
    }
    cout<<"\n"; //符合条件**(y+i)*3)>**(y+i+2)的新指针数组

   
   
   
    //求指针数组**nn中2相邻元素指向的数组a的相对应元素间非0的最小值,并以数组表示。
    for(i=0;i<k-1;i++)
    {
        for(r=0;r<j-1;r++)
        {
            if(*(nn+i)<=*(y+r) && *(y+r)<=*(nn+i+1))
            {
                *bb=**(y+r)<**(y+r+1)?**(y+r):**(y+r+1);
                cout<<*bb<<endl;
            }            
        }
        for(r=0;r<j;r++)
        {
            if(**(y+r)==*bb && *(nn+i)<=*(y+r))
            {
                *(dd+g)=*(y+r);
                g++;break;
            }
        }
    }   
    cout<<**(dd+g)<<" ";
    cout<<endl;
    return 0;
}



请问上面红色的这段程序应如何改写?









[ 本帖最后由 yxb0001 于 2009-9-29 23:22 编辑 ]
搜索更多相关主题的帖子: 指针 数值 
2009-09-29 17:36
yxb0001
Rank: 2
等 级:论坛游民
帖 子:50
专家分:35
注 册:2009-9-9
收藏
得分:0 
上述问题运用类似的方法解为什么前一部份答案正确,而后半部份却时正时错?
#include<iostream.h>  
#include<stdlib.h>  
 
int a[30]={2,0,6,23,1,3,41,0,5,6,0,99,11,21,4,33,22,0,12,7,5,9,1,8,67,0,9,3,6,23};  
int *p,i,j=0,**nn,**dd;  
int **y,*bb;
int k=0;
int r,f,g=0;
 
int main()  
{  
    y = (int **)calloc(30,sizeof(int *));
    nn=(int **)calloc(30,sizeof(int*));
    dd=(int **)calloc(30,sizeof(int*));
    bb=(int *)calloc(1,sizeof(int));
 
     
     p=&a[0];  
      
    for(i=0;i<20;i++)  
    {  
        if(*(p+i)!=0)  
        {  
            *(y+j)=p+i;  
              
            cout<<**(y+j)<<" ";  
 
            j++;  
        }  
    }
    cout<<"\n";//数组a非0元素的指针数组**y,元素j
 
    for(i=0;i<j-2;i++)
    {
        if((**(y+i)*3)>**(y+i+2))
        {
            *(nn+k)=*(y+i);            
            cout<<**(nn+k)<<" ";
            k++;
        }
    }
    cout<<"\n"; //符合条件**(y+i)*3)>**(y+i+2)的新指针数组
 
     
     
     
    //求指针数组**nn中2相邻元素指向的数组a的相对应元素间非0的最小值,并以数组表示。
    for(i=0;i<k-1;i++)
    {
        for(r=0;r<*(nn+i+1)-*(nn+i);r++)
        {
            if(*(*(nn+i)+r+1)!=0 && *(*(nn+i)+r)!=0)
            {
                if((*(nn+i)+r)>(*(nn+i)+r+1))
                {
                    bb=(*(nn+i)+r+1);
                }
                else bb=*(nn+i)+r;
            }            
        }cout<<*bb<<endl;
     
    }     
 
 
    return 0;
}
运行结果如下:
2 6 23 1 3 41 5 6 99 11 21 4 33 22 12 7     //运行所得非零数组
6 23 3 41 6 99 11 21 33 22                 //运行所得符合条件的数组
6                                         //条件数组元素6、23所对应的非零数组元素6、23间的最小值是6,正确
1                                         //条件数组元素23、3所对应的非零数组元素23、3间的最小值是1,正确
3
5
5              //条件数组元素6、99所对应的非零数组元素6、99间的最小值是6,而此处却莫名其妙的跑只5,不正确
99             //不正确
11
4
33             //不正确
Press any key to continue
2009-09-29 23:22
yxb0001
Rank: 2
等 级:论坛游民
帖 子:50
专家分:35
注 册:2009-9-9
收藏
得分:0 
2楼程序的修正,如此应没有什么大问题了,但为什么数组**dd总会自动添加一个元素1?
#include<iostream.h>  
#include<stdlib.h>  
 
int a[30]={2,0,6,23,1,3,41,0,5,6,0,99,11,21,4,33,22,0,12,7,5,9,1,8,67,0,9,3,6,23};  
int *p,i,j=0,**nn,**dd;  
int **y,**bb;
int k=0;
int r,g=0;
 
int main()  
{  
    y = (int **)calloc(30,sizeof(int *));
    nn=(int **)calloc(30,sizeof(int*));
    dd=(int **)calloc(30,sizeof(int*));
    bb=(int **)calloc(1,sizeof(int*));
     
 
     
     p=&a[0];  
      
    for(i=0;i<30;i++)  
    {  
        if(*(p+i)!=0)  
        {  
            *(y+j)=p+i;  
              
            cout<<**(y+j)<<" ";  
 
            j++;  
        }  
    }
    cout<<"\n";//数组a非0元素的指针数组**y,元素j
 
    for(i=0;i<j-2;i++)
    {
        if((**(y+i)*3)>**(y+i+2))
        {
            *(nn+k)=*(y+i);            
            cout<<**(nn+k)<<" ";
            k++;
        }
    }
    cout<<"\n"; //符合条件**(y+i)*3)>**(y+i+2)的新指针数组
 
     
     
     
    //求指针数组**nn中2相邻元素指向的数组a的相对应元素间非0的最小值,并以数组表示。
    for(i=0;i<k-1;i++)
    {
        for(r=0;r<=*(nn+i+1)-*(nn+i);r++)
        {
            if(*(*(nn+i)+r)!=0)
            {
                *(dd+g)=*(nn+i)+r;
                cout<<**(dd+g)<<" ";
                g++;
            }
        }
         
        *bb=*dd;
        for(r=0;r<g;r++)
        {            
            if(**(dd+r)<**bb)
            {
                *bb=*(dd+r);
            }
            
        }cout<<**bb<<endl;
     
    }     
 
    return 0;
}
 
 
运行结果:
 
 2 6 23 1 3 41 5 6 99 11 21 4 33 22 12 7 5 9 1 8 67 9 3 6 23
6 23 3 41 6 99 11 21 33 22 12 7 5 9 8 67 9
6 23 6
23 1 3 1
3 41 1    //从此开始下面每一数组都自动增加了一个元素1,为什么?
41 5 6 1
6 99 1
99 11 1
11 21 1
21 4 33 1
33 22 1
22 12 1
12 7 1
7 5 1
5 9 1
9 1 8 1
8 67 1
67 9 1
Press any key to continue
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2009-09-30 10:13
yxb0001
Rank: 2
等 级:论坛游民
帖 子:50
专家分:35
注 册:2009-9-9
收藏
得分:0 
2楼问题已解决,但1楼与3楼却没有,

1楼的问题:思路是使用非零数组而不使用原始数组a求答案。

3楼的思路是分段时回到原始数组,然后再去零后求解。

1、3楼暂时都没有获得答案。
2009-09-30 11:02
forclwy
Rank: 4
等 级:业余侠客
帖 子:167
专家分:255
注 册:2008-10-21
收藏
得分:20 
都是一个人?
2009-09-30 11:08
yxb0001
Rank: 2
等 级:论坛游民
帖 子:50
专家分:35
注 册:2009-9-9
收藏
得分:0 
3楼问题已解决
#include<iostream.h>   
#include<stdlib.h>   
 
int a[30]={2,0,6,23,1,3,41,0,5,6,0,99,11,21,4,33,22,0,12,7,5,9,1,8,67,0,9,3,6,23};   
int *p,i,j=0,**nn,**dd;   
int **y,**bb;  
int k=0;  
int r,g=0;  
 
int main()   
{   
    y = (int **)calloc(30,sizeof(int *));  
    nn=(int **)calloc(30,sizeof(int*));  
    dd=(int **)calloc(30,sizeof(int*));  
    bb=(int **)calloc(1,sizeof(int*));  
      
 
      
     p=&a[0];   
      
    for(i=0;i<30;i++)   
    {   
        if(*(p+i)!=0)   
        {   
            *(y+j)=p+i;   
               
            cout<<**(y+j)<<" ";   
 
            j++;   
        }   
    }  
    cout<<"\n";//数组a非0元素的指针数组**y,元素j  
 
    for(i=0;i<j-2;i++)  
    {  
        if((**(y+i)*3)>**(y+i+2))  
        {  
            *(nn+k)=*(y+i);              
            cout<<**(nn+k)<<" ";  
            k++;  
        }  
    }  
    cout<<"\n"; //符合条件**(y+i)*3)>**(y+i+2)的新指针数组  
 
      
      
      
    //求指针数组**nn中2相邻元素指向的数组a的相对应元素间非0的最小值,并以数组表示。  
    for(i=0;i<k-1;i++)  
    {  
        g=0;for(r=0;r<=*(nn+i+1)-*(nn+i);r++)  
        {  
            if(*(*(nn+i)+r)!=0)  
            {  
                *(dd+g)=*(nn+i)+r;  
                cout<<**(dd+g)<<" ";  
                g++;  
            }  
        }  
         
        *bb=*dd;  
        for(r=0;r<g;r++)  
        {              
            if(**(dd+r)<**bb)  
            {  
                *bb=*(dd+r);  
            }  
              
        }cout<<**bb<<endl;  
      
    }      
 
    return 0;  
}  
2009-10-01 14:21
yxb0001
Rank: 2
等 级:论坛游民
帖 子:50
专家分:35
注 册:2009-9-9
收藏
得分:0 
1楼问题已解决.
#include<iostream.h>  
#include<stdlib.h>  
 
int a[30]={2,0,6,23,1,3,41,0,5,6,0,99,11,21,4,33,22,0,12,7,5,9,1,8,67,0,9,3,6,23};  
int *p,i,j=0,**nn;  
int **y,**bb;
int k=0;
int r,g=0;
 
int main()  
{  
    y = (int **)calloc(30,sizeof(int *));
    nn=(int **)calloc(30,sizeof(int*));     
    bb=(int **)calloc(1,sizeof(int*));
     
 
     
     p=&a[0];  
      
    for(i=0;i<30;i++)  
    {  
        if(*(p+i)!=0)  
        {  
            *(y+j)=p+i;  
              
            cout<<**(y+j)<<" ";  
 
            j++;  
        }  
    }
    cout<<"\n";//数组a非0元素的指针数组**y,元素j
 
    for(i=0;i<j-2;i++)
    {
        if((**(y+i)*3)>**(y+i+2))
        {
            *(nn+k)=*(y+i);            
            cout<<**(nn+k)<<" ";
            k++;
        }
    }
    cout<<"\n"; //符合条件**(y+i)*3)>**(y+i+2)的新指针数组
 
    for(i=0;i<k-1;i++)
    {
        *bb=*(nn+i+1);     
        for(r=0;r<j;r++)
        {
            if(*(y+r) == *(nn+i+1))
            {
                for(int rr=0;rr<=r;rr++)
                {
                    if(**bb>**(y+r-rr))
                    {
                        *bb=*(y+r-rr);
                    }
                    if(*(y+r-rr)==*(nn+i))
                    {
                        cout<<**bb<<endl;
                        break;
                    }
                     
                }                 
                 
            }            
        }         
     
    }
    return 0;
}
2009-10-02 02:15
快速回复:如何运用指针数组求某段区间中数值的最小值?
数据加载中...
 
   



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

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