Giáo trình C căn bản - Nguyễn Hữu Tuấn
GIỚI THIỆU Tin học ngành khoa học mũi nhọn phát triển nhanh chóng vài chục năm lại ngày mở rộng lĩnh vực nghiên cứu, ứng dụng mặt đời sống xã hội Ngơn ngữ lập trình loại cơng cụ giúp người thể vấn đề thực tế lên máy tính cách hữu hiệu Với phát triển tin học, ngôn ngữ lập trình dần tiến hố để đáp ứng thách thức thực tế Khoảng cuối năm 1960 đầu 1970 xuất nhu cầu cần có ngơn ngữ bậc cao để hỗ trợ cho nhà tin học việc xây dựng phần mềm hệ thống, hệ điều hành Ngơn ngữ C đời từ đó, phát triển phịng thí nghiệm Bell Đến năm 1978, giáo trình " Ngơn ngữ lập trình C " tác giả ngơn ngữ Dennish Ritchie B.W Kernighan viết, xuất phổ biến rộng rãi C ngôn ngữ lập trình vạn Ngồi việc C dùng để viết hệ điều hành UNIX, người ta nhanh chóng nhận sức mạnh C việc xử lý cho vấn đề đại tin học C không gắn với hệ điều hành hay máy nào, gọi " ngơn ngữ lập trình hệ thống" dùng cho việc viết hệ điều hành, tiện lợi cho việc viết chương trình xử lý số, xử lý văn sở liệu Và tìm hiểu giới ngôn ngữ C từ khái niệm ban đầu Hà nội tháng 11 năm 1997 Nguyễn Hữu Tuấn Chương CÁC KHÁI NIỆM CƠ BẢN 1.1 Tập ký tự dùng ngôn ngữ C : Mọi ngôn ngữ lập trình xây dựng từ ký tự Các ký tự nhóm lại theo nhiều cách khác để tạo nên từ Các từ lại liên kết với theo qui tắc để tạo nên câu lệnh Một chương trình bao gồm nhiều câu lệnh thể thuật toán để giải toán Ngơn ngữ C xây dựng ký tự sau : 26 chữ hoa : A B C Z 26 chữ thường : a b c z 10 chữ số : Các ký hiệu toán học : + - * / = ( ) Ký tự gạch nối : _ Các ký tự khác : , : ; [ ] {} ! \ & % # $ Dấu cách (space) dùng để tách từ Ví dụ chữ VIET NAM có ký tự, cịn VIETNAM có ký tự Chú ý : Khi viết chương trình, ta khơng sử dụng ký tự khác ký tự Ví dụ lập chương trình giải phương trình bậc hai ax2 +bx+c=0 , ta cần tính biệt thức Delta ∆= b2 - 4ac, ngôn ngữ C không cho phép dùng ký tự ∆, ta phải dùng ký hiệu khác để thay 1.2 Từ khoá : Từ khoá từ sử dụng để khai báo kiểu liệu, để viết toán tử câu lệnh Bảng liệt kê từ khoá TURBO C : asm char extern goto interrupt register sizeof tipedef volatile Ý nghĩa cách sử dụng break case cdecl const continue default double else enum far float for huge if int long near pascal return short signed static struct switch union unsigned void while từ khoá đề cập sau này, ta cần ý : - Khơng dùng từ khố để đặt tên cho hằng, biến, mảng, hàm - Từ khố phải viết chữ thường, ví dụ : viết từ khoá khai báo kiểu nguyên int INT 1.3 Tên : Tên khái niệm quan trọng, dùng để xác định đại lượng khác chương trình Chúng ta có tên hằng, tên biến, tên mảng, tên hàm, tên trỏ, tên tệp, tên cấu trúc, tên nhãn, Tên đặt theo qui tắc sau : Tên dãy ký tự bao gồm chữ cái, số gạch nối Ký tự tên phải chữ gạch nối Tên không trùng với khoá Độ dài cực đại tên theo mặc định 32 đặt lại giá trị từ tới 32 nhờ chức : Option-Compiler-Source-Identifier length dùng TURBO C Ví dụ : Các tên : a_1 Các tên sai delta x1 _step GAMA : 3MN m#2 f(x) te ta Y-3 Ký tự số Sử dụng ký tự # Sử dụng dấu ( ) Trùng với từ khoá Sử dụng dấu trắng Sử dụng dấu - Chú ý : Trong TURBO C, tên chữ thường chữ hoa khác ví dụ tên AB khác với ab C, ta thường dùng chữ hoa để đặt tên cho dùng chữ thường để đặt tên cho hầu hết cho đại lượng khác biến, biến mảng, hàm, cấu trúc Tuy nhiên điều bắt buộc 1.4 Kiểu liệu : Trong C sử dụng các kiểu liệu sau : 1.4.1 Kiểu ký tự (char) : Một giá trị kiểu char chiếm byte ( bit ) biểu diễn ký tự thơng qua bảng mã ASCII Ví dụ : Ký tự A B a b Mã ASCII 048 049 050 065 066 097 098 Có hai kiểu liệu char : kiểu signed char unsigned char Kiểu Char ( Signed Phạm vi biểu diễn -128 đến 127 Số ký tự Kích 256 thước byte char ) Unsigned char đến 255 256 byte Ví dụ sau minh hoạ khác hai kiểu liệu : Xét đoạn chương trình sau : char ch1; unsigned char ch2; ch1=200; ch2=200; Khi thực chất : ch1=-56; ch2=200; Nhưng ch1 ch2 biểu diễn ký tự có mã 200 Phân loại ký tự : Có thể chia 256 ký tự làm ba nhóm : Nhóm 1: Nhóm ký tự điều khiển có mã từ đến 31 Chẳng hạn ký tự mã 13 dùng để chuyển trỏ đầu dòng, ký tự 10 chuyển trỏ xuống dòng ( cột ) Các ký tự nhóm nói chung khơng hiển thị hình Nhóm : Nhóm ký tự văn có mã từ 32 đến 126 Các ký tự đưa hình máy in Nhóm : Nhóm ký tự đồ hoạ có mã số từ 127 đến 255 Các ký tự đưa hình khơng in ( lệnh DOS ) 1.4.2 Kiểu nguyên : Trong C cho phép sử dụng số nguyên kiểu int, số nguyên dài kiểu long số ngun khơng dấu kiểu unsigned Kích cỡ phạm vi biểu diễn chúng bảng : Kiểu Phạm vi biểu diễn int unsigned int long unsigned Kích -32768 đến 32767 đến 65535 -2147483648 đến 2147483647 đến 4294967295 thước byte byte byte byte long Chú ý : Kiểu ký tự xem dạng kiểu nguyên 1.4.3 Kiểu dấu phảy động : Trong C cho phép sử dụng ba loại liệu dấu phảy động, float, double long double Kích cỡ phạm vi biểu diễn chúng bảng : Kiểu Float Double long double Phạm vi biểu diễn Số chữ số Kích thước 3.4E-38 đến 3.4E+38 1.7E-308 đến có nghĩa đến 15 đến 16 byte byte 1.7E+308 3.4E-4932 đến 17 đến 18 10 byte 1.1E4932 Giải thích : Máy tính lưu trữ số kiểu float có giá trị tuyệt đối từ 3.4E-38 đến 3.4E+38 Các số có giá trị tuyệt đối nhỏ hơn3.4E-38 xem Phạm vi biểu diễn số double hiểu theo nghĩa tương tự 1.5 Định nghĩa kiểu TYPEDEF : 1.5.1 Cơng dụng : Từ khố typedef dùng để đặt tên cho kiểu liệu Tên kiểu dùng để khai báo liệu sau Nên chọn tên kiểu ngắn gọn để dễ nhớ Chỉ cần thêm từ khoá typedef vào trước khai báo ta nhận tên kiểu liệu dùng tên để khai báo biến, mảng, cấu trúc, vv 1.5.2 Cách viết : Viết từ khố typedef, sau kiểu liệu ( kiểu ), đến tên kiểu Ví dụ câu lệnh : typedef int nguyen; đặt tên kiểu int nguyen Sau ta dùng kiểu nguyen để khai báo biến, mảng int ví dụ sau ; nguyen x,y,a[10],b[20][30]; Tương tự cho câu lệnh : typedef float mt50[50]; Đặt tên kiểu mảng thực chiều có 50 phần tử tên mt50 typedef int m_20_30[20][30]; Đặt tên kiểu mảng thực hai chiều có 20x30 phần tử tên m_20_30 Sau ta dùng kiểu khai báo : mt50 a,b; m_20_30 x,y; 1.6 Hằng : Hằng đại lượng mà giá trị khơng thay đổi q trình tính tốn 1.6.1 Tên : Nguyên tắc đặt tên ta xem xét mục 1.3 Để đặt tên hằng, ta dùng dòng lệnh sau : #define tên giá trị Ví dụ : #define MAX 1000 Lúc này, tất tên MAX chương trình xuất sau thay 1000 Vì vậy, ta thường gọi MAX tên hằng, biểu diễn số 1000 Một ví dụ khác : #define pi 3.141593 Đặt tên cho float pi có giá trị 3.141593 1.6.2 Các loại : 1.6.2.1 Hằng int : Hằng int số nguyên có giá trị khoảng từ -32768 đến 32767 Ví dụ : #define number1 Định nghiã int number1 có giá trị -50 #define sodem -50 Định nghiã int sodem có giá trị 2732 2732 Chú ý : Cần phân biệt hai 5056 5056.0 : 5056 số nguyên 5056.0 thực 1.6.2.2 Hằng long : Hằng long số nguyên có giá trị khoảng từ -2147483648 đến 2147483647 Hằng long viết theo cách : 1234L 1234l ( thêm L l vào ) Một số ngun vượt ngồi miền xác định int xem long Ví dụ : #define sl Định nghiã long sl có giá trị 8865056L #define sl 8865056 Định nghiã long sl có giá trị 8865056 8865056 1.6.2.3 Hằng int hệ : Hằng int hệ viết theo cách 0c1c2c3 Ở ci số nguyên dương khoảng từ đến Hằng int hệ ln ln nhận giá trị dương Ví dụ : #define h8 0345 Định nghiã int hệ có giá trị 3*8*8+4*8+5=229 1.6.2.4 Hằng int hệ 16 : Trong hệ ta sử dụng 16 ký tự : 0,1 ,9,A,B,C,D,E,F Cách viết a A b B c C d D e E f F Giá trị 10 11 12 13 14 15 Hằng số hệ 16 có dạng 0xc1c2c3 hặc 0Xc1c2c3 Ở ci số hệ 16 Ví dụ : #define h16 0xa5 #define h16 0xA5 #define h16 0Xa5 #define h16 0XA5 Cho ta hắng số h16 hệ 16 có giá trị Giá trị chúng hệ 10 : 10*16+5=165 1.6.2.5 Hằng ký tự : Hằng ký tự ký tự riêng biệt viết hai dấu nháy đơn, ví dụ 'a' Giá trị 'a' mã ASCII chữ a Như giá trị 'a' 97 Hằng ký tự tham gia vào phép toán số nguyên khác Ví dụ : '9'-'0'=57-48=9 Ví dụ : #define kt 'a' Định nghiã ký tự kt có giá trị 97 Hằng ký tự cịn viết theo cách sau : ' \c1c2c3' c1c2c3 số hệ mà giá trị mã ASCII ký tự cần biểu diễn Ví dụ : chữ a có mã hệ 10 97, đổi hệ 0141 Vậy ký tự 'a' viết dạng '\141' Đối với vài ký tự đặc biệt ta cần sử dụng cách viết sau ( thêm dấu \ ) : 10 x : từ đến getmaxx()/2 y : từ -getmaxy()/2 đến Phần tư phải : x dương, y dương x : từ đến getmaxx()/2 y : từ đến getmaxy()/2 Ví dụ : Chương trình vẽ đồ thị hàm sin x hệ trục toạ độ âm dương Hoành độ x lấy giá trị từ -4π đến 4π Trong chương trình có sử dụng hai hàm settextjustify outtextxy ta đề cập phần sau #include "graphics.h" #include "conio.h" #include "math.h" #define TYLEX 20 #define TYLEY 60 main() { int mh=mode=DETECT; int x,y,i; initgraph(mh,mode,""); if (graphresult!=grOK ) exit(1); setviewport(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy(),0); setbkcolor(BLUE); setcolor(YELLOW); line(-getmaxx()/2,0,getmaxx()/2,0); line(0,-getmaxy()/2,0,getmaxy()/2,0); settextjustify(1,1); setcolor(WHITE); 164 outtextxy(0,0,"(0,0)"); for (i=-400;i