Kỹ Thuật Lập Trình
Chia sẻ bởi Phuoc It |
Ngày 10/05/2019 |
46
Chia sẻ tài liệu: Kỹ Thuật Lập Trình thuộc Tin học 12
Nội dung tài liệu:
CƠ SỞ LẬP TRÌNH
Khoa Công nghệ Thông Tin
Đại học Ngân hàng TP. Hồ Chí Minh
Đề cương bài giảng
Thời lượng : 45 tiết lý thuyết + 30 tiết thực hành.
Môn học tiên quyết: Tin học đại cương.
Hình thức đánh giá :
Thi kiểm tra giữa học kỳ : 30%
Thi kiểm tra cuối học kỳ : 70%
Tài liệu học tập :
GS Phạm Văn Ất, Kỹ thuật lập trình C - cơ sở và nâng cao, NXB Thống kê, 2003.
Tài liệu tham khảo
C - The Complete Reference, Herbert Schildt Fourth Edition
Chương 1 : Các khái niệm cơ bản
Mô hình máy tính
Von Neumann
Chương 1 : Các khái niệm cơ bản
Chương trình máy tính là gì ?
Một chuỗi các câu lệnh nhằm giải quyết một mục đích nhất định.
Các câu lệnh được thực hiện một cách tuyến tính. Không có câu lệnh nào được thực hiện khi câu lệnh trước đó chưa hoàn thành.
Chương trình có thể được biểu diễn bằng một ngôn ngữ lập trình.
Chương 1 : Các khái niệm cơ bản
Ngôn ngữ lập trình
và Trình biên dịch
Programming language - Ngôn ngữ lập trình là ngôn ngữ để viết chương trình. Có nhiều loại ngôn ngữ lập trình.
Compiler – trình biên dịch, là phần mềm chịu trách nhiệm dịch chương trình viết bằng một ngôn ngữ lập trình sang dạng mã máy.
Các lớp Ngôn ngữ lập trình
MACHINE CODE
ASSEMBLER LANGUAGES
HIGH-LEVEL
LANGUAGES
ForTran, COBOL, C, C++,
LISP, Pascal, Java, ...
4GLs
ORACLE, SEQUEL, INGRES, ...
5GLs
artificial intelligence
Hợp ngữ - Assembler
Quá trình giải quyết vấn đề
Chương 1 : Các khái niệm cơ bản
Giải thuật
Một chuỗi các câu lệnh đặc tả các bước yêu cầu để thực hiện một vài nhiệm vụ nhất định
Một số ví dụ về giải thuật trong cuộc sống:
Hướng dẫn nấu ăn
Hướng dẫn lắp đặt một thiết bị
Các luật thực hiện một trò chơi
Hướng dẫn đường đi từ A đến B
Hướng dẫn sửa chữa xe máy
Chương 1 : Các khái niệm cơ bản
Giải thuật nấu cơm
Chương 1 : Các khái niệm cơ bản
Kiểm tra giải thuật
Chương 1 : Các khái niệm cơ bản
Tập ký tự
26 chữ cái hoa : A B C … Z.
26 chữ cái thường : a b c … z.
10 chữ số : 0 1 2 … 9.
Các ký hiệu toán học : + - * / = ().
Các ký tự đặc biệt khác : _ . , : ; [] {} ? ! & | % …
Chương 1 : Các khái niệm cơ bản
Từ khóa
Từ khóa thường được sử dụng để khai báo các kiểu dữ liệu, để viết các toán tử và các câu lệnh.
Ví dụ về từ khóa : if else goto for while case break continue default sizeof int char enum void …
Chú ý : không được dùng từ khóa để đặt tên cho các hằng, biến, mảng, hàm …
Chương 1 : Các khái niệm cơ bản
Tên
Tên là một dãy các ký tự (chữ, số và dấu gạch nối), dùng để xác định các đối tượng khác nhau trong một chương trình.
Qui ước đặt tên (Turbo C) :
Ký tự đầu tiên phải là chữ hoặc dấu gạch nối.
Tên không được trùng với từ khóa.
Độ dài cực đại của tên mặc định là 32.
Ví dụ : acb123 _local beta1 customer
Chương 1 : Các khái niệm cơ bản
Tên (tt)
Một số ví dụ sai khi đặt tên :
123abc
@mail
f(x)
default
sub-name
hello world
x&y
Chương 1 : Các khái niệm cơ bản
Cấu trúc chung
của một chương trình
Các dẫn xuất tiền xử lý
Định nghĩa các hàm {
khai báo các biến cục bộ;
các khối chương trình;
}
Khai báo các biến toàn cục;
main() {
khai báo các biến cục bộ;
các khối chương trình;
}
Chương 1 : Các khái niệm cơ bản
Cấu trúc cơ bản chương trình C
Chương 1 : Các khái niệm cơ bản
Các khai báo
toàn cục
Hàm main
Các khai báo cục bộ
Các câu lệnh
Các hàm khác
Các khai báo cục bộ
Các câu lệnh
Thực thi
Cấu trúc cơ bản
chương trình C (tt)
Chương 1 : Các khái niệm cơ bản
Ví dụ chương trình C
Chương 1 : Các khái niệm cơ bản
Ví dụ (tt)
/*VIDU.C*/
#include
int main()
{
printf(“Co so lap trinh ");
printf(“Vi du 1 ");
return 0;
}
Co so lap trinh
Vi du 1
Thư viện nhập xuất chuẩn
Ghi chú
Báo CT kết thúc cho HĐH
Chương 1 : Các khái niệm cơ bản
Một số lưu ý từ ví dụ
Phần ghi chú được trình biên dịch bỏ qua
Phân biệt chữ in hoa và chữ in thường
Câu lệnh luôn được kết thúc bằng dấu ;
Chuỗi ký tự phải ghi giữa cặp nháy kép “
In xuống dòng dùng ký tự
Chương trình nên thông báo kết quả thực hiện với hệ thống: Tốt – 0, có lỗi – 1, 2, 3 …
Chương trình có một hàm main
Chương 1 : Các khái niệm cơ bản
Ví dụ (tt)
#include
int main(void)
{
int a, b;
printf(“Nhap 2 so ngguyen: ");
scanf("%i %i", &a, &b);
printf("%i + %i = %i ", a, b, a - b);
return 0;
}
Khai báo 2 biến số nguyên, “a” và “b”
Nhập 2 số nguyên vào a và b
Viết các biểu thức “a”, “b” và “a+b” theo định dạng %i
Nhap 2 so nguyen: 6 12
6 + 12 = 18
Chương 1 : Các khái niệm cơ bản
Ví dụ (tt)
Chương 1 : Các khái niệm cơ bản
/* Chuong trinh tinh chu vi va dien tich hinh tron */
#include
#include
#include
void main()
{
float r, cv, dt;
printf(“ Ban kinh r = ");
scanf(“%f”,&r);
cv = 2 * M_PI * r;
dt = m_PI * r * r;
printf(“ Chu vi = %8.2f Dien tich = %8.2f”,cv,dt);
getch();
}
Một số qui tắc cần lưu ý
Mỗi câu lệnh có thể viết trên một hay nhiều dòng nhưng phải được kết thúc bằng dấu ; .
Qui tắc viết các lời giải thích.
Qui tắc sử dụng các hàm chuẩn.
Cấu trúc của một chương trình.
Chương 1 : Các khái niệm cơ bản
Biến
Dùng để chứa các giá trị - nơi mà giá trị được lưu trữ
Ví dụ:
Chương 1 : Các khái niệm cơ bản
Khai báo biến
Mọi biến trước khi sử dụng đều phải khai báo để xác định kiểu của nó .
Ví dụ : int a,b; /*Khai báo các biến số nguyên a,b */
float x,y; /*Khai báo các biến số thực x,y */
Biến khai báo trong khối được gọi là biến cục bộ, không thuộc khối nào được gọi là biến toàn cục.
Có tác dụng trong toàn khối kể từ lúc được khai báo.
Chương 1 : Các khái niệm cơ bản
Toán tử gán
Toán tử gán có dạng : tên_biến = biểu_thức;
Ví dụ1 : a = 5;
b = 2 * a + 1;
Trước tiên biểu thức bên phải đuợc tính và kết quả tính toán được gán cho biến bên trái.
Lưu ý : phân biệt toán tử gán với khái niệm đẳng thức trong toán học.
Chương 1 : Các khái niệm cơ bản
Phép gán
Có thể sử dụng liên tiếp nhiều phép gán
Giá trị được gán sẽ sẵn sàng cho lệnh kế tiếp
int i, j, k, l, m, n;
i = j = k = l = m = n = 22;
printf("%i ", j = 22);
“n = 22” gán trước, lại gán “n” cho “m”, “m” cho “l”, … i, j, k, l, m, n đều nhận giá trị 22.
“j” được gán 22, giá trị 22 sẽ được in ra màn hình
Chương 1 : Các khái niệm cơ bản
Phép tăng (giảm) 1
NNLT C có 2 toán tử đặc biệt hỗ trợ việc tăng (giảm) giá trị của một biến thay đổi 1 đơn vị
++ tăng 1
-- giảm 1
Các toán tử này có thể đặt ở trước hoặc sau biến.
int i = 5, j = 4;
i ++;
-- j;
++ i;
“i” 6
“j” 3
“i” 7
Chương 1 : Các khái niệm cơ bản
Trước hay sau ?
Thứ tự thực hiện các toán tử ++ và -- phụ thuộc vào vị trí của chúng (trước hay sau) so với biến:
#include
int main(void)
{
int i, j = 5;
i = ++j;
printf("i=%d, j=%d ", i, j);
j = 5;
i = j++;
printf("i=%d, j=%d ", i, j);
return 0;
}
i=6, j=6
i=5, j=6
Tương đương:
1. j++;
2. i = j;
Tương đương:
1. i = j;
2. j++;
Chương 1 : Các khái niệm cơ bản
Lệnh nhập - scanf
Nhập dữ liệu từ bàn phím
int a, b;
scanf("%i %i", &a, &b);
Trong chuỗi định dạng chỉ có ký tự định dạng và khoảng trắng.
Dữ liệu phải được nhập vào các biến.
Trước tên biến phải ghi dấu & - toán tử địa chỉ. Nếu không có toán tử địa chỉ, giá trị của biến sẽ không được cập nhật
Thư viện: stdio.h
Chương 1 : Các khái niệm cơ bản
Lệnh nhập (tt)
Chương 1 : Các khái niệm cơ bản
Lệnh xuất - printf
Xuất dữ liệu ra màn hình:
int a , b;
printf("%i - %i = %i ", a, b, a - b);
Các ký tự hằng được in nguyên văn
Các ký tự định dạng được thay bằng giá trị của biểu thức tương ứng:
%i: ký tự định dạng số nguyên kiểu int
Các ký tự điều khiển : \ …
Thư viện: stdio.h
Chương 1 : Các khái niệm cơ bản
Qui ước định dạng giá trị
Chương 1 : Các khái niệm cơ bản
Biên dịch chương trình C
Chương 1 : Các khái niệm cơ bản
Lỗi có thể xảy ra trong pha dịch hoặc pha liên kết
Vận hành chương trình
trên máy
Mở chương trình Turbo C
Soạn thảo chương trình (tạo file chương trình gốc đuôi .c )
Dịch chương trình (tạo file đuôi .exe)
Thực thi chương trình (thực thi file .exe)
Chương 1 : Các khái niệm cơ bản
Bài tập chương 1
Chương 1 : Các khái niệm cơ bản
Chương 2: Sử dụng các kiểu dữ liệu
Chuyển đổi kiểu giá trị
Trong C sử dụng các kiểu dữ liệu:
Ký tự (char)
Số nguyên (int)
Số thực (float, double)
Chương 2 : Sử dụng các kiểu dữ liệu
Kiểu ký tự
Một giá trị kiểu ký tự (char) chiếm 1 byte (8 bit) và biểu diễn ký tự thông qua bảng mã ASCII.
Ví dụ : Ký tự Mã ASCII
0,1,…,9 48,49,…,57
A,B,C,… 65,66,67,…
a,b,c,… 97,98,99,…
Chương 2 : Sử dụng các kiểu dữ liệu
Kiểu ký tự
#include
#include
int main()
{
char lower_a = `a`;
char lower_m = `m`;
printf("minimum char = %i", CHAR_MIN);
printf("maximum char = %i ", CHAR_MAX);
printf(“Sau `%c` la `%c` ", lower_a, lower_a + 1);
printf(“Ky tu in hoa `%c` ", lower_m - `a` + `A`);
return 0;
}
minimum char = -128, maximum char = 127
Sau `a` la `b`
Ky tu in hoa `M`
In ra mã ASCII của ký tự
Ví dụ kiểu ký tự
Trong NNLT C, ký tự chính là số nguyên
Chương 2: Sử dụng các kiểu dữ liệu
Các kiểu số nguyên của C
C hỗ trợ khá nhiều kiểu số nguyên
Các giá trị lớn nhất và nhỏ nhất được định nghĩa trong thư viện “limits.h”
Kiểu định dạng kích thước nhỏ nhất lớn nhất
char %c 1 CHAR_MIN CHAR_MAX
unsigned char %c 1 0 UCHAR_MAX
short [int] %hi 2 SHRT_MIN SHRT_MAX
unsigned short %hu 2 0 USHRT_MAX
int %i 2 or 4 INT_MIN INT_MAX
unsigned int %u 2 or 4 0 UINT_MAX
long [int] %li 4 LONG_MIN LONG_MAX
unsigned long %lu 4 0 ULONG_MAX
Chương 2: Sử dụng các kiểu dữ liệu
Ví dụ về số nguyên
#include
#include
int main()
{
unsigned long big = ULONG_MAX;
printf("minimum int = %i, ", INT_MIN);
printf("maximum int = %i ", INT_MAX);
printf("maximum unsigned = %u ", UINT_MAX);
printf("maximum long int = %li ", LONG_MAX);
printf("maximum unsigned long = %lu ", big);
return 0;
}
minimum int = -32768, maximum int = 32767
maximum unsigned = 65535
maximum long int = 2147483647
maximum unsigned long = 4294967295
Chương 2: Sử dụng các kiểu dữ liệu
Số nguyên trong các cơ số khác
Các hệ cơ số có thể thực hiện được: cơ số 8 (octal), cơ số 10 (decimal), cơ số 16 (hexadecimal)
Số 0: số octal
0x: số hexadecimal
#include
int main(void)
{
int dec = 20, oct = 020, hex = 0x20;
printf("dec=%d, oct=%d, hex=%d ", dec, oct, hex);
printf("dec=%d, oct=%o, hex=%x ", dec, oct, hex);
return 0;
}
dec=20, oct=16, hex=32
dec=20, oct=20, hex=20
Chương 2: Sử dụng các kiểu dữ liệu
Số thực
C hỗ trợ nhiều kiểu số thực lưu trữ dấu chấm động.
Các giá trị lớn nhất và nhỏ nhất được định nghĩa trong thư viện “float.h”
Kiểu định dạng kích thước nhỏ nhất lớn nhất
float %f %e %g 4 FLT_MIN FLT_MAX
double %lf %le %lg 8 DBL_MIN DBL_MAX
long double %Lf %Le %Lg 10 LDBL_MIN LDBL_MAX
Chương 2: Sử dụng các kiểu dữ liệu
Ví dụ số thực:
#include
#include
int main(void)
{
double f = 3.1416, g = 1.2e-5, h = 5000000000.0;
printf("f=%lf g=%lf h=%lf ", f, g, h);
printf("f=%le g=%le h=%le ", f, g, h);
printf("f=%lg g=%lg h=%lg ", f, g, h);
printf("f=%7.2lf g=%.2le h=%.4lg ", f, g, h);
return 0;
}
f=3.141600 g=0.000012 h=5000000000.000000
f=3.141600e+00 g=1.200000e-05 h=5.000000e+09
f=3.1416 g=1.2e-05 h=5e+09
f= 3.14 g=1.20e-05 h=5e+09
Chương 2: Sử dụng các kiểu dữ liệu
Hằng – Constant
const int days_in_week = 7;
Chứa dữ liệu không thể thay đổi được trong chương trình.
Muốn sử dụng phải khai báo.
Phải có kiểu (tương tự như biến)
Hằng số có chứa “.” hoặc “e” có kiểu double (3.5, 1e-7, -1.29e15)
Hằng số kiểu float kết thúc bởi “F” (3.5F, 1e-7F)
Hằng số kiểu long double kết thúc bởi “L” (-1.29e15L, 1e-7L)
Hằng số không có “.”, “e” hoặc “F” có kiểu int. Ví dụ: 10000, -35. (Một vài trình biên dịch tự động chuyển thành long int nếu giá trị hằng tràn kiểu int)
Khai báo hằng long int phải thêm vào cuối “L” (9000000L)
Chương 2: Sử dụng các kiểu dữ liệu
Ví dụ về hằng
Các hằng pi, days_in_week, sunday được tạo với từ khóa const
#include
int main(void)
{
const long double pi = 3.141592653590L;
const int days_in_week = 7;
const sunday = 0;
days_in_week = 5;
return 0;
}
Lỗi
Chương 2: Sử dụng các kiểu dữ liệu
Hằng xử lý trước biên dịch
Các hằng có thể được xác lập trước khi biên dịch
Bản chất là tìm kiếm và thay thế
Thường được đặt tên với các chữ cái in hoa
#include
#define PI 3.141592653590L
#define DAYS_IN_WEEK 7
#define SUNDAY 0
int day = SUNDAY;
long flag = USE_API;
Tìm từ “PI”, thay bằng 3.1415....
Không thay thế “PI”
Lưu ý: không có “=” và “;”
Chương 2: Sử dụng các kiểu dữ liệu
Chuyển đổi kiểu dữ liệu
Thường diễn ra tự động trong hai trường hợp :
Khi biểu thức gồm các toán hạng khác kiểu
Khi gán một giá trị kiểu này cho một biến kiểu khác
Ngoài ra có thể chuyển từ một kiểu giá trị sang một
kiểu bất kỳ bằng phép ép kiểu:
(Type) (biểu thức)
Ví dụ : (float) (a+b)
Chương 2: Sử dụng các kiểu dữ liệu
Chuyển đổi kiểu
trong biểu thức
Khi hai toán hạng trong một phép toán có kiểu khác nhau thì kiểu thấp hơn sẽ được nâng thành kiểu cao hơn trước khi thực hiện phép toán.
Giữa int và long thì int chuyển thành long
Giữa int và float thì int chuyển thành float
Giữa float và double thì float chuyển thành doubl
Ví dụ: 1.5*(11/3)=4.5
1.5*11/3=5.5
Chương 2: Sử dụng các kiểu dữ liệu
Ép kiểu
Ép kiểu làm thay đổi tạm thời kiểu của một biến trong một biểu thức.
int main(void)
{
int i = 5, j = 4;
double f;
f = (double)i / j;
f = i / (double)j;
f = (double)i / (double)j;
f = (double)(i / j);
return 0;
}
Phép chia số nguyên được thực hiện, kết quả, 1, được đổi sang kiểu double, 1.00000
Chương 2: Sử dụng các kiểu dữ liệu
Toán tử trong C
Phép toán số học
Các toán tử trên bit
Các toán tử so sánh
Toán tử sizeof
Biểu thức điều kiện
Chương 2: Sử dụng các kiểu dữ liệu
Toán tử số học
NNLT C hỗ trợ các phép toán số học:
+ cộng
- trừ
* nhân
/ chia
% chia lấy dư
Lưu ý:
“/” cho kết quả phụ thuộc vào kiểu của các toán hạng
“%” không thực hiện được với các số thực
Chương 2: Sử dụng các kiểu dữ liệu
Ví dụ về toán tử chia “/”
Trình biên dịch dựa vào kiểu của các toán hạng để quyết định phép chia tương ứng
int main(void)
{
int i = 5, j = 4, k;
double f = 5.0, g = 4.0, h;
k = i / j;
h = f / g;
h = i / j;
return 0;
}
“i”, “j” kiểu int, “/” là phép chia lấy nguyên k nhận giá trị 1
“f”, “g” kiểu double, “/” là phép chia số thực
h nhận giá trị 1.25
Phép chia nguyên, bất kể “h” có kiểu double.
Kết quả là 1.00000
Chương 2: Sử dụng các kiểu dữ liệu
Toán tử trên bit
Các toán tử trên bit chỉ có tác dụng trên các kiểu số nguyên:
& And
| Or
^ XOr
>> Dịch phải
<< Dịch trái
Chương 2: Sử dụng các kiểu dữ liệu
Ví dụ về các toán tử trên bit
#include
int main(void)
{
short a = 0x6eb9;
short b = 0x5d27;
unsigned short c = 7097;
printf("0x%x, ", a & b);
printf("0x%x, ", a | b);
printf("0x%x ", a ^ b);
printf("%u, ", c << 2);
printf("%u ", c >> 1);
return 0;
}
0x4c21, 0x7fbf, 0x339e
28388, 3548
0x6eb9 0110 1110 1011 1001
0x5d27 0101 1101 0010 0111
0x4c21 0100 1100 0010 0001
0x6eb9 0110 1110 1011 1001
0x5d27 0101 1101 0010 0111
0x7fbf 0111 1111 1011 1111
0x6eb9 0110 1110 1011 1001
0x5d27 0101 1101 0010 0111
0x339e 0011 0011 1001 1110
7097 0001 1011 1011 1001
28388 0110 1110 1110 0100
7097 0001 1011 1011 1001
3548 0000 1101 1101 1100
Chương 2: Sử dụng các kiểu dữ liệu
Các toán tử so sánh
NNLT C hỗ trợ các phép so sánh:
< bé hơn
<= bé hơn hay bằng
> lớn hơn
>= lớn hơn hay bằng
== bằng
!= không bằng
Tất cả đều cho kết quả 1 khi so sánh đúng và 0 trong trường hợp ngược lại.
Chương 2: Sử dụng các kiểu dữ liệu
Kiểu luận lý trong C
Trong C không có kiểu dữ liệu luận lý (thể hiện các giá trị ĐÚNG – SAI), thay vào đó các biểu thức so sánh sẽ cho kết quả là SỐ
Giá trị 0 (0.0) ứng với kết quả SAI (FALSE)
Các giá trị khác như 1, -3.5, -7, 10.4, … (khác không) đều được xem là ĐÚNG (TRUE)
Chương 2: Sử dụng các kiểu dữ liệu
Toán tử luận lý
NNLT C hỗ trợ các toán tử luận lý:
&& và (and)
|| hoặc (or)
! phủ định (not)
Tất cả đều cho kết quả 1 hoặc 0 tương ứng các trường hợp ĐÚNG hoặc SAI
int i, j = 10, k = 28;
i = ((j > 5) && (k < 100)) || (k > 24);
Chương 2: Sử dụng các kiểu dữ liệu
Toán tử luận lý
Lưu ý khi sử dụng các toán tử luận lý:
Nếu không có các dấu (), các phép toán được thực hiện từ trái sang phải
if(i < 10 && a[i] > 0)
printf("%i ", a[i]);
“i < 10” được kiểm tra trước, nếu không đúng giá trị của biểu thức sẽ là 0 và “a[i] > 0” sẽ không được tính
if((i < 10) && (a[i] > 0))
printf("%i ", a[i]);
Không nên:(a < b < c)
Nên:((a < b) && (b< c)
Chương 2: Sử dụng các kiểu dữ liệu
Toán tử sizeof
sizeof(Obj)
Cho biết kích thước của đối tượng theo đơn vị byte
#include
int main(void)
{
long big;
printf(""big" is %u bytes ", sizeof(big));
printf("a short is %u bytes ", sizeof(short));
printf("a double is %u bytes ", sizeof (double));
return 0;
}
"big" is 4 bytes
a short is 2 bytes
a double is 8 bytes
Chương 2: Sử dụng các kiểu dữ liệu
Biểu thức chọn theo điều kiện
(điều kiện) ? BT1 : BT2
Biểu thức nhận giá trị BT1 nếu điều kiện khác 0 (ĐÚNG), các trường hợp khác nhận giá trị BT2
Có thể định nghĩa sẵn một macro để tìm số lớn:
#define max(x, y) ((x>y) ? x : y)
int i, j = 100, k = -1;
i = (j > k) ? j : k;
int i, j = 100, k = -1;
i = (j < k) ? j : k;
Nếu (j > k)
i = j;
Ngược lại
i = k;
Nếu (j < k)
i = j;
Ngược lại
i = k;
Chương 2: Sử dụng các kiểu dữ liệu
Độ ưu tiên của toán tử
Thứ tự thực hiện các toán tử trong một biểu thức phụ thuộc vào độ ưu tiên của chúng.
Có 15 mức ưu tiên.
Thông thường, toán tử một ngôi có độ ưu tiên cao hơn toán tử hai ngôi.
Các cặp dấu ngoặc đơn () thường được dùng để chỉ rõ thứ tự các toán tử.
#include
int main(void)
{
int j = 3 * 4 + 48 / 7;
printf("j = %i ", j);
return 0;
}
j = 18
Chương 2: Sử dụng các kiểu dữ liệu
Bảng thứ tự thực hiện các toán tử
Toán tử Thứ tự (cùng ĐƯT)
() [] -> .
! ++ -- - + (cast) * & sizeof
* / %
+ -
<< >>
< <= >= >
== !=
&
|
^
&&
||
?:
= += -= *= /= %= …
Chương 2: Sử dụng các kiểu dữ liệu
Luyện tập
#include
int main(void)
{
int i = 0, j, k = 7, m = 5, n;
j = m += 2;
printf("j = %d ", j);
j = k++ > 7;
printf("j = %d ", j);
j = i == 0 & k;
printf("j = %d ", j);
n = !i > k >> 2;
printf("n = %d ", n);
return 0;
}
Chương 2: Sử dụng các kiểu dữ liệu
Vài nét về hàm
và chương trình
Hàm là một đơn vị độc lập của chương trình. Tính độc lập của hàm thể hiện trên hai điểm :
Không cho phép xây dựng hàm bên trong một hàm khác.
Mỗi hàm có các biến, mảng … riêng của mình và chúng chỉ được sử dụng nội bộ bên trong hàm.
Chương 2: Sử dụng các kiểu dữ liệu
Vài nét về hàm
và chương trình (tt)
Một chương trình bao gồm một hoặc nhiều hàm. Hàm main() là thành phần bắt buộc của chương trình.
Chương trình bắt đầu thực hiện từ câu lệnh đầu tiên của hàm main() và kết thúc khi gặp dấu “)” cuối cùng của hàm này.
Khi chương trình làm việc, máy có thể đi từ hàm này đến hàm khác.
Chương 2: Sử dụng các kiểu dữ liệu
Bài tập chương 2
Chương 1 : Các khái niệm cơ bản
Chương 3: Vào ra
dữ liệu
Hàm printf
Dạng tổng quát của hàm:
int printf(const char *dk [,danh sách các đối]);
Hàm printf có khả năng chuyển dạng, tạo khuôn và đưa giá trị các đối ra màn hình
Chương 3 : Vào ra dữ liệu
Ví dụ hàm printf
#include
#include
void main()
{
int n = 8;
float x = 25.6, y = -47.335;
printf(“ %f %*.2f”,x,n,y);
getch();
}
25.60000
-47.335
Chương 3 : Vào ra dữ liệu
Ví dụ hàm printf (tt)
#include
#include
void main()
{
int a = 10, b = 11, m;
m = printf(“ A=%4d B=%d”,a,b);
printf(“ %d”,m);
getch();
}
A= 10 B=11
12
Chương 3 : Vào ra dữ liệu
Hàm scanf
Hàm có dạng:
int scanf(const char *dk [,danh sách các đối]);
Đọc thông tin từ bàn phím, chuyển dịch thành số nguyên, số thực…và lưu trữ vào bộ nhớ theo các địa chỉ xác định
Chương 3 : Vào ra dữ liệu
Ví dụ hàm scanf
#include
void main()
{
int a;
long b;
float x;
double y;
printf(“Nhap a,b,x,y : “);
scanf(“%ld%d%lf%f”,&a,&b,&x,&y);
printf(“ a=%6d b=%6ld x=%4.2f y=%4.2lf”,
&a,&b,&x,&y);
}
Nhap a,b,x,y : 2346 447895 347 246
a= 2346
b= 54679
x= 0.00
y= 0.00
Chương 3 : Vào ra dữ liệu
Dùng sai đặc tả
Ví dụ hàm scanf (tt)
#include
void main()
{
int a;
long b;
float x;
double y;
printf(“Nhap a,b,x,y : “);
scanf(“%d%ld%f%lf”,&a,&b,&x,&y);
printf(“ a=%6d b=%6ld x=%4.2f y=%4.2lf”,
&a,&b,&x,&y);
}
Nhap a,b,x,y : 2346 447895 347 246
a= 2346
b=447895
x= 347.00
y= 246.00
Chương 3 : Vào ra dữ liệu
Xuất dữ liệu ra máy in
Để đưa dữ liệu ra máy in, dùng hàm chuẩn fprintf, có dạng sau :
int fprintf(stdprn,const char *dk [,danh sách các đối]);
Tham số stdprn xác định thiết bị đưa dữ liệu ra là máy in.
Ví dụ: fprintf(stdprn,” Co so lap trinh”);
fprintf(stdprn,” a + b = %d”,a+b);
Chương 3 : Vào ra dữ liệu
Các hàm nhập ký tự
Hàm gets : nhập một chuỗi ký tự từ bàn phím
Dạng hàm : char gets(char *s).
Đối : s là con trỏ (kiểu char) trỏ tới vùng nhớ chứa chuỗi ký tự nhận được.
Công dụng : nhận dãy ký tự từ bàn phím cho đến khi nhận được ‘ ’.
Hàm trả về địa chỉ chuỗi nhận được
Chương 3 : Vào ra dữ liệu
Ví dụ hàm gets
char ht[25];
int t;
printf(“ Tuoi : “);
scanf(“%d%*c”,&dt); /* Khử ‘ ’ */
printf(“ Ho ten : “);
gets(ht);
Chương 3 : Vào ra dữ liệu
Ví dụ hàm gets (tt)
char ht[25];
int t;
printf(“ Tuoi : “);
scanf(“%d”,&dt);
printf(“ Ho ten : “);
fflush(stdin); /* xóa stdin */
gets(ht);
Chương 3 : Vào ra dữ liệu
Các hàm nhập ký tự (tt)
Hàm getchar : nhận một ký tự từ bàn phím
Dạng hàm : int getchar(void).
Công dụng : nhận một ký tự từ bàn phím.
Hàm trả về ký tự nhận được
Ví dụ: int ch;
ch = getchar();
Chương 3 : Vào ra dữ liệu
Ví dụ hàm nhập ký tự
Chương 3 : Vào ra dữ liệu
int a;
char ch, ht[25];
scanf(“%d”,&a);
ch = getchar();
gets(ht);
Chuỗi nhập: 21HT1 CNTT
-> a = 21
ch = H
ht = “T1 CNTT”
Các hàm xuất ký tự
Hàm puts : đưa một chuỗi ký tự ra màn hình
Dạng hàm : int puts(const char *s).
Đối : s là con trỏ (kiểu char) trỏ tới vùng nhớ chứa chuỗi ký tự cần xuất ra màn hình.
Công dụng : đưa chuỗi s và thêm ký tự ‘ ’ ra màn hình, khi thành công hàm trả về ký tự ‘ ’, ngược lại trả về EOF.
Ví dụ : puts(“Co so lap trinh”);
Chương 3 : Vào ra dữ liệu
Các hàm xuất ký tự (tt)
Hàm putchar : đưa một ký tự ra màn hình.
Dạng hàm : int putchar(int ch).
Đối : ch chứa mã ký tự cần xuất.
Công dụng : đưa ký tự ch ra màn hình, khi thành công hàm trả về ký tự được xuất, ngược lại trả về EOF.
Ví dụ : putchar(‘A’);
putchar(7);
Chương 3 : Vào ra dữ liệu
Các hàm vào ra trên
màn hình, bàn phím
Hàm getch
Dạng hàm : int getch(void).
Công dụng : nhận một ký tự từ bộ đệm bàn phím, không cho hiện lên màn hình.
Hàm trả về ký tự nhận được.
Chương 3 : Vào ra dữ liệu
Các hàm vào ra trên
màn hình, bàn phím (tt)
Hàm getche
Dạng hàm : int getch(void).
Công dụng : nhận một ký tự từ bộ đệm bàn phím, cho hiện lên màn hình.
Hàm trả về ký tự nhận được.
Chương 3 : Vào ra dữ liệu
Các hàm vào ra trên
màn hình, bàn phím (tt)
Hàm putch
Dạng hàm : int putch(int ch).
Đối : ch chứa mã ký tự cần hiển thị.
Công dụng : đưa một ký tự ra cửa sổ văn bản màn hình.
Hàm trả về ký tự được hiển thị.
Chương 3 : Vào ra dữ liệu
Các hàm vào ra trên
màn hình, bàn phím (tt)
Hàm kbhit
Dạng hàm : int kbhit(void).
Công dụng : kiểm tra bộ đệm bàn phím.
Hàm trả về giá trị khác 0 nếu bộ đệm bàn phím khác rỗng, có giá trị 0 nếu trái lại.
Chương 3 : Vào ra dữ liệu
Các hàm vào ra trên
màn hình, bàn phím (tt)
Hàm xóa màn hình và di chuyển con trỏ.
Xóa màn hình : clrscr();
Di chuyển con trỏ đến vị trí (x,y) : gotoxy(x,y)
x là số hiệu cột, nhận giá trị từ 1 đến 80
y là dòng, có giá trị từ 1 đến 25
Chương 3 : Vào ra dữ liệu
Các hàm vào ra trên
màn hình, bàn phím (tt)
Ví dụ :
#include
void main()
{
tiep:
putch(7);
if (!kbhit()) goto tiep;
if (getch()!=27) goto tiep;
}
Chương 3 : Vào ra dữ liệu
Bài tập chương 3
Chương 3 : Vào ra dữ liệu
Chương 4: Các cấu trúc điều khiển
Khái niệm về câu lệnh
và khối lệnh
Chương 4 : Các cấu trúc điều khiển
Lệnh if
Chương 4 : Các cấu trúc điều khiển
Ví dụ lệnh if
Chương 4 : Các cấu trúc điều khiển
Lỗi thường gặp
Chương 4 : Các cấu trúc điều khiển
Lệnh else
Chương 4 : Các cấu trúc điều khiển
Ví dụ lệnh else
Chương 4 : Các cấu trúc điều khiển
Lỗi thường gặp
Chương 4 : Các cấu trúc điều khiển
Lệnh if lồng (else if)
Chương 4 : Các cấu trúc điều khiển
Lệnh switch
Chương 4 : Các cấu trúc điều khiển
Lệnh switch (tt)
Một lệnh đa lựa chọn trên các giá trị nguyên
Biểu thức phải có giá trị nguyên
Khi thực hiện giá trị của biểu thức được tính và trường hợp case có giá trị khớp với biểu thức sẽ được thực hiện.
Nếu không có case nào tương ứng, tập lệnh tùy chọn default được thực hiện
Chương 4 : Các cấu trúc điều khiển
Ví dụ lệnh switch
Chương 4 : Các cấu trúc điều khiển
Sử dụng break
Khi một case của lệnh switch được tìm thấy, các lệnh được thực hiện bắt đầu từ điểm này.
Tiếp tục thực hiện các câu lệnh tiếp theo cho đến khi gặp câu lệnh break
Lệnh break làm chương trình chuyển đến thực hiện câu lệnh tiếp theo sau lệnh switch
Chương 4 : Các cấu trúc điều khiển
Sử dụng break (tt)
Chương 4 : Các cấu trúc điều khiển
Cấu trúc lặp
Chương 4 : Các cấu trúc điều khiển
Được thực hiện để lặp nhiều lần một câu lệnh hay một khối lệnh
Các loại vòng lặp được hỗ trợ trong ngôn ngữ lập trình C:
for
while
do … while
Lệnh while
Chương 4 : Các cấu trúc điều khiển
while (<điều kiện>)
Thực hiện lặp một lệnh hay khối lệnh theo một điều kiện
Kiểm tra điều kiện ngay khi bắt đầu vào vòng lặp
Kết thúc vòng lặp khi điều kiện trở nên sai
Ví dụ lệnh while
Chương 4 : Các cấu trúc điều khiển
Ví dụ lệnh while (tt)
Chương 4 : Các cấu trúc điều khiển
Các lỗi thường gặp
Chương 4 : Các cấu trúc điều khiển
Lệnh for
Chương 4 : Các cấu trúc điều khiển
Ví dụ lệnh for
Chương 4 : Các cấu trúc điều khiển
So sánh while và for
Chương 4 : Các cấu trúc điều khiển
Các lỗi thường gặp
Chương 4 : Các cấu trúc điều khiển
Vòng lặp vô tận
Chương 4 : Các cấu trúc điều khiển
Lệnh break
Chương 4 : Các cấu trúc điều khiển
Lệnh do … while
Chương 4 : Các cấu trúc điều khiển
Ví dụ lệnh do … while
Chương 4 : Các cấu trúc điều khiển
Bài tập chương 4
Chương 4 : Các cấu trúc điều khiển
Chương 5: Hàm
Khái niệm
Hàm là một đoạn chương trình độc lập thực hiện trọn vẹn một công việc nhất định, có thể trả về giá trị cho chương trình gọi nó.
Hay nói cách khác hàm là sự chia nhỏ của chương trình.
Chương 5 : Hàm
Ví dụ về hàm
Chương 5 : Hàm
Tại sao sử dụng hàm ?
Chúng cho phép chia nhỏ vấn đề thành các công việc con.
_Giúp giải quyết dễ dàng hơn những vấn đề phức tạp.
Chương trình được viết sẽ sáng sủa hơn nhờ khả năng “trừu tượng hóa”.
_Chúng ta chỉ cần biết hàm làm gì mà không quan tâm nó làm như thế nào.
Chúng cho phép tổng quát hóa một nhóm lệnh lặp nhiều lần.
_Tránh viết đi viết lại nhiều lần một số nhóm lệnh.
Chương 5 : Hàm
Cấu trúc chương trình C
Chương 5 : Hàm
Khối khai báo
Hàm main
Các hàm con
(nếu có)
Thực thi
Cấu trúc chương trình C (tt)
Khối khai báo: bao gồm các khai báo về sử dụng thư viện, khai báo hằng số, khai báo hàm con (nguyên mẫu hàm), các biến toàn cục và các kiểu dữ liệu tự định nghĩa.
Nguyên mẫu hàm thực chất là dòng đầu tiên của hàm thêm dấu “;” vào cuối, tuy nhiên tham số trong nguyên mẫu hàm có thể bỏ phần tên
Tên hàm ([danh sách các tham số])
Hàm chính (main()) : chứa các biến, các lệnh và các lời gọi hàm cần thiết trong chương trình
Các hàm con : xử lý các vấn đề nhỏ trong chương trình
Chương 5 : Hàm
Xây dựng hàm
Với mỗi hàm xây dựng cần phải đặc tả:
Tên hàm
Tham số truyền vào
Loại giá trị mà hàm trả về nếu có
Khối lệnh được thực hiện khi hàm được gọi đến
Khối lệnh thực hiện còn được gọi là thân hàm
Chương 5 : Hàm
Ví dụ hàm tính giai thừa
Chương 5 : Hàm
Tham số hàm
Chương 5 : Hàm
Tham số hàm (tt)
Tham số không là con trỏ (tham trị) : không thay đổi hoặc không cần lấy giá trị mới của tham số sau lời gọi hàm. Tham số dang này chỉ mang ý nghĩa là dữ liệu đầu vào.
Tham số con trỏ (tham biến) : có sự thay đổi của tham số trong quá trình thực hiện và cần lấy lại giá trị đó sau khi ra khỏi hàm. Ứng dụng của tham số loại này có thể là dữ liệu đầu ra (kết quả) hoặc cũng có thể vừa là dữ liệu đầu vào vừa là dữ liệu đầu ra.
Chương 5 : Hàm
Ví dụ tham số
Chương 5 : Hàm
Trả về giá trị
Chương 5 : Hàm
Khai báo và định nghĩa hàm
Một định nghĩa hàm đặc tả đầy đủ tất cả các thành phần của hàm bao gồm cả thân hàm.
Một khai báo hàm chỉ cần đặc tả:
Tên hàm
Kiểu của từng tham số
Kiểu giá trị trả về
Tạo khai báo hàm bằng các nguyên mẫu (prototype)
Ví dụ: int Tinh_tong(int, int);
void Nhap_ma_tran(void);
Chương 5 : Hàm
Vai trò của nguyên mẫu
Một hàm có thể định nghĩa sau nhưng trước khi sử dụng phải được khai báo.
Cho phép gọi đến hàm mà không biết đến định nghĩa
Tập tin stdio.h chứa khai báo (nguyên mẫu) của hàm printf()
Một định nghĩa hàm bao gồm một khai báo.
Chương 5 : Hàm
Ví dụ nguyên mẫu hàm
Chương 5 : Hàm
Các hàm thư viện
Ngôn ngữ C cung cấp một số hàm thư viện như vào ra,toán học, quản lý bộ nhớ, xử lý xâu chuỗi, …
Để có thể sử dụng, ta cần khai báo nguyên mẫu của chúng trong chương trình
Các khai báo nguyên mẫu như thế này đã được viết trong các tập tin tiêu đề (.h), ta chỉ cần khai báo trong chương trình (#include) để sử dụng.
Chương 5 : Hàm
Thư viện toán học math.h
Chương 5 : Hàm
Khái niệm
Hàm là một đoạn chương trình độc lập thực hiện trọn vẹn một công việc nhất định, có thể trả về giá trị cho chương trình gọi nó, hay nói cách khác hàm là sự chia nhỏ của chương trình
Chương 5 : Hàm
Hàm đệ qui
Chương 5 : Hàm
Bài tập chương 5
Chương 5 : Hàm
Chương 6: Con trỏ
và mảng
Địa chỉ bộ nhớ của biến
Chương 6 : Con trỏ và mảng
Toán tử &
Chương 6 : Con trỏ và mảng
Con trỏ
Chương 6 : Con trỏ và mảng
Khai báo con trỏ
Chương 6 : Con trỏ và mảng
Khai báo con trỏ (tt)
Chương 6 : Con trỏ và mảng
Tham chiếu
Chương 6 : Con trỏ và mảng
Chú ý về con trỏ
Chương 6 : Con trỏ và mảng
Con trỏ null
Chương 6 : Con trỏ và mảng
Toán tử *
Chương 6 : Con trỏ và mảng
Các bước sử dụng con trỏ
Chương 6 : Con trỏ và mảng
Các bước sử dụng con trỏ (tt)
Chương 6 : Con trỏ và mảng
Các bước sử dụng con trỏ (tt)
Chương 6 : Con trỏ và mảng
Các bước sử dụng con trỏ (tt)
Chương 6 : Con trỏ và mảng
Bước 4 : Khử tham chiếu con trỏ
Lỗi thường gặp
Chương 6 : Con trỏ và mảng
Tham số hàm và con trỏ
Chương 6 : Con trỏ và mảng
Truyền theo tham trị
Chương 6 : Con trỏ và mảng
Truyền theo tham chiếu
Chương 6 : Con trỏ và mảng
Khái niệm mảng
Chương 6 : Con trỏ và mảng
Bộ nhớ của mảng
Chương 6 : Con trỏ và mảng
Chương trình dãy số
Chương 6 : Con trỏ và mảng
Khởi tạo mảng
Chương 6 : Con trỏ và mảng
Chỉ số mảng
Chương 6 : Con trỏ và mảng
Mảng và con trỏ
Chương 6 : Con trỏ và mảng
Truyền mảng cho hàm
Chương 6 : Con trỏ và mảng
Chương trình dãy số
(sử dụng hàm)
Chương 6 : Con trỏ và mảng
Chương trình dãy số (tt)
Chương 6 : Con trỏ và mảng
Mảng và con trỏ (tt)
Chương 6 : Con trỏ và mảng
Chương trình dãy số (tt)
Chương 6 : Con trỏ và mảng
Chương trình dãy số (tt)
Chương 6 : Con trỏ và mảng
Mảng hai chiều
Chương 6 : Con trỏ và mảng
Ví dụ bảng cửu chương
Chương 6 : Con trỏ và mảng
Biểu diễn ký tự trong bộ nhớ
Chương 6 : Con trỏ và mảng
Biểu diễn chuỗi ký tự
Chương 6 : Con trỏ và mảng
Mảng ký tự và chuỗi ký tự
Chương 6 : Con trỏ và mảng
Khai báo chuỗi
Chương 6 : Con trỏ và mảng
Khai báo chuỗi (tt)
Chương 6 : Con trỏ và mảng
Khai báo chuỗi (tt)
Chương 6 : Con trỏ và mảng
Xuất nhập chuỗi
Chương 6 : Con trỏ và mảng
Ký tự trong chuỗi
Chương 6 : Con trỏ và mảng
Chương trình đếm ký tự
Chương 6 : Con trỏ và mảng
Xử lý chuỗi
Chương 6 : Con trỏ và mảng
Gán chuỗi
Chương 6 : Con trỏ và mảng
Lỗi thường gặp
Chương 6 : Con trỏ và mảng
Gán dạng con trỏ
Chương 6 : Con trỏ và mảng
Gán dạng con trỏ (tt)
Chương 6 : Con trỏ và mảng
Nối chuỗi
Chương 6 : Con trỏ và mảng
Lỗi bộ nhớ
Chương 6 : Con trỏ và mảng
So sánh chuỗi
Chương 6 : Con trỏ và mảng
Lỗi về so sánh
Chương 6 : Con trỏ và mảng
Tham số hàm là chuỗi
Chương 6 : Con trỏ và mảng
Chương trình tách tên
Chương 6 : Con trỏ và mảng
Chương trình tách tên (tt)
Chương 6 : Con trỏ và mảng
Bài tập chương 6
Chương 6 : Con trỏ và mảng
Chương 7: Kiểu cấu trúc
Khái niệm
Cấu trúc (struct) thực chất là một kiểu dữ liệu do người dùng định nghĩa bằng cách gom nhóm các dữ liệu cơ bản có sẵn trong C thành một kiểu dữ liệu phức hợp nhiều thành phần.
Chương 7 : Kiểu cấu trúc
Định nghĩa kiểu dữ liệu
struct
{
Các kiểu dữ liệu thành phần;
};
Ngoài ra có thể dùng từ khóa typedef để định nghĩa một tên mới cho kiểu dữ liệu đã có.
typedef struct ;
Chương 7 : Kiểu cấu trúc
Khai báo cấu trúc
Chương 7 : Kiểu cấu trúc
Khai báo biến cấu trúc
Chương 7 : Kiểu cấu trúc
Để tạo một cấu trúc trong bộ nhớ máy tính, ta cần khai báo một biến cấu trúc như sau:
Kết hợp khai báo
Có thể kết hợp khai báo kiểu cấu trúc và biến trên cùng một dòng lệnh
Chương 7 : Kiểu cấu trúc
struct comlex
{
int real;
int img;
} num;
struct studentRec
{
char name[50];
int mark;
} jonh;
Truy nhập cấu trúc
Chương 7 : Kiểu cấu trúc
Để truy nhập vào một trường của biến cấu trúc ta dùng toán tử ‘.’ như ví dụ sau:
Truy nhập cấu trúc (tt)
Chương 7 : Kiểu cấu trúc
Trong trường hợp một biến cấu trúc được trỏ bởi một con trỏ, ta có thể truy cập vào các trường cấu trúc thông qua con trỏ bằng cách dùng toán tử ‘->’.
Định nghĩa kiểu
Dùng typedef để định nghĩa tên một kiểu dữ liệu mới mà có thể dùng trong các khai báo biến.
Chương 7 : Kiểu cấu trúc
Định nghĩa kiểu (tt)
Có thể gộp định nghĩa kiểu với khai báo cấu trúc như sau:
typedef struct studentRec
{
char name[50];
int mark;
} Student;
Student stdA, stdB, *ptr ;
Student stdList[100];
Chương 7 : Kiểu cấu trúc
So sánh cấu trúc
Không thể so sánh hai cấu trúc bằng toán tử ‘==‘
Chỉ có thể so sánh từng trường của cấu trúc
Chương 7 : Kiểu cấu trúc
Mảng cấu trúc
Chương 7 : Kiểu cấu trúc
Chương trình ví dụ
Chương 7 : Kiểu cấu trúc
Chương trình ví dụ (tt)
Chương 7 : Kiểu cấu trúc
Truyền cấu trúc làm tham số
Giống như mọi biến khác, cấu trúc có thể được dùng làm tham số của hàm.
Có hai cách truyền tham số cho một cấu trúc:
Truyền cấu trúc theo dạng sử dụng giá trị của các trường sẽ không làm thay đổi nội dung của biến cấu trúc gốc.
Truyền địa chỉ của cấu trúc để có thể làm thay đổi nội dung của cấu trúc gốc.
Chương 7 : Kiểu cấu trúc
Hàm trả về cấu trúc
Trả về một gói chứa nhiều giá trị.
Chương 7 : Kiểu cấu trúc
Ví dụ số phức
Chương 7 : Kiểu cấu trúc
Ví dụ số phức (tt)
Chương 7 : Kiểu cấu trúc
Bài tập chương 7
Chương 7 : Kiểu cấu trúc
Chương 8: Xử lý đồ họa
Khái niệm đồ họa
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
Khởi động đồ họa
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
Vẽ và tô màu
một số hình cơ bản
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
Xử lý văn bản
trên màn hình đồ họa
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
Cửa sổ và các thao tác
với vùng hình ảnh
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
In ảnh từ màn hình đồ họa
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
Một số chương trình đồ họa
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
Chương 9: Thao tác trên
các tập tin
Kênh xuất nhập
Là vùng đệm dùng cho việc nhập xuất dữ liệu ở mức cao.
Chương trình chỉ đọc và ghi dữ liệu trên vùng đệm, do đó các hàm vào ra độc lập với thiết bị đầu cuối.
Hệ điều hành đảm nhiệm việc đồng bộ hóa dữ liệu trên vùng đệm với thiết bị vào ra.
Có thể chuyển hướng vào ra của một kênh xuất nhập cho nhiều thiết bị khác nhau.
Chương 9 : Thao tác trên các tập tin
Kênh xuất nhập chuẩn
Luôn tồn tại 3 kênh xuất nhập chuẩn trong một chương trình : stdin, stdout và stderr.
Việc định hướng các kênh xuất nhập chuẩn này phụ thuộc vào lúc chạy chương trình, ngầm định là bàn phím cho stdin, màn hình cho stdout và std error.
scanf() và printf() là các hàm đọc và ghi trên các kênh stdint và stdout tương ứng.
perror() là hàm in thông báo lỗi ra kênh stderr.
Chương 9 : Thao tác trên các tập tin
Ví dụ xuất nhập
Chương 9 : Thao tác trên các tập tin
Vào ra tập tin
Tập tin cần được mở trước khi sử dụng
Mỗi tập tin được gắn với một thẻ tập tin khi mở
Thao tác với tập tin chỉ thông qua thẻ tập tin mà không thông qua tên tập tin.
Thẻ tập tin được dùng như là kênh xuất nhập cho các hàm vào ra tập tin.
Cần phải đóng tập tin trước khi kết thúc.
Các hàm thao tác tập tin cơ bản : fopen(), sclose(), fscanf(), fprintf().
Chương 9 : Thao tác trên các tập tin
Ví dụ
Chương 9 : Thao tác trên các tập tin
Hàm fprintf() và printf()
Hàm fprintf(,…) hoạt động giống như printf(…) nhưng được áp dụn
Khoa Công nghệ Thông Tin
Đại học Ngân hàng TP. Hồ Chí Minh
Đề cương bài giảng
Thời lượng : 45 tiết lý thuyết + 30 tiết thực hành.
Môn học tiên quyết: Tin học đại cương.
Hình thức đánh giá :
Thi kiểm tra giữa học kỳ : 30%
Thi kiểm tra cuối học kỳ : 70%
Tài liệu học tập :
GS Phạm Văn Ất, Kỹ thuật lập trình C - cơ sở và nâng cao, NXB Thống kê, 2003.
Tài liệu tham khảo
C - The Complete Reference, Herbert Schildt Fourth Edition
Chương 1 : Các khái niệm cơ bản
Mô hình máy tính
Von Neumann
Chương 1 : Các khái niệm cơ bản
Chương trình máy tính là gì ?
Một chuỗi các câu lệnh nhằm giải quyết một mục đích nhất định.
Các câu lệnh được thực hiện một cách tuyến tính. Không có câu lệnh nào được thực hiện khi câu lệnh trước đó chưa hoàn thành.
Chương trình có thể được biểu diễn bằng một ngôn ngữ lập trình.
Chương 1 : Các khái niệm cơ bản
Ngôn ngữ lập trình
và Trình biên dịch
Programming language - Ngôn ngữ lập trình là ngôn ngữ để viết chương trình. Có nhiều loại ngôn ngữ lập trình.
Compiler – trình biên dịch, là phần mềm chịu trách nhiệm dịch chương trình viết bằng một ngôn ngữ lập trình sang dạng mã máy.
Các lớp Ngôn ngữ lập trình
MACHINE CODE
ASSEMBLER LANGUAGES
HIGH-LEVEL
LANGUAGES
ForTran, COBOL, C, C++,
LISP, Pascal, Java, ...
4GLs
ORACLE, SEQUEL, INGRES, ...
5GLs
artificial intelligence
Hợp ngữ - Assembler
Quá trình giải quyết vấn đề
Chương 1 : Các khái niệm cơ bản
Giải thuật
Một chuỗi các câu lệnh đặc tả các bước yêu cầu để thực hiện một vài nhiệm vụ nhất định
Một số ví dụ về giải thuật trong cuộc sống:
Hướng dẫn nấu ăn
Hướng dẫn lắp đặt một thiết bị
Các luật thực hiện một trò chơi
Hướng dẫn đường đi từ A đến B
Hướng dẫn sửa chữa xe máy
Chương 1 : Các khái niệm cơ bản
Giải thuật nấu cơm
Chương 1 : Các khái niệm cơ bản
Kiểm tra giải thuật
Chương 1 : Các khái niệm cơ bản
Tập ký tự
26 chữ cái hoa : A B C … Z.
26 chữ cái thường : a b c … z.
10 chữ số : 0 1 2 … 9.
Các ký hiệu toán học : + - * / = ().
Các ký tự đặc biệt khác : _ . , : ; [] {} ? ! & | % …
Chương 1 : Các khái niệm cơ bản
Từ khóa
Từ khóa thường được sử dụng để khai báo các kiểu dữ liệu, để viết các toán tử và các câu lệnh.
Ví dụ về từ khóa : if else goto for while case break continue default sizeof int char enum void …
Chú ý : không được dùng từ khóa để đặt tên cho các hằng, biến, mảng, hàm …
Chương 1 : Các khái niệm cơ bản
Tên
Tên là một dãy các ký tự (chữ, số và dấu gạch nối), dùng để xác định các đối tượng khác nhau trong một chương trình.
Qui ước đặt tên (Turbo C) :
Ký tự đầu tiên phải là chữ hoặc dấu gạch nối.
Tên không được trùng với từ khóa.
Độ dài cực đại của tên mặc định là 32.
Ví dụ : acb123 _local beta1 customer
Chương 1 : Các khái niệm cơ bản
Tên (tt)
Một số ví dụ sai khi đặt tên :
123abc
f(x)
default
sub-name
hello world
x&y
Chương 1 : Các khái niệm cơ bản
Cấu trúc chung
của một chương trình
Các dẫn xuất tiền xử lý
Định nghĩa các hàm {
khai báo các biến cục bộ;
các khối chương trình;
}
Khai báo các biến toàn cục;
main() {
khai báo các biến cục bộ;
các khối chương trình;
}
Chương 1 : Các khái niệm cơ bản
Cấu trúc cơ bản chương trình C
Chương 1 : Các khái niệm cơ bản
Các khai báo
toàn cục
Hàm main
Các khai báo cục bộ
Các câu lệnh
Các hàm khác
Các khai báo cục bộ
Các câu lệnh
Thực thi
Cấu trúc cơ bản
chương trình C (tt)
Chương 1 : Các khái niệm cơ bản
Ví dụ chương trình C
Chương 1 : Các khái niệm cơ bản
Ví dụ (tt)
/*VIDU.C*/
#include
int main()
{
printf(“Co so lap trinh ");
printf(“Vi du 1 ");
return 0;
}
Co so lap trinh
Vi du 1
Thư viện nhập xuất chuẩn
Ghi chú
Báo CT kết thúc cho HĐH
Chương 1 : Các khái niệm cơ bản
Một số lưu ý từ ví dụ
Phần ghi chú được trình biên dịch bỏ qua
Phân biệt chữ in hoa và chữ in thường
Câu lệnh luôn được kết thúc bằng dấu ;
Chuỗi ký tự phải ghi giữa cặp nháy kép “
In xuống dòng dùng ký tự
Chương trình nên thông báo kết quả thực hiện với hệ thống: Tốt – 0, có lỗi – 1, 2, 3 …
Chương trình có một hàm main
Chương 1 : Các khái niệm cơ bản
Ví dụ (tt)
#include
int main(void)
{
int a, b;
printf(“Nhap 2 so ngguyen: ");
scanf("%i %i", &a, &b);
printf("%i + %i = %i ", a, b, a - b);
return 0;
}
Khai báo 2 biến số nguyên, “a” và “b”
Nhập 2 số nguyên vào a và b
Viết các biểu thức “a”, “b” và “a+b” theo định dạng %i
Nhap 2 so nguyen: 6 12
6 + 12 = 18
Chương 1 : Các khái niệm cơ bản
Ví dụ (tt)
Chương 1 : Các khái niệm cơ bản
/* Chuong trinh tinh chu vi va dien tich hinh tron */
#include
#include
#include
void main()
{
float r, cv, dt;
printf(“ Ban kinh r = ");
scanf(“%f”,&r);
cv = 2 * M_PI * r;
dt = m_PI * r * r;
printf(“ Chu vi = %8.2f Dien tich = %8.2f”,cv,dt);
getch();
}
Một số qui tắc cần lưu ý
Mỗi câu lệnh có thể viết trên một hay nhiều dòng nhưng phải được kết thúc bằng dấu ; .
Qui tắc viết các lời giải thích.
Qui tắc sử dụng các hàm chuẩn.
Cấu trúc của một chương trình.
Chương 1 : Các khái niệm cơ bản
Biến
Dùng để chứa các giá trị - nơi mà giá trị được lưu trữ
Ví dụ:
Chương 1 : Các khái niệm cơ bản
Khai báo biến
Mọi biến trước khi sử dụng đều phải khai báo để xác định kiểu của nó .
Ví dụ : int a,b; /*Khai báo các biến số nguyên a,b */
float x,y; /*Khai báo các biến số thực x,y */
Biến khai báo trong khối được gọi là biến cục bộ, không thuộc khối nào được gọi là biến toàn cục.
Có tác dụng trong toàn khối kể từ lúc được khai báo.
Chương 1 : Các khái niệm cơ bản
Toán tử gán
Toán tử gán có dạng : tên_biến = biểu_thức;
Ví dụ1 : a = 5;
b = 2 * a + 1;
Trước tiên biểu thức bên phải đuợc tính và kết quả tính toán được gán cho biến bên trái.
Lưu ý : phân biệt toán tử gán với khái niệm đẳng thức trong toán học.
Chương 1 : Các khái niệm cơ bản
Phép gán
Có thể sử dụng liên tiếp nhiều phép gán
Giá trị được gán sẽ sẵn sàng cho lệnh kế tiếp
int i, j, k, l, m, n;
i = j = k = l = m = n = 22;
printf("%i ", j = 22);
“n = 22” gán trước, lại gán “n” cho “m”, “m” cho “l”, … i, j, k, l, m, n đều nhận giá trị 22.
“j” được gán 22, giá trị 22 sẽ được in ra màn hình
Chương 1 : Các khái niệm cơ bản
Phép tăng (giảm) 1
NNLT C có 2 toán tử đặc biệt hỗ trợ việc tăng (giảm) giá trị của một biến thay đổi 1 đơn vị
++ tăng 1
-- giảm 1
Các toán tử này có thể đặt ở trước hoặc sau biến.
int i = 5, j = 4;
i ++;
-- j;
++ i;
“i” 6
“j” 3
“i” 7
Chương 1 : Các khái niệm cơ bản
Trước hay sau ?
Thứ tự thực hiện các toán tử ++ và -- phụ thuộc vào vị trí của chúng (trước hay sau) so với biến:
#include
int main(void)
{
int i, j = 5;
i = ++j;
printf("i=%d, j=%d ", i, j);
j = 5;
i = j++;
printf("i=%d, j=%d ", i, j);
return 0;
}
i=6, j=6
i=5, j=6
Tương đương:
1. j++;
2. i = j;
Tương đương:
1. i = j;
2. j++;
Chương 1 : Các khái niệm cơ bản
Lệnh nhập - scanf
Nhập dữ liệu từ bàn phím
int a, b;
scanf("%i %i", &a, &b);
Trong chuỗi định dạng chỉ có ký tự định dạng và khoảng trắng.
Dữ liệu phải được nhập vào các biến.
Trước tên biến phải ghi dấu & - toán tử địa chỉ. Nếu không có toán tử địa chỉ, giá trị của biến sẽ không được cập nhật
Thư viện: stdio.h
Chương 1 : Các khái niệm cơ bản
Lệnh nhập (tt)
Chương 1 : Các khái niệm cơ bản
Lệnh xuất - printf
Xuất dữ liệu ra màn hình:
int a , b;
printf("%i - %i = %i ", a, b, a - b);
Các ký tự hằng được in nguyên văn
Các ký tự định dạng được thay bằng giá trị của biểu thức tương ứng:
%i: ký tự định dạng số nguyên kiểu int
Các ký tự điều khiển : \ …
Thư viện: stdio.h
Chương 1 : Các khái niệm cơ bản
Qui ước định dạng giá trị
Chương 1 : Các khái niệm cơ bản
Biên dịch chương trình C
Chương 1 : Các khái niệm cơ bản
Lỗi có thể xảy ra trong pha dịch hoặc pha liên kết
Vận hành chương trình
trên máy
Mở chương trình Turbo C
Soạn thảo chương trình (tạo file chương trình gốc đuôi .c )
Dịch chương trình (tạo file đuôi .exe)
Thực thi chương trình (thực thi file .exe)
Chương 1 : Các khái niệm cơ bản
Bài tập chương 1
Chương 1 : Các khái niệm cơ bản
Chương 2: Sử dụng các kiểu dữ liệu
Chuyển đổi kiểu giá trị
Trong C sử dụng các kiểu dữ liệu:
Ký tự (char)
Số nguyên (int)
Số thực (float, double)
Chương 2 : Sử dụng các kiểu dữ liệu
Kiểu ký tự
Một giá trị kiểu ký tự (char) chiếm 1 byte (8 bit) và biểu diễn ký tự thông qua bảng mã ASCII.
Ví dụ : Ký tự Mã ASCII
0,1,…,9 48,49,…,57
A,B,C,… 65,66,67,…
a,b,c,… 97,98,99,…
Chương 2 : Sử dụng các kiểu dữ liệu
Kiểu ký tự
#include
#include
int main()
{
char lower_a = `a`;
char lower_m = `m`;
printf("minimum char = %i", CHAR_MIN);
printf("maximum char = %i ", CHAR_MAX);
printf(“Sau `%c` la `%c` ", lower_a, lower_a + 1);
printf(“Ky tu in hoa `%c` ", lower_m - `a` + `A`);
return 0;
}
minimum char = -128, maximum char = 127
Sau `a` la `b`
Ky tu in hoa `M`
In ra mã ASCII của ký tự
Ví dụ kiểu ký tự
Trong NNLT C, ký tự chính là số nguyên
Chương 2: Sử dụng các kiểu dữ liệu
Các kiểu số nguyên của C
C hỗ trợ khá nhiều kiểu số nguyên
Các giá trị lớn nhất và nhỏ nhất được định nghĩa trong thư viện “limits.h”
Kiểu định dạng kích thước nhỏ nhất lớn nhất
char %c 1 CHAR_MIN CHAR_MAX
unsigned char %c 1 0 UCHAR_MAX
short [int] %hi 2 SHRT_MIN SHRT_MAX
unsigned short %hu 2 0 USHRT_MAX
int %i 2 or 4 INT_MIN INT_MAX
unsigned int %u 2 or 4 0 UINT_MAX
long [int] %li 4 LONG_MIN LONG_MAX
unsigned long %lu 4 0 ULONG_MAX
Chương 2: Sử dụng các kiểu dữ liệu
Ví dụ về số nguyên
#include
#include
int main()
{
unsigned long big = ULONG_MAX;
printf("minimum int = %i, ", INT_MIN);
printf("maximum int = %i ", INT_MAX);
printf("maximum unsigned = %u ", UINT_MAX);
printf("maximum long int = %li ", LONG_MAX);
printf("maximum unsigned long = %lu ", big);
return 0;
}
minimum int = -32768, maximum int = 32767
maximum unsigned = 65535
maximum long int = 2147483647
maximum unsigned long = 4294967295
Chương 2: Sử dụng các kiểu dữ liệu
Số nguyên trong các cơ số khác
Các hệ cơ số có thể thực hiện được: cơ số 8 (octal), cơ số 10 (decimal), cơ số 16 (hexadecimal)
Số 0: số octal
0x: số hexadecimal
#include
int main(void)
{
int dec = 20, oct = 020, hex = 0x20;
printf("dec=%d, oct=%d, hex=%d ", dec, oct, hex);
printf("dec=%d, oct=%o, hex=%x ", dec, oct, hex);
return 0;
}
dec=20, oct=16, hex=32
dec=20, oct=20, hex=20
Chương 2: Sử dụng các kiểu dữ liệu
Số thực
C hỗ trợ nhiều kiểu số thực lưu trữ dấu chấm động.
Các giá trị lớn nhất và nhỏ nhất được định nghĩa trong thư viện “float.h”
Kiểu định dạng kích thước nhỏ nhất lớn nhất
float %f %e %g 4 FLT_MIN FLT_MAX
double %lf %le %lg 8 DBL_MIN DBL_MAX
long double %Lf %Le %Lg 10 LDBL_MIN LDBL_MAX
Chương 2: Sử dụng các kiểu dữ liệu
Ví dụ số thực:
#include
#include
int main(void)
{
double f = 3.1416, g = 1.2e-5, h = 5000000000.0;
printf("f=%lf g=%lf h=%lf ", f, g, h);
printf("f=%le g=%le h=%le ", f, g, h);
printf("f=%lg g=%lg h=%lg ", f, g, h);
printf("f=%7.2lf g=%.2le h=%.4lg ", f, g, h);
return 0;
}
f=3.141600 g=0.000012 h=5000000000.000000
f=3.141600e+00 g=1.200000e-05 h=5.000000e+09
f=3.1416 g=1.2e-05 h=5e+09
f= 3.14 g=1.20e-05 h=5e+09
Chương 2: Sử dụng các kiểu dữ liệu
Hằng – Constant
const int days_in_week = 7;
Chứa dữ liệu không thể thay đổi được trong chương trình.
Muốn sử dụng phải khai báo.
Phải có kiểu (tương tự như biến)
Hằng số có chứa “.” hoặc “e” có kiểu double (3.5, 1e-7, -1.29e15)
Hằng số kiểu float kết thúc bởi “F” (3.5F, 1e-7F)
Hằng số kiểu long double kết thúc bởi “L” (-1.29e15L, 1e-7L)
Hằng số không có “.”, “e” hoặc “F” có kiểu int. Ví dụ: 10000, -35. (Một vài trình biên dịch tự động chuyển thành long int nếu giá trị hằng tràn kiểu int)
Khai báo hằng long int phải thêm vào cuối “L” (9000000L)
Chương 2: Sử dụng các kiểu dữ liệu
Ví dụ về hằng
Các hằng pi, days_in_week, sunday được tạo với từ khóa const
#include
int main(void)
{
const long double pi = 3.141592653590L;
const int days_in_week = 7;
const sunday = 0;
days_in_week = 5;
return 0;
}
Lỗi
Chương 2: Sử dụng các kiểu dữ liệu
Hằng xử lý trước biên dịch
Các hằng có thể được xác lập trước khi biên dịch
Bản chất là tìm kiếm và thay thế
Thường được đặt tên với các chữ cái in hoa
#include
#define PI 3.141592653590L
#define DAYS_IN_WEEK 7
#define SUNDAY 0
int day = SUNDAY;
long flag = USE_API;
Tìm từ “PI”, thay bằng 3.1415....
Không thay thế “PI”
Lưu ý: không có “=” và “;”
Chương 2: Sử dụng các kiểu dữ liệu
Chuyển đổi kiểu dữ liệu
Thường diễn ra tự động trong hai trường hợp :
Khi biểu thức gồm các toán hạng khác kiểu
Khi gán một giá trị kiểu này cho một biến kiểu khác
Ngoài ra có thể chuyển từ một kiểu giá trị sang một
kiểu bất kỳ bằng phép ép kiểu:
(Type) (biểu thức)
Ví dụ : (float) (a+b)
Chương 2: Sử dụng các kiểu dữ liệu
Chuyển đổi kiểu
trong biểu thức
Khi hai toán hạng trong một phép toán có kiểu khác nhau thì kiểu thấp hơn sẽ được nâng thành kiểu cao hơn trước khi thực hiện phép toán.
Giữa int và long thì int chuyển thành long
Giữa int và float thì int chuyển thành float
Giữa float và double thì float chuyển thành doubl
Ví dụ: 1.5*(11/3)=4.5
1.5*11/3=5.5
Chương 2: Sử dụng các kiểu dữ liệu
Ép kiểu
Ép kiểu làm thay đổi tạm thời kiểu của một biến trong một biểu thức.
int main(void)
{
int i = 5, j = 4;
double f;
f = (double)i / j;
f = i / (double)j;
f = (double)i / (double)j;
f = (double)(i / j);
return 0;
}
Phép chia số nguyên được thực hiện, kết quả, 1, được đổi sang kiểu double, 1.00000
Chương 2: Sử dụng các kiểu dữ liệu
Toán tử trong C
Phép toán số học
Các toán tử trên bit
Các toán tử so sánh
Toán tử sizeof
Biểu thức điều kiện
Chương 2: Sử dụng các kiểu dữ liệu
Toán tử số học
NNLT C hỗ trợ các phép toán số học:
+ cộng
- trừ
* nhân
/ chia
% chia lấy dư
Lưu ý:
“/” cho kết quả phụ thuộc vào kiểu của các toán hạng
“%” không thực hiện được với các số thực
Chương 2: Sử dụng các kiểu dữ liệu
Ví dụ về toán tử chia “/”
Trình biên dịch dựa vào kiểu của các toán hạng để quyết định phép chia tương ứng
int main(void)
{
int i = 5, j = 4, k;
double f = 5.0, g = 4.0, h;
k = i / j;
h = f / g;
h = i / j;
return 0;
}
“i”, “j” kiểu int, “/” là phép chia lấy nguyên k nhận giá trị 1
“f”, “g” kiểu double, “/” là phép chia số thực
h nhận giá trị 1.25
Phép chia nguyên, bất kể “h” có kiểu double.
Kết quả là 1.00000
Chương 2: Sử dụng các kiểu dữ liệu
Toán tử trên bit
Các toán tử trên bit chỉ có tác dụng trên các kiểu số nguyên:
& And
| Or
^ XOr
>> Dịch phải
<< Dịch trái
Chương 2: Sử dụng các kiểu dữ liệu
Ví dụ về các toán tử trên bit
#include
int main(void)
{
short a = 0x6eb9;
short b = 0x5d27;
unsigned short c = 7097;
printf("0x%x, ", a & b);
printf("0x%x, ", a | b);
printf("0x%x ", a ^ b);
printf("%u, ", c << 2);
printf("%u ", c >> 1);
return 0;
}
0x4c21, 0x7fbf, 0x339e
28388, 3548
0x6eb9 0110 1110 1011 1001
0x5d27 0101 1101 0010 0111
0x4c21 0100 1100 0010 0001
0x6eb9 0110 1110 1011 1001
0x5d27 0101 1101 0010 0111
0x7fbf 0111 1111 1011 1111
0x6eb9 0110 1110 1011 1001
0x5d27 0101 1101 0010 0111
0x339e 0011 0011 1001 1110
7097 0001 1011 1011 1001
28388 0110 1110 1110 0100
7097 0001 1011 1011 1001
3548 0000 1101 1101 1100
Chương 2: Sử dụng các kiểu dữ liệu
Các toán tử so sánh
NNLT C hỗ trợ các phép so sánh:
< bé hơn
<= bé hơn hay bằng
> lớn hơn
>= lớn hơn hay bằng
== bằng
!= không bằng
Tất cả đều cho kết quả 1 khi so sánh đúng và 0 trong trường hợp ngược lại.
Chương 2: Sử dụng các kiểu dữ liệu
Kiểu luận lý trong C
Trong C không có kiểu dữ liệu luận lý (thể hiện các giá trị ĐÚNG – SAI), thay vào đó các biểu thức so sánh sẽ cho kết quả là SỐ
Giá trị 0 (0.0) ứng với kết quả SAI (FALSE)
Các giá trị khác như 1, -3.5, -7, 10.4, … (khác không) đều được xem là ĐÚNG (TRUE)
Chương 2: Sử dụng các kiểu dữ liệu
Toán tử luận lý
NNLT C hỗ trợ các toán tử luận lý:
&& và (and)
|| hoặc (or)
! phủ định (not)
Tất cả đều cho kết quả 1 hoặc 0 tương ứng các trường hợp ĐÚNG hoặc SAI
int i, j = 10, k = 28;
i = ((j > 5) && (k < 100)) || (k > 24);
Chương 2: Sử dụng các kiểu dữ liệu
Toán tử luận lý
Lưu ý khi sử dụng các toán tử luận lý:
Nếu không có các dấu (), các phép toán được thực hiện từ trái sang phải
if(i < 10 && a[i] > 0)
printf("%i ", a[i]);
“i < 10” được kiểm tra trước, nếu không đúng giá trị của biểu thức sẽ là 0 và “a[i] > 0” sẽ không được tính
if((i < 10) && (a[i] > 0))
printf("%i ", a[i]);
Không nên:(a < b < c)
Nên:((a < b) && (b< c)
Chương 2: Sử dụng các kiểu dữ liệu
Toán tử sizeof
sizeof(Obj)
Cho biết kích thước của đối tượng theo đơn vị byte
#include
int main(void)
{
long big;
printf(""big" is %u bytes ", sizeof(big));
printf("a short is %u bytes ", sizeof(short));
printf("a double is %u bytes ", sizeof (double));
return 0;
}
"big" is 4 bytes
a short is 2 bytes
a double is 8 bytes
Chương 2: Sử dụng các kiểu dữ liệu
Biểu thức chọn theo điều kiện
(điều kiện) ? BT1 : BT2
Biểu thức nhận giá trị BT1 nếu điều kiện khác 0 (ĐÚNG), các trường hợp khác nhận giá trị BT2
Có thể định nghĩa sẵn một macro để tìm số lớn:
#define max(x, y) ((x>y) ? x : y)
int i, j = 100, k = -1;
i = (j > k) ? j : k;
int i, j = 100, k = -1;
i = (j < k) ? j : k;
Nếu (j > k)
i = j;
Ngược lại
i = k;
Nếu (j < k)
i = j;
Ngược lại
i = k;
Chương 2: Sử dụng các kiểu dữ liệu
Độ ưu tiên của toán tử
Thứ tự thực hiện các toán tử trong một biểu thức phụ thuộc vào độ ưu tiên của chúng.
Có 15 mức ưu tiên.
Thông thường, toán tử một ngôi có độ ưu tiên cao hơn toán tử hai ngôi.
Các cặp dấu ngoặc đơn () thường được dùng để chỉ rõ thứ tự các toán tử.
#include
int main(void)
{
int j = 3 * 4 + 48 / 7;
printf("j = %i ", j);
return 0;
}
j = 18
Chương 2: Sử dụng các kiểu dữ liệu
Bảng thứ tự thực hiện các toán tử
Toán tử Thứ tự (cùng ĐƯT)
() [] -> .
! ++ -- - + (cast) * & sizeof
* / %
+ -
<< >>
< <= >= >
== !=
&
|
^
&&
||
?:
= += -= *= /= %= …
Chương 2: Sử dụng các kiểu dữ liệu
Luyện tập
#include
int main(void)
{
int i = 0, j, k = 7, m = 5, n;
j = m += 2;
printf("j = %d ", j);
j = k++ > 7;
printf("j = %d ", j);
j = i == 0 & k;
printf("j = %d ", j);
n = !i > k >> 2;
printf("n = %d ", n);
return 0;
}
Chương 2: Sử dụng các kiểu dữ liệu
Vài nét về hàm
và chương trình
Hàm là một đơn vị độc lập của chương trình. Tính độc lập của hàm thể hiện trên hai điểm :
Không cho phép xây dựng hàm bên trong một hàm khác.
Mỗi hàm có các biến, mảng … riêng của mình và chúng chỉ được sử dụng nội bộ bên trong hàm.
Chương 2: Sử dụng các kiểu dữ liệu
Vài nét về hàm
và chương trình (tt)
Một chương trình bao gồm một hoặc nhiều hàm. Hàm main() là thành phần bắt buộc của chương trình.
Chương trình bắt đầu thực hiện từ câu lệnh đầu tiên của hàm main() và kết thúc khi gặp dấu “)” cuối cùng của hàm này.
Khi chương trình làm việc, máy có thể đi từ hàm này đến hàm khác.
Chương 2: Sử dụng các kiểu dữ liệu
Bài tập chương 2
Chương 1 : Các khái niệm cơ bản
Chương 3: Vào ra
dữ liệu
Hàm printf
Dạng tổng quát của hàm:
int printf(const char *dk [,danh sách các đối]);
Hàm printf có khả năng chuyển dạng, tạo khuôn và đưa giá trị các đối ra màn hình
Chương 3 : Vào ra dữ liệu
Ví dụ hàm printf
#include
#include
void main()
{
int n = 8;
float x = 25.6, y = -47.335;
printf(“ %f %*.2f”,x,n,y);
getch();
}
25.60000
-47.335
Chương 3 : Vào ra dữ liệu
Ví dụ hàm printf (tt)
#include
#include
void main()
{
int a = 10, b = 11, m;
m = printf(“ A=%4d B=%d”,a,b);
printf(“ %d”,m);
getch();
}
A= 10 B=11
12
Chương 3 : Vào ra dữ liệu
Hàm scanf
Hàm có dạng:
int scanf(const char *dk [,danh sách các đối]);
Đọc thông tin từ bàn phím, chuyển dịch thành số nguyên, số thực…và lưu trữ vào bộ nhớ theo các địa chỉ xác định
Chương 3 : Vào ra dữ liệu
Ví dụ hàm scanf
#include
void main()
{
int a;
long b;
float x;
double y;
printf(“Nhap a,b,x,y : “);
scanf(“%ld%d%lf%f”,&a,&b,&x,&y);
printf(“ a=%6d b=%6ld x=%4.2f y=%4.2lf”,
&a,&b,&x,&y);
}
Nhap a,b,x,y : 2346 447895 347 246
a= 2346
b= 54679
x= 0.00
y= 0.00
Chương 3 : Vào ra dữ liệu
Dùng sai đặc tả
Ví dụ hàm scanf (tt)
#include
void main()
{
int a;
long b;
float x;
double y;
printf(“Nhap a,b,x,y : “);
scanf(“%d%ld%f%lf”,&a,&b,&x,&y);
printf(“ a=%6d b=%6ld x=%4.2f y=%4.2lf”,
&a,&b,&x,&y);
}
Nhap a,b,x,y : 2346 447895 347 246
a= 2346
b=447895
x= 347.00
y= 246.00
Chương 3 : Vào ra dữ liệu
Xuất dữ liệu ra máy in
Để đưa dữ liệu ra máy in, dùng hàm chuẩn fprintf, có dạng sau :
int fprintf(stdprn,const char *dk [,danh sách các đối]);
Tham số stdprn xác định thiết bị đưa dữ liệu ra là máy in.
Ví dụ: fprintf(stdprn,” Co so lap trinh”);
fprintf(stdprn,” a + b = %d”,a+b);
Chương 3 : Vào ra dữ liệu
Các hàm nhập ký tự
Hàm gets : nhập một chuỗi ký tự từ bàn phím
Dạng hàm : char gets(char *s).
Đối : s là con trỏ (kiểu char) trỏ tới vùng nhớ chứa chuỗi ký tự nhận được.
Công dụng : nhận dãy ký tự từ bàn phím cho đến khi nhận được ‘ ’.
Hàm trả về địa chỉ chuỗi nhận được
Chương 3 : Vào ra dữ liệu
Ví dụ hàm gets
char ht[25];
int t;
printf(“ Tuoi : “);
scanf(“%d%*c”,&dt); /* Khử ‘ ’ */
printf(“ Ho ten : “);
gets(ht);
Chương 3 : Vào ra dữ liệu
Ví dụ hàm gets (tt)
char ht[25];
int t;
printf(“ Tuoi : “);
scanf(“%d”,&dt);
printf(“ Ho ten : “);
fflush(stdin); /* xóa stdin */
gets(ht);
Chương 3 : Vào ra dữ liệu
Các hàm nhập ký tự (tt)
Hàm getchar : nhận một ký tự từ bàn phím
Dạng hàm : int getchar(void).
Công dụng : nhận một ký tự từ bàn phím.
Hàm trả về ký tự nhận được
Ví dụ: int ch;
ch = getchar();
Chương 3 : Vào ra dữ liệu
Ví dụ hàm nhập ký tự
Chương 3 : Vào ra dữ liệu
int a;
char ch, ht[25];
scanf(“%d”,&a);
ch = getchar();
gets(ht);
Chuỗi nhập: 21HT1 CNTT
-> a = 21
ch = H
ht = “T1 CNTT”
Các hàm xuất ký tự
Hàm puts : đưa một chuỗi ký tự ra màn hình
Dạng hàm : int puts(const char *s).
Đối : s là con trỏ (kiểu char) trỏ tới vùng nhớ chứa chuỗi ký tự cần xuất ra màn hình.
Công dụng : đưa chuỗi s và thêm ký tự ‘ ’ ra màn hình, khi thành công hàm trả về ký tự ‘ ’, ngược lại trả về EOF.
Ví dụ : puts(“Co so lap trinh”);
Chương 3 : Vào ra dữ liệu
Các hàm xuất ký tự (tt)
Hàm putchar : đưa một ký tự ra màn hình.
Dạng hàm : int putchar(int ch).
Đối : ch chứa mã ký tự cần xuất.
Công dụng : đưa ký tự ch ra màn hình, khi thành công hàm trả về ký tự được xuất, ngược lại trả về EOF.
Ví dụ : putchar(‘A’);
putchar(7);
Chương 3 : Vào ra dữ liệu
Các hàm vào ra trên
màn hình, bàn phím
Hàm getch
Dạng hàm : int getch(void).
Công dụng : nhận một ký tự từ bộ đệm bàn phím, không cho hiện lên màn hình.
Hàm trả về ký tự nhận được.
Chương 3 : Vào ra dữ liệu
Các hàm vào ra trên
màn hình, bàn phím (tt)
Hàm getche
Dạng hàm : int getch(void).
Công dụng : nhận một ký tự từ bộ đệm bàn phím, cho hiện lên màn hình.
Hàm trả về ký tự nhận được.
Chương 3 : Vào ra dữ liệu
Các hàm vào ra trên
màn hình, bàn phím (tt)
Hàm putch
Dạng hàm : int putch(int ch).
Đối : ch chứa mã ký tự cần hiển thị.
Công dụng : đưa một ký tự ra cửa sổ văn bản màn hình.
Hàm trả về ký tự được hiển thị.
Chương 3 : Vào ra dữ liệu
Các hàm vào ra trên
màn hình, bàn phím (tt)
Hàm kbhit
Dạng hàm : int kbhit(void).
Công dụng : kiểm tra bộ đệm bàn phím.
Hàm trả về giá trị khác 0 nếu bộ đệm bàn phím khác rỗng, có giá trị 0 nếu trái lại.
Chương 3 : Vào ra dữ liệu
Các hàm vào ra trên
màn hình, bàn phím (tt)
Hàm xóa màn hình và di chuyển con trỏ.
Xóa màn hình : clrscr();
Di chuyển con trỏ đến vị trí (x,y) : gotoxy(x,y)
x là số hiệu cột, nhận giá trị từ 1 đến 80
y là dòng, có giá trị từ 1 đến 25
Chương 3 : Vào ra dữ liệu
Các hàm vào ra trên
màn hình, bàn phím (tt)
Ví dụ :
#include
void main()
{
tiep:
putch(7);
if (!kbhit()) goto tiep;
if (getch()!=27) goto tiep;
}
Chương 3 : Vào ra dữ liệu
Bài tập chương 3
Chương 3 : Vào ra dữ liệu
Chương 4: Các cấu trúc điều khiển
Khái niệm về câu lệnh
và khối lệnh
Chương 4 : Các cấu trúc điều khiển
Lệnh if
Chương 4 : Các cấu trúc điều khiển
Ví dụ lệnh if
Chương 4 : Các cấu trúc điều khiển
Lỗi thường gặp
Chương 4 : Các cấu trúc điều khiển
Lệnh else
Chương 4 : Các cấu trúc điều khiển
Ví dụ lệnh else
Chương 4 : Các cấu trúc điều khiển
Lỗi thường gặp
Chương 4 : Các cấu trúc điều khiển
Lệnh if lồng (else if)
Chương 4 : Các cấu trúc điều khiển
Lệnh switch
Chương 4 : Các cấu trúc điều khiển
Lệnh switch (tt)
Một lệnh đa lựa chọn trên các giá trị nguyên
Biểu thức phải có giá trị nguyên
Khi thực hiện giá trị của biểu thức được tính và trường hợp case có giá trị khớp với biểu thức sẽ được thực hiện.
Nếu không có case nào tương ứng, tập lệnh tùy chọn default được thực hiện
Chương 4 : Các cấu trúc điều khiển
Ví dụ lệnh switch
Chương 4 : Các cấu trúc điều khiển
Sử dụng break
Khi một case của lệnh switch được tìm thấy, các lệnh được thực hiện bắt đầu từ điểm này.
Tiếp tục thực hiện các câu lệnh tiếp theo cho đến khi gặp câu lệnh break
Lệnh break làm chương trình chuyển đến thực hiện câu lệnh tiếp theo sau lệnh switch
Chương 4 : Các cấu trúc điều khiển
Sử dụng break (tt)
Chương 4 : Các cấu trúc điều khiển
Cấu trúc lặp
Chương 4 : Các cấu trúc điều khiển
Được thực hiện để lặp nhiều lần một câu lệnh hay một khối lệnh
Các loại vòng lặp được hỗ trợ trong ngôn ngữ lập trình C:
for
while
do … while
Lệnh while
Chương 4 : Các cấu trúc điều khiển
while (<điều kiện>)
Thực hiện lặp một lệnh hay khối lệnh theo một điều kiện
Kiểm tra điều kiện ngay khi bắt đầu vào vòng lặp
Kết thúc vòng lặp khi điều kiện trở nên sai
Ví dụ lệnh while
Chương 4 : Các cấu trúc điều khiển
Ví dụ lệnh while (tt)
Chương 4 : Các cấu trúc điều khiển
Các lỗi thường gặp
Chương 4 : Các cấu trúc điều khiển
Lệnh for
Chương 4 : Các cấu trúc điều khiển
Ví dụ lệnh for
Chương 4 : Các cấu trúc điều khiển
So sánh while và for
Chương 4 : Các cấu trúc điều khiển
Các lỗi thường gặp
Chương 4 : Các cấu trúc điều khiển
Vòng lặp vô tận
Chương 4 : Các cấu trúc điều khiển
Lệnh break
Chương 4 : Các cấu trúc điều khiển
Lệnh do … while
Chương 4 : Các cấu trúc điều khiển
Ví dụ lệnh do … while
Chương 4 : Các cấu trúc điều khiển
Bài tập chương 4
Chương 4 : Các cấu trúc điều khiển
Chương 5: Hàm
Khái niệm
Hàm là một đoạn chương trình độc lập thực hiện trọn vẹn một công việc nhất định, có thể trả về giá trị cho chương trình gọi nó.
Hay nói cách khác hàm là sự chia nhỏ của chương trình.
Chương 5 : Hàm
Ví dụ về hàm
Chương 5 : Hàm
Tại sao sử dụng hàm ?
Chúng cho phép chia nhỏ vấn đề thành các công việc con.
_Giúp giải quyết dễ dàng hơn những vấn đề phức tạp.
Chương trình được viết sẽ sáng sủa hơn nhờ khả năng “trừu tượng hóa”.
_Chúng ta chỉ cần biết hàm làm gì mà không quan tâm nó làm như thế nào.
Chúng cho phép tổng quát hóa một nhóm lệnh lặp nhiều lần.
_Tránh viết đi viết lại nhiều lần một số nhóm lệnh.
Chương 5 : Hàm
Cấu trúc chương trình C
Chương 5 : Hàm
Khối khai báo
Hàm main
Các hàm con
(nếu có)
Thực thi
Cấu trúc chương trình C (tt)
Khối khai báo: bao gồm các khai báo về sử dụng thư viện, khai báo hằng số, khai báo hàm con (nguyên mẫu hàm), các biến toàn cục và các kiểu dữ liệu tự định nghĩa.
Nguyên mẫu hàm thực chất là dòng đầu tiên của hàm thêm dấu “;” vào cuối, tuy nhiên tham số trong nguyên mẫu hàm có thể bỏ phần tên
Hàm chính (main()) : chứa các biến, các lệnh và các lời gọi hàm cần thiết trong chương trình
Các hàm con : xử lý các vấn đề nhỏ trong chương trình
Chương 5 : Hàm
Xây dựng hàm
Với mỗi hàm xây dựng cần phải đặc tả:
Tên hàm
Tham số truyền vào
Loại giá trị mà hàm trả về nếu có
Khối lệnh được thực hiện khi hàm được gọi đến
Khối lệnh thực hiện còn được gọi là thân hàm
Chương 5 : Hàm
Ví dụ hàm tính giai thừa
Chương 5 : Hàm
Tham số hàm
Chương 5 : Hàm
Tham số hàm (tt)
Tham số không là con trỏ (tham trị) : không thay đổi hoặc không cần lấy giá trị mới của tham số sau lời gọi hàm. Tham số dang này chỉ mang ý nghĩa là dữ liệu đầu vào.
Tham số con trỏ (tham biến) : có sự thay đổi của tham số trong quá trình thực hiện và cần lấy lại giá trị đó sau khi ra khỏi hàm. Ứng dụng của tham số loại này có thể là dữ liệu đầu ra (kết quả) hoặc cũng có thể vừa là dữ liệu đầu vào vừa là dữ liệu đầu ra.
Chương 5 : Hàm
Ví dụ tham số
Chương 5 : Hàm
Trả về giá trị
Chương 5 : Hàm
Khai báo và định nghĩa hàm
Một định nghĩa hàm đặc tả đầy đủ tất cả các thành phần của hàm bao gồm cả thân hàm.
Một khai báo hàm chỉ cần đặc tả:
Tên hàm
Kiểu của từng tham số
Kiểu giá trị trả về
Tạo khai báo hàm bằng các nguyên mẫu (prototype)
Ví dụ: int Tinh_tong(int, int);
void Nhap_ma_tran(void);
Chương 5 : Hàm
Vai trò của nguyên mẫu
Một hàm có thể định nghĩa sau nhưng trước khi sử dụng phải được khai báo.
Cho phép gọi đến hàm mà không biết đến định nghĩa
Tập tin stdio.h chứa khai báo (nguyên mẫu) của hàm printf()
Một định nghĩa hàm bao gồm một khai báo.
Chương 5 : Hàm
Ví dụ nguyên mẫu hàm
Chương 5 : Hàm
Các hàm thư viện
Ngôn ngữ C cung cấp một số hàm thư viện như vào ra,toán học, quản lý bộ nhớ, xử lý xâu chuỗi, …
Để có thể sử dụng, ta cần khai báo nguyên mẫu của chúng trong chương trình
Các khai báo nguyên mẫu như thế này đã được viết trong các tập tin tiêu đề (.h), ta chỉ cần khai báo trong chương trình (#include) để sử dụng.
Chương 5 : Hàm
Thư viện toán học math.h
Chương 5 : Hàm
Khái niệm
Hàm là một đoạn chương trình độc lập thực hiện trọn vẹn một công việc nhất định, có thể trả về giá trị cho chương trình gọi nó, hay nói cách khác hàm là sự chia nhỏ của chương trình
Chương 5 : Hàm
Hàm đệ qui
Chương 5 : Hàm
Bài tập chương 5
Chương 5 : Hàm
Chương 6: Con trỏ
và mảng
Địa chỉ bộ nhớ của biến
Chương 6 : Con trỏ và mảng
Toán tử &
Chương 6 : Con trỏ và mảng
Con trỏ
Chương 6 : Con trỏ và mảng
Khai báo con trỏ
Chương 6 : Con trỏ và mảng
Khai báo con trỏ (tt)
Chương 6 : Con trỏ và mảng
Tham chiếu
Chương 6 : Con trỏ và mảng
Chú ý về con trỏ
Chương 6 : Con trỏ và mảng
Con trỏ null
Chương 6 : Con trỏ và mảng
Toán tử *
Chương 6 : Con trỏ và mảng
Các bước sử dụng con trỏ
Chương 6 : Con trỏ và mảng
Các bước sử dụng con trỏ (tt)
Chương 6 : Con trỏ và mảng
Các bước sử dụng con trỏ (tt)
Chương 6 : Con trỏ và mảng
Các bước sử dụng con trỏ (tt)
Chương 6 : Con trỏ và mảng
Bước 4 : Khử tham chiếu con trỏ
Lỗi thường gặp
Chương 6 : Con trỏ và mảng
Tham số hàm và con trỏ
Chương 6 : Con trỏ và mảng
Truyền theo tham trị
Chương 6 : Con trỏ và mảng
Truyền theo tham chiếu
Chương 6 : Con trỏ và mảng
Khái niệm mảng
Chương 6 : Con trỏ và mảng
Bộ nhớ của mảng
Chương 6 : Con trỏ và mảng
Chương trình dãy số
Chương 6 : Con trỏ và mảng
Khởi tạo mảng
Chương 6 : Con trỏ và mảng
Chỉ số mảng
Chương 6 : Con trỏ và mảng
Mảng và con trỏ
Chương 6 : Con trỏ và mảng
Truyền mảng cho hàm
Chương 6 : Con trỏ và mảng
Chương trình dãy số
(sử dụng hàm)
Chương 6 : Con trỏ và mảng
Chương trình dãy số (tt)
Chương 6 : Con trỏ và mảng
Mảng và con trỏ (tt)
Chương 6 : Con trỏ và mảng
Chương trình dãy số (tt)
Chương 6 : Con trỏ và mảng
Chương trình dãy số (tt)
Chương 6 : Con trỏ và mảng
Mảng hai chiều
Chương 6 : Con trỏ và mảng
Ví dụ bảng cửu chương
Chương 6 : Con trỏ và mảng
Biểu diễn ký tự trong bộ nhớ
Chương 6 : Con trỏ và mảng
Biểu diễn chuỗi ký tự
Chương 6 : Con trỏ và mảng
Mảng ký tự và chuỗi ký tự
Chương 6 : Con trỏ và mảng
Khai báo chuỗi
Chương 6 : Con trỏ và mảng
Khai báo chuỗi (tt)
Chương 6 : Con trỏ và mảng
Khai báo chuỗi (tt)
Chương 6 : Con trỏ và mảng
Xuất nhập chuỗi
Chương 6 : Con trỏ và mảng
Ký tự trong chuỗi
Chương 6 : Con trỏ và mảng
Chương trình đếm ký tự
Chương 6 : Con trỏ và mảng
Xử lý chuỗi
Chương 6 : Con trỏ và mảng
Gán chuỗi
Chương 6 : Con trỏ và mảng
Lỗi thường gặp
Chương 6 : Con trỏ và mảng
Gán dạng con trỏ
Chương 6 : Con trỏ và mảng
Gán dạng con trỏ (tt)
Chương 6 : Con trỏ và mảng
Nối chuỗi
Chương 6 : Con trỏ và mảng
Lỗi bộ nhớ
Chương 6 : Con trỏ và mảng
So sánh chuỗi
Chương 6 : Con trỏ và mảng
Lỗi về so sánh
Chương 6 : Con trỏ và mảng
Tham số hàm là chuỗi
Chương 6 : Con trỏ và mảng
Chương trình tách tên
Chương 6 : Con trỏ và mảng
Chương trình tách tên (tt)
Chương 6 : Con trỏ và mảng
Bài tập chương 6
Chương 6 : Con trỏ và mảng
Chương 7: Kiểu cấu trúc
Khái niệm
Cấu trúc (struct) thực chất là một kiểu dữ liệu do người dùng định nghĩa bằng cách gom nhóm các dữ liệu cơ bản có sẵn trong C thành một kiểu dữ liệu phức hợp nhiều thành phần.
Chương 7 : Kiểu cấu trúc
Định nghĩa kiểu dữ liệu
struct
{
Các kiểu dữ liệu thành phần;
};
Ngoài ra có thể dùng từ khóa typedef để định nghĩa một tên mới cho kiểu dữ liệu đã có.
typedef struct
Chương 7 : Kiểu cấu trúc
Khai báo cấu trúc
Chương 7 : Kiểu cấu trúc
Khai báo biến cấu trúc
Chương 7 : Kiểu cấu trúc
Để tạo một cấu trúc trong bộ nhớ máy tính, ta cần khai báo một biến cấu trúc như sau:
Kết hợp khai báo
Có thể kết hợp khai báo kiểu cấu trúc và biến trên cùng một dòng lệnh
Chương 7 : Kiểu cấu trúc
struct comlex
{
int real;
int img;
} num;
struct studentRec
{
char name[50];
int mark;
} jonh;
Truy nhập cấu trúc
Chương 7 : Kiểu cấu trúc
Để truy nhập vào một trường của biến cấu trúc ta dùng toán tử ‘.’ như ví dụ sau:
Truy nhập cấu trúc (tt)
Chương 7 : Kiểu cấu trúc
Trong trường hợp một biến cấu trúc được trỏ bởi một con trỏ, ta có thể truy cập vào các trường cấu trúc thông qua con trỏ bằng cách dùng toán tử ‘->’.
Định nghĩa kiểu
Dùng typedef để định nghĩa tên một kiểu dữ liệu mới mà có thể dùng trong các khai báo biến.
Chương 7 : Kiểu cấu trúc
Định nghĩa kiểu (tt)
Có thể gộp định nghĩa kiểu với khai báo cấu trúc như sau:
typedef struct studentRec
{
char name[50];
int mark;
} Student;
Student stdA, stdB, *ptr ;
Student stdList[100];
Chương 7 : Kiểu cấu trúc
So sánh cấu trúc
Không thể so sánh hai cấu trúc bằng toán tử ‘==‘
Chỉ có thể so sánh từng trường của cấu trúc
Chương 7 : Kiểu cấu trúc
Mảng cấu trúc
Chương 7 : Kiểu cấu trúc
Chương trình ví dụ
Chương 7 : Kiểu cấu trúc
Chương trình ví dụ (tt)
Chương 7 : Kiểu cấu trúc
Truyền cấu trúc làm tham số
Giống như mọi biến khác, cấu trúc có thể được dùng làm tham số của hàm.
Có hai cách truyền tham số cho một cấu trúc:
Truyền cấu trúc theo dạng sử dụng giá trị của các trường sẽ không làm thay đổi nội dung của biến cấu trúc gốc.
Truyền địa chỉ của cấu trúc để có thể làm thay đổi nội dung của cấu trúc gốc.
Chương 7 : Kiểu cấu trúc
Hàm trả về cấu trúc
Trả về một gói chứa nhiều giá trị.
Chương 7 : Kiểu cấu trúc
Ví dụ số phức
Chương 7 : Kiểu cấu trúc
Ví dụ số phức (tt)
Chương 7 : Kiểu cấu trúc
Bài tập chương 7
Chương 7 : Kiểu cấu trúc
Chương 8: Xử lý đồ họa
Khái niệm đồ họa
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
Khởi động đồ họa
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
Vẽ và tô màu
một số hình cơ bản
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
Xử lý văn bản
trên màn hình đồ họa
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
Cửa sổ và các thao tác
với vùng hình ảnh
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
In ảnh từ màn hình đồ họa
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
Một số chương trình đồ họa
Trong C sử dụng các kiểu dữ liệu:
Chương 8 : Xử lý đồ họa
Chương 9: Thao tác trên
các tập tin
Kênh xuất nhập
Là vùng đệm dùng cho việc nhập xuất dữ liệu ở mức cao.
Chương trình chỉ đọc và ghi dữ liệu trên vùng đệm, do đó các hàm vào ra độc lập với thiết bị đầu cuối.
Hệ điều hành đảm nhiệm việc đồng bộ hóa dữ liệu trên vùng đệm với thiết bị vào ra.
Có thể chuyển hướng vào ra của một kênh xuất nhập cho nhiều thiết bị khác nhau.
Chương 9 : Thao tác trên các tập tin
Kênh xuất nhập chuẩn
Luôn tồn tại 3 kênh xuất nhập chuẩn trong một chương trình : stdin, stdout và stderr.
Việc định hướng các kênh xuất nhập chuẩn này phụ thuộc vào lúc chạy chương trình, ngầm định là bàn phím cho stdin, màn hình cho stdout và std error.
scanf() và printf() là các hàm đọc và ghi trên các kênh stdint và stdout tương ứng.
perror() là hàm in thông báo lỗi ra kênh stderr.
Chương 9 : Thao tác trên các tập tin
Ví dụ xuất nhập
Chương 9 : Thao tác trên các tập tin
Vào ra tập tin
Tập tin cần được mở trước khi sử dụng
Mỗi tập tin được gắn với một thẻ tập tin khi mở
Thao tác với tập tin chỉ thông qua thẻ tập tin mà không thông qua tên tập tin.
Thẻ tập tin được dùng như là kênh xuất nhập cho các hàm vào ra tập tin.
Cần phải đóng tập tin trước khi kết thúc.
Các hàm thao tác tập tin cơ bản : fopen(), sclose(), fscanf(), fprintf().
Chương 9 : Thao tác trên các tập tin
Ví dụ
Chương 9 : Thao tác trên các tập tin
Hàm fprintf() và printf()
Hàm fprintf(
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Phuoc It
Dung lượng: |
Lượt tài: 2
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)