Ngôn ngữ lập trình C - Chương 2: Các lệnh vào ra

Mỗi tệp gốc có tham trỏ tới hàm thư viện chuẩn đều phải chứa dòng :

#include <conio.h> cho các hàm getch(), putch(), clrscr(), gotoxy() .

#include <stdio.h> cho các hàm khác như gets(), fflus(), fwrite(), scanf().

ở gần chỗ bắt đầu chương trình. Tệp stdio.h định nghĩa các macro và biến cùng các

hàm dùng trong thư viện vào/ra. Dùng dấu ngoặc < và > thay cho các dấu nháy thông

thường để chỉ thị cho trình biên dịch tìm kiếm tệp trong danh mục chứa thông tin tiêu

đề chuẩn.

pdf11 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 1688 | Lượt tải: 2download
Tóm tắt nội dung Ngôn ngữ lập trình C - Chương 2: Các lệnh vào ra, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 Hàm putch() : 
Cách dùng : 
 Dùng câu lệnh sau : 
 putch(ch); 
Công dụng : 
 Đưa ký tự ch lên màn hình tại vị trí hiện tại của con trỏ. Ký tự sẽ được hiển thị 
theo màu xác định trong hàm textcolor. 
Hàm cũng trả về ký tự được hiển thị. 
2.3. Đưa kết quả lên màn hình - hàm printf : 
Cách dùng : 
 prinf(điều khiển, đối số 1, đối số 2, ...); 
 Hàm printf chuyển, tạo khuôn dạng và in các đối của nó ra thiết bị ra chuẩn 
dưới sự điều khiển của xâu điều khiển. Xâu điều khiển chứa hai kiểu đối tượng : các 
ký tự thông thường, chúng sẽ được đưa ra trực tiếp thiết bị ra, và các đặc tả chuyển 
dạng, mỗi đặc tả sẽ tạo ra việc đổi dạng và in đối tiếp sau của printf. 
Chuỗi điều khiển có thể có các ký tự điều khiển : 
 \n sang dòng mới 
Chương 2: Các lệnh vào ra 
20 
 \f sang trang mới 
 \b lùi lại một bước 
 \t dấu tab 
Dạng tổng quát của đặc tả : 
 %[-][fw][.pp]ký tự chuyển dạng 
 Mỗi đặc tả chuyển dạng đều được đưa vào bằng ký tự % và kết thúc bởi một 
ký tự chuyển dạng. Giữa % và ký tự chuyển dạng có thể có : 
Dấu trừ : 
 Khi không có dấu trừ thì kết quả ra được dồn về bên phải nếu độ dài thực tế 
của kết quả ra nhỏ hơn độ rộng tối thiểu fw dành cho nó. Các vị trí dư thừa sẽ 
 được lấp đầy bằng các khoảng trống. Riêng đối với các trường số, nếu dãy số 
fw bắt đầu bằng số 0 thì các vị trí dư thừa bên trái sẽ được lấp đầy bằng các số 0. 
 Khi có dấu trừ thì kết quả được dồn về bên trái và các vị trí dư thừa về bên 
phải ( nếu có ) luôn được lấp đầy bằng các khoảng trống. 
 fw : 
 Khi fw lớn hơn độ dài thực tế của kết quả ra thì các vị trí dư thừa sẽ 
được lấp đầy bởi các khoảng trống hoặc số 0 và nội dung của kết quả ra sẽ được đẩy 
về bên phải hoặc bên trái. 
 Khi không có fw hoặc fw nhỏ hơn hay bằng độ dài thực tế của kết quả 
ra thì độ rộng trên thiết bị ra dành cho kết quả sẽ bằng chính độ dài của nó. 
 Tại vị trí của fw ta có thể đặt dấu *, khi đó fw được xác định bởi giá trị 
 nguyên của đối tương ứng. 
 Ví dụ : 
Kết quả ra fw Dấu - Kết quả đưa ra 
-2503 8 có -2503 
-2503 08 có -2503 
-2503 8 không -2503 
-2503 08 không 000-2503 
Chương 2: Các lệnh vào ra 
21 
"abcdef" 8 không abcdef 
"abcdef" 08 có abcdef 
"abcdef" 08 không abcdef 
 pp : 
 Tham số pp chỉ được sử dụng khi đối tương ứng là một xâu ký tự hoặc 
một giá trị kiểu float hay double. 
 Trong trường hợp đối tương ứng có giá trị kiểu float hay double thì pp 
là độ chính xác của trường ra. Nói một cách cụ thể hơn giá trị in ra sẽ có pp chữ 
số sau số thập phân. 
 Khi vắng mặt pp thì độ chính xác sẽ được xem là 6. 
 Khi đối là xâu ký tự : 
 Nếu pp nhỏ hơn độ dài của xâu thì chỉ pp ký tự đầu tiên của xâu được 
in ra. Nếu không có pp hoặc nếu pp lớn hơn hay bằng độ dài của xâu thì cả xâu 
ký tự sẽ được in ra. 
 Ví dụ : 
Kết quả ra fw pp Dấu - Kết quả đưa ra Độ dài trường ra 
-435.645 10 2 có -435.65 7 
-435.645 10 0 có -436 4 
-435.645 8 vắng có -435.645000 11 
"alphabeta" 8 3 vắng alp 3 
"alphabeta" vắng vắng vắng alphabeta 9 
"alpha" 8 6 có alpha 5 
Các ký tự chuyển dạng và ý nghĩa của nó : 
 Ký tự chuyển dạng là một hoặc một dãy ký hiệu xác định quy tắc chuyển dạng 
và dạng in ra của đối tương ứng. Như vậy sẽ có tình trạng cùng một số sẽ được in ra 
theo các dạng khác nhau. Cần phải sử dụng các ký tự chuyển dạng theo đúng qui tắc 
định sẵn. Bảng sau cho các thông tin về các ký tự chuyển dạng. 
Ký tự chuyển dạng ý nghĩa 
Chương 2: Các lệnh vào ra 
22 
d Đối được chuyển sang số nguyên hệ thập phân 
o Đối được chuyển sang hệ tám không dấu ( không có số 0 
đứng trước ) 
x Đối được chuyển sang hệ mưới sáu không dấu ( không có 
0x đứng trước ) 
u Đối được chuyển sang hệ thập phân không dấu 
c Đối được coi là một ký tự riêng biệt 
s Đối là xâu ký tự, các ký tự trong xâu được in cho tới khi 
gặp ký tự không hoặc cho tới khi đủ số lượng ký tự được 
xác định bởi các đặc tả về độ chính xác pp. 
e Đối được xem là float hoặc double và được chuyển sang 
dạng thập phân có dạng [-]m.n..nE[+ hoặc -] với độ dài của 
xâu chứa n là pp. 
f Đối được xem là float hoặc double và được chuyển sang 
dạng thập phân có dạng [-]m..m.n..n với độ dài của xâu 
chứa n là pp. Độ chính xác mặc định là 6. Lưu ý rằng độ 
chính xác không xác định ra số các chữ số có nghĩa phải in 
theo khuôn dạng f. 
g Dùng %e hoặc %f, tuỳ theo loại nào ngắn hơn, không in các 
số 0 vô nghĩa. 
Chú ý : 
 Mọi dãy ký tự không bắt đầu bằng % hoặc không kết thúc bằng ký tự chuyển 
dạng đều được xem là ký tự hiển thị. 
 Để hiển thị các ký tự đặc biệt : 
Cách viết Hiển thị 
\' ' 
\" " 
\\ \ 
Các ví dụ : 
1 printf("\" Nang suat tang : %d % \" \n\\d"",30,- "Nang suat tang ; 30 %" 
Chương 2: Các lệnh vào ra 
23 
50); \d=-50 
2 n=8 
float x=25.5, y=-47.335 
printf("\n%f\n%*.2f",x,n,y); 
Lệnh này tương đương với 
printf("\n%f\n%8.2f",x,n,y); 
Vì n=8 tương ứng với vị trí * 
25.500000 
 -47.34 
2.4. Vào số liệu từ bàn phím - hàm scanf : 
 Hàm scanf là hàm đọc thông tin từ thiết bị vào chuẩn ( bàn phím ), chuyển 
dịch chúng ( thành số nguyên, số thực, ký tự vv.. ) rồi lưu trữ nó vào bộ nhớ theo các 
địa chỉ xác định. 
Cách dùng : 
 scanf(điều khiển,đối 1, đối 2, ...); 
 Xâu điều khiển chứa các đặc tả chuyển dạng, mỗi đặc tả sẽ tạo ra việc đổi dạng 
biến tiếp sau của scanf. 
Đặc tả có thể viết một cách tổng quát như sau : 
 %[*][d...d]ký tự chuyển dạng 
 Việc có mặt của dấu * nói lên rằng trường vào vẫn được dò đọc bình thường, 
nhưng giá trị của nó bị bỏ qua ( không được lưu vào bộ nhớ ). Như vậy đặc tả chứa 
dấu * sẽ không có đối tương ứng. 
 d...d là một dãy số xác định chiều dài cực đại của trường vào, ý nghĩa của nó 
được giải thích như sau : 
 Nếu tham số d...d vắng mặt hoặc nếu giá trị của nó lớn hơn hay bằng độ dài 
của trường vào tương ứng thì toàn bộ trường vào sẽ được đọc, nội dung của nó được 
dịch và được gán cho địa chỉ tương ứng ( nếu không có dấu * ). 
 Nếu giá trị của d...d nhỏ hơn độ dài của trường vào thì chỉ phần đầu của trường 
có kích cỡ bằng d...d được đọc và gán cho địa chỉ của biến tương ứng. Phần còn lại 
của trường sẽ được xem xét bởi các đặc tả và đối tương ứng tiếp theo. 
Chương 2: Các lệnh vào ra 
24 
Ví dụ : 
 int a; 
 float x,y; 
 char ch[6],ct[6] 
 scanf("%f%5f%3d%3s%s",&x&y&a&ch&ct0; 
 Với dòng vào : 54.32e-1 25 12452348a 
 Kết quả là lệnh scanf sẽ gán 
 5.432 cho x 
 25.0 cho y 
 124 cho a 
 xâu "523" và dấu kết thúc \0 cho ch 
 xâu "48a" và dấu kết thúc \0 cho ct 
Ký tự chuyển dạng : 
 Ký tự chuyển dạng xác định cách thức dò đọc các ký tự trên dòng vào cũng 
như cách chuyển dịch thông tin đọc đựợc trước khi gán nó cho các địa chỉ tương ứng. 
 Cách dò đọc thứ nhất là đọc theo trường vào, khi đó các khoảng trắng bị bỏ 
qua. Cách này áp dụng cho hầu hết các trường hợp. 
 Cách dò đọc thứ hai là đọc theo ký tự, khi đó các khoảng trắng cũng được xem 
xét bình đẳng như các ký tự khác. Phương pháp này chỉ xảy ra khi ta sử dụng một 
trong ba ký tự chuyển dạng sau : C, [ dãy ký tự ], [^ dãy ký tự ] 
Các ký tự chuyển dạng và ý nghĩa của nó : 
c Vào một ký tự, đối tương ứng là con trỏ ký tự. Có xét ký tự khoảng 
trắng 
d Vào một giá trị kiểu int, đối tương ứng là con trỏ kiểu int. Trường phải 
vào là số nguyên 
ld Vào một giá trị kiểu long, đối tương ứng là con trỏ kiểu long. Trường 
phải vào là số nguyên 
o Vào một giá trị kiểu int hệ 8, đối tương ứng là con trỏ kiểu int. Trường 
Chương 2: Các lệnh vào ra 
25 
phải vào là số nguyên hệ 8 
lo Vào một giá trị kiểu long hệ 8, đối tương ứng là con trỏ kiểu long. 
Trường phải vào là số nguyên hệ 8 
x Vào một giá trị kiểu int hệ 16, đối tương ứng là con trỏ kiểu int. Trường 
phải vào là số nguyên hệ 16 
lx Vào một giá trị kiểu long hệ 16, đối tương ứng là con trỏ kiểu long. 
Trường phải vào là số nguyên hệ 16 
f hay e Vào một giá trị kiểu float, đối tương ứng là con trỏ float, trường vào 
phải là số dấu phảy động 
lf hay le Vào một giá trị kiểu double, đối tương ứng là con trỏ double, trường 
vào phải là số dấu phảy động 
s Vào một giá trị kiểu double, đối tương ứng là con trỏ kiểu char, trường 
vào phải là dãy ký tự bất kỳ không chứa các dấu cách và các dấu xuống 
dòng 
 [ Dãy ký tự ], [ ^Dãy ký tự ] Các ký tự trên dòng vào sẽ lần lượt được đọc cho đến 
khi nào gặp một ký tự không thuộc tập các ký tự đặt trong[]. Đối tương ứng là con trỏ 
kiểu char. Trường vào là dãy ký tự bất kỳ ( khoảng trắng được xem như một ký tự ). 
Ví dụ : 
 int a,b; 
 char ch[10], ck[10]; 
 scanf("%d%[0123456789]%[^0123456789]%3d",&a,ch,ck,&b); 
 Với dòng vào : 
 35 13145 xyz 584235 
 Sẽ gán : 
 35 cho a 
 xâu "13145" cho ch 
 xâu "xyz' cho ck 
 584 cho b 
Chú ý : 
Chương 2: Các lệnh vào ra 
26 
 Xét đoạn chương trình dùng để nhập ( từ bàn phím ) ba giá trị nguyên rồi gán 
cho ba biến a,b,c như sau : 
 int a,b,c; 
 scanf("%d%d%d”,&a,&b,&c); 
Để vào số liệu ta có thể thao tác theo nhiều cách khác nhau: 
Cách 1 : 
 Đưa ba số vào cùng một dòng, các số phân cách nhau bằng dấu cách hoặc dấu 
tab. 
Cách 2 : 
 Đưa ba số vào ba dòng khác nhau. 
Cách 3 : 
 Hai số đầu cùng một dòng ( cách nahu bởi dấu cách hoặ tab ), số thứ ba trên 
dòng tiếp theo. 
Cách 4 : 
 Số thứ nhất trên một dòng, hai số sau cùng một dòng tiếp theo ( cách nahu bởi 
dấu cách hoặ tab ), số thứ ba trên dòng tiếp theo. 
 Khi vào sai sẽ báo lỗi và nhảy về chương trình chứa lời gọi nó. 
2.5. Đưa kết quả ra máy in : 
 Để đưa kết quả ra máy in ta dùng hàm chuẩn fprintf có dạng sau : 
 fprintf(stdprn, điều khiển, biến 1, biến 2,...); 
 Tham số stdprn xác định thiết bị đưa ra là máy in. 
 Điều khiển có dạng đặc tả như lệnh printf. 
 Dùng giống như lệnh printf, chỉ khác là in ra máy in. 
Ví dụ : 
 Đoạn chương trình in ma trận A, cỡ 8x6. Mỗi hàng của ma trận được in trên 
một dòng : 
 float a[8][6]; 
 int i,j; 
 fprintf(stdprn,"\n%20c MA TRAN A\n\n\n",' '); 
Chương 2: Các lệnh vào ra 
27 
 for (i=0;i<8;++i) 
 { for (j=0;j<6;++j) 
 fprintf(stdprn,"%10.2f",a[i][j]); 
 fprintf(stdprn,"\n"); 
 } 

File đính kèm:

  • pdfCHUONG_2.pdf