这是我的第一个编程课程。到目前为止,我们只完成了条件语句,循环和文件输入和输出。我很不确定如何解决这个问题。我们之前所做的一切都非常简单。我相信我必须使用带有2d数组的循环。
作业说明:https://gist.github.com/anonymous/e9292f14b2f8f71501ea 数据列表:https://gist.github.com/anonymous/e50fbf84fd74b355df07
我必须询问用户最高和最低温度,然后使用数据表文件打印出每月和该范围内下降的天数百分比。之后,我必须打印出一个建议来选择具有最高百分比的月份。我知道这部分需要成为一个for循环。
到目前为止,我的代码只有printf和scanf来询问用户最低温度和最高温度。任何有关如何设置的帮助或建议表示赞赏。 此外,我想知道这是否仍然被认为是非常基本的,因为我感到迷茫。
答案 0 :(得分:1)
这是否意味着它将是一个简单的任务 - 不 - 故意如此。这是一个很好的任务,让您学习C,基本文件I / O,循环和基本数组索引处理的基础知识。当你的作业说:
查看需求和数据
不需要数组(输入文件的名称除外),但可以简化您的解决方案。
简化这个词应该跳出那个暗示。为什么会给出这个暗示?这是什么意思?与任何项目一样,您必须分析数据和需求,以确定如何解决问题以及您的选择。仔细查看作业将显示您的数据文件包含按行排列的2年数据。这些要求要求您使用两年中达到百分比的数据计算任何给定月份的总飞行天数的良好飞行天数百分比。
考虑选项
如果没有数组,你会如何处理?如果您只想在本地变量中存储最佳百分比和最佳月份,则必须阅读整个文件以计算每个月所涉及的百分比。这意味着您必须读取文件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]++;
和{{} {1}})
然后,为了完成计算,您可以使用flyingdays[m-1]++;
这样的简单循环,计算每个月的飞行天数百分比,并保留2个简单变量(一个for (m = 0; m < 12; m++)
,另一个{{1在你为每个月进行计算之后,你将测试哪个最终到达你的处女航班的最佳飞行月份。 (请记住,如果您正在循环maxpercent
,您的月份现在将bestmonth
存储在0-11
等等。
最后(并且这应该始终是第一个,但是在此解释中它落在此处),您必须为每个变量选择m + 1
存储空间。现在,当您开始为变量选择存储bestmonth
时,这应该始终是您的想法,但它也可以随时进行微调。因此,如果您对它不熟悉,请不要在开始时过度担心它,只需粗略地使用type
或type
表示整数值,如果随着经验的增长,数据非常合适,并且会更加努力地看待它。
好了,怎么样?每次执行此操作的方式相同,您根据需要存储的大小(或值范围)匹配存储。如果您的月份仅在int
之间,那么您真的需要一个完整的unsigned 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 = 60
逻辑)用于您的阅读循环,如果查看数据文件,您可以阅读月份high = 80
,日fscanf
,年{ {1}},然后根据需要将值m
转换为值。这是通过以下声明:
d
但是如果你仔细看看你需要做什么,你就不会在任何计算中使用y
或年t
这一天。 unsigned char mbest, m, d, tl, th;
unsigned short y = 0;
float maxpct = 0.0, t = 0.0;
函数允许您使用d
读取和放弃值(其中y
可以是任何类型说明符,例如scanf
%*u
,u
} {for} d
等)没有将这些添加到返回(或int
函数返回的成功匹配计数)。因此,不要声明和阅读c
和char
,而不使用它们并使用:
scanf
只需从每一行中选择d
和y
即可获得unsigned char mbest, m, tl, th;
float maxpct = 0.0, t = 0.0;
...
while (fscanf (fp, "%hhu %*u %*u %f", &m, &t) == 2)
的总回报(或匹配计数)。在此背景下,您的读取循环可能如下所示:
m
注意,因为我们首先将数组值初始化为t
,当我们增加任何给定月份的值(2
数组索引)时,我们只是将数量加1一个月。
现在进行计算循环。拥有总天数和飞行天数,您现在可以逐步浏览阵列并轻松计算每个月的百分比,类似于:
/* 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
现在,考虑到工作,并且考虑到你已经花费了一天的工作,我敢打赌你应该能够完成剩下的工作。如果没有,请删除其他评论,我们会让您解除困境。
拼图的所有部分
有时它确实有助于了解拼图的所有部分如何组合在一起。在C语言中,总有很多方法可以做任何事情,所以这只是一种方法:
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);
转储中间值,也可以使用#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!
即可。 e.g:
printf
输入验证温度:
gdb
当您查看每个数组中的中间值时,您应该看到:
printf
看看你有什么,让我知道。