2016-05-29 19 views
1
#include<stdio.h> 
#include<stdlib.h> 
double mean(int i, int arr[]) 
{ 
    int j, sum = 0; 
    for (j = 0; j < i; j++) 
    { 
     sum = arr[j] + sum; 
    } 
    return (float)sum/i; 
} 
int main() 
{ 
    int arr[100] = { NULL }; 
    int i, n, sum = 0; 
    printf("How many numbers would you like to enter?"); 
    scanf_s("%d", &n); 
    while (n > 100 || n < 0) 
    { 
     printf("Amount of numbers should be less than 0 and more than 100\n"); 
     scanf_s("%d", &n); 
    } 
    for (i = 0; i < n; i++) 
    { 
     scanf_s("%d", &arr[i + 1]); 
    } 
    printf("%f", mean(i-1, arr[i])); 
    system("pause"); 
} 

コードを実行すると、読み取りアクセスエラーが発生します。私が作成したmean()関数に問題がありますが、何が問題なのか分かりません。助けて?配列の平均を計算する

+1

一つには、誤って 'scanf_s( "%d個"、&編曲:[I + 1])に' + 1 'を追加しました; ''に変更しscanf_s( "%d"、&arr [i]); ' –

+0

警告を有効にしてコンパイルしましたか? 'mean(i-1、arr [i])'は 'mean(n、arr)'であるべきですか? –

+2

Sidenote、 '"数量は0未満、あなたが実際にテストするものとは逆のようです。 – fvu

答えて

2

はこれを試してみてください:mean機能へ

#include<stdio.h> 
#include<stdlib.h> 
double mean(int i, int arr[]) 
{ 
    int j, sum = 0; 
    for (j = 0; j < i; j++) 
    { 
     sum = arr[j] + sum; 
    } 
    return (float)sum/i; 
} 
int main() 
{ 
    int arr[100] = { 0 }; 
    int i, n, sum = 0; 
    printf("How many numbers would you like to enter?"); 
    scanf("%d", &n); 
    getchar(); 
    while (n > 100 || n < 0) 
    { 
     printf("Amount of numbers should be more than 0 and less than 100\n"); 
     scanf("%d", &n); 
     getchar(); 
    } 
    for (i = 0; i < n; i++) 
    { 
     scanf("%d", &arr[i]); 
     getchar(); 
    } 
    printf("%lf", mean(n, arr)); 
    getchar(); 
} 

あなたの呼び出しが間違っていました。 1つの要素だけでなく、配列全体を渡す必要があります。 arr[i]arrに変更してください。

その他のマイナーな変更は、自分のシステムで実行するために行ったことです。そうでなければあなたのために働くならば、素晴らしい。

6

コードを実行すると、読み取りアクセスエラーが発生します。

printf("%f", mean(i-1, arr[i])); 

あなたの関数に配列を渡すが、その要素(それされていません。問題は、mean()機能は、読み取りアクセスエラーが発生しますが、実際の問題はここにあるmean()機能を

です書かれたものの終わりを過ぎているので、あなたが渡す値さえも未定義です)。

あなたが排他的な上限値としてごmean()扱い、それをするので、長さのためiを渡す必要がある、とあなたはまた、アレイのarrを渡す必要があります。データの読み込み

printf("%f", mean(i, arr)); 

インデックス問題も必要固定されて - あなたは+ 1を削除する必要があります。

scanf_s("%d", &arr[i]); 
//    ^
+0

は、配列要素を配列に渡しますコンパイラ拡張としてサポートされていますか? –

+2

@bkVnetかなり古い理由から、Cでは 'int'とポインタの間の変換が可能です(最初のCコンパイラが開発されたシステムではサイズは同じです)。さらに、配列はポインタとして関数に渡されます。これら2つの規則は、ポインタを必要とする関数に 'int'を渡すためのコンパイラの要件に組み込まれています。なぜならそれはかなり特定のエラーだからです。 – dasblinkenlight