| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2174 人关注过本帖
标题:C语言高手请进:这个分块求和C语言程序问题出在哪里?​对一组无规律数 ...
只看楼主 加入收藏
topxjl
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-1-22
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
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个正数赋值给目标数组,准备累加正数
          p=1;                                                  //正数计数为1个
          for (i=1+1; i<=limit; i++)                  //正数累加循环:从最左第2个开始判断
            {
               if (source[i]<=0) break;                 //如果第2个不是正数,退出循环
               target[i]=target[i-1]+source[i];         //将左边正数累加到当前目标数组;
               p++;                                             //正数计数增加1
             }
          }                                                       //循环完成,完成一组连续正数的累计求和,正数数量为p个
   
      limit=limit-p;                                         //经过正数求和,剩余待处理数据共limit-p个
//连续零值求和
   
    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);
 }
  




[此贴子已经被作者于2016-1-22 23:04编辑过]

搜索更多相关主题的帖子: C语言 
2016-01-22 12:12
暴风晕
Rank: 12Rank: 12Rank: 12
来 自:冥界
等 级:火箭侠
威 望:6
帖 子:402
专家分:3107
注 册:2015-8-8
收藏
得分:5 
z++;上面那一句没分号
limit=limit-r-z;                              //经过正数及零值求和,剩余待处理数据共limit-p-z个(自己看)
2016-01-22 12:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
程序代码:
#include <stdio.h>

int main( void )
{
    const int s[] = {2,3,8,6,0,0,-2,-1,-4,0,5,6,7,-5,-2};

    int temp = 0;
    for( size_t i=0; i!=sizeof(s)/sizeof(*s); ++i )
    {
        if( (s[i]>0 && temp>0) || (s[i]<0 && temp<0) )
            temp += s[i];
        else
            temp = s[i];

        printf( "%d ", temp );
    }

    return 0;
}
2016-01-22 12:51
topxjl
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-1-22
收藏
得分:0 
回复 2楼 暴风晕
谢谢!更正了,我的程序还有别的问题。希望能继续帮我解决。
2016-01-22 23:06
topxjl
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-1-22
收藏
得分:0 
以下是引用zlz66668888在2016-1-22 14:04:24的发言:

本人认为楼主对问题的理解有误,分块求和,意思可能是想知道所有的正数和,所有的负数和。
按照楼主的描述,100个数,跑完了程序,还不知道所有的正数和是多少,也不知道所有的负数和是多少。
既然如此,为何要分块求和呢?


谢谢点评!程序要求的输出是示例的格式:

  源:// 2  3  8  6  0  0 -2 -1 -4  0  5  6  7 -5 -2
目标:// 2  5 13 19  0  0 -2 -3 -7  0  5 11 18 -5 -7
希望能帮我诊断程序问题出在哪里。
2016-01-22 23:10
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:5 
程序代码:
#include <stdio.h>
#define N 15
int main()
{
    int i,a,b;
    int source[N]={2,3,8,6,0,0,-2,-1,-4,0,5,6,7,-5,-2}, target[N]={0};
    target[0]=source[0];
    for(i=1;i<N;i++) {
        if(source[i]>0)
            a=1;
        else if(source[i]==0)
            a=0;
        else
            a=-1;
        if(source[i-1]>0)
            b=1;
        else if(source[i-1]==0)
            b=0;
        else
            b=-1;
        if((a==1&&b==1) || (a==-1&&b==-1))
            target[i]=target[i-1]+source[i];
        else
            target[i]=source[i];
    }
    printf("%d", target[0]);
    for(i=1;i<N;i++)
        printf(",%d", target[i]);
    return 0;
}

判斷source[i]是否與前面的元素正負相同
如果是,target[i]=target[i-1]+source[i];
如果否,target[i]=source[i];
2016-01-22 23:37
topxjl
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-1-22
收藏
得分:0 
回复 8楼 ms268el8
你的程序很棒!!谢谢!
2016-01-23 00:26
topxjl
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-1-22
收藏
得分:0 
回复 3楼 rjsp
谢谢版主的回复!膜拜!!你的代码我理解还有困难,因为我还是初学者,只能看基本语句,像size_t、sizeof这类关键字都是在你的代码里第一次接触。

[此贴子已经被作者于2016-1-23 00:33编辑过]

2016-01-23 00:32
快速回复:C语言高手请进:这个分块求和C语言程序问题出在哪里?&#8203;对一组无 ...
数据加载中...
 
   



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

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