Bài giảng Tin học đại cương (Bản đầy đủ)

7.6.3. C|c lệnh v{o ra kh|c (4) • Ví dụ: #include #include void main() { char str[30]; puts(“Hay cho biet ho ten ban:”); fflush(stdin); gets(str); printf(“Xin chao ”); puts(str); puts(“An phim bat ki de ket thuc.”); getch(); } 69C|c lệnh nhập xuất kh|c • Kết quả: Hay cho biet ho ten ban: ngon ngu lap trinh C Xin chao ngon ngu lap trinh C An phim bat ki de ket thuc .

pdf534 trang | Chia sẻ: hachi492 | Ngày: 04/01/2022 | Lượt xem: 570 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Tin học đại cương (Bản đầy đủ), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ời dùng sử dụng ngôn ngữ thao tác dữ liệu để diễn tả yêu cầu cập nhật (nhập, sửa, xóa dữ liệu) hay tìm kiếm, kết xuất thông tin (xuất dữ liệu chứa trong CSDL theo những điều kiện tìm kiếm cụ thể). 50 Select * from nhanvien 3.3.2 Hệ quản trị cơ sở dữ liệu • Các chức năng cơ bản của hệ quản trị CSDL : – Cung cấp công cụ kiểm soát, điều khiển việc truy cập vào CSDL : Hệ quản trị CSDL đảm bảo : • Phát hiện và ngăn chặn truy cập trái phép • Duy trì tính nhất quán của dữ liệu. • Tổ chức, điều khiển các truy cập cùng lúc. • Khôi phục CDSL khi gặp sự cố. • Quản lí các mô tả dữ liệu. 51 3.3.2 Hệ quản trị cơ sở dữ liệu • Ví dụ: bài toán quản lý sinh viên. Các file dùng để chứa thông tin liên quan đến sinh viên: – Thông tin sinh viên – Thông tin tài chính – Danh sách lớp 52 3.3.2 Hệ quản trị cơ sở dữ liệu 53 Thông tin sinh viên Mã số sinh viên Tên Địa chỉ Chuyên ngành Học kỳ 1 Trung bình Số tín chỉ đã đạt Học kỳ 2 Trung bình Số tín chỉ đã đạt Thông tin tài chính Mã số sinh viên Tên Địa chỉ Chuyên ngành Học phí Phí ký túc xá Học bổng Danh sách lớp Mã môn học Phòng học GV hướng dẫn Tổng số sinh viên Sinh viên 1 MSSV Họ tên Ngành Sinh viên 2 MSSV Họ tên Ngành 3.3.2 Hệ quản trị cơ sở dữ liệu • Tính quan hệ trong CSDL – Sự ràng buộc giữa các file dữ liệu. • Tính nhiều mặt – Cách thức làm việc khác nhau với cùng 1 cở sở dữ liệu cho từng người dùng khác nhau. • Xu thế Client/Server – Cho phép tận dụng được lợi điểm giao diện đơn giản của các máy PC và sức mạnh tính toán của các máy tính cỡ lớn với các CSDL khổng lồ. 54 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Phần 2. Giải quyết bài toán Bài 4: Giải quyết bài toán Nội dung 4.1. Bài toán (problem) 4.2. Giải quyết bài toán bằng máy tính 4.3. Biểu diễn thuật toán 2 Nội dung 4.1. Bài toán (problem) 4.2. Giải quyết bài toán bằng máy tính 4.3. Biểu diễn thuật toán 3 4.1. Bài toán (problem) • “Bài toán” hay “Vấn đề” – Vấn đề có nghĩa rộng hơn bài toán – Bài toán là một loại vấn đề mà để giải quyết phải liên quan ít nhiều đến tính toán: bài toán trong vật lý, hóa học, xây dựng, kinh tế • Hai loại vấn đề (Pitago) – Theorema: là vấn đề cần được khẳng định tính đúng sai. – Problema: là vấn đề cần tìm được giải pháp để đạt được một mục tiêu xác định từ những điều kiện ban đầu nào đó. 4 4.1. Bài toán (2) • Biểu diễn vấn đề-bài toán – A → B • A: Giả thiết, điều kiện ban đầu • B: Kết luận, mục tiêu cần đạt • Giải quyết vấn đề-bài toán – Từ A dùng một số hữu hạn các bước suy luận có lý hoặc hành động thích hợp để đạt được B – Trong Tin học, A là đầu vào, B là đầu ra 5 Nội dung 4.1. Bài toán (problem) 4.2. Giải quyết bài toán bằng máy tính 4.3. Biểu diễn thuật toán 6 4.2. Giải quyết bài toán bằng máy tính • Máy tính không thể dùng để giải quyết các vấn đề liên quan đến hành động vật lý hoặc biểu thị cảm xúc • Máy tính chỉ làm được những gì mà nó được bảo phải làm. Máy tính không thông minh, nó không thể tự phân tích vấn đề và đưa ra giải pháp. • Lập trình viên là người phân tích vấn đề, tạo ra các chỉ dẫn để giải quyết vấn đề (chương trình), và máy tính sẽ thực hiện các chỉ dẫn đó 7 4.2. Giải quyết bài toán bằng máy tính (2) • Phương án giải quyết bài toán được gọi là thuật toán/giải thuật trong tính toán • Một thuật toán là: – một dãy hữu hạn các thao tác và trình tự thực hiện các thao tác đó sao cho sau khi thực hiện dãy thao tác này theo trình tự đã chỉ ra, với đầu vào (input) ta thu được kết quả đầu ra (output) mong muốn. 8 4.2. Giải quyết bài toán bằng máy tính (3) • Không chỉ đơn giản là lập trình • Phức tạp, gồm nhiều giai đoạn phát triển • Các giai đoạn quan trọng 9 Bước 1. Xác định yêu cầu bài toán Bước 2. Phân tích và thiết kế bài toán Lựa chọn phương án Xây dựng thuật toán Bước 3. Lập trình Bước 4. Kiểm thử và hiệu chỉnh chương trình Bước 5. Triển khai và bảo trì Hai giai đoạn chính để hiện thực hóa bài toán Giai đoạn giải quyết vấn đề Giai đoạn thực hiện 10 Nội dung 4.1. Bài toán (problem) 4.2. Giải quyết bài toán bằng máy tính 4.3. Biểu diễn thuật toán 11 12 4.3. Biểu diễn thuật toán • Ngôn ngữ tự nhiên Cách 1: • Ngôn ngữ lưu đồ (lưu đồ/sơ đồ khối) Cách 2: • Mã giả (pseudocode) gọi là ngôn ngữ mô phỏng chương trình PDL (Programming Description Language). Cách 3: • Các ngôn ngữ lập trình như Pascal, C/C++ hay Java. uy nhiên, không nhất thiết phải sử dụng đúng ký pháp của các ngôn ngữ đó mà có thể được bỏ một số ràng buộc. Cách 4: 4.3.1. Ngôn ngữ tự nhiên • Sử dụng một loại ngôn ngữ tự nhiên để liệt kê các bước của thuật toán • Ưu điểm – Đơn giản – Không yêu cầu người viết và người đọc phải có kiến thức nền tảng • Nhược điểm – Dài dòng – Không làm nổi bật cấu trúc của thuật toán – Khó biểu diễn với những bài toán phức tạp 13 14 Ví dụ 1 • Bài toán: Đưa ra kết luận về tương quan của hai số a và b (>, < hay =). – Đầu vào: Hai số a và b – Đầu ra: Kết luận a>b hay a<b hay a=b. • Ý tưởng: – So sánh a và b rồi đưa ra kết luận 15 VD1 - Ngôn ngữ tự nhiên (tuần tự các bước) • B1: Nhập số a và số b. • B2: Nếu a> b, hiển thị “a>b” và kết thúc • B3: Nếu a=b, hiển thị “a=b” và kết thúc • B4: (a<b) Hiển thị “a<b” và kết thúc. 4.3.2. Sơ đồ khối Bắt đầu hoặc kết thúc Thao tác tính toán hoặc phức tạp Lệnh vào, lệnh ra (read hoặc write) Kiểm tra điều kiện Luồng thực hiện Nối tiếp đoạn lệnh Một số khối trong sơ đồ khối dùng biểu diễn thuật toán 16 17 Ví dụ 1 - Mô tả bằng lưu đồ thuật toán Biểu diễn thao tác kiểm tra điều kiện Thể hiện thao tác bắt đầu hoặc kết thúc Nhập a, b a>b a=b Hiển thị “a>b” Hiển thị “a=b” Hiển thị “a<b” Đ Đ S S 4.3.2. Sơ đồ khối (2) • Ưu điểm – Trực quan, dễ hiểu, dễ thiết kế – Cung cấp toàn cảnh, tổng quan về thuật toán • Nhược điểm – Cồng kềnh, đặc biệt với bài toán phức tạp 18 4.3.3. Mã giả (pseudocode) • Ngôn ngữ tựa (gần giống) với ngôn ngữ lập trình được gọi là mã giả – Mệnh đề có cấu trúc – Ngôn ngữ tự nhiên • Ưu điểm – Tiện lợi, đơn giản – Dễ hiểu, dễ diễn đạt • Giới thiệu chi tiết trong bài sau 19 20 Ví dụ 2 • Bài toán: Đưa ra tổng, tích, hiệu, thương của hai số a và b. – Đầu vào: Hai số a và b – Đầu ra: Tổng, tích, hiệu và thương của a và b. • Ý tưởng: – Tính tổng, tích, hiệu của a và b – Nếu b khác 0, đưa ra thương – Nếu b bằng 0, đưa ra thông báo không thực hiện được phép chia 21 VD2 - Ngôn ngữ tự nhiên (tuần tự các bước) • B1: Nhập số a và số b. • B2: s  a + b; d  a – b; p  a * b • Hiển thị – Tổng là s – Hiệu là d – Tích là p • B3: Nếu b = 0, hiển thị “Không thực hiện được phép chia” và kết thúc • B4: (b0) Hiển thị “Thương là a/b” và kết thúc 22 Ví dụ 2 - Mô tả bằng lưu đồ thuật toán Nhập a, b b = 0 Hiển thị “Không thực hiện được phép chia” Hiển thị “Thương là a/b” s  a + b; d  a – b; p  a * b; Hiển thị “Tổng là s, Hiệu là d, Tích là p” Biểu diễn thao tác tính toán đơn giản hoặc phức tạp Đ S 23 Ví dụ 3 • Bài toán: Giải phương trình bậc I – Đầu vào: Hai hệ số a, b – Đầu ra: Nghiệm của phương trình ax + b = 0 • Ý tưởng: – Lần lượt xét a = 0 rồi xét b = 0 để xét các trường hợp của phương trình 24 Ví dụ 3 - Mô tả tuần tự các bước • B1: Nhập a và b. • B2: Nếu a0 thì hiển thị “Phương trình có 1 nghiệm duy nhất x = -b/a”. • B3: (a=0) Nếu b 0 thì hiển thị “Phương trình vô nghiệm” và kết thúc • B4: (a=0)(b=0) Hiển thị “Phương trình vô số nghiệm” và kết thúc Ví dụ 3 - Mô tả bằng lưu đồ thuật toán 25 Nhập a và b a0 Hiển thị “Nghiệm là: x = -b/a” b0 S S Đ Đ Hiển thị “Phương trình vô nghiệm” Hiển thị “Phương trình vô số nghiệm” 26 Ví dụ 4 • Bài toán: Tìm giá trị lớn nhất của một dãy số nguyên có N số – Đầu vào: Số số nguyên dương N và N số nguyên a1, a2,, aN – Đầu ra: số nguyên lớn nhất của dãy ak, k trong khoảng [1N] • Ý tưởng: – Khởi tạo giá trị Max = a1 – Lần lượt so sánh Max với ai với i=2,3,, N; nếu ai > Max ta gán giá trị mới cho Max Ví dụ 4 – Ý tưởng 27 3 5 7 9 2 max 3 5 max<5 max = 3 7 9 9 8 9 9 max<7 max<9 max>2 max>8 Kết quả 28 Ví dụ 4 - Mô tả tuần tự các bước • B1: Nhập N và dãy số a1, a2,,aN. • B2: Max  a1; i=2. • B3: Nếu i > N, Hiển thị Max là giá trị lớn nhất của dãy và kết thúc • B4: Nếu ai > Max, Max  ai • B5: Tăng i lên 1 đơn vị. • B6: Quay lên B3. • B7: Kết thúc. 29 Ví dụ 4 - Mô tả bằng lưu đồ thuật toán Nhập N và dãy số a1, a2,,aN i > N Hiển thị “Max là số lớn nhất” Max  a1; i=2 ai > Max i  i + 1 S S Đ Max  ai Đ 30 Bài tập • Bài toán: Giải phương trình bậc II – Đầu vào: Ba hệ số a, b, c – Đầu ra: Nghiệm của phương trình ax2 + bx + c = 0 • Ý tưởng: – Lần lượt xét a = 0, b = 0 rồi xét c=0 để xét các trường hợp của phương trình 31 Các tiêu chí giải thuật cần thỏa mãn • Tính hữu hạn: giải thuật phải dừng sau một thời gian hữu hạn. • Tính đúng đắn: Khi kết thúc, giải thuật phải cung cấp kết quả đúng đắn. • Tính hiệu quả: – Thời gian tính toán nhanh – Sử dụng ít tài nguyên không gian như bộ nhớ, thiết bị, – Mang tính phổ dụng, dễ hiểu, dễ cài đặt và mở rộng cho các lớp bài toán khác. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Phần 2. Giải quyết bài toán Bài 5: Một số thuật toán thông dụng Nội dung 5.1. Các cấu trúc cơ bản trong lập trình 5.2. Giả mã (pseudocode) 5.3. Thuật toán số học 5.4. Thuật toán về dãy 5.5. Thuật toán đệ quy 2 3 5.1. Các cấu trúc cơ bản trong lập trình • Cấu trúc tuần tự • Cấu trúc rẽ nhánh • Cấu trúc lặp 4 5.1.1. Cấu trúc tuần tự • Các bước được thực hiện theo 1 trình tự tuyến tính, hết bước này đến bước khác Bước 1 Bước 2 Bước n 5 5.1.2. Cấu trúc rẽ nhánh • Việc thực hiện bước nào phụ thuộc vào điều kiện xác định. • Ví dụ: Tìm max của 2 số a, b. – Nếu a > b thì max là a, ngược lại max sẽ là b. – Diễn giải: • B1: Nhập 2 số a, b. • B2: Nếu a > b thì Max = a và đi đến bước kết thúc (B4). • B3: (a <= b) Max  b. • B4: Kết thúc. Max  a a>b Max  b Đ S 6 5.1.3. Cấu trúc lặp • Một tác động/ nhiệm vụ có thể được thực hiện lặp nhiều lần. • Số lần lặp có thể biết trước hoặc không biết trước.Tuy nhiên số lần lặp phải hữu hạn. Điều kiện Thực hiện công việc trong vòng lặp Thực hiện công việc khi thoát khỏi vòng lặp 5.1.3. Cấu trúc lặp (2) 7 Nhập N và dãy số a1, a2,,aN i > N Hiển thị “Max là số lớn nhất” Max  a1; i=2 ai > Max i  i + 1 S S Đ Max  ai Đ Ví dụ: Tìm số lớn nhất của một dãy có n số  Lần lượt phải so sánh số Max tạm thời (lúc đầu Max được gán bằng phần tử thứ nhất, a1) với ai, với i từ 2, 3,, n.  Việc so sánh này được thực hiện lặp nhiều lần giữa Max và ai.  Khi kết thúc quá trình lặp, ta sẽ thu được Max là số lớn nhất của dãy n số. Nội dung 5.1. Các cấu trúc cơ bản trong lập trình 5.2. Giả mã (pseudocode) 5.3. Thuật toán số học 5.4. Thuật toán về dãy 5.5. Thuật toán đệ quy 8 5.2. Mã giả (pseudocode) • Gán:  hoặc := Ví dụ: i  i + 1 a := b + c • Cấu trúc rẽ nhánh if(điều kiện) then (hành động) hoặc if(điều kiện) then (hành động) else (hành động) • Cấu trúc nhảy goto: – goto nhãn x; 9 5.2. Giả mã (2) • Cấu trúc lặp: while điều_kiện do hành_động hoặc repeat hành_động until điều_kiện hoặc for biến:= gtrị_đầu to gtrị_cuối do hành_động hoặc for biến:= gtrị_đầu downto gtrị_cuối do hành_động 10 Nội dung 5.1. Các cấu trúc cơ bản trong lập trình 5.2. Giả mã (pseudocode) 5.3. Thuật toán số học 5.4. Thuật toán về dãy 5.5. Thuật toán đệ quy 11 5.3. Thuật toán số học • Các bài toán về số học – Xác định một số nguyên có phải là số nguyên tố/hợp số hay không – Tìm USCLN, BSCNN của 2 số nguyên – .. 12 Bài toán số nguyên tố • Cho một số nguyên dương p. Làm thế nào để biết được p có phải số nguyên tố hay không? – Input: p nguyên dương – Output: kết luận về tính nguyên tố của p • Ý tưởng? – p = 1?  Không phải số nguyên tố – p > 1? • Kiểm tra từ 2 đến p-1 có phải là ước số của p không • Nếu có thì kết luận p không là số nguyên tố, ngược lại không có số nào thì kết luận p là số nguyên tố 13 Bài toán số nguyên tố (2) Nhập p if p=1 then begin Xuất: p không nguyên tố; Dừng thuật toán; end flag := TRUE //Cờ trạng thái cho biết có tìm được ước nào của p không for k:=2 to p-1 do //Tối ưu duyệt đến [căn bậc 2 của p] if (k là ước số của p) then begin flag:=FALSE break //ngắt vòng lặp FOR end if flag=TRUE then Xuất: p là số nguyên tố else Xuất: p không là số nguyên tố 14 Nội dung 5.1. Các cấu trúc cơ bản trong lập trình 5.2. Giả mã (pseudocode) 5.3. Thuật toán số học 5.4. Thuật toán về dãy 5.5. Thuật toán đệ quy 15 5.4. Thuật toán về dãy • Làm việc với một dãy số • Các bài toán điển hình – Tìm số lớn nhất, nhỏ nhất trong dãy – Kiểm tra dãy có phải là dãy tăng hoặc dãy giảm – Sắp xếp dãy tăng dần hoặc giảm dần – Tìm trong dãy có phần tử nào bằng một giá trị cho trước – Tính trung bình cộng của dãy – 16 Ví dụ 1 - Tìm số lớn nhất trong dãy • Input: dãy số a1, a2, a3, an • Output: max là giá trị lớn nhất trong dãy số đã cho • Thuật toán: 17 max:=a1 for i:=2 to n do if max < ai then max:= ai Xuất: max là giá trị lớn nhất trong dãy số 18 Ví dụ 2. Sắp xếp dãy số • Bài toán: Sắp xếp bằng phương pháp nổi bọt (Bubble Sort) – Đầu vào: Dãy a gồm N số nguyên a1, a2,, aN – Đầu ra: Dãy a được sắp lại theo thứ tự không giảm. • Ý tưởng: – Với mỗi cặp số liên tiếp trong dãy, nếu số trước lớn hơn số sau ta đổi chỗ chúng cho nhau. – Việc đó được lặp cho đến khi không có sự đổi chỗ nào cho nhau 19 Ví dụ 2 - Mô tả tuần tự các bước • B1: Nhập số N và dãy số a1,a2,,aN • B2: M  N. • B3: Nếu M < 2 thì thuật toán kết thúc và hiển thị dãy đó. • B4: M  M – 1, i  0. • B5: Tăng i lên 1 đơn vị. • B6: Nếu i > M thì quay lại B3. • B7: Nếu ai > ai+1 thì tráo đổi hai số đó cho nhau • B8: Quay lên B5. 20 S Đ Nhập N và dãy số a1, a2,,aN M < 2 Hiển thị Dãy đã sắp xếp M  N i > M S Đ ai  ai+1 M  M – 1, i  0 i  i + 1 ai > ai+1 S Đ Ví dụ 2 - Mô tả bằng lưu đồ thuật toán Bài tập • Bài 1. Xây dựng thuật toán tìm phần tử có giá trị truyệt đối lớn nhất trong dãy gồm n phần tử. • Bài 2. Xây dựng thuật toán tìm tổng của các số chẵn và tổng của các số lẻ trong dãy gồm n phần tử được nhập vào từ bàn phím. • Bài 3. Xây dựng thuật toán kiểm tra xem một dãy số gồm n phần tử được nhập vào từ bàn phím có phải là dãy số tăng (hoặc giảm) không. • Bài 4. Xây dựng thuật toán tính trung bình cộng của các số dương trong dãy gồm n số được nhập vào từ bàn phím. 21 Nội dung 5.1. Các cấu trúc cơ bản trong lập trình 5.2. Giả mã (pseudocode) 5.3. Thuật toán số học 5.4. Thuật toán về dãy 5.5. Thuật toán đệ quy 22 5.5. Thuật toán đệ quy • Với bài toán có thể được phân tích và đưa tới việc giải một bài toán cùng loại nhưng cấp độ thấp hơn – độ lớn dữ liệu nhập nhỏ hơn – giá trị cần tính toán nhỏ hơn  Tự thực hiện lại thuật toán • Ví dụ: – Giai thừa: n! = (n-1)! * n – Dãy số Fibonacci: 0, 1, 1, 2, 3, 5, 8... • F(n) = F(n-1) + F(n-2) 23 5.5. Thuật toán đệ quy (2) • Để xây dựng thuật toán đệ quy, cần xác định: – Trường hợp cơ bản: (Các) trường hợp không cần thực hiện lại thuật toán. – Phần tổng quát: Có yêu cầu gọi đệ quy • Cần xác định nguyên lý đưa trường hợp tổng quát về trường hợp cơ bản • Đảm bảo tính dừng của giải thuật đệ quy - chắc chắn từ trường hợp tổng quát sẽ đến được trường hợp cơ bản 24 Ví dụ • Tính giai thừa của n: – Trường hợp cơ bản: 1! = 1 – Trường hợp tổng quát: n! = (n-1)! * n • Xây dựng dãy Fibonacci – Trường hợp cơ bản: F(0) = F(1) = 1 – Trường hợp tổng quát: F(n) = F(n-1) + F(n-2) 25 Tính giai thừa - Thuật toán đệ quy • Input: số tự nhiên n • Output: GT(n)=n! • Thuật giải: Nhập n GT:=1; if n>0 then GT := GT(n-1)*n; Xuất GT 26 Bài tập • Xây dựng thuật toán cho bài toán tìm số Fibonacci F(n) 27 Thuật giải heuristic • Dùng “mẹo” • Áp dụng với những bài toán – Chưa tìm được thuật toán và không biết có tồn tại thuật toán không – Có thuật toán nhưng thời gian tính toán quá lâu hoặc điều kiện của thuật toán khó đáp ứng 28 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Phần 3. Lập trình C Bài 6: Tổng quan về ngôn ngữ C Nội dung 6.1. Lịch sử ph|t triển 6.2. C|c phần tử cơ bản của ngôn ngữ C 6.3. Cấu trúc cơ bản của chương trình C 6.4. Biên dịch chương trình C 6.5. Trình biên dịch Turbo C++ 2 Nội dung 6.1. Lịch sử ph|t triển 6.2. C|c phần tử cơ bản của ngôn ngữ C 6.3. Cấu trúc cơ bản của chương trình C 6.4. Biên dịch chương trình C 6.5. Trình biên dịch Turbo C++ 3 4 6.1. Lịch sử ph|t triển • Ngôn ngữ C ra đời tại phòng thí nghiệm BELL của tập đo{n AT&T (Hoa Kỳ) • Do Brian W. Kernighan và Dennis M. Ritchie ph|t triển v{o đầu 1970, hoàn thành 1972 • C dựa trên nền c|c ngôn ngữ BCPL (Basic Combined Programming Language) và ngôn ngữ B. • Tên l{ ngôn ngữ C như l{ sự tiếp nối ngôn ngữ B. 6.1. Lịch sử ph|t triển • Đặc điểm của ngôn ngữ lập trình C – Ngôn ngữ lập trình hệ thống – Tính khả chuyển, linh hoạt cao – Có thế mạnh trong xử lý dữ liệu số, văn bản, cơ sở dữ liệu • C thường được sử dụng để viết các chương trình hệ thống – Hệ điều hành Unix có 90% mã C, 10% hợp ngữ – Các trình điều khiển thiết bị (device driver) – Xử lý ảnh 5 6 6.1. Lịch sử ph|t triển • 1978: C được giới thiệu trong phiên bản đầu của cuốn s|ch "The C programming language" • Sau đó, C được bổ sung thêm những tính năng và khả năng mới  Đồng thời tồn tại nhiều phiên bản nhưng không tương thích nhau. • Năm 1989, Viện tiêu chuẩn quốc gia của Hoa Kỳ (American National Standards Institute - ANSI) đ~ công bố phiên bản chuẩn hóa của ngôn ngữ C: ANSI C hay C chuẩn hay C89 6.1. Lịch sử ph|t triển • Các phiên bản ngôn ngữ C – ANSI C: C chuẩn (1989) – Các phiên bản khác thường bổ sung thêm thư viện của ANSI C • Hiện nay cũng có nhiều phiên bản của ngôn ngữ C khác nhau, gắn liền với một bộ chương trình dịch cụ thể của ngôn ngữ C – Turbo C++ và Borland C++ của Borland Inc. – MSC v{ VC của Microsoft Corp. – GCC của GNU project 7 Nội dung 6.1. Lịch sử ph|t triển 6.2. C|c phần tử cơ bản của ngôn ngữ C 6.3. Cấu trúc cơ bản của chương trình C 6.4. Biên dịch chương trình C 6.5. Trình biên dịch Turbo C++ 8 Ví dụ chương trình C đơn giản #include #include void main(){ printf(“Hello World\n”); getch(); } 9 6.2.1. Tập ký tự • Tập ký tự là tập các phần tử cơ bản tạo nên chương trình – Tổ hợp các ký tự → từ – Liên kết các từ theo cú pháp → câu lệnh – Tổ chức các câu lệnh → chương trình • Ví dụ: – include, void, main – printf(“”), getch(); 10 #include #include void main(){ printf(“Hello World\n”); getch(); } Cau lenh printf 6.2.1. Tập ký tự • Tập ký tự trong C – 26 chữ c|i hoa: A B C ... X Y Z – 26 chữ c|i thường:a b c x y z. – 10 chữ số: 0 1 2 3 4 5 6 7 8 9. – C|c kí hiệu to|n học:+ - * / = – C|c dấu ngăn c|ch: . ; , : space tab – C|c dấu ngoặc:( ) [ ] { } – C|c kí hiệu đặc biệt:_ ? $ & # ^ \ ! ‘ “ ~ .v.v. 11 6.2.2. Từ khóa • Từ khóa (keyword) – Có sẵn trong mỗi ngôn ngữ lập trình – Dành riêng cho các mục đích xác định • Đặt tên cho kiểu dữ liệu: int, float, double • Mô tả các lệnh, các cấu trúc lập trình: if, while, case • Chú ý: – C là ngôn ngữ phân biệt chữ hoa, chữ thường – Tất cả từ khóa trong C đều viết bằng chữ cái thường 12 int x; for (x=1; x<20; x++) if (x/2 = 1) break; 6.2.2. Từ khóa • Một số từ khóa hay dùng trong Turbo C 13 6.2.3. Định danh • Định danh (Identifier – hoặc còn gọi l{ Tên) l{ một d~y c|c kí tự dùng để gọi tên c|c đối tượng trong chương trình. • C|c đối tượng trong chương trình – Biến – Hằng số – Hàm – Kiểu dữ liệu (sẽ l{m quen ở c|c mục sau) • Định danh có thể được đặt bởi – Ngôn ngữ lập trình → c|c từ khóa – Người lập trình 14 6.2.3. Định danh • Quy tắc đặt tên định danh trong C – C|c kí tự được sử dụng: chữ c|i, chữ số v{ dấu gạch dưới “_” (underscore) – Bắt đầu của định danh phải l{ chữ c|i hoặc dấu gạch dưới “_”, không được bắt đầu định danh bằng chữ số. – Định danh do người lập trình đặt không được trùng với các từ khóa của C 15 6.2.3. Định danh • Ví dụ – Định danh hợp lệ: i, x, y, a, b, _function, _MY_CONSTANT, PI, gia_tri_1 – Định danh không hợp lệ • 1_a, 3d, 55x (bắt đầu bằng chữ số) • so luong, ti le (có dấu c|ch - kí tự không hợp lệ) • int, char (trùng với từ khóa của ngôn ngữ C) 16 6.2.3. Định danh • Một số quy ước (code convention) – Nên sử dụng dấu gạch dưới để ph}n t|ch c|c định danh gồm nhiều từ – Định danh nên có tính gợi nhớ – Quy ước thường được sử dụng: • Hằng số dùng chữ c|i hoa • C|c biến, h{m, cấu trúc dùng chữ c|i thường • Ví dụ Định danh Loại đối tượng HANG_SO_1, _CONSTANT_2 Hằng số a, b, i, j, count Biến nhap_du_lieu, tim_kiem, xu_li Hàm sinh_vien, mat_hang Cấu trúc 17 6.2.4. C|c kiểu dữ liệu • Định nghĩa: – Một kiểu dữ liệu l{ một tập hợp c|c gi| trị m{ một dữ liệu thuộc kiểu dữ liệu đó có thể nhận được. – Trên một kiểu dữ liệu ta x|c định một số phép to|n đối với c|c dữ liệu thuộc kiểu dữ liệu đó. • Ví dụ: – Kiểu dữ liệu int (số nguyên) trong C – Một dữ liệu thuộc kiểu dữ liệu int • L{ một số nguyên • Nhận gi| trị từ từ - 32,768 (- 215) đến 32,767 (215 - 1) 18 6.2.4. C|c kiểu dữ liệu • Ví dụ (tiếp) – Một số phép to|n được định nghĩa trên kiểu dữ liệu int của C Tên phép toán Ký hiệu Đảo dấu - Cộng + Trừ - Nhân * Chia lấy phần nguyên / Chia lấy phần dư % So sánh >, =, <=, ==, != 19 6.2.5. Hằng số • Định nghĩa: –Hằng số (constant) l{ đại lượng có gi| trị không đổi trong chương trình. • Biểu diễn hằng số trong ngôn ngữ C: – Hằng số nguyên – Hằng số thực – Hằng ký tự – Hằng chuỗi ký tự 20 6.2.5. Hằng số • Biểu diễn hằng số nguyên: trong C, một hằng số nguyên có thể biểu diễn dưới 3 dạng –Dạng thập ph}n –Dạng thập lục ph}n –Dạng b|t ph}n Gi| trị thập ph}n Gi| trị thập lục ph}n Gi| trị b|t ph}n 2007 0x7D7 03727 396 0x18C 0614 21 6.2.5. Hằng số • Biểu diễn hằng số thực: trong C, một hằng số thực có thể biểu diễn dưới 2 dạng – Dạng số thực dấu phẩy tĩnh – Dạng số thực dấu phẩy động • Ví dụ Số thực dấu phẩy tĩnh Số thực dấu phẩy động 3.14159 31.4159 E-1 123.456 12.3456 E+1 hoặc 1.23456 E+2 22 6.2.5. Hằng số • Biểu diễn hằng ký tự: trong C, một hằng ký tự có thể biểu diễn theo hai cách – Bằng ký hiệu của ký tự đặt giữa hai dấu nháy đơn – Bằng số thứ tự của ký tự đó trong bảng mã ASCII (số nguyên -> tuân thủ quy tắc biểu diễn hằng số nguyên) • Ví dụ Ký tự cần biểu diễn Cách 1 Cách 2 Chữ c|i A ‘A’ 65, 0x41, 0101 Số 1 ‘1’ 49, 0x31, 061 Dấu nh|y đơn ‘\’’ 39, 0x27, 047 Ký tự tab ‘\t’ 9, 0x09, 011 23 6.2.5. Hằng số • Biểu diễn hằng x}u (chuỗi) ký tự: – Hằng xâu kí tự được biểu diễn bởi dãy các kí tự thành phần có trong xâu đó và được đặt trong cặp dấu nháy kép. • Ví dụ: – “ngon ngu lap trinh C” – “Tin hoc dai cuong” – “Dai hoc Bach Khoa Ha Noi” 24 6.2.6. Biến • Định nghĩa: – Biến (variable) l{ đại lượng m{ gi| trị có thể thay đổi trong chương trình. • Biến phải thuộc một kiểu dữ liệu n{o đó. • Biến được sử dụng để lưu trữ dữ liệu, phục vụ cho xử lý tính to|n trong chương trình. • Biến phải được đặt tên theo qui tắc đặt tên. • Chú ý: – Biến được cấp ph|t vùng nhớ trong bộ nhớ chính, còn hằng thì không. 25 Ví dụ 1. Minh họa sử dụng biến #include #include #define PI 3.14 void main(){ float r, s;//Hai biến r, s thuộc kiểu số thực printf("Nhap ban kinh hinh tron:"); scanf("%f",&r); s = PI * r * r; printf("Dien tich hinh tron %f\n",s); getch(); } 26 Ví dụ 2 #include #include void main(){ float a, b, x; printf("Nhap he so a khac 0");scanf("%f",&a); printf("Nhap he so b, b=");scanf("%f",&b); x = -b/a; printf("Nghiem cua phuong trinh %f",x); getch(); } 27 6.2.7. Hàm • Mô tả: – Hàm (function) là một chương trình con có chức năng nhận dữ liệu đầu vào (các tham số đầu vào), thực hiện một chức năng nào đó và đưa ra các kết quả. • 2 loại hàm: – Hàm có sẵn trong thư viện – Hàm do người lập trình định nghĩa (viết ra) 28 Ham Tham so vao Tham so ra 6.2.7. Hàm • Ví dụ h{m có sẵn trong thư viện: – Thư viện stdio.h h{m: scanf, printf, . – Thư viện math.h h{m: pow, sin, cos, sqrt, Hàm Ý nghĩa Ký hiệu to|n học Ví dụ pow(x,y) x mũ y xy pow(2,3)=8 sin(x) Sin của x Sin(x) sin(0)=0 cos(x) Cos của x Cos(x) cos(0)=1 29 6.2.8. Biểu thức • Định nghĩa: – Biểu thức l{ sự ghép nối c|c to|n tử (operator) v{ c|c to|n hạng (operand) theo một quy tắc x|c định. – C|c to|n hạng có thể l{ biến, hằng – C|c to|n tử rất đa dạng: cộng, trừ, nh}n, chia.. • Ví dụ: Biểu thức tính biệt thức delta b*b – 4*a*c - a, b, c, 4 l{ c|c to|n hạng - C|c to|n tử (phép to|n): *, - 30 6.2.9. C}u lệnh • Câu lệnh (statement) diễn tả một hoặc một nhóm các thao tác trong giải thuật. • Chương trình được tạo thành từ dãy các câu lệnh. • Cuối mỗi câu lệnh bắt buộc có dấu chấm phẩy ‘;’ để đ|nh dấu kết thúc câu lệnh 31 6.2.9. C}u lệnh • Có 2 loại nhóm câu lệnh – Nhóm các câu lệnh đơn: những câu lệnh không chứa câu lệnh khác. – Ví dụ: • Lệnh gán: delta = 100; • Lệnh xuất ra màn hình: printf(« Hello World »); – Nhóm các câu lệnh phức: những câu lệnh chứa câu lệnh khác. – Ví dụ • Lệnh khối đặt trong cặp ngoặc nhọn { } 32 6.2.10. Chú thích • Chú thích (comment): – Lời mô tả, giải thích vắn tắt cho một câu lệnh, một đoạn chương trình hoặc cả chương trình – Giúp việc đọc và hiểu chương trình dễ dàng hơn – Chú thích không phải là câu lệnh -> không ảnh hưởng tới chương trình • Cách viết chú thích: trong C có hai cách – Chú thích một dòng: sử dụng // – Chú thích nhiều dòng: sử dụng /* và */ 33 Nội dung 6.1. Lịch sử ph|t triển 6.2. C|c phần tử cơ bản của ngôn ngữ C 6.3. Cấu trúc cơ bản của chương trình C 6.4. Biên dịch chương trình C 6.5. Trình biên dịch Turbo C++ 34 Ví dụ #include void main(){ // Khai bao cac bien int a, b; int tong, hieu, tich; // Nhap vao tu ban phim 2 so nguyen printf(“\n Nhap vao so nguyen thu nhat: ”); scanf(“%d”,&a); printf(“\n Nhap vao so nguyen thu hai: “); scanf(“%d”,&b); 35 Ví dụ // Tinh tong, hieu, tich cua 2 so do tong = a+b; hieu = a – b;tich = a*b; // Hien thi cac gia tri ra man hinh printf(“\n Tong cua 2 so vua nhap la %d”, tong); printf(“\n Hieu cua 2 so vua nhap la %d”, hieu); printf(“\n Tich cua 2 so vua nhap la %d”, tich); // Doi nguoi dung an phim bat ki getch(); } 36 37 • Gồm 6 phần có thứ tự như sau: Phần 1: Khai b|o tệp tiêu đề: #include Phần 2: Định nghĩa kiểu dữ liệu mới: typedef ... Phần 3: Khai b|o c|c h{m nguyên mẫu Phần 4: Khai b|o c|c biến to{n cục Phần 5: H{m main() Phần 6: Nội dung c|c h{m đ~ khai b|o 6.3. Cấu trúc cơ bản của chương trình C 38 • Phần 1: Khai b|o tệp tiêu đề: – Thông b|o cho chương trình dịch biết l{ chương trình có sử dụng những thư viện n{o. – VD: #include // thao tác vào ra #include // h{m của DOS • Phần 2: Định nghĩa c|c kiểu dữ liệu mới –Định nghĩa c|c kiểu dữ liệu mới (nếu cần) dùng cho cả chương trình. 6.3. Cấu trúc cơ bản của chương trình C 39 • Phần 3: Khai b|o c|c h{m nguyên mẫu: – Giúp cho chương trình dịch biết được những thông tin cơ bản của c|c h{m sử dụng trong chương trình. • Phần 4: Khai b|o c|c biến to{n cục – Ví dụ: int a, b; int tong, hieu, tich; 6.3. Cấu trúc cơ bản của chương trình C 40 • Phần 5: Hàm main( ) – Khi thực hiện, chương trình sẽ bắt đầu bằng việc thực hiện c|c lệnh trong h{m main( ). – Trong hàm main( ) có thể có lệnh gọi tới c|c hàm khác. • Phần 6: Nội dung của c|c h{m đ~ khai b|o – C{i đặt (viết m~) cho c|c h{m đ~ khai b|o nguyên mẫu ở phần 3. 6.3. Cấu trúc cơ bản của chương trình C Nội dung 6.1. Lịch sử ph|t triển 6.2. C|c phần tử cơ bản của ngôn ngữ C 6.3. Cấu trúc cơ bản của chương trình C 6.4. Biên dịch chương trình C 6.5. Trình biên dịch Turbo C++ 41 42 • Preprocessor – Loại bỏ c|c chú thích – Dịch c|c chị thị tiền xử lý bắt đầu l{ # • C Compiler – Biên dịch m~ nguồn th{nh m~ assembly. • Assembler – Tạo ra m~ object. • Trên UNIX  file .o • Trên MS-DOS  file.OBJ • Link Editor – Nếu tệp nguồn tham chiếu đến c|c h{m thư viện/h{m được định nghĩa thì Link editor kết hợp c|c h{m n{y với h{m main() để tạo ra tệp có thể thực thi được • Trong MS-DOS là file .exe 6.4. Biên dịch chương trình C Nội dung 6.1. Lịch sử ph|t triển 6.2. C|c phần tử cơ bản của ngôn ngữ C 6.3. Cấu trúc cơ bản của chương trình C 6.4. Biên dịch chương trình C 6.5. Trình biên dịch Turbo C++ 43 6.5.1. Giới thiệu • Trình biên dịch (compiler): dịch m~ nguồn (source code) th{nh file thực thi • C|c trình biên dịch C phổ biến – Turbo C++ của hãng Borland – MSC của Microsoft – GCC của GNU – Dev C++ của Bloodshed Software • Turbo C++ có nhiều phiên bản – Phiên bản lựa chọn: Turbo C++ 3.0 44 6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0 Cài đặt • B1: Chuẩn bị bộ c{i của Turbo C++ 3.0 (~4 MB) Copy bộ c{i n{y v{o m|y của bạn, giả sử v{o thư mục C:\TC_Setup. • B2: Đến thư mục chứa bộ c{i Turbo C++ 3.0 (như giả sử ở trên là C:\TC_Setup) v{ kích hoạt file INSTALL.EXE để chạy chương trình c{i đặt. Chương trình c{i đặt sẽ yêu cầu bạn chỉ ra ổ đĩa trên đó chứa bộ c{i Turbo C++ 3.0 – Enter the SOURCE drive to use: – H~y nhập v{o tên ổ đĩa, chẳng hạn C (ta để bộ c{i Turbo C++ 3.0 ở thư mục C:\TC_Setup). 45 6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0 • B3: Chương trình yêu cầu bạn nhập v{o đường dẫn tới thư mục chứa c|c file của Turbo C++ 3.0 – Enter the SOURCE Path: – Thông thường chương trình sẽ tự tìm cho bạn, v{ bạn chỉ cần ấn Enter để chuyển sang bước tiếp theo. • B4: X|c định thư mục c{i đặt. Thư mục n{y sẽ chứa c|c file của Turbo C++ 3.0 để bạn sử dụng sau n{y. – Directories [C:\TC] – Option[IDE CMD LIB CLASS BGI HELP EXMPL] 46 6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0 • Start Installation • Thư mục c{i đặt mặc định sẽ l{ \TC nằm trên thư mục gốc của ổ đĩa chứa bộ c{i. Nếu bạn muốn thay đổi thư mục c{i đặt thì h~y dùng c|c phím  và  để di chuyển hộp s|ng đến phần Directories, gõ Enter v{ nhập v{o đường dẫn mới, sau đó ấn phím Esc để trở về. • Dùng các phím  và  để di chuyển hộp s|ng đến phần Start Installation v{ ấn Enter. Chương trình sẽ tự động thực hiện v{ ho{n tất qu| trình c{i đặt cho bạn. • Lưu ý: Bạn có thể copy to{n bộ thư mục đ~ c{i đặt của Turbo C++ 3.0 về m|y v{ sử dụng, nhưng bạn phải chỉ cho Turbo C++ biết đường dẫn tới c|c tệp tiêu đề v{ c|c tệp thư viện bằng c|ch v{o menu Option, chọn Directories. 47 6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0 • Giao diện sử dụng của chương trình 48 6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0 49 Video: Setup TurboC 6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0 • Khởi động chương trình: tìm đến thư mục BIN trong thư mục c{i đặt v{ chạy file TC.EXE • Tạo cửa sổ soạn thảo mới: chọn menu File (hoặc ấn Alt-F), sau đó chọn mục New để mở cửa sổ soạn thảo mới. – Gõ chương trình nguồn v{o cửa số soạn thảo – Lưu chương trình với tên file,ví dụ: HelloWorld.cpp • Biên dịch chương trình: bấm F9 • Chạy chương trình: Ctrl + F9 50 6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0 51 Video: Sử dụng TurboC TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Phần 3. Lập trình C Bài 7. Kiểu dữ liệu và biểu thức trong C Nội dung 7.1. Các kiểu dữ liệu chuẩn trong C 7.2. Khai báo và khởi tạo biến, hằng 7.3. Biểu thức trong C 7.4. Các phép toán trong C 7.5. Một số toán tử đặc trưng 7.6. Các lệnh vào ra dữ liệu với các biến 2 7.1. C|c kiểu dữ liệu chuẩn trong C Kiểu dữ liệu Ý nghĩa Kích thước Miền dữ liệu unsigned char Kí tự 1 byte 0  255 char Kí tự 1 byte -128  127 unsigned int Số nguyên không dấu 2 byte 065.535 short int Số nguyên có dấu 2 byte -32.76832.767 int Số nguyên có dấu 2 byte -32.76832.767 3 7.1. C|c kiểu dữ liệu chuẩn trong C Kiểu dữ liệu Ý nghĩa Kích thước Miền dữ liệu unsigned long Số nguyên không dấu 4 byte 0  4,294,967,295 long Số nguyên có dấu 4 byte -2,147,483,648  2,147,483,647 float Số thực dấu phẩy động, độ chính x|c đơn 4 byte  3.4E-38   3.4E+38 double Số thực dấu phẩy động, độ chính x|c kép 8 byte  1.7E-308   1.7E+308 long double Số thực dấu phẩy động, độ chính x|c kép mở rộng 10 byte  3.4E-4932   1.1E+4932 4 Nội dung 7.1. Các kiểu dữ liệu chuẩn trong C 7.2. Khai báo và khởi tạo biến, hằng 7.3. Biểu thức trong C 7.4. Các phép toán trong C 7.5. Một số toán tử đặc trưng 7.6. Các lệnh vào ra dữ liệu với các biến 5 7.2.1. Khai b|o v{ khởi tạo biến • Một biến trước khi sử dụng phải được khai b|o • Cú pháp khai báo: kieu_du_lieu ten_bien; Hoặc: kieu_du_lieu ten_bien1, , ten_bienN; • Ví dụ: Khai b|o một biến x thuộc kiểu số nguyên 2 byte có dấu (int), biến y, z,t thuộc kiểu thực 4 byte (float) như sau: int x; float y,z,t; x = 3; y = x + 1; 6 7.2.1. Khai b|o v{ khởi tạo biến (2) Kết hợp khai b|o v{ khởi tạo • Cú pháp: kieu_du_lieu ten_bien = gia_tri_ban_dau; Hoặc: kieu_du_lieu bien1=gia_tri1, bienN=gia_triN; • Ví dụ: int a = 3;// sau lenh nay bien a se co gia tri bang 3 float x = 5.0, y = 7.6; // sau lenh nay x co gia // tri 5.0, y co gia tri 7.6 7 7.2.2. Khai b|o hằng • Cách 1: Dùng từ khóa #define: – Cú pháp: #define ten_hang gia_tri – Ví dụ: #define MAX_SINH_VIEN 50 #define CNTT “Cong nghe thong tin” #define DIEM_CHUAN 23.5 8 7.2.2. Khai b|o hằng • C|ch 2: Dùng từ khóa const : – Cú pháp: const kieu_du_lieu ten_hang = gia_tri; – Ví dụ: const int MAX_SINH_VIEN = 50; const char CNTT[20] = “Cong nghe thong tin”; const float DIEM_CHUAN = 23.5; 9 7.2.2. Khai b|o hằng • Chú ý: – Gi| trị của c|c hằng phải được x|c định ngay khi khai báo. – Trong chương trình, KHÔNG thể thay đổi được gi| trị của hằng. – #define l{ chỉ thị tiền xử lý (preprocessing directive) • Dễ đọc, dễ thay đổi • Dễ chuyển đổi giữa c|c nền tảng phần cứng hơn • Tốc độ nhanh hơn 10 Nội dung 7.1. Các kiểu dữ liệu chuẩn trong C 7.2. Khai báo và khởi tạo biến, hằng 7.3. Biểu thức trong C 7.4. Các phép toán trong C 7.5. Một số toán tử đặc trưng 7.6. Các lệnh vào ra dữ liệu với các biến 11 7.3.1. C|c loại biểu thức • a. Biểu thức số học: – L{ biểu thức m{ gi| trị của nó l{ c|c đại lượng số học (số nguyên, số thực). – C|c to|n tử l{ c|c phép to|n số học (cộng, trừ, nh}n, chia), c|c to|n hạng l{ c|c đại lượng số học (số, biến, hằng). – Ví dụ: • 3 * 3.7 • 8 + 6/3 • a + b – c // Với a, b, c l{ c|c biến thuộc một kiểu dữ liệu số n{o đó. 12 7.3.1. C|c loại biểu thức • b. Biểu thức logic: – L{ biểu thức m{ gi| trị của nó l{ c|c gi| trị logic, tức l{ một trong hai gi| trị: Đúng (TRUE) hoặc Sai (FALSE). • Gi| trị nguyên kh|c 0: Đúng (TRUE), • Gi| trị 0: Sai (FALSE). – C|c phép to|n logic gồm có • AND: VÀ logic, kí hiệu l{ && • OR: HOẶC logic, kí hiệu l{ || • NOT: PHỦ ĐỊNH, kí hiệu l{ ! 13 7.3.1. C|c loại biểu thức • c. Biểu thức quan hệ: – L{ những biểu thức trong đó có sử dụng c|c to|n tử quan hệ so s|nh như lớn hơn, nhỏ hơn, bằng nhau, kh|c nhau – Chỉ có thể nhận gi| trị l{ một trong 2 gi| trị Đúng (TRUE) hoặc Sai (FALSE)  Biểu thức quan hệ l{ một trường hợp riêng của biểu thức logic. 14 7.3.1. C|c loại biểu thức • Ví dụ về biểu thức quan hệ: 15 7.3.1. C|c loại biểu thức • Ví dụ về biểu thức logic: 16 Sử dụng biểu thức • L{m vế phải của lệnh g|n. • L{m to|n hạng trong c|c biểu thức kh|c. • L{m tham số thực trong lời gọi h{m. • L{m chỉ số trong c|c cấu trúc lặp for, while, do while. • L{m biểu thức kiểm tra trong c|c cấu trúc rẽ nhánh if, switch. 17 Nội dung 7.1. Các kiểu dữ liệu chuẩn trong C 7.2. Khai báo và khởi tạo biến, hằng 7.3. Biểu thức trong C 7.4. Các phép toán trong C 7.5. Một số toán tử đặc trưng 7.6. Các lệnh vào ra dữ liệu với các biến 18 7.4. Các phép toán trong C • Bao gồm: – Nhóm c|c phép to|n số học – Nhóm c|c phép to|n quan hệ – Nhóm các phép toán logic – Nhóm các phép toán thao tác trên bit – Ngo{i ra C còn cung cấp một số phép to|n kh|c nữa như phép g|n, phép lấy địa chỉ 19 7.4.1. Phép to|n số học 20 7.4.2. Phép toán trên bit (bitwise) 21 1) 1) 7.4.2. Phép toán trên bit 22 7.4.3. Phép to|n quan hệ 23 7.4.4. Phép toán logic 24 7.4.5. Phép toán gán • Cú pháp tên_biến = biểu_thức; • Lấy gi| trị của biểu_thức gán cho tên_biến • Ví dụ: int a, b, c; a = 3; b = a + 5; c = a * b; 25 7.4.5. Phép toán gán • Biểu thức g|n l{ biểu thức nên nó cũng có gi| trị. • Gi| trị của biểu thức g|n bằng gi| trị của biểu_thức:  Có thể g|n gi| trị của biểu thức g|n cho một biến kh|c hoặc sử dụng như một biểu thức bình thường • Ví dụ: int a, b, c; a = b = 2007; c = (a = 20) * (b = 30); 26 7.4.5. Phép toán gán • Phép to|n g|n thu gọn: x = x + y; giống như x += y; • Dạng lệnh g|n thu gọn n{y còn |p dụng được với c|c phép to|n kh|c: +, -, *, /, %, >>, <<, &, |, ^ 27 7.4.6. Thứ tự ưu tiên c|c phép to|n 28 Muc Cac toan tu Trat tu ket hop 1 () [] . -> ++ -- (ha 2 3 4 5 6 7 8 9 10 11 12 13 14 Ví dụ • a < 10 && 2 * b < c •  ( a < 10 ) && ( ( 2 * b ) < c ) 29 Nội dung 7.1. Các kiểu dữ liệu chuẩn trong C 7.2. Khai báo và khởi tạo biến, hằng 7.3. Biểu thức trong C 7.4. Các phép toán trong C 7.5. Một số toán tử đặc trưng 7.6. Các lệnh vào ra dữ liệu với các biến 30 7.5.1. C|c phép to|n tăng giảm một đơn vị • Tăng hoặc giảm một đơn vị cho biến: – = + 1;  ++; – = - 1;  --; – Ví dụ: int a = 5; float x = 10; a++; // tương đương với a = a + 1; x--; // tương đương với x = x – 1; 31 Tiền tố v{ hậu tố • Tiền tố: Thay đổi gi| trị của biến trước khi sử dụng • Hậu tố: Tính to|n gi| trị của biểu thức bằng gi| trị ban đầu của biến, sau đó mới thay đổi gi| trị của biến • Ví dụ: int a, b, c; a = 3; // a bang 3 b = a++;// Dang hau to // b bằng 3; a bằng 4 c = ++b;// Dang tien to // b bằng 4, c bằng 4; 32 7.5.2. Phép to|n lấy địa chỉ biến (&) • Biến thực chất l{ một vùng nhớ được đặt tên (l{ tên của biến) trên bộ nhớ của m|y tính. • Mọi ô nhớ trên bộ nhớ m|y tính đều được đ|nh địa chỉ. Do đó mọi biến đều có địa chỉ • & ; – Ví dụ: int a = 2006;  &a; // co gia tri la 158 hay 9E 33 . . . . . . D6 07 . . . 157 158 159 160 1 a 7.5.3. Phép to|n chuyển đổi kiểu bắt buộc • Chương trình dịch sẽ tự động chuyển đổi kiểu – char  int  long int  float  double  long double • Ngược lại – Số nguyên long int 50,000 không phải l{ một số nguyên kiểu int vì phạm vi biểu diễn của kiểu int l{ từ (-32,768 đến 32,767).  Phải ép kiểu • Cú pháp: () ; 34 7.5.3. Phép to|n chuyển đổi kiểu bắt buộc (2) • Ví dụ: #include #include void main() { long int li; int i; float f; clrscr(); li = 0x123456; f = 123.456; i = (int) li; printf(“\n li = %ld; i = %d”,li, i); i = (int) f; printf(“\n f = %f; i = %d”,f, i); getch(); } 35 • Kết quả li = 1193046; i = 13398 f = 123.456000; i = 123 7.5.4. Biểu thức điều kiện • Cú pháp – biểu_thức_1 ? biểu_thức_2 : biểu_thức_3 – Gi| trị của biểu thức điều kiện • Gi| trị của biểu_thức_2 nếu biểu_thức_1 có gi| trị kh|c 0 (tương ứng với gi| trị logic ĐÚNG), • Ngược lại: Gi| trị của biểu_thức_3 nếu biểu_thức_1 có gi| trị bằng 0 (tương ứng với gi| trị logic SAI). • Ví dụ: float x, y, z; // khai báo biến x = 3.8; y = 7.6; //gán giá trị cho các biến x, y z = (x<y) ? x : y; //z sẽ có giá trị bằng giá trị // nhỏ nhất trong 2 số x và y 36 Nội dung 7.1. Các kiểu dữ liệu chuẩn trong C 7.2. Khai báo và khởi tạo biến, hằng 7.3. Biểu thức trong C 7.4. Các phép toán trong C 7.5. Một số toán tử đặc trưng 7.6. Các lệnh vào ra dữ liệu 37 7.6. C|c lệnh v{o ra dữ liệu • C cung cấp 2 h{m v{o ra cơ bản: – printf() – scanf() • Muốn sử dụng 2 h{m printf() và scanf() ta cần khai b|o tệp tiêu đề stdio.h: #include Hoặc #include “stdio.h” 38 7.6.1. Hàm printf a. Mục đích và cú pháp: • Mục đích: – Hiển thị ra m{n hình c|c loại dữ liệu cơ bản như: Số, kí tự v{ x}u kí tự – Một số hiệu ứng hiển thị đặc biệt như xuống dòng, sang trang, 39 a. Mục đích v{ cú ph|p (2) • Cú pháp: printf(xau_dinh_dang [, danh_sach_tham_so]); –xau_dinh_dang: Qui định c|ch thức hiển thị dữ liệu ra m{n hình m|y tính. –danh_sach_tham_so: Danh s|ch c|c biến sẽ được hiển thị gi| trị lên m{n hình theo c|ch thức được qui định trong xau_dinh_dang. 40 a. Mục đích v{ cú ph|p (3) • Ví dụ: Chương trình sau #include #include void main() { int a = 5; float x = 1.234; printf(“Hien thi mot so nguyen %d và mot so thuc %f”,a,x); getch(); } • Sẽ cho ra kết quả: Hien thi mot so nguyen 5 va mot so thuc 1.234000 41 a. Mục đích v{ cú ph|p (4) • Trong xau_dinh_dang chứa: – C|c kí tự thông thường: Được hiển thị ra m{n hình. – C|c nhóm kí tự định dạng: X|c định quy c|ch hiển thị c|c tham số trong phần danh_sach_tham_so. – C|c kí tự điều khiển: Dùng để tạo c|c hiệu ứng hiển thị đặc biệt như xuống dòng (‘\n’) hay sang trang (‘\f ’) 42 a. Mục đích v{ cú ph|p (5) • Mỗi nhóm kí tự định dạng chỉ dùng cho một kiểu dữ liệu Ví dụ: %d dùng cho kiểu nguyên %f dùng cho kiểu thực • Nếu giữa nhóm kí tự định dạng v{ tham số tương ứng không phù hợp với nhau thì sẽ hiển thị ra kết quả không như ý. 43 a. Mục đích v{ cú ph|p (6) • danh_sach_tham_so phải phù hợp với c|c nhóm kí tự định dạng trong xau_dinh_dang về: – Số lượng – Kiểu dữ liệu – Thứ tự 44 Nhóm kí tự định dạng Kiểu dữ liệu Kết quả %c int, char Kí tự đơn lẻ %i, %d int, char Số thập ph}n %o int, char Số b|t ph}n (không có 0 đằng trước) %x, %X int, char Số hexa (chữ thường/chữ hoa) %u unsigned int/char Số thập ph}n 45 b. Một số nhóm định dạng phổ biến Nhóm kí tự định dạng Kiểu dữ liệu Kết quả %ld, %li long Số thập ph}n %lo long Số b|t ph}n (không có 0 đằng trước) %lx, %LX long Số hexa (chữ thường/chữ hoa) %lu unsigned long Số thập ph}n 46 b. Một số nhóm định dạng phổ biến (2) Nhóm kí tự định dạng Kiểu dữ liệu Kết quả %s char [] Hiển thị x}u kí tự kết thúc bởi ‘\0’ %f float/double Số thực dấu phẩy tĩnh %e, %E float/double Số thực dấu phẩy động 47 c. Một số nhóm định dạng phổ biến (3) c. Độ rộng hiển thị - số nguyên • Đối với số nguyên hoặc ký tự hoặc xâu ký tự: – Có dạng %md, với m l{ số nguyên không }m – Ví dụ: Có số a = 1234 Lệnh: printf("%5d",a);//danh 5 cho de hien thi a printf(“\n%5d",34); Cho ra kết quả: 1234 34 ( kí hiệu cho dấu c|ch đơn (space) ) 48 c. Độ rộng hiển thị - số nguyên (2) • Ví dụ: printf("\n%3d %15s %3c", 1, "nguyen van a", 'g'); printf("\n%3d %15s %3c", 2, "tran van b", 'k'); • Kết quả: 1 nguyen van a g 2 tran van b k 49 c. Độ rộng hiển thị - số thực • m, n là 2 số nguyên không âm %m.nf Trong đó: – m vị trí để hiển thị số thực, bao gồm cả kí tự '.‘, ‘-’ – n vị trí trong m vị trí đó để hiển thị phần thập phân. 50 c. Độ rộng hiển thị - số thực (2) • Ví dụ: printf("\n%f",17.345); printf("\n%.2f",17.345); printf("\n%7.2f",17.345); • Kết quả: 17.345000 17.34 17.34 51 c. Độ rộng hiển thị - Chú ý • Khi số chỗ cần thiết để hiển thị nội dung dữ liệu lớn hơn trong định dạng: – Tự động cung cấp thêm chỗ mới để hiển thị chứ không cắt bớt nội dung của dữ liệu. – Ví dụ: a=1000 printf(“So a la: %1d”, a); – Kết quả: So a la: 1000 52 d. Căn lề phải, lề tr|i • Căn lề phải: – Khi hiển thị dữ liệu, mặc định C căn lề phải • Căn lề trái: – Nếu muốn căn lề tr|i khi hiển thị dữ liệu ta chỉ cần thêm dấu trừ - v{o ngay sau dấu %. 53 d. Căn lề phải, lề tr|i (2) • Ví dụ: printf("\n%-3d %-15s %.2f %-3c", 9, "nguyen van a", 7.5, 'g'); printf("\n%-3d %-15s %.2f %-3c", 10, “nguyen ha", 6.75, 'k'); • Kết quả: 9 nguyen van a 7.50 g 10 nguyen ha 6.75 k 54 7.6.2. Hàm scanf a. Mục đích và cú pháp: • Mục đích: – Hàm scanf() dùng để nhập dữ liệu từ bàn phím • Cú pháp: scanf(xau_dinh_dang[,danh_sach_dia_chi]); • Ví dụ: int a; float b; scanf(“%d %f”, &a, &b); 55 a. Mục đích v{ cú ph|p (3) • Xau_dinh_dang: – Gồm các ký tự được qui định cho từng loại dữ liệu được nhập vào. – Ví dụ: Với dữ liệu định nhập vào là kiểu nguyên thì xâu định dạng là : %d • Danh_sach_dia_chi: – Bao gồm các địa chỉ của các biến (toán tử &), phân tách nhau bởi dấu phẩy (,) 56 a. Mục đích v{ cú ph|p (4) • danh_sach_dia_chi phải phù hợp với các nhóm kí tự định dạng trong xau_dinh_dang về: – Số lượng – Kiểu dữ liệu – Thứ tự 57 Nhóm kí tự định dạng Kiểu dữ liệu Chú thích Ví dụ %c char Kí tự đơn lẻ char x; scanf(“%c”, &x); %d int Số thập ph}n int x; scanf(“%d”, &x); %o int Số bát phân int x; scanf(“%o”, &x); %x int Số hexa int x; scanf(“%x”, &x); %u unsigned int Số thập phân unsigned int x; scanf(“%u”, &x); 58 b. Một số nhóm định dạng phổ biến Nhóm kí tự định dạng Kiểu dữ liệu Chú thích %s char* Nhập x}u kí tự kết thúc bởi ‘\0’ %f float Số thực dấu phẩy tĩnh %ld long Số nguyên %lf double Số thực dấu phẩy tĩnh 59 c. Một số nhóm định dạng phổ biến (3) Ví dụ #include #include void main() { // khai bao bien int a; float x; char ch; char str[30]; // Nhap du lieu printf(“Nhap vao mot so nguyen”); scanf(“%d”,&a); printf(“\n Nhap vao mot so thuc”); scanf(“%f”,&x); 60 Ví dụ printf(“\n Nhap vao mot ki tu”); fflush(stdin); scanf(“%c”,&ch); printf(“\n Nhap vao mot xau ki tu”); fflush(stdin); scanf(“%s”,str); // Hien thi du lieu vua nhap vao printf(“\n Nhung du lieu vua nhap vao”); printf(“\n So nguyen: %d”,a); printf(“\n So thuc : %.2f”,x); printf(“\n Ki tu: %c: ”,ch); printf(“\n Xau ki tu: %s”,str); getch(); } 61 Ví dụ • Kết quả: Nhap vao mot so nguyen: 2007 Nhap vao mot so thuc: 17.1625 Nhap vao mot ki tu: b Nhap vao mot xau ki tu: ngon ngu lap trinh C Nhung du lieu vua nhap vao So nguyen: 2007 So thuc: 17.16 Ki tu: b Xau ki tu: ngon 62 c. Một số quy tắc cần lưu ý • Quy tắc 1: Khi đọc số – H{m scanf() quan niệm rằng mọi kí tự số, dấu chấm (‘.’) đều l{ kí tự hợp lệ. – Khi gặp c|c dấu ph}n c|ch như tab, xuống dòng hay dấu c|ch (space bar) thì scanf() sẽ hiểu l{ kết thúc nhập dữ liệu cho một số 63 c. Một số quy tắc cần lưu ý (tiếp) • Quy tắc 2: Khi đọc kí tự: Hàm scanf() cho rằng mọi kí tự có trong bộ đệm của thiết bị vào chuẩn đều là hợp lệ, kể cả các kí tự tab, xuống dòng hay dấu cách. 64 Phần mềm (viết bằng C) c. Một số quy tắc cần lưu ý (tiếp) • Quy tắc 3: Khi đọc xâu kí tự: + Hàm scanf() nếu gặp các kí tự dấu trắng, dấu tab hay dấu xuống dòng thì nó sẽ hiểu là kết thúc nhập dữ liệu cho một xâu kí tự. + Trước khi nhập dữ liệu kí tự hay xâu kí tự ta nên dùng lệnh fflush(stdin) để xóa bộ đệm. 65 Bộ đệm bàn phím A B C 8 Phần mềm C scanf("%c:\", &x); người dùng gõ kí tự '8' 7.6.3. C|c lệnh v{o ra kh|c • Hàm gets(): Dùng để nhập v{o từ b{n phím một x}u kí tự bao gồm cả dấu c|ch, điều m{ h{m scanf() không l{m được. • Cú pháp : gets (biến_xâu_kí_tự); • Ví dụ: char str[30]; printf(“Nhap vao mot xau ki tu:”); fflush(stdin); gets(str); 66 7.6.3. C|c lệnh v{o ra kh|c (2) • Hàm puts(): Hiển thị ra m{n hình nội dung x}u_kí_tự v{ sau đó đưa con trỏ xuống dòng mới. • Cú pháp: puts(xâu_kí_tự); • Ví dụ: puts(“Nhap vao xau ki tu:”); • Tương đương với: printf(“%s\n”, “Nhap vao xau ki tu:“); Hoặc printf(“Nhap vao xau ki tu:\n”); 67 7.6.3. C|c lệnh v{o ra kh|c (3) • H{m getch(): thường dùng để chờ người sử dụng ấn một phím bất kì rồi sẽ kết thúc chương trình. • Cú pháp getch(); • Sử dụng h{m gets(), puts(), cần khai b|o tệp tiêu đề stdio.h • Sử dụng h{m getch(), cần khai b|o tệp tiêu đề conio.h • (Hàm tương tự getchar()) 68 7.6.3. C|c lệnh v{o ra kh|c (4) • Ví dụ: #include #include void main() { char str[30]; puts(“Hay cho biet ho ten ban:”); fflush(stdin); gets(str); printf(“Xin chao ”); puts(str); puts(“An phim bat ki de ket thuc...”); getch(); } 69 C|c lệnh nhập xuất kh|c • Kết quả: Hay cho biet ho ten ban: ngon ngu lap trinh C Xin chao ngon ngu lap trinh C An phim bat ki de ket thuc ... 70

Các file đính kèm theo tài liệu này:

  • pdfbai_giang_tin_hoc_dai_cuong_ban_day_du.pdf
  • pdf01-Thong tin va bieu dien thong tin.pdf
  • pdf02-He thong may tinh.pdf
  • pdf03-Cac he thong ung dung.pdf
  • pdf04-Giai quyet bai toan.pdf
  • pdf05-Mot so thuat toan thong dung.pdf
  • pdf06-Tong quan ve ngon ngu C.pdf
  • pdf07- Kieu du lieu va bieu thuc trong C.pdf
Tài liệu liên quan