30/09/2018, 16:15

Xóa các phần tử giống nhau trong mảng?

Em có bài tập về mảng một chiều:

Xóa các phần tử giống nhau trong mảng, để mảng chỉ gồm những phần tử phân biệt.

Em đã làm, nhưng kết quả ra sai.

Đây là toàn bộ code chương trình:

#include<stdio.h>
#include<conio.h>
#include<math.h>
void nhapmang(int a[],int n)
{
	for(int i=0;i<n;i++)
	{
		printf(" Phan tu a[%d]: ",i);
	    scanf("%d",&a[i]);
	}
}
void xuatmang(int a[],int n)
{
	printf("Cac ban tu vua nhap la: ");
	for(int i=0;i<n;i++)
	{
		printf("%3d",a[i]);
	}
}
int demsoluongphantu(int a[],int n,int giatrixoa)
{
	int dem=0;
	for(int i=0;i<n;i++)
	{
		if(a[i]==giatrixoa)
		{
			dem++;
		}
	}
	return dem;
}
int vitri(int a[],int n,int giatrixoa,int vitritim)
{
	int i;
	vitritim=2;
	int dem=0;
	for(i=0;i<n;i++)
	{
		if(a[i]==giatrixoa)
		{
		    dem++;
		}
		if(dem==vitritim)
		{
			return i;
		}
	}
	
}

void thoaman(int a[],int &n,int giatrixoa,int vitritim)
{
	int k;
 vitritim =2;
	int m=vitri(a,n,giatrixoa,vitritim);
     for(int i=m;i<n;i++)
	 {
		 for(int j=m+1;j<n;j++)
		 {
			 if(a[i]==giatrixoa && a[j]!=giatrixoa)
				 {
				k=a[i];
				a[i]=a[i+1];
				a[i+1]=k;
			     }
		 }
	 }
		for(int i=m;i<n;i++)
	 {
		 for(int j=m+1;j<n;j++)
		 {
			 if(a[i]==giatrixoa && a[j]!=giatrixoa)
				 {
				k=a[i];
				a[i]=a[i+1];
				a[i+1]=k;
			     }
		 }
	 }
		n=n-demsoluongphantu(a,n,giatrixoa);

}


int main()
{ 
 int a[50],n,giatrixoa;
 int vitritim=2;

  do
  {
  printf("
 Nhap so luong phan tu: ");
  scanf("%d",&n);
  if(n<=0)
	  printf(" Nhap n duong!");
  }
  while(n<=0);
  nhapmang(a,n);
  xuatmang(a,n);
  printf("
Nhap gia xoa: ");
  scanf("%d",&giatrixoa);
  thoaman(a,n,giatrixoa,vitritim);
  xuatmang(a,n);
  getch();
  return 0;
}
Phạm Hoàng Tuấn viết 18:18 ngày 30/09/2018

a ngĩ, e có thể làm đơn giản bằng cách sau, e đổ các phần tử trong mảng cũ ra mảng mới, ngoài ra , trước khi đưa phần tử đó vào mảng mới, e kiểm tra xem giá trị đó đẵ có trong mảng mới hay chưa (bằng cách viết 1 hàm kiểm tra) , nếu chưa có thì mới thêm vào.

viết 18:16 ngày 30/09/2018

Nếu yêu cầu của đề không có nói phải giữ nguyên thứ tự của các phần tử không trùng nhau ban đầu, thì bạn có thể làm như sau:

#include <iostream>
#include <algorithm>
using namespace std;

void Process(int* a,int& n)	  {
	
	sort(a,a+n);
	
	int index = 0;
	
	for(int i = 0; i < n; i++)	{
		
		a[index] = a[i];
		
		while(a[i] == a[i+1])
			i++;
		
		index++;	
	}
	n = index;
}

int main() {
	
	int a[] = { 1,2,2,3,3,4,5,5,6,6,6,7,7,8 };
	int n = sizeof(a)/sizeof(a[0]);
	
	Process(a,n);
	
	for(int i = 0; i < n; i++)	
		cout << a[i] << " ";
	
	return 0;
}
Bài liên quan
0