C代码打印数组的唯一数字

标签 c

我想创建一个 C 程序来合并 4 个未排序的数组,对它们进行排序并打印新合并数组中的所有唯一数字。 结果不正确,但我不知道为什么。 这是一个例子:

  1. a[1,5,13,​​3]
  2. b[3,5,9,1,23]
  3. c[5,23,3,18]
  4. d[1]
  5. a_b[1,5,13,​​3,3,5,9,1,23]
  6. c_d[5,23,3,18,1]
  7. 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/

相关文章:

c - 在 C 中从低到高对数组进行排序(不使用 qsort)

c - 在 C 中使用 scanf 拆分字符串

c++ - sqrt(x) 和 pow(x,0.5) 的区别

c - 这个简单的 If 语句有什么作用?

c - valgrind 报告错误并且在使用 realloc() 时肯定会丢失

c++ - 不允许从全局函数调用宿主函数

C++ - 第一次运行后跳过代码?

c++ - 与 OpenMP、MPI 和 CUDA 链接时的 Autotools 问题

c - NetBSD 长双麻烦

C:对多维数组中 < 0 的值求和