我正在尝试解决一项练习,该练习要求我先创建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}
答案 0 :(得分:2)
您无法从作为参数接收的指针计算数组大小:l = sizeof(a)/sizeof(a[0]);
仅在a
是数组而非指针时才有效。
您必须将数组大小传递给函数sort
和numberOfTimes
。在您的代码中,数组大小不是您需要的,而是为每个数组实际解析的元素数。您必须专门存储这些数字。
请注意,您的排序代码不正确,您不应调整j
的上限以避免访问超出结尾的数组元素。 numberOfTimes
函数也是如此。对于您在c
中搜索的0
的每个新元素,必须将计数a
设置为b
。
请注意,您的代码没有利用a
和b
排序的事实。
以下是更正后的版本:
#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;
}