VIII. Các hàm số học chuẩn:
II.1 Mẫ u:
int scanf(“xâu định dạng”, dãy địa chỉ các biến) Ví dụ : int x,y;
scanf(“%d%d”,&x,&y);
Dòng vào : là dãy kí tự liên tiếp nhập từ thiết bị vào, cuối dòng vào là kí tự \n.
Trong dòng vào có các khoảng trắng, dấu tab, ... các thành phần này là dấu phân cách giữa các trường vào.
Ở đây có sự tương ứng 1-1 và đúng trình tự giữa các mã định dạng trong xâu định dạng và dãy các địa chỉ các biến.
Xâu định dạng : %[*][dd]]kítựđịnhdạng
• Dấu * : Trường vào vẫn đọc bình thường nhưng không được lưu vào bộ nhớ. Vì vậy sẽ không có đối tương ứng.
• dd : dãy số xác định độ dài trường vào.
- Nếu dd vắng mặt hoặc dd lớn hơn độ dài của trường vào thì toàn bộ trường vào được đọc và ghi vào vùng nhớ tương ứng.
- Nếu dd nhỏ hơn độ dài của trường vào thì chỉ có phần đầu của trường vào có kích cỡ dd được đọc và ghi vào vùng nhớ tương ứng, phần còn lại được xem xét sau.
Ví dụ : int a; float x,y;
char ch[10],ct[10];
scanf("%f%5f%3d%3s%s",&x,&y,&a,ch,ct); Khi ta nhập vào 12345 12 12345678abcd thì : x=12345
y=12 a=123
ch=”456” (có kí tự NULL ở cuối) ct=”78abcd” (có kí tự NULL ở cuối)
• Kí tự định dạng : c,[dãy kí tự],[^dãy kí tự] Kí tự định dạng Ý nghĩa
%c Đọc một kí tự kiểu char %d Đọc số nguyên int %u Đọc unsigned int
%hd Đọc số nguyên kiểu short int %ld Đọc số nguyên kiểu long int
%lu Đọc số nguyên kiểu unsigned long int %x Đọc số nguyên dạng Hexa
%o Đọc số nguyên dạng Octal
%f Đọc số thực float theo kiểu viết thường hay viết theo số mũ %e Đọc số thực float viết theo số mũ
%lf hoặc %lu Đọc số thực double
%s Đọc xâu kí tự không chứa dấu cách, dùng địa chỉ của xâu kí tự [dãy kí tự]:
Các kí tự trên dòng vào sẽ được đọc nếu thuộc dãy kí tự trong 2 dấu []. Đối tương ứng phải là con trỏ kiểu char trỏ tới vùng nhớ đủ lớn.
[^dãy kí tự]:
Các kí tự trên dòng vào sẽ được đọc lần lượt cho đến khi gặp 1 kí tự thuộc dãy kí tự trong 2 dấu []. Đối tương ứng phải là con trỏ kiểu char trỏ tới vùng nhớ đủ lớn.
Một số lỗi hay mắc phải :
- Mã định dạng không phù hợp với kiểu của biểu thức. - Số mã định dạng không tương ứng với số biểu thức. Ví dụ : #include <stdio.h> #include <conio.h> main() { char x[10],y[10];
printf("\nNhap vao day :");
scanf("%[1234567890]%[^0123456789]",x,y); printf("\n%s",x); printf("\n%s",y); getch(); return 0; }
Khi ta nhập 12345abcdefg123 thì kết quả sẽ là : x=12345 và y=abcdefg.
• Giá trị trả về của hàm :
Hàm trả về số nguyên bằng số các giá trị nhận được (lưu vào bộ nhớ). Trong ví dụ trên, giá trị trả về của hàm là 2.
• Dãy các địa chỉ của các biến :
Là các con trỏ chứa địa chỉ của các biến, các địa chỉ này cách nhau dấu phẩy. Ví dụ : int a; char b; scanf(“%c%d”,&b,&a); và ta nhập c^3 thì b=’c’ và a=3. Ví dụ : int a; char b; scanf(“%d%c”,a,b); và ta nhập 3^c thì a=3 và b=’^‘. Ví dụ : int a; char b; scanf(“%d %c”,a,b); và ta nhập 3^c thì a=3 và b=’c‘.
Như vậy nếu giữa 2 mã định dạng ta có thêm vào các khoảng trắng thì khi nhập dữ liệu, máy sẽ nhảy qua các khoảng trắng, dấu xuống dòng, dấu tab... đến khi gặp kí tự khác.
Ví dụ : int a,b;
scanf(“%d%d”,&x,&y);
Nếu ta gõ vào 34^^45 thì x=34,y=45.
Nếu ta gõ ^^^34^^45^^^^ hoặc nhập hai số đó trên nhiều dòng thì vẫn có kết quả trên.
• Khuôn đọc : khuôn đọc cũng như khuôn in. Ví dụ : scanf(“%3d %3d”,&a,&b);
Ta nhập vào 12^^23 kết quả : a=12;b=23. 1234567 kết quả : a=123;b=456.
Chúng ta nên nhập vào các số trên từng dòng để không bị lẫn lộn. Ví dụ : #include <stdio.h> #include <conio.h> main() { int x,y; printf(“\nNhap vao so x :”); scanf(“%d”,&x); printf(“\nNhap vao so y :”); scanf(“%d”,&y); printf(“\nx=%d”,x); printf(“\ny=%d”,y); getch(); return 0; }
Nhap vao so y : x=23
y=34
Dữ liệu nhập vào từ bàn phím được lưu vào stdin để chờ xử lí chứ không được xử lí trực tiếp từ bàn phím. Do dữ liệu đã có sẵn trong stdin nên máy tính đọc luôn số này và gán cho biến tương ứng mà không chờ ta gõ tiếp vào từ bàn phím. Trong stdin sẽ còn lại các kí tự ^^^ và kí tự xuống dòng (\n).