计算数组中的int在C中的另一个数组中出现的频率

时间:2016-02-27 23:54:26

标签: c arrays sorting count numbers

我正在尝试解决一项练习,该练习要求我先创建2个数组,按升序对它们进行排序,然后计算第一个数组中的数字出现在第二个数组中的次数。我快结束了。除了遗留整个代码的一行之外,一切似乎都能正常工作。我无法弄清楚原因。我是C的新手,这是我用这种语言的第一次练习。

这是代码。我评论了不起作用的一行:

https://drive.google.com/uc?export=view&id={fileId}

这个想法是代码首先对两个数组进行排序,然后以insert格式打印出来。 #include <stdio.h> void sort(int a[]) { int i, j, l, t; l = sizeof(a) / sizeof(a[0]); for (i = 0; i < l + 1; i++) { for (j = 0; j < (l - i); j++) { if (a[j] > a[j + 1]) { t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } } } } void numberOfTimes(int a[], int b[]) { int al = sizeof(a) / sizeof(a[0]); int bl = sizeof(b) / sizeof(b[0]); int i, p, c = 0; for (i = 0; i <= al; i++) { for (p = 0; i <= bl; p++) { if (a[i] == b[p]) { c++; // <-------- This line doesn't work. Why? } } printf("(%d, %d) ", a[i], c); } } void main() { int maxarraylen = 1000, i; int a[maxarraylen]; int b[maxarraylen]; int v, t; printf("Type elements of A seperated by spaces. Do not enter duplicates (type 'end' to stop): "); while (scanf("%d", &a[i]) == 1) i++; scanf("%*s"); i = 0; printf("Type elements of B seperated by spaces(type 'end' to stop): "); while (scanf("%d", &b[i]) == 1) i++; scanf("%*s"); sort(a); sort(b); numberOfTimes(a, b); } 是来自数组(n, m)的{​​{1}},n是数组int中显示的次数。

例如,您输入以下内容:

a

代码首先排序:

m

然后打印出b中数组a = {3, 2 ,1} b = {1, 3, 2, 3, 3, 2, 1} 中的数字出现次数:

a = {1, 2, 3}
b = {1, 1, 2, 2, 3, 3, 3}

1 个答案:

答案 0 :(得分:2)

您无法从作为参数接收的指针计算数组大小:l = sizeof(a)/sizeof(a[0]);仅在a是数组而非指针时才有效。

您必须将数组大小传递给函数sortnumberOfTimes。在您的代码中,数组大小不是您需要的,而是为每个数组实际解析的元素数。您必须专门存储这些数字。

请注意,您的排序代码不正确,您不应调整j的上限以避免访问超出结尾的数组元素。 numberOfTimes函数也是如此。对于您在c中搜索的0的每个新元素,必须将计数a设置为b

请注意,您的代码没有利用ab排序的事实。

以下是更正后的版本:

#include <stdio.h>

void sort(int a[], int l) {
    int i, j, t; 

    for (i = 0; i < l; i++) {
        for (j = 0; j < l - i - 1; j++) {
            if (a[j] > a[j + 1]) {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }
}

void numberOfTimes(int a[], int al, int b[], int bl) {
    int i, p, c;

    for (i = 0; i < al; i++) {
        c = 0;
        for (p = 0; p < bl; p++) {
            if (a[i] == b[p]) {
                c++;       // <-------- This line doesn't work. Why?
            }
        }   
        printf("(%d, %d) ", a[i], c);
    }
}

int main(void) {
    int maxarraylen = 1000, i;
    int a[maxarraylen];
    int b[maxarraylen];
    int al, bl, v, t;

    printf("Type elements of A separated by spaces. Do not enter duplicates (type 'end' to stop): ");
    for (i = 0; i < maxarraylen; i++) {
        if (scanf("%d", &a[i]) != 1)
            break;
    }
    scanf("%*s");
    al = i;

    printf("Type elements of B separated by spaces(type 'end' to stop): ");
    for (i = 0; i < maxarraylen; i++) {
        if (scanf("%d", &b[i]) != 1)
            break;
    }
    scanf("%*s");
    bl = i;

    sort(a, al);
    sort(b, bl);

    numberOfTimes(a, al, b, bl);
    return 0;
}