2010-03-31 82 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; 
} 

非常感謝 - 尼爾