1. Trang chủ
  2. » Công Nghệ Thông Tin

Chuong 5 mang pascal, mang pascal full

37 160 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 37
Dung lượng 210,68 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

mang pascalchương 5 mảng con trỏ tham chiếubài tập kiểu mảng 1 chiều pascalchương trình phát thanh măng non tháng 5các bài tập về mảng 1 chiều pascalxóa các phần tử trùng nhau trong mảng 1 chiều pascalđếm số nguyên tố trong mảng 1 chiều pascalsắp xếp mảng tăng dần pascal

Trang 2

I- Tổng Quan:

I- Tổng Quan:

Mảng là 1 tập hợp nhiều biến nhớ có cùng kiểu, gọi là kiểu

phần tử của mảng, được cấp phát ở những vị trí liên tục

trong bộ nhớ

Mỗi phần tử (biến nhớ) trong mảng được xác định dựa trên

tên mảng và các chỉ số xác định vị trí của phần tử trong

mảng

Chỉ số phần tử của mảng là các số nguyên không âm

Số lượng chỉ số dùng để xác định 1 phần tử trong mảng

được gọi là số chiều của mảng.

Khai báo mảng N chiều:

<Kiểu phần tử> <Tên Mảng> [S1][S2]…[Sn];

Trang 3

II- MẢNG MỘT CHIỀU

Trang 4

1- Khái niệm:

1- Khái niệm:

• Mảng 1 chiều là tập các biến nhớ cùng kiểu, mỗi phần tử được

xác định bởi tên mảng và một chỉ số bắt đầu từ 0 trở đi.

Ví dụ: Mảng A có 6 phần tử thuộc kiểu số nguyên:

3 2

1 0

Chỉ số phần tử

1 5

2 2

5 9

A

Trang 5

2- Khai Báo Mảng 1 Chiều:

2- Khai Báo Mảng 1 Chiều:

a) Khai báo trực tiếp:

<kiểuPT> <tênmảng>[ <số phần tử> ] = {gt1, , gtn} ;

Nếu số giá trị khởi đầu < số phần tử thì các phần tử còn lại

sẽ được gán giá trị khởi đầu = 0.

b) Khai báo gián tiếp:

– Định nghĩa kiểu mảng 1 chiều mới:

typedef <kiểucơsở> < tênkiểumảng >[<số phần tử>];

– Khai báo mảng 1 chiều thuộc kiểu mảng đã định nghĩa:

< tênkiểumảng > <tênmảng> = {gt1, , gtn} ;

Trang 6

3- Một Số Thao Tác Trên Mảng 1 Chiều:

3- Một Số Thao Tác Trên Mảng 1 Chiều:

Trang 7

3.1 Địa chỉ vùng nhớ của một phần tử trong

– scanf ("mã định dạng", &TênMảng[ chỉsố ] );

– scanf ("mã định dạng", TênMảng + chỉsố );

Trang 8

3.2 Duyệt qua các phần tử của mảng:

3.2 Duyệt qua các phần tử của mảng:

Trang 9

printf(“Nhap gia tri cho cac phan tu : \n “);

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

printf("Nhap gia tri phan tu %d : ", i );

scanf("%f", & A[ i ] );

} printf("\nCac so thuc da nhap: ");

for( i = N-1; i >= 0; i ) printf(" %f ", A[i] );

Trang 10

3.3 Tìm kiếm phần tử thỏa yêu cầu cực trị:

3.3 Tìm kiếm phần tử thỏa yêu cầu cực trị:

Ý tưởng: Sử dụng các biến để lưu giữ vị trí phần tử cực trị

2 Cho i lần lượt lấy giá trị từ 1 đến N-1

Nếu A[cs] > A[ i ] thì thay cs = i

3 Phần tử cs có giá trị A[cs] là nhỏ nhất

Trang 11

Ví dụ: Nhập ngẫu nhiên N số nguyên (N <=100) Cho biết chỉ

printf(“Gia tri min la %d", A[cs]);

printf("\nThuoc cac phan tu: ");

for ( i = cs ; i < N ; i++)

if (A[i]==A[cs]) printf(“%6d”, i ); }

Trang 12

3.4 Sắp xếp mảng theo thứ tự tăng (hay giảm):

3.4 Sắp xếp mảng theo thứ tự tăng (hay giảm):

Mảng sắp theo thứ tự tăng

Mảng sắp theo thứ tự giảm

2 4

1 9

8 6

5 A

65

43

21

0Chỉ số

9 8

6 5

4 2

1 A

65

43

21

0Chỉ số

1 2

4 5

6 8

9 A

65

43

21

0Chỉ số

Trang 13

Thuật toán chọn trực tiếp

(Straight Selection Sort)

Thuật toán chọn trực tiếp

(Straight Selection Sort)

Ý tưởng thuật toán chọn trực tiếp (Straight Selection Sort)

Tìm phần tử nhỏ nhất trong dãy (0 N-1) ta đổi chổ với phần tử 0 đầu dãy

Sau đó, lại tìm phần tử nhỏ nhất trong dãy con từ (1 N-1) và đổi chổ với phần tử 1 đầu dãy con

Tiếp tục cho tới khi dãy con chỉ còn 1 phần tử.

2 4

1 9

8 6

5 A

65

43

21

0Chỉ số

9 8

6 5

4 2

1 A

65

43

21

0Chỉ số

Trang 14

Thuật toán: Sắp xếp mảng theo thứ tự tăng

Thuật toán: Sắp xếp mảng theo thứ tự tăng

Input: Mảng A có N phần tử cần sắp xếp

Output: Mảng A đã sắp xếp theo thứ tự tăng

Temp: - I : chỉ số phần tử đầu dãy con; - J : biến chạy trên dãy con

- cs : chỉ số phần tử có giá trị nhỏ nhất trên dãy con từ I đến N-1 Bắt đầu

b1: Cho I = 0 (vị trí đầu của dãy con đầu tiên)

b2: Tìm phần tử A[cs] nhỏ nhất trong dãy a[I] a[N-1]

b2.1: cs = I b2.2: Cho J lần lượt lấy giá trị từ ( I + 1) đến N-1

Nếu A[ J ] < A[cs] thì thay cs = J b3: hoán vị A[cs] và A[I]

b4: Tăng I = I + 1 (Vị trí đầu dãy con mới)

b5: Nếu I < N-1 thì lặp bước 2 ngược lại chuyển sang bước 6

Trang 15

Ví dụ: Sắp xếp mảng theo thứ tự tăng

Ví dụ: Sắp xếp mảng theo thứ tự tăng

printf("\nMang chua sap:");

for( I = 0; I< N; I++)

printf("%6d ", A[I] );

//Sap xep mang A for ( I = 0; I < N-1; I++) {

cs = I;

for ( J=I+1; J<=N-1; J++)

if (A[ J ] < A[cs]) cs = J;

if ( cs != I ) Hoanvi( A[cs], A[I] );

} printf("\nMang da sap xep:");

for( I = 0; I< N; I++)

printf("Nhap GT cac phan tu: \n");

for( I = 0; I< N; I++)

{

printf("Phan tu %d : ", I);

scanf("%d", &A[ I ] );

Trang 16

Ví dụ: Sắp xếp mảng theo thứ tự tăng

Ví dụ: Sắp xếp mảng theo thứ tự tăng

printf("\nMang chua sap:");

for( I = 0; I< N; I++)

printf("%6d ", A[I] );

//Sap xep mang A for ( I = 0; I < N-1; I++) {

cs = I;

for ( J=I+1; J<=N-1; J++)

if (A[ J ] < A[cs]) cs = J;

if ( cs != I ) Hoanvi( &A[cs], &A[I] );

} printf("\nMang da sap xep:");

for( I = 0; I< N; I++)

printf("Nhap GT cac phan tu: \n");

for( I = 0; I< N; I++)

{

printf("Phan tu %d : ", I);

Trang 17

4- Hàm có tham số là Mảng một chiều

4- Hàm có tham số là Mảng một chiều

a) Khai báo tham số hình thức là mảng 1 chiều: Có 3 cách

Khai báo trực tiếp:

<kiểuhàm> tênhàm( kiểuPT TênMảng[ ] , ) Chú ý: Không cần khai báo kích thước tham số mảng, tuy nhiên nếu có

khai báo trình biên dịch cũng sẽ bỏ qua

Khai báo gián tiếp qua kiểu mảng:

typedef <KiểuPT> <TênKiểuMảng>[<số phần tử>];

<KiểuHàm> TênHàm( TênKiểuMảng TênMảng , )

Khai báo kiểu con trỏ:

<kiểuhàm> tênhàm( KiểuPT *ContrỏMảng , )

b) Gọi hàm và truyền mảng:

Tham số thực sự là tên mảng, vì tên mảng là hằng địa chỉ của mảng:

Trang 18

Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng

Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng

printf("Nhap cac phan tu:\n");

for( I = 0; I< N; I++) {

printf("Nhap phan tu %d : ", I); scanf("%d", A + I);

} printf("\nMang chua sap:");

for( I = 0; I< N; I++)

printf("%6d ", A[I]);

//Sap xep mang A SapXepTang( A , N);

printf("\nMang da sap xep:");

for( I = 0; I< N; I++)

Trang 19

Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng

Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng

printf("Nhap cac phan tu:\n");

for( I = 0; I< N; I++) {

printf("Nhap phan tu %d : ", I); scanf("%d", A + I);

} printf("\nMang chua sap:");

for( I = 0; I< N; I++)

printf("%6d ", A[I]);

//Sap xep mang A SapXepTang( A , N);

printf("\nMang da sap xep:");

for( I = 0; I< N; I++)

Trang 20

Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng

Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng

printf(“Nhap so phan tu");

scanf("%d", &N);

printf("Nhap cac phan tu:\n");

for( I = 0; I< N; I++) {

printf("Nhap phan tu %d : ", I); scanf("%d", A + I);

} printf("\nMang chua sap:");

for( I = 0; I< N; I++) printf("%6d ", A[I]);

//Sap xep mang A SapXepTang( A , N);

printf("\nMang da sap xep:");

for( I = 0; I< N; I++)

typedef int Dayint [100];

void Hoanvi(int &a, int &b)

}

}

Trang 21

III- MẢNG HAI CHIỀU:

III- MẢNG HAI CHIỀU:

7 5

7 9

5

1

2 5

9

0

21

0

21

0

7

13 149

4

5 7

9

1 8

1 5

2 2

5 9

1211

108

76

53

21

0

Trang 22

1- Khái niệm:

1- Khái niệm:

Mảng 2 chiều là tập các biến nhớ cùng kiểu, Mỗi biến nhớ

trong mảng 2 chiều được xác định dựa trên tên mảng và 2

chỉ số xác định vị trí dòng và cột của phần tử trong mảng.

Theo C, Mảng 2 chiều là mảng 1 chiều mà mỗi phần tử lại là mảng 1 chiều.

Trang 23

2- Khai báo mảng hai chiều:

2- Khai báo mảng hai chiều:

<Kiểuphầntử> TênMảng[SoDong][SoCot] = {giá trị phần tử};

Ví dụ: float B[4][5] = {{9, 5, 2, 2}, {5, 1, 8, 1}, { 9, 7, 5, 7 } };

– B là mảng 2 chiều

– B có 4 phần tử B[0], ,B[3]

– Mỗi phần tử B[d] là mảng 1 chiều có 5 phần tử B[d][0],

B[d][1], B[d][2], B[d][3], B[d][4] là các biến thuộc kiểu số thực

Có thể khai báo không chỉ định tổng số dòng: Khi đó tổng

số dòng phụ thuộc vào số dòng được gán.

<Kiểuphầntử> TênMảng[ ] [SoCot]= {giá trị phần tử};

Trang 24

2- Khai báo mảng hai chiều: (tt)

2- Khai báo mảng hai chiều: (tt)

Định nghĩa kiểu mảng 2 chiều:

typedef <kiểuphầntử> Tênkiểumảng [SốDòng][SốCột];

Khai báo mảng thuộc kiểu đã định nghĩa:

Trang 25

3- Duyệt qua các phần tử của mảng 2 chiều:

3- Duyệt qua các phần tử của mảng 2 chiều:

7 9

5

1

2 5

9

0

21

0

Trang 26

Ví dụ: Nhập và In mảng 2 chiều

Ví dụ: Nhập và In mảng 2 chiều

for ( d = 0; d < SD; d++) for (c = 0; c < SC; c++) {

printf(“PT[%d][%d]=“, c, d);

scanf(“%f”, &B[ d ][ c ] );

} printf("Bang so da nhap:\n");

for ( d = 0; d < SD; d++) {

for (c = 0; c < SC; c++) printf(“ %f “, B[d] [c]);

printf("\n");

} }

#include <stdio.h>

#include <conio.h>

#define SoDong 20

#define SoCot 10

//Khai bao kieu mang 2 chieu

typedef float BangThuc[SoDong][SoCot];

printf("\nNhap So dong va so cot :");

scanf("%d %d", &SD, &SC);

Trang 27

4- Hàm có tham số là mảng 2 chiều:

4- Hàm có tham số là mảng 2 chiều:

1 Khai báo tham số hình thức của mảng 2 chiều:

KiểuHàm TênHàm( KiểuPT TênMảng[ ][SoCot], ) Chú ý: Không cần khai báo số dòng, còn số cột phải bằng với

số cột của mảng thực sự khai báo tại nơi gọi hàm.

typedef KiểuPT TênKiểuMảng [SoDong][SoCot];

KiểuHàm TênHàm( TênKiểuMảng TênMảng, )

2 Gọi hàm và truyền mảng: Tham số thực sự phải là tên

mảng:

TênHàm( TênMảng, )

Trang 28

Ví dụ: Viết chương trình cộng 2 ma trận MxN

(M, N <= 100)

Ví dụ: Viết chương trình cộng 2 ma trận MxN

(M, N <= 100)

void CongMT(int A[[][MAX], int B[][MAX],

int C[][MAX], int M, int N)

{ int i,j;

for(i=0;i<M;i++) for(j=0; j<N; j++) C[i][j]= A[i][j] + B[i][j];

Trang 29

Ví dụ: Viết chương trình cộng 2 ma trận MxN

(M, N <= 100)

Ví dụ: Viết chương trình cộng 2 ma trận MxN

(M, N <= 100)

void CongMT(MaTran A, MaTran B,

MaTran C, int M,int N)

{ int i,j;

for(i=0;i<M;i++) for(j=0; j<N; j++) C[i][j]= A[i][j] + B[i][j];

typedef int MaTran[MAX][MAX];

void NhapMaTran(MaTran A, int M, int N)

Trang 30

IV- MẢNG NHIỀU CHIỀU:

IV- MẢNG NHIỀU CHIỀU:

Trang 31

1- Khái niệm:

1- Khái niệm:

Mảng N chiều là mảng một chiều mà mỗi phần tử là mảng N -1 chiều.

Trang 32

2- Khai báo mảng N chiều

2- Khai báo mảng N chiều

a) Khai báo trực tiếp:

b) Khai báo gián tiếp:

– Định nghĩa kiểu mảng N chiều:

typedef KiểuPhầnTử TênKiểuMảng [S1][S2] [Sn];

– Khai báo mảng N chiều:

Trang 34

4-Duyệt các phần tử trên mảng N chiều:

4-Duyệt các phần tử trên mảng N chiều:

Các thao tác trên mảng N chiều cần có N vòng lặp lồng nhau:

for (cs1 = 0; cs1 < S1 ; cs1++)

for (cs2 = 0; cs2 < S2; cs2++)

for (csN = 0; csN < Sn; csN++) {

<Xử lý phần tử Y[cs1][cs2] [csN];

Trang 35

Bài tập: Mảng 1 chiều

Bài tập: Mảng 1 chiều

1 Nhập N (<=100) số thực Tìm và in chỉ số của các phần tử có giá trị lớn nhất

trong dãy

2 Nhập một dãy n số nguyên (n < 30) và một số nguyên x Loại khỏi dãy tất cả

các phần tử có giá trị bằng x In ra màn hình dãy số sau khi loại bỏ.

3 Nhập một dãy n số nguyên

a) Xếp dãy số theo thứ tự tăng dần In dãy đã xếp ra màn hình;

b) Nhập thêm một số từ bàn phím Chèn số này vào đúng vị trí của nó trong dãy đã xếp In dãy đã chèn ra màn hình.

4 Cho 2 dãy số ai (i ≤ N) và bj ( j ≤ M ), cả hai đều được xếp theo thứ tự tăng Từ

2 dãy trên hãy xây dựng 1 dãy mới cũng theo thứ tự tăng.

5 Cho dãy số nguyên gồm N số (N ≤ 100)

a) Tìm giá trị nhỏ nhất m và giá trị lớn nhất M.

b) In ra các số nguyên trên đọan [m, M] không có trong dãy.

6 Đa thức Pn(x) = a 0 + a 1 x + a 2 x 2 + + a n x n có thể biểu diễn bằng 1 mảng số

nguyên lưu trữ các hệ số từ a0 đến an Hãy nhập vào 2 đa thức có bậc tùy ý,

tính tổng 2 đa thức đó.

Trang 36

3 Tính tổng các phần tử trên đường chéo chính và tổng các phần tử trên

đường chéo phụ của ma trận vuông NxN.

Hướng dẫn: Phần tử trên đường chéo chính là A[i,i];đường chéo phụ là

A[i,n-i]

4 Xác định ma trận chuyển vị B của ma trận vuông A.Biết B[i,j]=A[j,i]

a) Kết quả lưu trong ma trận B khác A

b) Kết quả lưu trong chính ma trận A

5 Lập thủ tục nhân 2 ma trận chữ nhật A, B : C = A*B

Trang 37

25 18

11

3 21

19 12

10

22 20

13 6

4

16 14

7 5

23

15 8

1 24

17

Ngày đăng: 04/11/2018, 10:29

TỪ KHÓA LIÊN QUAN

w