topxjl 2016-01-22 03:08 采纳率: 0%
浏览 1440

C语言高手请进:这个分块求和C语言程序问题出在哪里?​对一组无规律数据按正数、负数和零分块求和,

对一组无规律数据按正数、负数和零分块求和,即要求将序列中相邻的正数、零及负数分块累加输出,格式要求:
源数据: 2,3,8,6,0,0,-2,-1,-4,0,5,6,7,-5,-2,...(共100个)
整理输出为: 2,5,13,19,0,0,-2,-3,-7,0,5,11,18,-5,-7...(共100个)
以下程序哪里出了问题?我搞了2星期,总是得不到完整输出:
int main()
{
int p,z,n,limit; //定义变量p,z,n分别计数正数、零、负数及源数据总个数
p=z=n=0;
limit=100; //源数据100个,测试程序时可改为20
int i;

int source[100]=[2,3,8,6,0,0,-2,-1,-4,0,5,6,7,-5,-2,...]; //源数据100个测试可改为20
int target[100]; //target数组用于输出结果,100个测试可改为20

for  (i=1; i<=limit; i++)               
{
  if (source[i]>0)                                       //如果源数据第1个数是正数
   { 
      target[i]=source[i];                              //最左第1个正数赋值给目标数组,准备累加正数
      z=1;                                                  //正数计数为1个
      for (i=1+1; i<=limit; i++)                  //正数累加循环:从最左第2个开始判断
        {
           if (source[i]<=0) break;                 //如果第2个不是正数,退出循环
           target[i]=target[i-1]+source[i]         //将左边正数累加到当前目标数组;
           r++;                                             //正数计数增加1
         }
      }                                                       //循环完成,完成一组连续正数的累计求和,正数数量为z个

  limit=limit-r;                                         //经过正数求和,剩余待处理数据共limit-r个

//连续零值求和

if (source[i]==0)                                        //如果第1个数是0
   { 
      target[i]=source[i]=0;                         //赋值,准备累加零值;
      z=1;                                                  //零值计数1个
      for (i=1+1; i<=limit; i++)                   //累加循环:从最左第2个开始判断
        {
           if (source[i]!=0) break;                 //如果第2个不是零,退出循环 
           target[i]=target[i-1]+source[i]        //累加;
           z++;                                            //零值计数增加1
         }
      }                                                      //循环完成,完成一组连续零值的累计求和,零值数量为z个

  limit=limit-r-z;                                      //经过正数及零值求和,剩余待处理数据共limit-p-z个

// 连续负数求和
if (source[i]>0) //如果源数据第一个数是负数
{
target[i]=source[i]; //赋值,准备累加负数
n=1; //负数计数为1个
for (i=1+1; i<=limit; i++) //负数累加循环:从最左第2个开始判断
{
if (source[i]>=0) break; //如果第2个不是负数,退出循环
target[i]=target[i-1]+source[i] //累加;
n++; //负数计数增加1
}
} //循环完成,完成一组连续负数的累计求和,负数数量为n个

  limit=limit-p-z-n;                               //经过正数、零值及负数求和,剩余待处理数据共limit-p-z-n个
}

//++以下输出目标数组++++++++++++++++

int j;
for (j=1,j<=100, j++)
printf("%d ", target[j]);

return(0);
}

  • 写回答

6条回答

  • 91program 博客专家认证 2016-01-22 03:28
    关注

    看看下面的函数满足不满足你的要求:

     void Test(void)
    {
        int iSrc[] = {2,3,8,6,0,0,-2,-1,-4,0,5,6,7,-5,-2};
        int i = 0;
        int iSize = sizeof(iSrc) / sizeof(iSrc[0]);
    
        for(i = 0;i < iSize - 1;i++)
        {
            if(iSrc[i] > 0 && iSrc[i + 1] > 0)
            {
                iSrc[i + 1] += iSrc[i];
            }
            else if(iSrc[i] < 0 && iSrc[i + 1] < 0)
            {
                iSrc[i + 1] += iSrc[i];
            }
        }
        for(i = 0;i < iSize;i++)
        {
            TRACE("%d ",iSrc[i]);
        }
        TRACE("\r\n");
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏