简体   繁体   English

具有功能和结构的c数组

[英]c array with function and structures

I have to make c array through functions and structures. 我必须通过函数和结构来制作c数组。 But I am not sure, how should I do that. 但我不确定,该怎么做。 Could you give me some tips? 你能给我一些提示吗?

Here is my version without functions and structures. 这是我没有功能和结构的版本。

int main(int argc, char** argv) {

    int i;
    float max, min, sum;
    float numbers[10];

    for(i=0;i<10;i++)
    {
        printf("put numbers: ");
        scanf("%f",&numbers[i]);
    }

   for(i=0;i<10;i++)
        printf("%.2f \n ",numbers[i]);

    min = numbers[0];
    max = numbers[0];
    sum = 0;

    for(i=0;i<10;i++)
    {
        if(numbers[i]>max)
            max = numbers[i];
        if(numbers[i]<min)
            min = numbers[i];
        sum = sum + numbers[i];
    }

    printf("Minimum=%.2f; Maximum=%.2f; Prumer=%.2f",min,max,sum/10);

    return (EXIT_SUCCESS);
}
struct t_numbers {
  float max;
  float min;  
};

t_numbers num [10];

...
for (int i=0; i<10; i++) {
  num[i].max = 0;
  num[i].min = 0;
}

You must get the idea. 你必须明白这个主意。 ;-) Cheers ;-)干杯

Something like this... 像这样

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

typedef struct
{
    float max;
    float min;
    float avg;
} Result_t;

void ask_numbers(float *numbers, int nelem)
{
    int i;

    for(i=0;i<nelem;i++)
    {
        printf("put numbers: ");
        scanf("%f",&numbers[i]);
    }
}

Result_t calculate(const float *numbers, int nelem)
{
    int i;
    float sum = 0.0f;
    Result_t res = {0};

    res.min = numbers[0];
    res.max = numbers[0];

    for(i=0; i<nelem; i++) {
        if(numbers[i] > res.max)
            res.max = numbers[i];

        if(numbers[i] < res.min)
            res.min = numbers[i];

        sum += numbers[i];
    }

    res.avg = sum / nelem;

    return res;
}

int main(int argc, char** argv) {

    int i;
    float numbers[10];
    Result_t res;

    ask_numbers(numbers, 10);

    for(i=0;i<10;i++)
        printf("%.2f \n ",numbers[i]);


    res = calculate(numbers, 10);

    printf("Minimum=%.2f; Maximum=%.2f; Prumer=%.2f", res.min, res.max, res.avg);

    return(0);
}

On the second function, the struct could have been passed by pointers instead to be returned by copy. 在第二个函数上,该结构可能已通过指针传递,而不是通过复制返回。 But since the struct is small, the overhead is small. 但是由于结构很小,因此开销很小。

Cheers. 干杯。

Since you want an array of structs , you can create a singular struct holding one float member: 由于需要结构体数组 ,因此可以创建一个包含一个float成员的单一结构体:

typedef struct {
    float number;
} number_t;

Note: Having a struct with one member is awkward, but it will suffice for your needs. 注意:只有一个成员的struct很尴尬,但这足以满足您的需求。 It would be better to just declare a float array and have that in one struct, but that would not be an array of structs. 最好只声明一个float数组并将其包含在一个结构中,但这将不是结构数组。

You can then create an array of structs: 然后,您可以创建一个结构数组:

number_t numbers[10];

Which has 10 members of type number_t . 具有10个number_t类型的成员。 You can then have this array sit inside a larger struct which holds the max, min and average values: 然后,您可以将这个数组放在更大的结构中,该结构包含最大值,最小值和平均值:

typedef struct {
    number_t numbers[MAXNUM];
    size_t size;
    float max;
    float min;
    float avg;
} numbers_t;

You can then pass something like numbers_t N to main() , which declares a struct member of type numbers_t . 然后,您可以将numbers_t N类的numbers_t N传递给main() ,该函数声明一个numbers_t类型的结构成员。 This member holds the whole struct. 该成员拥有整个结构。

In order to modify the contents of N , you can simply pass a pointer to it, and change the contents by accessing the address of this pointer. 为了修改N的内容,您可以简单地向其传递一个指针,并通过访问该指针的地址来更改内容。

Additionally, it is always good to check result of scanf() , just to be safe. 另外,为了安全起见,最好检查一下scanf()结果。

Here is some example code: 这是一些示例代码:

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

#define MAXNUM 10

typedef struct {
    float number;
} number_t;

typedef struct {
    number_t numbers[MAXNUM];
    size_t size;
    float max;
    float min;
    float avg;
} numbers_t;

/* functions which pass pointer to N */
void initialize_struct(numbers_t *N);
void print_details(numbers_t *N);
void print_array(numbers_t *N);
void get_input(numbers_t *N);
void get_data(numbers_t *N);

int main(void) {
    numbers_t N;

    initialize_struct(&N);

    get_input(&N);

    get_data(&N);

    print_details(&N);

    return 0;
}

void print_details(numbers_t *N) {
    print_array(N);
    printf("\nMaximum: %.2f\n", N->max);
    printf("\nMinimum: %.2f\n", N->min);
    printf("\nAverage: %.2f\n", N->avg);
}

void print_array(numbers_t *N) {
    printf("\nYour numbers:\n");
    for (size_t i = 0; i < N->size; i++) {
        printf("%.2f\n", N->numbers[i].number);
    }
}

void get_input(numbers_t *N) {
    printf("Enter %zu numbers:\n", N->size);
    for (size_t i = 0; i < N->size; i++) {
        if (scanf("%f", &N->numbers[i].number) != 1) {
            printf("Invalid number entered\n");
            exit(EXIT_FAILURE);
        }
    }
}

void get_data(numbers_t *N) {
    float sum = 0.0f;
    N->max = N->min = N->numbers[0].number;

    for (size_t i = 1; i < N->size; i++) {
        if (N->numbers[i].number > N->max) {
            N->max = N->numbers[i].number;
        } else if (N->numbers[i].number < N->min) {
            N->min = N->numbers[i].number;
        }
        sum += N->numbers[i].number;
    }
    N->avg = sum / N->size;
}

void initialize_struct(numbers_t *N) {
    N->size = MAXNUM;

    for (size_t i = 0; i < N->size; i++) {
        N->numbers[i].number = 0.0f;
    }

    N->max = 0.0f;
    N->min = 0.0f;
    N->avg = 0.0f;
}

Example input: 输入示例:

Enter 10 numbers:
5.43
4.32
9.43
10.43
7.43
2.34
1.54
8.43
6.43
4.32

Output: 输出:

Your numbers:
5.43
4.32
9.43
10.43
7.43
2.34
1.54
8.43
6.43
4.32

Maximum: 10.43

Minimum: 1.54

Average: 5.47

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM