Bài giảng Kỹ Thuật lập trình - Chương 3, Phần 1: Các kỹ thuật xây dựng chương trình phần mềm - Vũ Thị Hương Giang

Các hàm vào ra khác • cin.geto - Nhập 1 ký tự từ luồng (kế cã ký tự cách) và trà về ký tự đó • cin.get(c) - Nhập 1 ký tự từ luồng và lưu trữ nó vào c • cin.get(array,size) - Nhận 3 tham số: mãng ký tự, kích thước tõi đa và ký tự phân tách giữa các ký tự (mặc định là '\n'). - Khi ký tự phản tách được đưa vào, nó vẫn tôn tại trong luồng vào - Ký tự null được chèn vào cuôi mãng Các hàm vào ra khác • cin.getline(array,size) - Giõng cin.get(buffer,size) nhưng loại bó ký tự phân tách khỏi luồng và không lưu trữ nó trong mãng - Ký tự null được chèn vào cuối mảng • cout.put(char) - Đưa ra 1 ký tự luông: cout.put('A'); - Có thê’ được gọi với một biếu thửc có giá trị ASCII • cout.put(65); - Đưa ra A

docx106 trang | Chia sẻ: hachi492 | Ngày: 07/01/2022 | Lượt xem: 276 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Kỹ Thuật lập trình - Chương 3, Phần 1: Các kỹ thuật xây dựng chương trình phần mềm - Vũ Thị Hương Giang, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
• với mỗi bài toán, làm thế nào để: Thiẽt kẽ giãi thuật nhằm giải quyẽt bài toán đó Cái đặt giải thuật bằng một chương trình máy tinh Làm cho chương trình chạy đúng trước khi tăng tính hiệu quả của chương trình Tăng tính hiệu quả của chương trình, đồng thời thể hiện tốt phong cách lập trình của cá nhân CHƯƠNG III. CÁC KỸ THUẬT XÂY pựNG CHƯƠNG TRÍNH phần MÊM Mở đãu Làm việc với biên Viẽt mã chương trình hiệu quà Thiẽt kẽ chương trình Xây dựng hàm/thú tuc MỞ ĐẦU Chương.111- Các kỹ thuật xây dưng chuvngjrinn phân mẽm I. Mớ dâu Một sổ khái niệm thường gặp Source code (mâ nguồn): Compile / build (dịch): Executable program (chương trình thực thi): Language (ngôn ngữ): Library (thư viện): C: Từ khóa 1 chiwnflJiL Các kỹthuật xây dưng chương trình phãn mẽm 1. Mở đâu Luông điều khiến (6) : ’ yp(5): Từ khỏa nên tránh (1) : Kiếu cơ bán (5) : Kiếu dựng sẵn (7): Cỗutrúc(3): Liệt kê và đo kích thước (2): Từ khóa cho khai báo biẽn (3): C: Hello World ^include Lệnh tiên xứ lý .Chú thích Lệnh từ thư viện Chương trinh kết thúc thánh công /* Mỵ first c program which prints Hello World */ , main(): "start here” int main (int argc, char *argv[]) printf ("Hello World!\n"); return 0; Định nghĩa các đoạn mã lệnh Chương111- Các kỹ thuật xây dưng chứơơgtrìnn phân mẽm 1 Mơ đâu Chú ý khi đọc và viết mã nguồn • Một sô' phần trong mã nguồn không ành hưởng đến nỗi dung câu lệnh nhưng ãnh hưởng đến phong cách lập trình • Các phần khác thường ảnh hưởng đển nội dung câu lệnh và phong cách lập trinh C: dịch từ mã nguồn sang mã máy • Một Sổ compilers cỏ vai trò rất lớn trong việc tối ưu chương trình Chúng phân tích sâu mã nguôn và làm mọi điêu "machinely" có thế nhằm xác đinh nguồn gõc gây kém hiệu quá trong mã nguôn (dư thừa tinh toán, dư thừa dữ liệu) Ví dụ GNU g++ compiler trên Linux/Cygwin cho chương trình viết bằng c • g++ -05 —o myprog myprog.c CÓ thể cải thiên hiệu năng tử 10% đến 300% Chương111- Các kỹ thuật xây dưng chuvngjrinn phân mẽm 1 Mơ đâu Viết mã nguồn hiệu quả • LTV vẫn có thể thực hiện những cải tiến mà trình dịch không thế • LTV phải loại bò tất cả những chồ bất hợp lý trong mã nguồn LTV phái làm cho chương trình hiệu quà nhất có thê’ LTV có thê’ phải xem lại mã nguồn khi thấy chương trình chạy chậm Vậy cần tập trung vào đâu đế cái tiến nhánh nhầt, tốt nhất ? Phong cách lập trình tốt • Al “doc" mỗ nợuòn đo LTV viét ? typedef struct{double x,y,B}vecrvec ư,black,aaib«(.02,.02,.02):struct sphere{ vec ccn, color .'double rad. kd, ks , kt,kl,ir}*5. •best, sph [ ]s{ 0 . . 6. / .5,1. ,1. .1. , .9, .05,.2,.85,0.,1.7,-1 8.,-.5,1.,.5r.2,1.,.7,.3.0.,.05.1 2.1.,8..-.5. 1,8,.8, 3,,7,0.,0 ,1.2,3 -6.,15.,1.. .8.1 7..0.,0.,0.,.6 1.5,-3 ,-3.,12. ,.8,1., 5..0..0 -,0.,.5,1.5.)yx:double u,b,tain,sqrt() .tan ( > ;double vdo t(A.B)vec A ,B:(return A.x*B.x*A.y*B.y*A. z‘B.X' fvoc vcomb (a,A,B) double avec A, B,- (B. x*=a* A. X.‘B y*»a*A, y. B, s*«a*A. X : return B.lvec vunlt(A)vec A, {return vconb (1./sqrt ( vdot(A,A)),A.black) .)struct sphere*intersect(P,D)vec P,D . <best«o .-tain-1 e30 , s« sph*5ỉwhile(5--sph)b=vdot(D,ư^vcomb<“1., p.5-cen)),u=bỀb-vdot(U, U)♦s-rad,s - rad,u=u0?sqrt (u) : le31, u=b-ule-7*>b-u:b*u, tmin=u=le-7S4uOttintersect(P.Ơ)==1)color=vcomb(e ,1- color, color) ; u«"8-color .color . x*»u. X .color . y*MJ.y,- color . s*»u. s;e«l-eta* eta* (1- d*d) rreturn vcomb(s-kt.eO?trace(level,p,vcomb(eta,D,vcoeb(eta*d-sqrt (e),N,black))):black,vcomb(s-ks,trace(level,P,vcomb(2*d,N.D)),vconb(s-kd, color,vcomb(s-kl,u,black))));)main()(print?("*d %d\n",32,32);while(yx<32*32) u.x«yx%32-32/2,8.1-32/2-yx*♦/32,0.yw32/2/tan(25/114.5915590261),u-vcomb<255., trace(3.black,vunit(U)),black).printf("%.Of %.0f %-Of\n“,U) r) Phong cách lập trình tốt Phong cách lâp trình (program style): cách trình bày một chương trình Vi sao program style lại quan trọng? Lỗi thưởng xảy ra do sự nhâm lẫn cùa LTV Biên này được đũng làm gi? Hàm này được gọl như thê nào? Mã nguôn hiệu quá (good code) Dễ đọc DỄ hiểu (dễ kiếm tra) Dễ sứa (dê bão tri, cáp nhặt, tránh lôi) Làm thè não đế mã nguôn trớ nên dễ đọc, dễ hiếu, dễ sửa ? Phong cách lập trình tốt • Đế mảy tinh lãm tổt các công việc nặng nhọc cùa nó, hãy Viẽt CT rõ ý, với cẩu trúc rô ràng Vĩẽt lại mã nguồn thay vi cõ gắng chú giáĩ hay châp vã các đoan mã khó hiếu Tránh dùng goto • Đế lập trinh viên giảm bớt công việc không đáng cỏ, hãy Vĩẽt chương trinh VỚI khuôn dạng rõ ràng Chọn tên phù hợp, gợi nhớ, không nhập nhâng Cung cãp đây đú tài liệu liên quan đến các cãu trúc dữ liệu sử dụng trong chương trình Viẽt chú thích rõ ràng, cỏ ý nghia, sứ dụng các thành ngừ phô biến Dùng các thú tục đệ quy cho những câu trúc dữ liệu đệ quy ( list, cây phả hệ...) CÁC KỸ THUẬT LÀM VIỆC VỚI BIÊN ’ Khai báo biến Đặt tên biẽn Sử dụng các kiêu dữ liệu hợp lý cho biên Khởi tạo biên Sử dụng biên trung gian Sử dụng biến tró Biến (variable) Nôi dung Đ|a chi • Lưu trữ dữ liệu cùa chương trình trong bộ nhớ máy tinh (bộ nhớ chính) 157 Thực chãt là mốt vùng nhớ đươc đặt a _ tên Khi khai báo, biên sẽ được cãp phát một vùng nhớ xác định phụ thuộc váo kiếu dừ liệu của biên Cáp phát bộ nhớ tình Vi du: lot a - 2006; //2 byte ► D6 158 07 159 160 Bộ nhở chinh : nội dung thay đói. địa chi cỗ đinh • 2 thuộc tính: Giá trị cúa biến: Giá trị cúa nội dung vùng nhớ vi dụ: 2006 hay 07D6ls Địa chỉ cúa biên: Địa chi ô nhớ đâu tiên được cãp phát Ví dụ: 158 hay 9En, ' ' int myFirstNumber, mySecondNumber; Khai báo biến Phân loại: Biến toàn thể: cỏ thế được truy nhập trong phạm vi chương trinh chính Biến cục bộ: chi truy nhập được trong phạm vl 1 chương trình con Khai báo biến ở đầu chương trình Tên biên Kỉếu dữ liệu mả biến đại diện 2. Đặt tên Tên: Chương111- các kỹ thuật xây dưng chương tnnh phãn mém Mớ đâu các kỹ thuật lám việc vài biên 1. Khai báo Dùng bảng chữ của mỗi ngôn ngữ lập trinh đế đặt tên Tên bât đâu bâng chữ cái, tiếp theo là chữ cái, chữ sổ, hoặc ký tự khác (_, $, tùy theo ngôn ngữ lâp trình) Tên biên: Phàĩ ngân gọn vá có tính chãt gđi nhớ hay miêu tá Bât đãu bằng chữ In thưởng Nên lá đanh tử hoăc cụm danh từ, nẽu là cụm danh tử thl có thé viẽt hoa chữ cái đãu của các danh từ tlẽp theo int «yFirstNumt>€r, mySeconđNuPber; - Chi đặt tên biên bằng 1 chữ cái cho các biẽn trung gian hoặc biến đêm Int 1x0; (I, J, k, .... n) char c; (c, d, e) Đặt tên biến trong c • Đặt đúng tên cho biến là điều quan trọng • Nên có chú thích biến đỏ dùng làm gì trong trường hợp tên không mang tính chất gỢi nhớ int a, b, c; double d; /* The nay hoi kho hieu*/ ỉnt start_time; int no_students; double course_mark; /* The nay de hieu hon */ Đặt tên biến trong c • Dùng chữ hoa, chữ thường nhất quán - ví dụ: CAPACITY buf (hằng sổ) (bỉẽn cục bộ) • Dùng phong cách nhất quán khi ghép từ - ví dụ: frontsize, frontsize, front_size 3. Sử dụng các kiểu dữ liệu hợp lý • Hãy chọn các kiểu dữ liệu sao cho chương trình trở nên đơn giàn float: dùng cho Các phép tính toán cân kết quá là sô thực 3.0 / 2.0 « 1.5 Khi chấp nhận được sai sõ nhỏ 0.9999999 trớ thành l.e double: Khi cân kết quá tính toán chính xác hon nữa Khi tôc đó tinh toán là tlẽu chí quan trong int: Đánh chi số Mã hóa các trang thái v.v Tôc độ tinh toán phụ thuộc vào phân cứng máy tinh -ỳ chưa chắc dùng kiểu int là nhanh nhãt ví dụ #include #include KILOMETRES_PER_MILE = 1.609; YARDS_PER_MILE = 1760.0; int main(void) { miles, yards; kilometres; miles = 26; yards = 385; kilometres = (miles + yards / YARDS_PER_MILE) * KILOMETERS_PER_MILE; printf(" miles and yards ", miles, yards); printf("equals kilometres.\n", kilometres); return EXIT_SUCCESS; } —_ ChươngHl- Cấc ký thuật xày dưn?, . chuwg trinh phăn mẽm Mớ đâu Các kỹ thuật làm việc với btẻn Khai báo Đặt tên Sứ dụng cạc kiêu dữ liệu hợp lý Khai báo hạn chế các giá trị cùng kiểu • Hãy chọn các kiêu dữ liệu sao cho chương trinh trớ nèn đơn gián — unsigned : — signed : long : short : - const : short int small_no; unsigned char uchar; long double precise_number; short float not_so_preclse; const short float pi = 3.14; const long double e = 2.718281828; Ep kiêu 1 Chương nr Các kỹ thuật xây dưng chương trình phán mẽm Mở dâu Các kỹ thuật lâm việc với biên Khai báo Đật tên Sừ dụng cầc kĩẻu dữ liệu hợp lý int total_candy ■ 9, number_of_people ■ 4; double candy_per_person; candy_per_person = total_candy / number_of_people; • Tùy thuộc vào chương trình dịch, đôi khi chúng ta có thế dùng lẫn kiểu 3.0 / 2 = ? candy_per_person ■ ? Chương trinh có thể chạy, có thế báo lỗi Ép kiểu int total_candy = 9, number_of_people = 4; double candy_per_person; candy_per_person = total_candy / number_of_people; • Ép kiểu là việc chuyển từ 1 giá trị kiểu này sang 1 giá trị kiếu khác tương đương • Ép kiếu là cách an toàn nhất đế đàm bào chương trình chạy đúng - c style: 3.0 / (float) 2 ■ 1.5 - C++ style: candy_per_person • static_castcdouble>(total_candy) / number_of_people; candy_per_person « total_candy / static_cast(number_of_people); • Phải tôn trọng nguyên tăb Itô' tllừạ-túií'ép kiểu ví dụ về ép kiểu sinclude ^include const float KILOMETRES_PER_MILE = 1.609; const float YARDS_PER_MILE = 1760.0; int main(void) { int miles, yards; float kilometres; miles ■ 26; yards ■ 385; kilometres = printf("%d miles and %d yards ", miles, yards); printf("equals %f kilometres.\n”, kilometres); return EXITSUCCESS; } c vs. Java Java: giáng cap (demotion) không tự động C: giáng cap tự gỏng int i; char c; /♦ Implicit promotion •/ /» OK in Java and c ♦/ /• Implicit demotion /• Java: Compiletine /• C: OK; truncation error •/ c = (char)i; /• Explicit demotion /* Java: OK; truncation •/ /• C: OK; truncation •/ 1 1 "ránh các biếu thức mà các toán hạng có kiêu lẩn lộn ChươngIII. các kỹ thuặt xây dưng chương trình phân mém Mớ đầu Các kỹ thuật làm việc vài biên Khai báo Đặt tên 3 - Sứ dụng các klếu dữ liệu hợp íỹ 4. Khởi tao biên Khởi tạo 1 rân, dùng nhiều lần double value = sin(0.25); • Trước float f() { return 0; Sau double defaultvalue = sin(0.25); float f() { double value » defaultvalue; // return 0; } Khởi tạo 1 lần, dùng nhiều rân Lưu ý: việc khai báo và khởi tạo biên global cho phép nhiều CTC trong chương trinh truy nhập và thay đối giá trị biên. Với các chương trình được thiết kể theo modul, việc này có thê làm cho cẵu trúc chương trình b| phá vữ khô gỡ rõi chương trinh double defaultvalue ■ $ln(ô.2S); float f() { double value « defaultvalue; // return 8; float fl(> { defaultvalue return 0; float f2() { defaultvalue H return 0; sum); Giá trị khởi tạo (initialized value) int main() { ỉnt sum; printf("The current value of variable sum = %d", return 0; } int main() { int sum; sum = 0; printf(”The current value of variable sum = %d“, sum); return 0; } Giá trị khởi tạo (initialized Chương ill- các kỹ thuật xây dưng chương trình phân mẽm Mớ dău Các kỹ thuật lầm việc vài btẽn Khai báo Đặt tên Sừ dụng các kiễu dữ liệu hợp lý Khởi tao biên value) 1 Khởi tạo biên: lăn đâu tiên gán giá trị cho một biên. Giá trị của một biẽn chưa khởi tạo lã không biẽt trước, có thê là giá trị còn lưu lạl từ lần chạy chương trinh trước đó trong các ỏ nhớ tương img hoặc giá trị rỗng. Nên gán giá tri khới tạo cho biẽn ngay khi khai báo biến int main() { int sum = 0; int num; printf("Enter a number: \n"); scanf('%d", &num); sum += num; printf(”The current total is %d\n", sum); return 0; } Khai báo biến tĩnh (Static Variables) Các biẽn khai báo trong chương trình con (CTC) được cấp phát bộ nhở khi CTC được gọi và sẽ bị loai bỏ khi kết thúc CTC. Khi gọi lại CTC, các biẽn cục bộ lai được cãp phát và khởi tạo ỉậi. Nẽu muốn 1 giá trị vẫn được lưu lạl cho đẽn khi kẽt thúc toán chương trình, cần khai bảo biền cục bộ cúa CTC đó là static vã khởi tạo cho nỏ 1 giá trị. Việc khởi tạo sẽ chi thực hiện lân đâu tiên chương trình được gọi và giá trị sáu khi biên đối sề được lưu cho các lân gọi sau. Bâng cách này 1 CTC có thế "nhớ" một vài thông tin sau mỗi lân được gọi. Dùng biên static thay vì global : Khí khai báo 1 biến cục bộ cùa CTC là biẽn static, ta tránh được việc bị các phân khảc cúa CT chính làm thay đối trạng thái CTC void sumito { static int sum » 0; int num; printf("Enter a number: ”); scanf("Xd", &num); sum num; printf(" The current total is %d\n", sum); } int main() { int count; printf(“Please enter 5 numbers to be summed\n"); for (count - 0; count < MAX; count++) sumit(); return 0; } stack, heap • Khi thực hiện, vùng dữ liệu (data segment) cùa 1 chương trinh được chĩa làm 3 phân : Static data: các biển toàn thế hay biến tĩnh, vi dụ array, float_array Stack data: các biẽn cục bộ cùa CTC, vi dụ double_array Heap data: Dữ liệu được câp phát đóng {ví dụ pchar) Dữ liệu nãy sẽ còn cho đẽn khi ta giái phóng hoặc khi kẽt thúc CT, int int_array[100]; int main() { static float float_array[100]; double double_array[100]; char *pchar; pchar = (char*) malloc(100); /* .... •/ return (0); } Bài tập /* File: xyz.c */ static int count; static char name[8]; int main() { • • • /* program body */ return 0; } Phân mã nguồn nào cúa chương trinh được truy nhập và thay đổi giá trị của các biến count, name ? Giá trị khởi tạo ngầm định cùa 2 biến này là gi ? ChươngHL các kỹ thuật xây dưng chương trinh phân rnẽm I. Mớ dău II. cảc kỹ thuật làm việc vái biên Khai báo Đặt tên - Sứ dụng các kiếu dữ liệu hợp (ý Khới tao biên • ƯU điểm: Thêm biến trung gian • Sử dụng biến trung gian đê’ phân biệt các bước tính toán diễn đạt rõ ràng logic nghiệp vụ của chương trình Làm rõ cấu trúc chương trình Rất hiệu quả khi xem lại mã nguồn • Không nên lạm dụng việc dùng mã trung gian, điều này làm chương trình trở nên khó hiểu và kém hiệu quả Ví dụ: Thêm biến trung gian const float YARDS_PER_MILE - 1760.0; int main(void) { int miles, yards; float kilometres, yardsInMiles; miles • 26; yards ■ 38S; yardsInMiles = (float)yards / YARDS_PER_MILE; printf("%d yards = %f miles\n“, yards, yardsInMiles); kilometres = ((float)miles + yardsInMiles) * KILOMETRES_PER_MILE; printf("%d miles and %d yards ", miles, yards); printf("equals %f kilometres An", kilometres); return EXIT_SUCCESS; } 5. Thêm biến trung gian • Chú ý sử dụng đúng tính chất của biến đã khai báo - const : không được thay đổi giá trị cúa biên sau khi khởi tạo const int FIVE = 5; const double PI = 3.141593; FIVE = FIVE‘5; PI +» PI; const int FIVE = 5; const double PI = 3.141593; 5. Thêm biến trung gian • Chú ý sử dụng đúng tinh chất của biến đã khai báo - volatile : giã trị cúa biẽn cỏ thế được 1 tiễn trinh bên ngoài chương trình thay đổi, thướng sử dụng đê’ trao đối dữ liệu với thiết bị ngoại vi. int check_iobirf(void) { inrt iobuf; int val; while (iobuf ■■ 0) ( val = iobuf; iobuf ■ 0; return(val); } int check_iobuf(void) { volatile int iobut; int val; while (iobuí == 0) { } val = iobuí; iobuí - 0; return(val); } Nêu không khai báo iobuf là volatile, trinh dịch bó qua không thực hiện vòng lặp vi không có lênh bèn trong . ' Con trỏ (pointer) • Con trỏ là một biến mà giá trị của nó là địa chi của một vùng nhớ - Chứa đia chi của một đõi tượng khác: biên, hám Sử dụng con trỏ cho phép ta truy nhập tới 1 đối tượng gián tiếp qua địa chì của nó. Trong C/C++, con trỏ là một công cụ rất mạnh, linh hoạt Biên Địa chi Giá trị a FFEC 3 p FFEE FFEC Khai báo con trỏ: kieuDL *; Ví dụ: int a = 3; int *p; p = &a; CÓ nhiều kiểu biến với các kích thước khác nhau, nên có nhiều kiểu con trỏ. Con trỏ int đế trỏ tới biến hay hàm kiểu int Chỉ có thể trỏ tới một đối tượng cùng kiểu Sau khi khai báo, ta được con trỏ NULL, vì nó chưa trỏ tới 1 đối tượng nào. • Toán tử & và * Toán tử í: Trá vẽ địa chì cùa biên. Toán tứ *: Trá vẽ giá trị chửa trong vùng nhở được tró bởi biên con tró. * và & có độ ưu tiên cao hơn tất cả các toán tử số học ngoại trừ toán tử - (dào dấu) và tăng giám 1 đơn v| (++, —). Vi dụ: void main() { int i = 3; int *p; p = printf("*p = %d \n”,*p); getch(); ơiưonạiH; Các kỹ tbuặt xây dưng chương trình phản mẽm Mở đâu Các kỹ thuật làm việc vài biên Khai báo Đặt tên 3- Sừ dụng các kiếu dữ liệu hợp lý 4. Khới tao biên - Giá trị NULL (sõ 0): • tenBienConTro = 0; 5. Con trô a. Khai báo và sử dụng con trỏ • Một biến con trỏ cỏ thể được gán bởi: - Địa chi của một biến khác: • tenBienConTro = &tenBien; - Giá trị của một con trỏ khác (cùng kiểu); • tenBienConTro2 = tenBienConTrol; -> 2 con tró cùng tró tới một biẽn/vũng nhớ • Gán giá trị cho biến con trỏ: - *tenBienConTro = 10; • Có thể viết *p cho mọi nơi có đối tượng mà nó trỏ tới xuat hiện — int X = 5, *p = &x; X = X + 10; // giồng như *p = *p + 10; • Ví dụ 1: FFEE FFDA FFDC FFEE 1 biên địa chi ruiai 1 FFEC 3 j FFEE 6 pl FFDA FFEC FFDC FFEE biến địa chi ỉ FFEC 3 j FFEE 6 pl FFDA < p2 ãJ FFDC FFEE biên địa chi rmũi 1 FFEC j FFEE / 7 fl pl FFDA V FFEE J FFDC biến địa chi msi FFEC _2 __1 FFEE pl p2 Ví dụ 2 main() { int i = ■ int *pl, pl = &ỉ; p2 = &j; pl = p2; i—; j++; *pl += 8; int ij j, *p; i= 5; p= & i; j= *p; *p= j+2; Địa chi Giá trị Biến 100 i 102 j 104 p b. Các phép toán trên con trỏ 1 Chương HI. Gác kỹ thuật xây dưng chương trinh phãn mẽm Mở dâu II. Các kỹ thuật lầm việc vài biên 1 Khai báo Đặt tên Sứ dụng các kiẽu dữ liệu hợp lý 4- Khdi tao biên 5. Con trò Có thế cộng hoặc trừ biẽn con tró với 1 sổ nguyên n Kẽt quà là 1 con tró cúng kiêu Là đ|a chi mới trò tới 1 đối tượng khác nâm cách đối tượng đang bị tró n phân tử Phép trừ giữa 2 con trộ cho ta khoảng cách (sổ phần tử) giữa 2 con trỏ Không cỏ phép cộng, nhân, chia, lãy sõ dư 2 con trỏ Ví dụ: char c, "pchar = &c; short s, *pshort = &s; long 1, *plong = &l; pchar ++; pshort ++; plong —; b. Các phép toán trên con trỏ // pchar = 101; pshort = 103; plong = 99 plong += 5; // plong = ? pchar -=10; // pchar = ? pshort +=5; // pshort = ? • Chú ý : ++ và " có độ ưu tiên cao hơn * *p++ ~ * (p++) tức là tăng địa chì mà nó trỏ tới chứ không phài tăng giá trị mà nỏ chứa. *p++ = *q++ sẽ tương đương: *p - *q; p = p+1; q = q+1; -> Cần dùng dấu 0 đế tránh nhầm lẫn (*p)++; b. Các phép toán trên con trỏ Có thể dùng các phép gán, so sánh các con trỏ, nhưng cần chú ý đến sự tương thích về kiểu. Cần ép kiểu nếu gán không đúng kiểu double X = 1.5; char *cPtr = &x; //Error: type mismatch char *cPtr = (char *)&x; // OK: cPtr points to the first byte of X ơiưonạiH; Các kỹ tbuặt xây dưng chương trình phản mẽm Mở đâu Các kỹ thuật làm việc vài biên Khai báo Đặt tên 3- Sừ dụng các kiếu dữ liệu hợp lý Khới tao biên Con trô • Cú pháp: - void ♦tenBienConTro; c. Con trỏ void • Con trỏ đặc biệt, không định kiểu • Có thế nhận giá trị là địa chí của một biến thuộc bất kỳ kiểu dữ liệu nào. • Ví dụ: void *p, *q; int X = 21; float y = 34.34; p = &x; q = &y; c. Con trỏ void • Thực chãt con trỏ void chi chứa một địa chi bộ nhó mà không biết tại địa chỉ đó có đổi tượng kiểu dữ liệu gì • Không thế truy cập nội dung của một đối tượng thông qua con tró void. • Phài ép kiếu về con trỏ có định kiếu cúa kiếu đối tượng float x; int y; void *p; p = &x; ♦p = 2.5; // báo lỗi vĩ p là con trỏ void /* càn phái ép kiếu con trỏ void trước khi truy cập đối tượng qua con trỏ •/ *((float*)p) = 2.5; // X M 2.5 p ■ &y; // p chứa dịa chi số nguyên y *((int*)p) = 2; // y = 2 d. Con trỏ và mảng 1 chiều 1 Chương nt Gác kỹ thuật xây dưng chương trinh phăn mẽm Mớ dâu II. Các kỹ thuật làm việc vài biên 1 Khai báo Đặt tên 3- Sừ dụng các kiẽu dữ liệu hợp (ỹ Khdl tao biên Con trò Mảng a a là một địa chi a có giá trị bằng &a[0], a+i ■ &a[i] Tuy nhiên, a là 1 hăng -> Không thế dùng trong câu lệnh gán hay toán tứ tăng, giám như a++; -> Có thế gán con tró p bằng địa chi cùa máng -> Có thế dùng con trỏ này đế duyệt các phân tứ trong máng. Ví dụ: int a[!0]> *p; p = a; p+1 sẽ trỏ tới a[l], nghĩa là *(p+l) chinh là a[l]. p+2 sẽ tró tớl a[2], *(p+2) là a[2] p+i sè trỏ tới a[i], *(p+i) là a[i] #define N 5 int tab[5] = {1, 2, 6, 0, 7}; void main() { ỉnt i; int *p; p = tab; for (i = 0; i < N; i++) { printf(" %d \n",*p); P++; getchO; ví dụ • Viết chương trình thực hiện các công việc sau, mỗi công việc viết thành một hàm. Cuối cùng, viết hànĩ main để gọi các hàm đã viết. Yêu câu người dùng nhập vào n là số phân tử cúa màng nguyên (n< = 1000) Nhập n phần tứ cho màng nguyên đó săp xếp mảng nguyên theo thử tự giảm dân void nhap_mang(int *a, int n) { void hien_thi_mang(int *a, int n) { void main() { int a[KT]; int n; n = nhap_so_pt(); nhap_mang(a, n); printf("Mang theo thu tu ban dau \n"); hien_thi_mang(a, n); sap_xep_mang(a, n); printf(”\n Mang theo thu tu giam dan \n"); hien_thi_mang(a, n); getch(); ơiưonạiH; Các kỹ thuật xây đưng chương trinh phãn mẽm Mở đâu Các kỹ thuật làm việc vài biên Khai báo Đặt tên 3- Sừ dụng các kiếu dữ liệu hợp lý 4 Khới tao biên e. Con trò xâu char tinhthanh[30] = "Da lat”; char *tinhthanh; tinhthanh=“Da lat"; char *tinhthanh ="Da lat”; • Ngoài ra các thao tác trên xâu cũng tương tự như trên mảng *(tinhthanh+4) = "a"; Với xâu thường thì không thế gán trực tiẽp 5. Con trô Vai tro cua malloc Chương IO- Các kỹ tbuặt xây dưng chương trình phản mẽm Mở đâu Các kỹ thuật làm việc vài biên Khai báo Đặt tên 3- Sừ dụng các kiếu dữ liệu hợp lý Khới tao biên Con trô f. Mảng các con trò Con trỏ cũng là một loại dữ liệu nên có thể tạo một màng các phần tử là con trỏ kỉeuDuLỉeu *tenMangConĩro[kichThuoc]; Ví dụ: char *ds[10]; • ds lả 1 mảng gồm 10 phân tứ, mỗi phân tử lã 1 con tró kiếu char, được dùng đế lưu trữ 10 xâu kỷ tự nào đó Cũng có thể khởi tạo trực tiếp các giá trị khi khai báo char ♦ma[10] = {"mot","hai","ba”.. Lưu ý • Cần phân biệt mảng con trỏ và màng nhiều chiều. Mảng nhiều chiều lậ màng thực sự. đựợc khai báo và phái cấp phát đủ vùng nhớ dành sẵh cho các phan tử. Mậng cọn trỏ chi dành không gian nhớ cho các biến trỏ (chứa địạ chi). Khi khởi tạo hay gán giá tri, cân thêm bộ nhớ cho các ptử sử dụng -> Tốn nhiều hơn • ưu điểm cúa mảng trỏ cỏ thể hoán chuyện các đối tượng (màng con, cấu trúc..J đươc trỏ bởi con trỏ này bang cácn hoán chuyến các con trỏ Truyên tham số trong hàm ^include ^include #define MAXHS 50 ffdefine MAXLEN 30 void main 0 { int i, j, count = 0; char ds[MAXHS][MAXLEN]; char *ptr[MAXHS], *tmp; while (count < MAXHS) { printf(" Vao hoc sinh thu: %d ",count+l); gets(ds[count]); if (strlen(ds[count] == 0) break; ptr[count] = ds + count; ++count; } - for ( i=0;i<count-l;i++) for ( j =i+l;j < count; j++) if (strcmp(ptr[i],ptr[j])>0) tmp=ptr[i]; ptr[i] = ptr[j]; ptr[j] = tmp; } for (i=0;i<count; i++) printf(‘‘\n %d : %s", i+l,ptr[i]); } } g. Con trỏ trỏ tới con trỏ 1 Chương HI. Gác kỹ thuật xây dưng chương trinh phăn mẽm Mớ dâu II. Các kỹ thuật làm việc vài biên 1 Khai báo Đặt tên 3- Sừ dụng các kiẽu dữ liệu hợp (ỹ Khdl tao biên Con trò Bản thân con trỏ cũng là 1 biẽn, vi vậy nó cũng có địa chi và có thê dùng 1 con trỏ khác đế trỏ tỏi địa chi đó. kieuOL ••tenBienConTro; Ví dụ : int X « 12; int *ptr = ix; int •*ptr_to_ptr ■ &ptr; CÓ thê mô tà 1 mảng 2 chiều qua con trỏ cúa con trò theo công thức : arrName[i][k] = •(*(arrNan»e+i)+k) arrName+i là địa chi cùa phẳn tứ thứ i cùa máng *(arrName+i) cho nội dung phân tử trên ♦ (arrName+i )+k là đia chi phân tử [ i] [k] ví dụ: In và cộng ma trận với 10 Vỉnclude ttdeíine hang 3 ndefine cot 3 void maln() ( int mt[hang][cot] = {{7>8,9},{10,13)15},{2,7,8}}; int i, j; for (i=0; ixhang; !++){ for (j=0;i<cot;j++) printf(" %d ", mt[i][jl); printf("\n"); } for (i=a; i<hangj i++){ for (j=e; j<cot; j+*){ ♦ 10; printf(" %d ", > print f("\n*’); > • với mỗi bài toán, làm thế nào để: Thiẽt kẽ giãi thuật nhằm giải quyẽt bài toán đó Cái đặt giải thuật bằng một chương trình máy tinh Làm cho chương trình chạy đúng trước khi tăng tính hiệu quả của chương trình Tăng tính hiệu quả của chương trình, đồng thời thể hiện tốt phong cách lập trình của cá nhân CHƯƠNG III. CÁC KỸ THUẬT XÂY pựNG CHƯƠNG TRÍNH phần MÊM Mở đãu Làm việc với biên Viẽt mã chương trình hiệu quà Thiẽt kẽ chương trình Xây dựng hàm/thú tuc CÁC KỸ THUẬT VIẾT MÃ CHƯƠNG TRÌNH HIỆU QUẢ Nguyên tác chung Các câu trúc rẽ nhánh Các câu trúc lặp Một sổ kỹ thuật tiêu biêu 1. Nguyên tắc chung Viết chương trình sao cho không chì người viết mà những người khác cũng có thê’ đọc được, hiểu được Môt chương trình được định dạng rõ ràng thì sẽ dễ đọc, dễ hiểu hơn Khoảng cách giữa các từ trong một câu lệnh Các cặp dãu đánh dãu khối lệnh { } Cách gióng hàng các câu lệnh cùng khối 1. Nguyên tắc chung Gióng hàng các cặp dẩu mớ / đóng ngoặc nhọn cùng câp both loops */ Inside J the first loop •/ Inside only Viết dãu mở ngoạc nhọn ngay sau câu lệnh int maĩn() < I return ins a.eryr float z; 5 : Luôn gióng hàng các câu lệnh sáu dâu mơ ngoặc nhọn 1 cãp 3; Trong trường hợp câu lệnh dài thì có thế xuống hàng 0; 1. Nguyên tắc chung Space: sứ dụng các khoáng cách hợp lý khi viẽt chương trinh Khoảng cách đủ đế các lệnh trớ nẻn dễ đọc Khoảng cách giữa các từ là như nhau VD: Gán mỗl phân từ mãng a[j] = J. Bad code for (j=0;j<100;j++) a[j]=j; Good code .. . ..— for (j=0; j<100; j++) a[j] = j; Thường có thế dựa vào auto-indenting, tinh năng trong trinh soạn tháo 1. Nguyên tắc chung Indentation: Gióng hàng hợp lý, thống nhất Thường có thế dựa vào auto-indentlng, tinh năng trong trinh soạn tháo tinh phân cấp cùa các cãu trúc điều khiển • VD: if (month == FEB) { if (year % 4 = 0) if (day > 29) legal = FALSE; else if (day > 28) legal = FALSE; } if (month = FEB) ( if (year % 4 0) ( if (day > 29) legal = FALSE; ) else ( if (day > 28) legal - FALSE; > Wrong code (else matches “If đay ■-* 29“) Right code 1. Nguyên tắc chung • Paragraphs : Dùng dòng trổng đế chia code thành các đoạn chính, đánh dẩu cau true phân cấp cùa chương trình •include •include /• Read a circle's radius from stdin, conpute and Mrlte Its diameter and clrcunference to stdout, Return e if successful. •/ lot nain(void) { const double PI « 3,14159; int radius; Int dian; double drcua; printf("Enter the circle's radius:\n”); if (scanfC'fcd", Sradius) I- 1) ( fprlntf(stderr, "Error: Hot a numberin''); exit(EXIT.FAILURE); /• or: return EXIT-FAILURE; •/ » } 1. Nguyên tắc chung • Paragraphs : Dùng dòng trông để chia code thành các đoạn chính, đánh dấu cấu trúc phân cấp của chương trình diam = 2 * radius; circum = PI ♦ (double)diam; printf("A circle with radius %d has diameter %d\n", radius, diam); printffand circumference %f.\n“, circum); return 0; 2. Các cấu trúc rẽ nhánh (if, while, do...while, for) • c không có kiểu boolean, cần sử dụng kiểu mi đế thay thế - 0 => FALSE, khác 0 => TRUE • Đúng cú pháp Java và C: if*(ĩ5.. 5) Thực hièn lệnh nào? stotementi; Sau khi thúc hiện xong I có giá tr 1 bao nhiêu'’ else statement!; Sai cú pháp Java, đúng cú pháp c 1 = 0; if (1 * ’) statement!; else statement!; Thực hiện lẻnh nào7 Sau khi thực hiện xong, i cố giá trị bao nhiẻu? search. • Bad code: • sử dụng else if cho cãu trúc đa lựa chọn • VD: Bước so sánh trong tim kĩẽm nhị phân - binary if (x < v[mid]) high ■ mid — 1; else { if (x > v(mid]) low = mid + 1; else return mid; • Good code: Các cấu trúc rẽ nhánh • Dùng các biểu thức dạng nguyên bản - Bad code: - VD: Kiếm tra nếu n thỏa mãn j < n < k if (•(n >= k) && !(n <= j)) - Good code: - Biếu thức điều kiện có thế đọc như cách thức bạn viết thông thường Đừng viết biếu thức điêu kiện theo kĩếu mà bạn không bao gíờ sử dụng Tránh vĩệc kiếm tra các điều kiện không cân thĩẽt a Dùng 0 đế tránh nhầm lẫn s VD Kiêm tra nếu n thỏa mản j < n < k 3 Moderately bad code if (j < n && n < k) « Moderately better code 0 Nên xảc định thứ tự kiểm tra các điều kiện dựa trén độ ưu tiên của các toán tứ rồi nhóm chúng lại 1 cách rõ ràng o Toán tủ' quan hẻ (vd “>") có đô ưu tiên cao hơn các toán từ logic (vd “&&"), nhưng aĩ nhở điẻu đó 7 „ • Dùng 0 đề tránh nhầm lẫn (cont.) VD: đọc và in các ký tự cho đến cuối tệp. Wrong code while (c = getchar() != EOF) putchar(c); - Right code • Đơn giàn hóa các biểu thửc điều kiện phức tạp VD: Xác định các ký tự tương ứng với các tháng của năm Bad code if ((c == T) II (c « 'F') II (c == •M1) II (c == 'À ) II (C == *s:) II (c == *o:) II (c == ‘N ) II (c == ’D )) - Good code • Nên gióng hàng theo các toán tử trong biểu thức • Không nên thay đối giá trị của biến chạy trong thân của vòng lặp for, ví dụ không nên làm như sau : for i = 1 to 10 do i := i + 1; for(i=l;i<=10;i++) i++; • Nên nhất quán trong việc dùng các biến local có cùng tên. Nếu "I" được dùng làm biến chạy cho vòng lặp trong 1 CTC, thi đừng dùng nó cho việc khác trong các CTC khác àn, đừng Các cấu trúc lặp Lựa chọn cách thoát khỏi vòng lặp hợp lý vi dụ: Bad code while (1) { if (a <= 0) break; else a--; Good code Thệ hiện logic của vòng lặp theo cách đơn quá kỳ bí Lựa chọn cấu trúc lặp hợp lý Chú ý khi dùng ++, " VD: Set each array element to 1.0. Bad code (or, perhaps just ”so-so" code) Không gán được giá trị 1.0 cho phần tử array[0] i = 0; while (i <= n-1) array[i++] = 1.0; - Good code while (i > 0) { while (j > 0) { if (j > 50) { break; • Dùng đúng ý nghĩa của break và continue while (i > 0) { while (j > 0) { if (j > 50) { j = -100; continue; } j-J } Ĩ--Ỉ } • Đừng quên lệnh break khi dùng switch int read_number(void) ( int c; int total • 0; do { c = getcharO; switch (c) { case -0 : case ’9*: total = (total * 10) + c - '0'; break; case ‘\n‘: c « EOF; break; case EOF: break; default: return -1; } } while (c 1- EOF); } Lệnh Labeled Break Java: cỏ C: không có Lệnh Labeled Continue Java: có C: không có Lệnh Goto Java: không có C: có nhưng không nên dùng I và II. 3. Các cấu trúc lặp (♦include (♦include main() ( int ì; printf("Counting\n \n\n“); i-l; while (1<-18) ( prlntf(*i ìs %ơ\n“,l); get chỏ; !♦+; } prlntf('All done. Press a key.“); getchỏ; Bài tập: sửa lại chương trình này theo các nguyên tắc đã học trong chương 3, phần Chddng.!*1- Mộtso kỹ thuật xây dưng èhữớngtnnh phân niêm Mờ đâu Các kỹ thuật làm việc với biẽn IH.Cảckỹ thuật vlẽt mã CT hlẻu quà Nguyên tác chung Các cẫu trúc rỉ nhánh Các cSu trúc lạp *• < kỳ ^“ệttìêu biếu a. Áp dụng 1 số phép toán số học cơ bản cho biến Ngoài +, *,/ có thê dùng +=, -=, *=, /=, -- và % (modulo) — (trừđìl) countdown—; += (cộng thêm vào giá trị hiện có trong biẽn) a+= 5; -= (trừ đi từ glá trị hiện cỏ trong biên) num_living-= num-dead; *= (nhàn với giá trị hiện có trong biên) no_bunnles*=2; /= (chia giá trị hiện cỏ trong bĩẽn) fracbon/= divisor; (x %y) tinh phân dư khi lấy X chia cho y remainder® x%y; (sô nguyên ) b. Thứ tự thực hiện phép toán số học • Luôn nhớ thứ tự thực hiện cãc phép toán • Sử dụng ngoặc để xác định thứ tự thực hiện khi cãn • Vi dụ: tính giá trị trung bình cũa 3 biên a, b và c Không vlẽt: a + b + c / 3 Viết : (a ♦ b + c ) / 3 Operators) Operation! s) I hư tự tinh toán (precedence) () Parentheses Thực hiện dầu tiên. Nếu có nhiều biêu thức trưng ngoặc lồng nhau, biếu thức trong cặp dầu ngoặc trưng cùng đưực tinh đầu tiẻn. Nếu cú nhiều cặp dổu ngoặc cúng cằp (khỏng lòng nhau), các biêu thức dược tinh theo thứ tự tứ trái sang phái *, /. or % Multiplicalion.Div 1 Sion, Modulus Thực hiện thử 2 Nếu có nhiêu phép toán, chúng dưực tinh tử trái sang phai 4- or “ Addition Subtraction Tĩnh cuối cúng Neu có nhiêu phép toán, chúng dược tinh tuua^jan^£haj c. Các phép toán so sánh và quan hệ Standard algebraic equality operator or relational operator c equality or relational operator Example of c condition Meaning of c condition Equality Operators X == y X is equal to y not = 1» X != y X is not equal to y Relational Operators > X > y X is greater than y < < X < y X Is less than y >= >= X >= y X Is greater than or equal to y <■ <= x<=y X is less than or equal to y 0 : false, non-zero : true 1 3 4 K Ẽ e 9 14 15 17 18 '.9 20 21 22 23 24 25 - Fla 2.13 fia02 13.c IT] ơsina Lt statements. relational Outline ooeratorn and wcrunlitv operators •/ •include 1. Declare variables int Mind ( 2. Input int nual. num2: 2.1 Lt statements printf( "Enter two inteaers. and I will tell printfI "the relationships thev satisfy: " >; scanfl "%d%d". Snuml. 4num2 ) : ’ I tv 3. Print If ( numl » num2 ) printfl “Id is eoual to %d\n", nunl. num2 ) ; if I numl •« num2 > printfl "’td 13 not eorual to *d\n". nunl. num2 if I nwnl printfl "*d IS less than *d\n", numl. nun2 I; If ( nunl > nun2 > printfl "id is crreater than %d\n". numl . nun2 I numl <« num2 ) prlntf( "Wd Is less than or eoual to %d\n" numl, nua2 ); Outline 30 if ( numl >= nuiũ2 ) printf( n%d is greater than or equal to - . _ . r . 3.1 Exit main numl, num2 ) ; 33 return 0; /• indicate program ended 35) Program Output Enter two integers, and I will tell you the relationships they satisfy: 3 7 3 Is not equal to 7 3 IB leas than 7 3 is less than or equal to 7 Enter two integers, and I will tell you the relationships they satisfy: 22 12 22 IS not equal to 12 22 is greater than 12 22 IS greater than or equal to 12 Chương.1.11- MqTSO kỹ thuật xây dưng èhữớngtnnh phân niêm Mờ đâu Các kỹ thuật làm việc với biẽn IH.Cảckỹ thuật vlẽt mã CT hlẻu quà Nguyên tác chung Các cẫu trúc rỉ nhánh Các cSu trúc lạp *• Mịt sộ kỳ ĨMuĩéu biếu d. Sử dụng phép toán ++Ỉ : tăng i trước khi sử dụng i++ : sử dụng i rồi tăng int i= 6; printf ("%d\n”,i++); /• In 6, đặt giá trị 7 cho i */ Khác nhau cơ bàn int i« 6; printí (*'%d\nH,++i); /* in 7, đặt giá trị 7 cho i*/ Chương.1.11- Mớĩso kỹ thuật xây dưng èhữớngtnnh phân niêm Mờ đâu Các kỹ thuật làm việc với biẽn IH.Cảckỹ thuật vlẽt mã CT hlẻu quà Nguyên tác chung Các cẫu trúc rỉ nhánh Các cSu trúc lạp *• Mịt sộ kỳ ĨMuĩéu biếu e. Các kỹ thuật vào ra dữ liệu trong C++ • Luồng vào ra và thư viện liên quan • Toán tử chèn vào luồng << (streaminsertion) Toán tử trích xuất từ luồng >> (stream-extraction) Các phương thức vào ra dữ liệu khác III. Các kỹ tíiuât vlẽt mã CThicu quã 1 Nguyên tâc chung Các cãu trúc nỉ nhảnh Cãc cãu trúc lập Một sõ kỹ thuât tiêu biéu e. Các kỳ thuật vào ra dữ liệu trong - Sự truyền thông tin theo một chuỗi các byte • Luồng vào ra cơ bán Luồng vào ra (Input/output stream) • Luông (stream) • Các thao tác vào ra (10) Vào (Input): Luông từ một thiết bị vào (bàn phím, ổ cứng ) tới bộ nhớ chinh Ra (Output): Luông từ bộ nhớ chính tới một thỉẽt bị ra (màn hinh, may in, ổ cứng...) - Trong c • Thư viện - Trong C+ + • Thư viện : Chứa cin, cout, cerr và clog Luồng vào ra (Input/output stream) • istream: luồng vào - cin >> someVariable; • cin biết kiểu dữ liễu được gán cho someVariable (dựa vào kiếu dữ liệu cúa biến someVarĩable). • ostream: luồng ra - cout << someVariable; • cout bỉẽt kĩếu dữ liệu đâu ra cerr << someString; Không đưa vào bộ đệm đẵu ra - in ngay giá trị someString clog << someString; Đưa vào bộ đệm đâu ra - in giá trị someString khi buffer đầy hay bị xóa rỗng có thể sử dụng để hiến thị các biến có kiểu dữ liệu tự định nghĩa cout << '\n'; Hiền thị ký tự sang dòng mới cout << endl; endl là một thao tác luông phát sinh ra một dòng mớl đồng thời xóa bộ đệm đâu ra cout << flush; flush fxóa bộ đệm đầu ra << sẽ xuất một biến cỏ kiếu dừ liệu char * như 1 xâu Đè xuãt địa chi cùa ký tự đâu tiên trong xâu đó, ép kiêu cho biên về kiếu void * Liên kẽt theo thứ tự từ trái qua phải, trá về giá trị tham chiếu đến cout (toán hạng bên trái nhất). cout << "How" << " are" << " you?"; Lưu ý sử dụng dấu ngoặc đúng chỗ: cout << "1 + 2 = " << (1 + 2); không phái là cout << "1 + 2 = " << 1 + 2; // Exỉnnpl í « // Printing the address stored In a char* variable •include 4 using std::oout; using std::endl; '3 int maln() { char ‘string - "test"; 11 cout « "Value of string is: " « string « "\nValue of static castCvold *>(string) is: " « static_cast( string ) « endl; 15 return 0; 16) Toán tử >> Sử dụng đê’ tạo luồng dữ liệu vào Thường bỏ qua các ký tự trắng (spaces, tabs, newlines) Trả về giá trị 0 (false) khi gặp dấu hiệu EOF NgƯỢc lại, trả về tham chiếu đến đối tượng được gọi (cin) Cho phép ghép nối luồng vào cin >> X >> y; 1 // stream-extraction operator returning false on end-of-file •include ■ usina std::cout; Ỉ using atd::cin; using 8td::endl; int mainO 7{ int grade, higheatGrade = -1; cout « "Enter grade (enter end-of-file to end): ”; 10 while ( cin » grade ) { 1 if ( grade > highestGrade ) 1. highestGrade = grade; cout « "Enter grade (enter end-of-fĩle to end): "; 15 I cout « "\n\nHlghest grade is: " « highestGrade « endl; 17 re turn 0; } Các hàm vào ra khác cin.geto Nhập 1 ký tự từ luồng (kế cã ký tự cách) và trà về ký tự đó cin.get(c) Nhập 1 ký tự từ luồng và lưu trữ nó vào c cin.get(array,size) Nhận 3 tham số: mãng ký tự, kích thước tõi đa và ký tự phân tách giữa các ký tự (mặc định là '\n'). Khi ký tự phản tách được đưa vào, nó vẫn tôn tại trong luồng vào Ký tự null được chèn vào cuôi mãng Các hàm vào ra khác cin.getline(array,size) Giõng cin.get(buffer,size) nhưng loại bó ký tự phân tách khỏi luồng và không lưu trữ nó trong mãng Ký tự null được chèn vào cuối mảng cout.put(char) Đưa ra 1 ký tự luông: cout.put('A'); Có thê’ được gọi với một biếu thửc có giá trị ASCII • cout.put(65); - Đưa ra A 2 // Using member functions get, put and eof. #include using 3td::cout; using std::cin; using std::endl; int main() 10{ char c; 1J cout « "Before input, cin.eofO is '• « cin.eofO « "\nEnter a sentence followed by end-of-flie:\n"; It while ( ( c = cin.geto ) != EOF ) 17 cout.put(c); cout « "\nEOF in this system is: " « c; cout « "\nAfter input, cln.eofO is " « cin.eofO « endl ; 21 return 0; 22} // Fig. 21.14: fig21 14 cpp // Character input with member function qetline, #include 5 using std::cout; using std::cin; using std::endl; 8 ■ int main() { const SIZE = 80; i: char buffert SIZE ]; 13 cout « "Enter a sentence:\n"; cin.getline( buffer, SIZE ); X o cout « "\nThe sentence entered is:\n" « buffer « endl; 16 return 0; 18J • Nên xảc định thứ tự thực hiện các lệnh dựa trên độ ưu tiên của các toán tử rồi nhỏm chúng lại 1 cách rõ ràng - Toán tứ Logic ("!=") có độ ưu tiên cao hơn toán tử gán (*=’■)

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

  • docxbai_giang_ky_thuat_lap_trinh_chuong_3_phan_1_cac_ky_thuat_xa.docx
  • pdfKTLT03-1-sv.pdf