Нахождение минимального / максимального значения в структуре - PullRequest
0 голосов
/ 28 августа 2018

Итак, я открыл файл CSV и добавил его в структуру. Я хочу найти самое высокое / самое низкое значение в третьем столбце и самое высокое / самое низкое значение в четвертом столбце. Затем распечатайте каждую строку, где они встречаются.

typedef struct {
    float xvalue;
    float yvalue;
    float uvalue;
    float vvalue;
} flow_data;

Здесь добавляется файл CSV -

int total = 0;
flow_data d;
flow_data* dataset = NULL;

while(4 == fscanf(fp, "%f, %f, %f, %f\n", &d.xvalue, &d.yvalue, &d.uvalue, &d.vvalue))
{
    dataset = realloc(dataset, sizeof(*dataset) * (total + 1));
    dataset[total] = d;
    total++;
}

И операция, я знаю, что это нелепый способ делать вещи, но я не уверен, как сделать его более эффективным. Как бы я добавил все в функцию? Можете ли вы передать всю структуру в функцию?

float minvalueu = 100000, maxvalueu = 0;
float minvaluev = 100000, maxvaluev = 0;
int ivalueofminu = 0, ivalueofmaxu = 0;
int ivalueofminv = 0, ivalueofmaxv = 0;

for(int i = 0; i < total; i++)
{
    flow_data* p = &dataset[i];

    if ( p->uvalue > maxvalueu)
    {
        maxvalueu = p->uvalue;
        ivalueofmaxu = i;
    }

    if ( p->uvalue < minvalueu)
    {
        minvalueu = p->uvalue;
        ivalueofminu = i;
    }

    if ( p->vvalue > maxvaluev)
    {
        maxvaluev = p->vvalue;
        ivalueofmaxv = i;
    }

    if ( p->vvalue < minvaluev)
    {
        minvaluev = p->uvalue;
        ivalueofminv = i;
    }

    printf("%.7f, %.7f, %.7f, %.7f\n", p->xvalue, p->yvalue, p->vvalue, p->uvalue);
}

flow_data* z = &dataset[ivalueofmaxu];
printf("Max of U - %.7f, %.7f, %.7f, %.7f\n", z->xvalue, z->yvalue, z->vvalue, z->uvalue);

z = &dataset[ivalueofminu];
printf("Min of U - %.7f, %.7f, %.7f, %.7f\n", z->xvalue, z->yvalue, z->vvalue, z->uvalue);

z = &dataset[ivalueofmaxv];
printf("Max of V - %.7f, %.7f, %.7f, %.7f\n", z->xvalue, z->yvalue, z->vvalue, z->uvalue);

z = &dataset[ivalueofminu];
printf("Min of V - %.7f, %.7f, %.7f, %.7f\n", z->xvalue, z->yvalue, z->vvalue, z->uvalue);

1 Ответ

0 голосов
/ 28 августа 2018

Весь код в конечном кодовом блоке вопроса может быть перемещен в функцию. Параметрами функции будут указатель на структуру flow_data и количество элементов в массиве (total).
Функция будет выглядеть примерно так:

void findAndPrintMaxMinVals(flow_data* dataset, int total)

вызывается с main()

findAndPrintMaxMinVals(dataset, total)

Полный код ниже:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    float xvalue;
    float yvalue;
    float uvalue;
    float vvalue;
} flow_data;

void findAndPrintMaxMinVals(flow_data* dataset, int total)
{
    float minvalueu = 100000, maxvalueu = 0;
    float minvaluev = 100000, maxvaluev = 0;
    int ivalueofminu = 0, ivalueofmaxu = 0;
    int ivalueofminv = 0, ivalueofmaxv = 0;

    for(int i = 0; i < total; i++)
    {
        flow_data* p = &dataset[i];

        if ( p->uvalue > maxvalueu)
        {
            maxvalueu = p->uvalue;
            ivalueofmaxu = i;
        }

        if ( p->uvalue < minvalueu)
        {
            minvalueu = p->uvalue;
            ivalueofminu = i;
        }

        if ( p->vvalue > maxvaluev)
        {
            maxvaluev = p->vvalue;
            ivalueofmaxv = i;
        }

        if ( p->vvalue < minvaluev)
        {
            minvaluev = p->uvalue;
            ivalueofminv = i;
        }

        printf("%.7f, %.7f, %.7f, %.7f\n", p->xvalue, p->yvalue, p->vvalue, p->uvalue);
    }

    flow_data* z = &dataset[ivalueofmaxu];
    printf("Max of U - %.7f, %.7f, %.7f, %.7f\n", z->xvalue, z->yvalue, z->vvalue, z->uvalue);

    z = &dataset[ivalueofminu];
    printf("Min of U - %.7f, %.7f, %.7f, %.7f\n", z->xvalue, z->yvalue, z->vvalue, z->uvalue);

    z = &dataset[ivalueofmaxv];
    printf("Max of V - %.7f, %.7f, %.7f, %.7f\n", z->xvalue, z->yvalue, z->vvalue, z->uvalue);

    z = &dataset[ivalueofminu];
    printf("Min of V - %.7f, %.7f, %.7f, %.7f\n", z->xvalue, z->yvalue, z->vvalue, z->uvalue);  
}


int main() {    

    int total = 4; //total no of datasets for example
    int i;
    flow_data d;
    flow_data* dataset = NULL;

    dataset = (flow_data*)malloc(sizeof(flow_data) * total); //memory for 4 elements for testing

    //Generate values and fill in
    for(i = 0; i < total; i++) {
        dataset[i].xvalue = (i+1) * 7;
        dataset[i].yvalue = (i+1) * 8;
        dataset[i].uvalue = (i+1) * 9;
        dataset[i].vvalue = (i+1) * 10;
    }   
    findAndPrintMaxMinVals(dataset, total); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...