01/10/2018, 10:17

Anh chị giúp em bài con trỏ trong C này với!

Đề: Nhập vào mảng các số nguyên. Cho biết các phần tử nào xuất hiện nhiều nhất mảng và xuất hiện ít nhất mảng. Sử dụng con trỏ.
Code em tìm được giá trị xuất hịên nhiều nhất. Giá trị xuất hiện ít nhất vẫn chưa tìm được. Anh chị giúp em với.

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

void NhapMang (int n, int a[])
{
    int *pa;
    for (pa = a; pa < a + n; pa++)
    {
        printf ("A[%d] = ", pa - a);
        scanf ("%d", pa);
    }
}

void XuLi (int n, int a[])
{
    int *pi, *pj;
    int *dem = (int *)calloc (n, sizeof(int));

    for (pi = a; pi <  a + n; pi++)
    {
        int demt = 1;
        for (pj = pi + 1; pj < a + n; pj++)
        {
            if (*pi == *pj)
                demt++;
            dem[pi - a] = demt;
        }
    }

    int max = 0, min = 0, vt_max = 0, vt_min = 0;
    for (pi = dem; pi < dem + n; pi++)
    {
        if (*pi > max)
        {
            max = *pi;
            vt_max = pi - dem;
        }
        else if (*pi < min)
        {
            min = *pi;
            vt_min = pi - dem;
        }
    }

    //--------------------------


    printf ("Phan tu %d xuat hien nhieu nhat trong mang %d lan", *(a + vt_max), max);
    printf ("
Phan tu %d xuat hien it nhat trong mang %d lan", *(a + vt_min), min);
}

int main()
{
    int n;
    printf ("Nhap n: ");
    scanf ("%d", &n);
    int a[n];

    NhapMang (n, a);
    XuLi (n, a);

    getch ();
    return 0;
}
Lương Thế Hải viết 12:21 ngày 01/10/2018

Mình đọc code của bạn không hiểu lắm bạn có thể giải thích về ý tường được không?
À bạn cũng không cần phải tạo pointer cho mảng a đâu vì khi bạn truyển mảng vào cũng giống như bạn truyền pointer của nó vào rồi.

Gió viết 12:30 ngày 01/10/2018

min nên gán một số lớn, nếu bạn gán min = 0 thì không tìm được giá trị nhỏ nhất bởi vì dem[ i ] >= 1 > min

Nguyễn Hoàng Nhân viết 12:17 ngày 01/10/2018

Ý tưởng của mình là:

  • 2 vòng lặp lòng nhau đầu tiên ở hàm xử lí mình dùng để đếm số lần xuất hiện của mỗi phần tử trong mảng và lưu vào mảng dem.
  • vòng lặp tiếp theo mình dùng để tìm số lần xuất hiện nhiều nhất và ít nhất trong mảngdem. Lấy kết quả sau đó in ra màn hình.
    Bạn nói rõ chỗ pointer cho mảng a không. Mình không hiểu lắm.
Nguyễn Hoàng Nhân viết 12:31 ngày 01/10/2018

Mình hiểu ý bạn rồi. Cảm ơn bạn!

rogp10 viết 12:20 ngày 01/10/2018

Má gán trước min max như bạn không đúng đâu phải là INT_MAX và INT_MIN tương ứng. Trừ một số trường hợp (do chưa nhập nên gán ko được) thì cứ gán bằng phần tử đầu chắc ăn.

Lương Thế Hải viết 12:23 ngày 01/10/2018

Sao bạn không sắp xếp dãy đó lại rồi so sánh chuỗi số bằng nhau nó sẽ đơn giản hơn

Còn về phần mảng thì
nếu bạn sử dụng

int function(int a[])

nó sẽ giống như

int function(int *a)

nhưng khác là bạn có thể dùng

a[index] = b

thay cho

*(a + index) = b
rogp10 viết 12:32 ngày 01/10/2018

Trong ds tham số thì int[] cũng như int*.

Nguyễn Hoàng Nhân viết 12:25 ngày 01/10/2018

Ohh. Ý tưởng của bạn mình có dùng rồi nhưng cũng chỉ phần tử xuất hiện nhiều nhất. Còn trường hợp ít nhất mình tìm không được

Nguyễn Hoàng Nhân viết 12:25 ngày 01/10/2018

Ohh. Bạn ví dụ cho mình được không ^.^ chỗ INT_MAXINT_MIN á.

2D_team_free_online_Education viết 12:18 ngày 01/10/2018

hãy chọn cách code mà ai đọc cũng hiểu , chứ t nhìn vào code của bạn t chả hiểu gì luôn ý

Lương Thế Hải viết 12:28 ngày 01/10/2018
#include <stdio.h>
#include <stdlib.h>

#define NUM_ARRAY 5

/*COMPARE FUNCTION FOR QSORT*/
int compare(const void *a, const void *b);

/*FIND THE NUMBER THAT APPEAR LEAST*/
int min_appear(int array[]);

/*FIND THE NUMBER THAT APPEAR MOST*/
int max_appear(int array[]);

int main()
{
    int a[NUM_ARRAY];
    for(int i = 0; i < NUM_ARRAY; i++)
        scanf("%d",&a[i]);

    qsort(a,NUM_ARRAY,sizeof(int),compare);

    printf("%d is appear most\n",max_appear(a));
    printf("%d is appear least\n",min_appear(a));

    printf("\n");
    for(int i = 0; i < NUM_ARRAY; i++)
        printf("%d\t",a[i]);
    return 0;
}

int compare(const void *a, const void *b)
{
    return ( *(int*)a - *(int*)b );
}

int max_appear(int array[])
{
    /*SAVE THE RESULT*/
    int result = 0;
    /*SAVE THE MAX STRING'S LENGTH*/
    int max = 0;
    /*SAVE THE START AND END OF STRING NUMBERS*/
    int stringStart = 1; int stringEnd = 1;

    for(int i = 0; i < NUM_ARRAY - 1; i++)
    {
        if(array[i] == array[i + 1])
        {
            stringEnd++;
        }
        else /*IF ARRAY[I] != ARRAY[I + 1]*/
        {
            int lengthString = stringEnd - stringStart;
            if(lengthString > max)
            {
                max = lengthString;
                result = array[i];
            }

            stringStart = 1;
            stringEnd = 1;
        }
    }

    return result;
}

int min_appear(int array[])
{
    /*SAVE THE RESULT*/
    int result = 0;
    /*SAVE THE MIN STRING'S LENGTH*/
    int min = NUM_ARRAY;
    /*SAVE THE START AND END OF STRING NUMBER*/
    int stringStart =0, stringEnd = 0;

    for(int i = 0; i < NUM_ARRAY - 1; i++)
    {
        if(array[i] == array[i + 1])
        {
            stringEnd++;
        }
        else /*IF ARRAY[I] != ARRAY[I + 1]*/
        {
            int lengthString = stringEnd - stringStart;
            if(lengthString < min)
            {
                min = lengthString;
                result = array[i];
            }

            stringStart = 1;
            stringEnd = 1;
        }
    }

    return result;
}

ở đây mình sắp xếp rồi tìm vẫn ra mà

Nguyễn Hoàng Nhân viết 12:19 ngày 01/10/2018

Ý tưởng thì như mình đã nói rồi đó bạn…Chỉ khác so với bình thường là mình sử dụng con trỏ thôi

Lương Thế Hải viết 12:19 ngày 01/10/2018

Bài này bạn truyền mảng thì cũng giống như truyền pointer mà

Nguyễn Hoàng Nhân viết 12:18 ngày 01/10/2018

Okie…cảm ơn bạn nhiều…mình sẽ debug bài của bạn :))

Bài liên quan
0