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
106 trang |
Chia sẻ: hachi492 | Ngày: 07/01/2022 | Lượt xem: 365 | Lượt tải: 0
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:
- bai_giang_ky_thuat_lap_trinh_chuong_3_phan_1_cac_ky_thuat_xa.docx
- KTLT03-1-sv.pdf