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

bài thuyết trình nhập môn lập trình mảng hai chiều và con trỏ

36 2K 2
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiêu đề Bài Thuyết Trình Nhập Môn Lập Trình Mảng Hai Chiều Và Con Trỏ
Trường học Đại học Hoa Sen
Chuyên ngành Lập Trình
Thể loại Bài thuyết trình
Định dạng
Số trang 36
Dung lượng 1,2 MB

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

Nội dung

Khái Niệm Mảng Đa Chiều Giải Thích Mảng hai Chiều Khai báo, duyệt, khởi tao, nhập hoặc xuất mảng hai chiều, Con Trỏ ,Khái niệm về Con trỏ Các toán tử Con trỏ và mảng một chiều Con trỏ và mảng hai chiều Con trỏ và chuỗi là những kiến thức mà chúng tôi cung cấp cho bạn trong bài viết này,sẽ là tài liệu học tập tốt của các bạn

Trang 1

Cùng Đại học Hoa Sen xây dựng tương lai



Nhập Môn Lập Trình

Mảng Hai Chiều – Con Trỏ

Trang 2

Cùng Đại học Hoa Sen xây dựng tương lai

Trang 3

Cùng Đại học Hoa Sen xây dựng tương lai

Khái Niệm Mảng Đa Chiều

- Mảng đa (nhiều) chiều là mảng mà những phần tử

của nó được xác định bởi nhiều chỉ số.

- Mảng 2 chiều là mảng nhiều chiều đơn giản và sử

dụng nhiều nhất.

- Mảng 2 chiều giống như một bảng, gồm nhiều dòng

và nhiều cột

Trang 4

Cùng Đại học Hoa Sen xây dựng tương lai

m[2][3]

i và j là số nguyên

chỉ số dòng

Trang 5

Cùng Đại học Hoa Sen xây dựng tương lai



GIẢI THÍCH MẢNG 2 CHIỀU

float rain[5][12];

float rain[5][12]; /* array of 5 arrays of 12 floats */

float rain[5] [12]; /* rain: array of 5 somethings */

float rain[5] [12]; /* somethings = an array of 12 floats */

 rain[0], the first element of rain, is an array of 12 float values

 So are rain[1], rain[2], rain[3], and rain[4]

 If rain[0] is an array, its first element is rain[0][0], its second element is

rain[0][1], and so on

 Rain is a five-element array of 12-element arrays of float, rain[0] is an array

of 12 floats, and rain[0][0] is a float

 To access, say, the value in row 2, column 3, use rain[2][3] (Remember, array counting starts at 0, so row 2 is the third row.)

Trang 6

Cùng Đại học Hoa Sen xây dựng tương lai



GIẢI THÍCH MẢNG 2 CHIỀU

Trang 7

Cùng Đại học Hoa Sen xây dựng tương lai

DataType mt [ maxRow ] [ maxColumn ] ;

int r, c ; // Số dòng và cột hiện thời

#define maxRow1 20

#define maxCol1 50

int m1 [maxRow1] [maxCol1];

int r1, c1;

const int maxRow2=30;

const int maxCol2=60;

Trang 8

Cùng Đại học Hoa Sen xây dựng tương lai

for (int i=0;i<row; i++)

{ for (int j=0;j<col;j++) Xử lý m[i][j];

Những thao tác khác;

}

// Tổng phần tử mảng

S=0;

for (int i=0;i<row, i++)

{ for (int j=0;j<col;j++)

S+= m[i][j];

}

//Xuất mảng

for (int i=0;i<row, i++)

{ for (int j=0;j<col;j++) printf(“%3d”,m[i][j]);

printf(“\n”);

}

Duyệt mảng 2 chiều

Trang 9

Cùng Đại học Hoa Sen xây dựng tương lai

printf("\n");

} printf("mang 2\n");

for (i=0;i<2;i++) { for(j=0; j<3; j++) printf("%4d",mt2[i][j]);

printf("\n");

} getch();

}

Khởi tạo mảng

Khởi tạo mảng 2 chiều

Trang 10

Cùng Đại học Hoa Sen xây dựng tương lai

printf(“A[%d][%d]:”,i,j);

scanf(“%d”,&A[i][j]);

}}

Trang 11

Cùng Đại học Hoa Sen xây dựng tương lai

Nhập/xuất mảng 2 chiều

Xuất mảng 2 chiều: sử dụng 2 vòng lặp for

Ví dụ xuất mảng số nguyên 2 chiều có N hàng và M cột

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

{

for (j=0; j<M; j++){

printf(“%3d”,A[i][j]);

}printf(“\n”);

}

Trang 12

Cùng Đại học Hoa Sen xây dựng tương lai

Viết chương trình nhập 1 mảng số nguyên 2 chiều với N hàng và

M cột Thực hiện các công việc sau:

- In mảng 2 chiều ra màn hình

- Tìm tổng các phần tử trong mảng

- Liệt kê các phần tử chia hết cho 7

- Tìm tổng các phần tử nằm trên đường viền của mảng

Trang 13

Cùng Đại học Hoa Sen xây dựng tương lai

Trang 14

Cùng Đại học Hoa Sen xây dựng tương lai



Khái niệm về Con trỏ

 Con trỏ là một biến chứa địa chỉ vùng nhớ của một biến khác

 Con trỏ được sử dụng trong chương trình để truy cập bộ nhớ

Trang 15

Cùng Đại học Hoa Sen xây dựng tương lai



Biến con trỏ

 Khai báo: type *name;

type: một kiểu dữ liệu hợp lệ bất kỳ (int, long, char …)

name: tên của biến con trỏ

Trang 16

Cùng Đại học Hoa Sen xây dựng tương lai



Các toán tử con trỏ

Hai toán tử đặc biệt được dùng với con trỏ: * và &

Toán tử &: trả về "địa chỉ của"

var2 = &var1; /* lấy địa chỉ vùng nhớ của biến var1 gán cho var2 */

/ *VD: var1 có giá trị 100 và dùng vùng nhớ 302 */

/* để lưu giá trị này Vậy var2 sẽ có giá trị 302 */

Toán tử *:

 Dùng bổ xung với toán tử &

 trả về giá trị chứa trong vùng nhớ mà vùng nhớ này được trỏ bởi giá trị của biến con trỏ (tại địa chỉ)

tmp = *var2; /* tmp có giá tri 100 */

16

Trang 17

Cùng Đại học Hoa Sen xây dựng tương lai



Addressing and Dereferencing

int a, b, *p; → Complier to allocate space in memory for 2 int and

Trang 18

Cùng Đại học Hoa Sen xây dựng tương lai



Addressing and Dereferencing

 Bây giờ, chúng ta có thể dùng con trỏ p truy cập giá trị chứa trong

biến a

 Điều này được thực hiện qua “dereference” của toán tử *

 p là con trỏ, *p có giá trị của biến con trỏ “chỉ” đến

printf("*p = %d\n", *p); // 7 sẽ được in ra

( p points to a, and a has value 7, the dereferenced value of p is 7, and that is what gets printed)

18

Trang 19

Cùng Đại học Hoa Sen xây dựng tương lai



Addressing and Dereferencing

*p = 3; → The object pointed to by p is assigned the value of 3

printf(“a = %d\n", a); /* 3 sẽ được in ra */

19

Trang 20

Cùng Đại học Hoa Sen xây dựng tương lai



Sử dụng con trỏ

 Để trả về nhiều hơn một giá trị từ một hàm

 Thuận tiện hơn trong việc truyền các mảng và chuỗi từ một hàm

đến một hàm khác

 Sử dụng con trỏ để làm việc với các phần tử của mảng thay vì truy xuất trực tiếp vào các phần tử này

 Để cấp phát bộ nhớ động và truy xuất vào vùng nhớ được cấp phát

này (dynamic memory allocation)

20

Trang 21

Cùng Đại học Hoa Sen xây dựng tương lai

Trang 22

Cùng Đại học Hoa Sen xây dựng tương lai



Con trỏ và mảng 1 chiều

 An array name by itself is an address or pointer value

 Pointers and arrays are almost identical in term of how they are

used to assess memory

 Differences:

 A pointer is a variable that takes addresses as value

 An array name is a particular fixed address that can be thought of as a

constant pointer

 When an array is declared, the complier must allocate a base address and a

sufficient amount of storage to contain all elements of the array.

 The base address of the array is the initial location in memory where the array is stored

22

Trang 23

Cùng Đại học Hoa Sen xây dựng tương lai



Con trỏ và mảng 1 chiều

int a[100], *p; → memory bytes numbered 300, 304, 308, …,

696 to be the addresses of a[0], a[1], a[2], …, a[99]

p = a; and p = &a[0]; → are equivalent and would assign 300 to p

a = p; ++a; a += 2; → Không cho phép (illegal)

23

Trang 24

Cùng Đại học Hoa Sen xây dựng tương lai



Con trỏ và mảng 1 chiều

 Truy cập địa chỉ các phần tử mảng:

array[100] ; // array mảng 1 chiều có 100 phần tử

 địa chỉ của phần tử đầu tiên trong mảng: &array[0] hay array

 địa chỉ của phần tử thứ hai trong mảng: &array[1] hay array + 1

 Tổng quát, địa chỉ của phần tử thứ i trong mảng: &array[i+1] hay array + i

array[i] và *(array +i) đều biểu diễn nội dung của địa chỉ

đó, nghĩa là, giá trị của phần tử thứ i trong mảng array

24

Trang 25

Cùng Đại học Hoa Sen xây dựng tương lai

Trang 26

Cùng Đại học Hoa Sen xây dựng tương lai



Con trỏ và mảng 1 chiều

i=0 array[i]=1 *(array+i)=1 &array[i]=194 array+i = 194

i=1 array[i]=2 *(array+i)=2 &array[i]=196 array+i = 196

i=2 array[i]=3 *(array+i)=3 &array[i]=198 array+i = 198

i=3 array[i]=4 *(array+i)=4 &array[i]=19A array+i = 19A

i=4 array[i]=5 *(array+i)=5 &array[i]=19C array+i = 19C

i=5 array[i]=6 *(array+i)=6 &array[i]=19E array+i = 19E

i=6 array[i]=7 *(array+i)=7 &array[i]=1A0 array+i = 1A0

i=7 array[i]=8 *(array+i)=8 &array[i]=1A2 array+i = 1A2

i=8 array[i]=9 *(array+i)=9 &array[i]=1A4 array+i = 1A4

i=9 array[i]=10 *(array+i)=10 &array[i]=1A6 array+i = 1A6

Kết quả trình bày rõ ràng sự khác nhau giữa:

array[i] - biểu diễn giá trị của phần tử thứ i trong mảng

&array[i] - biểu diễn địa chỉ của nó.

26

Trang 27

Cùng Đại học Hoa Sen xây dựng tương lai



Con trỏ và mảng 2 chiều

#define M 3 /* number of rows*/

#define N 4 /* number of columns */

int a[M][N], i, j;

Expressions equivalent to a[i][j]

*(a[i] + j) /* dấu ( ) cần thiết vì [ ] có độ ưu tiên > * */

(*(a + i))[j] /* a tương đương &a[0]: a pointer to an */

*(&a[0][0] + 5*i + j) /* base address &a[0][0] NOT a */

27

Trang 28

Cùng Đại học Hoa Sen xây dựng tương lai

printf(" zippo = %p, zippo + 1 = %p\n", zippo, zippo + 1);

printf("zippo[0] = %p, zippo[0] + 1 = %p\n", zippo[0], zippo[0] + 1);

printf(" *zippo = %p, *zippo + 1 = %p\n", *zippo, *zippo + 1);

Trang 29

Cùng Đại học Hoa Sen xây dựng tương lai

Trang 30

Cùng Đại học Hoa Sen xây dựng tương lai



Con trỏ và chuỗi

char amessage[] = "now is the time"; → là mảng

char *pmessage = "now is the time"; → là con trỏ

 amessage is an array:

 just big enough to hold the sequence of characters and '\0' that initializes it

 Individual characters within the array may be changed but

amessage will always refer to the same storage

 pmessage is a pointer

 initialized to point to a string constant;

 the pointer may subsequently be modified to point elsewhere, but the result is undefined if you try to modify the string

contents

30

Trang 31

Cùng Đại học Hoa Sen xây dựng tương lai

 Xem 2 cách khai báo sau:

char hoten1[30]; /* Khai báo biến hoten1 là 1 xâu ký

tự có tối đa 30 ký tự */

char *hoten2; /* Khai báo biến con trỏ hoten2 kiểu char */

 Nếu ta sử dụng các phép gán sau:

hoten1 = “Nguyen Van A”; không chấp nhậnkhông không chấp nhậnchấp không chấp nhậnnhận

hoten2 = “Nguyen Van B”; không chấp nhậnchấp không chấp nhậnnhận

Con Trỏ và Chuỗi

Trang 32

Cùng Đại học Hoa Sen xây dựng tương lai



Trang 33

Cùng Đại học Hoa Sen xây dựng tương lai



Bài tập điểm cộng tại nhà

1/ Viết chương trình nhập tên của 1 sinh viên, in ra tên là chữ viết hoa và cắt bỏ tất cả khoảng trắng (sử dụng con trỏ)

2/ Sử dụng con trỏ để viết chương trình thực hiện các công việc sau trên một mảng số nguyên: (mỗi công việc là 1 hàm)

Trang 34

Cùng Đại học Hoa Sen xây dựng tương lai



Bài tập điểm cộng tại nhà

3/ Hãy chỉ các lỗi trong phần code sau:

#define SIZE 4int main(void){

int a[SIZE] = {0, 2, 2, 3, 4};

int b[SIZE - 5];

int c[3.0];

}

Trang 35

Cùng Đại học Hoa Sen xây dựng tương lai



Bài tập điểm cộng tại nhà

4/ Bài tập sau nhằm đánh giá sự hiểu biết của bạn về con trỏ

#define SIZE 100 int main(void)

printf("%d\n", *(char *)((int *) p + 3));

printf("%d\n", *(char *)((int *) p + 3));

}Cái gì sẽ được in ra Hãy giải thích

Trang 36

Cùng Đại học Hoa Sen xây dựng tương lai



Bài tập điểm cộng tại nhà

5/ Viết một chương trình đọc N số nguyên vào một mảng Sau đó

in từng dòng cho từng giá trị riêng biệt cùng với số lần của nó

có mặt trong mảng Các giá trị này nên được in theo thứ tự

giảm dần Ví dụ, bạn nhập vào các giá trị -7 3 3 -7 5 5 3 vào mảng Chương trình của bạn sẽ in ra:

5 Có mặt 2 lần

3 Có mặt 3 lần-7 Có mặt 2 lần

Ngày đăng: 17/06/2014, 15:03

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm