- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的第一门编程课。到目前为止,我们仅完成了条件语句,循环以及文件输入和输出。我不确定如何解决这个问题。我们之前所做的一切都非常简单。我相信我必须用于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
时,应该始终牢记这一点,但是您也可以随时进行微调。因此,如果您还不熟悉它,那么不要一开始就过于担心它,只要数据适合,就可以使用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
逻辑),如果查看数据文件,则可以读取月份
m
,日期
d
,年份
y
,然后读取temp
t
如果需要,将其转化为值。即声明了以下内容:
unsigned char mbest, m, d, tl, th;
unsigned short y = 0;
float maxpct = 0.0, t = 0.0;
d
或年份
y
。
scanf
函数允许您使用
%*u
读取和丢弃值(其中
u
可以是任何类型说明符,例如
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
的总收益(或匹配计数)。在这种背景下,您的读取循环可能类似于:
/* 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);
#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/
我正在尝试创建一个包含 int[][] 项的数组 即 int version0Indexes[][4] = { {1,2,3,4}, {5,6,7,8} }; int version1Indexes[
我有一个整数数组: private int array[]; 如果我还有一个名为 add 的方法,那么以下有什么区别: public void add(int value) { array[va
当您尝试在 JavaScript 中将一个数组添加到另一个数组时,它会将其转换为一个字符串。通常,当以另一种语言执行此操作时,列表会合并。 JavaScript [1, 2] + [3, 4] = "
根据我正在阅读的教程,如果您想创建一个包含 5 列和 3 行的表格来表示这样的数据... 45 4 34 99 56 3 23 99 43 2 1 1 0 43 67 ...它说你可以使用下
我通常使用 python 编写脚本/程序,但最近开始使用 JavaScript 进行编程,并且在使用数组时遇到了一些问题。 在 python 中,当我创建一个数组并使用 for x in y 时,我得
我有一个这样的数组: temp = [ 'data1', ['data1_a','data1_b'], ['data2_a','data2_b','data2_c'] ]; // 我想使用 toStr
rent_property (table name) id fullName propertyName 1 A House Name1 2 B
这个问题在这里已经有了答案: 关闭13年前。 Possible Duplicate: In C arrays why is this true? a[5] == 5[a] array[index] 和
使用 Excel 2013。经过多年的寻找和适应,我的第一篇文章。 我正在尝试将当前 App 用户(即“John Smith”)与他的电子邮件地址“jsmith@work.com”进行匹配。 使用两个
当仅在一个边距上操作时,apply 似乎不会重新组装 3D 数组。考虑: arr 1),但对我来说仍然很奇怪,如果一个函数返回一个具有尺寸的对象,那么它们基本上会被忽略。 最佳答案 这是一个不太理
我有一个包含 GPS 坐标的 MySQL 数据库。这是我检索坐标的部分 PHP 代码; $sql = "SELECT lat, lon FROM gps_data"; $stmt=$db->query
我需要找到一种方法来执行这个操作,我有一个形状数组 [批量大小, 150, 1] 代表 batch_size 整数序列,每个序列有 150 个元素长,但在每个序列中都有很多添加的零,以使所有序列具有相
我必须通过 url 中的 json 获取文本。 层次结构如下: 对象>数组>对象>数组>对象。 我想用这段代码获取文本。但是我收到错误 :org.json.JSONException: No valu
enter code here- (void)viewDidLoad { NSMutableArray *imageViewArray= [[NSMutableArray alloc] init];
知道如何对二维字符串数组执行修剪操作,例如使用 Java 流 API 进行 3x3 并将其收集回相同维度的 3x3 数组? 重点是避免使用显式的 for 循环。 当前的解决方案只是简单地执行一个 fo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有来自 ASP.NET Web 服务的以下 XML 输出: 1710 1711 1712 1713
如果我有一个对象todo作为您状态的一部分,并且该对象包含数组列表,则列表内部有对象,在这些对象内部还有另一个数组listItems。如何更新数组 listItems 中 id 为“poi098”的对
我想将最大长度为 8 的 bool 数组打包成一个字节,通过网络发送它,然后将其解压回 bool 数组。已经在这里尝试了一些解决方案,但没有用。我正在使用单声道。 我制作了 BitArray,然后尝试
我们的数据库中有这个字段指示一周中的每一天的真/假标志,如下所示:'1111110' 我需要将此值转换为 boolean 数组。 为此,我编写了以下代码: char[] freqs = weekday
我是一名优秀的程序员,十分优秀!