Nhập vào mảng và kiểm tra phần tử có trùng nhau không, nếu trùng thì nhập lại

Em mới học thôi nên chưa biết nhiều, em xem trên mạng và code được như sau:

void trungNhau (int a[],int n)
{
	int i;
	for (i=0;i<n;i++){
		while (a[i]==a[n]){
			printf ("Nhap lai mang A[%d]",n);
			scanf ("%d",&a[n]);
		}
	}
}


void nhapMang (int a[],int n){
	int i,s;
	for (i=0;i<n;i++){
		printf ("Nhap vao mang A[%d]: ",i);
		scanf ("%d",&a[i]);
		trungNhau (a,i);
	}
}

-Nhưng vấn đề ở đây là em thấy code nó còn lỗi. Ví dụ như cho 3 phần tử thì khi nhập
A[0] = 2
A[1] = 3
A[2] = 2 =>tới khúc này thì nó nhập lại đúng rồi nhưng khi em nhập A[2]=3 rồi A[2] = 2 tiếp thì nó gán A[2] = 2 luôn nên khi xuất mảng nó cho kết quả: 2 3 2 nên mảng vẫn có số trùng. Em đã nghĩ là do trong hàm ‘trungNhau’ thì khi con i nó là 0 và 1 thì kết quả hợp lệ nhưng vì khi nó tăng lên 2 thì cái while không đủ điều kiện nữa nên nó thoát vòng lặp luôn.

-Mọi người có thể chỉ em cách giải với ạ!!!

Tại sao hàm nhập mảng lại có tham số truyền vào là một mảng với n nhỉ

mình cũng mới học ý nên bạn có thể nói rõ hơn không? còn nếu bạn hỏi cái
void nhapMang (int a[],int n)
thì ở hàm main (mình k viết trong này) thì mình cấp cho mảng ví dụ 20 phần tử nhưng mình chỉ muốn nhập vào mảng đó 5 phần tử thôi thì mình sẽ dùng n để truyền vào

1 Like

biến s ở hàm nhapMang chưa dùng kìa b, b nghĩ sao về hướng đi này

int trungNhau (int a[],int n, int s)
{
	int i;
	for (i=0;i<n;i++){
		if (a[i]==s){
			return 0;
		}
	}
	return 1;
}

void nhapMang (int a[],int n){
    int i,s;
    for (i=0;i<n;i++){
        do {
            printf ("Nhap vao mang A[%d]: ",i);
            scanf ("%d",&s);
        } while(!trungNhau(a, i, s));
        a[i] = s;
    }
}
1 Like

Cảm ơn bạn rất nhiều. Thật ra ban đầu mình định làm một hàm nhập thôi nhưng làm hoài không nghĩ được nên mình chuyển sang viết 2 hàm ‘trungNhau’ với ‘nhapMang’. Thì lúc đó mình làm theo kiểu trả về return 0 với 1 nhưng mình viết thì cảm thấy nó cũng không có cho mình ý tưởng nào cả nên mình thêm biến ‘s’ để cho nó vào hàm if, else xem có ý tưởng mới nào không. Rồi cuối cùng bí ý tưởng nên mình viết lại 2 hàm đó đem lên trên này hỏi thử. Nó thật sự giải quyết vấn đề của mình. Cảm ơn bạn!!!

-À nếu được thì bạn làm có thể chỉ mình code trong 1 hàm ‘nhapMang’ được không? Code tách thành 2 hàm ở trên thì mình cũng hiểu nó rồi nhưng để vận dụng viết lại thành 1 hàm thì mình không biết. Nếu được thì mong bạn giúp.

về mặt clean code thì việc bạn tách hàm ra comment cẩn thận như cũ sẽ tốt hơn nhé, nhưng nếu muốn gộp có thể viết như thế này:

    int i, s;
    int trung;
    for (i = 0; i < n; i++){
        do {
            trung = 0;
            printf ("Nhap vao mang A[%d]: ", i);
            scanf ("%d", &s);
            for (int j = 0; j < i; j++){
                if (a[j] == s){
                    trung = 1;
                    break;
                }
            }
        } while(trung);
        a[i] = s;
    }
}
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?