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