Bên cạnh đó, chúng tôi cũng giới thiệu sơ qua về phần mềm Matlab, là một chương trình dùng để mô tả, tính toán các bài toán kỹ thuật được sử dụng rất thông dụng hiện nay.. Mục tiêu: Sau
Gi ớ i thi ệ u v ề c ấ u trúc d ữ li ệ u và gi ả i thu ậ t
T ừ bài toán đến chương trình
Để viết một chương trình giải phương trình bậc hai dạng ax² + bx + c = 0, bước đầu tiên là hiểu rõ phương pháp giải bằng lời thông thường của người làm toán Tiếp theo, để máy tính có thể giải bài toán này, chúng ta cần xác định các bước cần thiết trong lập trình, như tính discriminant và xác định nghiệm phù hợp dựa trên giá trị của nó Việc sử dụng các công thức toán học chuẩn giúp đảm bảo chương trình thực hiện chính xác và hiệu quả trong việc tìm nghiệm của phương trình.
- Mô tả các bước giải bài toán.
- Vẽ sơ đồ xử lý dựa trên các bước.
- Dựa trên sơ đồ xử lý để viết chương trình xử lý bằng ngôn ngữ giả (ngôn ngữ bình thường của chúng ta).
- Chọn ngôn ngữ lập trình và chuyển chương trình từ ngôn ngữ giả sang ngôn ngữ lập trình để tạo thành một chương trình hoàn chỉnh.
- Thực hiện chương trình: nhập vào các tham số, nhận kết quả.
Trong nhiều trường hợp, từ bài toán thực tế chúng ta phải xây dựng mô hình toán rồi mới xác định được các bước để giải.
Gi ả i thu ậ t
Giải thuật là hệ thống các quy tắc rõ ràng và chặt chẽ để xác định một chuỗi các thao tác trên dữ liệu đầu vào Nó hướng tới việc thực hiện các bước một cách có hệ thống, nhằm đảm bảo sau một số bước hữu hạn, thu về kết quả của bài toán Giải thuật đóng vai trò quan trọng trong lập trình và xử lý dữ liệu, giúp tối ưu quá trình xử lý thông tin và đạt được kết quả chính xác.
1 Các đặt trưng của giải thuật
Tính kết thúc: Giải thuật phải dừng sau một số hữu hạn bước
Tính xác định trong xử lý máy tính đảm bảo rằng các thao tác thực hiện được chính xác và nhất quán, phản ánh yêu cầu về độ tin cậy của thuật toán Điều này đồng nghĩa với việc mỗi bước của cùng một giải thuật phải cho ra kết quả giống nhau trên các máy tính khác nhau, đảm bảo tính đúng đắn và khả năng dự đoán của hệ thống Tính xác định là yếu tố then chốt để xây dựng các ứng dụng phần mềm đáng tin cậy và hiệu quả.
Tính phổ dụng: Giải thuật phải "vét' hết các trường hợp và áp dụng cho một loạt bài toán cùng loại
Tính hiệu quả: Một giải thuật được đánh giá là tốt nếu nó đạt hai tiêu chuẩn sau:
- Thực hiện nhanh, tốn ít thời gian
- Tiêu phí ít tài nguyên của máy, chẳng hạn tốn ít bộ nhớ
2 Ngôn ngữ biểu diễn giải thuật
Có hai loại ngôn ngữ thường dùng: ngôn ngữ tự nhiên và ngôn ngữ sơ đồ (còn gọi là lưu đồ). a) Ngôn ngữ tự nhiên
Ngôn ngữ tự nhiên là ngôn ngữ hàng ngày mà chúng ta sử dụng để giao tiếp Chúng ta có thể tận dụng ngôn ngữ tự nhiên để mô tả các thuật toán, giúp làm rõ quá trình xử lý và giải thích các phương pháp lập trình một cách dễ hiểu Việc sử dụng ngôn ngữ tự nhiên trong mô tả thuật toán không chỉ nâng cao khả năng truyền đạt thông tin mà còn hỗ trợ trong việc tối ưu hóa quá trình học tập và phát triển phần mềm.
Ví dụ: Ta có giải thuật giải phương trình bậc nhất dạng ax + b = 0 như sau:
Bước 1: Nhận giá trị của các tham số a, b Bước 2: Xét giá trị của a xem có bằng 0 hay không? Nếu a=0 thì làm bước 3, nếu a khác không thì làm bước 4
Bước 3: (a bằng 0) Nếu b bằng 0 thì ta kết luận phương trình vô số nghiệm, nếu b khác 0 thì ta kết luận phương trình vô nghiệm.
Bước 4: ( a khác 0) Ta kết luận phương trình có nghiệm x=-b/a b) Ngôn ngữ sơ đồ (Lưu đồ)
Ngôn ngữ sơ đồ (lưu đồ) là một ngôn ngữ đặc biệt dùng để mô tả giải thuật bằng các sơ đồ hình khối rõ ràng Mỗi khối trong sơ đồ quy định một hành động cụ thể, giúp dễ dàng hình dung và phân tích quá trình thực hiện Ngôn ngữ này thường được sử dụng trong lập trình và thiết kế hệ thống để trình bày giải pháp một cách trực quan và logic.
Khối Tác dụng (Ý nghĩa của hành động) Khối Tác dụng (Ý nghĩa của hành động)
Bắt đầu/ Kết thúc Nhập / Xuất Thi hành Đường điChương trình conKhối nối
Chựa chọn Lời chú thích
Chẳng hạn ta dùng lưu đồ để biểu diễn giải thuật giải phương trình bậc nhất nêu trên như sau:
Nghiệm x =-b/a Phương trình vô nghiệm Phương trình vô định
3 Cấu trúc suy luận cơ bản của giải thuật
Giải thuật được thiết kế dựa trên ba cấu trúc suy luận cơ bản, bao gồm: cấu trúc tuần tự (Sequential), trong đó các công việc được thực hiện lần lượt theo trình tự; cấu trúc lựa chọn (Selection), cho phép hệ thống đưa ra quyết định dựa trên điều kiện; và cấu trúc lặp lại (Repetition), giúp lặp đi lặp lại một số lệnh nhằm xử lý các phần dữ liệu hoặc tác vụ liên tiếp.
Lựa chọn một công việc để thực hiện căn cứ vào một điều kiện nào đó Có một số dạng như sau:
- Cấu trúc 1: Nếu < điều kiện> (đúng) thì thực hiện
- Cấu trúc 2: Nếu < điều kiện> (đúng) thì thực hiện , ngược lại
(điều kiện sai) thì thực hiện
- Cấu trúc 3: Trường hợp < i> thực hiện
Thực hiện lặp lại một công việc không hoặc nhiều lần căn cứ vào một điều kiện nào đó Có hai dạng như sau:
- Lặp xác định: là loại lặp mà khi viết chương trình, người lập trình đã xác định được công việc sẽ lặp bao nhiêu lần
Lặp không xác định là loại lặp trong lập trình mà số lần lặp chưa được xác định từ trước, người lập trình không biết chính xác bao nhiêu lần sẽ xảy ra Số lần lặp này sẽ được xác định trong quá trình thực thi chương trình, dựa trên điều kiện của quá trình lặp Điều này giúp các chương trình linh hoạt hơn và phù hợp với các tình huống không thể dự đoán trước.
Trong một số trường hợp người ta cũng có thể dùng các cấu trúc này để diễn tả một giải thuật.
Kiểu dữ liệu
Kiểu dữ liệu là tập hợp các giá trị có cùng tính chất và các phép toán thao tác trên chúng, đóng vai trò quan trọng trong lập trình Có hai loại kiểu dữ liệu chính: kiểu dữ liệu sơ cấp và kiểu dữ liệu có cấu trúc, mỗi loại đều phục vụ các mục đích khác nhau trong việc xử lý dữ liệu và xây dựng hệ thống phần mềm.
1 Kiểu dữ liệu sơ cấp
Kiểu dữ liệu sơ cấp là kiểu dữ liệu mà giá trị của nó là đơn nhất
Ví dụ: Trong ngôn ngữ lập trình C, kiểu int gọi là kiểu sơ cấp vì kiểu này bao gồm các số nguyên từ -32768 đến 32767.
2 Kiểu dữ liệu có cấu trúc
Kiểu dữ liệu có cấu trúc là kiểu dữ liệu mà các giá trị của nó là sự kết hợp của các giá trị khác.
Ví dụ: Kiểu chuỗi ký tự trong ngôn ngữ lập trình C là một kiểu dữ liệu có cấu trúc
Trong các ngôn ngữ lập trình, kiểu dữ liệu chuẩn như int, char trong C hay integer, array trong Pascal đóng vai trò quan trọng trong việc xây dựng chương trình Bên cạnh đó, hầu hết các ngôn ngữ đều cung cấp cơ chế giúp lập trình viên định nghĩa kiểu dữ liệu riêng của mình để tùy biến phù hợp với yêu cầu của dự án Việc sử dụng các kiểu dữ liệu linh hoạt này giúp nâng cao khả năng tổ chức và tối ưu hóa mã nguồn, đảm bảo hiệu quả và dễ bảo trì cho phần mềm.
Ngôn ng ữ l ậ p trình
1 Khái niệm về ngôn ngữ lập trình
Ngôn ngữ lập trình là một ngôn ngữ dùng để viết chương trình cho máy tính
Ta có thể chia ngôn ngữ lập trình thành các loại sau: ngôn ngữ máy, hợp ngữ và ngôn ngữ cấp cao
Ngôn ngữ máy là các chỉ thị dưới dạng mã nhị phân, can thiệp trực tiếp vào các mạch điện tử, giúp chương trình thực hiện ngay lập tức mà không qua bước trung gian nào Tuy nhiên, việc viết chương trình bằng ngôn ngữ máy dễ dẫn đến sai sót, cồng kềnh và khó đọc, do toàn bộ đều là các dãy số 0 và 1, gây khó hiểu và hạn chế khả năng lập trình.
Hợp ngữ (assembly language) là ngôn ngữ lập trình cấp thấp bao gồm danh sách các câu lệnh và quy tắc viết các câu lệnh đó Mỗi câu lệnh trong hợp ngữ gồm có hai phần chính: mã lệnh, được viết bằng tiếng Anh, thể hiện phép toán cần thực hiện, và địa chỉ chứa toán hạng của phép toán đó.
INPUT a ; Nhập giá trị cho a từ bàn phím
LOAD a ; Đọc giá trị a vào thanh ghi tổng A
PRINT a; Hiển thị giá trị của a ra màn hình
ADD b; Cộng giá trị của thanh ghi tổng A với giá trị b
Trong các lệnh như INPUT, LOAD, PRINT, ADD, thì các từ khóa này là mã lệnh còn a, b là địa chỉ bộ nhớ Để máy có thể thực hiện một chương trình viết bằng hợp ngữ, chương trình đó cần được dịch sang ngôn ngữ máy Công cụ chuyên thực hiện việc chuyển đổi này gọi là Assembler, đóng vai trò quan trọng trong quá trình lập trình hợp ngữ.
Ngôn ngữ cấp cao được phát triển nhằm phản ánh cách tư duy của người lập trình, gần gũi với ngôn ngữ tự nhiên nhưng chính xác như ngôn ngữ toán học Với sự đa dạng của các thế hệ máy tính, các ngôn ngữ lập trình cấp cao cũng ngày càng phong phú, mở ra nhiều hướng lập trình khác nhau như lập trình cấu trúc, hướng đối tượng, logic và hàm Chương trình viết bằng ngôn ngữ cấp cao gọi là chương trình nguồn, và để máy tính hiểu cũng như thực thi các lệnh trong chương trình nguồn, cần có chương trình dịch để chuyển đổi chúng thành dạng có thể thực thi được.
Để chuyển đổi từ chương trình nguồn sang chương trình đích, cần có một chương trình dịch phù hợp Mỗi ngôn ngữ lập trình cấp cao thường đi kèm với một trình dịch riêng biệt, tuy nhiên, phương pháp dịch có hai loại chính là thông dịch và biên dịch.
Thông dịch (interpreter): Là cách dịch từng lệnh một, dịch tới đâu thực hiện tới đó Chẳng hạn ngôn ngữ LISP sử dụng trình thông dịch
Biên dịch (compiler): Dịch toàn bộ chương trình nguồn thành chương trình đích rồi sau đó mới thực hiện Các ngôn ngữ sử dụng trình biên dịch như Pascal, C
Thông dịch và biên dịch khác nhau về cách thực thi chương trình, trong đó thông dịch thực thi đồng thời khi dịch, còn biên dịch dịch toàn bộ trước rồi mới thực thi Vì vậy, chương trình viết bằng ngôn ngữ biên dịch thường có tốc độ thực thi nhanh hơn so với chương trình viết bằng ngôn ngữ thông dịch.
Java là một ngôn ngữ lập trình sử dụng kết hợp giữa biên dịch và thông dịch Quá trình biên dịch chuyển đổi mã nguồn Java thành một chương trình đối tượng (mã trung gian), sau đó khi thực thi, từng lệnh trong chương trình đối tượng được thông dịch thành mã máy để chạy trên máy tính.
Bài t ậ p
Bằng ngôn ngữ tự nhiên và lưu đồ, hãy mô tả giải thuật cho các bài toán sau:
1 Giải phương trình bậc 2 dạng ax 2 + bx + c = 0 với a, b, c là các số sẽ nhập từ bàn phím
2.Tính tổng bình phương của n số nguyên có dạng sau: S= 2 2 2
1 a a n a + + + , với n và ai (i=1 n) là các số sẽ nhập từ bàn phím.
3 Tính tổng có dạng sau: S= 3 2 2
1 − a + a − a + + − n a n , với n và ai (i=1 n) là các số sẽ nhập từ bàn phím.
Gi ớ i thi ệ u v ề ngôn ng ữ c và môi trườ ng turbo C 3.0
Tổng quan về ngôn ngữ lập trình C
C là ngôn ngữ lập trình cấp cao, được sử dụng rất phổ biến để lập trình hệ thống cùng với Assembler và phát triển các ứng dụng.
Vào cuối những năm 1960 và đầu những năm 1970, Dennis Ritchie tại phòng thí nghiệm Bell đã phát triển ngôn ngữ lập trình C dựa trên ngôn ngữ BCPL của Martin Richards (1967) và ngôn ngữ B của Ken Thompson (1970) Ngôn ngữ C được cài đặt lần đầu tiên trên hệ điều hành UNIX của máy DEC PDP-11, đánh dấu bước ngoặt quan trọng trong sự phát triển của các ngôn ngữ lập trình hiện đại.
Năm 1978, Dennish Ritchie và B.W Kernighan đã cho xuất bản quyển
“Ngôn ngữ lập trình C” và được phổ biến rộng rãi đến nay.
Ban đầu, ngôn ngữ lập trình C được thiết kế để hoạt động trong môi trường Unix nhằm hỗ trợ các công việc lập trình phức tạp Tuy nhiên, do nhu cầu phát triển ngày càng cao của ngành lập trình, C vượt ra khỏi giới hạn của phòng thí nghiệm Bell và nhanh chóng trở thành ngôn ngữ phổ biến trong cộng đồng lập trình Nhiều công ty phần mềm lần lượt phát triển các phiên bản hỗ trợ lập trình bằng C, qua đó chuẩn ANSI C cũng được ra đời để thiết lập tiêu chuẩn chung cho ngôn ngữ này.
Ngôn ngữ lập trình C là một ngôn ngữ lập trình hệ thống rất mạnh và rất
Ngôn ngữ lập trình C có tính linh hoạt cao nhờ vào thư viện phong phú các hàm đã được xây dựng sẵn, giúp người lập trình tận dụng để giải quyết các bài toán mà không cần phải viết lại từ đầu C còn hỗ trợ đa dạng phép toán, phù hợp cho các bài toán kỹ thuật phức tạp với nhiều công thức phức tạp Ngoài ra, ngôn ngữ này cho phép người dùng tự định nghĩa các kiểu dữ liệu trừu tượng, mở rộng khả năng lập trình Tuy nhiên, các người mới bắt đầu học lập trình C thường gặp phải những khó khăn liên quan đến cú pháp và cách sử dụng các hàm, dẫn đến cảm giác rắc rối khi làm quen với ngôn ngữ này.
“hơi khó hiểu” do sự “mềm dẻo” của C Dù vậy, C được phổ biến khá rộng rãi và
14 đã trở thành một công cụ lập trình mạnh mẽ, được sử dụng như một ngôn ngữ chính trong việc phát triển phần mềm ngày nay Ngôn ngữ lập trình này được ưa chuộng nhờ tính linh hoạt và khả năng mở rộng, giúp các lập trình viên dễ dàng xây dựng các ứng dụng phức tạp Sử dụng 14 trong phát triển phần mềm mang lại hiệu quả cao, tiết kiệm thời gian và nâng cao năng suất lập trình.
Ngôn ngữ C có những đặc điểm cơ bản sau:
Tính cô đọng (compact): C chỉ có 32 từ khóa chuẩn và 40 toán tử chuẩn, nhưng hầu hết đều được biểu diễn bằng những chuỗi ký tự ngắn gọn
Tính cấu trúc của ngôn ngữ C đề cập đến việc sử dụng các chỉ thị lập trình như cấu trúc lựa chọn và lặp để tổ chức chương trình một cách rõ ràng, dễ hiểu Nhờ đó, các chương trình viết bằng C trở nên logic, dễ bảo trì và nâng cấp hơn Tính cấu trúc giúp người lập trình xây dựng mã nguồn rõ ràng, tối ưu hóa quá trình phát triển phần mềm.
C có bộ tiền xử lý và thư viện chuẩn phong phú, đảm bảo tính tương thích cao khi chuyển các chương trình viết bằng C giữa các máy tính khác nhau Điều này giúp các lập trình viên dễ dàng duy trì và vận hành phần mềm mà không lo về vấn đề xung đột hoặc lỗi tương thích giữa các hệ thống Tính tương thích của ngôn ngữ C là một trong những điểm mạnh nổi bật, giúp đảm bảo sự linh hoạt và ổn định trong quá trình phát triển phần mềm đa nền tảng.
C là một ngôn ngữ lập trình linh hoạt và uyển chuyển, với cú pháp dễ dàng chấp nhận nhiều cách thể hiện khác nhau Nhờ tính linh động này, lập trình viên có thể tối ưu hóa mã nguồn, giúp giảm kích thước của các lệnh lệnh và tăng tốc độ chạy của chương trình Điều này làm cho C trở thành lựa chọn lý tưởng cho các ứng dụng cần tối đa hiệu suất và hiệu quả.
Chương trình biên dịch C cho phép chuyển đổi nhiều tập tin chương trình riêng lẻ thành các tập tin đối tượng (object files), sau đó liên kết chúng lại với nhau để tạo thành một chương trình thực thi có thể chạy được (executable) Quá trình này giúp quản lý mã nguồn dễ dàng hơn và tối ưu hóa quy trình phát triển phần mềm Việc biên dịch và liên kết đóng vai trò quan trọng trong xây dựng các ứng dụng phức tạp, đảm bảo tính modular và khả năng mở rộng của chương trình.
Môi trườ ng l ậ p trình TURBO C
Turbo C là môi trường lập trình C do hãng Borland phát triển, giúp hỗ trợ người dùng trong việc soạn thảo, dịch và thực thi các chương trình C một cách dễ dàng Phiên bản Turbo C 3.0 là phiên bản được sử dụng phổ biến nhất, nổi bật với các tính năng tiện lợi phù hợp cho lập trình viên Đây là công cụ lý tưởng để học tập, phát triển và thử nghiệm các dự án lập trình C hiệu quả.
Chạy Turbo C cũng giống như chạy các chương trình khác trong môi trường DOS hay Windows, màn hình sẽ xuất hiện menu của Turbo C có dạng như sau:
Dòng trên cùng gọi là thanh menu (menu bar) Mỗi mục trên thanh menu lại có thể có nhiều mục con nằm trong một menu kéo xuống
Dòng dưới cùng ghi chức năng của một số phím đặc biệt, giúp người dùng dễ dàng nhận biết tác dụng của các phím như F1 Ví dụ, khi nhấn phím F1, hệ thống sẽ mở hệ thống trợ giúp, cung cấp nhiều thông tin hữu ích để hỗ trợ người dùng trong quá trình sử dụng máy tính Việc hiểu rõ chức năng của các phím đặc biệt như F1 giúp nâng cao hiệu quả làm việc và trải nghiệm người dùng.
Để truy cập vào thanh menu ngang trong một hệ thống, bạn chỉ cần nhấn phím F10 Sau đó, sử dụng các phím mũi tên trái hoặc phải để di chuyển vùng sáng đến mục mong muốn Khi đã chọn đúng mục, nhấn phím Enter để xác nhận và truy cập nội dung mong muốn.
Trong menu kéo xuống ta lại dùng các phím mũi tên lên xuống để di chuyển vùng sáng tới mục cần chọn rồi gõ Enter
Bạn có thể dễ dàng chọn một mục trên thanh menu bằng cách giữ phím Alt và nhập ký tự đại diện của mục đó, ký tự này sẽ có màu sắc khác để dễ nhận biết Ví dụ, để chọn mục File, bạn chỉ cần nhấn Alt-F, trong đó F là ký tự đại diện của mục File, giúp thao tác trở nên nhanh chóng và tiện lợi hơn khi sử dụng máy tính.
2 Soạn thảo chương trình mới
Muốn soạn thảo một chương trình mới ta chọn mục New trong menu File
Trên màn hình hiển thị vùng trống để soạn thảo nội dung chương trình, giúp người dùng dễ dàng nhập mã lệnh Trong quá trình lập trình, bạn có thể sử dụng các phím như Return để chỉnh sửa và điều hướng trong quá trình viết mã Việc nắm rõ các phím hỗ trợ này sẽ giúp việc soạn thảo trở nên nhanh chóng và hiệu quả hơn.
Các phím xem thông tin trợ giúp :
- F1: Xem toàn bộ thông tin trong phần trợ giúp
Phím Ctrl-F1 cung cấp chức năng Trợ giúp theo ngữ cảnh, phản hồi các thông tin liên quan dựa trên vị trí con trỏ trong mã nguồn Khi bạn đặt con trỏ vào một từ khóa, chẳng hạn như "int", và nhấn Ctrl-F1, hệ thống sẽ hiển thị các thông tin chi tiết về kiểu dữ liệu này Tính năng này giúp lập trình viên dễ dàng tra cứu và hiểu rõ hơn về các thành phần trong mã nguồn của mình Sử dụng Ctrl-F1 là cách nhanh chóng để truy cập hướng dẫn và tài nguyên hỗ trợ phù hợp với ngữ cảnh hiện tại trong quá trình lập trình.
Các phím di chuyển con trỏ trong vùng soạn thảo chương trình :
Phím Ý nghĩa Phím tắt ( tổ hợp phím)
Enter Đưa con trỏ xuống dòng
Mũi tên đi lên Đưa con trỏ lên hàng trước Ctrl-E
Mũi tên đi xuống Đưa con trỏ xuống hàng sau Ctrl-X
Mũi tên sang trái Đưa con trỏ sang trái một ký tự Ctrl-S
Mũi tên sang phải Đưa con trỏ sang phải một ký tự Ctrl-D
End Đưa con trỏ đến cuối dòng
Home Đưa con trỏ đến đầu dòng
PgUp Đưa con trỏ lên trang trước Ctrl-R
PgDn Đưa con trỏ xuống trang sau Ctrl-C Đưa con trỏ sang từ bên trái Ctrl-A Đưa con trỏ sang từ bên phải Ctrl-F
Các phím xoá ký tự/ dò ng :
Delete Xoá ký tự tại ví trí con trỏ Ctrl-G
BackSpace Di chuyển sang trái đồng thời xoá ký tự đứng trước con Ctrl-H
16 trỏXoá một dòng chứa con trỏ Ctrl-Y
Xóa từ vị trí con trỏ đến cuối dòng Ctrl-Q-Y
Xóa ký tự bên phải con trỏ Ctrl-T
Các phím chèn ký tự/ dòng :
Insert Thay đổi viết xen hay viết chồng
Ctrl-N Xen một dòng trống vào trước vị trí con trỏ
Khối là một đoạn văn bản trong chương trình hình chữ nhật, được xác định bởi điểm đầu là góc trên bên trái và điểm cuối là góc dưới bên phải của hình chữ nhật Khi một khối đã được chọn (hiện rõ bằng màu sắc khác so với phần nền), người dùng có thể sao chép, di chuyển hoặc xóa khối một cách dễ dàng Việc sử dụng khối giúp soạn thảo chương trình nhanh chóng và hiệu quả hơn Các thao tác chính trên khối bao gồm chép, di chuyển và xóa, giúp tối ưu quá trình lập trình và chỉnh sửa nội dung trên màn hình.
Ctrl-K-B Đánh dấu đầu khối
Ctrl-K-K Đánh dấu cuối khối
Ctrl-K-C Chép khối vào sau vị trí con trỏ
Ctrl-K-V Chuyển khối tới sau vị trí con trỏ
Ctrl-K-W Ghi khối vào đĩa như một tập tin
Ctrl-K-R Đọc khối (tập tin) từ đĩa vào sau vị trí con trỏ Ctrl-K-H Tắt/mở khối
Ctrl-K-T Đánh dấu từ chứa chon trỏ
Các phím, phím tắt thực hiện các thao tác khác :
F10 Kích hoạt menu chính Ctrl-K-D,
Ctrl-K-Q F2 Lưu chương trình đang soạn vào đĩa Ctrl-K-S
Tab Di chuyển con trỏ một khoảng đồng thời đẩy dòng văn bản Ctrl-I
ESC Hủy bỏ thao tác lệnh Ctrl-U Đóng tập tin hiện tại Alt-F3
Hiện hộp thoại tìm kiếm Ctrl-Q-F
Hiện hộp thoại tìm kiếm và thay thế Ctrl-Q-A
Tìm kiếm tiếp tục Ctrl-L
Ví dụ: Bạn hãy gõ đoạn chương trình sau:
{ char ten[50]; printf(“Xin cho biet ten cua ban !”); scanf(“%s”,ten); printf(“Xin chao ban %s”,ten); getch(); return 0;
3 Ghi chương trình đang soạn thảo vào đĩa
Sử dụng File/Save hoặc gõ phím F2 Có hai trường hợp xảy ra:
Khi chương trình chưa được ghi lần nào, một hội thoại sẽ xuất hiện để yêu cầu bạn xác định tên tập tin (File Name) Tên tập tin cần tuân thủ quy tắc đặt tên của DOS và không cần phần mở rộng, vì phần mở rộng tự động thêm vào là C hoặc CPP (thông tin chi tiết sẽ được trình bày trong phần Option) Sau khi nhập tên tập tin, bạn chỉ cần nhấn phím Enter để tiếp tục.
- Nếu chương trình đã được ghi một lần rồi thì nó sẽ ghi những thay đổi bổ sung lên tập tin chương trình cũ
Quy tắc đặt tên tập tin của DOS: Tên của tập tin gồm 2 phần:Phần tên và phần mở rộng
Tên phần phải bắt đầu bằng một ký tự từ a đến z (không phân biệt hoa thường), sau đó có thể là các ký tự a–z, ký số từ 0–9 hoặc dấu gạch dưới (_) và độ dài tối đa là 8 ký tự Điều này giúp đảm bảo tính nhất quán và dễ quản lý trong hệ thống, cải thiện khả năng đọc hiểu và tối ưu hóa cho các công cụ tìm kiếm Việc đặt tên phần đúng chuẩn còn nâng cao khả năng duy trì, mở rộng và tối ưu hóa nội dung trong quá trình phát triển.
- Phần mở rộng dài tối đa 3 ký tự.
Ví dụ: Ghi chương trình vừa soạn thảo trên lên đĩa với tên là CHAO.C
4 Thực hiện chương trình Để thực hiện chương trình hãy dùng Ctrl-F9 (giữ phím Ctrl và gõ phím F9)
Chạy chương trình vừa soạn thảo xong và quan sát kết quả trên màn hình để kiểm tra quá trình thực thi Sau khi xem xong, nhấn phím bất kỳ để quay lại giao diện Turbo, giúp dễ dàng tiếp tục các thao tác lập trình và kiểm thử.
5 Mở một chương trình đã có trên đĩa
Bạn có thể mở một chương trình đã có trên đĩa để thực hiện chỉnh sửa hoặc bổ sung bằng cách sử dụng lệnh File/Open hoặc nhấn phím F3, giúp dễ dàng truy cập và chỉnh sửa nội dung một cách nhanh chóng.
Sau đó gõ tên tập tin vào hộp File Name hoặc lựa chọn tập tin trong danh sách các tập tin rồi gõ Enter
Ví dụ: Mở tập tin CHAO.C sau đó bổ sung để có chương trình mới như sau:
{ char ten[50]; printf(“Xin cho biet ten cua ban !”); scanf(“%s”,ten); printf(“Xin chao ban %s\n “,ten); printf(“Chao mung ban den voi Ngon ngu lap trinh C”); getch(); return 0;
Ghi lại chương trình này (F2) và cho thực hiện (Ctrl-F9) Hãy so sánh xem có gì khác trước?
6 Thoát khỏi TURBO C và trở DOS (hay Windows)
Dùng File/Exit hoặc Alt-X
7 Sử dụng một số lệnh trên thanh menu a) Các lệnh trên menu File (Alt -F)
- Lệnh New : Dùng để tạo mới một chương trình
Tên ngầm định của chương trình là NONAMEXX.C
(XX là 2 số từ 00 đến 99).
Lệnh Open trong phần mềm dùng để mở một chương trình đã có sẵn trên đĩa, nhằm sửa chữa, bổ sung hoặc thực hiện chương trình đó Khi mở tập tin, nội dung của chương trình được hiển thị trong vùng soạn thảo giúp người dùng dễ dàng chỉnh sửa và quản lý mã nguồn.
Khi bạn nhập tên tập tin chưa tồn tại, chương trình sẽ tự động tạo mới tập tin đó Sau lần lưu đầu tiên, các dữ liệu sẽ được lưu vào tập tin với tên đã chọn, giúp bạn dễ dàng truy xuất và quản lý dữ liệu trong các lần làm việc sau Việc này đảm bảo quá trình lưu trữ diễn ra thuận tiện và an toàn, phù hợp với các quy trình làm việc cần tương tác với các tập tin mới hoặc chưa tồn tại trước đó.
- Lệnh Save : Dùng để lưu chương trình đang soạn thảo vào đĩa.
- Lệnh Save as : Dùng để lưu chương trình đang soạn thảo với tên khác, hộp thoại lưu tập tin đang soạn với tên khác như sau:
Lệnh Save All trong Turbo C cho phép người dùng lưu tất cả các thay đổi trên tất cả các chương trình đang mở cùng một lúc, giúp bảo vệ các công việc đang tiến hành hiệu quả Khi làm việc với Turbo C, bạn có thể mở nhiều chương trình để sửa chữa và bổ sung mã nguồn, và lệnh Save All sẽ đảm bảo lưu tất cả các chỉnh sửa đó một cách nhanh chóng và an toàn Việc sử dụng lệnh Save All giúp tránh mất dữ liệu khi có sự cố hoặc khi cần thoát khỏi phần mềm một cách nhanh chóng Đây là một lệnh quan trọng để đảm bảo an toàn cho các dự án lập trình của bạn trong môi trường Turbo C.
- Lệnh Change Dir : Dùng để đổi thư mục hiện hành,
- Lệnh Print : Dùng để in chương trình đang soạn thảo ra máy in.
- Lệnh Printer Setup : Dùng để thiết đặt một số thông số cho máy in
- Lệnh DOS Shell : Dùng để thoát tạm thời về DOS, để trở lại Turbo C ta đánh Exit rồi nhấn Enter
- Lệnh Exit : Dùng để thoát khỏi Turbo C. b) Các lệnh trên menu Edit (Alt -E)
- Lệnh Undo : Dùng để hủy bỏ thao tác soạn thảo cuối cùng trên cửa số soạn thảo
- Lệnh Redo : Dùng để phục hồi lại thao tác đã bị
- Lệnh Cut : Dùng để xóa một phần văn bản đã được đánh dấu khối, phần dữ liệu bị xóa sẽ được lưu vào
(tên cũ) Tên mới ( kể cả tên thư mục)
20 một vùng nhớ đặc biệt gọi là Clipboard
- Lệnh Copy : Dùng để chép phần chương trình đã được đánh dấu khối vào Clipboard
- Lệnh Paste : Dùng để dán phần chương trình đang được lưu trong
Clipboard vào của số đang soạn thảo, bắt đầu tại vị trí của con trỏ
- Lệnh Clear : Dùng để xóa phần dữ liệu đã được đánh dấu khối, dữ liệu bị xóa không được lưu vào Clipboard.
- Lệnh Show clipboard : Dùng để hiển thị phần chương trình đang được lưu trong Clipboard trong một cửa sổ mới. c) Các lệnh trên menu Search (Alt-S)
Lệnh Find được sử dụng để tìm kiếm một cụm từ trong văn bản chương trình, giúp người dùng nhanh chóng xác định vị trí của nội dung cần thiết Khi tìm thấy cụm từ, con trỏ sẽ tự động di chuyển đến đoạn văn bản phù hợp, nâng cao hiệu quả chỉnh sửa và soạn thảo Hộp thoại Find cung cấp các tùy chọn để tùy chỉnh quá trình tìm kiếm, đảm bảo phù hợp với nhu cầu của người dùng Các lựa chọn trong hộp thoại giúp xác định phạm vi tìm kiếm, phân biệt chữ hoa chữ thường, và các hoạt động thay thế, hỗ trợ tối đa quá trình chỉnh sửa và tối ưu hóa công việc lập trình.
▪ Case sentitive: Phân biệt chữ IN HOA với chữ in thường trong khi so sánh cụm từ cần tìm với văn bản chương trình.
▪ Whole word only: Một đoạn văn bản chương trình trùng với toàn bộ cụm từ cần tìm thì mới được xem là tìm thấy
▪ Regular expression: Tìm theo biểu thức.
▪ Global: Tìm trên tất cả tập tin đang mở.
▪ Forward: Tìm đến cuối tập tin.
▪ Selected text: Chỉ tìm trong khối văn bản đã được đánh dấu.
▪ Backward: Tìm đến đầu tập tin
▪ From cursor : Bắt đầu từ vị trí con nháy
▪ Entire scope: Bắt đầu tại vị trí đầu tiên của khối hoặc tập tin
- Lệnh Replace : Dùng để tìm kiếm một đoạn văn bản nào đó, và tự động thay bằng một đoạn văn bản khác, hộp thoại replace như sau:
Nhập cụm từ cần tìm vào đây
- Lệnh Search again : Dùng để thực hiện lại việc tìm kiếm.
- Các lệnh còn lại trên menu Search, các bạn sẽ tìm hiểu thêm khi thực hành trực tiếp trên máy tính d) Các lệnh trên menu Run (Alt-R)
- Lệnh Run : Dùng để thực thi hay
- Lệnh Step over : Dùng để “chạy” chương trình từng bước (từng dòng lệnh).
Th ự c hành
Hãy tạo một chương trình trong phần 5 và thực thi nó trong phần mềm TURBO 3.0
Các thành ph ần cơ b ả n c ủ a ngôn ng ữ C
Bộ chữ viết trong C
Bộ chữ viết trong ngôn ngữ C bao gồm những ký tự, ký hiệu sau: (phân biệt chữ in hoa và in thường):
- Các ký hiệu toán học: +, -, *, /, =, , (, )
- Các ký hiệu đặc biệt: : , ; “ ' _ @ # $ ! ^ [ ] { }
- Dấu cách hay khoảng trống.
Các t ừ khóa trong C
Reserved words in C are predefined keywords that programmers can use according to their specific meanings within a program However, these keywords must not be used to name variables or identifiers Turbo C 3.0 includes a variety of reserved words such as asm, auto, break, case, cdecl, char, class, const, continue, _cs, default, delete, do, double, _ds, else, enum, _es, extern, _export, far, _fastcall, float, for, friend, goto, huge, if, inline, and int, which are essential for writing syntactically correct and efficient C programs Proper understanding and usage of these reserved words are crucial for effective programming in C.
25 interrupt _loadds long near new operator pascal private protected public register return
_saveregs _seg short signed sizeof _ss static struct switch template this typedef union unsigned virtual void volatile while
C ặ p d ấ u ghi chú thích
Trong quá trình viết chương trình, việc thêm các lời ghi chú giúp ghi nhớ và dễ dàng sửa đổi mã nguồn sau này Chú thích không ảnh hưởng đến quá trình biên dịch của chương trình Trong ngôn ngữ lập trình C, các chú thích trên nhiều dòng phải đặt trong cặp dấu /* và */, còn chú thích trên cùng một dòng thì dùng dấu // để đảm bảo rõ ràng và đúng cú pháp.
Trong lập trình C, để khai báo biến kiểu ký tự với độ dài 50 ký tự, ta sử dụng cú pháp `char ten[50];` Để lấy tên của người dùng, chương trình hiển thị câu hỏi "Xin cho biết tên của bạn!", sau đó sử dụng hàm `scanf("%s", ten);` để nhập tên từ bàn phím Cuối cùng, chương trình có thể chờ người dùng nhấn phím để kết thúc bằng cách sử dụng `getch();` và kết thúc chương trình với `return 0;`.
Các kiểu dữ liệu sơ cấp chuẩn trong C
Các kiểu dữ liệu sơ cấp chuẩn trong C có thể được chia làm 2 dạng : kiểu số nguyên, kiểu số thực.
Kiểu số nguyên là kiểu dữ liệu dùng để lưu trữ các giá trị nguyên hay còn gọi là kiểu đếm được trong lập trình C Trong C, kiểu số nguyên được chia thành các kiểu dữ liệu con, mỗi kiểu có phạm vi giá trị riêng biệt, giúp tối ưu hoá bộ nhớ và hiệu suất Một trong những kiểu số nguyên phổ biến là kiểu số nguyên 1 byte (8 bits), có khả năng lưu trữ các giá trị trong phạm vi từ -128 đến 127 hoặc 0 đến 255, tùy thuộc vào kiểu ký tự hoặc kiểu số có dấu hoặc không dấu.
Kiểu số nguyên một byte gồm có 2 kiểu sau:
STT Kiểu dữ liệu Miền giá trị (Domain)
Từ 0 đến 255 (tương đương 256 ký tự trong bảng mã ASCII)
Kiểu unsigned char: lưu các số nguyên dương từ 0 đến 255
Để khai báo một biến kiểu ký tự trong lập trình, ta sử dụng kiểu unsigned char Mỗi giá trị trong phạm vi của kiểu unsigned char tương ứng với một ký tự trong bảng mã ASCII, giúp xử lý các ký tự dễ dàng và chính xác.
Kiểu char: lưu các số nguyên từ -128 đến 127 Kiểu char sử dụng bit trái nhất để làm bit dấu
=> Nếu gán giá trị > 127 cho biến kiểu char thì giá trị của biến này có thể là số âm (?). b) Kiểu số nguyên 2 bytes (16 bits)
Kiểu số nguyên 2 bytes gồm có 4 kiểu sau:
STT Kiểu dữ liệu Miền giá trị (Domain)
Kiểu enum, short int, int : Lưu các số nguyên từ -32768 đến 32767 Sử dụng bit bên trái nhất để làm bit dấu
=> Nếu gán giá trị >32767 cho biến có 1 trong 3 kiểu trên thì giá trị của biến này có thể là số âm
Kiểu unsigned int: Kiểu unsigned int lưu các số nguyên dương từ 0 đến
65535 c) Kiểu số nguyên 4 byte (32 bits)
Kiểu số nguyên 4 bytes hay còn gọi là số nguyên dài (long) gồm có 2 kiểu sau:
STT Kiểu dữ liệu Miền giá trị (Domain)
Kiểu long : Lưu các số nguyên từ -2147483658 đến 2147483647 Sử dụng bit bên trái nhất để làm bit dấu
=> Nếu gán giá trị >2147483647 cho biến có 1 trong 3 kiểu trên thì giá trị của biến này có thể là số âm
Kiểu unsigned long: Kiểu unsigned long lưu các số nguyên dương từ 0 đến
Kiểu số thực dùng để lưu các số thực hay các số có dấu chấm thập phân gồm có 3 kiểu sau:
STT Kiểu dữ liệu Kích thước (Size) Miền giá trị (Domain)
3 long double 10 bytes Từ 3.4 *10 -4932 đến 1.1 *10 4932
Mỗi kiểu số thực đều có miền giá trị và độ chính xác riêng biệt, đặc biệt là các số số lẻ Tùy theo nhu cầu sử dụng, người lập trình có thể chọn khai báo biến thuộc một trong ba kiểu số thực phù hợp Việc lựa chọn kiểu số thực đúng giúp đảm bảo tính chính xác và tối ưu hóa hiệu suất của chương trình.
Ngoài ra ta còn có kiểu dữ liệu void, kiểu này mang ý nghĩa là kiểu rỗng không chứa giá trị gì cả.
Tên và h ằ ng trong C
Tên, còn gọi là danh biểu (identifier), được sử dụng để đặt cho chương trình, hằng, kiểu dữ liệu, biến, chương trình con và các thành phần khác trong lập trình Có hai loại tên chủ yếu là tên chuẩn do ngôn ngữ lập trình quy định và tên do người lập trình tự đặt nhằm dễ dàng nhận biết và quản lý mã nguồn Việc đặt tên rõ ràng, phù hợp giúp tăng khả năng đọc hiểu và bảo trì chương trình sau này.
Tên chuẩn là tên do C đặt sẵn như tên kiểu: int, char, float,…; tên hàm: sin, cos
Tên biến do lập trình viên đặt nhằm đại diện cho dữ liệu trong chương trình, giúp code trở nên rõ ràng và dễ hiểu Khi đặt tên biến, cần sử dụng bộ chữ cái, chữ số và dấu gạch dưới (_) để đảm bảo tính hợp lệ và hiện đại Tuy nhiên, tên biến phải tuân thủ các quy tắc nhất định như không bắt đầu bằng số, không dùng ký tự đặc biệt khác ngoài dấu gạch dưới, và nên đặt tên mang ý nghĩa mô tả rõ ràng về nội dung hoặc mục đích của biến đó Điều này không chỉ giúp cho việc lập trình trở nên dễ quản lý mà còn tối ưu hóa cho các tiêu chuẩn SEO trong tài liệu hướng dẫn hoặc bài viết kỹ thuật liên quan đến lập trình.
- Bắt đầu bằng một chữ cái hoặc dấu gạch dưới.
- Không có khoảng trống ở giữa tên.
- Không được trùng với từ khóa
- Độ dài tối đa của tên là 32 ký tự, tuy nhiên cần đặt sao cho rõ ràng, dễ nhận biết và dễ nhớ.
- Không cấm việc đặt tên trùng với tên chuẩn nhưng khi đó ý nghĩa của tên chuẩn không còn giá trị nữa.
Ví dụ: Tên do người lập trình đặt: Chieu_dai, Chieu_Rong, Chu_Vi, Dien_Tich
Tên không hợp lệ: Do Dai, 12A2,…
Là đại lượng không đổi trong suốt quá trình thực thi của chương trình.
Hằng số trong lập trình có thể là chuỗi ký tự, ký tự đơn hoặc số xác định, và có thể được biểu diễn hoặc định dạng theo nhiều dạng thức khác nhau Một loại hằng số phổ biến là hằng số thực, mang giá trị số thập phân hoặc các dạng số thực khác, đóng vai trò quan trọng trong việc xử lý các dữ liệu có phần thập phân trong chương trình.
Số thực bao gồm các giá trị kiểu float, double, long double được thể hiện theo 2 cách sau:
- Cách 1: Sử dụng cách viết thông thường mà chúng ta đã sử dụng trong các môn Toán, Lý, …Điều cần lưu ý là sửdụng dấu thập phân là dấu chấm (.);
- Cách 2: Sử dụng cách viết theo số mũ hay số khoa học Một số thực được tách làm 2 phần, cách nhau bằng ký tự e hay E
Phần giá trị: là một số nguyên hay số thực được viết theo cách 1
Phần mũ: là một số nguyên
Giá trị của số thực là: Phần giá trị nhân với 10 mũ phần mũ
Ví dụ: 1234.56e-3 = 1.23456 (là số 1234.56 * 10 -3 ) -123.45E4 = -1234500 ( là -123.45 *10 4 ) b) Hằng số nguyên
Số nguyên gồm các kiểu int (2 bytes), long (4 bytes) được thể hiện theo những cách sau.
Hằng số nguyên 2 bytes (int) trong hệ thập phân là kiểu số được sử dụng phổ biến để biểu diễn các giá trị nguyên trong lập trình Hệ thập phân sử dụng các ký số từ 0 đến 9 để thể hiện giá trị một cách dễ hiểu và chính xác Đây là kiểu dữ liệu cơ bản, thường xuyên được dùng trong các bài toán tính toán và xử lý dữ liệu.
Ví dụ: 123 ( một trăm hai mươi ba), -242 ( trừ hai trăm bốn mươi hai).
- Hằng số nguyên 2 byte (int) hệ bát phân: Là kiểu số nguyên sử dụng 8 ký số từ 0 đến 7 để biểu diễn một số nguyên.
Cách biểu diễn: 0
Ví dụ: 0345 (số 345 trong hệ bát phân)
- Hằng số nguyên 2 byte (int) hệ thập lục phân: Là kiểu số nguyên sử dụng
10 ký số từ 0 đến 9 và 6 ký tự A, B, C, D, E ,F để biểu diễn một số nguyên.
Cách biểu diễn: 0x
0x345 (số 345 trong hệ 16) 0x20 (số 20 trong hệ 16)
Số nguyên dài (long) trong lập trình Java được biểu diễn bằng 4 byte và thường có hậu tố là 'l' hoặc 'L' để phân biệt Khác với số int (2 bytes), số long cho phép biểu diễn các giá trị nguyên lớn hơn, nằm ngoài phạm vi của int, phù hợp cho các ứng dụng cần lưu trữ dữ liệu lớn hơn Đây là loại dữ liệu nguyên lý tưởng để xử lý các số dài hoặc khi yêu cầu mở rộng phạm vi giá trị.
- Các hằng số còn lại: Viết như cách viết thông thường (không có dấu phân cách giữa 3 số)
12 (mười hai) 12.45 (mười hai chấm 45) 1345.67 (một ba trăm bốn mươi lăm chấm sáu mươi bảy) c) Hằng ký tự
Hằng ký tự là ký tự riêng biệt được viết trong cặp dấu nháy đơn (‘) Mỗi ký tự này tương ứng với một giá trị trong bảng mã ASCII, giúp xác định chính xác ký tự trong lập trình và xử lý dữ liệu Hằng ký tự còn được coi là trị số nguyên, cho phép thao tác và tính toán dễ dàng hơn trong các ứng dụng lập trình.
Trong lập trình, chúng ta có thể thực hiện các phép toán số học trên hai ký tự bằng cách thao tác trên giá trị ASCII của chúng Đồng thời, hằng chuỗi ký tự cũng đóng vai trò quan trọng trong việc xử lý và lưu trữ dữ liệu dạng chuỗi, giúp tối ưu hóa các thao tác xử lý dữ liệu trong các ứng dụng phần mềm.
Hằng chuỗi ký tự là một chuỗi hay một xâu ký tự được đặt trong cặp dấu nháy kép (“)
Ví dụ: “Ngon ngu lap trinh C”, “Khoa Dien”
1 Một chuỗi không có nội dung ““ được gọi là chuỗi rỗng
2 Khi lưu trữ trong bộ nhớ, một chuỗi được kết thúc bằng ký tự NULL (‘\0’: mã ASCII là 0).
3 Để biểu diễn ký tự đặc biệt bên trong chuỗi ta phải thêm dấu \ phía trước
Ví dụ: “I’m a student” phải viết “I\’m a student”
“Day la ky tu “dac biet”“ phải viết “Day la ky tu \”dac biet\”“
Bi ế n và bi ể u th ứ c trong C
Trong lập trình, biến là đại lượng được định nghĩa và đặt tên qua quá trình khai báo, nhằm chứa dữ liệu trong quá trình thực thi chương trình Giá trị của biến có thể thay đổi linh hoạt trong suốt quá trình chạy của chương trình, giúp mã nguồn linh hoạt và dễ quản lý Cách đặt tên biến tuân thủ các quy tắc đặt tên như đã đề cập, đảm bảo rõ ràng và dễ hiểu cho người lập trình.
Mỗi biến thuộc về một kiểu dữ liệu xác định và có giá trị thuộc kiểu đó. a) Cú pháp khai báo biến
;
Trong lập trình C, bạn có thể khai báo nhiều biến cùng kiểu dữ liệu, ví dụ như "int a, b, c;" để định nghĩa ba biến a, b, c kiểu int Ngoài ra, các kiểu dữ liệu phức tạp hơn như "long int" cho biến chu_vi hay "float" cho biến nua_chu_vi cũng được sử dụng để lưu trữ các giá trị khác nhau Bên cạnh đó, kiểu dữ liệu "double" thường dùng để lưu trữ các giá trị có độ chính xác cao hơn, như biến dien_tich trong ví dụ Việc lựa chọn kiểu dữ liệu phù hợp giúp tối ưu bộ nhớ và đảm bảo chính xác cho các phép tính trong lập trình.
Lưu ý : Để kết thúc một lệnh phải có dấu chấm phẩy (;) ở cuối lệnh. b) Vị trí khai báo biến trong C
Trong ngôn ngữ lập trình C, việc khai báo biến đúng vị trí rất quan trọng để đảm bảo mã hoạt động chính xác Việc đặt biến không đúng vị trí có thể dẫn đến các lỗi ngoài ý muốn gọi là hiệu ứng lề mà lập trình viên khó lường trước Có hai cách chính để khai báo biến trong C, giúp tránh các lỗi này và tối ưu hóa hiệu suất chương trình.
Trong lập trình, khai báo biến ngoài hay còn gọi là biến toàn cục là các biến được đặt bên ngoài tất cả các hàm Những biến này có tác dụng ảnh hưởng đến toàn bộ chương trình, giúp quản lý dữ liệu chung hiệu quả và dễ dàng truy xuất trong mọi phần của mã nguồn Việc sử dụng biến toàn cục cần được cân nhắc kỹ để tránh gây nhầm lẫn hoặc lỗi không mong muốn trong quá trình phát triển phần mềm.
Ví dụ: int i; /*Bien ben ngoai */ float pi; /*Bien ben ngoai*/ int main()
Trong lập trình, biến được khai báo bên trong hàm, chương trình chính hoặc một khối lệnh, được gọi là biến cục bộ Các biến này chỉ có tác dụng và ảnh hưởng đến hàm, chương trình hoặc khối lệnh chứa nó, giúp quản lý bộ nhớ hiệu quả và tránh xung đột tên biến trong toàn bộ chương trình Việc khai báo biến cục bộ đóng vai trò quan trọng trong việc tổ chức mã nguồn rõ ràng, dễ bảo trì và nâng cao hiệu suất hoạt động của phần mềm.
31 biến, phải đặt các biến này ở đầu của khối lệnh, trước các lệnh có sử dụng đến biến (lệnh gán, ).
#include int bienngoai; /*khai bao bien ngoai*/ int main ()
{ int j,i; /*khai bao bien ben trong chuong trinh chinh*/ clrscr(); i=1; j=2; bienngoai=3; printf(“\n Gia tri cua i la %d”,i);
/*%d là số nguyên, sẽ biết sau */ printf(“\n Gia tri cua j la %d”,j); printf(“\n Gia tri cua bien ngoai la %d”,bienngoai); getch(); return 0;
Biểu thức là một sự kết hợp giữa các toán tử (operator) và các toán hạng (operand) theo đúng một trật tự nhất định
Mỗi toán hạng có thể là một hằng, một biến hoặc một biểu thức khác
Trong trường hợp, biểu thức có nhiều toán tử, ta dùng cặp dấu ngoặc đơn () để chỉ định toán tử nào được thực hiện trước
Ví dụ: Biểu thức nghiệm của phương trình bậc hai:
(-b + sqrt(Delta))/(2*a) Trong đó 2 là hằng; a, b, Delta là biến a) Các toán tử số học
Trong ngôn ngữ lập trình C, các toán tử cộng (+), trừ (-), nhân (*), chia (/) hoạt động tương tự như trong các ngôn ngữ lập trình khác Chúng có thể được áp dụng cho hầu hết các kiểu dữ liệu cơ bản được hỗ trợ bởi C Khi thực hiện phép chia giữa các số nguyên hoặc ký tự, phần dư sẽ bị loại bỏ, chẳng hạn như phép 5 chia cho 2 sẽ kết quả là 2.
% Chia lấy phần dư Giảm 1 đơn vị
Toán tử ++ thêm 1 vào toán hạng của nó và trừ bớt 1 Nói cách khác: x = x + 1 giống như ++x x = x - 1 giống như x
Cả 2 toán tử tăng và giảm đều có thể tiền tố (đặt trước) hay hậu tố (đặt sau) toán hạng Ví dụ: x = x + 1 có thể viết x++ (hay ++x)
Trong lập trình C, có sự khác biệt giữa tiền tố và hậu tố khi sử dụng trong biểu thức Khi toán tử tăng hoặc giảm đứng trước toán hạng, C sẽ thực hiện phép tăng hoặc giảm trước khi lấy giá trị trong biểu thức, ví dụ như « y = ++x » sẽ tăng x thành 11 trước khi gán cho y Ngược lại, nếu toán tử đứng sau toán hạng, C lấy giá trị ban đầu rồi mới thực hiện phép tăng hoặc giảm, như trong ví dụ « y = x++ », lúc này y bằng 10 còn x trở thành 11 sau đó Điều này giúp lập trình viên hiểu rõ cách sử dụng tiền tố và hậu tố để kiểm soát thứ tự thực hiện trong các biến đổi giá trị.
Thứ tự ưu tiên của các toán tử số học:
++, sau đó là *, /, % rồi mới đến +, - b) Các toán tử quan hệ và các toán tử Logic
Các toán tử quan hệ
! NOT Ý tưởng chính của toán tử quan hệ và toán tử Logic là đúng hoặc sai Trong
Các giá trị khác 0 được coi là đúng, trong khi giá trị 0 được xem là sai Các biểu thức sử dụng toán tử quan hệ và toán tử logic sẽ trả về 1 khi điều kiện đúng và 0 khi điều kiện sai, giúp xác định chính xác các phép so sánh và logic trong lập trình.
Bảng chân trị cho các toán tử Logic: p q p&&q p||q !p
Các toán tử quan hệ và Logic đều có độ ưu tiên thấp hơn các toán tử số học
Do đó một biểu thức như: 10 > 1+ 12 sẽ được xem là 10 > (1 + 12) và kết quả là sai (0)
Ta có thể kết hợp vài toán tử lại với nhau thành biểu thức như sau:
Thứ tự ưu tiên của các toán tử quan hệ là Logic
Các toán tử Bitwise trong lập trình đề cập đến việc kiểm tra, gán và thao tác với các bit thực sự trong một byte của từ dữ liệu, như kiểu char hoặc int trong C Chúng ta không thể sử dụng các toán tử Bitwise với các kiểu dữ liệu phức tạp hơn như float, double, long double hoặc void, vì các kiểu này không phù hợp với thao tác bitwise Đặc biệt, toán tử Bitwise là một phần quan trọng trong xử lý dữ liệu nhị phân và tối ưu hiệu suất trong lập trình C.
Bảng chân trị của toán tử ^ (XOR) p q p^q
C có một toán tử rất mạnh và thích hợp để thay thế cho các câu lệnh của If- Then-Else Cú pháp của việc sử dụng toán tử ? là:
Trong bài viết này, các biểu thức E1, E2, E3 đóng vai trò quan trọng trong quá trình ước lượng Ý nghĩa chính là: trước tiên, E1 được ước lượng; nếu E1 đúng, E2 sẽ được ước lượng và trở thành giá trị của biểu thức Ngược lại, nếu E1 sai, thì E2 sẽ được ước lượng và trở thành giá trị của biểu thức, giúp xác định chính xác kết quả dựa trên điều kiện đã xác định.
Kết quả là y được gán giá trị 100 (vì x = 10 > 9), nếu x nhỏ hơn 9 thì y sẽ nhận giá trị là 200 Đoạn mã này tương đương cấu trúc if như sau:
X = 10; if (X < 9) y = 100; else y = 200; e) Toán tử con trỏ & và *
Con trỏ trong lập trình là địa chỉ bộ nhớ của một biến, giúp truy cập và quản lý dữ liệu hiệu quả Biến con trỏ được khai báo để chứa địa chỉ của một đối tượng có kiểu dữ liệu cụ thể, hỗ trợ thao tác linh hoạt với bộ nhớ Trong lập trình, có hai toán tử chính dùng để thao tác với con trỏ, giúp thực hiện các phép gán, truy xuất dữ liệu qua địa chỉ bộ nhớ một cách chính xác và hiệu quả.
Toán tử thứ nhất là &, là một toán tử quy ước trả về địa chỉ bộ nhớ của hệ số của nó
Ví dụ: m = &count; //Đặt vào biến m địa chỉ bộ nhớ của biến count
Chẳng hạn, biến count ở vị trí bộ nhớ 2000, giả sử count có giá trị là 100 Sau câu lệnh trên m sẽ nhận giá trị 2000.
Toán tử thứ hai là *, còn được gọi là toán tử dereference, bổ sung cho toán tử &; nó là một toán tử quy ước dùng để trả về giá trị của biến được cấp phát tại địa chỉ sau toán tử này.
Sẽ đặt giá trị của count vào q Bây giờ q sẽ có giá trị là 100 vì 100 được lưu trữ tại địa chỉ 2000 f) Toán tử dấu phẩy (,)
Toán tử dấu được sử dụng để kết hợp các biểu thức lại với nhau, giúp tạo thành các biểu thức phức tạp hơn trong lập trình Bên trái của toán tử dấu phẩy luôn được xem là kiểu void, điều này có nghĩa là biểu thức phía bên phải sẽ trở thành giá trị của tổng các biểu thức được phân cách bởi dấu phẩy Việc hiểu rõ cách hoạt động của toán tử dấu phẩy giúp viết mã rõ ràng và tối ưu hơn trong các ngôn ngữ lập trình như C, C++, JavaScript Toán tử này thường được sử dụng để thực hiện nhiều lệnh trong một dòng, đảm bảo tính linh hoạt và hiệu quả trong quá trình lập trình.
Đầu tiên, gán giá trị 3 cho biến y và giá trị 4 cho biến x, lưu ý sử dụng cặp dấu ngoặc đơn vì toán tử dấu phẩy có độ ưu tiên thấp hơn toán tử gán Ngoài ra, cần xem xét rằng các dấu ngoặc đơn và dấu ngoặc vuông hoạt động như các toán tử quan trọng trong lập trình, giúp xác định thứ tự thực thi và phạm vi của các biểu thức Việc sử dụng đúng các loại dấu ngoặc này là yếu tố then chốt để đảm bảo mã nguồn rõ ràng, dễ hiểu và chính xác trong quá trình xử lý dữ liệu.
Trong C, cặp dấu ngoặc đơn là toán tử để tăng độ ưu tiên của các biểu thức bên trong nó
Các cặp dấu ngoặcvuông thực hiện thao tác truy xuất phần tử trong mảng. h) Tổng kết về độ ưu tiên
= += -= *= / Thấp nhất , i) Cách viết tắt trong C
Trong lập trình C, có nhiều phép gán khác nhau, đôi khi ta có thể sử dụng các phép viết tắt để code ngắn gọn hơn Ví dụ, phép gán cộng x = x + 10 có thể được viết thành x += 10, giúp đơn giản hóa cú pháp và tăng tính rõ ràng trong mã nguồn Toán tử += báo cho trình biên dịch biết để cộng giá trị của biến x với một số cố định, ở đây là 10, rồi gán kết quả trở lại vào x Việc sử dụng các toán tử gán rút gọn này giúp tối ưu hóa code, giảm thiểu lỗi và nâng cao hiệu quả lập trình.
Cách viết này làm việc trên tất cả các toán tử nhị phân (phép toán hai ngôi) của C Tổng quát:
= có thể được viết:
=
Cấu trúc của một chương trình C
1 Tiền xử lý và biên dịch
Trong C, việc dịch (translation) một tập tin nguồn được tiến hành trên hai bước hoàn toàn độc lập với nhau:
Trong phần lớn thời gian, hai bước này thường diễn ra liên tiếp một cách tự động, tạo ấn tượng như thể chúng là một quá trình xử lý duy nhất Thường được gọi là bộ tiền xử lý (preprocessor), chúng giúp xác định quá trình xử lý trước của chương trình một cách rõ ràng Tuy nhiên, khái niệm trình biên dịch và quá trình biên dịch vẫn còn gây nhầm lẫn, vì đôi khi chúng đề cập đến toàn bộ quá trình, còn lúc khác lại chỉ là giai đoạn thứ hai của quá trình này.
Trong quá trình tiền xử lý, việc cập nhật trong văn bản của chương trình nguồn chủ yếu dựa trên việc diễn giải các mã lệnh đặc biệt gọi là các chỉ thị dẫn hướng của bộ tiền xử lý (destination directive of preprocessor) Các chỉ thị này thường bắt đầu bằng ký hiệu #, giúp bộ tiền xử lý nhận diện và thực hiện các lệnh cần thiết để chuẩn bị mã nguồn cho quá trình biên dịch.
Hai chỉ thị quan trọng nhất là:
- Chỉ thị sự gộp vào của các tập tin nguồn khác: #include
- Chỉ thị việc định nghĩa các macros hoặc ký hiệu: #define
Chỉ thị đầu tiên được sử dụng là để gộp nội dung của các tệp tin cần thiết (header file), giúp tích hợp đầy đủ các hàm của thư viện chuẩn, từ đó tối ưu hóa việc sử dụng các hàm chuẩn trong lập trình C/C++.
#include
Chỉ thị thứ hai thường được sử dụng trong các tập tin thư viện (header file) đã được định nghĩa trước đó để tránh việc định nghĩa lại các ký hiệu, giúp duy trì tính nhất quán và tối ưu hóa quá trình biên dịch Các lập trình viên thường khai thác chỉ thị này để kiểm tra xem một ký hiệu đã được định nghĩa hay chưa, từ đó đảm bảo rằng mã nguồn tránh được các lỗi trùng lặp và nâng cao hiệu quả lập trình Việc sử dụng chỉ thị thứ hai trong các header file là một kỹ thuật phổ biến giúp quản lý mã nguồn dễ dàng hơn và tối ưu hóa quá trình phát triển phần mềm.
#define
2 Cấu trúc một chương trình C
Một chương trình C bao gồm các phần như: Các chỉ thị tiền xử lý, khai báo biến ngoài, các hàm tự tạo, chương trình chính (hàm main).
Cấu trúc có thể như sau:
Các chỉ thị tiền xử lý ( Preprocessor directives )
#include
Trong lập trình, lệnh #define dùng để định nghĩa kiểu dữ liệu, giúp đặt tên lại cho một kiểu dữ liệu có sẵn nhằm mục đích dễ nhớ hơn hoặc tạo ra kiểu dữ liệu tùy chỉnh Việc này không bắt buộc nhưng rất hữu ích trong việc tối ưu hóa mã nguồn và tăng tính rõ ràng cho chương trình của bạn Bằng cách đặt tên riêng cho các kiểu dữ liệu, lập trình viên có thể dễ dàng quản lý và sửa đổi mã nguồn sau này.
Cú pháp: typedef
Ví dụ: typedef int SoNguyen; // Kiểu SoNguyen là kiểu int
3 Các tập tin thư viện thông dụng Đây là các tập tin chứa các hàm thông dụng khi lập trinh C, muốn sử dụng các hàm trong các tập tin header này thì phải khai báo #include ở phần đầu của chương trình a) stdio.h: Tập tin định nghĩa các hàm vào/ra chuẩn (standard input/output) Gồm các hàm in dữ liệu printf() , nhập giá trị cho biến scanf() , nhận ký tự từ bàn phím getc() , in ký tự ra màn hình putc() , nhận một dãy ký tự từ bàm phím gets() , in chuỗi ký tự ra màn hình puts() , xóa vùng đệm bàn phím: fflush() , fopen() , fclose() , fread() , fwrite() , getchar() , putchar() , getw() , putw() …
Trong quá trình phát triển, cần khai báo các prototype của hàm bao gồm tên hàm, các tham số, kiểu kết quả trả về, nhằm đảm bảo cấu trúc và khả năng mở rộng của mã nguồn Lưu ý rằng phần này chỉ là các khai báo đầu hàm, không phải là phần định nghĩa hàm chi tiết Việc khai báo prototype giúp xác định trước các hàm sẽ được cài đặt trong phần sau của dự án, hỗ trợ tối ưu hóa quá trình biên dịch và tổ chức mã nguồn rõ ràng hơn.
Khai báo các biến ngoài (các biến toàn cục - phần này không bắt buộc): phần này khai báo các biến toàn cục được sử dụng trong cả chương trình.
Chương trình chính (phần này bắt buộc phải có)
main()
return ; // Hàm phải trả về kết quả
function1( )
{
return ;
function1()
{
return ;
Một chương trình C bắt đầu thực thi từ hàm main (thông thường là từ câu lệnh đầu tiên đến câu lệnh cuối cùng)
The conio.h header file defines functions for DOS console input and output, including clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(), and clreol(), which facilitate text-based interface management The math.h header file provides functions for various mathematical computations, such as abs(), sqrt(), log(), log10(), sin(), cos(), tan(), acos(), asin(), atan(), pow(), and exp(), supporting complex numerical calculations Additionally, the alloc.h header file contains functions related to memory management, enabling efficient dynamic memory allocation and deallocation in programs.
The article covers a range of standard C library functions including memory management functions like calloc(), realloc(), malloc(), free(), as well as specific functions such as farmalloc(), farcalloc(), and farfree() Additionally, it discusses the io.h header file, which defines low-level I/O operations like open(), _open(), read(), _read(), close(), _close(), creat(), _creat(), creatnew(), eof(), filelength(), and lock() The graphics.h header file is also highlighted, containing functions related to graphics programming such as initgraph(), line(), circle(), putpixel(), getpixel(), and setcolor(), which enable basic drawing and color manipulation in graphical applications.
4 Cú pháp khai báo các phần mềm bên trong một chương trình C a) Chỉ thị #include để sử dụng tập tin thư viện
#include < > hay #include “ Đường dẫn ”
Menu Option của Turbo C có mục INCLUDE DIRECTORIES, mục này dùng để chỉ định các tập tin thư viện được lưu trữ trong thư mục nào
Nếu ta dùng #include thì Turbo C sẽ tìm tập tin thư viện trong thư mục đã được xác định trong INCLUDE DIRECTORIES
Nếu ta dùng #include “Đường dẫn” thì ta phải chỉ rõ tên ở đâu, tên thư mục và tập tin thư viện
Ví dụ: #include “C:\\TC\\math.h” //Dấu chuyển chuyển từ thư mục
//cha xuống thư mục con là \\
Trong trường hợp tập tin thư viện nằm trong thư mục hiện hành thì ta chỉ cần đưa tên tập tin thư viện Ví dụ: #include “math.h”
#include “math.h” b) Chỉ thị #define để định nghĩa hằng số
#define
#define MAXINT 32767 c) Khai báo các prototype của hàm
Tên hàm ( )
Ví dụ: long giaithua( int n); //Hàm tính giai thừa của số nguyên n double x_mu_y(float x, float y); /*Hàm tính x mũ y*/ d) Cấu trúc của hàm “bình thường”
Tên hàm ( ) {
return ; }
Ví dụ: int tong(int x, int y) /*Hàm tính tổng 2 số nguyên*/
} float tong(float x, float y) /*Hàm tính tổng 2 số thực*/
} e) Cấu trúc của hàm main
Hàm main chính là chương trình chính, gồm các lệnh xử lý, các lời gọi các hàm khác
main ( ) {
return ; }
{ printf(“Day la chuong trinh chinh”); getch(); return 0;
Bài t ậ p
Bài 1: Biểu diễn các hằng số nguyên 2 byte sau đây dưới dạng số nhị phân, bát phân, thập lục phân : a)12 b) 255 c) 31000 d) 32767 e) -32768
Bài 2: Biểu diễn các hằng ký tự sau đây dưới dạng số nhị phân, bát phân : a) ‘A’ b) ’a’ c) ‘Z’ d) ’z’
Các câu l ệnh đơn trong C
Câu lệnh
Trong lập trình, một câu lệnh (statement) xác định công việc mà chương trình phải thực hiện để xử lý dữ liệu đã được mô tả và khai báo Các câu lệnh thường được phân tách bằng dấu chấm phẩy (;) để xác định rõ ràng các lệnh thực thi độc lập Việc sử dụng câu lệnh chính xác là yếu tố quan trọng để đảm bảo chương trình hoạt động đúng và hiệu quả.
Có hai loại lệnh: lệnh đơn và lệnh có cấu trúc.
Lệnh đơn là một lệnh không chứa các lệnh khác Các lệnh đơn gồm: lệnh gán, các câu lệnh nhập xuất dữ liệu…
Lệnh có cấu trúc là loại lệnh chứa các lệnh khác, bao gồm cấu trúc điều kiện rẽ nhánh, cấu trúc điều kiện lựa chọn, cấu trúc lặp và cấu trúc lệnh hợp thành Lệnh hợp thành (hoặc khối lệnh) là nhóm các lệnh bao gồm nhiều khai báo biến và được đặt trong cặp dấu {} để tổ chức mã nguồn rõ ràng và logic hơn.
Các l ệnh đơn
Lệnh gán ( assignment statement ) dùng để gán giá trị của một biểu thức cho một biến.
Cú pháp: = ;
43 int x,y; x ; // Gán hằng số 10 cho biến x y = 2*x; //Gán giá trị của biểu thức 2*x ( ) cho biến y return 0;
Trong lập trình, nguyên tắc quan trọng khi sử dụng lệnh gán là kiểu của biến và kiểu của biểu thức phải phù hợp nhau, đảm bảo sự tương thích giữa các kiểu dữ liệu Ví dụ minh họa cho thấy sự không phù hợp về kiểu dữ liệu: trong đoạn mã int main() { int x, y; x = 10; // Gán hằng số 10 cho biến x y = “Xin chao”; }, khi cố gắng gán chuỗi “Xin chao” cho biến y kiểu số nguyên, gây ra lỗi về kiểu dữ liệu.
//y có kiểu int, còn “Xin chao” có kiểu char* return 0;
Khi biên dịch chương trình này, C sẽ báo lỗi "Cannot convert ‘char *’ to
‘int’" tức là C không thể tự động chuyển đổi kiểu từ char * (chuỗi ký tự) sang int
Tuy nhiên trong đa số trường hợp sự tự động biến đổi kiểu để sự tương thích về kiểu sẽ được thực hiện
This example demonstrates variable declarations and assignments in C programming It shows how to assign constants to integer variables, such as assigning the value 10 to variable x and a character 'd' to variable y, which is of type int The code also illustrates assigning a character 'e' to a float variable r, highlighting implicit type conversions Additionally, it emphasizes the behavior of assigning a floating-point number 65.7 to a char variable ch, resulting in only the integer part being stored Understanding data types and assignment operations is essential for effective C programming.
Trong nhiều trường hợp, để đảm bảo tính tương thích về kiểu dữ liệu, cần sử dụng phép chuyển đổi kiểu dữ liệu một cách rõ ràng và chính xác Cú pháp của phép toán chuyển đổi kiểu này giúp đảm bảo quá trình xử lý dữ liệu diễn ra suôn sẻ, tránh lỗi và đảm bảo tính tin cậy của chương trình Việc chuyển đổi kiểu dữ liệu phù hợp đóng vai trò quan trọng trong việc tối ưu hiệu suất và tính ổn định của phần mềm.
Chuyển đổi kiểu của thành kiểu mới Chẳng hạn như: float f; f = (float) 10/4; // f lúc này là 2.5
- Khi một biểu thức được gán cho một biến thì giá trị của nó sẽ thay thế giá trị cũ mà biến đã lưu giữ trước đó.
Trong câu lệnh gán, dấu "=" là một toán tử, có thể được sử dụng như một phần của biểu thức Khi đó, giá trị của biểu thức gán chính là giá trị của biến, giúp đảm bảo tính linh hoạt và chính xác khi lập trình.
Ví dụ: int x, y; y = (x = 3, x + 1); // y lúc này là 4
- Ta có thể gán trị cho biến lúc biến được khai báo theo cách thức sau:
= ;
2 Lệnh nhập giá trị từ bàn phím cho biến (hàm scanf)
Hàm scanf trong ngôn ngữ C là hàm dùng để đọc dữ liệu từ bàn phím và gán giá trị cho các biến trong quá trình thực thi của chương trình Hàm này nằm trong thư viện stdio.h, đóng vai trò quan trọng trong việc xử lý nhập liệu từ người dùng Việc hiểu rõ cách sử dụng hàm scanf giúp lập trình viên xử lý dữ liệu đầu vào một cách chính xác và hiệu quả trong các chương trình C.
Cú pháp: scanf(“ ”, );
Chuỗi định dạng giúp quy định kiểu dữ liệu, cách biểu diễn, độ rộng và số chữ số thập phân của dữ liệu trong lập trình Các định dạng này được sử dụng để định dạng dữ liệu kiểu số nguyên, số thực hoặc ký tự, đảm bảo hiển thị và xử lý dữ liệu chính xác Việc sử dụng chuỗi định dạng phù hợp là yếu tố quan trọng trong việc chuẩn hóa dữ liệu, nâng cao hiệu suất và đảm bảo tính nhất quán trong quá trình lập trình.
%[số ký số]d Nhập số nguyên có tối đa
%[số ký số] f Nhập số thực có tối đa tính cả dấu
%4d Nhập số nguyên tối đa 4 ký số, nếu nhập nhiều hơn 4 ký số thì chỉ nhận được 4 ký số đầu tiên
Hãy nhập số thực tối đa 6 ký số, kể cả dấu chấm Nếu nhập nhiều hơn 6 ký số, hệ thống chỉ nhận 6 ký số đầu tiên hoặc 5 ký số kèm dấu chấm, đảm bảo đúng quy định về giới hạn ký số.
- : là địa chỉ (&) của các biến mà chúng ta cần nhập giá trị cho nó Được viết như sau: &
Ví dụ: scanf(“%d”,&bien1);//Doc gia tri cho bien1 co kieu nguyen scanf(“%f”,&bien2); //Doc gia tri cho bien2 co kieu thuc scanf(“%d%f”,&bien1,&bien2);
//Doc gia tri cho bien1 co kieu nguyen, bien2 co kieu thuc scanf(“%d%f%c”,&bien1,&bien2,&bien3);
- Chuỗi định dạng phải đặt trong cặp dấu nháy kép (“”)
- Các biến (địa chỉ biến) phải cách nhau bởi dấu phẩy (,)
- Có bao nhiêu biến thì phải có bấy nhiêu định dạng.
- Thứ tự của các định dạng phải phù hợp với thứ tự của các biến
Để nhập giá trị kiểu char chính xác trong C, bạn nên sử dụng hàm fflush(stdin) để loại bỏ các ký tự còn sót lại trong bộ đệm bàn phím trước khi thực hiện hàm scanf() Việc này giúp tránh ảnh hưởng của các ký tự không mong muốn, đảm bảo dữ liệu nhập vào đúng mong muốn Sử dụng fflush(stdin) là một phương pháp hiệu quả để xử lý tình trạng dư thừa ký tự trong bộ đệm, từ đó cải thiện độ chính xác của quá trình nhập liệu kiểu char.
Để nhập một chuỗi ký tự không chứa khoảng trắng hoặc kết thúc bằng khoảng trắng, cần khai báo kiểu mảng ký tự hoặc con trỏ ký tự, sử dụng định dạng %s cùng với tên biến thay vì địa chỉ biến.
- Để đọc vào một chuỗi ký tự có chứa khoảng trắng (kết thúc bằng phím
Enter) thì phải dùng hàm gets()
46 float bienthuc; char bienchar; char chuoi1[20], *chuoi2;
Nhập giá trị cho các biến: scanf(“%3d”,&biennguyen);
Nếu ta nhập 1234455 thì giá trị của biennguyen là 3 ký số đầu tiên (123) Các ký số còn lại sẽ còn nằm lại trong vùng đệm scanf(“%5f”,&bienthuc);
Nếu ta nhập 123.446 thì giá trị của bienthuc là 123.4, các ký số còn lại sẽ còn nằm trong vùng đệm scanf(“%2d%5f”,&biennguyen, &bienthuc);
Nếu ta nhập liên tiếp 2 số cách nhau bởi khoảng trắng như sau: 1223 3.142325
- 2 ký số đầu tiên (12) sẽ được đọc vào cho biennguyen.
- 2 ký số tiếp theo trước khoảng trắng (23) sẽ được đọc vào cho bienthuc scanf(“%2d%5f%c”,&biennguyen, &bienthuc,&bienchar)
Nếu ta nhập liên tiếp 2 số cách nhau bởi khoảng trắng như sau: 12345 3.142325:
- 2 ký số đầu tiên (12) sẽ được đọc vào cho biennguyen
- 3 ký số tiếp theo trước khoảng trắng (345) sẽ được đọc vào cho bienthuc
- Khoảng trắng sẽ được đọc cho bienchar.
Nếu ta chỉ nhập một số gồm nhiều ký số như sau: 123456789:
- 2 ký số đầu tiên (12) sẽ được đọc vào cho biennguyen.
- 5 ký số tiếp theo (34567) sẽ được đọc vào cho bienthuc.
- bienchar sẽ có giá trị là ký số tiếp theo ‘8’ scanf(“%s”,chuoi);
Nếu ta nhập chuỗi như sau: Nguyen Van Linh thì giá trị của biến chuoi là Nguyen scanf(“%s%s”,chuoi1, chuoi2);
Nếu ta nhập chuỗi như sau: Duong Van Hieu thì giá trị của biến chuoi1 là
Duong và giá trị của biến chuoi2 là Van
Chương trình sẽ bắt đầu bằng cách đọc từ đầu đoạn văn cho đến khi gặp khoảng trắng để xác định giá trị của biến đầu tiên Phần còn lại sau khoảng trắng sẽ được gán cho các biến tiếp theo, giúp xử lý dữ liệu một cách hiệu quả và chính xác Quá trình này đảm bảo phân tách dữ liệu rõ ràng, dễ dàng lưu trữ và xử lý trong các ứng dụng lập trình, nâng cao hiệu suất làm việc và tối ưu hóa hoạt động của hệ thống.
3 Lệnhxuất giá trị biểu thức lên màn hình (hàm printf)
Hàm printf (nằm trong thư viện stdio.h ) dùng để xuất giá trị của các biểu thức lên màn hình
Cú pháp: printf(“ ”, );
- : dùng để qui định kiểu dữ liệu, cách biểu diễn, độ rộng, số chữ số thập phân Ý nghĩa một số định dạng: Định dạng Ý nghĩa
%[.số chữ số thập phân] f
Xuất số thực có theo quy tắc làm tròn số.
%o Xuất số nguyên hệ bát phân
%x Xuất số nguyên hệ thập lục phân
%e hoặc %E hoặc %g hoặc %G Xuất số nguyên dạng khoa học (nhân 10 mũ x)
%4d In số nguyên tối đa 4 ký số, nếu số cần in nhiều hơn 4 ký số thì in hết
%6f In số thực tối đa 6 ký số (tính luôn dấu chấm), nếu số cần in nhiều hơn 6 ký số thì in hết
%.3f In số thực có 3 số lẻ, nếu số cần in có nhiều hơn 3 số lẻ thì làm tròn.
- : là các biểu thức mà chúng ta cần xuất giá trị của nó lên màn hình, mỗi biểu thức phân cách nhau bởi dấu phẩy (,)
Ví dụ: include int main(){
Trong đoạn mã này, biến `bien_nguyen` được khai báo kiểu số nguyên và biến `bien_thuc` là kiểu số thực với giá trị ban đầu là 3.456703 Các hàm `printf` được sử dụng để in ra giá trị của các biến, trong đó có thể thấy rõ cách trình bày giá trị dạng số nguyên và số thực, giúp người đọc hiểu rõ cách xử lý dữ liệu trong lập trình C Trước khi thực hiện làm tròn, giá trị của biến `bien_thuc` được hiển thị rõ ràng, góp phần minh họa cách hiển thị số thực chưa làm tròn trong câu lệnh printf.
Sau khi lam tron=%.2f”,bien_thuc, bien_thuc); return 0;
Kết quả in ra màn hình như sau:
Nếu ta thêm vào dòng sau trong chương trình: printf(“\n Ky tu co ma ASCII %d la %c”,i,i);
Kết quả ta nhận được thêm: printf(“ So nguyen la %d \n So thuc la %f”,i, (float)i ); printf(“\n So thuc la %f \n So nguyen la %d”,bien_thuc,
(int)bien_thuc); printf(“\n Viet binh thuong =%f \n Viet kieu khoa hoc=%e”,bien_thuc, bien_thuc);
Kết quả in ra màn hình:
Lưu ý: Đối với các ký tự điều khiển, ta không thể sử dụng cách viết thông thường để hiển thị chúng
Ký tự điều khiển là các ký tự dùng để điều khiển các thao tác xuất, nhập dữ liệu
Một số ký tự điều khiển được mô tả trong bảng:
Ký tự điều Giá trị thập lục Ký tự được hiển thị Ý nghĩa
\a 0x07 BEL Phát ra tiếng chuông
\b 0x08 BS Di chuyển con trỏ sang trái 1 ký tự và xóa ký tự bên trái (backspace)
\r 0x0D CR Trở về đầu dòng
\t 0x09 HT Tab theo cột (giống gõ phím
\ddd ddd Ký tự có mã ACSII trong hệ bát phân là số ddd
\xHHH oxHHH Ký tự có mã ACSII trong hệ thập lục phân là HHH
Đoạn mã thể hiện cách sử dụng các lệnh in trong C để hiển thị các ký tự đặc biệt như tiếng beep với \a, di chuyển con trỏ sang trái một ký tự bằng \b, chèn tab \t, ký tự backslash \\, dấu nháy đơn \' và dấu nháy kép \", dấu hỏi chấm \?, cũng như cách hiển thị các ký tự theo mã ASCII thập phân \101 và mã thập lục phân \x041 Ngoài ra, đoạn mã yêu cầu người dùng nhấn Enter để kết thúc, giúp thể hiện rõ các thao tác xử lý ký tự đặc biệt và thao tác tương tác trong lập trình C.
50 printf("\rVe dau dong"); getch(); return 0;
Kết quả trước khi gõ phím Enter:
Kết quả sau khi gõ phím Enter:
1 Viết chương trình in lên màn hình một thiệp mời dự sinh nhật có dạng: *******************************************
Thân mời bạn : Nguyễn Văn A Tới dự lễ sinh nhật của mình
Vào lúc 19h ngày 25/10/2019 Tại 1234 Trần Hưng Đạo– Long Xuyên Rất mong được đón tiếp !
2 Viết chương trình nhập vào bán kính r của một hình tròn Tính chu vi và diện tích của hình tròn theo công thức :
In các kết quả lên màn hình
3 Viết chương trình nhập vào độ dài 3 cạnh a, b, c của một tam giác Tính chu vi và diện tích của tam giác theo công thức:
In các kết quả lên màn hình
4 Viết chương trình tính logax với a, x là các số thực nhập vào từ bàn phím, và x>0, a>0, a != 1.( dùng logax=lnx/lna)
5 Viết chương trình nhập vào tọa độ của hai điểm (x1, y1) và (x2, y2) a) Tính hệ số góc của đường thẳng đi qua hai điểm đó theo công thức:
Hệ số góc = (y2 - y1) /(x2 - x1) b) Tính khoảng cách giữa hai điểm theo công thức:
6 Viết chương trình nhập vào một ký tự: a) In ra mã Ascii của ký tự đó b) In ra ký tự kế tiếp của nó
7 Viết chương trình nhập vào các giá trị điện trở R1, R2, R3 của một mạch điện :
Tính tổng trở theo công thức:
8 Viết chương trình nhập vào điểm ba môn Toán, Lý, Hóa của một học sinh In ra điểm trung bình của học sinh đó với hai số lẻ thập phân.
9 Viết chương trình nhập vào ngày, tháng, năm In ra ngày tháng năm theo dạng dd/mm/yy (dd: ngày, mm: tháng, yy : năm Ví dụ: 20/11/99 )
10 Viết chương trình đảo ngược một số nguyên dương có đúng 3 chữ số.