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

THDC - Bai II.04 pot

47 218 0
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 đề Con Trỏ Và Mảng
Tác giả Nguyễn Thị Thu Trang
Trường học Trường Đại học Bách Khoa Hà Nội
Chuyên ngành Khoa Công Nghệ Thông Tin
Thể loại Bài 4
Thành phố Hà Nội
Định dạng
Số trang 47
Dung lượng 1,81 MB

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

Nội dung

Địa chỉ và giá trị của một biến  Bộ nhớ như một dãy các byte nhớ..  Khai báo con trỏ: Cú pháp khai báo một con trỏ như sau:  Một con trỏ chỉ có thể trỏ tới một đối Biến Địa chỉ Giá t

Trang 1

TIN HỌC ĐẠI CƯƠNG

PHẦN 2: LẬP TRÌNH BẰNG NGÔN NGỮ C

BÀI 4: CON TRỎ VÀ MẢNG

KHOA C¤NG NGHÖ

TH¤NG TIN FACULTY OF

INFORMATION TECHNOLOGY

Trang 3

4.1.1 Tổng quan về con trỏ

a Địa chỉ và giá trị của một biến

Bộ nhớ như một dãy các byte nhớ.

Các byte nhớ được xác định một cách duy

nhất qua một địa chỉ

Biến được lưu trong bộ nhớ.

Khi khai báo một biến

Chương trình dịch sẽ cấp phát cho biến đó một số ô nhớ liên tiếp đủ để chứa nội dung của biến Ví dụ một biến số nguyên (int) được cấp phát 2 byte.

Địa chỉ của một biến chính là địa chỉ của byte đầu tiên trong

số đó

Trang 4

4.1.1 Tổng quan về con trỏ

a Địa chỉ và giá trị của một biến

(tiếp)

Một biến luôn có hai đặc tính:

Địa chỉ của biến.

Giá trị của biến.

Trang 5

4.1.1 Tổng quan về con trỏ

b Khái niệm và khai báo con trỏ

Con trỏ là một biến mà giá trị của nó là

địa chỉ của một vùng nhớ.

Khai báo con trỏ:

Cú pháp khai báo một con trỏ như sau:

Một con trỏ chỉ có thể trỏ tới một đối

Biến Địa chỉ Giá trị

i FFEC 3

p FFEE FFEC

Trang 6

4.1.1 Tổng quan về con trỏ

Toán tử & và *

Toán tử &: Trả về địa chỉ của biến.

Toán tử *: Trả về giá trị chứa trong vùng

nhớ được trỏ bởi giá trị của biến con trỏ.

Cả hai toán tử * và & có độ ưu tiên cao

hơn tất cả các toán tử số học ngoại trừ

toán tử đảo dấu.

Trang 7

4.1.1 Tổng quan về con trỏ

c Sử dụng biến con trỏ:

Một biến con trỏ có thể được gán bởi:

Địa chỉ của một biến khác:

Trang 10

4.1.1 Tổng quan về con trỏ

d Con trỏ void

void *ten_bien_con_tro;

Con trỏ đặc biệt, không có kiểu,

Có thể nhận giá trị là địa chỉ của một Có thể nhận giá trị là địa chỉ của một biến thuộc bất kỳ kiểu dữ liệu nào

Trang 11

4.1.2 Các phép toán làm việc với

con trỏ

Cộng/trừ con trỏ với một số nguyên (int, long)

Kết quả là một con trỏ cùng kiểu

Trừ hai con trỏ cho nhau

dữ liệu của con trỏ) ở giữa hai con trỏ.

Các phép toán: Cộng, nhân, chia, lấy số dư trên con trỏ là không hợp lệ.

Ví dụ: (p2 trỏ đến số nguyên nằm ngay sau x trong

bộ nhớ)

int x, *p1, *p2;

p1= &x;

p2= p1+1;

Trang 13

4.2.1 Khái niệm mảng

Mảng là một tập hợp hữu

hạn các phần tử có cùng

kiểu dữ liệu được lưu trữ

liên tiếp nhau trong bộ

nhớ.

Các phần tử trong mảng có

cùng tên (và cũng là tên

mảng) nhưng phân biệt với

nhau ở chỉ số cho biết vị

trí của chúng trong mảng.

c[6]

-45 6 0 72 1543 -89 0 62 -3 1 6453 78

Trang 16

4.2.2 Khai báo và sử dụng mảng

b Sử dụng mảng:

Truy cập vào 1 phần tử của mảng thông

qua tên mảng và chỉ số của phần tử đó.

Trang 17

4.2.2 Khai báo và sử dụng mảng (2)

b Sử dụng mảng (tiếp):

Ví dụ 2: Ví dụ 2: int a[6][5];

a[0] là phần tử đầu tiên của mảng, là 1 mảng

 Phần tử đầu tiên của mảng a[0]a[0][0],…

a[2][3] sẽ là phần tử thứ 4 của phần tử thứ 3

của a

a[i][j] sẽ là phần tử thứ j+1 của a[i], mà

phần tử a[i] lại là phần tử thứ i+1 của a

Trang 18

4.2.3 Các thao tác cơ bản làm việc

Trang 19

4.2.3 Các thao tác cơ bản làm việc

trên mảng (2)

a Nhập dữ liệu cho mảng (tiếp):

Trường hợp không biết mảng sẽ có bao nhiêu phần tử mà chỉ biết số phần tử tối đa có thể có của mảng Ví dụ:

int a[100];//Khai bao mang, so phan tu toi da la 100

int n; // Bien luu giu so phan tu thuc su cua mang

Trang 20

4.2.3 Các thao tác cơ bản làm việc

trên mảng (3)

a Nhập dữ liệu cho mảng (tiếp):

Mảng có thể được khởi tạo giá trị

ngay khi khai báo

int a[4] = {4, 9, 22, 16};

float b[3] = {40.5, 20.1, 100};

char c[5] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’};

Câu lệnh thứ nhất có tác dụng tương đương với 4 lệnh gán:

a[0] = 4; a[1] = 9; a[2] = 22; a[3] = 16;

Trang 21

b Xuất dữ liệu chứa trong mảng

Trang 22

b Xuất dữ liệu chứa trong mảng (2)

//Hien thi gia tri tat ca cac phan tu

//Moi phan tu tren 1 dong

for(i = 0; i < KT; i++)

printf(“\n%d”, a[i]);

printf(“\n”); // Xuong dong moi

/* Hien thi gia tri cua tat ca cac phan tu mang a tren 1 dong, cac phan tu cach nhau 1 dau tab */

for(i = 0; i < KT; i++)

printf(“%d\t“, a[i]);

Trang 23

b Xuất dữ liệu chứa trong mảng (3)

// Hien thi k phan tu tren mot dong

printf(“\n Cho biet gia tri cua k = “);

scanf(“%d”,&k);

for(i = 0; i < KT; i++)

{

printf(“%d “, a[i]);

if((i+1)%k == 0) //da hien thi k ptu

printf(“\n”); //xuong dong

}

getch();

Trang 24

Kết quả:

Trang 26

Nhập vào điểm của 8 sinh viên rồi tính điểm

trung bình của 8 sinh viên đó Chú ý điểm có giá trị từ 0 đến 10.

Trang 27

if (ds_diem[i] > DIEM_MAX || ds_diem[i] < 0)

printf("\nDiem phai tu 0 den %d\n", DIEM_MAX);

Trang 28

int ds_diem[SO_SV]; int i, tong = 0;

for( i=0; i< SO_SV; i++)

if (ds_diem[i] > DIEM_MAX || ds_diem[i] < 0)

printf("\nDiem phai tu 0 den %d\n", DIEM_MAX);

Trang 29

4.2.3 Các thao tác cơ bản làm việc

trên mảng (4)

Tìm phần tử lớn nhất, nhỏ nhất

Tìm kiếm trên mảng

Sắp xếp mảng

Trang 30

Nếu max < phần tử i thì gán max =

phần tử i

Ngược lại duyệt phần tử tiếp theo

Trang 31

#include <stdio.h>

#define KT 100

void main(){

int a[KT]; int i, n; int max;

printf("\n Cho biet so phan tu cua mang: ");

if(max < a[i]) max = a[i];

printf("\nPhan tu lon nhat trong mang la: %d",max); getch();

a Tìm các phần tử có giá trị lớn nhất, nhỏ nhất (2)

Trang 32

trên mảng đó có bao nhiêu phần tử có

giá trị bằng số thực vừa nhập? Nếu có,

giá trị bằng số thực vừa nhập? Nếu có,

hãy đưa ra chỉ số của các phần tử đó.

Trang 33

b Tìm kiếm trên mảng (2)

Cách làm:

Đếm các phần tử trong mảng thoả mãn

điều kiện nào đó

Sử dụng biến đếm để lưu giá trị đếm được

Duyệt mảng

Kiểm tra điều kiện cần thiết, trong trường hợp điều kiện này thoả mãn, tăng biến đếm lên 1 đơn vị

Trang 34

float m[KT], kiem_tra; int chi_so[KT]; int i, dem;

int n; // so phan tu thuc su trong mang

Trang 35

dem = 0; //Bat dau tim kiem

for(i = 0;i < n;i++)

printf(“\n Chi so cua cac phan tu la: “);

for(i = 0; i < dem; i++)

Trang 36

b Tìm kiếm trên mảng (3)

Bài 2

Nhập vào các phần tử của mảng nguyên

có số lượng các phần tử tối đa là 100

có số lượng các phần tử tối đa là 100

Nhập 1 số nguyên giá trị bất kỳ và đưa Nhập 1 số nguyên giá trị bất kỳ và đưa

ra các phần tử cùng các chỉ số trong

mảng có giá trị nhỏ hơn số nguyên vừa

nhập.

nhập.

Trang 37

printf("Nhap vao cac phan tu cua mang : ");

for (i=0; i<n; i++)

scanf("%d", &a[i]);

printf("\nNhap vao gia tri x: ");

scanf("%d", &x);

printf("\nCac phan tu nho hon %d gom co: ", x);

printf("\nChi so Gia tri");

for (i=0; i<n; i++)

if (a[i] < x)

printf("\n%4d %6d", i, a[i]);

getch();

Trang 38

c Sắp xếp mảng

Đây là một bài toán cơ bản trong lập trình

Dữ liệu (trong trường hợp này là các phần

tử trong mảng) được sắp xếp theo một thứ

Nếu thứ tự các phần tử này đã đúng, không cần thay đổi

Nếu thứ tự các phần tử này không đúng, cần đổi chỗ các

phần tử trong mảng

Trang 39

8467

2 3 4

867

2 3 4 6

87

2 3 4 6 7 8

Trang 40

int temp; //Bien tam, doi cho giua cac phan tu

printf( "Cac phan tu theo trat tu ban dau\n");

/* Hien thi mang ban dau */

for (i = 0; i < KT; i++ ) {

printf( "%4d", a[i] );

}

Trang 41

for (i=0; i<KT-1; i++)

/* Hien thi mang da sap xep */

printf( "\nMang theo thu tu tang \n");

for (i=0; i<KT; i++) {

Trang 42

Sắp xếp lựa chọn (Selection Sort):

Ở bước thứ i, i=1 n-1

Thực hiện so sánh a[i] với a[j], j=i+1 n Nếu a[i] < a[j] thì đổi chỗ 2 phần tử này Khi duyệt đến cuối dãy, đưa được phần tử nhỏ thứ i

Trang 43

Cải tiến

Không đổi chỗ quá nhiều

Khai báo 1 biến để lưu chỉ số phần tử

nhỏ nhất

Cuối 1 vòng lặp mới tiến hành đổi chỗ

phần tử nhỏ nhất lên đầu dãy

Kiểm tra nếu dãy đã sắp xếp rồi thì dừng luôn

Trang 45

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

Mảng a

a là một địa chỉ và a có giá trị bằng &a[0]

Có thể gán con trỏ p bằng địa chỉ của mảng

Có thể dùng con trỏ này để duyệt các phần

tử trong mảng.

Ví dụ:

int a[10], *p; p = a;

p+1 sẽ trỏ tới phần tử cùng kiểu ngay sau phần tử đầu tiên của

mảng, chính là a[1], nghĩa là *(p+1) chính là a[1].

p+2 sẽ trỏ tới a[2], hay *(p+2)a[2]

p+i sẽ trỏ tới a[i]

Trang 46

4.3.1 Con trỏ và mảng 1 chiều (tiếp)

Trang 47

Câu hỏi?

Ngày đăng: 30/07/2014, 01:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN