- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要添加一个名为 computeFrequencies 的函数,给定一个包含成绩的数组,它会返回一个包含成绩频率分布的小数组。(这只是整个程序的一部分)
我做了这个,但是我对 c 完全陌生,我不确定我做错了什么:给定错误:histogramtest2.c:16:10: 错误:“等级”重新声明为不同类型的符号histogramtest2.c:15:29: 注意:“等级”的先前定义在这里histogramtest2.c:20:12: 错误:下标值既不是数组也不是指针也不是 vector
谁能帮帮我?非常感谢
void computeFrequencies(int grades[], int freq[10]){
int i, grades[];
int length=100;
for(i=0; i<length; i++){
grades[i]=i;
switch(i){
case 1: freq[1]++;
break;
case 2: freq[2]++;
break;
case 3: freq[3]++;
break;
case 4: freq[4]++;
break;
case 5: freq[5]++;
break;
case 6: freq[6]++;
break;
case 7: freq[7]++;
break;
case 8: freq[8]++;
break;
case 9: freq[9]++;
break;
default: freq[10]++;
}
}
}
嘿,感谢您的回答,但即使我的错误消失了,我的程序也无法运行。我的程序需要显示特定年级频率的直方图。谁能帮帮我?
输入文件名为 1.in,包含: 29 6 3 8 6 7 4 8 9 2 10 4 9 5 7 4 8 6 7 2 10 4 1 8 3 6 3 6 9 4
我使用 ./a.out < 1.in 来运行
输出应该是:
. . . * . * . . . .
. . . * . * . * . .
. . * * . * * * * .
. * * * . * * * * *
* * * * * * * * * *
1 2 3 4 5 6 7 8 9 10
代码:
#include <stdio.h>
#include <stdlib.h>
int *readGrades() {
int x, count;
scanf("%d", &count);
int *grades = malloc(count * sizeof(int));
for (x = 0; x < count; ++x) {
scanf("%d", &grades[x]);
}
return grades;
}
void computeFrequencies(int grades[], int freq[10]){
int i;
int length=100;
for(i=0; i<length; i++){
grades[i]=i;
switch(i){
case 1: freq[1]++;
break;
case 2: freq[2]++;
break;
case 3: freq[3]++;
break;
case 4: freq[4]++;
break;
case 5: freq[5]++;
break;
case 6: freq[6]++;
break;
case 7: freq[7]++;
break;
case 8: freq[8]++;
break;
case 9: freq[9]++;
break;
default: freq[10]++;
}
}
}
int arrayMax(int length, int arr[]) {
int i, max = arr[0];
for (i=1; i < length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
void printHistogram(int freq[10]){
int highestGrade = arrayMax(10,freq);
int x;
int y;
for(x=highestGrade; x>0; x--) {
for(y=1; y<=10; y++) {
if(freq[y] < highestGrade && x > freq[y]) {
if(y==10) {
printf(".\n");
}
else {
printf(". ");
}
} else {
if(freq[y] <= highestGrade && x <= freq[y]) {
if(y==10) {
printf("*\n");
}
else {
printf("* ");
}
}
}
}
}
printf("\n");
printf("1 2 3 4 5 6 7 8 9 10\n");
}
int main(int argc, char *argv[]) {
int *grades;
int frequencies[10];
grades = readGrades();
computeFrequencies(grades, frequencies);
arrayMax(10,frequencies);
printHistogram(frequencies);
return 0;
}
最佳答案
您的代码有几个问题,我将按出现的顺序进行讨论。
首先,摆脱“魔数(Magic Number)”常量,其含义在上下文中不是很明显(无论如何它们通常不是真正的常量)。例如直方图中的桶数 (10
)。所以我将使用符号常量 NFREQ 引用数字 10,它可以使用预处理器宏 #define NFREQ 10
定义。在包含之后。
另一个神奇的数字是100
在计算频率的函数中。除非我们将其作为参数传递,否则无法确保该数字是正确的。此问题会影响正确性,因为它在循环中使用并保护对内存的访问。如果值太低,您将丢失一些数据。相反,如果它太高,则读取数组末尾后会出现未定义的行为(通常表现为段错误)。我们稍后会回到这个函数。我们来看看readGrades()
首先。
这是读取数据并存储输入的函数。这是您在运行时获取 count
的地方参数(我们在上面调用了 length
)。当您返回值时,您还需要找到一种方法来返回计数。您可以将地址传递给将保存该值的变量。或者,您可以定义一个包含数据(成绩)和长度的结构,并返回动态分配和填充的结构。所以签名看起来像int *readGrades(int* cnt)
在你设置的函数里面 *cnt = count
.
反过来,computeFrequencies()
现在需要一个额外的长度参数。您可以通过将 freq 数组的长度作为另一个参数传递来使该函数更通用。
void computeFrequencies(int grades[], int freq[], int grades_len){
int i;
memset(freq, 0, sizeof(freq[0])*NFREQ); // (!) init freq array
for (i = 0; i < grades_len; ++i) {
freq[grades[i]-1]++;
}
}
不要忘记初始化频率数组。如果您使用简单的 printf 循环打印中间结果,或者如果您在调试器中检查这些值,那么这个错误很容易被发现。在这里,我假设成绩来自 [1..10]
范围内并且成绩总数相对较低,否则您需要标准化为沿 y 轴的最大值。所以在这里,在简单的情况下,我们只是增加等级数组中每个等级对应的桶中的计数器。
此外,为了使您的代码更健壮,您可以添加一些代码来验证用户输入(如果您键入字符而不是数字会怎样?)。您还应该检查 malloc
不返回 NULL
.如果是,则您的程序无法分配足够的内存,应该 exit
带有表示错误行为的返回值(例如 EXIT_FAILURE
)并打印适当的错误消息以通知用户。
arrayMax()
函数似乎工作正常,前提是给定的长度与数组的实际长度相匹配(您可以使用 sentinel value 代替)。它返回最常见等级的最高频率。
打印直方图的功能可以先修正,也可以稍微简化。一个问题是臭名昭著的越界访问(10 级的频率存储在 freq[9]
)。请记住,C 中的数组索引以 0 开头(因此是 y < NFREQ
,而不是 <=
)。其余代码是 self 记录的。
void printHistogram(int freq[]){
int x, y, highestGrade = arrayMax(NFREQ, freq);
for (x = highestGrade; x > 0; --x) {
for (y = 0; y < NFREQ; ++y) {
if (freq[y] >= x && x <= freq[y])
printf("* ");
else
printf(". ");
if (y == NFREQ-1)
printf("\n");
}
}
printf("1 2 3 4 5 6 7 8 9 10\n");
}
最后,您可以通过调用 main
在不再需要时(在 free(grades);
中的 return 语句之前)显式释放您之前动态分配的内存,从而显示纪律和意识。 .在您的情况下,这并不是真正的问题,因为它会随着 main 函数的返回而隐式释放。
关于c - 直方图,频率的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19146949/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!