Sắp xếp mảng:

Một phần của tài liệu Thiết kế lập trình cơ bản với C (Trang 83)

Chương 6 .MẢNG MỘT CHIỀU

6.4 Sắp xếp mảng:

Ý tưởng: để xếp mảng tăng dần lần lượt so sánh từng phần tử với các phần tử đứng sau, thực hiện việc hoán vị nếu phần tử so sánh lớn hơn phần tử đứng sau.

Ví dụ: xếp tăng dần cho mảng sau: 25 9 3 1 6

Trang 84 i=0 J=1 9 25 3 1 6 J=2 3 25 9 1 6 J=3 1 25 9 3 6 J=4 1 25 9 3 6 i=1 J=2 1 9 25 3 6 J=3 1 3 25 9 6 J=4 1 3 25 9 6 I=2 J=3 1 3 9 25 6 J=4 1 3 6 25 9 I=3 J=4 1 3 6 9 25 Kết quả: 1 3 6 9 25 Hàm xếp tăng dần 1 mảng nguyên:

void SapXepTang(int m[],int spt) { int tam; for(int i=0;i<spt-1;i++) { for(int j=i+1;j<spt;j++) if(m[i]>m[j]) { tam=m[i];

Trang 85 m[i]=m[j]; m[j]=tam; } } }

Ví dụ: Chương trình nhập 1 mảng nguyên, xuất mảng đã nhập, xuất mảng đã xếp tăng dần

#include "stdafx.h" #include "conio.h" #include "stdio.h"

//=================== void NhapMang(int m[], int&spt); void XuatMang(int m[], int spt); void SapXepTang(int m[],int spt); //=================== void main()

{ int a[20]; int x;

printf("\n nhap mang: " ); NhapMang(a,x); printf("\n xuat mang: " ); XuatMang(a,x); printf("\n xuat mang tang: " );

SapXepTang(a,x); XuatMang(a,x); getch(); } //=========================== //nhập mảng

void NhapMang(int m[], int &spt) {

printf("nhap so phan tu"); scanf("%d", &spt);

for(int i =0; i<spt; i++) {

printf("m[%d] = ",i); scanf("%d", &m[i]); }

Trang 86 //xuất mảng

void XuatMang(int m[], int spt) {

for(int i =0; i<spt; i++) {

printf("%d\t", m[i]); }

}

//xếp tăng dần

void SapXepTang(int m[], int spt) { int tam; for(int i=0;i<spt-1;i++) { for(int j=i+1;j<spt;j++) if(m[i]>m[j]) { tam=m[i]; m[i]=m[j]; m[j]=tam; } } } Kết quả: 6.5 Tìm kiếm trên mảng:

Ý tưởng: để tìm kiếm tên mảng lần lượt so sánh từng phần tử với các giá trị cần tìm

Trang 87 i =0 M[0] = 25 Dem =0 i=1 M[1] =9 Dem =0 i=2 M[2] =3 Dem =0 i=3 M[3] =1 Dem =0 i=4 M[4] =6 Dem =0

Kết luận: Khơng có giá trị 7 trong mảng

Ví dụ: đếm số phần tử = 7 trong mảng sau: i =0 M[0] = 25 Dem =0 i=1 M[1] =7 Dem =1 i=2 M[2] =3 Dem =1 i=3 M[3] =7 Dem =2 i=4 M[4] =6 Dem =2

Kết luận: có 2 phần tử giá trị 7 trong mảng

Hàm đếm số lần xuất hiện của phần tử x trong mảng

int DemSoLanXuatHien(int m[],int spt, int x) { int dem = 0; for(int i=0;i<spt;i++) if(m[i] ==x) dem ++; return dem;}

Ví dụ:Chương trình nhập 1 mảng nguyên, xuất mảng đã nhập, đếm số lần xuất hiện của phần tử có giá trị =5 trong mảng

#include "stdafx.h" #include "conio.h" #include "stdio.h"

//===================

void NhapMang(int m[], int&spt); void XuatMang(int m[], int spt);

int DemSoLanXuatHien(int m[],int spt, int x); //=====================

Trang 88 void main()

{

int a[20]; int n;int x;

printf("\n nhap mang: " );NhapMang(a,n); printf("\n xuat mang: " );XuatMang(a,n);

printf("\n nhap gia tri muon tim: "); scanf("%d", &x);

printf("\n phan tu %d xuat hien %d lan ",x,DemSoLanXuatHien(a,n,x) ); getch();

}

//=========================== //nhập mảng

void NhapMang(int m[], int &spt) {

printf( "nhap so phan tu"); scanf("%d", &spt);

for(int i =0; i<spt; i++) { printf("m[%d] = ",i); scanf("%d", &m[i]); } } //xuất mảng

void XuatMang(int m[], int spt) {

for(int i =0; i<spt; i++) {

printf("%6d", m[i]); }

}

//đếm số lần xuất hiện giá trị x trong mảng int DemSoLanXuatHien(int m[],int spt, int x) { int dem = 0; for(int i=0;i<spt;i++) if(m[i] ==x) dem ++; return dem; }

Trang 89

Tóm tắt:

 Một mảng là một tập hợp các phần tử có cùng kiểu dữ liệu được tham chiếu bởi cùng một tên.

 Mỗi phần tử được lưu trữ ở vị trí kế tiếp nhau trong bộ nhớ chính.  Các mảng có thể có các kiểu dữ liệu như int, char, float, double.  Các thao tác cơ bản trong mảng:

Khởi tạo: <kiểu cơ sở><tên mảng>[<số phần tử>];

Nhập mảng:

for(int i =0; i<spt; i++) {

printf("m[%d] = ",i); scanf("%d", &m[i]); }

Xuất mảng:

for(int i =0; i<spt; i++) printf("%d\t", m[i]);  Sắp xếp: int tam; for(int i=0;i<spt-1;i++) { for(int j=i+1;j<spt;j++) if(m[i]>m[j]) { tam=m[i]; m[i]=m[j];

Trang 90 m[j]=tam; }}  Tìm: for(int i=0;i<spt;i++) if(m[i] ==x) dem ++;

Câu hỏi và bài tập:

1.Trình bày các khái niệm: mảng, phần tử mảng, chỉ mục? 2.Trình bày các cách khai báo mảng? Nêu ví dụ?

3.Trình bày cách truy xuất mảng?

4.Viết chuơng trình nhập 1 mảng nguyên 10 phần tử, xuất các thông tin sau:

 Mảng đã nhập.

 Mảng được xếp tăng dần.  Mảng được xếp giảm dần.

 Xuất vị trí của phần tử đầu tiên có giá trị =5.  Xuất các phần tử mảng chia hết cho 5

 Xuất tổng các phần tử mảng.

 Xuất tổng các phần tử chia hết cho 5 có trong mảng Xây dựng các hàm:

void NhapMang(int m[], int &spt): nhập mảng m gồm spt phần tử void XuatMang(int m[], int spt): xuất mảng m gồm spt phần tử

void SapXapTang(int m[], int spt):sắp xếp mảng m gồm spt phần tử theo thứ tự tăng dần

void SapXapGiam(int m[], int spt): sắp xếp mảng m gồm spt phần tử theo thứ tự giảm dần

int ViTriX(int m[], int spt, int x): trả kết quả là vị trí phần tử đầu tiên có giá trị =x, nếu khơng có trả kết quả -1

void XuatPTChiaHet(int m[], int spt, int x): xuất các phần tử mảng chia hết cho x

Trang 91

int TongMang(int m[], int spt): trả kết quả là tổng các phần tử của mảng m gồm spt phần tử

int TongPTChiaHet(int m[], int spt, int x): trả kết quả là tổng các phần tử mảng chia hết cho x

5.Viết chương trình đổi số nguyên n nhập từ bàn phím sang các hệ nhị phân, bát phân và thập lục phân. In các kết quả ra màn hình.

Xây dựng hàm:

void TaoMang(int m[], int &spt, int x, int coso) void XuatMang(int m[], int spt)

6.Viết chương trình tìm giá trị lớn nhất và giá trị nhỏ nhất trong mảng nguyên mvới spt phần tử.

Xây dựng các hàm:

void NhapMang(int m[], int &spt): nhập mảng m gồm spt phần tử void XuatMang(int m[], int spt): xuất mảng m gồm spt phần tử int Min(int m[], int spt)

int Max(iint m[], int spt)

7.Cho số nguyên x và mảng ngun m có spt phần tử. Viết chương trình thực hiện việc sắp xếp mảng tăng dần, sau đó chèn phần tử x vào mảng sao cho mảng a vẫn có thứ tự tăng.

Xây dựng các hàm:

void NhapMang(int m[], int &spt): nhập mảng m gồm spt phần tử void XuatMang(int m[], int spt): xuất mảng m gồm spt phần tử

void ThemPhanTu(int m[], int spt, int vitri, int x): thêm phần tử có giá trị x vào vị trí vitri

8.Cho mảng số nguyên A. Tạo ra 2 mảng nguyên B và C theo quy tắc: mảng B gồm các phần tử dương hoặc bằng 0 của A và mảng C gồm các phần tử âm của A.

Xây dựng các hàm:

void NhapMang(int m[], int &spt): nhập mảng m gồm spt phần tử void XuatMang(int m[], int spt): xuất mảng m gồm spt phần tử void TaoMangDuong(int a[], int spta , int m[], int &sptm) void TaoMangAm(int a[], int spta , int m[], int &sptm)

Trang 92

9.Cho mảng a có n phần tử. Viết chương trình minh họa các thao tác cập nhật và xóa phần tử tại vị trí thứ i trong mảng, thực hiện việc chèn thêm một số nguyên x vào sau phần tử thứ i (0  i < n).

Xây dựng các hàm:

void NhapMang(int m[], int &spt): nhập mảng m gồm spt phần tử void XuatMang(int m[], int spt): xuất mảng m gồm spt phần tử

void ThemPhanTu(int m[], int spt, int vitri, int x): thêm phần tử có giá trị x vào vị trí vitri

Trang 93

Tài liệu tham khảo

- Thạc sĩ Nguyễn Cẩn.1996. Ngôn ngữ lập trình C tham khảo tồn diện. Nhà xuất bản Đồng Nai

- Giáo sư Phạm Văn Ất. 1996. Kỹ thuật lập trình C cơ sở và nâng cao. Nhà xuất bản Khoa học kỹ thuật.

- Hoàng Đức Hải và Nguyễn Đình Tê. “Giáo trình lý thuyết và Bài tập C”. NXB Lao động Xã hội, 2006.

- Nguyễn Quốc Cường và Hoàng Đức Hải. “Cấu trúc dữ liệu + Giải thuật bằng chương trình”. NXB Giáo dục, 2005.

- Qch Tuấn Ngọc. “Ngơn ngữ lập trình C”. Nhà xuất bản Giáo dục. - Quách Tuấn Ngọc. “Bài tập Ngơn ngữ lập trình C”. Nhà xuất bản Giáo

Một phần của tài liệu Thiết kế lập trình cơ bản với C (Trang 83)