bài giảng lập trình C ĐH Công Nghiệp TP.HCM
NGÔN NGỮ LẬP TRÌNH C Giảng viên: TS. Nguyễn Viễn Quốc Email: vienquoc@gmail.com Nội dung Chương 1: Giới thiệu ngôn ngữ lập trình C Chương 2: Các thành phần cơ bản và các kiểu dữ liệu của C Chương 3: Các lệnh điều khiển và vòng lặp Chương 4: Hàm Chương 5: Lớp lưu trữ của biến - Sự chuyển kiểu Chương 6: Mảng Chương 7: Pointer Chương 8: Các kiểu dữ liệu có cấu trúc và kiểu dữ liệu tự định nghĩa Chương 9: Tập tin Chương 10: Lệnh tiền xử lý Tài liệu tham khảo 1. Đặng Thành Tín, Tin học II, NXB ĐH Quốc Gia Tp. HCM, 2007 2. Brian W. Kernighan, Dennis M. Ritchie, The C Programming Language - 2 nd ed, Prentice Hall, 1989. 3. Quách Tuấn Ngọc, Ngôn ngữ lập trình C, NXB Thống Kê, 2003. 1 Chương 1: Giới thiệu ngôn ngữ lập trình C 1.1) Lịch sử phát triển Ra đời khoảng thời gian 1969-1973, gắn liền với sự phát triển của hệ điều hành Unix. Tác giả: Denis Ritchie (1941-2011) và cộng sự ở Bell Labs. Có nhiều phiên bản: K&R C (1978), ANSI C hay C89 (1989), C99 (1999), C11 (2011). C++ là bản mở rộng của C, hỗ trợ lập trình hướng đối tượng (Object-Oriented Programming). Lập trình trong môi trường Windows: Visual C++ (Microsoft), Visual C# (Microsoft), C++ Builder (Borland). 1.2) Tổng Quan C là ngôn ngữ lập trình bậc cao (high-level programming language). C kết hợp các tính năng của ngôn ngữ bậc cao với ngôn ngữ bậc thấp, nên một số tài liệu xếp ngôn ngữ C thuộc loại ngôn ngữ bậc trung (middle level language) → cho phép lập trình linh hoạt, hiệu quả → được xem là ngôn ngữ lập trình chuyên nghiệp. 2 Các thao tác thực hiện khi lập trình: o Soạn thảo (edit) → text file (có đuôi là ‘.c’) o Biên dịch (compile) → object file (có đuôi là ‘.o’ hay ‘.obj’) o Liên kết (link) → file chạy được (có đuôi là ‘.exe’) IDE (integrated development environment - môi trường phát triển tích hợp) là phần mềm cho phép người lập trình có thể soạn thảo, biên dịch, liên kết, thực thi và gỡ rối (debug) trong cùng một môi trường. Một số IDE chạy trên MS-DOS (lỗi thời): o Turbo C (Borland) o QuickC (Microsoft) Một số IDE chạy trên Windows: o Dev-C++ (tải miễn phí tại www.bloodshed.net) o Code::Blocks (tải miễn phí tại www.codeblocks.org) o Visual C++ Express (tải miễn phí tại www.microsoft.com) o Visual Studio 2005/2008/2010. 3 Kỹ sư ngành cơ điện tử học ngôn ngữ lập trình C để làm gì? o Để có tư duy lập trình. o Để có thể lập trình cho các bộ vi điều khiển, DSP, … 8051 (Keil C) PIC (C30, Hi-Tech C, CCS) AVR (Code Vision) TMS320 (Code Composer Studio) o Để có thể lập trình cho các hệ thống điều khiển có dùng máy tính, . o Để có thể dễ dàng tiếp cận với các ngôn ngữ lập trình hướng đối tượng như C++, Java, Visual C++, Visual C#, … 1.3) Một số ví dụ Ví dụ 1: Chương trình in ra màn hình câu “Hello, world!”. 1 #include <stdio.h> 2 main() 3 { 4 printf("Hello, world\n"); 5 } Giải thích: Hàng 2-5: chương trình C bao giờ cũng có 1 hàm main(). Hàm này được thực thi đầu tiên khi chạy chương trình. Bên trong dấu {} sau tên hàm là thân hàm. Hàng 4: Hàm printf() in ra màn hình chuỗi ký tự nằm giữa 2 dấu ngoặc kép. printf() là hàm thuộc thư viện vào ra chuẩn (stdio). Để liên kết với thư viện này cần phải khai báo #include <stdio.h> ở đầu chương trình. ‘\n’ là ký tự xuống hàng. Dấu chấm phẩy dùng để kết thúc một lệnh. 4 Ví dụ 1a: Cho biết kết quả chạy chương trình dưới đây? 1 #include <stdio.h> 2 main() 3 { 4 printf("Hello, "); 5 printf("world"); 6 printf("\n"); 7 } Ví dụ 2: Viết chương trình in ra màn hình bảng lũy thừa 2 của các số nguyên từ 1 đến 10. 1 #include <stdio.h> 2 main() 3 { 4 int n, n2; 5 n = 1; 6 while(n<=10) 7 { 8 n2 = n * n; 9 printf("%2d %5d\n",n,n2); 10 n = n + 1; 11 } 12 } Giải thích: Hàng 4: khai báo biến n và n2 thuộc kiểu int (kiểu nguyên). Mọi biến cần phải khai báo kiểu trước khi sử dụng. Hàng 9: %2d và %5d là định dạng chuỗi xuất tương ứng cho biến n và biến n2. 5 Một số định dạng thường dùng trong printf(), scanf() Định dạng Ý nghĩa %c Ký tự kiểu char %d Số nguyên hệ thập phân %u Số nguyên không dấu %x Số nguyên hệ thập lục phân (hexa) %o Số nguyên hệ bát phân (octal) %f Số dấu chấm động (số thực) %e Số dấu chấm động dạng mũ %s Chuỗi ký tự VD: %d: in số nguyên thập phân. %f: in số dấu chấm động . %2d: in số nguyên thập phân độ dài ít nhất 2 ký tự. %6f: in số kiểu float độ dài ít nhất 6 ký tự (kể cả dấu chấm). %6.2f: in số kiểu float độ dài ít nhất 6 ký tự, trong đó có 2 ký tự sau dấu chấm. Hàng 6-11: vòng lặp while, được hiểu là “trong khi n<=10, hãy thực hiện lệnh bên trong dấu {…}”. Ví dụ 3: Viết chương trình nhập 2 số, in ra màn hình tổng của 2 số đó. 1 #include <stdio.h> 2 #include <conio.h> 3 main() 4 { 5 float a, b; 6 printf("a = "); 7 scanf("%f",&a); 8 printf("b = "); 9 scanf("%f",&b); 10 printf("a + b = %f", a+b); 11 getch(); 12 } 6 Chương 2: CÁC THÀNH PHẦN CƠ BẢN VÀ CÁC KIỂU DỮ LIỆU CỦA C 2.1) Bộ ký tự cho C Ngôn ngữ C sử dụng bộ ký tự sau: o Các chữ cái hoa: A B C … Z o Các chữ cái thường: a b c … z o Các chữ số: 0 1 2 … 9 o Các dấu chấm câu: , . ; : ? ( ) [ ] { } < > ! @ # $ % ^ & + - * / = ‘ “ o Các dấu không nhìn thấy: dấu cách (space), dấu tab, dấu xuống dòng. o Dấu gạch dưới _ 2.1) Định danh (identifiers) Định danh: tên hằng, tên biến, tên hàm do người lập trình định nghĩa. Cách đặt tên: o Gồm các ký tự: a…z, A…Z, 0…9, dấu gạch dưới “_” o Không chứa khoảng trắng o Không bắt đầu bằng chữ số o Không trùng từ khóa Mọi tên đều phải khai báo trước khi sử dụng. C phân biệt chữ hoa và chữ thường. 2.2) Từ khóa (keywords) Từ khóa (keyword): từ dành riêng đã được định nghĩa sẵn (auto, break, case, char, … - xem sách tr. 444) Các từ khóa của C đều ở dạng chữ thường. 7 2.3) Chú thích (comments) Nên viết lời chú thích để chương trình thêm dễ hiểu. Dùng cặp ký hiệu /* và */ kẹp giữa lời chú thích hoặc đặt ký hiệu // ở đầu dòng chú thích. Trình biên dịch bỏ qua dòng chú thích này. 2.4) Các kiểu dữ liệu của C 4 kiểu dữ liệu chuẩn: char, int, float và double. Các dạng bổ sung signed, unsigned, short, long thêm vào trước các kiểu dữ liệu chuẩn để tạo ra nhiều kiểu khác nhau. Kiểu dữ liệu Kích thước Ý nghĩa char 1 byte Kiểu ký tự (-128 ÷ 127) int 2 hoặc 4 byte (tùy máy tính) Kiểu số nguyên short 2 byte Kiểu số nguyên long 4 byte Kiểu số nguyên unsigned char 1 byte Kiểu ký tự không dấu (0 ÷ 255) unsigned int 4 byte Kiểu số nguyên không dấu unsigned short 2 byte Kiểu số nguyên không dấu 8 unsigned long 4 byte Kiểu số nguyên không dấu float 4 byte Kiểu số có dấu chấm động (số thực) double 8 byte Kiểu số có dấu chấm động (số thực) long double 12 byte Kiểu số có dấu chấm động (số thực) Ví dụ: Viết chương trình in ra màn hình kích thước các kiểu dữ liệu. #include <stdio.h> #include <conio.h> main() { printf("Kieu du lieu kich thuoc\n"); printf("char %d byte\n",sizeof(char)); printf("int %d byte\n",sizeof(int)); printf("short %d byte\n",sizeof(short)); printf("long %d byte\n",sizeof(long)); printf("unsigned char %d byte\n",sizeof(unsigned char)); printf("unsigned int %d byte\n",sizeof(unsigned int)); printf("float %d byte\n",sizeof(float)); printf("double %d byte\n",sizeof(double)); getch(); } Kết quả chạy chương trình: 9 2.5) Hằng (Constant) Hằng là những giá trị xác định, không thay đổi trong quá trình thực thi chương trình. Hằng số: hằng số nguyên, hằng số thực. o Các hằng số được viết không có dấu chấm thập phân hoặc số mũ (E) sẽ được hiểu là hằng số nguyên và được lưu trữ theo kiểu int, ngược lại sẽ được lưu trữ theo kiểu double. o Các hằng số nguyên lớn hơn khả năng một int được tự động lưu trữ treo kiểu long. o Các hằng số nguyên lớn hơn một long được lưu trữ theo kiểu double. Ví dụ: Xét chương trình dưới đây #include <stdio.h> #include <conio.h> main() { int n1, n2; n1 = 100; n2 = 2147483600; printf("n1 = %d\n", n1); printf("n2 = %d\n", n2); printf("n1 + 20 = %d\n", n1 + 20); printf("n1 + 20.0 = %d\n", n1 + 20.0); printf("n1 + 020 = %d\n", n1 + 020); printf("n1 + n2 = %d\n", n1 + n2); getch(); } Kết quả chạy chương trình: 10