C 结构测量和最小、最大和平均温度搜索

C 结构测量和最小、最大和平均温度搜索,c,C,我得写一个程序来记录测得的温度, 可以在其中输入新测量值,或显示根据以前测量值计算的统计数据。在打印统计数据的情况下,有必要查找并显示记录的最低和最高温度,并计算平均温度 #include <stdio.h> int least_in_array(int array[], int n) { int i, least=array[0]; for(i=0; i<n; i++) { if(array[i]<least)

我得写一个程序来记录测得的温度, 可以在其中输入新测量值,或显示根据以前测量值计算的统计数据。在打印统计数据的情况下,有必要查找并显示记录的最低和最高温度,并计算平均温度

#include <stdio.h>

int least_in_array(int array[], int n)
{
    int i, least=array[0];
    for(i=0; i<n; i++)
    {
        if(array[i]<least)
        {
            least=array[i];
        }
    }
    return least;
}

int largest_in_array (int array[], int n)
{
    int i, largest=array[0];
    for(i=0; i<n; i++)
    {
        if(array[i]>largest)
        {
            largest=array[i];
        }
    }
    return largest;
}

float average_array(int array[], int n)
{
    int amount=0, i;

    for(i=0; i<n; i++)
    {
        amount+=array[i];
    }
    return (1.0*amount)/n;
}


int main() {

    int choose;

    struct Data1 {
        int dayInMonth;
        int month;
        float temperature;
    } da;

    printf("New measurement(1) or statistic(2)?\n");
    scanf("%d", &choose);

    if(choose==1) {

        printf("Enter the day in month : ");
        scanf("%d", &da.dayInMonth);
        printf("Enter month : ");
        scanf("%d", &da.month);
        printf("Enter temperature (*C) : ");
        scanf("%f", &da.temperature);

        printf("Data saved!");
        printf("-----------\n");

        return 0;
    }

    if(choose==2) {

        //printf("Least temperatures in quarter: %d",   least_in_array(dayInMonth) );

        return 0;
    }

    else {

        printf("----------------\n");
        printf("Wrong choose!\n");

    }

    return 0;
}
#包括
数组中的最小整数(整数数组[],整数n)
{
int i,最小值=数组[0];

因为(i=0;i既然是平安夜,让我们来帮助那些显然急需帮助的人吧。对于那些应该把
数组
传递到
最小数组
最大数组
平均数组
的代码,你没有数组!这在某种程度上把你从“开始”这个词推到了八个球的后面

您使用
stuct
捕获和协调
dayInMonth
month
temperature
的想法是100%正确的。(注意:C样式通常避免使用
camelCase
变量名,而使用所有小写字母)。此外,在
main()中定义
struct Data1
防止您在该点以上的函数知道什么是
struct Data1
,因此您需要将结构定义移到文件的顶部。(或者提供一个向前声明,但我们将保存该声明供以后使用)现在,让我们将
Data1
移到顶部(我使用了
typedef
,以减轻每次使用时都必须以
stuct
作为前缀,并重命名为
Data1
data

#define NDAYS 365

typedef struct {
    int day,
        month;
    double temperature;
} data;
注意定义的常量
NDAYS
。既然您需要一个数组,而且动态分配和重新分配的方法似乎远远超出了您的需要,那么让我们为数组中的元素数量定义一个常量,一个最大值

现在,在我们进一步讨论之前,让我们考虑一下我们的数组。如果我们要使用一个
struct
来保存相关的日期和温度测量值,那么我们需要一个数组…什么?一个
struct
数组。使用常量
NDAYS
,我们将在数组中声明最多
365
个元素是的。那么这将如何工作呢?我们的stuct类型定义为
数据
,因此如果我们想要一个
数据
数组,我们需要:

    data da[NDAYS] = {{0, 0, 0.0}};
注意:由于不清楚是否可以使用C89编译器.C99以及后来添加的命名初始值设定项(例如,
{{.day=0}}
和任何未初始化的元素隐式初始化为零),因此使用了初始化每个字段的旧初始值设定项格式

现在我们有了一个
数据数组
,可以捕获测量值。当然,您有责任跟踪您填写的索引。您只需要一个简单的计数器,每次成功输入测量值时递增(
ndx
,下面使用)

我们如何使
数组中最小的
数组中最大的
平均数组
数据数组
一起工作?回想一下,我们将结构的定义移到了源文件的开头,所以现在每个函数都知道
数据是什么。我们只需要将
数据数组作为一个参数传递米,例如

float least_in_array (data *array, int n)
{
    int i;
    float least = INT_MAX;   /* sufficiently high temp */

    for (i = 0; i < n; i++)
        if (array[i].temperature < least)
            least = array[i].temperature;

    return least;
}
要要求用户输入
int
float
,只需验证返回值,检查成功转换的次数(什么
scanf
返回),检查用户是否生成了
EOF
,如果提供了无效的输入并且
empty\u stdin
为空,则最后根据需要处理错误。您通常希望循环,直到用户提供有效输入或取消(无效输入对您没有好处)

例如,获取整数输入可以按如下方式处理。(注意:我将它放在一个函数中,以防止在代码主体中获取的每个输入都重复此代码块。)

/** abbreviated function to read integer value from user.
 *  returns value on success, exits if user cancels.
 *  empties stdin after call to scanf.
 */
int getint ()
{
    int n = 0;

    for (;;) {              /* loop until valid input or EOF */
        int rtn = 0;        /* variable to capture return of scanf */
        rtn = scanf ("%d", &n);
        if (rtn == 1) {     /* we got an integer */
            empty_stdin();
            break;
        }
        else if (rtn == EOF) {  /* if user cancels, exit */
            fprintf (stderr, "user canceled input.\n");
            exit (EXIT_FAILURE);
        }
        if (rtn == 0)       /* handle error */
            fprintf (stderr, "getint() error: invalid integer input.\n");

        empty_stdin();      /* empty all chars remaining in stdin */
    }

    return n;
}
(为浮点数获取输入的方式与此相同)

最后,您通常希望避免在大多数情况下使用
float
,而是使用
double
,这仅仅是因为精度损失和用
23位
尾数表示浮点数的限制。然而,这里我们考虑的是温度,并且
float
将满足此代码的要求

总之,您可以执行以下操作。注意,我将您的函数保留在
main()
之前,并在
main()
之后添加了助手函数定义,但在
main()
之前提供了声明,因此它们对
main()
可见:


仔细检查一下,如果你还有任何问题,请告诉我(尽管今晚我不会在这里呆太久了…)既然是平安夜,让我们帮助那些显然急需帮助的人吧。对于那些应该把
数组
传递给
最小数组
最大数组
平均数组
的代码,你没有数组!这多少让你落后于“开始”这个词的八个球

您使用
stuct
捕获和协调
dayInMonth
month
temperature
的想法是100%正确的。(注意:C样式通常避免使用
camelCase
变量名,而使用所有小写字母)。此外,在
main()中定义
struct Data1
防止您在该点以上的函数知道什么是
struct Data1
,因此您需要将结构定义移到文件的顶部。(或者提供一个向前声明,但我们将保存该声明供以后使用)现在,让我们将
Data1
移到顶部(我使用了
typedef
,以减轻每次使用时都必须以
stuct
作为前缀,并重命名为
Data1
data

#define NDAYS 365

typedef struct {
    int day,
        month;
    double temperature;
} data;
注意定义的常数
NDAYS
。因为您要去nee
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define NDAYS 365

typedef struct {
    int day,
        month;
    double temperature;
} data;

float least_in_array (data *array, int n)
{
    int i;
    float least = INT_MAX;   /* sufficiently high temp */

    for (i = 0; i < n; i++)
        if (array[i].temperature < least)
            least = array[i].temperature;

    return least;
}

float largest_in_array (data *array, int n)
{
    int i;
    float largest = INT_MIN; /* sufficiently low temp */

    for (i = 0; i < n; i++)
        if (array[i].temperature > largest)
            largest = array[i].temperature;

    return largest;
}

float average_array (data *array, int n)
{
    int i;
    float sum = 0.0;

    for (i = 0; i < n; i++)
        sum += array[i].temperature;

    return sum / (float)n;
}

void empty_stdin();
int getint();
float getfloat();

int main (void) {

    int ndx = 0;
    float max = 0.0, min = 0.0, avg = 0.0;
    data da[NDAYS] = {{0, 0, 0.0}};

    for (;;) {

        int choose = 0;

        printf ("\n  (1) New measurement\n"
                "  (2) Statistics\n"
                "  (3) Exit\n\n"
                "  choice: ");
        choose = getint();
        putchar ('\n');

        switch (choose) {
            case 1: if (ndx == NDAYS) {
                        fprintf (stderr, "error: array full.\n");
                        break;
                    }
                    printf ("    Enter day in month : ");
                    da[ndx].day = getint();
                    printf ("    Enter month        : ");
                    da[ndx].month = getint();
                    printf ("    Enter temperature  : ");
                    da[ndx].temperature = getfloat();
                    printf ("  da[%3d] saved\n"
                            "  ----------------------------\n", ndx++);
                    break;
            case 2: if (ndx == 0) {
                        fprintf (stderr, "error: no measurements taken.\n");
                        break;
                    }
                    min = least_in_array (da, ndx);
                    max = largest_in_array (da, ndx);
                    avg = average_array (da, ndx);
                    printf ("  minimum temp : %.2f\n"
                            "  maximum temp : %.2f\n"
                            "  average temp : %.2f\n"
                            "  ----------------------------\n",
                            min, max, avg);
                    break;
            case 3:
                    goto done;
                    break;
            default:
                    fprintf (stderr, "error: invalid choice.\n");
                    empty_stdin();
                    break;
        }
    }
    done:;

    return 0;
}

/** simple function to empty all characters that remain
 *  in stdin. Needed when using scanf for user input.
 */
void empty_stdin()
{
    int c = getchar();

    while (c != '\n' && c != EOF)
        c = getchar();
}

/** abbreviated function to read integer value from user.
 *  returns value on success, exits if user cancels.
 *  empties stdin after call to scanf.
 */
int getint ()
{
    int n = 0;

    for (;;) {              /* loop until valid input or EOF */
        int rtn = 0;        /* variable to capture return of scanf */
        rtn = scanf ("%d", &n);
        if (rtn == 1) {     /* we got an integer */
            empty_stdin();
            break;
        }
        else if (rtn == EOF) {  /* if user cancels, exit */
            fprintf (stderr, "user canceled input.\n");
            exit (EXIT_FAILURE);
        }
        if (rtn == 0)       /* handle error */
            fprintf (stderr, "getint() error: invalid integer input.\n");

        empty_stdin();      /* empty all chars remaining in stdin */
    }

    return n;
}

/** abbreviated function to read float value from user.
 *  returns value on success, exits if user cancels.
 *  empties stdin after call to scanf.
 */
float getfloat ()
{
    float v = 0.0;

    for (;;) {              /* loop until valid input or EOF */
        int rtn = 0;        /* variable to capture return of scanf */
        rtn = scanf ("%f", &v);
        if (rtn == 1) {     /* we got an float */
            empty_stdin();
            break;
        }
        else if (rtn == EOF) {  /* if user cancels, exit */
            fprintf (stderr, "user canceled input.\n");
            exit (EXIT_FAILURE);
        }
        if (rtn == 0)       /* handle error */
            fprintf (stderr, "getint() error: invalid float input.\n");

        empty_stdin();      /* empty all chars remaining in stdin */
    }

    return v;
}
$ ./bin/tempmxmnavg

  (1) New measurement
  (2) Statistics
  (3) Exit

  choice: 2

error: no measurements taken.

  (1) New measurement
  (2) Statistics
  (3) Exit

  choice: 1

    Enter day in month : 8
    Enter month        : 2
    Enter temperature  : 20.0
  da[  0] saved
  ----------------------------

  (1) New measurement
  (2) Statistics
  (3) Exit

  choice: 1

    Enter day in month : 9
    Enter month        : 2
    Enter temperature  : 30.0
  da[  1] saved
  ----------------------------

  (1) New measurement
  (2) Statistics
  (3) Exit

  choice: 1

    Enter day in month : 10
    Enter month        : 2
    Enter temperature  : 70.0
  da[  2] saved
  ----------------------------

  (1) New measurement
  (2) Statistics
  (3) Exit

  choice: 2

  minimum temp : 20.00
  maximum temp : 70.00
  average temp : 40.00
  ----------------------------

  (1) New measurement
  (2) Statistics
  (3) Exit

  choice: 3