我想创建一个 C 程序来合并 4 个未排序的数组,对它们进行排序并打印新合并数组中的所有唯一数字。 结果不正确,但我不知道为什么。 这是一个例子:
- a[1,5,13,3]
- b[3,5,9,1,23]
- c[5,23,3,18]
- d[1]
- a_b[1,5,13,3,3,5,9,1,23]
- c_d[5,23,3,18,1]
- e[1,1,1,3,3,3,5,5,5,9,13,18,23,23]
仅打印数组 e 中的唯一数字:13,18,9
#include <stdio.h>
#include <stdlib.h>
void print_uniques(int x[], int sizex)
{
int i, j;
if(sizex == 0)
return;
if(sizex == 1){
printf("%d\n", x[0]);
return;
}
i = j = 0;
while(i != sizex){
i++;
if(i != sizex && x[i] == x[j])
continue;
if((i - j) == 1)
printf("%d\n", x[j]);
j = i;
}
}
/* print unique numbers from sorted array */
/* merge two already sorted arrays */
void merge(int m[], int x[], int sizex, int y[], int sizey)
{
int i=0, j=0, k=0;
while (i < sizex && j < sizey)
{
if (x[i] <= y[j])
m[k++] = x[i++];
else
m[k++] = y[j++];
}
while (i < sizex)
m[k++] = x[i++];
while (j < sizey)
m[k++] = y[j++];
}
/* compare function for qsort() */
int cmp(const int *i, const int *j)
{
return *i - *j;
}
int main()
{
int i, j,a[30],b[30],c[30],d[30],sizea,sizeb,sizec,sized;
printf("Enter the size of array A: ");
scanf("%d",&sizea);
printf("Enter the %d elements of array A:\n", sizea);
for(i=0;i<sizea;i++)
scanf("%d",&a[i]);
printf("Enter the size of array B: ");
scanf("%d",&sizeb);
printf("Enter the %d elements of array B:\n", sizeb);
for(i=0;i<sizeb;i++)
scanf("%d",&b[i]);
printf("Enter the size of array C: ");
scanf("%d",&sizec);
printf("Eisagete ta %d stoixeia tou pinaka C:\n", sizec);
for(i=0;i<sizec;i++)
scanf("%d",&c[i]);
printf("Eisagete to mege8os tou pinaka D: ");
scanf("%d",&sized);
printf("Eisagete ta %d stoixeia tou pinaka D:\n", sized);
for(i=0;i<sized;i++)
scanf("%d",&d[i]);
int a_b[32];
int c_d[32];
int e[64];
int sizea_b, sizec_d, sizee;
sizea = sizeof(a)/sizeof(a[0]);
sizeb = sizeof(b)/sizeof(b[0]);
sizec = sizeof(c)/sizeof(c[0]);
sized = sizeof(d)/sizeof(d[0]);
sizea_b = sizea + sizeb;
sizec_d = sizec + sized;
sizee = sizea_b + sizec_d;
/* sort the arrays */
qsort(a, sizea, sizeof(a[0]), cmp);
qsort(b, sizeb, sizeof(b[0]), cmp);
qsort(c, sizec, sizeof(c[0]), cmp);
qsort(d, sized, sizeof(d[0]), cmp);
/* merge the arrays */
merge(a_b, a, sizea, b, sizeb);
merge(c_d, c, sizec, d, sized);
merge(e, a_b, sizea_b, c_d, sizec_d);
print_uniques(e, sizee);
return 0;
}
感谢任何帮助!
最佳答案
更改了示例代码以获取用户输入。合并部分与 Antoine Mathys 的答案相同,因此此代码示例主要展示了一种从排序数组中打印唯一数字的简单方法。添加了 qsort() 调用来对 4 个数组进行排序,因为尚不清楚数组是否应该已经排序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* print unique numbers from sorted array */
void print_uniques(int x[], int sizex)
{
int i, j;
if(sizex == 0)
return;
i = j = 0;
while(i != sizex){
i++;
if(i != sizex && x[i] == x[j])
continue;
if((i - j) == 1)
printf("%d\n", x[j]);
j = i;
}
}
/* merge two already sorted arrays */
void merge(int m[], int x[], int sizex, int y[], int sizey)
{
int i=0, j=0, k=0;
while (i < sizex && j < sizey)
{
if (x[i] <= y[j])
m[k++] = x[i++];
else
m[k++] = y[j++];
}
while (i < sizex)
m[k++] = x[i++];
while (j < sizey)
m[k++] = y[j++];
}
/* compare function for qsort() */
int cmp(const int *i, const int *j)
{
return *i - *j;
}
/* get data (no size check) */
int getdata(int x[], char l)
{
int s, i;
printf("Enter the number of elements for %c : ", l);
if(0 == scanf("%d", &s))
return 0;
for(i = 0; i < s; i++){
printf("Enter an element for %c : ", l);
scanf("%d", x+i);
}
return s;
}
int main()
{
int a[64], b[64], c[64], d[64];
int a_b[128], c_d[128];
int e[256];
int sizea, sizeb, sizec, sized;
int sizea_b, sizec_d, sizee;
sizea = getdata(a, 'A');
sizeb = getdata(b, 'B');
sizec = getdata(c, 'C');
sized = getdata(d, 'D');
sizea_b = sizea + sizeb;
sizec_d = sizec + sized;
sizee = sizea_b + sizec_d;
/* sort the arrays */
qsort(a, sizea, sizeof(a[0]), cmp);
qsort(b, sizeb, sizeof(b[0]), cmp);
qsort(c, sizec, sizeof(c[0]), cmp);
qsort(d, sized, sizeof(d[0]), cmp);
/* merge the arrays */
merge(a_b, a, sizea, b, sizeb);
merge(c_d, c, sizec, d, sized);
merge(e, a_b, sizea_b, c_d, sizec_d);
printf("\n");
print_uniques(e, sizee);
return 0;
}
备用获取数据,允许用户在一行上输入多个元素,而无需指定元素数量。
/* get data (no size check) */
int getdata(int x[], char l)
{
char d[] = " ,\t\n";
char t[80];
int i = 0;
char *pt;
printf("enter element(s) for %c :\n", l);
if(NULL == fgets(t, sizeof(t), stdin))
return 0;
pt = strtok(t, d);
while(pt){
sscanf(pt, "%d", x+i);
i++;
pt = strtok(NULL, d);
}
return i;
}
关于C代码打印数组的唯一数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34181374/