LẬP TRÌNH C
GV: Ngo Ngoc Thanh
Trang 2Nội dung môn học
Chương [l: Các khái niệm cơ bản của tin học Chương 2: Tổng quan ngôn ngữ lập trình C Chương 3: Các câu trúc điều khiến
Chương 4: Sử dụng hàm trong C
Chương 5: Kiểu dữ liệu mảng, xâu ký tự, con trỏ Chương 6: Kiểu đữ liệu struct
Trang 3Chương 5
Trang 41 2 2 Kiểu dữ liệu mảng Kiểu dữ liệu mảng
Kiêu dữ liệu xâu ký tự
Trang 5Je Na “A ?
Khái niệm vẽ màng
m Miảng là kiều dữ liệu bao gồm một số hữu hạn các phân
tử có cùng kiểu dữ liệu
a SO lượng phân tử của mảng được chỉ ra ngay từ khi khai báo Số lượng này phải lớn hơn hoặc băng số lượng phân tử cân xử lý trong chương trình
Trang 6Khai báo mảng trong C
= Cu phap:
kiểu dữ liệu tên biên mảng[sô lượng phần tử];
m lrong đó:
kiêu đữ liệu là kiêu dữ liệu của phân tử tên biến mảng là tên của biến mảng
sô lượng _phân tử là số lượng phân tử của biên mảng (sô lượng tôi đa)
m Ví dụ: khai báo một mảng 5 số nguyên có tên m:
Trang 7AN ?
Truy cap mang
m Chúng ta truy cập tới từng phân tử thông qua tên mảng và chỉ sô theo ký pháp:
tên biến mảng [chỉ số]
m Đối với C, phân từ đâu tiên của mảng có chỉ sô là 0
= Môi phân tử của mảng có thề được coi như là một biên có kiều dữ liệu là kiểu phần tử của mảng và mọi thao tác với biến kiêu đó đêu có thê áp dụng với phan tu cua mang
(doc, ghi, gan )
m Muôn đọc/1n mảng cân phải đọc/1n từng phân tử của mảng
m|0[ | m{ỊI| | mị|2| | mị|3| | mị|4|
mảng m có 5 phân tử nguyên
Trang 8
VD: Đọc, in dãy số nguyên
#include <stdio.h>
int a[10];//mang a co 10 phan tử đánh số từ 0 9
int i,n;//con chạy i, số lượng phân tử của dãy số n
void main()f
//nhập mảng (nhập số phân tử thực tế trước)
printf(*Cho biết số lượng phân tử: ”);
Trang 10Sắp xếp dãy số #include <stdio.h> int a[50]; int i,j,n,tg; void main() {
//nhập mảng (nhập sô phân tử thực tê trước)
Trang 12Mảng nhiều chiều
m Những ví dụ trình bày từ các slides trước đêu sử dụng mảng một chiêu
m lrên thực tê, có những đôi tượng nhiêu chiêu (vd: ma trận) Cân phải dùng đên mảng nhiều chiêu
m Khai báo mảng hai chiêu:
kiểu d1 tên biên mảng [m][n];
_¡ Trong đó:
m kiêu di là kiêu dữ liệu của phan tử
= m.n là số lượng hàng và cột của mảng (hằng số)
m Khai báo mảng 3,4 chiêu:
Trang 14VD: Cộng 2 ma trận #include <stdio.h> f£loat a[10][10], b[10]1[10], c[10][10]; 1nt 1,1J,m,n; void main() {
printf (“Cong hai ma tran mxn, nhap m,n=`) ;
Trang 16Kiểu dữ liệu xâu ký tự
1 Kiểu dữ liệu mảng
Trang 17Xau ky tu trong C
m€ coi xâu ký tự như là một mảng ký tự
m Đề khai báo một xâu ký tự ta khai báo một mang
ký tự
m Ví dụ: khai báo xâu ký tự s có độ dài tôi đa là 30
char s[30]:
m Tổ chức lưu trữ xâu ký tự:
¡Xâu = chuỗi ký tự liên tiếp nhau
Trang 18Nhập/ xuất xâu ký tự m Nhập xâu: _¡ Sử dụng scanf m Cú pháp: scanf(“%s”.biễn xau_kt): m Vị dụ: char str[10]:
scanf(“%s”.str): /không cần &str
a Neu người dùng nhập một xâu có dâu cách thì chi phân ký tự năm trước dấu cách đầu tiên được nhập cho xâu ký tự (vd: trong ví dụ trên, nếu nhập
xau “Viet Nam” roi go Enter thi s = “Viet” Phan con lại được day vao bo đệm)
| Su dung gets
a Cu phap: gets(s):
a Nhap duoc ca xau ky tu co dau cach
Trang 19Thư viện string.h
Thư viện <string.h> chứa các hàm xử lý xâu ký tự
strlen(s): hàm trả về độ đài của xâu s
strcpy(sl,s2): sao chép xâu s2 sang xâu sÌ]
_¡ Vd: strepy(s, “Hello”); //s sẽ nhan xau “Hello”
_¡ Lưu ý: Không được gán s=“Hello "` mà phải dùng strcpy
strcat(s1,s2): nối xâu s2 vào cuôi xâu sÏ]
stremp(s1.s2): so sánh s1 và s2, kết quả trả về là
1 0 neu xau sl = xau s2
4 <0 néu s]<s2
Trang 20Kiểu dữ liệu con trỏ
¡i Kiêu đữ liệu mảng
2 Kiêu dữ liệu xâu ký tự
.~ _ *
Trang 21Khái niệm con trỏ
m Con trỏ là một kiêu dữ liệu đặc biệt, được sử dụng đê lưu địa chỉ của các biên trong bộ nhớ
= Con trỏ là một phần quan trọng của ngôn ngữ C m Việc truyền “tham biến” cho chương trình con can
phải thông qua con trỏ
Trang 23Một số cú pháp
m Nếu p là một biến con trỏ thì:
_¡ *p là dữ liệu được chứa trong địa chi ma p lưu trữ
m Nếu x là một biến “bình thường” thì:
—¡ &x là địa chỉ của biến x trong bộ nhớ m Vị dụ:
int *p,1= 2; p=&1;
printi(“%d”,*p); //in ra gia tri cua 1
Trang 24Phép toán với con trỏ 259 2 ` ; ` bộ nhở Gia su p la con tro, k la A mot so nguyen m Phép cong: p=ptk: _ip trỏ sang ô nhớ sau ô nhớ trước đó k ô nhớ m Phép trừ: p=p-k: —ï p trỏ sang ô nhớ trước ô nhớ p-1 p
trước do k 6 nhớ minh hoạ với p là con trỏ nguyên
¬ a bién nguyén = 2 Bytes * kích thước môi ô nhớ băng uy vies)
kích thước của biên co kiến dữ
Trang 25“A
Truyén “tham bién” cho ham
m Như đã biết, hàm trong C chỉ cho phép truyền tham tri Các giá trị được truyền không bị thay đối
m Đề truyền “tham biên” cho hàm, thay vì truyền các biến, ta hãy truyền địa chỉ của chúng
hàm sẽ làm việc trên bản copy của địa chỉ truyền vào bản copy và bản gốc cùng trỏ vào một biến, do vậy nếu thay đồi nội dung của địa chỉ đó thì kết quả sẽ được giữ
Trang 27Con trỏ và mảng 1 chiêu
= C coi bién mang | chiéu nhu mot hang con trỏ có: —ikiêu ô nhớ trỏ đến là kiêu phân tử của mảng
4 gia trị là địa chỉ phân tử đâu tiên (chỉ sô 0) của mảng
m Vị dụ:
int mỊ L0]:
int “p;
printf(“%đ”,*m); //viết ra phân tử đâu tiên của mảng m p=m: //sau câu lệnh này, có thể coi p là mảng m
Trang 28Con trỏ và mảng 2 chiêu
m Gia su co khai bao:
Trang 30VD: Hàm cộng 2 ma trận
#Include<stdio.h>
#define max cot 30: // số lượng cột tối đa #define max hang 30: // số lượng hàng tối đa
void cong míf(mnt a[|[max cot| Int b[|[max cot|] Int c[|[max_ cot]., Int m, Inf n) t int 1,]: for (=0:1<=m-1:1++) for (j=0:j<=n-1:}++) c[iIU]Fa[iI]+bfiUI: j void main() {
int x[max_ hang][max_ cot], y[max_ hang]||[max_ cot], zZ[max hang]|max_ cot], m, n:
//Nhap cac ma tran co kich thuoc m x n cong mt (x,y.Z,m,n):
//Viết z ra màn hình
Trang 31Con trỏ và xâu ký tự
m€ coi xâu ký tự là một mảng ký tự nên:
— biến xâu ký tự có thê coi là một hăng con trỏ kiều ký tự
_ với khai báo char str[ 10]: không thê thực hiện lệnh gán
str=““Hello” vi str la hang con tro da duoc gan voi mot dia chi xac
dinh
m Khai báo con trỏ ký tự:
7 Cu phap: char *s; //s là tên biến con trỏ
7 Y nghia: s 1a con tro ky tu, chwa co gia trị, có thé gan cho s gia trị
nao do, vi du:
a s= “Hello”; //gan cho s địa chi cua xau “Hello”
a strcepy (s, “Hello”):
Trang 32VD: Tách từ đầu tiên của xâu #include "stdio.h" #include ''string.h" char *firstword(char “str){ int isn; char *strtmp; strtmp=strepy(strtmp,str); while((strtmp[0]=="' ')& &(strlen(strtmp)!=0)) strtmp=strtmp+1; //b6 qua dau cach dau n=strlen(strtmp);i=0; while (1){
if ((strtmp[i]!='') && (i<=n-1)) i++;
Trang 33° Nhập ma trận nxn
¢ - Tinh tong các phan tv chan trong ma tran
©Ổ - Tính tổng các phần tử thuộc 2 đường chéo