You are on page 1of 39

MÔN: NHẬP MÔN VỀ LẬP TRÌNH

Chương 07
Sử dụng array – string - struct

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 1
Chuẩn đầu ra
■ L.O.5.1 – Khai báo được mảng các giá trị.
■ L.O.5.2 – Mô tả được cách tổ chức bộ nhớ của
các phần tử trong mảng.
■ L.O.5.3 – Truy xuất được các phần tử của mảng
và dùng nó trong biểu thức.
■ L.O.5.4 – Hiểu được cách truyền một mảng vào
hàm.

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 2
MÔN: NHẬP MÔN VỀ LẬP TRÌNH

Mảng (array)

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 3
Khái niệm
■ Mảng (array) là một dãy các phần tử nằm liền kề nhau
trong bộ nhớ. Các phần tử này:
■ Có cùng một tên
■ Có cùng một kiểu gọi là kiểu cơ sở
■ Mỗi phần tử của mảng được truy xuất thông qua tên mảng
và chỉ số của phần tử trong mảng
■ Phần tử đầu tiên LUÔN LUÔN CÓ chỉ số là 0. Các phần tử
kế tiếp theo là 1, 2, …
■ Phần tử cuối cùng của một mảng có N phần tử có chỉ số là
(N-1)
■ Địa chỉ của ô nhớ có chỉ số k:
■ Địa chỉ phần tử đầu tiên + k * (kích thước phần tử)
=> dễ dàng truy cập một phần tử có chỉ số bất kỳ
Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 4
Ví dụ
int x[8]; x[2] = 20;

Memory 0 Array
342901 ?
Addresses Index/Subscript
342905 ? 1
342909 20 2
342913 ? 3 Array Element

342917 ? 4
342921 ? 5
342925 ? 6
342929 ? 7

Note: Index starts with 0, not with 1

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 5
Mảng 1 chiều
■ Cú pháp khai báo
<kiểu dữ liệu> <tên mảng> [<kích thước>];
■ Ví dụ:
int A[6];
int B[6] = {10, 20, 30};
int C[6] = {10, 20, 30, 40, 50, 60};
int D[] = {1, 2, 3, 4, 5, 6};
■ Mảng A chứa 6 số nguyên giá trị các phần tử chưa xác định
■ Mảng B chứa 6 số nguyên. Giá trị 3 phần tử đầu là 10, 20, 30; còn
3 phần tử sau chưa xác định
■ Mảng C chứa 6 số nguyên. Giá trị các phần tử lần lượt là: 10, 20,
30, 40, 50, và 60
■ Mảng D chứa 6 số nguyên. Giá trị các phần tử lần lượt là: 1, 2, 3, 4,
5, và 6

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 6
Mảng 1 chiều
■ Số phần tử của mảng phải biết trước thời điểm
biên dịch và là hằng số không âm.
■ Sử dụng macro
■ #define MAX_SIZE
■ Khai báo hằng số nguyên
■ const int max_size
#define MAX_SIZE 6
void main(){
const int max_size = 10;
int a[MAX_SIZE];
int b[max_size];
}
Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 7
Truy cập đến thành phần của mảng
■ Truy cập phần tử của mảng thông qua tên mảng
và chỉ số của phần tử trong mảng
<tên mảng> [<chỉ số>]
■ Chú ý: chỉ số mảng luôn bắt đầu từ 0
■ Ví dụ
int a[10];
là mảng nguyên có 10 phần tử từ a[0] đến a[9]

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập8trình
Khoa KH & KT Máy Tính Slide 8
Ví dụ
int n;
printf("Nhap n: ");
scanf("%d", &n);
int A[n]; Nhap n: 5
printf("%d\n", sizeof(A)); 20
for(int i=0; i<n; i++) 0 2 4 6 8
A[i]=2*i;
for(int i=0; i<n; i++)
printf("%d ", A[i]);

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 9
Nhập dữ liệu cho mảng
■ Dùng hàm scanf()
■ Ví dụ ta khai báo mảng:
int a[10];
■ Nhập dữ liệu cho phần tử a[1]:
scanf(“%d”, &a[1]);
■ Nhập dữ liệu cho toàn bộ các phần tử của mảng
sử dụng vòng lặp for
for (int i=0; i<10; i++) {
printf ("Nhap a[%d]: ", i);

scanf("%d", &a[i]);
}
Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
10
Khoa KH & KT Máy Tính Slide 10
Tạo giá trị ngẫu nhiên (random)
#include <stdlib.h>
#include <time.h>
void main() {
int a[5];
srand (time(NULL));
for ( int i = 0; i < 5; i++ ) {
a[ i ] = rand();
}
for ( int i = 0; i < 5; i++ ) {
printf( "%d\n", a[ i ] );
}
}
Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 11
Duyệt mảng một chiều
■ Dùng 1 biến chỉ số (kiểu số nguyên)
■ Đầu tiên gán chỉ số này bằng 0
■ Chỉ đến phần tử đầu tiên của mảng
■ Dùng vòng lặp để duyệt qua mỗi phần tử của mảng
int A[MAX_SIZE];
int n = 5;
// Nhập mảng ...
// In ra các phần tử trong mảng
for(int i=0; i<n; i++){
printf("%-3d", A[i]);

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 12
Gán giá trị cho phần tử mảng một chiều
■ Dùng chỉ số để truy cập phần tử của mảng
■ Chỉ số có thể là hằng số
■ Chỉ số có thể là biểu thức nguyên
#include <stdio.h>
#include <stdlib.h> Chỉ số là hằng số

int main(){
int c[6] = {10, 20, 30, 40, 50, 60};
int id = 0;
/*Write to element*/
Chỉ số là biểu thức nguyên
c[3] = 99;
c[id + 1] = 100;
/*Read and print element*/
printf("c[%1d] = %3d\n", 3, c[3]);
printf("c[%1d] = %3d\n", id + 1, c[id + 1]);
return 0;
}
Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 13
Mảng nhiều chiều
■ Mỗi phần tử của mảng cũng có thể là một mảng
■ Ví dụ
int a[6][5];
■ mảng a gồm 6 phần tử
mỗi phần tử lại là một mảng gồm 5 số nguyên
■ Tương đương ma trận 6 dòng x 5 cột
■ a[0]:phần tử đầu tiên của mảng a, là mảng 1 chiều
■ a[i][j]:phần tử thứ j của mảng a[i]

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập14trình
Khoa KH & KT Máy Tính Slide 14
Phương pháp lưu trữ mảng 2 chiều

10 20 30 40

50 60 70 80

90 100 110 120

Mảng 2 chiều có 3 hàng x 4 cột

10 20 30 40 50 60 70 80 90 100 110 120

Phương pháp lưu trữ trong bộ nhớ của mảng 2 chiều


lưu hết hàng này đến hàng kế

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 15
Tính địa chỉ phần tử mảng 2 chiều
■ Các phần tử trong mảng 2 chiều được đánh chỉ số
để truy cập, dùng 2 chỉ số.
■ Chương trình có thể tính địa chỉ của ô nhớ bắt đầu
của phần tử có chỉ số [row, col] dễ dàng
■ Địa chỉ của phần tử [row, col] =
địa chỉ của phần tử đầu tiên +
[row* (số phần tử trên một hàng) +
col] * kích thước phần tử c
0 1 ol 2 3

0 1 2 3 4
0 0 0 0

ro 1 5 6 7 8
0 0 0 0
w
2 9 10 11 12
0 0 0 0

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 16
Khai báo và gán giá trị mảng 2 chiều
int a[3][4];
int b[3][4] = {{10, 20, 30}};
int c[3][4] = {{10, 20, 30, 40},
{50, 60}
};
int d[3][4] = {{10, 20, 30, 40},
{50, 60, 70,
80},
{90, 100, 110,
120}
};
Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 17
Nhập ma trận
void main(){
int A[20][20], n, m, i, j;
printf("Nhap n va m:");
scanf("%d%d",&n, &m);
for (i=0; i<n; i++)
for (j=0; j<m; j++) {
printf("Nhap A[%d,%d]:", i,
j);
scanf("%d", &A[i][j] );
}
// …
} Đại học Bách Khoa TpHCM Môn: Nhập môn lập trình
Chương 7: Sử dụng array, string, struct
Khoa KH & KT Máy Tính 18 Slide 18
Xuất ma trận ra màn hình
void main() {
// ...
printf ("Ma tran da nhap:\n");
for (i=0; i<n; i++) {
for (j=0; j<m; j++)
printf("%4d", A[i][j]);
printf("\n");
}

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính 19Slide 19
Truyền một mảng vào hàm
■ Cách khai báo thông số của hàm là mảng.
void modifyArray( int b[], int size )
{
int j;
// multiply each array element by 2
for ( j = 0; j < size; ++j ) {
b[ j ] *= 2;
}
}
■ Truyền tên của mảng vào hàm (truyền theo kiểu
tham chiếu).
const int SIZE = 5;
int array[SIZE] = { 0, 1, 2, 3, 4 };
modifyArray( array, SIZE );

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 20
Truyền một mảng vào hàm
■ Có thể dùng từ khóa “constant” khi định nghĩa
tham số mảng của một hàm để ngăn chặn hàm
thay đổi giá trị gốc của mảng.

void modifyArray( const int b[], int size )


{
b[ 0 ] /= 2; // error
b[ 1 ] /= 2; // error
b[ 2 ] /= 2; // error
}

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 21
Truyền phần tử của mảng vào hàm
■ Ví dụ hàm nhận phần tử của mảng
void modifyElement( int e )
{
// multiply parameter by 2
e *= 2;
printf( "Value in modifyElement is %d\n", e);
}

■ Ví dụ cách truyền phần tử của mảng vào hàm


(truyền theo kiểu tham trị)
const int SIZE = 5;

int array[SIZE] = { 0, 1, 2, 3, 4 };
modifyElement( array[3] );

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 22
MÔN: NHẬP MÔN VỀ LẬP TRÌNH

Chuỗi (string)

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 23
Chuỗi trong C
■ Trong C, chuỗi là mảng các ký tự và kết thúc bằng
ký tự đặc biệt ‘\0’ (null character)
■ Do đó nếu mảng có kích thước là N phần tử, thì
chỉ có thể chứa tối đa (N-1) ký tự
■ Ví dụ: chuỗi “LAP TRINH”
■ Chiều dài chuỗi là 9 ký tự
■ Cần 10 ô nhớ để lưu trữ chuỗi

‘L’ ‘A’ ‘P’ ‘‘ ‘T’ ‘R’ ‘I’ ‘N’ ‘H’ ‘\0’

Chuỗi kết thúc bằng ký tự đặc biệt

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 24
Khai báo chuỗi
const int MAX = 50;
char s1[MAX];
char s2[MAX] = { 'L','A','P',' ','T','R','I', 'N','H’,’\0’ } ;
char s3[MAX] = "LAP TRINH";
char s4[] = { 'L','A','P',’ ','T','R','I’,'N','H','\0’ };
char s5[] = "LAP TRINH";

//Trong các lệnh trên, lệnh khai báo nào không hợp lệ trong C?

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 25
Các hàm thao tác với chuỗi
■ Hàm in chuỗi ra màn hình
■ printf("%s\n", s1);
■ Hàm nhập chuỗi: chỉ đọc 1 từ (read a word)
■ scanf("%s", str);
■ Hàm nhập chuỗi: đọc cả dòng (read a line) cho
đến khi gặp ký tự ENTER
■ gets(str);
■ Hàm đọc từng ký tự
■ ch = getchar();

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 26
Một số hàm xử lý chuỗi thông dụng
#include <string.h>
Hàm Công dụng

strlen (chuỗi) Lấy chiều dài của chuỗi

strcpy (đích, nguồn) Chép chuỗi nguồn vào chuỗi đích

Chép n kí tự đầu tiên của chuỗi


strncpy (đích, nguồn, n)
nguồn vào chuỗi đích
Ghép chuỗi nguồn vào sau chuỗi
strcat (đích, nguồn)
đích
Ghép n ký tự đầu tiên của chuỗi
strncat (đích, nguồn, n)
nguồn vào sau chuỗi đích
Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 27
Các hàm xử lý chuỗi thông dụng
Hàm Công dụng
• Trả về địa chỉ vị trí xuất hiện đầu
tiên của ký tự ch trong chuỗi s
strchr (chuỗi s, ký tự ch)
• Trả về giá trị NULL trong trường
hợp không tìm thấy
• Trả về địa chỉ vị trí xuất hiện cuối
cùng của ký tự ch trong chuỗi s
strrchr (chuỗi s, ký tự ch)
• Trả về giá trị NULL trong trường
hợp không tìm thấy
• Trả về địa chỉ vị trí xuất hiện đầu
tiên của chuỗi s1 trong chuỗi s
strstr (chuỗi s, chuỗi s1)
• Trả về giá trị NULL trong trường
hợp không tìm thấy

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 28
Các hàm xử lý chuỗi thông dụng
Hàm Công dụng
strcmp (chuỗi s1, chuỗi s2) So sánh 2 chuỗi s1 và s2
Kết quả trả về:
• <0: nếu s1 < s2
• 0: nếu s1 = s2
• >0: nếu s1 > s2
stricmp (chuỗi s1, chuỗi s2) So sánh 2 chuỗi s1 và s2 không
phân biệt chữ hoa chữ thường
Kết quả trả về giống hàm strcmp
strlwr (chuỗi) Chuyển chuỗi về chữ thường
strupr (chuỗi) Chuyển chuỗi về chữ in hoa
strrev (chuỗi) Đảo ngược chuỗi

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 29
MÔN: NHẬP MÔN VỀ LẬP TRÌNH

Cấu trúc (struct)

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 30
Định nghĩa kiểu mới với typedef
■ typedef cho phép người lập trình tạo ra tên mới
cho một kiểu dữ liệu đã có.
■ Tên mới mang lại tính dễ hiểu hơn, trong ngữ cảnh
của bài toán đang xét.
■ Tên mới giúp rút ngắn mã nguồn
■ Cú pháp
typedef <tên_kiểu_cũ> <tên_mới>;
■ Ví dụ
typedef unsigned char BYTE;
BYTE a, b;

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 31
kiểu cấu trúc (struct)
■ Là kiểu dữ liệu phức hợp, bao gồm nhiều thành
phần có thể thuộc các kiểu dữ liệu khác nhau
■ Các thành phần gọi là: trường dữ liệu (field)
■ Một biến thuộc kiểu cấu trúc được xem là một tập
hợp nhiều biến đơn lẻ thành một biến duy nhất
■ Tất cả các dữ liệu trong một biến cấu trúc có quan
hệ với nhau tạo thành một khối
■ Luôn luôn cấp phát cùng nhau, sắp xếp liên tục
trong bộ nhớ và được hủy khỏi bộ nhớ cùng lúc
■ Các mảnh dữ liệu thành phần có thể truy xuất độc
lập, thông qua tên field.
Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập32trình
Khoa KH & KT Máy Tính Slide 32
Khai báo kiểu dữ liệu cấu trúc
■ Khai báo kiểu cấu trúc
struct <tên cấu trúc> {
<khai báo các trường >
}
■ Ví dụ
struct sinhvien { Mỗi sinh viên cần lưu
char mssv[8]; các thông tin:
• Mã số sinh viên
char hoten[30]; • Họ tên
float dtb; • Điểm trung bình

}
Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
33
Khoa KH & KT Máy Tính Slide 33
Khai báo biến cấu trúc
■ Cú pháp:
struct <tên cấu trúc> <danh sách biến>;
Ví dụ:
struct sinhvien sv1, sv2, sv3;

■ Kết hợp khai báo biến với khai báo cấu trúc
struct <tên cấu trúc> {
<khai báo các trường>;
} <danh sách biến>;

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập34trình
Khoa KH & KT Máy Tính Slide 34
Gán giá trị khởi tạo khi khai báo
struct sinhvien {
char mssv[8];
char hoten[30];
float dtb;
s1: không được khởi động
};
s2: được khởi tạo không đầy đủ
void main() {
struct sinhvien s1; s3: được khởi tạo đầy đủ

struct sinhvien s2 = { "001", "Nguyen Van An" };


struct sinhvien s3 = { "001", "Nguyen Van An", 9.5f };
printf("MSSV: %s\n", s3.mssv);
printf("Ho Ten: %s\n", s3.hoten);
} Truy xuất dữ liệu thành phần:
<tên biến>.<tên thành phần>
Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 35
Kết hợp typedef với struct
■ Lưu ý cách bỏ từ khoá “struct” khi khai báo biến có
kiểu struct mới với typedef
■ Ví dụ:
typedef struct sPoint3D {
float x, y, z;
} Point3D; định nghĩa tên kiểu mới là
Point3D thông qua typedef

void main(){
struct sPoint3D p1 = {1.0f, 2.0f, 3.0f};
Point3D p2 = {1.0f, 2.0f, 3.0f};
printf("p1 = (%4.1f,%4.1f,%4.1f)\n", p1.x, p1.y,
p1.z);
printf("p2 = (%4.1f,%4.1f,%4.1f)\n", p2.x, p2.y,
p2.z);
}Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 36
Bài tập 1
■ Cho một mảng n số nguyên với các giá trị được
khởi tạo ngẫu nhiên từ 1 đến 10. Viết chương trình
in ra giá trị từng phần tử trong mảng và biểu đồ
sao thể hiện giá trị của từng phần tử đó.
Ví dụ:
Phần tử Giá trị Biểu đồ sao
0 5 *****
1 8 ********
2 1 *
3 9 *********
4 8 ********
5 7 *******

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 37
Bài tập 2
■ Với xí ngầu 6 mặt (tương ứng giá trị từ 1 đến 6).
Viết chương trình in ra giá trị tần xuất xuất hiện
tương ứng với các mặt của xí ngầu khi lắc ngẫu
nhiên xí ngầu 1000 lần.
Ví dụ:
Mặt xí ngầu Tần suất xuất hiện
1 188
2 148
3 196
4 153
5 169
6 146

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 38
Bài tập 3
■ Cho cấu trúc sinh viên như sau:
typedef struct sStudent{
char student_code[10];
char student_name[50];
float math, english, physics;
} Student;

■ Giả sử có danh sách của N sinh viên.


■ Chương trình khởi động danh sách với 3 cột điểm sinh ngẫu nhiên từ 0
đến 10. Mã số và tên của sinh viên chưa cần gán.
■ Viết chương trình tìm điểm trung bình lớn nhất và nhỏ nhất và in ra
màn hình. Kết quả như hình sau:

Đại học Bách Khoa TpHCM Chương 7: Sử dụng array, string, struct Môn: Nhập môn lập trình
Khoa KH & KT Máy Tính Slide 39

You might also like