-2

私の他の質問で参照されているのと同じマシンと IDE を使用する (コード内の問題または私の IDE/comp の 3 番目の段落にバグがありますか? )

私はこのコードを実行しようとします:

#include <stdio.h>
#define n 3
int main()
{
    int i;
    float values[n],sumval,svmean,tmp;
    for(i=0;i<n;++i)
    {
        scanf("%f",&tmp);
        values[i]=tmp;
        sumval = sumval + values[i];
    }
    svmean = sumval/n;
    printf("%f \n",svmean);
    return(0);
}

上記のコードは、この式を実行することになっています

http://img850.imageshack.us/img850/6894/95871186.jpg

つまり、いくつかの値を追加し、結果をそれらの合計数で割る必要があります。

上記のように、ランダムなn位置の配列を作成し、ユーザーに各位置の値を入力してから、それらをすべて加算して除算するように求めます。

問題は、それが機能しないことです。入力が何であれ、結果7のみを出力します。

しかし、コードに stdlib.h を含めると、正常に動作します。

それで

  • 質問 A : stdio.h ライブラリだけを使用すると、コードが正しく動作しないのはなぜですか? コードのどの要素が stdlib.h ライブラリを必要としますか?

ご覧のとおり、配列values[n]にはランダムなn数のセルがあるように見えますが、実際には、この数値を 3 に等しく設定しています ( を使用#define)

  • 質問 B : 同じポルプスを使用してコードを実行する方法はありますか? ユーザーが配列のサイズを定義できるようにする、values[n]つまり in の値を設定する整数をユーザーに入力させる方法はありますnvalues[n]?
4

6 に答える 6

2

まず、初期化を忘れていましたsumval。あなたはそれが0最初にあることを望みます。

配列のサイズを実行時に決定する場合は、次のように を使用して動的に割り当てる必要がありますmalloc

int n;
float *values,sumval=0,svmean,tmp;
scanf("%d", &n);
values = (float *) malloc (n * sizeof(float));

後で、呼び出して割り当てられたメモリを解放する必要がありますfree

free(values);
于 2012-12-21T10:47:53.757 に答える
0

sumVal を o に初期化します。最初の繰り返しでは、garbage+values[i] を sumValue に追加するためです。

 #include <stdio.h>
 #define n 3
 int main()
 {
 int i;
 float values[n],sumval=0,svmean,tmp;
 for(i=0;i<n;++i){
 scanf("%f",&tmp);
 values[i]=tmp;
 sumval = sumval + values[i];
 }
  sumean = sumval/n;
  printf("%f \n",svmean);
  return(0);

}

于 2012-12-21T10:49:28.370 に答える
0

問題は、初期化しないことですsumval。ループする0.0前に設定する必要があります。for

含む/含まないときに発生する変更stdio.hは、おそらくスタックを使用するいくつかの初期化関数と、関数に入る前のメモリ内の値の変更が原因であり、このメモリがsumval変数に使用されることがあります。

しかし、これに頼るべきではありません。

于 2012-12-21T10:49:48.950 に答える
0

これを試して..

#include <stdio.h>

int main()
{
    int i = 0;
    int n = 0;
    float sumval = 0;
    float svmean = 0;
    float tmp = 0;

    printf("Enter count : ");
    scanf("%d", &n);

    for (i = 0; i < n; ++i) {
        scanf("%f", &tmp);
        sumval = sumval + tmp;
    }

    svmean = sumval/n;
    printf("%f \n",svmean);

    return(0);
}

あなたのコードでは、出力を計算するために values[] 配列は必要ありません。なんらかの理由で値を保存していますか??..

于 2012-12-24T02:57:15.627 に答える
0

次のように、プログラムのヒープに可変サイズの配列を割り当てることができます。

#include <stdio.h>
int main(int argc, char **argv)
{
   int i;
   //Get the size of the array from input parameter
   int n = atoi(argv[1]);                
   float sumval,svmean,tmp;
   //Allocate the array of values
   float *values = malloc(sizeof(float)*n);
   // Initialize sumval
   for(sumval=0,i=0;i<n;++i){
      scanf("%f",&tmp);
      values[i]=tmp;
      sumval = sumval + values[i];
   }
   svmean = sumval/n;
   printf("%f \n",svmean);
   //Free it
   free( values );               
   return(0);
  }

また、sumval を 0 に初期化する必要があります。配列のサイズのパラメーターは、プログラムの起動時に渡されます (IDE を使用している場合は、その方法を確認する必要があります)。

于 2012-12-21T10:51:23.293 に答える
0

質問 回答 あなたが投稿したコードでは、stdlib.h は必要ありません。このライブラリは、malloc() などのメモリを動的に割り当てる関数を使用する場合に必要です。

質問 B の回答: これは、やりたいことを行う方法です。

#include <stdio.h>

int main()
{
    int i, choice;
    float *values,sumval,svmean,tmp;
    printf("Please enter the size of the array: ");
    scanf("%d", &choice);
    values = (float*) malloc(choice*sizeof(float));
    for(i=0;i<n;i++){
        scanf("%f",&tmp);
        values[i]=tmp;
        sumval = sumval + values[i];
    }
    svmean = sumval/n;
    printf("%f \n",svmean);
    free(values);
    return 0;
}

また、ループ実行後に for 文の i の増分が増えるように修正しました。

于 2012-12-21T10:51:45.787 に答える