gpt4 book ai didi

c - 直方图,频率的计算

转载 作者:太空宇宙 更新时间:2023-11-04 08:52:29 25 4
gpt4 key购买 nike

我需要添加一个名为 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/

25 4 0
文章推荐: python - Django - 如何查询与 "listing"对象关联的所有用户
文章推荐: html - 使
文章推荐: 命令行参数 C
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com