【发布时间】:2020-02-14 09:18:05
【问题描述】:
我已经开始学习 C 函数了。
我的任务是将数字从英制转换为公制,这些数字包含在二维数组中。
数组:
{1300, 0} [0][0] [0][1]
{2198, 0} [1][0] [1][1]
{4199, 1} [2][0] [2][1]
{2103, 0} [3][0] [3][1]
{3104, 1} [4][0] [4][1]
{1093, 1} [5][0] [5][1]
{3204, 0} [6][0] [6][1]
所以我用double 调用函数返回SortedArray[DATA_ROWS] = find_function(MixedData);
find_function 逻辑:
0 是公制值的指示符,1 是英制值的指示符,
i 是行索引器,j 是列索引器。
因此,当for 循环发现列值为 0 或 1 时,它们会将 [j-1](我们需要的实际值)保存到 SortedArray。
如果发现列值为1 SortedArray[i] = MixedData[i][j-1]*CONSTANT;,它也会转换值
只是为了检查,我做了printf 来查看值是否正确并在需要时正确转换。
我得到了这个输出:
1300.00
2198.00
1301.69
2103.00
962.24
338.83
3204.00
所以,看起来是正确的,但在任务中我有另一个任务 - 使用 2 个函数来解决这个任务。
我决定创建另一个函数,它将 sum 中的所有值 SortedArray[DATA_ROWS] 然后计算 avg - 平均值。
然后将它们打印出来。
问题来了。
使用复制的数组SortedArray[DATA_ROWS]调用不返回total_AVG(SortedArray);的函数
只是检查了printf并得到了这个:
-1.#R
0.00
0.00
0.00
0.00
0.00
0.00
我的SortedArray[DATA_ROWS]好像没有复制到第二个函数total_AVG
指针将在下一个任务中出现,因此根据任务的时间线我无法使用它们 * (即使我可以,我仍然不知道如何使用它们)*
你能告诉我,我做错了什么吗?
注意:
当我尝试更正我的代码时,一些 cmets 和变量不仅仅使用旧的。
而且我只需要了解为什么SortedArray[DATA_ROWS] 没有复制到第二个函数total_AVG。解决此问题后,将更正所有进一步的逻辑。
谢谢!对不起,英语不好!
代码:
#include <stdio.h>
#define DATA_ROWS 7
#define DATA_COLS 2
#define CONSTANT 0.31
#define MAX 3
double find_function(int MixedData[DATA_ROWS][DATA_COLS]);
void total_AVG(double SortedArray[DATA_ROWS]);
int main(void)
{
int i;
double SortedArray[DATA_ROWS];
int MixedData[DATA_ROWS][DATA_COLS] = {
{1300, 0},//[0][0] [0][1]
{2198, 0},//[1][0] [1][1]
{4199, 1},//[2][0] [2][1]
{2103, 0},//[3][0] [3][1]
{3104, 1},//[4][0] [4][1]
{1093, 1},//[5][0] [5][1]
{3204, 0}};//[6][0] [6][1]
SortedArray[DATA_ROWS] = find_function(MixedData);
total_AVG(SortedArray);
return 0;
}
double find_function(int MixedData[DATA_ROWS][DATA_COLS])
{
// imperial numbers from source array "mixedData" are 4199,3104,1093;
int i,j; // indexers
double SortedArray[DATA_ROWS];
// 7 rows, each row suppose to contain only metric values
// That means, if second for cycle with j indexer finds 0, it will contain j-1 value for example 1300 in SortedArray
// If it finds in second for cycle with j indexer 1, it will converte the value from imperial to metric for example 4199*0.31
/* {1300, 0} [0][0] [0][1]
{2198, 0} [1][0] [1][1]
{4199, 1} [2][0] [2][1]
{2103, 0} [3][0] [3][1]
{3104, 1} [4][0] [4][1]
{1093, 1} [5][0] [5][1]
{3204, 0} [6][0] [6][1] */
// Probably problem in "double SortedArray and int MixedData"
for(i=0;i<DATA_ROWS;i++)
{
for(j=0;j<DATA_COLS;j++)
{
if(MixedData[i][j]==0)
{
SortedArray[i] = MixedData[i][j-1];
}
else if(MixedData[i][j]==1)
{
SortedArray[i] = MixedData[i][j-1]*CONSTANT;
}
}
}
for(i=0;i<DATA_ROWS;i++)
{
//total += SortedArray[i];
printf("%.2lf\n", SortedArray[i]);
}
return SortedArray[DATA_ROWS];
}
void total_AVG(double SortedArray[DATA_ROWS])
{
double avg,total;
int i;
for(i=0;i<DATA_ROWS;i++)
{
printf("%.2lf\n", SortedArray[i]);
}
//avg = total/DATA_ROWS;
//printf("Total by every worker: %.2lf\n",total);
//printf("In average by every worker: %.2lf", avg);
return;
}
【问题讨论】:
-
SortedArray[i] = MixedData[i][j-1];j=0时您访问的位置无效。 -
这里也有
SortedArray[DATA_ROWS] = find_function(MixedData);。 -
再次
return SortedArray[DATA_ROWS];这里也是。 -
SortedArray[DATA_ROWS] = find_function(MixedData);->double result = find_function(MixedData);。你的 find 函数应该返回一个双精度。您的大部分困惑来自您尝试“返回数组”。你不能在 C 中这样做。你需要通过指针传递数组。我建议从二维数组退后一步,研究数组如何衰减为指针,以及当您将数组作为函数参数传递时会发生什么。 -
SortedArray[i] = MixedData[i][j-1];j=0时访问无效位置 * 我有 if else 循环检查标记为 1 的英制数字,当 j = 1 所以如果我在 j = 0 时没有弄错,我有例如 1300 值。而当 j=1 时,它要么是 0 要么是 1。if它是一个 0,只是保存之前的值 j-1 = j = 0,也就是 1300 到数组中else if它是一个 1,只是保存之前的值 j-1 = j = 0,即1300入数组,但先乘以CONSTANT