功能不起作用,因为我希望它们起作用(c)

时间:2013-10-16 10:40:24

标签: c function

我必须制作一个能读取.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);          
}

文本文件由两列和45行组成。第一列是刀片向下的高度。因此,如果它是0.这意味着刀片完全阻挡光束。第二列是光强度。由于传感器周围的光线(背景辐射),它总是有一个值。这是文本文件:

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

您可能认为第二列在开始时下降很奇怪,但这与测量的准确性有关。

非常感谢你!

什么不起作用?:

所有功能(background_radiation,average_maximum,beam_width)都不起作用。

案例1的输出是(总是):
1.#Ĵ

案例2的输出(总是):
0.00

案件3的输出 如果使用案例1和2:
0.00

否则
工作得很好

2 个答案:

答案 0 :(得分:0)

案例1从不致电background_radiation()

该行:

float background_radiation(a);

是一个名为background_radiation的函数的(重新)声明。 如果在编译器中打开警告,则会收到警告。你可能意味着:

background_radiation(a);

也可能存在其他错误。

答案 1 :(得分:0)

如果未定义yz,则无法编译此代码。在这些变量前面添加float并更改运行它的路径,我发现了以下错误:

首先,将数据加载到a对我来说失败了:

a[ROW][COLUMN] = {0}

生成了一个垃圾数组,所以我放弃了初始化以得到:

a[ROW][COLUMN]

允许数据加载工作。

下一个问题是您希望将amount视为float和int。在background_radiation()中,我为循环创建了一个额外的arg并更改了scanf():

scanf("%f", &amount);

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

如果我为amount浮点数输入“12.0”,那么在这些更改之后,我得到以下输出:

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

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

The average background_radiation:
0.54

average_maximum()可以类似地工作。 beam_width()可能遭遇数据加载问题。它看起来对我很好。