Bài giảng Tin học đại cương - Phần 3, Chương 3: Vào ra dữ liệu

pptx 82 trang haiha333 07/01/2022 2970
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Tin học đại cương - Phần 3, Chương 3: Vào ra dữ liệu", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptxbai_giang_tin_hoc_dai_cuong_phan_3_chuong_3_vao_ra_du_lieu.pptx

Nội dung text: Bài giảng Tin học đại cương - Phần 3, Chương 3: Vào ra dữ liệu

  1. Phần 3: Lập trình C Nội dung chính • Chương 1: Tổng quan về ngôn ngữ C • Chương 2: Kiểu dữ liệu và biểu thức trong C • Chương 3: Vào ra dữ liệu • Chương 4: Cấu trúc điều khiển • Chương 5: Mảng, con trỏ và xâu ký tự • Chương 6: Cấu trúc • Chương 7: Hàm • Chương 8: Tệp dữ liệu 01-Jan-16 93
  2. Chương 3: Vào ra dữ liệu Nội dung chính 1. Các hàm vào ra cơ bản: – printf() – scanf() 2. Các hàm vào ra khác – gets() – puts() – getch() 01-Jan-16 94
  3. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản Các hàm vào ra cơ bản • Đưa ra dữ liệu: –printf() • Nhập dữ liệu –scanf() • Cần nạp thư viện stdio.h –khai báo tệp tiêu đề : #include 01-Jan-16 95
  4. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản Hàm đưa ra dữ liệu printf() 01-Jan-16 96
  5. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → printf() Mục đích • Hiển thị ra màn hình các loại dữ liệu cơ bản – Số nguyên, số thực, kí tự, xâu kí tự • Tạo một số hiệu ứng hiển thị đặc biệt – Xuống dòng, sang trang, Cú pháp printf(xau_dinh_dang [, DS_tham_so]); 01-Jan-16 97
  6. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → printf() Cú pháp printf(xau_dinh_dang [, DS_tham_so]); • Xau_dinh_dang: Là một xâu qui định cách thức hiển thị dữ liệu ra màn hình máy tính. – Bao gồm các nhóm kí tự định dạng – Nhóm kí tự định dạng thứ k xác định quy cách hiển thị tham số thứ k trong DS_tham_số • Số lượng tham số trong DS_tham_số bằng số lượng nhóm các kí tự định dạng trong xâu_định_dạng. • DS_tham_so: Danh sách các biến/biểu thức sẽ được hiển thị giá trị lên màn hình theo cách thức được qui định trong xau_dinh_dang. 01-Jan-16 98
  7. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → printf() Ví dụ #include void main() { int a = 5; float x = 1.234; printf(” Hien thi mot bieu thuc nguyen %d và mot so thuc %f ”,2 * a, x); } Kết quả: Hien thi mot bieu thuc nguyen 10 va mot so thuc 1.234000 01-Jan-16 99
  8. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → printf() Xâu định dạng • Các kí tự thông thường: – Được hiển thị ra màn hình. • Các kí tự điều khiển: – Dùng để tạo các hiệu ứng hiển thị đặc biệt như xuống dòng (‘\n’) • Các nhóm kí tự định dạng: – Xác định quy cách hiển thị các tham số trong phần danh_sach_tham_so. 01-Jan-16 100
  9. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → printf() Nhóm ký tự định dạng • Mỗi nhóm kí tự định dạng chỉ dùng cho một kiểu dữ liệu” Ví dụ: %d dùng cho kiểu nguyên %f dùng cho kiểu thực • DS_tham_so phải phù hợp với các nhóm kí tự định dạng trong xau_dinh_dang về: – Số lượng; Nếu không phù hợp sẽ hiển – Thứ tự thị ra kết quả không như ý – Kiểu dữ liệu; printf(” %d ” ,3.14); →-31457 C-Free →1374389535 !? 01-Jan-16 101
  10. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → printf() Các ký tự định dạng Ký tự Kiểu dữ liệu Kết quả %i, %d int, char Số thập phân %o int, char Số bát phân (không có 0 đằng trước) %x %X int, char Số hexa (chữ thường/chữ hoa) %u unsigned int/char Số thập phân 01-Jan-16 102
  11. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → printf() Các ký tự định dạng Ký tự Kiểu dữ liệu Kết quả %ld, %li long Số thập phân %lo long Số bát phân (không có 0 đằng trước) %lx, %LX long Số hexa (chữ thường/chữ hoa) %lu unsigned long Số thập phân Nhận xét: Với kiểu long, thêm ký tự l ngay sau dấu % 01-Jan-16 103
  12. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → printf() Các ký tự định dạng Ký tự Kiểu dữ liệu Kết quả %f float/double Số thực dấu phẩy tĩnh %e, %E float/double Số thực dấu phẩy động %c int, char Kí tự đơn lẻ %s char [] Hiển thị xâu kí tự kết thúc bởi ‘\0’ %% Hiển thị kí tự % 01-Jan-16 104
  13. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → printf() Độ rộng hiển thị → Số nguyên, Ký tự, Xâu ký tự • Có dạng “%m”, – m là một giá trị nguyên, không âm. – m cho biết số chỗ trống dành cho hiển thị biểu thức tương ứng Ví dụ: int a = 1234; printf(“%5d”,a) → 1234 printf(“%5d”,34)→ 34 ký hiệu cho dấu trắng (space) 01-Jan-16 105
  14. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → printf() Độ rộng hiển thị→Ví dụ printf("\n%3d %15s %3c", 1, "nguyen van a", 'g'); printf("\n%3d %15s %3c", 2, "tran van b", 'k'); 1 nguyen van a g 2 tran van b k 01-Jan-16 106
  15. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → printf() Độ rộng hiển thị → Số thực • Có dạng “%m.n”, – m, n là 2 giá trị nguyên, không âm. – m cho biết kích thước để hiển thị số thực – n cho biết kích thước dành cho phần thập phân, nếu không đủ C sẽ làm tròn khi hiển thị Ví dụ: printf("\n%f",17.345); → 17.345000 printf("\n%.2f",17.345); → 17.35 printf("\n%8.2f",17.345); → 17.35 01-Jan-16 107
  16. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → printf() Độ rộng hiển thị→ Chú ý • Nếu số chỗ cần để hiển thị dữ liệu lớn hơn được cung cấp trong định dạng Tự động cung cấp thêm chỗ mới để hiển thị đầy đủ, không cắt bớt nội dung của dữ liệu. Ví dụ: printf(“%2d”, 1234); → 1234 printf(“%6.3f”, 123.456); → 123.456 printf(“%12.6e”, 123.456); →1.234560e+02 printf(“%12.3e”, 123.456); →1.235e+02 01-Jan-16 C-Free →1.235e+002 108
  17. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → printf() Căn lề trái - căn lề phải %- • Khi hiển thị dữ liệu có sử dụng tham số độ rộng, để căn lề trái cần thêm dấu trừ - vào ngay sau dấu %: – Ngầm định, căn lề phải Ví dụ: printf("%-3d%-10s%-5.2f%-3c",5,"Hello",7.5, 'g') →5Hello7.50g 01-Jan-16 109
  18. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản Hàm nhập dữ liệu scanf() 01-Jan-16 110
  19. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Mục đích Dùng để nhập dữ liệu từ bàn phím • Ký tự đơn lẻ • Chuỗi ký tự • Số nguyên – Thập phân, Bát phân, Hexa • Số thực – Dấu phẩy tĩnh; Dấu phẩy động Cú pháp scanf(xau_dinh_dang[,DS_dia_chi]); 01-Jan-16 111
  20. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Cú pháp scanf(xau_dinh_dang [, DS_dia_chi]); Xau_dinh_dang: • Gồm các ký tự được qui định cho từng loại dữ liệu được nhập vào. – Ví dụ: dữ liệu định nhập kiểu nguyên thì xâu định dạng là : %d DS_dia_chi: • Bao gồm địa chỉ của các biến (toán tử &), phân tách nhau bởi dấu phẩy (,) • Phải phù hợp với các kí tự định dạng trong xau_dinh_dang về số lượng, kiểu, thứ tự 01-Jan-16 112
  21. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Hoạt động • Đọc các ký tự được gõ vào từ bàn phím • Căn cứ vào xâu định dạng, chuyển thông tin đã nhập sang kiểu dữ liệu phù hợp • Gán những giá trị vừa nhập vào các biến tương ứng trong DS_dia_chi Ví dụ: int a; scanf(“%d”,&a); →1234_ → a = 1234 01-Jan-16 113
  22. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Ghi chú Thông tin được gõ vào từ bàn phím, được lưu ở vùng đệm trước khi được xử lý bởi hàm scanf()→Hàm scanf() đọc từ vùng đệm #include int main(){ int a, b; scanf("%d",&a); scanf("%d",&b); printf ("%d %d", a, b); return 0; } 01-Jan-16 114
  23. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Các ký tự định dạng Kí tự Khuôn dạng dữ liệu nhập %c Đọc kí tự đơn lẻ %d Đọc số thập phân %o Đọc số bát phân %x Đọc số hexa %u Đọc số thập phân không dấu 01-Jan-16 115
  24. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Các ký tự định dạng Kí tự Chú thích %s Đọc xâu kí tự tới khi gặp dấu phân cách %f Đọc số thực dấu phẩy tĩnh (float) %ld Đọc số nguyên kiểu long %lf Đọc số thực dấu phẩy tĩnh (double) %e Đọc số thực dấu phẩy động %% Đọc ký tự % 01-Jan-16 116
  25. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Ví dụ #include #include void main(){ // khai bao bien int a; float x; char ch; char str[30]; // Nhap du lieu printf(“Nhap vao mot so nguyen:”); scanf(“%d”,&a); printf(“\nNhap vao mot so thuc:”); scanf(“%f”,&x); printf(“\n Nhap vao mot ki tu:”); fflush(stdin); scanf(“%c”,&ch); 01-Jan-16 117
  26. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Ví dụ printf(“\nNhap vao mot xau ki tu:”); fflush(stdin); scanf(“%s”,str); // Hien thi du lieu vua nhap vao printf(“\nNhung du lieu vua nhap vao”); printf(“\nSo nguyen : %d”,a); printf(“\nSo thuc : %5.2f”,x); printf(“\nKy tu : %c”,ch); printf(“\nXau ky tu : %s”,str); getch(); } 01-Jan-16 118
  27. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Ví dụ→Kết quả thực hiện 01-Jan-16 119
  28. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Các quy tắc cần lưu ý Khi đọc số • Hàm scanf() quan niệm rằng mọi kí tự số, dấu chấm (‘.’) đều là kí tự hợp lệ. – Số thực dấu phẩy động, chấp nhận ký tự e/E • Khi gặp các dấu phân cách như tab, xuống dòng hay dấu cách (space bar), scanf() sẽ hiểu là kết thúc nhập dữ liệu cho một số 01-Jan-16 120
  29. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Các quy tắc cần lưu ý Khi đọc kí tự Hàm scanf() cho rằng 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ự tab, xuống dòng hay dấu cách Khi đọc xâu kí tự: Hàm scanf() nếu gặp các kí tự dấu trắng, dấu tab hay dấu xuống dòng thì nó sẽ hiểu là kết thúc nhập dữ liệu cho một xâu kí tự. Ghi chú: Trước khi nhập dữ liệu kí tự hay xâu kí tự nên dùng lệnh fflush(stdin) để xóa bộ đệm. 01-Jan-16 121
  30. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Ví dụ: Đọc 2 số nguyên, đưa ra tổng, hiệu, tích #include int main(){ int A, B; printf("Nhap vao 2 so nguyen : "); scanf("%d %d",&A,&B); printf("\n"); printf("Tong %d + %d = %d \n", A, B, A + B); printf("Hieu %d - %d = %d\n", A, B, A - B); printf("Tich %d x %d = %d\n", A, B, A * B); printf("Thuong %d / %d = %.3f\n", A, B, (float)A /B); printf("Chia nguyen %d / %d = %d\n", A, B, A / B); printf("Chia du %d %% %d = %d\n", A, B, A % B); printf("\n"); return 0; }01-Jan-16 122
  31. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Ví dụ: Đọc 2 số nguyên, đưa ra tổng, hiệu, tích 01-Jan-16 123
  32. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Bài tập 1. Viết chương trình nhập vào từ bàn phím chiều dài 3 cạnh của một tam giác, rồi đưa ra diện tích và các đường cao của tam giác 2. Nhập vào từ bàn phím tọa độ 3 điểm A,B,C rồi đưa ra độ dài các cạnh của tam giác ABC và của đường trung tuyến AM 3. Cho hàm số: f (x) = x7 + 53 x5 + 3x3 + 2 + 12 Viết chương trình nhập vào 3 số thực a,b,c và đưa ra trung bình cộng của f(a),f(b),f(c) 4. Nhập x vào từ bàn phím và tính giá trị của biểu cos3a + 5 2x3 + x +1 thức A = trongđó a = 2x + và b =ln(ex+1.23 +1) x2 log7 (3 + 2.14b) 01-Jan-16 124
  33. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Ví dụ: Đọc tọa độ 3 điểm A,B,C và đưa ra d/tích ABC #include #include int main(){ float Ax,Ay, Bx, By, Cx, Cy, AB, BC, CA,p; printf("Nhap vao toa do diem A : "); scanf("%f %f",&Ax,&Ay); printf("Nhap vao toa do diem B : "); scanf("%f %f",&Bx,&By); printf("Nhap vao toa do diem C : "); scanf("%f %f",&Cx,&Cy); //Tinh do dai cac canh cua tam giac AB = sqrt((Ax-Bx)*(Ax-Bx)+(Ay-By)*(Ay-By)); BC = sqrt((Bx-Cx)*(Bx-Cx)+(By-Cy)*(By-Cy)); CA = sqrt((Cx-Ax)*(Cx-Ax)+(Cy-Ay)*(Cy-Ay)); p = (AB +BC +CA)/2; printf("Dien tich tam giac ABC la: %f",sqrt(p*(p-AB)*(p-BC)*(p-CA))); printf("\n"); return 0; }01-Jan-16 125
  34. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Ví dụ: Đọc tọa độ 3 điểm A,B,C và đưa ra d/tích ABC 01-Jan-16 126
  35. Chương 3: Vào/Ra dữ liệu 3.1 Các hàm vào ra cơ bản → scanf() Bài tập tại lớp 1. Viết chương trình nhập vào từ bàn phím bán kính một đường tròn và đưa ra màn hình diện tích và chu vi đường tròn 2. Viết chương trình nhập vào từ bàn phím một giá trị thực. Hãy đưa ra diện tích của các hình tròn, vuông, tam giác đều có chu vi bằng giá trị vừa nhập. Ghi chú: 1. Giả thiết = 3.1416. Cần khai báo hằng PI trong chương trình. 2. là hằng số được khai báo trong tệp tiêu đề math.h và có tên là M_PI 01-Jan-16 127
  36. Chương 3: Vào ra dữ liệu Nội dung chính 1. Các hàm vào ra cơ bản: – printf() – scanf() 2. Các hàm vào ra khác – gets() Cần nạp thư viện – puts() conio.h #include – getch() 01-Jan-16 128
  37. Chương 3: Vào/Ra dữ liệu 3.2 Các hàm vào ra khác gets() • Mục đích: – Dùng để nhập vào từ bàn phím một xâu kí tự bao gồm cả dấu cách, điều mà hàm scanf() không làm được. • Cú pháp : gets (xâu_kí_tự); • Ví dụ: char str [40]; printf(“Nhap vao mot xau ki tu:”); fflush(stdin); gets(str); 01-Jan-16 129
  38. Chương 3: Vào/Ra dữ liệu 3.2 Các hàm vào ra khác puts() • Mục đích: – Hiển thị ra màn hình nội dung xâu_kí_tự và sau đó đưa con trỏ xuống dòng mới • Cú pháp: puts(xâu_kí_tự); • Ví dụ: puts(“Nhap vao xau ki tu:”); Tương đương với lệnh: printf(“%s\n”,“Nhap vao xau ki tu:“). 01-Jan-16 130
  39. Chương 3: Vào/Ra dữ liệu 3.2 Các hàm vào ra khác getch() • Mục đích – Đợi đọc một ký tự bàn phím – Thường dùng để chờ người sử dụng ấn một phím bất kì trước khi kết thúc chương trình. • Cú pháp getch(); 01-Jan-16 131
  40. Chương 3: Vào/Ra dữ liệu 3.2 Các hàm vào ra khác Ví dụ #include #include void main(){ char ten[30], lop[10]; //Kieu chuoi, mang ky tu puts("Hay cho biet ten ban : "); fflush(stdin); gets(ten); puts("Hay cho biet lop ban hoc : "); fflush(stdin); gets(lop); printf("\nChao ban %s, sinh viên lop %s\n",ten,lop); puts("Chuc ban thi qua mon Tin Hoc Dai Cuong"); getch(); } 01-Jan-16 132
  41. Chương 3: Vào/Ra dữ liệu 3.2 Các hàm vào ra khác Ví dụ → Kết quả thực hiện 01-Jan-16 133
  42. Chương 3: Vào ra dữ liệu Tóm tắt • Các hàm cơ bản (stdio.h) – printf()/ scanf () – Xâu định dạng: %[flags][width][.precision][l][t] • flags (+/-,#): Xác định sự căn lề • l (l/L): Biến ở dạng long • t (d/i/o/u/x/X/f/e/E/g/G/c/s/%): kiểu hiện thị • Các hàm khác (conio.h) – puts() / gets() / getch() • Tìm hiểu thêm – fprintf() / fscanf()  Vào/ra từ file – sprintf(f) / sscanf()  Vào ra từ xâu ký tự 01-Jan-16 134
  43. Phần 3: Lập trình C Nội dung chính • Chương 1: Tổng quan về ngôn ngữ C • Chương 2: Kiểu dữ liệu và biểu thức trong C • Chương 3: Vào ra dữ liệu • Chương 4: Cấu trúc điều khiển • Chương 5: Mảng, con trỏ và xâu ký tự • Chương 6: Cấu trúc • Chương 7: Hàm • Chương 8: Tệp dữ liệu 01-Jan-16 135
  44. Chương 4: Cấu trúc điều khiển Nội dung chính 1. Cấu trúc lệnh khối 2. Cấu trúc rẽ nhánh – Cấu trúc if, if else – Cấu trúc lựa chọn switch 3. Cấu trúc lặp – Vòng lặp for – Vòng lặp while và do while 4. Các lệnh thay đổi cấu trúc lập trình – Câu lệnh continue – Câu lệnh break 01-Jan-16 136
  45. Chương 4: Cấu trúc điều khiển 4.1 Cấu trúc lệnh khối Lệnh đơn >< Lệnh ghép • Lệnh đơn: – Là biểu thức theo sau bởi dấu ‘;’ – Ví du: x= 0; i++; printf(“Hello”); • Lệnh ghép (khối lệnh) – Là tập hợp các câu lệnh (đơn và ghép) được đặt trong cặp ngoặc nhọn { } – C cho phép khai báo biến trong một khối lệnh • Phần khai báo phải nằm trước các câu lệnh – Chú ý: • Lệnh ghép có thể đặt tại bất cứ chỗ nào mà cú pháp cho phép đặt 1 câu lệnh đơn 01-Jan-16 • Không đặt dấu ‘;’ sau một lệnh khối 137
  46. Chương 4: Cấu trúc điều khiển 4.1 Cấu trúc lệnh khối Cấu trúc lồng nhau • Trong lệnh ghép chứa lệnh ghép khác – Sự lồng nhau không hạn chế {//Khai báo đối tượng cục bộ trong khối lenh; {//Khai báo đối tượng cục bộ trong khối lenh; } Nếu các đối tượng được khai báo trùng tên nhau ? } 01-Jan-16 138
  47. Chương 4: Cấu trúc điều khiển 4.1 Cấu trúc lệnh khối Ví dụ #include #include void main(){ // ham main() cung la mot khoi lenh int c = 10, d= 20; printf(“ Bien ngoai khoi c = %d; d=%d ”,c,d); { int c = 10; int d=5; printf(“\n Bien trong khoi c = %d; d=%d”,c,d); printf(“\n Gia tri cua cac bien duoc them 10 don vi”); c = c + 10; d= d + 10; printf(“\n Bien trong khoi c = %d; d=%d”,c,d); } printf(“\n Bien ra ngoai khoi c = %d; d=%d”,c,d); getch(); }01/-J/akn-e16t thuc khoi lenh cua ham main() 139
  48. Chương 4: Cấu trúc điều khiển 4.1 Cấu trúc lệnh khối Ví dụ→Kết quả thực hiện Biến địa phương / Biến toàn cục 01-Jan-16 140
  49. Chương 4: Cấu trúc điều khiển Nội dung chính 1. Cấu trúc lệnh khối 2. Cấu trúc rẽ nhánh – Cấu trúc if, if else – Cấu trúc lựa chọn switch 3. Cấu trúc lặp – Vòng lặp for – Vòng lặp while và do while 4. Các lệnh thay đổi cấu trúc lập trình – Câu lệnh continue – Câu lệnh break 01-Jan-16 141
  50. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc if Đúng Sai Biểu thức điều kiện Câu lệnh Câu lệnh tiếp if (Biểu thức điều kiện) if (n % 2 == 0) Câu lệnh; printf(“so chan”); Câu lệnh kế tiếp; 01-Jan-16 142
  51. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc if .else . Đúng Sai Biểu thức điều kiện Câu lệnh 1 Câu lệnh 2 Câu lệnh tiếp if (Biểu thức điều kiện) if (x > y) Câu lệnh 1; z = x; else else Câu lệnh 2; z = y; Câu lệnh kế tiếp; printf(“max: %d”, z); 01-Jan-16 143
  52. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Lưu ý Biểu thức điều kiện: • Là biểu thức trả về giá trị logic đúng/sai • Giá trị logic đúng/True : khác 0 • Giá trị logic sai/False: bằng 0 Ví dụ if (2+5) printf(“Hello world! ”);→Chấp nhận Câu lệnh: Có thể là một lệnh khối ( Đặt trong cặp { } ) 01-Jan-16 144
  53. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Ví dụ: So sánh 2 số thực được nhập vào #include #include void main() { float a, b; float max; // khai bao bien printf(“ Nhap gia tri a va b: “); scanf(“%f %f”,&a,&b); if(a < b) max = b; else max = a; printf(“\nSo lon nhat trong 2 so %.4f va %.4f la %.4f “,a,b,max); getch(); } //ket thuc ham main() 01-Jan-16 145
  54. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Ví dụ: So sánh 2 số thực được nhập vào if(a b ? a : b; else max = a; 01-Jan-16 146
  55. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Ví dụ: Giải phương trình ax + b = 0 #include #include void main() { float a, b; printf("\nGiai phuong trinh bac nhat ax + b = 0"); printf("\nCho biet he so a b : "); scanf("%f%f", &a, &b); if (a==0) if (b!=0) printf("Phuong trinh vo nghiem"); else printf("Phuong trinh vo so nghiem"); else printf("Dap so cua phuong trinh tren = %f", -b/a); getch(); } //ket thuc ham main() 01-Jan-16 147
  56. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Giải phương trình ax + b = 0 → Thực hiện 01-Jan-16 148
  57. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Ví dụ: Nhập x và tính hàm 2 #include x + sin 4 2 x +1 khi x 3 #include f (x) = 5 khi x =3 void main() x −3 2 { + log10(x − 3) khi x 3 float x, fx; printf(“\nNhap x: “); scanf(“%f”,&x); if(x < 3) fx = x*x+pow(sin(2*M_PI*x),4)+1; else if (x==3) fx = 5; else fx = sqrt(x-3) +log10(x*x-3); printf(“\n Ket quả: %.4f“,fx); 0}1-Jan-16 149
  58. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc if / if else lồng nhau Cấu trúc if và if else có thể lồng nhau – Khi đó else sẽ tương ứng với if (phía trên, chưa có else) gần nhất if (đ/k_1) if (đ/k_1) if (đ/k_2) { if (đ/k_2) lệnh_1; lệnh_1; else } lệnh_2; else lệnh_2; 01-Jan-16 150
  59. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc if / if else lồng nhau →Ví dụ int a, b, c = 10; if (a==0) a ≠ 0, b=? → c = 10 if (b == 0) c = 20; a=0, b=0 →c = 20 else c = 30; a=0, b ≠ 0 →c = 30 if (a==0){ a ≠ 0, b=? → c = 30 if (b == 0) c = 20; a=0, b=0 →c = 20 }else c = 30; a=0, b ≠ 0 → c = 10 01-Jan-16 151
  60. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch switch (bieu_thuc) { case gia_tri_1: lenh_1; [break]; case gia_tri_2: lenh_2; [break]; [default: lenh_n+1; [break];] } Câu_lệnh_tiếp 01-Jan-16 152
  61. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch Tính g/trị Biểu thức Sai Sai Sai g/trị b/t=G/trị 1 g/trị b/t=G/trị 2  default ? Đúng Đúng Đúng Lệnh_1 Lệnh_2 Lệnh_n+1 Sai Sai Sai  break ?  break ?  break ? Đúng Đúng Đúng Câu_lệnh_tiếp 01-Jan-16 153
  62. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch Cơ chế hoạt động • Tính giá trị của biểu_thức, • So sánh giá trị của biểu_thức với các giá_trị_k (với k = 1, 2, n) nằm sau các từ khóa case • Xảy ra 2 khả năng 01-Jan-16 154
  63. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch→cơ chế hoạt động • Tồn tại giá_trị_i bằng giá trị biểu thức. • Thực hiện lệnh_i • Nếu tồn tại lệnh break, • Nhảy tới tiếp tục thực hiện Câu_lệnh_tiếp nằm sau cấu trúc switch • Nếu không tồn tại lệnh break • Thực hiện các lệnh sau lệnh_i cho tới khi gặp break hoặc tới khi thoát khỏi cấu trúc switch • Thực hiện Câu_lệnh_tiếp 01-Jan-16 155
  64. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch→cơ chế hoạt động • Không tồn tại giá_trị_i (i = 1, 2, n) nào bằng giá trị biểu thức • Nếu có nhãn default: • Chương trình sẽ thực hiện lệnh_n+1 • Thực hiện Câu_lệnh_tiếp nằm ngay sau cấu trúc switch. • Nếu không có nhãn default: • Chương trình chuyển sang thực hiện lệnh tiếp theo nằm ngay sau cấu trúc switch: Câu_Lệnh_tiếp 01-Jan-16 156
  65. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch→Ví dụ 1 Lập trình đọc từ bàn phím một số nguyên 1 N 10 và đưa ra từ tiếng Anh tương ứng 01-Jan-16 157
  66. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch→Ví dụ 1 #include void main(){ int N; printf(“\nNhap mot gia tri so nguyen khong am: “); scanf(“%d”,&N); switch(N) { case 1: printf(“ %d -> One \n”,N); break; case 2: printf(“%d -> Two \n”,N); break; case 3: printf(“%d -> Three \n”,N); break; case 4: printf(“%d -> Four \n”,N); break; case 5: printf(“%d -> Five \n”,N); break; case 6: printf(“%d -> Six \n”,N); break; case 7: printf(“%d -> Seven \n”,N); break; case 8: printf(“%d -> Eight \n”,N); break; case 9: printf(“%d -> Nine \n”,N); break; case 10: printf(“%d -> Ten \n”,N); break; default : printf(“Khong thoa man dieu kien [1 10] \n”); } }01-Jan-16 158
  67. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch→ Thực hiện 01-Jan-16 159
  68. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch→Ví dụ 2 Nhập vào số nguyên không âm, đưa ra ngày trong tuần tương ứng (theo số dư khi chia cho 7). 01-Jan-16 160
  69. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch→Ví dụ 2 #include #include void main(){ int a; printf(“\nNhap mot gia tri so nguyen khong am: “); scanf(“%d”,&a); switch(a % 7) { case 0: printf(“ Chu nhat”); break; case 1: printf(“ Thu Hai”); break; case 2: printf(“ Thu Ba”); break; case 3: printf(“ Thu Tu”); break; case 4: printf(“ Thu Nam”); break; case 5: printf(“ Thu Sau”); break; case 6: printf(“ Thu Bay”); break; } getch(); } 01-Jan-16 161
  70. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch →Thực hiện 01-Jan-16 162
  71. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch Có thể sử dụng đặc điểm Không có lệnh break chương trình sẽ tự động chuyển xuống thực hiên các câu lệnh tiếp sau để viết chung mã lệnh cho các trường hợp khác nhau nhưng được xử lý như nhau Ví dụ:Trong một năm các tháng có 30 ngày là 4, 6, 9, 11 còn các tháng có 31 ngày là 1, 3, 5, 7, 8, 10, 12. Riêng tháng hai có thể có 28 hoặc 29 ngày. Hãy viết chương trình nhập vào 1 tháng, sau đó đưa ra kết luận tháng đó có bao nhiêu ngày 01-Jan-16 163
  72. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch→ Ví dụ #include #include void main () { int thang; clrscr(); printf("\nNhap vao thang trong nam "); sanf("%d",&thang); switch(thang) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: printf("\n Thang %d co 31 ngay ",thang); break; 01-Jan-16 164
  73. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch case 4: case 6: case 9: case 11: printf("\n Thang %d co 30 ngay ",thang); break; case 2: printf ("\ Thang 2 co 28 hoac 29 ngay"); break; default : printf("\n Khong co thang %d", thang); break; } getch(); } 01-Jan-16 165
  74. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Cấu trúc lựa chọn switch→Lưu ý • Giá trị của biểu thức trong cấu trúc switch phải là số nguyên (kiểu đếm được) – Phải có kiểu dữ liệu là char, int, long • Các giá trị sau từ khóa case (gia_tri_1, gia_tri_2, ) cũng phải là số nguyên Điều kiện trong cấu trúc if / if else cho phép làm việc với các kiểu dữ liệu khác số nguyên 01-Jan-16 166
  75. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Các ví dụ 1. Viết chương trình tính cước Taxi theo công thức: • 1 km đầu tiên có cước là 10000đ, • 30 km tiếp theo có giá là 8000đ/1km • Các km sau đó có giá là 6000đ/1km. 2. Viết chương trình giải phương trình bậc hai ax2 + bx + c = 0 3. Viết chương trình giải hệ phương trình bậc nhất a1x +b1 y = c1 a2 x + b2 y = c2 01-Jan-16 167
  76. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Ví dụ 1: Tính cước taxi #include #include //Để sử dụng hàm toán học ceil void main() { unsigned long sotien; float sokm; printf("\nBan hay cho biet so km da di duoc : "); scanf("%f", &sokm); if (sokm <= 1.0) sotien = 10000; else if (sokm <= 31.0) sotien = 10000 + (ceil(sokm) - 1.0 ) * 8000; else sotien = 250000 + (ceil(sokm) - 31) * 6000; printf("\nSo tien can tra = %lud", sotien); 0}1-Jan-16 168
  77. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Ví dụ 1 → Thực hiện chương trình sotien= sokm <=1.0 ? 10000 : sokm <= 31 ? 10000 + (ceil(sokm) - 1.0 ) * 8000 : 250000+(ceil(sokm) - 31) * 6000; 01-Jan-16 169
  78. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Ví dụ 2: Giải phương trình bậc 2 #include #include //Để sử dụng hàm toán học sqrt void main(){ float a, b, c, delta; printf(“\n\nNhap he so a b c : "); scanf("%f%f%f", &a, &b, &c); delta = b * b - 4 * a * c; if( a==0) printf(“P/trinh suy bien thanh p/trinh bac 1 %fx+%f=0“,b,c); else if (delta < 0) printf("Phuong trinh vo nghiem"); else if (delta == 0) printf("Phuong trinh co nghiem kep x1 = x2 = %f", -b/(2*a)); else printf(“Phuong trinh co hai nghiem phan biet\n x1=%f \n x2=%f", (-b + sqrt(delta))/(2*a), (-b - sqrt(delta))/(2*a) ); } 01-Jan-16 170
  79. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Ví dụ 2→ Thực hiện chương trình 01-Jan-16 171
  80. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Ví dụ 3: Giải hệ phương trình #include void main() { float a1,b1,c1,a2,b2,c2,x,y,dx,dy,d; printf(“\n\nNhap cac so:\n"); printf("a1,b1,c1=");scanf("%f%f%f",&a1,&b1,&c1); printf("a2,b2,c2=");scanf("%f%f%f",&a2,&b2,&c2); d = a1 * b2 - a2 * b1; dx = c1 * b2 - c2 * b1; dy = a1 * c2 - a2 * c1; if (d != 0) { x = dx/d; y = dy/d; printf("He PT co nghiem x=%f, y=%f\n",x,y); }else if (dx==0) printf("He PT co vo so nghiem!\n"); else printf("He phuong trinh vo nghiem!"); }01-Jan-16 172
  81. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Ví dụ 3 → Thực hiện chương trình 01-Jan-16 173
  82. Chương 4: Cấu trúc điều khiển 4.2 Cấu trúc rẽ nhánh Bài tập 1. Viết chương trình nhập vào một ký tự hệ hexa và đưa ra giá trị hệ 10 tương ứng 2. Lập trình đọc tọa độ 4 điểm A,B,C,M rồi kiểm tra xem điểm M nằm trong, nằm trên cạnh hay nằm ngoài tam giác ABC. 3. Lập trình đọc vào từ bàn phím 2 giá trị a, b rồi tính y = 15 x2+x+7.2 trong đó a + b nê'u a b 3 x = 1.5172 nê'u a = b a −b nê'u a b 2 2 01-Jan-16 a + b 174