2010-03-31 81 views
-1

此C代码给了我一些不可预知的结果。该计划旨在收集6个号码并打印最大号码,最大号码和平均号码的位置。它应该只有3个函数 - input,max_avr_pos和output来完成代码应该做的事情,但是我得到的结果不可预知。请可能是什么问题C代码中的错误帮助

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
void input_vals(int arrnum[]); 
void max_ave_val(int arrnum1[],double *average,int *maxval,int *position); 
void print_output(double *average1,int *maxval1,int *position1); 
int main(void) { 
    int arrnum[6],maxval2,position2; 
    double average2; 
    input_vals(arrnum); 
    max_ave_val(arrnum,&average2,&maxval2,&position2); 
    print_output(&average2,&maxval2,&position2); 
    _getche(); 
    return 0; 
} 
void input_vals(int arrnum[]){ 
    int count; 
    printf("\n Please enter six numbers\n"); 
    for(count=0;count<6;count++) { 
     scanf("%d",&arrnum[count]); 
    } 
} 
void max_ave_val(int arrnum1[],double *average,int *maxval,int *position) { 
    int total=0; 
    int cnt,cnt1,cnt2,limit,maxval2,post; 
    limit=6; 
    /* finding the max value*/ 
    for(cnt=0;cnt<limit-1;cnt++) 
     for(cnt1=limit-1;cnt1>cnt;--cnt1) { 
      if(arrnum1[cnt1-1]>arrnum1[cnt1]) { 
       maxval2=arrnum1[cnt-1]; 
       post=(cnt-1)+1; 
      } 
      else { 
       maxval2=arrnum1[cnt1]; 
       post=cnt1+1; 
      } 
     } 

     *maxval=maxval2; 
     *position=post; 
     /* solving for total */ 
     for(cnt2=0;cnt2<limit;cnt2++); 
     { 
      total=total+arrnum1[cnt2]; 
     } 
    *average=total/limit; 
} 
void print_output(double *average1,int *maxval1,int *position1) { 
    printf("\n value of the highest of the numbers is %d\n",*maxval1); 
    printf("\n the average of all the numbers is %g\n",*average1); 
    printf("\n the postion of the highest number in the list is %d\n",*position1); 
} 
+5

它会被解释到底什么是“不可预测的结果”帮助。 – 2010-03-31 14:18:02

+0

你有没有使用'lint'来查看可能会出现什么问题? – 2010-03-31 14:18:12

+2

我有点困惑,为什么你要循环两次 - 你可能只会经历一次,总计得到总数,并记住当前的最大值及其位置。 – Cascabel 2010-03-31 14:19:36

回答

1
for(cnt2=0;cnt2<limit;cnt2++); 
    { 
     total=total+arrnum1[cnt2]; 
    } 

;在for循环的结束。

+0

我不再写C语言了,但我必须相信现代编译器会显示关于额外分号的警告。 @Yanki - 你的编译器是否警告过你? – JeffH 2010-03-31 14:50:13

+0

@Jeff 是的。我把它拿出来,但仍然有问题 – 2010-03-31 14:56:40

+0

你可以通过在调试器中运行它,或者打印出你的变量的值在循环的不同部分。 这是做什么是递增cnt2到6,然后添加arrnum1 [6](这是垃圾)总数。 – JohnMcG 2010-03-31 15:17:49

0

好像你可以找到最大容易。如何:

maxval2 = -1; 
post = -1; 
for(cnt=0;cnt<limit-1;cnt++) 
{ 
    if(arrnum1[cnt] > maxval2) 
    { 
     post = cnt; 
     maxval2 = arrnum1[cnt]; 
    } 
} 
1

循环一次,并总结所有数字,并检查您当前的最大值对当前的数字。

for (cnt = 0; cnt < limit; cnt++) { 
     total += arrnum[cnt]; 

     if (maxval < arrnum[cnt]) { 
     maxval = arrnum[cnt]; 
     position = cnt; 
     } 
    } 

MAXVAL应该从limit.h

0

现在我已经写这种盲目的被初始化为最小int值,但希望这会帮助,看来,不要见怪,代码suppled在这个问题有点过于复杂。

void max_ave_val(int arrnum1[],double *average,int *maxval,int *position) { 

    #define LIMIT 6 

    *maxval = 0; 
    *average = 0.0f; 

    for (Int index = 0; index < LIMIT; index++) 
    { 
     *average += arrnum1[ index ]; 
     if (arrnum1[ index ] > *maxval) 
     { 
      *maxval = arrnum1[ index ]; 
      *position = index; 
     } 
    } 

    *average /= LIMIT; 
} 

非常感谢 - 尼尔