chương 3 cung cấp các khái niệm về vào ra dữ liệu và các cấu trúc điều khiển chương trình c Khai báo thư viện chương trình Lệnh đưa dữ liệu ra màn hình Lệnh nhập dữ liệu vào từ bàn phím Cú pháp: printf(xâu_định_dạng, danh_sách_tham_số); Trong đó: xâu_định_dạng: đặt trong cặp dấu , quy định cách thức hiển thị dữ liệu ra màn hình máy tính, bao gồm 3 loại ký tự: + Ký tự văn bản thông thường + Ký tự điều khiển + Đặc tả
Trang 1CHƯƠNG 3: VÀO/RA DỮ LIỆU VÀ CÁC CẤU TRÚC ĐIỀU KHIỂN CHƯƠNG TRÌNH
BÀI GIẢNG HỌC PHẦN
KỸ THUẬT LẬP TRÌNH
Trang 2Nội dung
3.1 Vào/ra dữ liệu
3.2 Các cấu trúc điều khiển chương trình
Trang 33.1 Vào/ra dữ liệu
• Khai báo thư viện chương trình
• Lệnh đưa dữ liệu ra màn hình
• Lệnh nhập dữ liệu vào từ bàn phím
Trang 4Khai báo thư viện chương trình
• Để có thể sử dụng các lệnh vào/ra dữ liệu, cần khai
báo tệp tiêu đề stdio.h (standard input/output)
#include <stdio.h>
hoặc #include "stdio.h"
Trang 5+ Ký tự văn bản thông thường
+ Ký tự điều khiển
+ Đặc tả
- danh_sách_tham_số: danh sách các giá trị được hiển thị theo quy định trong xâu định dạng, được viết ngăn cách nhau bởi dấu phẩy, gồm: tên biến, tên hằng, biểu
Trang 7 Kết quả hiển thị trên màn hình: a+b
• Một số ký tự đặc biệt cần đặt liền sau ký hiệu \
\" in ra ký tự "
\\ in ra ký tự \
Trang 9xâu_định_dạng (3)
• Đặc tả: Xác định kiểu dữ liệu của giá trị muốn xuất
%i, %d Số nguyên hệ 10 có dấu int, char
%u Số nguyên hệ 10 không dấu unsigned int/
char
%o Số hệ 8 không dấu (không có số 0 đứng trước) int, char
%x, %X
Số hệ 16 không dấu chữ thường/chữ hoa (không có int, char
Trang 10xâu_định_dạng (4)
• Đặc tả: (tiếp)
%li,%ld Số nguyên hệ 10 có dấu long
%lu Số nguyên hệ 10 không dấu unsigned long
%lo Số hệ 8 không dấu (không
có số 0 đứng trước) long
%lx,
%lX
Số hệ 16 không dấu chữ thường/chữ hoa (không có 0x đứng trước)
long
Trang 11xâu_định_dạng (5)
• Đặc tả: (tiếp)
%s Hiển thị xâu ký tự kết thúc bởi '\0' char[]
%f Số thực dấu phẩy tĩnh float, double
%e, %E Số thực dấu phẩy động float, double
%g Dùng %f hoặc %e tùy thuộc loại nào ngắn hơn float, double
Trang 13Độ rộng hiển thị - đối với số nguyên
Trang 14Độ rộng hiển thị - đối với số thực (1)
Trang 15Độ rộng hiển thị - đối với số thực (2)
Trang 16Độ rộng hiển thị - Lưu ý (1)
• Đối với các ký tự và xâu ký tự, định dạng độ rộng hiển thị tương tự như đối với số nguyên
• Ví dụ:
printf("\n%3d%15s%3c",1,"Tran Ngoc Anh",'A');
printf("\n%3d%15s%3c",2,"Nguyen Sao Mai",'B');
Kết quả hiển thị trên màn hình:
˽˽1˽˽Tran Ngoc Anh˽˽A
˽˽2˽Nguyen Sao Mai˽˽B
Trang 17Độ rộng hiển thị - Lưu ý (2)
• Khi số chỗ cần thiết để hiển thị nội dung dữ liệu lớn hơn trong định dạng hệ thống tự cung cấp thêm chỗ để hiển thị dữ liệu trong các trường hợp: số nguyên, phần nguyên của số thực, ký tự, xâu ký tự
Trang 18Căn lề trái/phải
• Khi có định dạng độ rộng hiển thị dữ liệu, ngôn ngữ
C mặc định căn lề phải; để căn lề trái cần thêm dấu - ngay sau ký hiệu %
• Ví dụ:
printf("\n%-3d%-15s%-3c",1,"Tran Ngoc Anh",'A'); printf("\n%-3d%-15s%-3c",2,"Nguyen Sao Mai",'B');
Kết quả hiển thị trên màn hình:
1˽˽Tran Ngoc Anh˽˽A˽˽
2˽˽Nguyen Sao Mai˽B˽˽
Trang 20Lệnh nhập dữ liệu vào từ bàn phím (2)
• Lưu ý:
danh_sách_tham_số phải phù hợp với các đặc tả trong xâu_định_dạng cả về số lượng, kiểu dữ liệu, thứ tự
Trang 21xâu_định_dạng (1)
• Đặc tả:
Trang 22xâu_định_dạng (2)
• Đặc tả: (tiếp)
%s Xâu ký tự kết thúc bởi '\0' char[]
Trang 23Ví dụ (1)
• Chương trình nhập các dữ liệu nguyên, thực, ký tự
từ bàn phím rồi hiển thị lại các kết quả đã nhập:
Trang 25Ví dụ (3)
• Chạy thử chương trình:
Trang 26- Hàm scanf coi mọi ký tự có trong bộ đệm của thiết
bị vào chuẩn đều là hợp lệ, kể cả các ký tự Enter, Tab, hay Spacebar
Trang 313.2 Các cấu trúc điều khiển chương trình
• Cấu trúc rẽ nhánh
• Cấu trúc lặp
Trang 32Cấu trúc rẽ nhánh
• Cấu trúc if
• Cấu trúc switch
Trang 34- if (diem>=4)
printf("Do!");
else printf("Truot!");
- if (b>0)
printf("b la so duong");
Trang 35printf("%6.2f la so am, khong co can bac hai",a); return 0;
}
Trang 36Ví dụ về cấu trúc if (3)
Bài tập:
1 Viết chương trình cho phép người dùng nhập vào 3
số thực a,b,c từ bàn phím Kiểm tra xem a,b,c có thỏa mãn điều kiện độ dài 3 cạnh của 1 tam giác hay không, nếu có, tính diện tích và chu vi của tam giác rồi thông báo kết quả ra màn hình
2 Viết chương trình cho phép người dùng nhập vào một số nguyên dương n từ bàn phím, kiểm tra xem
n có phải là số chính phương hay không, thông báo kết quả ra màn hình
Trang 37if (a<0) printf("a la so am"); else
printf("a la so 0");
• Các cấu trúc if có thể viết lồng nhau, khi đó else đi với if gần nhất trước nó
Trang 38• Ví dụ 2:
if (a!=0) {
if (a>0) printf("a la so duong"); else
printf("a la so am");
Trang 39else
câu_lệnh_n+1;
Trang 41case hằng_1:
các_câu_lệnh;break;
case hằng_2:
các_câu_lệnh;break;
…case hằng_n:
các_câu_lệnh;break;
default:
các_câu_lệnh;
Trang 42Cấu trúc switch (2)
• Hoạt động:
- Máy tính xác định giá trị của biểu_thức, giả sử bằng hằng_i (i=1 n), khi đó nó sẽ nhảy đến câu lệnh có nhãn case hằng_i và thực hiện tất cả các câu lệnh sau đó cho đến khi nào gặp break hoặc dấu } kết thúc switch
- Khi giá trị biểu_thức khác với mọi hằng_i, máy sẽ nhảy đến câu lệnh có nhãn default (dạng 2) hoặc ra khỏi switch (dạng 1)
Trang 43Cấu trúc switch (3)
• Lưu ý:
- biểu_thức, hằng_1, hằng_2, …, hằng_n phải cùng kiểu và là các kiểu số nguyên hoặc kiểu ký tự (không được là kiểu số thực)
- Từ khóa case là bắt buộc phải có trước một hằng Nếu các_câu_lệnh là giống nhau với một số hằng (giả sử là hằng_i, j, k) thì có thể viết gọn theo cách:
Trang 44Cấu trúc switch (4)
• Lưu ý: (tiếp)
- hằng_1, hằng_2, …, hằng_n phải là các giá trị khác nhau
- Cần đưa break (có thể thay thế bằng goto hoặc return tùy từng trường hợp) vào cuối mỗi case, trừ trường hợp case đó là case cuối cùng trong switch (dạng 1, không có default)
- Các cấu trúc switch có thể viết lồng nhau
Trang 45Cấu trúc switch (5)
• Ví dụ 1:
switch (thu)
{
case 1: printf("Sunday"); break;
case 2: printf("Monday"); break;
case 3: printf("Tuesday"); break;
case 4: printf("Wednesday"); break;case 5: printf("Thursday"); break;
case 6: printf("Friday"); break;
case 7: printf("Saturday");
}
Trang 46Cấu trúc switch (6)
• Ví dụ 2:
switch (thu)
{
case 1: printf("Sunday"); break;
case 2: printf("Monday"); break;
case 3: printf("Tuesday"); break;
case 4: printf("Wednesday"); break;case 5: printf("Thursday"); break;
case 6: printf("Friday"); break;
case 7: printf("Saturday"); break;
Trang 48printf("30 ngay"); break;
default: printf("31 ngay");
Trang 50- biểu_thức_3: dùng để thay đổi giá trị của biến điều
Trang 51- Bước 4: Xác định biểu_thức_3, quay lại bước 2 để bắt đầu một vòng lặp mới
Trang 52- biểu_thức_2 vắng mặt tương đương với việc nó
Trang 53if (i>=10) break;
printf("%d\n",i);
}
- for(i=0;i<=9;i++) {
for(j=0;j<=9;j++) printf("%5d",i+j);printf("\n");
Trang 56- Bước 1: Xác định giá trị của biểu_thức
- Bước 2: Nếu biểu_thức nhận giá trị sai, thoát khỏi while; nếu biểu_thức nhận giá trị đúng, thực hiện câu_lệnh rồi quay lại bước 1
• Ví dụ: i=0;
while (i<10)
{
Trang 60Cấu trúc while (5)
• Bài tập:
1 Viết chương trình cho phép người dùng nhập vào tử
số và mẫu số của phân số a/b In ra dạng tối giản của phân số đó
2 Dùng câu lệnh while làm lại các bài tập phần vòng lặp for (slide 55)
Trang 61- Bước 1: Thực hiện các_câu_lệnh
- Bước 2: Xác định giá trị của biểu_thức Nếu biểu_thức nhận giá trị sai, thoát khỏi do while; nếu biểu_thức nhận giá trị đúng, quay lại bước 1
Trang 65Cấu trúc do while (5)
• Bài tập:
1 Dùng câu lệnh do while làm lại các bài tập phần vòng lặp while (slide 60)
Trang 66i ;
}while (i<10);
- …
Trang 67- Cho phép bỏ qua các câu lệnh sau continue trong lần lặp hiện tại và:
+ Chuyển tới bước xác định biểu_thức_3 rồi quay lại vòng lặp mới đối với for
+ Chuyển tới bước xác định giá trị của biểu thức đối với
Trang 69goto lap;
}printf("Tong s = %d",s);return 0;
}
Trang 70Nhãn và goto (3)
• Lưu ý:
- go to và nhãn cần nằm trong một hàm; goto cho phép nhảy từ vị trí câu lệnh này tới câu lệnh khác trong thân một hàm nhưng không cho phép nhảy từ hàm này sang hàm khác
- goto không cho phép nhảy từ ngoài vào trong một khối lệnh nhưng cho phép nhảy từ trong ra ngoài khối lệnh