[英]Finding the Min/Max value within a Struct
所以我打開了一個 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);
問題的最終代碼塊中的整個代碼可以移動到一個函數中。 該函數的參數將是指向結構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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.