Cung cấp cho sinh viên những kiến thức cơ bản của ngôn ngữ lập trình, qua đó người sinh viên có thể hiểu rõ hơn về các ngôn ngữ lập trình cụ thể, sử dụng chúng một cách tốt hơn và trên cơ sở kết hợp với lý thuyết chương trình dịch để tạo ra một ngôn ngữ mới. - Cung cấp các xu hướng lập trình để sinh viên có thể tiếp cận nhanh với chúng và có được sự lựa chọn một ngôn ngữ lập trình phù hợp khi cần giải quyết các đề án tin học trong thực tế....
Quyển sách upload tại: hutonline.net Bách Khoa Online Giao lưu - Học hỏi - Chia sẻ kinh nghiệm hệ sinh viên Bách Khoa hutonline.net Quyển sách upload tại: hutonline.net 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 hoá để đá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ừ đó, đ đợc 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, đ đợc xuất phổ biến rộng ri C ngôn ngữ lập trình vạn Ngoài việc 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đa 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, đ đợc gọi " ngôn ngữ lập trình hệ thống" đợc 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 Nguyn Hu Tun Quyn sỏch ny c upload ti: hutonline.net Chơng khái niệm 1.1 Tập ký tự dùng ngôn ngữ C : Mọi ngôn ngữ lập trình đợc xây dựng từ ký tự Các ký tự đợc nhóm lại theo nhiều cách khác để tạo nên từ Các từ lại đợc 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 đợ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ự, VIETNAM cã ký tù Chó ý : Khi viÕt ch−¬ng trình, ta không đợc sử dụng ký tự khác ký tự Ví dụ nh 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ừ đợc sử dụng để khai báo kiểu liệu, để viết toán tử câu lệnh Bảng dới liệt kê từ khoá cña TURBO C : asm break case cdecl char const continue default double else enum extern far float for goto huge if int interrupt long near pascal register return short signed Quyển sách upload tại: hutonline.net sizeof static struct switch tipedef union unsigned void volatile while ý nghĩa cách sử dụng từ khoá đợc đề cập sau này, ta cần ý : - Không đợc dùng từ khoá để đặt tên cho hằng, biến, mảng, hàm - Từ khoá phải đợc 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 đợc đặ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 đợc trùng với khoá Độ dài cực đại tên theo mặc định 32 đợc đặt lại giá trị từ tới 32 nhờ chức : Option-Compiler-SourceIdentifier length dùng TURBO C Ví dụ : Các tên : a_1 Các tªn sai delta x1 _step GAMA : 3MN Ký tù số m#2 Sử dụng ký tự # f(x) Sư dơng c¸c dÊu ( ) Trïng víi từ khoá te ta Sử dụng dấu trắng Y-3 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 nh biến, biến mảng, hàm, cấu trúc Tuy nhiên điều bắt buộc Quyển sách upload tại: hutonline.net 1.4 KiÓu liệu : Trong C sử dụng các kiểu d÷ 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 đợc ký tự thông qua b¶ng m· ASCII VÝ dơ : Ký tù M· ASCII 048 049 050 A 065 B 066 a 097 b 098 Cã hai kiĨu d÷ liƯu char : kiểu signed char unsigned char Kiểu Phạm vi biĨu diƠn Sè ký tù KÝch th−íc Char ( Signed char ) -128 ®Õn 127 256 byte ®Õn 255 256 byte Unsigned char 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; Nhng 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 : Quyển sách upload tại: hutonline.net 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 dới ( 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ự đợc đ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 nhng không in đợc ( 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ố nguyên không dấu kiểu unsigned Kích cỡ phạm vi biểu diễn chúng đợc bảng dới : Kiểu Phạm vi biểu diƠn KÝch th−íc -32768 ®Õn 32767 byte ®Õn 65535 byte -2147483648 ®Õn 2147483647 byte ®Õn 4294967295 byte int unsigned int long unsigned long Chó ý : KiĨu ký tù cịng cã thĨ xem lµ 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 đợc bảng dới : Kiểu Phạm vi biĨu diƠn Sè ch÷ sè KÝch th−íc cã nghÜa Float 3.4E-38 ®Õn 3.4E+38 ®Õn byte Double 1.7E-308 ®Õn 1.7E+308 15 ®Õn 16 byte long double 3.4E-4932 đến 1.1E4932 17 đến 18 10 byte Giải thích : Máy tính lu trữ đợc 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 đợc xem Phạm vi biểu diễn số double đợc hiểu theo nghĩa tơng tự Quyn sỏch ny c upload ti: hutonline.net 1.5 Định nghĩa kiểu TYPEDEF : 1.5.1 Công dụng : Từ khoá typedef dùng để đặt tên cho kiểu liệu Tên kiểu đợc 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 đợc 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ừ khoá typedef, sau kiểu liệu ( kiểu ), đến tên kiĨu VÝ dơ c©u lƯnh : typedef int nguyen; sÏ đặt tên kiểu int nguyen Sau ta dùng kiểu nguyen để khai báo biến, mảng int nh 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 trình tính toá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 Quyển sách ny c upload ti: hutonline.net Lúc này, tất tên MAX chơng trình xuất sau đợc 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 -50 Định nghià int number1 có giá trị -50 #define sodem 2732 Định nghià int sodem có giá trị 2732 Chú ý : Cần phân biệt hai 5056 5056.0 : 5056 số nguyên 5056.0 lµ h»ng 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 đợc viết theo cách : 1234L 1234l ( thêm L l vào đuôi ) Một số nguyên vợt miền xác định int đợc xem long Ví dụ : #define sl 8865056L Định nghià long sl có giá trị 8865056 #define sl 8865056 Định nghià long sl có giá trị 8865056 1.6.2.3 Hằng int hệ : Hằng int hệ đợc viết theo cách 0c1c2c3 ci số nguyên dơng khoảng từ đến Hằng int hệ luôn nhận giá trị dơng Quyn sỏch ny c upload ti: hutonline.net 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Ư nµy ta sư dơng 16 ký tù : 0,1 ,9,A,B,C,D,E,F C¸ch viÕt Gi¸ trị a A 10 b B 11 c hc C 12 d hc D 13 e hc E 14 f hc F 15 H»ng sè hƯ 16 cã dạng 0xc1c2c3 hặc 0Xc1c2c3 ci mét 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ị nh Giá trị chúng hệ 10 lµ : 10*16+5=165 1.6.2.5 H»ng ký tù : H»ng ký tự ký tự riêng biệt đợc 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 nh 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 Quyn sỏch ny c upload ti: hutonline.net Hằng ký tự đợc viết theo cách sau : ' \c1c2c3' c1c2c3 số hệ mà giá trị m· ASCII cđa ký tù cÇn biĨu diƠn VÝ dơ : chữ a có mà hệ 10 97, đổi hƯ lµ 0141 VËy h»ng ký tù 'a' viết dới 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 \ ) : Cách viết Ký tù '\'' ' '\"' " '\\' \ '\n' \n (chun dßng ) '\0' \0 ( null ) '\t' Tab '\b' Backspace '\r' CR ( đầu dòng ) '\f' LF ( sang trang ) Chú ý : Cần phân biƯt h»ng ký tù '0' vµ '\0' H»ng '0' øng với chữ số có mà ASCII 48, h»ng '\0' øng víi kýtù \0 ( th−êng gäi lµ ký tù null ) cã m· ASCII lµ H»ng ký tự thực số nguyên, dùng số nguyên hệ 10 để biểu diƠn c¸c ký tù, vÝ dơ lƯnh printf("%c%c",65,66) sÏ in AB 1.6.2.5 H»ng x©u ký tù : H»ng x©u ký tự dÃy ký tự đặt hai dÊu nh¸y kÐp VÝ dơ : #define xau1 "Ha noi" #define xau2 "My name is Giang" X©u ký tự đợc lu trữ máy dới dạng bảng có phần tử ký tự riêng biệt Trình biên dịch tự động thêm ký tự null \0 vào cuối xâu ( ký tự \0 đợc xem dấu hiệu kết thúc xâu ký tự ) Chó ý : Quyển sách upload ti: hutonline.net vẽ hình chữ nhật có cạnh song song với cạnh hình Toạ độ đỉnh trái hình chữ nhật (x1,y1) toạ độ đỉnh phải dới hành chữ nhật (x2,y2) ã Hàm : void bar(int x1, int y1, int x2, int y2); vẽ tô màu hình chữ nhật Toạ độ đỉnh trái hình chữ nhật (x1,y1) toạ độ đỉnh phải dới hành chữ nhật (x2,y2) ã Hàm : void bar3d(int x1, int y1, int x2, int y2, int depth, int top); vẽ khối hộp chữ nhật, mặt hình chữ nhật xác định toạ độ (x1,y1), (x2,y2) Hình chữ nhật đợc tô màu thông qua hàm setfillstyle Tham số depth xác định số điểm ảnh bề sâu khối chiỊu Tham sè top cã thĨ nhËn c¸c gi¸ trị hay khối chiều tơng ứng có nắp không top=1 top=0 Ví dụ : Chơng trình dới tạo nên hình chữ nhật, khối hình chữ nhật hình hộp có n¾p : #include "graphics.h" main() { int mh=mode=0; initgraph(&mh,&mode,""); if (graphresult != grOk) exit(1); setbkcolor(GREEN); setcolor(RED); setfillstyle(CLOSE_DOT_FILL,YELLOW); 128 Quyển sách upload tại: hutonline.net rectangle(5,5,300,160); bar(3,175,300,340); bar3d(320,100,500,340,100,1); closegraph(); } 10.2.6 Cưa sỉ (Viewport) : • ThiÕt lËp viewport : Viewport vùng chữ nhật hình đồ hoạ Để thiết lập viewport ta dùng hàm : void setviewport(int x1, int y1, int x2, int y2, int clip); (x1,y1) toạ độ góc bên trái, (x2,y2) toạ độ góc dới bên phải Bốn giá trị phải thoả mÃn : x1 ≤ x2 ≤ y1 ≤ y2 Tham sè clip nhận hai giá trị : clip=1 không cho phép vẽ viewport clip=0 cho phÐp vÏ ngoµi viewport VÝ dơ : setviewport(100,50,200,150,1); LËp nên vùng viewport hình chữ nhật có toạ độ góc trái cao (100,50) toạ độ góc phải thấp (200,150) (là toạ độ trớc đặt viewport) Chó ý : Sau lËp viewport, ta cã hƯ toạ độ mà góc bên trái có toạ độ (0,0) ã Nhận diện viewport hành : §Ĩ nhËn viewport hiƯn thêi ta dïng hµm : void getviewsetting(struct viewporttype *vp); kiểu viewporttype đà đợc định nghÜa nh− sau : struct viewporttype { int left,top,right,bottom; 129 Quyển sách upload tại: hutonline.net int clip; }; • Xãa viewport : Sư dơng hµm : void clearviewport(void); ã Xoá hình, đa chạy tạo độ (0,0) hình : Sử dụng hàm : void cleardevice(void); ã Toạ độ âm dơng : Nhờ sử dụng viewport viết chơng trình đồ hoạ theo toạ độ âm dơng Muốn ta thiết lập viewport cho clip để vẽ giới hạn viewport Sau đoạn chơng trình thực công việc : int xc,yc; xc=getmaxx()/2; yc=getmaxy()/2; setviewport(xc,yc,getmaxx(),getmaxy(),0); Nh thế, hình đợc chia làm bốn phần với toạ độ âm dơng nh sau : Phần t trái : x âm, y âm x : tõ -getmaxx()/2 ®Õn y : tõ -getmaxy()/2 ®Õn Phần t trái dới : x âm, y dơng x : tõ -getmaxx()/2 ®Õn y : tõ đến getmaxy()/2 Phần t phải : x dơng, y ©m x : tõ ®Õn getmaxx()/2 y : tõ -getmaxy()/2 đến Phần t phải dới : x dơng, y dơng x : từ đến getmaxx()/2 y : tõ ®Õn getmaxy()/2 VÝ dơ : 130 Quyển sách ny c upload ti: hutonline.net 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 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); outtextxy(0,0,"(0,0)"); for (i=-400;i