2015-03-17 5 views
-2
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> /* to initialize your random generator */ 
#define BUFF_SIZE 10 
#define FIVE 5 
#define TEN 10 
#define ZERO 0 
#define ONE 1 
float min=0; 
float max=0; 
float average=0; 
float input_buffer[BUFF_SIZE+2] = {0}; 
float output_buffer[FIVE] = {0}; 
float local_buffer[TEN]; 
int no_of_data_pts=0; 
int function_id=0; 

// a function for generating data size, function ID and 
// all data, and putting all of it into input_buffer 
void generate_data() { 
    /* initialize random seed: */ 
    srand (time(NULL)); 
    /* Generate a random number: */ 
    input_buffer[0] = floor(1 + 10*(float)rand()/RAND_MAX); 
    input_buffer[1] = floor(1 + 4*(float)rand()/RAND_MAX); 
    int i; 
    for (i=0; i < (int)input_buffer[0]; i++){ 
     input_buffer[i+2]=(float)rand()/RAND_MAX; 
    } 
} 

// a function for copying the content of input_buffer into 
// local buffer (called here my_buffer) 
void reading() { 
    no_of_data_pts= (int)input_buffer[0]; 
    function_id= (int)input_buffer[1]; 
    int i; 
    for (i=0; i < no_of_data_pts; i++){ 
     local_buffer[i]=input_buffer[2+i]; 
    } 
} 

// a function for processing the content of local buffer; 
// it reads function_ID and number of data points from my_buffer 
// and saves the results also into my_buffer 
void processing() { 
    float num=0; 
    int i; 
    float sum = 0; 
    float min=0; 

    for (i=0; i<no_of_data_pts; i++){ 
     num = local_buffer[i+1]; 
     if (num < min) { 
      min=num; 
     } 
    } 

    for (i=0;i<no_of_data_pts;i++){ 
     num = local_buffer[i+1]; 
     if (num < max) { 
      max=num; 
     } 
    } 

    for (i=0;i<no_of_data_pts;i++) { 
     sum = sum + local_buffer[i]; 
    } 
    average = sum/no_of_data_pts; 
} 

// a function for copying the content of my_buffer to the 
// output_buffer (according to the patter explained earlier) 
void writing() { 
    switch (function_id){ 

     case 1: 
      output_buffer[0]= min; 
      printf ("Minimum value is: %f ",output_buffer[0]); 
      break; 
     case 2: 
      output_buffer[0]= max; 
      printf ("Maximum value is: %f ",output_buffer[0]); 
      break; 
     case 3: 
      output_buffer[0]= average; 
      printf ("Average value is: %f ",output_buffer[0]); 
      break; 
     case 4: 
      output_buffer[0]= min; 
      output_buffer[1]= max; 
      output_buffer[2]= average; 
      printf ("Minimum, maximum and average value is: %f,%f,%f ",output_buffer[0],output_buffer[1],output_buffer[2]); 
      break; 
    } 


} 

int main() { 
    setvbuf(stdout, NULL, _IONBF, 0); 
    setvbuf(stderr, NULL, _IONBF, 0); 
    generate_data(); 
    reading(); 
    processing(); 
    writing(); 
    return 0; 
} 

Так что это назначение C.Почему я получаю значение 0 для моего min и max?

Поэтому, когда я запускаю этот код, он должен генерировать некоторые случайные числа от 0 до 1 и вычислять min, max и average.

Считывание данных из входного буфера включает в себя:

  • чтение числа от первого элемента входного буфера, если это ненулевое числа (и это должно быть), программа выполняет две следующие операции, это число представляет собой число точек данных для чтения (no_of_data_points)
  • чтения идентификатора функции обработки (function_ID)
  • чтения всех точек данных идентификатора функции обработки данных и все точки считывается в локальный буфер

Обработка данных включает в себя:

  • на основе считывания ID функции обработки конкретные расчеты выполняются, четыре различных обработки может иметь место:
  • , если идентификатор 1: минимум точек данных определяется
  • , если идентификатор 2: максимальное количество точек данных определяется
  • , если идентификатор 3: среднее значение точек данных определяется
  • , если идентификатор 4: минимум, макси мама и среднее количество точек данных результаты должны быть помещены в локальный буфер.

записи данных в выходной буфер включает в себя:

  • писать число, указывающее, сколько точки данных записываются в выходной буфера (она включает в себя идентификатор функции обработки, и полученные результаты)
  • писать номер, называемый идентификатором функции обработки, указывающий, какая операция была выполнен на данных (диапазон от 1 до 4)

  • листа ING результат, и это зависит, какие функции это было:

§, если идентификатор 1: значение минимума записывается

§, если идентификатор 2: значение максимума записывается

§ если идентификатор 3: среднее значение записывается

§, если идентификатор 4: значений минимального, максимального и средние написано

Я затем распечатать результаты в самом конце программы ,

Код работает нормально. Ошибок нет, но почему-то я НЕ МОГУ понять, почему значения min и max всегда равны 0! Мое значение для среднего - это хорошо, но мои значения max и min всегда по какой-то причине 0, и это неправильно.

+3

1) Не могли бы вы выслать здесь код? 2) 'Title' для ___Title___. Не предназначено для написания __body__. –

+1

Добро пожаловать в StackOverflow. Мы не можем вам помочь, если вы не предоставляете свой код, в частности, часть, которая не работает для вас. – mjuarez

+0

Я не могу отформатировать его должным образом. Я прикрепил ссылку. –

ответ

5

Для начала, это

if (num < max) { 
     max = num; 
    } 

должен быть

if (num > max) { 
     max = num; 
    } 

по крайней мере.


Кроме того, используя вышеупомянутый подход с инициализацией min и max в 0 не может работать для любого типа ввода.

Чтобы быть уверенным, чтобы обнаружить все Каковы возможности ввода Initialise

min = FLT_MAX; 

и

max = -FLT_MAX; 

Если наименьшие/наибольшие возможные значения неизвестны какой-либо причине, изменить способ, как min и max:

void processing() { 
    float num=0; 
    int i; 
    float sum = 0; 

    min = local_buffer[1]; 
    for (i = 1; i < no_of_data_pts; i++){ 
    num = local_buffer[i + 1]; 
    if (num < min) { 
     min = num; 
    } 
    } 

    max = local_buffer[1]; 
    for (i = 1; i < no_of_data_pts; i++){ 
    num = local_buffer[i + 1]; 
    if (num > max) { 
     max = num; 
    } 
    } 

    ... 

Также^2 код определяет min дважды:

  1. глобально
  2. локальными для processing(), слежка 1.

Удалить определение 2-й .


Код пропускает protoype floor(). Вот почему компилятор предполагает, что он возвращает int. Это может вызвать неопределенное поведение.

Чтобы исправить это добавить

#include <math.h> 

Также^3 при считывании local_buffer в processing() код использует неправильную индексацию. Индекс начинается с 0 не в 1. Поэтому он всегда считывает последнее значение, которое не было задано генератором. Это, наконец, 0 для min.

исправляющих это сделало бы выше фрагмент из processing() выглядеть следующим образом:

void processing() { 
    float num=0; 
    int i; 
    float sum = 0; 

    min = local_buffer[0]; 
    for (i = 1; i < no_of_data_pts; i++){ 
    num = local_buffer[i]; 
    if (num < min) { 
     min = num; 
    } 
    } 

    max = local_buffer[0]; 
    for (i = 1; i < no_of_data_pts; i++){ 
    num = local_buffer[i]; 
    if (num > max) { 
     max = num; 
    } 
    } 

    ... 

Заключительные замечания:

  1. Слушайте свой компилятор, принять его предупреждения серьезно.
  2. Возможно, вы захотите принять во внимание, как использовать отладчик, чтобы иметь возможность самостоятельно определять такие проблемы в следующий раз.
+0

упс! Спасибо за это. –

+0

Это позаботится о макс. Как насчет мин? –

+0

Очевидно, FLT_MAX или FLT_MIN не распознаются. –

Смежные вопросы