Lập trình C Aptech - Bài 6: Nhập và xuất trong C
Mục tiêu:
Kết thúc bài học này, bạn có thể:
Hiểu các hàm nhập xuất có định dạng scanf() và printf()
Sử dụng các hàm nhập xuất ký tự getchar() và putchar().
của chuỗi, ngoại trừ tất cả chúng chỉ nằm trên một hàng. Ví dụ chuỗi sau: All’s well that ends well! Có thể được nhập vào từ bàn phím và được gán cho mảng. Bổ từ * cho kết quả khác nhau trong scanf(). Dấu * được dùng để chỉ rằng một trường sẽ được bỏ qua luôn hay tạm bỏ qua. Ví dụ xét chương trình: #include void main() { char item[20]; int partno; float cost; ......... scanf(“%s %*d %f”, item, &partno, &cost); ......... } Nếu các mục dữ liệu tương ứng là: battery 12345 0.05 thì battery sẽ được gán cho item và 0.05 sẽ được gán cho cost nhưng 12345 sẽ không được gán cho partno bởi vì dấu * ngăn chặn việc gán. Bất cứ ký tự khác trong scanf() mà không là mã định dạng trong chuỗi điều khiển phải được nhập vào chính xác nếu không sẽ phát sinh lỗi. Ðặc điểm này được dùng để chấp nhận dấu phân cách phẩy (,). Ví dụ chuỗi dữ liệu 10, 15, 17 và lệnh nhập vào scanf(“%d, %f, %c”, &intgr, &flt, &ch); Chú ý rằng dấu phẩy trong chuỗi chuyển đổi tương ứng dấu phẩy trong chuỗi nhập và vì vậy nó sẽ có chức năng như dấu phân cách. Ký tự khoảng trắng trong chuỗi điều khiển thường được bỏ qua mặc dù nó sẽ phát sinh trở ngại khi dùng với mã định dạng %c. Nếu chúng ta dùng bộ định dạng %c thì một khoảng trắng được xem như là một ký tự hợp lệ. Xét đoạn mã sau: int x, y; char ch; scanf(“%2d %c %d”,&x, &ch, &y); printf(“%d %d %d\n”,x, ch, y); ta nhập vào: 14 c 5 14 sẽ được gán cho x, ký tự ch nhận ký tự khoảng trắng (số 32 trong hệ thập phân), do vậy y được gán giá trị của ký tự ‘c’ tức là số 99 trong hệ thập phân. Xét đoạn mã sau: #include void main() { char c1, c2, c3; ………….. scanf(“%c%c%c”,&c1, &c2, &c3); ……………….. } Nếu dữ liệu nhập vào là: a b c (với khoảng trắng giữa các ký tự), thì kết quả của phép gán: c1 = a, c2 = , c3 = b Ở đây chúng ta có thể thấy c2 chứa một khoảng trắng vì chuỗi nhập có chứa ký tự khoảng trắng. Ðể bỏ qua các ký tự khoảng trắng này và đọc ký tự tiếp theo không phải là ký tự khoảng trắng, ta nên dùng tập chuyển đổi %1s. scanf(“%c%1s%1s”,&c1, &c2, &c3); Khi đó kết quả sẽ khác đi với cùng dữ liệu nhập vào như trước và kết quả đúng như ý định của ta: c1 = a, c2 = b, c3 = c 6.3 Bộ nhớ đệm Nhập và Xuất (Buffered I/O) Ngôn ngữ C bản thân nó không định nghĩa các thao tác nhập và xuất. Tất cả thao tác nhập và xuất được thực hiện bởi các hàm có sẵn trong thư viện hàm của C. Thư viện hàm C chứa một hệ thống hàm riêng mà nó điều khiển các thao tác này. Ðó là: Bộ nhớ đệm Nhập và Xuất – được dùng để đọc và viết các ký tự ASCII Một vùng đệm là nơi lưu trữ tạm thời, nằm trên bộ nhớ máy tính hoặc trên thẻ nhớ của bộ điều khiển thiết bị (controller card). Các ký tự nhập vào từ bàn phím được đưa vào bộ nhớ và đợi đến khi người dùng nhấn phím return hay enter thì chúng sẽ được thu nhận như một khối và cung cấp cho chương trình. Bộ nhớ đệm nhập và xuất có thể được phân thành: Thiết bị nhập/xuất chuẩn (Console I/O) Tập tin đệm nhập/xuất (Buffered File I/O) Thiết bị nhập/xuất chuẩn liên quan đến những hoạt động của bàn phím và màn hình của máy tính. Tập tin đệm nhập/xuất liên quan đến những hoạt động thực hiện đọc và viết dữ liệu vào tập tin. Chúng ta sẽ nói về Thiết bị nhập/xuất. Trong C, Thiết bị nhập/xuất chuẩn là một thiết bị luồng. Các hàm trong Thiết bị nhập/xuất chuẩn hướng các thao tác đến thiết bị nhập và xuất chuẩn của hệ thống. Các hàm đơn giản nhất của Thiết bị nhập/xuất chuẩn là: getchar() – Ðọc một và chỉ một ký tự từ bàn phím. putchar() – Xuất một ký tự đơn ra màn hình. 6.3.1 getchar() Hàm getchar() được dùng để đọc dữ liệu nhập vào, chỉ một ký tự tại một thời điểm từ bàn phím.Trong hầu hết việc thực thi của C, khi dùng getchar(), các ký tự nằm trong vùng đệm cho đến khi người dùng nhấn phím xuống dòng. Vì vậy nó sẽ đợi cho đến khi phím Enter được gõ. Hàm getchar() không có tham số, nhưng vẫn phải có cặp dấu ngoặc đơn. Nó đơn giản lấy về ký tự tiếp theo và sẵn sàng đưa ra cho chương trình. Chúng ta nói rằng hàm này trả về một giá trị có kiểu ký tự. Chương trình sau trình bày cách dùng hàm getchar(). Ví dụ 6.11: /* Chương trình trình bày cách dùng getchar() */ #include void main() { char letter; printf(“\nPlease enter any character: “); letter = getchar(); printf(“\nThe character entered by you is %c. “, letter); } Kết quả như sau: Please enter any character: S The character entered by you is S. Trong chương trình trên ‘letter’ là một biến được khai báo là kiểu char do vậy nó sẽ nhận vào ký tự. Một thông báo: Please enter any character: sẽ xuất hiện trên màn hình. Ta nhập vào một ký tự, trong ví dụ là S, qua bàn phím và nhấn Enter. Hàm getchar() nhận ký tự đó và gán cho biến có tên là letter. Sau đó nó được hiển thị trên màn hình và ta có được thông báo. The character entered by you is S. 6.3.2 putchar() putchar() là hàm xuất ký tự trong C, nó sẽ xuất một ký tự lên màn hình tại vị trí con trỏ màn hình. Hàm này yêu cầu một tham số. Tham số của hàm putchar() có thể thuộc các loại sau: Hằng ký tự đơn Ðịnh dạng (Escape sequence) Một biến ký tự. Nếu tham số là một hằng nó phải được bao đóng trong dấu nháy đơn. Bảng 6.5 trình bày vài tùy chọn cho putchar() và tác động của chúng. Tham số Hàm Tác dụng Biến ký tự putchar(c) Hiện thị nội dung của biến ký tự c Hằng biến ký tự putchar(‘A’) Hiển thị ký tự A Hằng số putchar(‘5’) Hiển thị con số 5 Ðịnh dạng (escape sequence) putchar(‘\t’) Chèn một ký tự khoảng cách (tab) tại vị trí con trỏ màn hình Ðịnh dạng (escape sequence) putchar(‘\n’) Chèn một mã xuống dòng tại vị trí con trỏ màn hình Bảng 6.5: Những tùy chọn cho putchar() và tác dụng của chúng Chương trình sau trình bày về hàm putchar(): Ví dụ 6.12: /* Chương trình này trình bày việc sử dụng hằng và định dạng trong hàm putchar() */ #include void main() { putchar(‘H’); putchar(‘\n’); putchar(‘\t’); putchar(‘E’); putchar(‘\n’); putchar(‘\t’); putchar(‘\t’); putchar(‘L’); putchar(‘\n’); putchar(‘\t’); putchar(‘\t’); putchar(‘\t’); putchar(‘L’); putchar(‘\n’); putchar(‘\t’); putchar(‘\t’); putchar(‘\t’); putchar(‘\t’); putchar(‘O’); } Kết quả như sau: H E L L O Khác nhau giữa getchar() và putchar() là putchar() yêu cầu một tham số trong khi getchar() thì không. Ví dụ 6.13: /* Chương trình trình bày getchar() và putchar() */ #include void main() { char letter; printf(“You can enter a character now: ”); letter = getchar(); putchar(letter); } Kết quả như sau: You can enter a character now: F F Tóm tắt bài học Trong C, Nhập và Xuất được thực hiện bằng cách dùng các hàm. Bất cứ chương trình nào trong C đều có quyền truy cập tới ba tập tin chuẩn. Chúng là tập tin nhập chuẩn (stdin), tập tin xuất chuẩn (stdout) và bộ lỗi chuẩn (stderr). Thông thường tập tin nhập chuẩn là bàn phím (keyboard), tập tin xuất chuẩn là màn hình (screen) và tập tin lỗi chuẩn cũng là màn hình. Tập tin tiêu đề chứa các macro của nhiều hàm nhập và xuất (input/output function) được dùng trong C. Thiết bị nhập/xuất chuẩn (Console I/O) liên quan đến những hoạt động của bàn phím và màn hình của máy tính. Nó chứa các hàm định dạng và không định dạng. Hàm nhập xuất định dạng là printf() và scanf(). Hàm nhập xuất không định dạng là getchar() và putchar(). Hàm scanf() được dùng cho dữ liệu nhập vào có định dạng, trong khi hàm printf() được dùng để xuất ra dữ liệu theo một định dạng cụ thể. Chuỗi điều khiển của printf() và scanf() phải luôn tồn tại bên trong dấu nháy kép “”. Chuỗi này sẽ chứa một tập các lệnh định dạng. Mỗi lệnh định dạng chứa ký hiệu %, một tùy chọn các bổ từ và các dạng kiểu dữ liệu xác định. Sự khác nhau chính giữa printf() và scanf() là hàm scanf() dùng địa chỉ của biến chứ không phải là tên biến. Hàm getchar() đọc một ký tự từ bàn phím. Hàm putchar(ch) gởi ký tự ch ra màn hình. Sự khác nhau giữa getchar() và putchar() là putchar() có một tham số trong khi getchar() thì không. Kiểm tra tiến độ học tập Các hàm nhập và xuất có định dạng là _________ và ________. A. printf() và scanf() B. getchar() và putchar() C. puts() và gets() D. Không câu nào đúng Hàm scanf() dùng _________ tới các biến chứ không dùng tên biến. A. Hàm B. Con trỏ C. Mảng D. Không câu nào đúng ___________ xác định định dạng cho các giá trị của biến sẽ được nhập và in. A. Văn bản B. Bộ định dạng C. Tham số D. Không câu nào đúng _______ được dùng bởi hàm printf() để xác định các đặc tả chuyển đổi. A. % B. & C. * D. Không câu nào đúng getchar() là một hàm không có bất cứ tham số nào. (True/False) Một ___________ là một nơi lưu trữ tạm trong bộ nhớ. A. ROM (Bộ nhớ chỉ đọc) B. Thanh ghi C. Vùng đệm D. Không câu nào đúng Ðịnh dạng (Escape sequence) có thể được đặt bên ngoài chuỗi điều khiển của printf(). (True/False) Bài tập tự làm 1. A. Hãy dùng câu lệnh printf() để : Xuất ra giá trị của biến số nguyên sum. Xuất ra chuỗi văn bản "Welcome", tiếp theo là một dòng mới. Xuất ra biến ký tự letter. Xuất ra biến số thực discount. Xuất ra biến số thực dump có 2 vị trí phần thập phân. 1. B. Dùng câu lệnh scanf() và thực hiện: a) Ðọc giá trị thập phân từ bàn phím vào biến số nguyên sum. b) Ðọc một giá trị số thực vào biến discount_rate. Viết một chương trình xuất ra giá trị ASCII của các ký tự ‘A’ và ‘b’. Xét chương trình sau: #include void main() { int breadth; float length, height; scanf(“%d%f%6.2f”, breadth, &length, height); printf(“%d %f %e”, &breadth, length, height); } Sửa lỗi chương trình trên. Viết một chương trình nhập vào name, basic, daper (phần trăm của D.A), bonper (phần trăm lợi tức) và loandet (tiền vay bị khấu trừ) cho một nhân viên. Tính lương như sau: salary = basic + basic * daper/100 + bonper * basic/100 - loandet Bảng dữ liệu: name basic daper bonper loandet MARK 2500 55 33.33 250.00 Tính salary và xuất ra kết quả dưới các đầu đề sau (Lương được in ra gần dấu đôla ($)): Name Basic Salary Viết một chương trình yêu cầu nhập vào tên, họ của bạn và sau đó xuất ra tên, họ theo dạng là họ, tên.
File đính kèm:
- Lập trình C Aptech - Bài 6 Nhập và xuất trong C.doc