Tự Học - Lập Trình C Cơ Bản Trong Công nghệ thông tin và một số ngành kỹ thuật, lập trình là môn học rất quan trọng, là khởi đầu và tạo nền móng cho những kiến thức sau này. Vì vậy, mình muốn chia sẻ kiến thức của mình đến những ai có định hướng theo ngành này, hoặc đang là sinh viên năm nhất của một trường Công nghệ, giúp các bạn có thể tiếp cận việc lập trình trên máy tính một cách dễ dàng và có hệ thống. Hiện nay có rất nhiều ngôn ngữ thông dụng, nhưng ngôn ngữ lập trình C vẫn là cái cơ bản mà được nhiều trường chọn lựa để dạy và tạo bước đệm sơ khai ban đầu. Khi các bạn tham khảo xong toàn bộ những bài mình up dưới đây, các bạn có thể hiểu được những khái niệm cơ bản như: Thuật toán, chương trình máy tính, mã nguồn, file thực thi.. ; sử dụng thành thạo ngôn ngữ lập trình C để tổ chức dữ liệu cho bài toán, lưu trữ dữ liệu và sau này có thể tạo ra những chương trình có độ phức tạp cao hơn. Nếu có thắc mắc gì, các bạn hãy comment ở bên dưới, chúng ta sẽ cùng giải đáp nhé! Topic có thể hoàn thành lâu hơn dự kiến, do mình đang ôn thi ấy. Các bạn cho mình thêm thời gian nha ^^
Bài 1: Giới thiệu ngôn ngữ lập trình C và Phần mềm viết code Bấm để xem I. GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH C. 1. C là ngôn ngữ bậc trung. Trong ngôn ngữ lập trình có ba cấp bậc: Thấp, trung, cao. C được gọi là ngôn ngữ máy bậc trung, điều này không có nghĩa là C kém mạnh và khó sử dụng hoặc ít phát triển hơn các ngôn ngữ bậc cao. Ngược lại, C là ngôn ngữ có sự kết hợp tốt nhất giữa các thành phần của ngôn ngữ bậc cao và tính mềm dẻo của ngôn ngữ bậc thấp. C làm việc với bit, byte và địa chỉ, có 5 kiểu dữ liệu, có thể chuyển hóa qua lại lẫn nhau. Mã nguồn của C tương thích với nhiều chương trình dịch, nhiều hệ điều hành. 2. C là ngôn ngữ có cấu trúc. Có cấu trúc nghĩa là gì? Để dễ hiểu nhất thì ta chỉ cần biết mã nguồn và dữ liệu sẽ được chia thành các ngăn riêng biệt. Thành phần cấu trúc trong C có 2 dạng: - Hàm: Là thành phần chính, được coi như một chương trình con riêng biệt, phục vụ một nhiệm vụ nhất định, từ đó ta có thể chia một chương trình lớn thành các chương trình con. - Khối lệnh: Được đặt trong dấu {}. 3. Cấu trúc của một chương trình C. Phần đầu: Khai báo toàn cục (thư viện, hàm, biến) Phần thân: <kiểu trả về> main (danh sach tham số) { Các câu lệnh; } Phần kết: Định nghĩa các hàm (nếu có) 4. Chương trình đầu tiên. Sau khi cài đặt phần mềm viết code về, hẳn ai cũng muốn bắt tay vào viết ngay một chương trình, khi chưa tìm hiểu quá sâu về nó. Vậy thì chúng ta sẽ bắt đầu từ chương trình đơn giản nhất mà không ai bước vào nghề không biết đến nó cả. Đó là chương trình "Hello World". Phần code của nó sẽ như sau: #include<stdio. H> /*khai bao thu vien */ int main () { Printf ( "Hello World") ; /* cau lenh */ return 0; } Và khi chạy, phần mềm sẽ hiện: II. PHẦM MỀM VIẾT CODE. Có rất nhiều phần mềm để viết code, nhưng có 2 phần mềm mình muốn giới thiệu đến các bạn, và có một link code online đơn giản cho những ai chưa muốn tải thêm app về máy. 1. Link code online Bạn hãy ấn vào link dưới đây: Online C Compiler - online editor Link này tiện đến mức mà ngay sau khi ấn vào, nó đã soạn sẵn chương trình Hello World mà mình vừa viết cho các bạn xem ở trên. Để chạy chương trình, các bạn hãy nhấn phím F9. Phần lớn các chương trình code đơn giản không liên quan đến file hoặc dữ liệu có sẵn đều có thể chạy trên web này, nhưng mà theo trải nghiệm của mình thì sau này viết những chương trình dài và có hàm con thì nó sẽ chạy rất chậm, thậm chí xảy ra chút lỗi như hiện thị thiếu. Cùng một đoạn code như thế, khi chạy trên app chuyên biệt sẽ không bao giờ xảy ra vấn đề đó. Vì vậy, các bạn nên cân nhắc, dùng nó cho vài bài đầu thôi nha! ^^ 2. Visual Studio Code Link tải app: Visual Studio Code - Code Editing. Redefined Đây thực sự là công cụ hữu dụng khi nó cho phép bạn code bằng nhiều ngôn ngữ, chứ không riêng gì ngôn ngữ C. Cũng chính về tính đa dạng ấy, giao diện của nó khá khó sử dụng cho người mới bắt đầu. Sau khi tải ứng dụng về, bạn sẽ chưa chạy được ngay, bạn cần cài thêm nguồn tài nguyên như các thư viện cho nó, và tải ngôn ngữ mình cần về. Mình không muốn hướng dẫn chi tiết cho phần mềm này, vì theo mình thì nó chưa thích hợp với người mới bắt đầu lắm. Khi các bạn đã có đủ kiến thức về lập trình, việc sử dụng Visual Studio Code sẽ trở nên dễ dàng hơn. 3. Dev C++ Đây chính là phần mềm mình muốn hướng dẫn đến các bạn, link tải đây: Dev-C++ Phần mềm này dành riêng cho ngôn ngữ C và C++. Chỉ cần tải về là có thể sử dụng được ngay, giao diện cũng rất dễ tương tác với người dùng. Một số thao tác làm việc với Dev C: Ctrl + N: New (mở một tab mới) Ctrl + S: Save (lưu chương trình) F9: Complie (biên dịch chương trình) F10: Run (chạy) F11: Complie & run (biên dịch và chạy) Như vậy, sau khi cài đặt, bạn hãy nhấn Ctrl + N để mở tab mới rồi nhập chương trình Hello World bên trên vào, lưu rồi nhấn F10 hoặc F11 để chạy thử. Chúc bạn thành công !
Bài 2: Biểu thức (Expression) Bấm để xem I. KHAI BÁO TOÀN CỤC Đây là phần để đầu tiên của chương trình, những gì được khai báo ở phần này sẽ được dùng cho toàn bộ chương trình. Trước tiên, bao giờ chúng ta cũng phải khai báo các thư viện. Thư viện thật ra cũng là hệ thống các hàm đã được lập trình sẵn, chúng ta sẽ gọi tên các câu lệnh để sử dụng nó như tài nguyên sẵn có. Cú pháp khai báo thư viện như sau: #include<tên_thư_viện > Một số thư viện phổ biến Ví dụ: Khi chúng ta cần dùng hàm printf để in ra màn hình một nội dung nào đó, ta cần khai báo thư viện stdio. H #include<stdio. H> Ngoài ra các bạn có thể khai báo thêm biến toàn cục, các hàm con.. nhưng trong bài này chúng ta sẽ chưa nhắc đến. II. BIỂU THỨC Ở bài này, chúng ta sẽ tập làm với những bài toán liên quan đến biểu thức đơn giản nhất. Các biến, hằng, phép toán và hàm là các thành phần cơ bản tạo nên biểu thức. 1. Kiểu dữ liệu Kiểu dữ liệu là định dạng dữ liệu của bài toán dưới dạng kí tự, số nguyên, số thực.. Trong C có 5 kiểu dữ liệu cơ bản: - Kí tự (char) - Kiểu số nguyên (int) - Kiểu số thực dấu phẩy động (float, double) - Kiểu dữ liệu không giá trị (void) Để làm việc với những con số, chúng ta sẽ có các kiểu dữ liệu mở rộng của hàm int, float, double. 2. Định danh Trong C, tên của các biến, hàm, đối tượng do người dùng đặt được gọi là định danh. Định danh bao gồm nhiều kí tự ghép lại. Quy định trong định danh: - Ký tự đầu tiên phải là chữ cái hoặc dấu gạch nối (dấu "_"). - Các ký tự tiếp theo có thể là chữ cái, số, hoặc dấu gạch nối. - Có độ dài bất kỳ, có phân biệt giữa chữ in thường và in hoa. - Không được trùng với từ khóa và tên hàm trong thư viện chuẩn. Một số ví dụ về định danh: 3. Biến a) Khái niệm ' Biến là một vịt trí có tên trong bộ nhớ được sử dụng để lưu trữ một giá trị và có thể thay đổi bởi chương trình. Tất cả các biến phải được khai báo trước khi sử dụng. Cú pháp khai báo như sau: kiểu_dữ_liệu tên_biến; Ví dụ: int count; Float x; Double y; Hoặc khai báo nhiều biến cùng kiểu dữ liệu: int max, min, tb; Ta cũng có thể gán giá trị cho biến khi khai báo: int a=5; b) Phân loại Chúng ta phân loại biến dựa vào vị trí khai báo của nó, có 3 kiểu: - Biến cục bộ: Bên trong hàm hoặc khối câu lệnh - Tham số hình thức: Trong định nghĩa tham số hàm - Biến toàn cục: Bên ngoài của tất cả các hàm 4. Hằng Hằng là một giá trị cố định mà chương trình không thể thay đổi được. const <kiểu dữ liệu> <tên hằng> = <giá trị>; VD: const double PI = 3.1415926; Một số hằng ký tự đặc biệt: 5. Phép toán Một số phép toán hay gặp: a) Phép toán gán - Gán cùng kiểu dữ liệu Int a; A=5; - Gán khác kiểu dữ liệu: Giá trị bị gán bên phải dấu bằng sẽ được chuyển về kiêu dữ liệu của biến bên trái dấu bằng. Nếu kiểu của giá trị, lớn hơn kiểu của biến thì sẽ xảy ra trường hợp mất dữ liệu. b) Phép toán số học Một số phép toán có thể viết tắt: A=a+1; có thể viết thành a+=1; c) Phép toán quan hệ d) Phép toán logic Thứ tự ưu tiên của phép toán logic là! &&, ** Ngoài ra còn có phép toán? , phép toán bit, phép toán sizeof, và ép kiểu** 6. Hàm Các hàm toán học cơ bản: Khi gọi các hàm này, chúng ta phải khai báo thư viện chứa nó, đó là thư viện math #include<math. H> III. BÀI TẬP VD1. Chương trình nhập vào 2 số nguyên và in ra tổng và tích 2 số #include<stdio. H> Int main () { Int a, b; Printf ( "Nhap vao 2 so nguyen a va b:") ; Scanf ( "%d%d", &a, &b) ; Printf ( "Tong %d+%d=%d\n", a, b, a+b) ; Return 0; } Bài 1. Viết chương trình nhập vào 3 số nguyên, in ra màn hình tổng và trung bình cộng của 3 số đó. Bài 2. Viết chương trình tính toán tiền phải trả hàng tháng cho đơn hàng mua iphone 12 Pro Max giá ban đầu 26.668.000 VND, với hình thức trả góp trong 12 tháng với trả góp 0% thì số tiền phải trả hàng tháng sẽ là bao nhiêu? Bài 3 . Viết chương trình tính toán tiền phải trả hàng tháng cho đơn hàng mua xe máy honda LEAD với giá ban đầu 38.290.000. Hình thức mua hàng là vay tín dụng trả góp trong 12 tháng với lãi trả góp 8%/năm thì số tiền phải trả hàng tháng sẽ là bao nhiêu? (Số tiền đăng ký trả góp + (Lãi suất trả góp x Kỳ hạn trả góp x Số tiền đăng ký trả góp)) / Kỳ hạn trả góp Bài4 . Chương trình khuyến mãi của Lazada giảm tới 50% giá trị đơn hàng. Giả sử bạn mua hàng là xe đồ chơi với tiền hàng gốc là 799.000, được giảm giá 41%. Phí vận chuyển được giảm là 25K cho đơn hàng trên 100K. Hàng xe đồ chơi là hàng cồng kềnh nên phí vận chuyển tới người dùng mất 75K. Lazada tính thêm phí xử lý đơn hàng là 11K. Hãy tính số tiền bạn phải trả cho đơn hàng trên Bài 5 . Bạn cần mua 4 món đồ chơi giống nhau để tặng cho 4 bé nhân ngày sinh nhật. Món đồ chơi bạn chọn có giá ban đầu là 848.000VND. Nhân dịp sinh nhật Lazada có khuyến mãi giảm giá món đồ tới 36%. Ngoài ra shop bán hàng còn giảm giá tới 15K cho đơn hàng trên 500K và 20K cho đơn hàng trên 800K. Giả sử bạn được miễn phí giao hàng và phí xử lý đơn hàng là 9k/đơn. Vậy bạn nên đặt đơn hàng thế nào sao cho tổng tiền phải trả là nhỏ nhất cho 4 sản phẩm. Cách 1. Đặt 4 đơn rời nhau Cách 2. Đặt 2 đơn, mỗi đơn 2 sản phẩm Cách 3. Đặt 1 đơn gồm 4 sản phẩm Bài 6 . Giả sử bạn có viên pin dự phòng cho di động với dung lượng định danh 20000mAh. Tuy nhiên do hiệu suất chuyển đổi năng lượng nên bạn chỉ có thể dùng được tầm 90% dung lượng định danh trên. Bạn cần sạc đầy cho điện thoại iphone 12 Pro MAX với dung lượng pin điện thoại là 3678 mAh và hiệu suất khi sạc không dây chỉ là 80%. Vậy bạn có thể sạc được bao nhiêu lần điện thoại sử dụng viên pin dự phòng trên?
Bài 3: Câu Lệnh (Statement) Bấm để xem I. TRUE VÀ FALSE TRONG C Một biểu thức điều kiện khi cho hai giá trị hoặc đúng hoặc sai. Trong C, 0 được coi là giá trị sai. Tất cả giá trị khác không, bao gồm cả giá trị âm, đều được coi là giá trị đúng. II. LỆNH LỰA CHỌN 1. Lệnh if - else if (điều_kiện) S1; Else S2; Mệnh đề elsse là tùy chọn, có thể có hoặc không. Nếu điều kiện đúng thì S1 được thực thi, nếu không thì S2 thực thi. VD: #include<stdio. H> Int main () { Int a; Printf ( "Nhap a =") ; Scanf ( "%d", &a) ; if (a>=0) printf ( "a la so khong am") ; Return 0; } VD: #include<stdio. H> Int main () { Int a; Printf ( "Nhap a =") ; Scanf ( "%d", &a) ; if (a>=0) printf ( "a la so khong am") ; else printf ( "a la so am") ; Return 0; } Ta cũng có thể dùng if-else lồng nhau kiểu: if (a>=0) { If (a==0) printf ( "a la so khong am cung khong duong") ; Else printf ( "a la so duong") ; } else printf ( "a la so am") ; Hoặc if - else liên tiếp: if (a>0) printf ( "a la so duong") ; Else if (a=0) prrintf ( "a la so khong am cung khong duong") ; Else printf ( "a la so am") ; 2. Lệnh switch switch (<biểu thức điều kiện>) { Case val1: <lenh voi case 1>; Break; Case val2: <lenh voi case 2>; Break; Case val3: <lenh voi case 3>; Break; Case val4: <lenh voi case 4>; Break; * * * Default: <lenh voi case n+1>; } Lệnhswitch.. case Trường hợp biểu thức điều kiện có giá trị kiểu nguyên Số lượng giá trị là hữu hạn Có thể dễ dàng thay thế bởi if.. Else Câu lệnh brea k giúp chương trình thoát khỏi vòng lựa chọn VD. Nhập vào 1 tháng của năm, in ra số ngày của tháng đó (không phải năm nhuận) #include <stdio. H> Int main () { Int month; Printf ( "Nhap vao thang:") ; Scanf ( "%d", &month) ; switch (month) { Case 1: Case 3: Case 5: Case 7: Case 8: Case 10: Case 12: Printf ( "Thang %d co 31 ngay! \n", month) ; Break; Case 2: Printf ( "Thang %d co 28 ngay! \n", month) ; Break; Case 4: Case 6: Case 9: Case 11: Printf ( "Thang %d co 30 ngay! \n", month) ; Break; Default: Printf ( "Thang nhap vao khong hop le! \n", month) ; } Return 0; } III. LỆNH LẶP 1. Lệnh lặp for for (<biểu thức khởi tạo>; <điều kiện lặp>; <biểu thức lặp>) <lệnh lặp>; VD: int i=1; For (i=0; i<=100;i++) { Printf ( "..." I) ; } <biểu thức khởi tạo>: Khởi tạo giá trị 1 lần Trong khi <điều kiện lặp> còn đúng thì thực hiện <lệnh lặp>, và sau đó thực hiện <biểu thức lặp> (chủ yếu để thay đổi giá trị biến lặp → thay đổi giá trị của điều kiện lặp) Không nhất thiết phải khai báo đủ các thành phần trong điều kiện ở for, nhưng vẫn cần có đủ ; Int i=1; For (; i<=100;) { Printf ( "..." I) ; I++; } 2. Lệnh lặp while Cú pháp: while (điều_kiện) { Câu_lệnh; } Check điều kiện, nếu đúng mới thực hiện VD: Int i=1; while (i<=100) { Printf ( "..." I) ; I++; } 3. Lệnh lặp do.. while Cú pháp: do { Câu_lệnh; } While (điều_kiện) ; Thực hiện lần đầu tiên, rồi mới check điều kiện VD. Nhập n thỏa mãn điều kiện n>=0 và n<=100 do { Printf ( "Nhap n (0<=n<=100) :") ; Scanf ( "%d", &n) ; } While (n<0 N>100) ; IV. LỆNH NHẢY 1. Lệnh break break; Khi gặp câu lệnh break; chương trình sẽ thoát ra khỏi vòng lặp ngay lập tức và nhảy đến câu lệnh sau vòng lặp. 2. Lệnh goto Lệnh goto ít khi được sử dụng trong các tình huống lập trình, bởi vì nếu sử dụng nhiều lệnh nhảy sẽ làm cho chương trình trở nên phức tạp khó gỡ rối. Cú pháp: goto <định_danh>; trong đó định danh là tên của một chuỗi câu lệnh khác: <định_danh>: Câu_lệnh; VD: for (int i=1;i<10;i++) { If (i%5==0) goto ketthuc; } Ketthuc: Printf ( "%d là so chia het cho 5) ; 3. Lệnh return Cú pháp: return biểu_thức; Lệnh return dùng để thoát khỏi một hàm, nó được phân loại lệnh nhảy vì nó trở về đúng vị trí gọi hàm. Lệnh return có thể mang một giá trị hoặc không. Nếu nó mang giá trị, thì đó cũng chính là giá trị của hàm. VD: return 0; Retun x+1; V. BÀI TẬP Bài tập 1. Nhập vào 1 số nguyên, tính tổng các chữ số của số đó và in ra màn hình. Chú ý số ban đầu có thể là số âm. Chuyển số âm về số dương (nếu đầu vào là số âm) Tách các chữ số bằng cách chia % và / (vì số ban đầu là số nguyên) Bài tập 2. Nhập vào 1 số nguyên, in lại số đó sao cho dễ đọc 123 → 123 12345 → 12, 345 123456789 → 123, 456, 789 Giới hạn số có tối đa 9 chữ số Tách số thành 3 phần dạng abc a = n/1000000 số hàng triệu c = n%1000 → số hàng đơn vị b = Để in ra xét các trường hợp A và b đều bằng 0 A == 0 Trường hợp còn lại 12025006 ta có thể phân tách A = 12 B = 25 C = 6 printf (" %d, %d, %d ", a, b, c) → bị thiếu số 0 C1. Nếu b >= 1000 → printf (" %d ", b) ; Nếu 1000>b>=10 → printf (" 0%d ", b) ; Ngược lại (b<10) → printf (" 00%d ", b) ; * * * #include <stdio. H> Int main () { Int n; Printf (" n= ") ; Scanf (" %d ", &n) ; While (n<0 N>1000000000) { Printf (" Nhap lai n= ") ; Scanf (" %d ", &n) ; } Printf (" So sau khi in lai: ") ; Int a, b, c; A = n/1000000; C = n%1000; B = (n/1000) %1000; If (a==0) { If (b==0) printf (" %d\n ", c) ; Else { If (c>=100) printf (" %d, %d\n ", b, c) ; Else if (c>=10) printf (" %d, 0%d\n ", b, c) ; Else printf (" %d, 00%d\n ", b, c) ; } } Else { If (b==0) printf (" %d, 000, %d\n ", a, c) ; Else { If (b>=100) { If (c>=100) printf (" %d, %d, %d\n ", a, b, c) ; Else if (c>=10) printf (" %d, %d, 0%d\n ", a, b, c) ; Else printf (" %d, %d, 00%d\n ", a, b, c) ; } Else if (b>=10) { If (c>=100) printf (" %d, 0%d, %d\n ", a, b, c) ; Else if (c>=10) printf (" %d, 0%d, 0%d\n ", a, b, c) ; Else printf (" %d, 0%d, 00%d\n ", a, b, c) ; } Else // b<10 { If (c>=100) printf (" %d, 00%d, %d\n ", a, b, c) ; Else if (c>=10) printf (" %d, 00%d, 0%d\n ", a, b, c) ; Else printf (" %d, 00%d, 00%d\n ", a, b, c) ; } } } } Bài tập 3 . Viết chương trình nhập vào 1 số nguyên dương từ bàn phím, nếu các chữ số của số đó theo thứ tự không giảm thì in ra thông báo" So ky ao ", ngược lại in ra thông báo" So ban vua nhap cho la so binh thuong! " Số kỳ ảo: 1223, 13356, 12567, 12 Bài tập 4 . Viết chương trình nhập vào 1 số, kiểm tra xem các chữ số của số đó có đối xứng hay không, nếu có thì in ra màn hình" So la Palindrome " Số Palindrome: 121, 1221, 123231, 123443221 Bài tập 5 . Giả sử độ khó của việc" đào"1 bitcoin hiện tại là 13, 912, 524, 048, 946 Tốc độ của máy chuyên dụng có tốc độ tính toán x TH (Tetra Hashes per second) Và mức độ tiêu tốn năng lượng là y kWh. Giả sử giá tiền điện là 2500VND/kWh (giá cố định theo số) Và giá bitcoin hiện tại là 1.401 tỷ VND/bit Vậy bạn có thể có lãi với máy đào đó không, nếu có thì bao nhiêu tiền/ngày Công thức time = difficulty * 2^32 / hashrate