Professional Documents
Culture Documents
Tổng Quan
Mục Đích Yêu Cầu
Khái niệm về ngôn ngữ lập trình
Khái niệm về kiểu dữ liệu
Kiểu dữ liệu có cấu trúc (cấu trúc dữ liệu)
Khái niệm về giải thuật
Ngôn ngữ biểu diễn giải thuật
Ngôn ngữ sơ đồ (lưu đồ), sử dụng lưu đồ để biểu diễn
các giải thuật
Tổng quan về Ngôn ngữ lập trình C
Các kiểu dữ liệu trong C
Các lệnh có cấu trúc
Cách thiết kế và sử dụng các hàm trong C
Một số cấu trúc dữ liệu trong C
Nội Dung Cốt Lõi
Chương 1: Giới thiệu về ngôn ngữ C & môi trường lập
trình Turbo C
Chương 2: Các thành phần của ngôn ngữ C
Chương 3: Các kiểu dữ liệu sơ cấp chuẩn và các lệnh
đơn
Chương 4: Các lệnh có cấu trúc
Chương 5: Chương trình con
Chương 6: Kiểu mảng
Chương 7: Kiểu con trỏ
Chương 8: Kiểu chuỗi ký tự
Chương 9: Kiểu cấu trúc
Chương 10: Kiểu tập tin
LẬP TRÌNH CĂN BẢN
Phần 1
GIỚI THIỆU VỀ CẤU TRÚC DỮ
LIỆU VÀ GIẢI THUẬT
P.D.Nghiệp
Nội dung chương
Từ bài toán đến chương trình
Giải thuật
Khái niệm giải thuật
Các đặc trưng của giải thuật
Ngôn ngữ biểu diễn giải thuật
Một số giải thuật cơ bản
Các cấu trúc suy luận cơ bản của giải thuật
Từ giải thuật đến chương trình
Kiểu dữ liệu
Khái niệm về ngôn ngữ lập trình
Chương trình dịch
Từ Bài Toán Đến Chương Trình
Các bước giải bài toán bằng máy tính
Mô tả các bước giải bài toán
Vẽ sơ đồ xử lý
Viết chương trình xử lý bằng ngôn ngữ giả
Chọn ngôn ngữ lập trình và chuyển chương trình
từ ngôn ngữ giả sang ngôn ngữ lập trình
Thực hiện chương trình: nhập vào các tham số,
nhận kết quả
Giải Thuật
Khái niệm giải thuật
Các đặc trưng của giải thuật
Tuần tự (Sequential):
Các công việc được thực hiện tuần tự, công việc này nối tiếp
công việc kia.
“Kiểu dữ liệu là một tập hợp các giá trị có cùng một
tính chất và tập hợp các phép toán thao tác trên các
giá trị đó”.
Có 2 loại
Kiểu dữ liệu sơ cấp
Kiểu dữ liệu có cấu trúc
Kiểu Dữ Liệu Sơ Cấp
“Kiểu
dữ liệu sơ cấp là kiểu dữ liệu mà giá trị
của nó là đơn nhất”.
30
Nội dung
Dennis
Ritchie(trái) và
Ken Thompson
trước hệ thống
PDP-11 với 2
text-terminal
(1972)
Lịch Sử (3)
Năm 1978, Dennis
Ritchie và Brian
Kernighan xuất bản 1
quyển sách mô tả ngôn
ngữ C.
#include <stdio.h>
#include<conio.h>
int main ()
{
char ten[50];
printf(“Xin cho biet ten cua ban !”);
scanf(“%s”,ten);
printf(“Xin chao ban %s”,ten);
getch();
return 0;
Gõ chương trình vào
}
Ghi chương trình đang soạn
thảo vào đĩa
Sử dụng File->Save hoặc gõ phím F2
Lệnh Save As để lưu chương trình với tên khác
Tên mới ( kể cả
tên thư mục)
Qui tắc đặt tên tập tin (file)
Theo quy tắc đặt tên tập tin của DOS.
Tên của tập tin gồm 2 phần: phần tên và phần mở rộng.
Phần tên:
Bắt đầu là 1 ký tự từ a..z (không phân biệt hoa thường).
Theo sau có thể là các ký tự từ a..z, các ký số từ 0..9 hay dấu
gạch dưới (_), phần này dài tối đa là 8 ký tự.
Phần mở rộng:
Dài tối đa 3 ký tự.
Ví dụ:
Tên đúng: CHAO.C, baitap2.c, chao_ban.c
Tên sai: 1CHAO.C, chao+ban.c
Thực hiện chương trình + Mở
một chương trình+ Thoát
Thực hiện chương trình
Nhấn Ctrl-F9 hoặc vào menu
Run->Run
Mở một chương trình đã có
trên đĩa
Vào menu File->Open hoặc
nhấn F3
Thoát khỏi Turbo C
Vào menu File->Exit hoặc
nhấn Alt-X
Các lệnh trên menu Option
Directories:
Include directories: chứa
các tập tin ta muốn đưa vào
chương trình (file .h trong
dòng #include).
Library directories: chứa
các tập tin thư viện (file .lib)
Output directory: chứa
các tập tin “đối tượng “ .obj
và .exe sau khi biên dịch
chương trình.
Source directories: chứa
các tập tin “nguồn” (.obj và
.lib).
Environment: dùng để
thiết lập môi trường làm
việc.
Hết chương
LẬP TRÌNH CĂN BẢN
Phần 2 - Chương 2
CÁC THÀNH PHẦN CƠ BẢN
CỦA NGÔN NGỮ C
P.D.Nghiệp
Nội dung chương này
Bộ chữ viết trong C
Các từ khóa
Tên và hằng
Kiểu void
Mang ý nghĩa là kiểu rỗng không chứa giá trị gì cả
Ví dụ: void main(){
….}
Dùng sizeof()
Kíchthước 1 kiểu có thể được xác định lúc
chạy chương trình (runtime), dùng sizeof:
Ví dụ:
sizeof(double) =>8(byte)
sizeof(long double)=>10(byte)
Kiểu enum (1)
enum gần giống với tiền xử lý #define.
Nó cho phép ta định nghĩa 1 danh sách các bí danh
(aliase) để trình bày các số nguyên.
Ví dụ:
#define MON 1
#define TUE 2
#define WED 3
có thể dùng enum:
enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun}
days;
Ưu điểm của enum so với #define là nó có phạm
vi (scope), nghĩa là 1 biến chỉ có tác dụng trong
khối (block) nó được khai báo.
Kiểu enum (2)
Kiểu enum (3)
Tên và hằng trong C
Tên (identifier)
Được dùng để đặt cho chương trình, hằng, kiểu,
biến, chương trình con, ...
Có 2 loại:
Tên chuẩn: là tên do C đặt sẵn như tên kiểu: int,
char, float,…; tên hàm: sin, cos...
Tên do người lập trình tự đặt.
Chú ý khi đặt tên
Tên do người lập trình tự đặt
Ví dụ:
Tên đặt hợp lệ: Chieu_dai, Chieu_Rong, Chu_Vi
Tên không hợp lệ: Do Dai, 12A2
Ví dụ:
020=2*81 + 0*80 =(16)10
Hằng số nguyên (2)
Hằng số nguyên 2 byte (int) hệ thập lục phân
Là kiểu số nguyên dùng:
10 ký số 0..9 và
6 ký tự A, B, C, D, E ,F
Cách biểu diễn:
0x<các ký số từ 0 đến 9 và 6 ký tự từ A đến F>
Số thập lục phân : 0xdndn-1dn-2…d1d0
n
Ví dụ:
0x345=3*162 + 4*161 + 5*160 = (837)10
0x2A9= 2*162 + 10*161 + 9*160= (681)10
Hằng số nguyên (3)
Ví dụ: Kết quả của chương trình sau là gi?
Hằng số nguyên (4)
Hằng số nguyên 4 byte (long)
Được biểu diễn như số int trong hệ thập phân
nhưng kèm theo ký tự l hoặc L.
Ví dụ:
45345L hay 45345l hay 45345
Hằng ký tự (char)
Ví dụ: ‘a’, ‘A’, ‘0’, ‘9’
Là 1 ký tự được viết trong
cặp dấu nháy đơn (‘).
Mỗi một ký tự tương ứng
với 1 giá trị trong bảng mã
ASCII.
Hằng ký tự cũng được xem
như trị số nguyên.
Chúng ta có thể thực hiện
các phép toán số học trên 2
ký tự (dùng giá trị ASCII của
chúng)
ASCII = American Standard
Code for Information
Interchange
Hằng chuỗi ký tự
Ví dụ: “Ngon ngu lap trinh C”
Là 1 chuỗi hay 1 xâu ký tự được đặt trong cặp dấu nháy
kép (“).
Chú ý:
“” : chuỗi rỗng - không có nội dung
Khi lưu trữ trong bộ nhớ, một chuỗi được kết thúc bằng ký tự
NULL (‘\0’: mã Ascii là 0).
Để biểu diễn ký tự đặc biệt bên trong chuỗi ta phải thêm dấu \ phía
trước.
Ví dụ:
Viết “I\’m a student” cho “I’m a student”
Viết “Day la ky tu \“dac biet\”” cho “Day la ky tu “dac biet””
Biến và Biểu thức (variable
and expression)
Cách viết giá trị cho biết luôn kiểu của nó:
Chú ý! C dùng “=” cho phép gán, và dùng “==“ cho phép
so sánh. Nó trả về 1 nếu bằng và 0 nếu ngược lại
Các toán tử quan hệ và các toán
tử Logic (1)
Các phép so sánh sau tạo ra các biểu thức logic có
giá trị kiểu Boolean
Các toán tử quan hệ và các toán
tử Logic (2)
Ví dụ:
Thứ tự ưu tiên
Các chỉ
thị tiền
Chương
xử lý
trình
chính
Định nghĩa
kiểu mới
Prototype
Khai báo
biến Cài đặt
ngoài các
hàm
Tiền xử lý và biên dịch (preprocess
and compile)
Lệnh xuất giá trị của biểu thức lên màn hình
Lệnh gán (1)
Ví dụ:
Cú pháp:
<Tên biến> = <biểu thức>;
Ý nghĩa: Gán giá trị cho 1 biến
Gán giá trị ngay tại lúc khai báo:
Lệnh gán (2)
Kiểu của biểu thức và của biến phải giống nhau
Chuyển được
Lệnh gán (4)
Kết quả chương trình sau là gì?
Lệnh gán (5)
Trong C, các chuyển đổi kiểu sau được làm tự động.
Những chuyển đổi trên đảm bảo không làm mất đi sự chính xác
(loss of precision).
Việc chuyển đổi theo các hướng khác có thể làm mất sự chính xác
Ví dụ:
Lệnh gán (6)
Ép kiểu (casting type)
Lệnh nhập giá trị từ bàn phím
cho biến (1)
scanf đọc dữ liệu từ bàn phím và gán vào biến
Ví dụ:
Output
Lệnh xuất giá trị của biểu thức
lên màn hình (2)
Nếu muốn in ra các biến và biểu thức, ta truyền nó vào
printf như các đối số.
Các định dạng (format) khác nhau cho các kiểu giá trị
khác nhau (dùng %).
Lệnh xuất giá trị của biểu thức
lên màn hình (3)
Các định dạng:
Ví dụ - Output từ C
Hết chương
Giải thích thêm về printf
Hết chương
LẬP TRÌNH CĂN BẢN
Phần 2 - Chương 4
CÁC LỆNH CÓ CẤU TRÚC
P.D.Nghiệp
Nội dung chương này
Khối lệnh trong C
Cấu trúc rẽ nhánh
In ra số ngày
của 1 tháng
Cấu trúc lặp
Cho phép lặp lại thực hiện 1 công việc nhiều lần.
Có 2 loại:
Lặp với số lần xác định
for
do-while
Vòng lặp for (1)
for (Biểu thức 1; biểu thức 2; biểu thức 3) <Công việc>;
output
Vòng lặp for (3)
Nhập số nguyên n. Tính tổng các số nguyên từ 1..n.
output
Vòng lặp while (1)
while (Biểu thức điều kiện) <Công việc>;
output
Vòng lặp while (3)
Nhập số nguyên n. Tính tổng các số nguyên từ 1..n.
output
Vòng lặp do-while (1)
do
<Công việc>
while (<Biểu thức điều kiện>);
output
Vòng lặp do-while (3)
Nhập số nguyên n.
Tính tổng các số
nguyên từ 1..n.
output
So sánh các vòng lặp
Vòng lặp for/while:
Kiểm tra điều kiện trước thực hiện công việc sau.
Công việc có thể không được thực hiện lần nào.
Vòng lặp kết thúc khi nào điều kiện sai.
Vòng lặp do-while
Thực hiện công việc trước kiểm tra điều kiện sau.
Công việc được thực hiện ít nhất 1 lần.
Vòng lặp kết thúc khi nào điều kiện sai.
Câu lệnh đặc biệt
Lệnh break
Dùng để thoát khỏi vòng lặp hoặc switch-case.
Tiếp tục thực hiện lệnh liền sau đó.
Lệnh continue
Trong vòng lặp, khi gặp lệnh continue, chương trình
sẽ bỏ qua các câu lệnh sau continue
for: quay lên tính trị cho biểu thức 3, rồi kiểm tra điều
kiện coi có lặp tiếp không.
while/do-while: kiểm tra điều kiện coi có lặp tiếp không.
Hết chương
LẬP TRÌNH CĂN BẢN
Phần 2 - Chương 5
CHƯƠNG TRÌNH CON
P.D.Nghiệp
Nội dung chương này
Ví dụ
Khái niệm về hàm trong C
Hàm đệ qui
Ví dụ (1)
In ra 50 ký tự ‘*’ và 50 ký tự ‘+’
Ví dụ (2)
Đâu là ưu điểm của việc dùng hàm?
Khái niệm về hàm trong C (1)
Để tránh rườm rà và mất thời gian khi viết chương trình,
những đoạn chương trình lặp đi lặp lại nhiều lần được viết
trong 1 module.
Chia chương trình thành nhiều module, mỗi module giải quyết
1 công việc nào đó.
Mỗi module như trên được gọi là 1 chương trình con.
Các module dễ dàng được kiểm tra tính đúng đắn trước khi
được ráp nối vào chương trình.
Khái niệm về hàm trong C (2)
Ví dụ: Tìm số lớn nhất trong 3 số a, b, và c.
Khái niệm về hàm trong C (3)
Có 2 loại hàm:
Hàm chuẩn
Hàm tự định nghĩa
Hàm chuẩn (hàm thư viện)
Được định nghĩa sẵn bởi ngôn ngữ lập trình và được chứa vào các thư
viện.
Muốn sử dụng phải khai báo #include <tên thư viện.h>
Một số thư viện thường dùng trong C:
stdio.h : Thư viện chứa các hàm vào/ ra chuẩn (standard input/output):
printf(), scanf(), getc(), putc(), gets(), puts(), fflush(), fopen(), fclose(),
fread(), fwrite(), getchar(), putchar(), getw(), putw(), …
conio.h : Thư viện chứa các hàm vào ra trong chế độ DOS (DOS console):
clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(), clreol(), …
math.h: Thư viện chứa các hàm tính toán: abs(), sqrt(), log(). log10(), sin(),
cos(), tan(), acos(), asin(), atan(), pow(), exp(), …
alloc.h: Thư viện chứa các hàm liên quan đến việc quản lý bộ nhớ: calloc(),
realloc(), malloc(), free(), farmalloc(), farcalloc(), farfree(), …
io.h: Thư viện chứa các hàm vào ra cấp thấp: open(), _open(), read(), _read(),
close(), _close(), creat(), _creat(), creatnew(), eof(), filelength(), lock(), …
graphics.h: Thư viện chứa các hàm liên quan đến đồ họa:initgraph(), line(),
circle(), putpixel(), getpixel(), setcolor(), …
Hàm tự định nghĩa (hàm người
dùng) (1)
Do người lập trình tự tạo ra nhằm đáp ứng nhu cầu xử lý của
mình.
Hết chương
LẬP TRÌNH CĂN BẢN
Phần 2 - Chương 6
KIỂU MẢNG
P.D.Nghiệp
Nội dung chương này
Giới
thiệu kiểu mảng trong C
Mảng 1 chiều
typedef struct{
Point Points[100]; Points[3]
int nPoints;
} Polygon;
Giới thiệu kiểu mảng trong C (4)
Ta có thể chia mảng làm 2 loại:
Mảng 1 chiều
Mảng nhiều chiều
Mảng 1 chiều (1)
Xét dưới góc độ toán học, mảng 1 chiều giống như một vector.
Mỗi phần tử của mảng 1 chiều có giá trị không phải là một
mảng khác.
Khai báo mảng với số phần tử xác định
Ví dụ: float a[100];
Cú pháp: <Kiểu> <Tên mảng ><[số phần tử]>;
Ví dụ 1:
int a[10];
a[0]=5; a[1]=5; a[2]=33; a[3]=33; a[4]=15;
printf(“%d %d %d %d %d”, a[0], a[1], a[2], a[3], a[4]);
Truy xuất từng phần tử của mảng (2)
Ví dụ 2: Vừa khai báo vừa gán trị cho 1 mảng 1 chiều các số
nguyên. In mảng số nguyên này lên màn hình.
Truy xuất từng phần tử của mảng (3)
Ví dụ 3: Đổi một số nguyên dương thập phân thành số nhị phân.
Truy xuất từng phần tử của mảng (4)
Ví dụ 4: Nhập vào một dãy n số và sắp xếp các số theo thứ tự tăng.
Truy xuất từng phần tử của mảng (5)
Ví dụ 5: Chương trình sau sẽ hiển thị kết quả gì?
Các phần tử của mảng a[0], …, a[11]. Việc truy cập a[12] sẽ vượt ra
bên ngoài mảng, ô nhớ của biến b.
Mảng nhiều chiều
Mảng nhiều chiều là mảng có từ 2 chiều trở lên.
Điều đó có nghĩa là mỗi phần tử của mảng là một mảng khác.
Người ta thường sử dụng mảng nhiều chiều để lưu các ma
trận, các tọa độ 2 chiều, 3 chiều…
Khai báo mảng 2 chiều tường minh
Cú pháp:
<Kiểu> <Tên mảng><[Số phần tử chiều 1]><[Số phần tử chiều 2]> ;
Ví dụ:
float m[8][9]; // mảng 2 chiều có 8*9 phần tử là số thực
Khai báo mảng 2 chiều không tường minh
Để khai báo mảng 2 chiều không tường minh, ta vẫn phải chỉ
ra số phần tử của chiều thứ hai (chiều cuối cùng).
Cú pháp:
<Kiểu> <Tên mảng> <[]><[Số phần tử chiều 2]>;
Ví dụ:
float m[][9];
Cách khai báo này cũng được áp dụng trong trường hợp:
vừa khai báo vừa gán trị
mảng 2 chiều là tham số hình thức của 1 hàm.
Truy xuất từng phần tử của mảng 2 chiều
Dùng:
Tên mảng[Chỉ số 1][Chỉ số 2]
Ví dụ (1)
Viết chương trình cho phép nhập 2 ma trận a, b có m dòng n cột, thực hiện
phép toán cộng hai ma trận a,b và in ma trận kết quả lên màn hình.
Ví dụ (2)
Hết chương
Hết chương
LẬP TRÌNH CĂN BẢN
Phần 2 - Chương 7
KIỂU CON TRỎ
P.D.Nghiệp
Nội dung chương này
Giới thiệu kiểu dữ liệu con trỏ
Khai báo và sử dụng biến con trỏ
Ví dụ 1:
float a=3.145;
float* ptr; //ptr is a pointer
ptr=&a;
FFF2 3.145
FFF2 (address)
Giới thiệu kiểu dữ liệu con trỏ (2)
Ví dụ 2:
In Linux
Khai báo và sử dụng biến con trỏ
Khai báo biến con trỏ
Các thao tác trên con trỏ
Khai báo biến con trỏ
int a, b, *pa, *pb; //pa và pb sẽ chỉ đến biến int
float f, *pf; //pa và pb sẽ chỉ đến biến float
void *ptr; //ptr sẽ chỉ vào bất kỳ biến kiểu gì
Cú pháp:
<Kiểu> *<Tên con trỏ>;
Ý nghĩa: Khai báo một biến có tên là Tên con trỏ dùng để
chứa địa chỉ của các biến có kiểu Kiểu.
Các thao tác trên con trỏ
Gán địa chỉ của biến cho biến con trỏ
Nội dung của ô nhớ con trỏ chỉ tới
Cấp phát vùng nhớ cho biến con trỏ
Cấp phát lại vùng nhớ cho biến con trỏ
Giải phóng vùng nhớ cho biến con trỏ
Một số phép toán trên con trỏ
Gán địa chỉ của biến cho biến con trỏ +
Nội dung của ô nhớ con trỏ chỉ tới (1)
Dùng & để lấy ra địa chỉ bộ nhớ (memory address) của 1 biến
int a=6;
int* c= &a; // &a là địa chỉ bộ nhớ của biến a
Dùng * để truy cập (access) đến nội dung (content) của biến
mà 1 con trỏ đang chỉ đến
int a=6;
int* c= &a;
*c=7; /*Thay đổi nội dung của biến a bằng cách
dùng địa chỉ của nó được chứa trong
con trỏ c*/
tương đương với
a=7;
Gán địa chỉ của biến cho biến con trỏ +
Nội dung của ô nhớ con trỏ chỉ tới (2)
Gán địa chỉ của biến cho biến con trỏ +
Nội dung của ô nhớ con trỏ chỉ tới (3)
Lưu ý:
=> Error!
Vì đã cho 1 con trỏ chỉ đến 1 biến khác kiểu với nó
Cấp phát vùng nhớ cho biến con trỏ(1)
Có 2 cách để dùng được biến con trỏ
1. Cho nó chứa địa chỉ của 1 vùng nhớ đang tồn tại
int a=6;
int* c= &a; // &a là địa chỉ bộ nhớ của biến a
1. Cấp phát 1 vùng nhớ mới, rồi cho con trỏ chỉ đến
int* ptr;
ptr = (int*)malloc(sizeof(int));
*ptr=6;
pointer ptr
FFFA 6
FFFA (address)
Cấp phát vùng nhớ cho biến con trỏ(2)
void *malloc(size_t size): Cấp phát vùng nhớ có kích thước là
size (byte)
void *calloc(size_t nitems, size_t size): Cấp phát vùng nhớ có
kích thước là nitems*size (byte)
Ví dụ:
int a, *pa, *pb;
pa = (int*)malloc(sizeof(int)); /* Cấp phát vùng nhớ có kích thước
bằng với kích thước của một số nguyên */
pb= (int*)calloc(10, sizeof(int)); /* Cấp phát vùng nhớ có thể chứa
được 10 số nguyên*/
Cấp phát lại vùng nhớ
cho biến con trỏ
int a, *pa;
pa = (int*)malloc(sizeof(int)); /*Cấp phát vùng nhớ có
kích thước 2 byte*/
pa = realloc(pa, 6); /*Cấp phát lại vùng nhớ có
kích thước mới là 6 byte*/
void *realloc(void *block, size_t size):
Ý nghĩa:
Cấp phát lại 1 vùng nhớ do con trỏ block quản lý, vùng nhớ này có
kích thước mới là size; khi cấp phát lại thì nội dung vùng nhớ trước
đó được copy đến vùng nhớ mới.
Kết quả trả về của hàm là địa chỉ đầu tiên của vùng nhớ mới. Địa chỉ
này có thể khác với địa chỉ được chỉ ra khi cấp phát ban đầu. Kết quả
là NULL nếu không cấp phát được.
Giải phóng vùng nhớ cho biến con trỏ
void
free(void *block): Giải phóng vùng nhớ
được quản lý bởi con trỏ block
Ví dụ
free(pa);
free(pb);
=> giải phóng vùng nhớ do
2 biến con trỏ pa & pb đang chỉ đến
Một số phép toán trên con trỏ
Phép gán =
Phép so sánh == và !=
Hết chương
LẬP TRÌNH CĂN BẢN
Phần 2 - Chương 8
CHUỖI KÝ TỰ
P.D.Nghiệp
Nội dung chương này
Khái niệm
Khai báo
Ten[0] Ten[12]
Ghi chú:
Chiều dài tối đa của biến chuỗi: 1..255 bytes.
Không nên khai báo thừa để tránh lãng phí bộ nhớ.
Khai báo theo con trỏ
Cú pháp: char *<Biến>;
Ví dụ: char *Ten;
Trong khai báo này, bộ nhớ sẽ dành 2 byte để lưu trữ địa chỉ
của biến con trỏ Ten đang chỉ đến.
Chưa cung cấp nơi để lưu trữ dữ liệu.
Muốn có chỗ để lưu trữ dữ liệu, ta phải gọi đến hàm malloc()
hoặc calloc() có trong “alloc.h”, sau đó mới gán dữ liệu cho
biến.
Tieu Dong Tu
Vừa khai báo vừa gán giá trị
Cú pháp:
char <Biến>[]=<”Hằng chuỗi”>;
Ví dụ:
Vua khai bao vua gan trị : Mau nang hay la mau mat em
Ghi chú: Chuỗi được khai báo là một mảng các ký tự nên các thao
tác trên mảng có thể áp dụng đối với chuỗi ký tự.
Các thao tác trên chuỗi ký tự
Nhập xuất chuỗi
Nhập chuỗi từ bàn phím
Xuất chuỗi lên màn hình
Một số hàm xử lý chuỗi (trong string.h)
Nhập chuỗi từ bàn phím
Dùng hàm gets()
Cú pháp:
gets(<Biến chuỗi>)
Ví dụ:
char Ten[20];
gets(Ten);
Ngoài ra, ta có thể sử dụng hàm printf(), cputs() (trong conio.h) để hiển thị
chuỗi lên màn hình.
Một số hàm xử lý chuỗi (trong string.h)
Cộng chuỗi - Hàm strcat()
Xác định độ dài chuỗi - Hàm strlen()
Đổi một ký tự thường thành ký tự hoa - Hàm toupper()
Đổi chuỗi chữ thường thành chuỗi chữ hoa, hàm strupr()
Đổi chuỗi chữ hoa thành chuỗi chữ thường, hàm strlwr()
Sao chép một phần chuỗi, hàm strncpy()
Trích một phần chuỗi, hàm strchr()
Tìm kiếm nội dung chuỗi, hàm strstr()
So sánh chuỗi, hàm strcmp()
So sánh chuỗi, hàm stricmp()
Khởi tạo chuỗi, hàm memset()
Đổi từ chuỗi ra số, hàm atoi(), atof(), atol() (trong stdlib.h)
Cộng chuỗi - strcat() (1)
Cú pháp:
char *strcat(char *des, const char *source)
Hàm này có tác dụng ghép chuỗi nguồn (source) vào chuỗi
đích (des).
Trả vể con trỏ chỉ đến chuỗi kết quả.
Cộng chuỗi - strcat() (2)
Vídụ: Nhập vào họ lót và tên của một người, sau
đó in cả họ và tên của họ lên màn hình.
Xác định độ dài chuỗi - strlen()
Cú pháp: int strlen(const char* s)
Ví dụ: Xác định độ dài 1 chuỗi nhập từ bàn phím.
Đổi một ký tự thường thành ký tự
hoa - toupper()
Cú pháp:
char toupper(char c)
Hàm này được dùng để chuyển đổi chuỗi chữ thường thành
chuỗi chữ hoa.
Kết quả trả về là 1 con trỏ chỉ đến chuỗi kết quả.
Đổi chuỗi chữ thường thành chuỗi
chữ hoa - strupr() (2)
Ví dụ: Nhập vào một chuỗi ký tự từ bàn phím. Sau đó sử dụng
hàm strupr() để chuyển đổi chúng thành chuỗi chữ hoa.
Đổi chuỗi chữ hoa thành chuỗi
chữ thường - strlwr()
Cú pháp:
char *strlwr(char *s)
Hàm này được dùng để chuyển đổi chuỗi chữ hoa thành chuỗi
chữ thường.
Kết quả trả về là 1 con trỏ chỉ đến chuỗi kết quả.
Sao chép chuỗi - strcpy() (1)
Cú pháp:
char *strcpy(char *Des, const char *Source)
Hàm này được dùng để sao chép toàn bộ nội dung của chuỗi
nguồn vào chuỗi đích.
Sao chép chuỗi - strcpy() (2)
Ví dụ: Viết chương trình cho phép chép toàn bộ chuỗi nguồn
vào chuỗi đích
Sao chép một phần chuỗi - strncpy()
và Trích một phần chuỗi - strchr()
Sao chép một phần chuỗi
Cú pháp:
char *strncpy(char *Des, const char *Source, size_t n)
Chép n ký tự đầu tiên của chuỗi nguồn sang chuỗi đích.
-32 0
Khởi tạo chuỗi - memset()
Cú pháp: void *memset(char *Des, int c, size_t n)
Đặt n ký tự đầu tiên của chuỗi Des là ký tự c.
Giá trị trả về: chuỗi Des.
Nằm trong thư viện: string.h và mem.h
Đổi từ chuỗi ra số - atoi(), atof(),
atol() (trong stdlib.h)
Cú pháp :
int atoi(const char *s) : chuyển chuỗi thành số nguyên
long atol(const char *s) : chuyển chuỗi thành số nguyên dài
float atof(const char *s) : chuyển chuỗi thành số thực
Nếu chuyển đổi không thành công, kết quả trả về
của các hàm là 0.
Ví dụ:
atoi(“1234”)=> 1234
Hết chương
LẬP TRÌNH CĂN BẢN
Phần 2 - Chương 9
KIỂU CẤU TRÚC
P.D.Nghiệp
Nội dung chương này
Kiểu cấu trúc trong C
Các thao tác trên biến kiểu cấu trúc
1 struct:
1 mảng:
Định nghĩa kiểu cấu trúc +
Khai báo biến cấu trúc (1)
Cách 1:
struct <Tên cấu trúc> { struct SinhVien{
<Kiểu> <Trường 1>; char MSSV[10];
char HoTen[40];
<Kiểu> <Trường 2>; struct NgayThang
…….. NgaySinh;
<Kiểu> <Trường n>; int Phai;
char DiaChi[40];
} [biến 1, biến 2]; };
Tuy nhiên
A và B là các biến có kiểu
struct point.
Sau này ta có thể khai báo thêm
các biến khác có kiểu struct point
này.
Định nghĩa kiểu cấu trúc +
Khai báo biến cấu trúc (3)
Cách 2:
typedef struct { typedef struct{
<Kiểu> <Trường 1> ; char MSSV[10];
char HoTen[40];
<Kiểu> <Trường 2> ; NgayThang NgaySinh;
…….. int Phai;
<Kiểu> <Trường n> ; char DiaChi[40];
} SinhVien;
} <Tên cấu trúc>;
⇒Khai báo biến:
Ví dụ:
typedef struct{
unsigned char Ngay; NgayThang NgaySinh;
unsigned char Thang; SinhVien SV;
unsigned int Nam;
<Tên cấu trúc> tên_biến;
} NgayThang;
Các thao tác trên biến kiểu cấu
trúc
Truy xuất đến từng trường của biến cấu trúc
Khởi tạo cấu trúc
Truy xuất đến từng trường (field)
của biến cấu trúc (1)
Cú pháp: <Biến cấu trúc>.<Tên trường>
Ta không thể thực hiện được các thao tác sau đây cho biến
cấu trúc:
Sử dụng các hàm xuất nhập trên biến cấu trúc
Các phép toán quan hệ, các phép toán số học và logic
Khởi tạo cấu trúc
Biếncấu trúc có thể được khởi tạo giá trị ban
đầu lúc khai báo
Ví dụ:
Truy cập các thành phần của cấu trúc đang được
quản lý bởi con trỏ
Khai báo (1)
Cú pháp:
struct <Tên cấu trúc> * <Tên biến con trỏ>;
Ví dụ 1:
struct NgayThang *p;
hoặc
NgayThang *p; // Nếu có dùng typedef
Khai báo (2)
Ví dụ 2:
Ví dụ:
struct NgayThang *p;
…
p=(struct NgayThang *)malloc(sizeof(struct NgayThang));
p->Ngay=29; p->Thang=8; p->Nam=1986;
Hoặc
struct NgayThang Ngay = {29,8,1986};
p = &Ngay;
Truy cập các thành phần của cấu trúc
đang được quản lý bởi con trỏ (1)
Với khai báo sau:
struct NgayThang *p;
p->Ngay p->Thang
hoặc
(*p).Ngay (*p).Thang
Truy cập các thành phần của cấu trúc
đang được quản lý bởi con trỏ (3)
Ví dụ
Hết chương
LẬP TRÌNH CĂN BẢN
Phần 2 - Chương 10
KIỂU TẬP TIN
P.D.Nghiệp
Nội dung chương này
Một số khái niệm về tập tin
Các thao tác trên tập tin
FILE *f1,*f2;
Mở tập tin (1)
Cú pháp:
FILE *fopen(char *Path, const char *Mode)
Ý nghĩa:
Trả về con trỏ tập tin của tập tin được mở
Trả về NULL nếu có lỗi
Mở tập tin (2)
Path: chuỗi chỉ đường dẫn đến tập tin trên đĩa
Type: chuỗi xác định cách thức mà tập tin sẽ mở. Các giá trị
có thể của Mode:
Mở tập tin (3)
Ví dụ: Mở một tập tin tên TEST.txt để ghi.
FILE *f;
f = fopen(“TEST.txt”, “w”);
if (f!=NULL){
// Các câu lệnh để thao tác với tập tin
// Đóng tập tin
}
=> mở tập tin để ghi
=> nếu tập tin đã tồn tại rồi thì tập tin sẽ bị xóa và một
tập tin mới được tạo ra
Đóng tập tin
Cú pháp: int fclose(FILE *f)
Ghi dữ liệu còn lại trong vùng đệm vào tập tin và đóng lại tập tin
f là con trỏ tập tin được mở bởi hàm fopen()
Giá trị trả về là 0 báo rằng việc đóng tập tin thành công
Giá trị trả về là EOF nếu có xuất hiện lỗi
Ý nghĩa:
Làm cho con trỏ quay về đầu tập tin như khi mở nó
Truy cập tập tin văn bản
Ghidữ liệu lên tập tin văn bản
Đọc dữ liệu từ tập tin văn bản
Ghi dữ liệu lên tập tin văn bản (1)
Hàm putc()
int putc(int c, FILE *f)
Được dùng để ghi một ký tự lên một tập tin văn bản
đang được mở (liên kết với con trỏ f) để làm việc
c chứa mã Ascii của ký tự
Hàm này trả về EOF nếu gặp lỗi
Ghi dữ liệu lên tập tin văn bản (2)
Hàm fputs()
int fputs(const char *buffer, FILE *f)
Được dùng để ghi dữ liệu có định dạng lên tập tin văn bản.
format: chuỗi định dạng (giống với các định dạng của hàm
printf())
varexpr: danh sách các biểu thức, mỗi biểu thức cách nhau
dấu phẩy (,)
Đọc dữ liệu từ tập tin văn bản (1)
Hàm getc()
int getc(FILE *f)
Được dùng để đọc dữ liệu từ tập tin văn bản đang được mở
để làm việc (liên kết với f)
Hàm này trả về mã Ascii của một ký tự được đọc (kể cả
EOF)
Đọc dữ liệu từ tập tin văn bản (2)
Hàm fgets()
char *fgets(char *buffer, int n, FILE *f)
Được dùng để đọc 1 chuỗi ký tự từ tập tin văn bản đang được mở
(liên kết với con trỏ f)
Đọc cho đến khi đủ n ký tự hoặc gặp ký tự xuống dòng ‘\n’ (ký
tự này cũng được đưa vào chuỗi kết quả) hay gặp ký tự kết thúc
EOF (ký tự này không được đưa vào chuỗi kết quả)
buffer: chỉ đến cùng nhớ đủ lớn chứa các ký tự nhận được
Ký tự NULL (‘\0’) tự động được thêm vào cuối chuỗi kết quả lưu
trong vùng đệm
Hàm trả về địa chỉ đầu tiên của vùng đệm khi không gặp lỗi và
chưa gặp ký tự kết thúc EOF. Ngược lại, hàm trả về giá trị NULL
Đọc dữ liệu từ tập tin văn bản (3)
Hàm fscanf()
fscanf(FILE *f, const char *format, varlist)
Được dùng để đọc dữ liệu từ tập tin văn bản vào danh
sách các biến theo định dạng.
format: chuỗi định dạng (giống hàm scanf())
varlist: danh sách các biến mỗi biến cách nhau dấu
phẩy (,).
Đọc dữ liệu từ tập tin văn bản (4)
Ví dụ: Viết chương trình chép tập tin D:\Baihat.txt ở trên sang
tập tin D:\Baica.txt.
Truy cập tập tin nhị phân
Ghi dữ liệu lên tập tin nhị phân
Đọc dữ liệu từ tập tin nhị phân
Ví dụ
Ghi dữ liệu lên tập tin nhị phân
Hàm fwrite()
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *f)
ptr: con trỏ chỉ đến vùng nhớ chứa thông tin cần ghi lên tập
tin.
n: số phần tử sẽ ghi lên tập tin.
size: kích thước của mỗi phần tử.
f: con trỏ tập tin đã được mở.
Giá trị trả về của hàm này là số phần tử được ghi lên tập tin.
Giá trị này bằng n trừ khi xuất hiện lỗi.
Đọc dữ liệu từ tập tin nhị phân
Hàm fread()
size_t fread(const void *ptr, size_t size, size_t n, FILE *f)
ptr: con trỏ chỉ đến vùng nhớ sẽ nhận dữ liệu từ tập tin
n: số phần tử được đọc từ tập tin
size: kích thước của mỗi phần tử
f: con trỏ tập tin đã được mở
Giá trị trả về của hàm này là số phần tử đã đọc được từ
tập tin. Giá trị này bằng n hay nhỏ hơn n nếu đã chạm
đến cuối tập tin hoặc có lỗi xuất hiện
Di chuyển con trỏ tập tin
Hàm fseek()
int fseek(FILE *f, long offset, int whence)
Được dùng để di chuyển con trỏ tập tin đến vị trí chỉ định
f: con trỏ tập tin đang thao tác
offset: số byte cần dịch chuyển con trỏ tập tin kể từ vị trí trước đó. Phần
tử đầu tiên là vị trí 0.
whence: vị trí bắt đầu để tính offset, ta có thể chọn điểm xuất phát là
Kết quả trả về của hàm là 0 nếu việc di chuyển thành công. Nếu không
thành công, 1 giá trị khác 0 (đó là 1 mã lỗi) được trả về.
Ví dụ
Viết chương trình ghi lên tập tin CacSo.Dat 3 giá trị số (thực,
nguyên, nguyên dài). Sau đó đọc các số từ tập tin vừa ghi và
hiển thị lên màn hình
Hết chương