Lập trình C
1 1 NGÔN NGỮ LẬP TRÌNH C/C++ NguyễnHải Châu Khoa Công nghệ thông tin Trường Đạihọc Công nghệ (Bài giảng tuần2) 2 Nộidung zKiểudữ liệu zBiểuthức zCâu lệnh 3 Kiểudữ liệu đơngiản 4 Khái niệm z Các ngôn ngữ lập trình (NNLT) đềucó mộtsố kiểudữ liệucơ bản z Các yếutố gắnvớikiểudữ liệu: { Tên kiểu { Số byte trong bộ nhớđểlưutrữ một đơnvị dữ liệuthuộckiểunày { Miềngiátrị củakiểu 5 Mộtsố kiểudữ liệu đơngiản trong C++ ±10 -307 . . ±10 +308 8 bytedouble ±10 -37 . . ±10 +38 4 bytefloat Số thực -2 31 2 31 -14 bytelong - 32768 327672 byteshort 0 2 32 -14 byteunsigned int -2 31 2 31 -14 byteint Số nguyên 0 2551 byteunsigned char -128 1271 bytechar Kí tự MiềngiátrịSố ô nhớTên kiểuLoạidữ liệu 6 Kiểukýtự char c, d; // c, d được phép gán giá trị từ -128 đến127 unsigned char e, f; // e được phép gán giá trị từ 0 đến255 c = 65 ; d = 179; // d có giá trị ngoài miền cho phép e = 179; f = 330; // f có giá trị ngoài miền cho phép cout << c << int(c); // in ra chữ cái 'A' và giá trị số 65 cout << d << int(d); // in ra là kí tự '|' và giá trị số -77 cout << e << int(e); // in ra là kí tự '|' và giá trị số 179 cout << f << int(f); // in ra là kí tự 'J' và giá trị số 74 2 7 Ví dụ: Tính diện tích và chu vi hình tròn #include <iostream.h> #include <iomanip.h> void main() { float r = 2; // r là tên biếndùngđể chứa bán kính cout << "Diện tích = " << setiosflags(ios::showpoint); cout << setprecision(3) << r * r * 3.1416; getchar() ; } 8 Hằng: Khai báo và sử dụng 9 Hằng là gì? zLà các giá trị cốđịnh, được đặttêngọi trong chương trình C/C++ zGiá trị củahằng không thay đổi trong khi chương trình thựchiện 10 Hằng nguyên z Cách viếthằng nguyên (hệ 10): { Kiểu short, int: 3, -7 { Kiểu unsigned: 3, 12345 { Kiểu long, long int: 3L, -7L, 12345L z Hằng nguyên có thể viết ở hệ 16 hoặc8: { Hệ 16: 0xA1 (11 ở hệ 10) { Hệ 8: 013 (11 ở hệ 10) 11 Hằng thực zHằng thựccóthể viết theo 2 cách zDạng dấuphảytĩnh: 3.2, -7.1, 3.1416 zDạng dấuphảy động: {Tổng quát: men hoặc mEn, trong đó m là phần định trị, n là phầnbậc(phầnmũ) {Ví dụ: 3.2 → 3.2e1, 3.2E1; 0.32 → 3.2e-1, 3.2E-1 12 Hằng ký tự zCó hai cách viếthằng ký tự: {Vớicáckýtự có mặtchữ: ‘A’ {Các ký tự không có mặtchữ: Dùng chữ số hệ 8 hoặc 16 để biểudiễnmãcủakýtựđó: ‘\33’, ‘\x1B’ {Mộtsố hằng ký tựđặcbiệtcócáchviết riêng để tiệnlợivàdễ nhớ zHằng ký tự không có khái niệmrỗng 3 13 Mộtsố hằng ký tựđặcbiệt '\n': biểuthị kí tự xuống dòng (cũng tương đương với endl) '\t' : kí tự tab '\a': kí tự chuông (tức thay vì in kí tự, loa sẽ phát ra mộttiếng 'bíp') '\r' : xuống dòng '\f' : kéo trang '\\' : dấu\ '\?': dấuchấmhỏi? '\'' : dấu nháy đơn' '\"' : dấu nháy kép " '\kkk' : kí tự có mã là kkk trong hệ 8 '\xkk' : kí tự có mã là kk trong hệ 16 14 Hằng xâu ký tự zLà dãy ký tự bấtkỳđặtgiữadấu nháy kép zVí dụ: {“Dien tu Vien thong” {“Cong nghe thong tin” zChú ý: {‘A’ là mộthằng ký tự, khác với {“A” là mộthằng xâu ký tự {Xâu ký tự có thể rỗng: “” 15 Tạisaocầncóhằng trong chương trình? zChương trình dễđọchơn vì các con số được thay bởicáctêngọi có ý nghĩa, ví dụ: 3.1415 được thay bởi Pi zChương trình dễ sửachữahơn 16 Cách khai báo hằng #define <tên hằng> <giá trị hằng> hoặc const <tên hằng>=<giá trị hằng>; Ví dụ: #define sosinhvien 50 #define MAX 100 const sosinhvien = 50; 17 Biến: Khai báo và sử dụng 18 Khai báo biến zBiếnlàcáctêngọi để lưugiátrị khi chương trình thựchiện zBiến khác hằng ở chỗ giá trị củanócóthể thay đổitrongkhichương trình thựchiện zCó hai cách khai báo biến: {Khai báo không khởitạo {Khai báo có khởitạo 4 19 Khai báo không khởitạo <tên kiểu 1> <tên biến1>; <tên kiểu 2> <tên biến2>; <tên kiểu 3> <tên biến 3>, <tên biến4>; Chú ý: Các biếncócùngkiểucóthể khai báo theo cách 3 20 Ví dụ về khai báo biến không khởitạo void main() { int i, j; // khai báo 2 biến i, j có kiểunguyên float x ; // khai báo biếnthựcx char c, d[100] ;// biếnkítự c, xâu d // chứatối đa 100 kí tự unsigned int u; // biến nguyên không dấuu … } 21 Khai báo có khởitạo <tên kiểu 1> <tên biến1>=<giátrị 1>; <tên kiểu 2> <tên biến2>=<giátrị 2>; <tên kiểu 3> <tên biến3>=<giátrị 3>, <tên biến 4>=<giá trị 4>; Các giá trị khởitạocóthể là hằng, biến hoặcbiểuthức 22 Ví dụ về khai báo biếncókhởitạo const int n = 10 ; void main() { int i = 2, j , k = n + 5; // khai báo i và khởitạo // bằng 2, k bằng 15 float eps = 1.0e-6 ; // khai báo biếnthực // epsilon khởitạobằng 10-6 char c = 'Z'; // khai báo biếnkítự c // và khởitạobằng 'A' char d[100] = "Tin hoc"; // khai báo xâu kí tự d // chứadòngchữ "Tin hoc" … } 23 Ví dụ về tên gọitrongC++ zTên gọi đúng: i, i1, j, tinhoc, tin_hoc, luu_luong zTên gọisai: 1i, tin hoc, luu-luong-nuoc zCác tên sau đây là khác nhau: ha_noi, Ha_noi, HA_Noi, HA_NOI, . 24 Phạmvi củabiến zPhạmvi củabiếnlànơimàbiếncótác dụng hay tại đógiátrị củabiếncóthể sử dụng được zChi tiết: sẽ nói trong các bài họcsau 5 25 Gán giá trị cho biến zSử dụng phép gán để gán giá trị cho biến: <tên biến> = <biểuthức>; Ví dụ: int n, i = 3; // khởitạoi bằng 3 n = 10; // gán cho n giá trị 10 cout << n <<", " << i << endl; // in ra: 10, 3 i = n / 2; // gán lạigiátrị củai bằng n/2 = 5 cout << n <<", " << i << endl; // in ra: 10, 5 26 Mộtsố lưuý về phép gán zPhép gán là một phép toán và nó trả lạigiá trị của<biểuthức> zDo đócóthể thựchiệnnhiều phép gán: <biến 1>=<biến 2>=…=<biểuthức> zTuy nhiên không nên lạmdụng nhiều phép gán như trên dẫn đếnchương trình khó đọc 27 Phép toán, biểuthứcvàcâulệnh 28 Phép toán zC++ có nhiều phép toán chia thành các loại 1 ngôi, 2 ngôi và thậm chí 3 ngôi zCác thành phầntêngọi tham gia trong phép toán gọilàhạng thứchoặc toán hạng, các kí hiệu phép toán gọi là toán tử zVí dụ: a+b: a, b là toán hạng, + là toán tử zSố ngôi của phép toán chính là số toán hạng 29 Các phép toán số học zCộng (+), trừ (-), nhân (*) zChia (/): {Chia lấyphần nguyên: 5/2 = 2 {Chia thực: 5.0/2.0 = 2.5 zLấyphầndư (%) {5 % 2 = 1 {4 % 2 = 0 zĐây là các phép toán 2 ngôi zPhép trừ còn là 1 ngôi (khi đảodấu) 30 Các phép toán tự tăng giảm z i++, ++i: Tăng i (biến nguyên) lên 1 đơnvị z i--, --i: Giảmi (biến nguyên) đi1 đơnvị z Đây là các phép toán 1 ngôi i = 4, j = 8j = i + 5; i = i + 1; j = i++ + 5 ; i = 4, j = 9i = i + 1 ; j = i + 5 ; j = ++i + 5 ; i = 15 , j = 16i = j ; j = j + 1 ; i = j++; // tăng sau i = 16 , j = 16j = j + 1 ; i = j ; i = ++j; // tăng trước KếtquảTương đương Phép toán 6 31 Các phép toán so sánh và logic zCác phép toán so sánh: Bằng nhau (==), khác nhau (!=), lớnhơn(>), lớnhơnhoặc bằng (>=), nhỏ hơn(<), nhỏ hơnhoặc bằng (<=) zĐây là các phép toán 2 ngôi zCác phép toán logic: Và (&&), hoặc (||), phủđịnh (!) 32 Các phép gán zGán thông thường <biến> = <biểuthức> zGán có điềukiện: <biến> = <điềukiện>?<biểuthức1>:<biểuthức2> <điềukiện> là mộtbiểuthức logic, <biểuthức1> và <biểuthức2> làcácbiểuthức cùng kiểuvới kiểucủa<biến> Nếu<điềukiện> đúng thì <biến> nhậngiátrị của <biểuthức1> ngượclạinhậngiátrị của<biểu thức2> 33 Ví dụ phép gán có điềukiện x = (3 + 4 < 7) ? 10: 20 // x = 20 vì 3+4<7 là sai x = (3 + 4) ? 10: 20 // x = 10 vì 3+4 khác 0, tức điềukiện đúng x = (a > b) ? a: b // x = số lớnnhất trong 2 số a, b. 34 Cách viếtgọncủaphépgán zPhép gán dạng x = x@a, trong đó@ là một phép toán số học, xử lý bit có thể đượcviếtgọn thành: x @= a zVí dụ: {x = x + 2 → x += 2 {y = y/2 → y /= 2 35 Biểuthức zBiểuthức là dãy kí hiệukếthợpgiữacác toán hạng, phép toán và cặpdấu () theo một qui tắcnhất định zCác toán hạng có thể là hằng, biến, hàm zVí dụ các biểuthức {(x +y)*4-2 {(-b + sqrt(delta)) / (2*a) {3 - x + sqrt(y) 36 Thứ tựưutiêncủa các phép toán zC++ qui định trậttự tính toán theo các mức độ ưutiêntừ cao đếnthấpnhư sau: {Các biểuthức trong cặpdấungoặc() {Nếucónhiềucặp ngoặclồng nhau thì cặp trong cùng (sâu nhất) được ưutiêncaohơn {Các phép toán 1 ngôi (tự tăng-giảm, lấy địachỉ, lấynội dung con trỏ, phủđịnh …) {Các phép toán số học. {Các phép toán quan hệ, logic. {Các phép gán. 7 37 Chú ý zĐể chương trình rõ ràng, sáng sủa: Với mỗibiểuthức, nên sử dụng dấu ngoặc để chỉđịnh mộtcáchtường minh trậttự tính toán trong biểuthức đó 38 Phép toán chuyển đổikiểu zC++ hỗ trợ chuyển đổikiểutựđộng: char ↔int→long int→float→double zChuyển đổikiểu không tựđộng: (tên_kiểu)biểu_thức // cú pháp cũ trong C hoặc tên_kiểu(biểu_thức) // cú pháp mới trong C++ 39 Câu lệnh zMột câu lệnh trong C++ đượcthiếtlậptừ các từ khoá và các biểuthức…vàluôn luôn đượckết thúc bằng dấuchấmphẩy zVí dụ: cin >> x >> y ; x = 3 + x ; y = (x = sqrt(x)) + 1 ; cout << x ; cout << y ; 40 Khốilệnh zMộtsố câu lệnh đượcgọilàlệnh có cấu trúc, tức bên trong nó lạichứa dãy lệnh khác. zDãy lệnh này phải đượcbaogiữacặpdấu ngoặc {} và đượcgọilàkhốilệnh. zVí dụ: if (a==b) { x *= 2; y= y-2; // Font đỏ: Khốilệnh } 41 Thư viện các hàm toán học z #include <math.h> z abs(x), labs(x), fabs(x): trả lạigiátrị tuyệt đốicủa mộtsố nguyên, số nguyên dài và số thực. z pow(x, y): hàm mũ, trả lạigiátrị x lũythừay (xy). z exp(x): hàm mũ, trả lạigiátrị e mũ x (ex). z log(x), log10(x): trả lại lôgarit cơ số e và lôgarit thập phân của x (lnx, logx) . z sqrt(x): trả lạicănbậc2 củax. z atof(s_number): trả lạisố thực ứng vớisố viết dướidạng xâu kí tự s_number. z Hàm lượng giác: sin(x), cos(x), tan(x) 42 Các vấn đề cầnnhớ zCác kiểudữ liệucủaC++ zHằng và biến zPhép toán (toán tử), biểuthức, toán hạng, độ ưutiêncủa các phép toán zNgôi của phép toán zCâu lệnh và khốilệnh 8 43 Bài tập zLàm tấtcả các bài tậptừ số 1 đếnsố 20 trong giáo trình (trang 38, 39, 40) zGiờ thực hành: Yêu cầusinhviênchạy các chương trình trong tuần 1 và tuần2 trên máy tính . (Bài giảng tuần2) 2 Nộidung zKiểudữ liệu zBiểuthức zCâu lệnh 3 Kiểudữ liệu đơngiản 4 Khái niệm z Các ngôn ngữ lập trình (NNLT) đềucó mộtsố kiểudữ liệucơ. yếutố gắnvớikiểudữ liệu: { Tên kiểu { Số byte trong bộ nhớđểlưutrữ một đơnvị dữ liệuthuộckiểunày { Miềngiátrị củakiểu 5 Mộtsố kiểudữ liệu đơngiản trong