-4

.txt ファイルを読み取るプログラムを作成する必要があります。この .txt ファイルには、ビームをブロックしているブレードが前面にあるセンサーでのレーザービームの測定値が含まれています。このブレードがゆっくりと下がり、光の強度が測定されます。txt ファイルの測定値を使用してレーザービームの幅を計算するプログラムを作成する必要があります (式は、(((0,9*max)-(0,1*max))/1,28 で与えられています)。 )。

しかし、関数なしでこれを行うと、うまく機能します。しかし、このプログラムにはいくつかの要求があります。関数を使用する必要があります。私のプログラムは少しずさんだと思うかもしれませんが、それは主に、私がこのようにしなければならないからです。何かがわかりにくい場合は、さらに説明を求めてください。すぐに説明します。

これは私の現在のプログラムです:

#include <stdio.h>
#define ROW 45
#define COLUMN 2

  FILE *measurements;
  float x,width, intensity, a[ROW][COLUMN]={0}, total_2 = 0, maximum = 0;
  float max = 0, min = 0, difference_1 = 0, difference_2 = 0, w = 0;
  float background=0, amount=0, total_1=0;
  int menu=0, check_1 = 0, check_2 = 0, min_2 = 0, max_2 = 0;

  //Functions
  float background_radiation(float a[ROW][COLUMN]);
  float average_maximum(float a[ROW][COLUMN]);
  float beam_width(float a[ROW][COLUMN], float maximum);

//Integers for loops
  int i = 0, r = 0, k = 0, d = 0;

main()
{
  measurements = fopen("PATH\\TO\\TEXT\\FILE\\.txt", "r");
  rewind(measurements);

//Menu
  printf("Menu: \n\n");
  printf("1. Calculate background_radiation: \n");
  printf("2. Calculate average maximum signal: \n");
  printf("3. Calculate beam width: \n");
  printf("4. All measurements: \n");
  printf("5. Quit \n\n");
  printf("\nChoose:\n");

  scanf("%d", &menu);
  rewind(measurements);

//All data in array
  while(!feof(measurements))
  {
      for(i=0; i<45; i++)
      {
          fscanf(measurements, "%f%f", &a[i][0], &a[i][1]);
      }
  }

//Menu loop 
 while (menu!=5)
 {        
        switch(menu)
        {
                    case 1: printf("\n------ background_radiation ------ \n");
                            //case check
                            check_1 = 1;

                                     x= background_radiation(a);
                                     for(i=0; i<45; i=i+1)
                                     {
                                              a[i][1]=a[i][1]-x;
                                     }             
                            break;

                    case 2: printf("\n------ Maximale signaal ------ \n");
                            //case check
                            check_2 = 1;

                            y = average_maximum(a);

                            break;

                    case 3: printf("\n------ beam_width ------ \n");
                            //check if the cases 1 and 2 are used
                            if(check_1 == 1 && check_2 == 1)
                            {
                                z = beam_width(a, y);
                            }                      

                            else
                            {
                                //If case 1 and 2 aren't used
                                     printf("The backgroundradiation and maximum output aren't calculated\n");

                                     printf("You have 2 options:\n");
                                     printf("1. Use the first and last measurements to calculate the beamwidth.\n");
                                     printf("2. Choose an other option of the menu.\n");
                                     scanf("%d", &d);
                                  //Print the beam width
                                     if(d==1)
                                     {
                                             printf("\nBeamwidth:\t%f mm", ((a[0][44]-a[0][0])/1.28));
                                     }
                            }
                             break;

                    case 4: printf("\n------------ Measurements ------------\n\n");
                            rewind(measurements);
                            while(!feof(measurements))
                            {
                                  fscanf(measurements, "%f%f", &a[i][0], &a[i][1]);
                                  printf("\t%2.2f mm\t\t%2.2f V\n", a[i][0], a[i][1]);
                            }
                            break;
        }
        rewind(measurements);
        printf("\n\nChoose an option: ");
        scanf("%d", &menu);
}

fclose(measurements);
return 0;
fflush(stdin);

}

float background_radiation(float a[ROW][COLUMN])
{ 
      printf("\nHow many numbers would you like to take an average?\n");
      scanf("%d", &amount);

      for(i=0; i<amount; i++)
      {
          total_1 = total_1 + a[i][1];
      }

      //Calculate average
      background = total_1 / amount;
      printf("\nThe average background_radiation:\n%2.2f\n", background);

      return(background);                                 
}

float average_maximum(float a[ROW][COLUMN])
{      
      printf("\nHow many numbers would you like to take an average?\n");
      scanf("%d", &amount);

      for(i=44; i>(44-amount); i--)
      {
          total_2 = total_2 + a[i][1];
      }

      //Calculate average
      maximum = total_2 / amount;
      printf("\nAverage maxixum signal:\n%2.2f\n", maximum);
      return(maximum);
}

float beam_width(float a[ROW][COLUMN], float y)
{
    max = 0.9 * y;
    min = 0.1 * y;

    //Find a point in array
    for(r=0; r<45; r++)
    {
        difference_1 = max - a[r][1];
        if ((difference_1 < difference_2) && difference_1 > 0)
        {
         max_2 = r;
        }
        difference_2 = difference_1;
    }

    difference_2 = 100;

    for(k=0; k<45; k++)
    {
        difference_1 = min - a[k][1];
        if (difference_1 < difference_2 && difference_1>0)
        {
           min_2 = k;
        }
        difference_2 = difference_1;
    }

    //calculate width with the given formula
    w = (a[max_2][0] - a[min_2][0]) / 1.28;
    printf("\nBeamwidth:\t%2.2f", w); 
    return(w);          
}

テキスト ファイルは 2 列 45 行で構成されます。最初の列は、ブレードの高さです。0 の場合は、ブレードがビームを完全にブロックしていることを意味します。2 番目の列は光の強度です。センサーの周囲の光 (背景放射) により、常に値を持ちます。テキストファイルは次のとおりです。

0.00 0.25
0.10 0.20
0.20 0.18
0.30 0.21
0.40 0.23
0.50 0.30
0.60 0.30
0.70 0.40
0.80 0.50
0.90 0.80
1.00 1.30
1.10 1.80
1.20 2.30
1.30 3.80
1.40 4.50
1.50 6.30
1.60 8.04
1.70 10.55
1.80 13.10
1.90 16.20
2.00 19.80
2.10 22.56
2.20 25.10
2.30 29.90
2.40 31.20
2.50 33.44
2.60 36.80
2.70 41.05
2.80 40.83
2.90 43.40
3.00 44.44
3.10 44.90
3.20 45.40
3.30 46.00
3.40 46.30
3.50 46.50
3.60 46.60
3.70 46.50
3.80 46.35
3.90 46.40
4.00 46.60
4.10 46.30
4.20 46.00
4.30 45.90
4.40 46.00

最初に 2 列目が下がっているのはおかしいと思うかもしれませんが、これは測定の精度に関係しています。

本当にありがとうございます!

何が機能していませんか?:

すべての関数 (background_radiation、average_maximum、beam_width) は機能しません。

ケース 1 の出力は (常に):
1.#J

ケース 2 の出力 (常に):
0.00 ケース 1 と 2 が使用されている場合

のケース 3 の出力: 0.00 それ以外の場合は正常に 動作します。





4

2 に答える 2

0

ケース 1 は を呼び出しませんbackground_radiation()

この線 :

float background_radiation(a);

background_radiation という関数の (再) 宣言です。コンパイラで警告をオンにすると、警告が表示されます。あなたはおそらく次のことを意味していました:

background_radiation(a);

他にもバグがあるかもしれません。

于 2013-10-16T11:28:13.093 に答える
0

yおよびzが定義されていない場合、このコードはコンパイルされません。これらの変数の前に追加floatし、これを実行するパスを変更すると、次のエラーが見つかりました。

まず、データの読み込みにa失敗しました:

a[ROW][COLUMN] = {0}

ガベージ配列が生成されたので、初期化を削除して、次のものを取得しました。

a[ROW][COLUMN]

データのロードが機能するようにします。

amount次の問題は、float と int の両方として扱いたいということです。background_radiation() で、ループ用に追加の引数を作成し、scanf() を変更しました。

scanf("%f", &amount);

int max = (int)amount;
for(i=0; i<max; i++)

フロートに「12.0」と入力すると、これらの変更の後amount、次の出力が得られます。

------ background_radiation ------ 

How many numbers would you like to take an average?
12.0

The average background_radiation:
0.54

average_maximum() も同様に機能させることができます。beam_width() は、おそらくデータ ロードの問題に悩まされていました。それは私にとってはうまくいくように見えました。

于 2013-10-16T13:36:25.643 に答える