Tách mảng có điều kiện trong C/C++

tach mang trong c 1

Tách mảng trong C/C++ là một thuật toán cần phải biết. Bài tập luyện tập lập trình C/C++ số 21 sẽ yêu cầu bạn thuật toán này.

1.Giới thiệu bài toán

Đề bài:

Viết hàm tách các số nguyên tố có trong mảng a đưa vào mảng b.
-Viết hàm tách mảng a thành 2 mảng b (chứa các số nguyên dương) và mảng c (chứa các số còn lại)

Hai để bài trên cùng là tách mảng, một đề tách mảng số nguyên tố, một đề tách mảng số nguyên dương. Bài toán chỉ khác nhau một chút nên mình sẽ giải luôn trong bài viết này.

Đề bài này ở mức cơ bản, đảm bảo rằng bạn nắm kiến thức tốt về mảng là có thể làm được.

2.Giải quyết bài toán

Hãy đảm bảo rằng bạn đã hiểu được các cấu trúc ngôn ngữ lập trình C/C++ sau đó tham khảo lời giải gợi ý của mình.

2.1 Ý tưởng giải bài toán

Trước tiên bạn cần hiểu khái niệm tách mảng là như thế nào? Tách mảng ở đây là chuyển phần tử ở mảng đầu, sang mảng thứ 2.

Ý tưởng:

  • Khai báo mảng thứ 2 (mảng b) có tối đa n phần tử. Một biến chạy (x=0)
  • Tiến hành duyệt mảng ban đầu, nếu phần tử thỏa mãn điều kiện (số nguyên tố, số nguyên dương . . .) gán phần tử này thành phần tử của mảng b (b[x]=a[i])
    Tăng biến x.
    Xóa phần tử khỏi mảng a.

2.2 Hàm tách các phần tử là số nguyên tố vào mảng b

Chúng ta cần viết hàm kiểm tra xem số nguyên a[i] có phải là số nguyên tố hay không.

Bạn có thể xem lại cách viết hàm kiểm tra tại đây.

int Checksont(int n){
    if(n<2)
        return 0;
    else{
        for(int i=2;i<=n/2;i++)
            if(n%i==0)
                return 0;
        return 1;
    }
}

Hàm xóa phần tử khói mảng bạn có thể xem lại cách viết tại đây.

void Delete(int a[], int vt, int&amp;n){
    for(int i=vt;i<n;i++)
        a[i]=a[i+1];
    n--;
}

Hàm tách số nguyên tố khỏi mảng:

void TachMangsont(int a[], int &amp;n){
	int b[n], x=0;
	for(int i=0;i<n;i++)
		if(Checksont(a[i])){
			b[x]=a[i];
			x++;
			Delete(a,i,n);
			i--;
		}
	cout<<"\nMang a sau khi tach: "<<endl;
	xuat(a,n);
	cout<<"\nMang b cac so nguyen to: "<<endl;
	xuat(b,x);
}

trong hàm này mình còn sử dụng thêm hàm xuất mảng trong C++

2.3 Hàm tách số nguyên dương

Hàm này chỉ khác phần điều kiện kiểm tra nó có phải số nguyên dương hay không

void TachMangsonguyenduong(int a[], int&amp;n){
	int b[n], x=0;
	for(int i=0;i<n;i++)
		if(a[i]>0){
			b[x]=a[i];
			x++;
			Delete(a,i,n);
			i--;
		}
	cout<<"\nMang a sau khi tach so nguyen duong: "<<endl;
	xuat(a,n);
	cout<<"\nMang b cac so nguyen duong: "<<endl;
	xuat(b,x);
}

3.Chương trình hoàn chỉnh

Chương trình tách mảng trong mình viết bằng ngôn ngữ C++ như sau:

P/s: Nếu bạn đang viết ngôn ngữ C thì chỉ cần thay đổi cấu trúc cout<< và cin>>> là được

#include<bits/stdc++.h>
using namespace std;
void nhap(int a[], int &n){
	do{
		cout<<("Nhap n: ");
		cin>>n;
	}
	while(n<2||n>99);
	for(int i=0; i<n; i++){
		cout<<"a["<<i<<"]: ";
		cin>>a[i];
	}
}

void xuat(int a[], int n){
	for(int i=0;i<n;i++){
		cout<<"  "<<a[i];
	}
}

int Checksont(int n){
    if(n<2)
        return 0;
    else{
        for(int i=2;i<=n/2;i++)
            if(n%i==0)
                return 0;
        return 1;
    }
}

void Delete(int a[], int vt, int&n){
    for(int i=vt;i<n;i++)
        a[i]=a[i+1];
    n--;
}
void TachMangsont(int a[], int &n){
	int b[n], x=0;
	for(int i=0;i<n;i++)
		if(Checksont(a[i])){
			b[x]=a[i];
			x++;
			Delete(a,i,n);
			i--;
		}
	cout<<"\nMang a sau khi tach: "<<endl;
	xuat(a,n);
	cout<<"\nMang b cac so nguyen to: "<<endl;
	xuat(b,x);
}

void TachMangsonguyenduong(int a[], int&n){
	int b[n], x=0;
	for(int i=0;i<n;i++)
		if(a[i]>0){
			b[x]=a[i];
			x++;
			Delete(a,i,n);
			i--;
		}
	cout<<"\nMang a sau khi tach so nguyen duong: "<<endl;
	xuat(a,n);
	cout<<"\nMang b cac so nguyen duong: "<<endl;
	xuat(b,x);
}

int main(){
	int a[100];
	int n;
	nhap(a,n);
	cout<<"Ket qua"<<endl;
//	TachMangsont(a,n);
	TachMangsonguyenduong(a,n);
	return 0;
}

Bài viết của mình đến đây là hết. Bạn đọc có ý kiến đóng góp hay thắc mắc nào, để lại comment xuống dưới bài viết nhé!

Xem tiếp bài 22: Bài tập về switch case trong C/C++

Xem lại bài 20: Kiểm tra tính đối xứng của mảng

Tài về đề cương 67 bài tập lập trình C/C++

LEAVE A REPLY

Please enter your comment!
Please enter your name here