.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
それ以外の場合は正常に
動作します。