gpt4 book ai didi

c - 如何使用数组汇总数据列表

转载 作者:行者123 更新时间:2023-11-30 19:15:03 26 4
gpt4 key购买 nike

这是我的第一门编程课。到目前为止,我们仅完成了条件语句,循环以及文件输入和输出。我不确定如何解决这个问题。我们之前所做的一切都非常简单。我相信我必须用于2D数组的循环。

分配说明:https://gist.github.com/anonymous/e9292f14b2f8f71501ea
数据列表:https://gist.github.com/anonymous/e50fbf84fd74b355df07

我必须询问用户最高和最低温度,然后使用数据表文件打印出每个月的温度以及该范围内下降的天数百分比。之后,我必须让程序打印出建议,以选择百分比最高的月份。我知道这部分需要一个for循环。

到目前为止,我的代码仅具有printf和scanf来询问用户最低温度和最高温度。任何帮助或建议,有关如何设置此设置。
我也想知道这是否仍然很基本,因为我感到迷路了。

最佳答案

首先,C可能有点让人不知所措,但是对于任何语言,尤其是C,您都可以将任务分解为尽可能小的片段,然后研究该语言提供的工具来完成您需要做的事情。正如评论中正确提到的那样,您的任务是基本上从数据文件中读取值并计算每个月可用于您的温度范围的飞行天数的百分比。

这是否意味着这将是一项轻松的任务-不-故意如此。这是一个很好的作业,可以使您学习C的基础知识,基本的文件I / O,循环以及基本的数组索引处理。当您的作业说:

查看需求和数据

数组不是必需的(输入文件的名称除外),但可以简化您的解决方案。

简化这个词应该使您摆脱暗示。为什么会给出提示?这是什么意思?与任何项目一样,您必须分析数据和需求,以找出解决问题的方式以及选择的方法。仔细看一下分配,您将看到您的数据文件包含按行逐日排列的2年数据。要求希望您使用这两年的数据来计算任意给定月份的TOTAL天总数中良好飞行天数的百分比。

考虑选项

没有数组,您将如何处理它?如果您只是将最佳百分比和最佳月份存储在本地变量中,则必须阅读整个文件以计算每个月涉及的百分比。这意味着您将必须读取文件12次以计算最大百分比,设置最佳月份并在所有12个月之间进行比较。

如果使用数组,您将如何处理?那么,您需要什么信息来计算每月飞行天数的百分比?一个月的总天数,以及每个月的飞行天总数(在低温/高温范围内)。

通过实施思考

您知道只有12个月,因此,如果您有一个包含12个元素的数组,则可以表示该数组的每个元素每个月的可用天数(0-11-但请注意:月份编号为1-12 [1月-12月]。然后,如果您每个月保留另一个由12个元素组成的飞行天数数组,则可以根据存储在2个简单的12元素一维数组中的数据进行所有计算。最好的部分是您可以一次通过数据文件填充两个数组。

您如何计算每个月在阵列插槽中的天数?好吧,如果您将所有数组元素初始化为0,则可以为从文件中读取的每一天和每一天的每个元素简单地添加1(将该行的月份作为每一行的第一个数字读取)您读了每一行(将月份读入m),则可以对文件的每一行执行类似totaldays[m] = totaldays[m] + 1;(或只是totaldays[m]++;)的简单操作。您可以使用简单的温度测试,并且如果您在生产线上读取的温度介于您的低/高飞行温度之间,则可以类似地执行flyingdays[m]++;。一次读取整个文件后,您将同时填充两个数组,一个数组保存每个月的总天数,另一个数组保存每个月的总飞行天数。

(注意:同样,数组索引是0-11(用于12个元素),而月份是1-12,因此您确实需要totaldays[m-1]++;flyingdays[m-1]++;之类的东西。)

然后,要完成计算,您可以使用for (m = 0; m < 12; m++)这样的简单循环并计算每个月的飞行天数百分比,并保留2个简单变量(一个maxpercent,另一个bestmonth),待您测试对每个月进行计算,以最终得出您的首次飞行的最佳飞行月份。 (请记住,如果要循环播放0-11,则您的月份现在将是m + 1,以存储在bestmonth中,依此类推。

最后(这应该始终是第一位,但在本说明中已落在此处),您必须为每个变量选择存储的type。现在,当您开始为变量选择存储type时,应该始终牢记这一点,但是您也可以随时进行微调。因此,如果您还不熟悉它,那么不要一开始就过于担心它,只要数据适合,就可以使用intunsigned int粗略输入类型,并获取数据随着您的经验的增长,会更加努力地看待它。

好的,如何?每次都使用相同的方法,根据需要存储的大小(或值的范围)来匹配存储。如果您的月份仅在1-12之间,您是否真的需要一个完整的unsigned int(范围为0 - 4294967295)来存储这些值?一个月可以是负数吗?如果不是,为什么要使用带符号的int来保存值? (有正当的理由,只不过不在这里)那么合适的最小unsigned type是多少? unsigned char所保存的值范围为0 - 255,因此可以肯定的是...

原型

既然您已经解决了程序要求,查看了数据的值,并思考了代码需要执行的逻辑,那么现在该换起键盘了。查看您的构想,您将获得类似于以下内容的内容:

#include <stdio.h>

int main (void) {

/* declare & initialize variables */
/* (hint) */
unsigned char totaldays[12] = {0};
unsigned char flyingdays[12] = {0};


/* prompt for input of t_low/t_high and filename */

/* open file */

/* read totaldays and flyingdays into array */
/* (hint at an efficient way below) */
while (fscanf (fp, "%hhu %hhu %hu %f", &m, &d, &y, &t) == 4) {

}

/* close file */

/* loop though each month and compute percentage, test for max,
set best month, print totals statistics for that month */
/* (hint) */
for (m = 0; m < 12; m++) {

}

/* finally print best month for maiden flight */

return 0;
}


验证

完成代码,并验证您的输出是否与分配给 low = 60high = 80的解决方案相匹配。如果您遇到问题,请告诉我,我们很高兴与您进一步合作。

多一点解释

首先,对于读取循环(有点 fscanf逻辑),如果查看数据文件,则可以读取月份 m,日期 d,年份 y,然后读取temp t如果需要,将其转化为值。即声明了以下内容:

unsigned char  mbest, m, d, tl, th;
unsigned short y = 0;
float maxpct = 0.0, t = 0.0;


但是,如果仔细查看需要执行的操作,则在任何计算中都不会使用日期 d或年份 yscanf函数允许您使用 %*u读取和丢弃值(其中 u可以是任何类型说明符,例如 d表示 intc表示 char等),而无需添加到返回值(或 scanf函数返回的成功匹配计数)。因此,您无需声明并阅读 dy,而无需使用它们并使用:

unsigned char  mbest, m, tl, th;
float maxpct = 0.0, t = 0.0;
...
while (fscanf (fp, "%hhu %*u %*u %f", &m, &t) == 2)


只需从每一行中拾取 mt即可得到 2的总收益(或匹配计数)。在这种背景下,您的读取循环可能类似于:

    /* read all values from file, update both arrays 
NOTE: array[0] holds month 1 data
adjust array index as needed */
while (fscanf (fp, "%hhu %*u %*u %f", &m, &t) == 2)
{
totaldays[m-1]++; /* increment number of days for month m */

if (tl <= t && t <= th)
flyingdays[m-1]++; /* increment flying days in month m */
}


请注意,由于我们首先将数组值初始化为 zero,所以当我们为任何给定月份( m-1数组索引)增加值时,我们只会将该月的计数加1。

现在开始您的计算循环。有了总天数和飞行天数,您现在可以逐步检查阵列,并轻松计算出每个月的百分比,类似于:

    for (m = 0; m < 12; m++)
{
float pct = (float)flyingdays[m]/totaldays[m] * 100; /* compute percent */

if (pct > maxpct) { /* if greater than max, update max & mbest */
maxpct = pct;
mbest = m + 1;
}

printf ("Month %2hhu: %5.1f percent of days in range.\n", m + 1, pct);
}


注意:上面的 printf将输出对齐的略好于您的要求。如果要完全匹配您的分配输出,可以使用:

 printf ("Month %hhu: %.1f percent of days in range.\n", m + 1, pct);


现在,考虑到可以正常工作,并且考虑到您已经花了很多时间进行这项工作,我敢打赌,您应该能够完成其余工作。如果没有,请再发表评论,我们将为您解决。

所有拼图

有时确实有助于了解如何将拼图的所有部分组合在一起。在C语言中,几乎所有事情都可以做很多事情,所以这只是一种方法:

#include <stdio.h>

int main (void) {

/* declare & initialize variables */
char iname[31] = {0};
unsigned char totaldays[12] = {0};
unsigned char flyingdays[12] = {0};
unsigned char mbest, m, tl, th; /* types match size of data held */
float maxpct = 0.0, t = 0.0;
FILE *fp = NULL;

mbest = m = tl = th = 0;

/* prompt for input of t_low/t_high and filename */
printf ("Tell me about your dragon’s preferred temperature for flying:\n"
"What is the coldest temperature they can fly in?\n");
scanf ("%hhu", &tl);

printf ("What is the hottest temperature they can fly in?\n");
scanf ("%hhu", &th);

printf ("Please enter the name of the weather data file for Dragon Island.\n");
scanf (" %30[^\n]%*c", iname); /* limit name to 30 chars */

/* open file, or exit */
if (!(fp = fopen (iname, "r"))) {
fprintf (stderr, "error: file open failed '%s'.\n", iname);
return 1;
}

/* read totaldays and flyingdays into arrays
NOTE: array[0] holds month 1 data
adjust array index as needed */
while (fscanf (fp, "%hhu %*u %*u %f", &m, &t) == 2)
{
totaldays[m-1]++; /* increment number of days for month m */

if (tl <= t && t <= th)
flyingdays[m-1]++; /* increment flying days in month m */
}

/* close file */
fclose (fp);

/* loop though each month and compute percentage, test for max,
set best month, print totals statistics for that month */
for (m = 0; m < 12; m++)
{
/* compute percent */
float pct = (float)flyingdays[m]/totaldays[m] * 100;

if (pct > maxpct) { /* if greater than max, update max & mbest */
maxpct = pct;
mbest = m + 1;
}

printf ("Month %2hhu: %5.1f percent of days in range.\n", m + 1, pct);
}

/* finally print best month for maiden flight */
printf ("I recommend month %hhu for the Celebration of the First Flight!\n",
mbest);

return 0;
}


输出量

$ ./bin/dragonflight
Tell me about your dragon’s preferred temperature for flying:
What is the coldest temperature they can fly in?
60
What is the hottest temperature they can fly in?
80
Please enter the name of the weather data file for Dragon Island.
island.txt
Month 1: 66.1 percent of days in range.
Month 2: 71.4 percent of days in range.
Month 3: 72.6 percent of days in range.
Month 4: 98.3 percent of days in range.
Month 5: 95.2 percent of days in range.
Month 6: 48.3 percent of days in range.
Month 7: 48.4 percent of days in range.
Month 8: 11.3 percent of days in range.
Month 9: 63.3 percent of days in range.
Month 10: 100.0 percent of days in range.
Month 11: 83.3 percent of days in range.
Month 12: 77.4 percent of days in range.
I recommend month 10 for the Celebration of the First Flight!


调试-最后一步

有很多方法可以调试程序。通常,当您关心值时,可以使用 printf转储中间值,也可以使用 gdb这样的调试器以这种方式查看值。为了达到目的,让我们看一些值。关闭文件后,只需添加几个循环和 printf。例如。:

fclose (fp);

for (m = 0; m < 12; m++)
printf (" totaldays[%2hhu] : %2hhu flyingdays[%2hhu] : %2hhu pct : %f\n",
m+1, totaldays[m], m+1, flyingdays[m],
(float)flyingdays[m]/totaldays[m] * 100);


输入验证温度后:

temp low  : 60
temp high : 80


当您查看每个数组中的中间值时,您应该看到:

 totaldays[ 1] : 62  flyingdays[ 1] : 41  pct : 66.129036
totaldays[ 2] : 56 flyingdays[ 2] : 40 pct : 71.428574
totaldays[ 3] : 62 flyingdays[ 3] : 45 pct : 72.580650
totaldays[ 4] : 60 flyingdays[ 4] : 59 pct : 98.333336
totaldays[ 5] : 62 flyingdays[ 5] : 59 pct : 95.161285
totaldays[ 6] : 60 flyingdays[ 6] : 29 pct : 48.333332
totaldays[ 7] : 62 flyingdays[ 7] : 30 pct : 48.387096
totaldays[ 8] : 62 flyingdays[ 8] : 7 pct : 11.290322
totaldays[ 9] : 60 flyingdays[ 9] : 38 pct : 63.333332
totaldays[10] : 62 flyingdays[10] : 62 pct : 100.000000
totaldays[11] : 60 flyingdays[11] : 50 pct : 83.333328
totaldays[12] : 62 flyingdays[12] : 48 pct : 77.419350


看看你有什么,让我知道。

关于c - 如何使用数组汇总数据列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33193323/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com