10 4.104 8051 9 Acquy adc pic All datasheet ALTIUM Altium Designer AM-FM Arduino ARM ARM là gì Ấn Tượng Bản tin công nghệ Bản tin Thiết Bị Số Barobo bất động sản biến Binary Bit board lpc2378 Bộ chuyển đổi ADC Bộ Đếm Bộ điều khiển cửa cuốn Bộ Định Thời Buy Khóa Số Điện Tử Buy Mạch đếm sản phẩm Buy Mạch giao thông Buy Mạch nạp Buy Matrix Byte C cho AVR các hàm vào ra các loại lõi arm các mạch DAC cơ bản các ngắt trong pic Cách đọc điện trở Cách Đọc Giá Trị Điện Trở Cách đọc giá trị tụ điện Cách hàn linh kiện dán cách làm mạch khóa số cách tạo linh kiện dán cad/cam Cài Đặt cài đặt proteus 8 cảm biến Cấu Kiện Logic Khả Trình cấu tạo cấu trúc arm cấu trúc lệnh CCS Chân chân Transistor Chip Khả Trình chuyển đổi Chuyển đổi số tương tự Chuyển Đổi Tương Tự/Số - ADC Chuyển động số chương trình City Clip Điện Tử Code 8051 - ASM Code 8051 - C Code 8051-C code ASM code ASM mẫu 8086 Code AVR - C code C Code Lập Trình Code led sao băng code maupic code mẫu 8051 Code Mẫu 8086 Code Mẫu cho ARM - LPC1343 code mẫu pic Code PIC - C codemaupic Counter Cổng Vào Ra Cơ Bản Cuộn Cảm Cửa cuốn DA DAC Debug Decimal Delay8051 Dev-C++ Diode DIY Dò đường Do It Yourself doanh nghiệp Download DTMF Mobile đảo chiều động cơ Điện Trở Điện Tử Điện Tử Cơ Bản điều chế độ rộng xung điều chế xung PWM điều khiển bằng điện thoại Điều khiển cửa cuốn Điều khiển cửa cuốn bằng điện thoại điều khiển động cơ đo điện áp đo nhiệt độ đo nhiệt độ hiển thị lên lcd trên 8051 Đo Nhiệt Độ LM35 + LCD Đo Nhiệt Độ LM35 + Led 7 thanh đọc màu điện trở đồ chơi động cơ chân không Động cơ nhiên liệu Động cơ robo đồng hồ thời gian thực Ebook Đại Học ebook điện tử Ebook đồ án Ebook Tin Học Encoder Encoder là gì Full Giải Thuật Giải thuật PID Giáo Dục giao tiếp i2c pic 16f877a giao tiếp i2c pic16f877a với ic ds1307 giao tiếp máy tính qua rs232 Giao Tiếp Máy Tính VB6 giao tiếp rs232 giao tiếp spi giữa 2 pic giao tiếp spi trong pic Giáo Trình Điện Tử Giới thiệu 8051 Giới thiệu cơ bản GPIO Graphic Design hàm Hàn linh kiện dán Hexadecimal Hệ Hexa Hệ Nhị Phân Hệ Thập Lục Phân Hệ Thập Phân hiển thị lên lcd 16x2 Hoạt Động Học Học 8051 qua các ví dụ đơn giản Học ALtium Designer học AVR Học Corel Draw X3 Học Eagle HỌC LẬP TRÌNH 16F877A Học Lập Trình 8051 Học Lập Trình C Học Orcad Học Protues hoc-lam-robot-do-duong-qua-video Hồng ngoại hướng dẫn hướng dẫn Altium Designer hướng dẫn đo đồng hồ VOM hướng dẫn keil - C lập trình 8051 hướng dẫn làm led sao băng hướng dẫn làm led trái tim hướng dẫn lập trình ARM Hướng Dẫn Lập Trình ARM - LPC1343 hướng dẫn lập trình ARM-LPC2378 hướng dẫn lập trình CCS hướng dẫn lập trình PIC Hướng Dẫn Led Trái Tim hướng dẫn module sim548c hướng dẫn sử dụng keil hướng dẫn sử dụng proteus 8 Hyper Terminal hercules 3.2.4 I/O IC 555 IC 7447 IC 74HC151 IC 74HC154 IC 74HC245 IC 74HC595 IC 74LS138 IC DS1307 IC đồng hồ thời gian thực IC LM324 IC LM342 IC LM7805 IC số IC số opamp LM324 IC Thông Dụng IC555 Interrupt Keil 4 Full keil arm Keil C Keil uVision3 kế toán kiểm toán khái niệm Khái Niệm Cơ Bản Kho Vật Liệu khóa điện tử khóa số dùng 8051 khóa số dùng 89s52 Khóa Số Điện Tử khuếch đại kiểm tra Kinh doanh maketing kinh tế quản lí Kỹ Thuật Kỹ Thuật Vi Xử Lý làm mạch điện lý thú Làm quen AVR Lap Trinh Dieu Khien Robot Lập Trình lập trình 8051 Lập Trình AVR Lập Trình C lập trình c++ Lập Trình Led Quảng Cáo Lập Trình Nhúng Lập trình pic Lập trình Robot Lập Trình Vi Điều Khiển Lập Trình Với AVR Studio LCD 16x2 Lcd16x2 Led Clock Led Quay led sao băng led trai tim Led Trái Tim Lịch sử ra đời Linh Kiện Cơ Bản linh kiện điện tử Loa LPC 2378 LSB lý thú Mã AVR - C Mạch 7seg Mạch Amply.Mạch Loa Mạch Autorobo Mạch bảo vệ Mạch Cảm Biến mạch cảm ứng sờ tay Mạch Cầu H Mạch cube Mạch Đếm Sản Phẩm Mạch điện cơ bản Mạch điện hay Mạch Điện Ứng Dụng Mạch Điều khiển động cơ Mạch Động Cơ Mạch đồng hồ Mạch đồng hồ 4 led Mạch giao thông Mạch IC số Mạch in mạch khóa số mạch khuếch đại thuật toán mạch led chúc mừng năm mới mạch led đẹp Mạch Led đơn Mạch Led Quảng Cáo mach led trai tim mạch led trái tim Mạch Led Vumeter mạch lý thú Mạch Ma trận Phím Mạch Matrix Mạch nạp Mạch nguồn Mạch Nút Bấm mạch sóng rf mạch tăng áp Mạch thu phát Mạch tổ hợp MSI Mạch trái tim Mạch Vi điều khiển Microbicho module module GSM/GPS Module Sim548 Module Sim548 giao tiếp với vi điều khiển PIC Module Sim548C Mosfet Motor Mô Phỏng Phần Cứng Mô Tả Phần Cứng MSB mua led sao băng News Ngắt Ngắt Trong LPC23xx ngân hàng Ngôn Ngữ Ngôn Ngữ C Ngôn Ngữ Tự Học Lập Trình C Ngôn Ngữ VHDL Nguyên Lý nguyên lý ic 555 Nguyên Tắc nháy led Nhập môn C Nhỏ Gọn Nibble opamp People Phần Mềm phần mềm altium Designer Phần mềm điện tử Phần Mềm Điện Tử Phần Mềm Điện Tử Hay Phần Mềm Hay Phần Mềm Led Quảng Cáo phần mềm proteus 8 Phần mềm vi tính Phần Mền Phương pháp hàn linh kiện dán PIC pic16f877a Print Design Proteus Proteus 7.8 SP2 FULL PWM quà tặng bạn gái quà tặng độc đáo quản trị doanh nghiệp quản trị kinh doanh quét led 7 đoạn Relay robocon Robot ROBOT DÒ ĐƯỜNG rút gọn mạch logic tổ hợp Sach Dien Tu Sản Phẩm Thú Vị Sản Phẩm Thương Mại Sáng tạo Short Smart Home SMD sơ đồ nguyên lý spi Sports Sử Dụng Sử Dụng Đồng Hồ sử dụng đồng hồ VOM sử dụng ngắt trong pic sự khác nhau Sức mạnh số Tải tài chính tài chính doanh nghiệp tài chính ngân hàng Tài Khoản Chia Sẻ Tài Liệu Tài Liệu 8051 tài liệu avr Tài liệu Điện Tử Tài Liệu Pic Tài liệu robocon tài liệu về ngân hàng Tài Liệu Vi Điều Khiển tailieuvn Tạo cổng Com ảo Tạo cổng nối tiếp ảo tạo dự án trong keil arm Tạo Project trong Vi Xử Lý ARM tạo thư viện altium designer tạo xung vuông Tạp chí Tạp Chí Hay tăng áp Tập lệnh AT Team Support TEAMPLATE PROTEUS Test thị trường tài chính Thiết Bị Thú Vị Thiết kế robot Thiết lập Fuse Bits Thiết Lập Pin Thuật Toán Thuật Toán Điều Khiển PID Thuật Toán Quine MCCluskey Thư viện Protues Thực Hành Thyristor Timer Timer/Counter Tin Học Chia Sẻ Tổ Chức Bộ Nhớ tổng quan về proteus 8 Transistor Tranzito Tranzitor Trao đổi học tập Travel Trình Biên Dịch Trình Dịch Trong Suốt Truyền Thông Nối Tiếp Không Đồng Bộ- UART truyền thông nối tiếp RS232 Tụ điện TUT - 8051 - ASM TUT - 8051 - KeilC tự hành Tự Học C Tự Học Lập Trình C Tý hon UART Update USB Ứng Dụng Led Quảng Cáo ứng dụng mạch khuếch đại thuật toán vẽ mạch in vẽ mạch nguyên lý VHDL Vi Điều Khiển Vi điều khiển - Ứng dụng vi điều khiển PIC Vi mạch số Vi Xử Lý Vi Xử Lý 8051 Vi Xử Lý 8086 Vi Xử Lý ARM Vi Xử Lý PIC Video Video Mach Điện Virtual Serial Port Driver VOM vxl Web Design xác định góc quay động cơ xử lý chuỗi

Bài 7: Điều kiện [Lý Thuyết]


Mục tiêu:

Kết thúc bài  học này, bạn có thể:

Ø  Giải thích về Cấu trúc lựa chọn
§  Câu lệnh if
§  Câu lệnh if – else
§  Câu lệnh với nhiều lệnh if
§  Câu lệnh if lồng nhau
§  Câu lệnh switch.

Giới thiệu

Các vấn đề được đề cập từ đầu đến nay cho phép chúng ta viết nhiều chương trình. Tuy nhiên các chương trình đó có nhược điểm là bất cứ khi nào được chạy, chúng luôn thực hiện một chuỗi các thao tác giống nhau, theo cách thức giống nhau. Trong khi đó, chúng ta thường xuyên chỉ cho phép thực hiện các thao tác nhất định nếu nó thỏa mãn điều kiện đặt ra.

7.1. Câu lệnh điều kiện là gì ?

Các câu lệnh điều kiện cho phép chúng ta thay đổI luồng chương trình. Dựa trên một điều kiện nào đó, một câu lệnh hay một chuỗI các câu lệnh có thể được thực hiện hoặc không.
Hầu hết các ngôn ngữ lập trình đều sử dụng lệnh if để đưa ra điều kiện. Nguyên tắc thực hiện như sau nếu điều kiện đưa ra là đúng (true), chương trình sẽ thực hiện một công việc nào đó, nếu điều kiện đưa ra là sai (false), chương trình sẽ thực hiện một công việc khác.

Ví dụ 7.1:
Để xác định một số là số chẳn hay số lẻ, ta thực hiện như sau:

1.      Nhập vào một số.
2.      Chia số đó cho 2 để xác định số dư.
3.      Nếu số dư của phép chia là 0, đó là số “Chẵn”.
HOẶC
Nếu số dư của phép chia khác 0, đó là số “Lẻ”.

Bước 2 trong giải thuật trên kiểm tra phần dư của số đó khi chia cho 2 có bằng 0 không? Nếu đúng, ta thực hiện việc hiển thị thông báo đó là số chẵn. Nếu số dư đó khác 0, ta thực hiện việc hiển thị thông báo đó là số lẻ.

Trong C một điều kiện được coi là đúng (true) khi nó có giá trị khác 0, là sai (false) khi nó có giá trị bằng 0.


7.2. Các câu lệnh lựa chọn:

C cung cấp hai dạng câu lệnh lựa chọn:

Ø  Câu lệnh if

Ø  Câu lệnh switch

Chúng ta hãy tìm hiểu hai câu lệnh lựa chọn này.

7.2.1 Câu lệnh ‘if’:

Câu lệnh if cho phép ta đưa ra các quyết định dựa trên việc kiểm tra một điều kiện nào đó là đúng (true) hay sai (false).
Các điều kiện gồm các toán tử so sánh và logic mà chúng ta đã thảo luận ở bài 4.
Dạng tổng quát của câu lệnh if:

if  (biểu thức)
Các câu lệnh;

Biểu thức phải luôn được đặt trong cặp dấu ngoặc (). Mệnh đề theo sau từ khoá if là một điều kiện (hoặc một biểu thức điều kiện) cần được kiểm tra. Tiếp đến là một lệnh hay một tập các lệnh sẽ được thực thi khi điều kiện (hoặc biểu thức điều kiện) có kết quả true.

Ví dụ 7.2:
     #include
     #include
     main()
     {
           int x, y;
           char a = 'y';
           x = y = 0;
           if (a == 'y')
           {
                x += 5;
                printf("The numbers are %d and \t%d", x, y);
           }
           getch();
     }

Kết quả của chương trình như sau:

Có kết quả này là do biến a đã được gán giá trị 'y'.

Chú ý rằng, khối lệnh sau lệnh if được đặt trong cặp ngoặc nhọn {}. Khi có nhiều lệnh cần được thực hiện, các câu lệnh đó được coi như một block (khốI lệnh) và phảI được đặt trong cặp dấu {}. Nếu trong ví dụ trên ta không đưa vào dấu ngoặc nhọn ở câu lệnh if, chỉ có câu lệnh đầu tiên (x += 5) được thực hiện khi điều kiện trong câu lệnh if là đúng.

Ví dụ dưới đây sẽ kiểm tra một năm có phải là năm nhuận hay không. Năm nhuận là năm chia hết cho 4 hoặc 400 nhưng không chia hết cho 100. Chúng ta sử dụng lệnh if để kiểm tra điều kiện.

Ví dụ 7.3:
    /* To test for a leap year */
    #include
    #include
    main()
    {
           int year;
           printf("\nPlease enter a year:");
           scanf("%d", &year);

           if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                printf("\n%d is a leap year!", year);
           getch();
    }

Chương trình trên cho ra kết quả như sau:

Điều kiện year % 4 == 0 && year % 100 != 0 || year % 400 == 0 trả  về  giá trị 1 nếu năm đó là năm nhuận. Khi đó, chương trình hiển thị thông báo gồm biến year và dòng chữ “is a leap year”. Nếu điều kiện trên không thỏa mãn, chương trình không hiển thị thông báo nào.

7.2.2 Câu lệnh ‘if … else’:

Ở trên chúng ta đã biết dạng đơn giản nhất của câu lệnh if, cho phép ta lựa chọn để thực hiện hay không một câu lệnh hoặc một chuỗI các lệnh. C cũng cho phép ta lựa chọn trong hai khốI lệnh để thực hiện bằng cách dùng cấu trúc if – else. Cú pháp như sau:

if (biểu thức)
            câu_lệnh – 1;
else
            câu_lệnh – 2;

Nếu biểu thức điều kiện trên là đúng (khác 0), câu lệnh 1 được thực hiện. Nếu nó sai (khác 0) câu lệnh 2 được thực hiện. Câu lệnh sau if và else có thể là lệnh đơn hoặc lệnh phức. Các câu lệnh đó nên được lùi vào trong dòng mặc dù không bắt buộc. Cách viết đó giúp ta nhìn thấy ngay những lệnh nào sẽ được thực hiện tùy theo kết quả của biểu thức điều kiện.
Bây giờ chúng ta viết một chương trình kiểm tra một số là số chẵn hay số lẻ. Nếu đem chia số đó cho 2 được dư là 0 chương trình sẽ hiển thị dòng chữ  “The number is Even”, ngược lại sẽ hiển thị dòng chữ “The number is Odd”.

Ví dụ 7.4:
    #include
    #include
    main()
    {
           int num, res;
   
           printf("Enter a number: ");
           scanf("%d", &num);

           res = num % 2;

           if (res == 0)
                printf("The number is Even");
          else
                printf("The number is Odd");
          getch();
    }

Kết quả:

Xem một ví dụ khác, đổi một ký tự hoa thành ký tự thường. Nếu ký tự không phải là một ký tự hoa, nó sẽ được in ra mà không cần thay đổi. Chương trình sử dụng cấu trúc if-else để kiểm tra xem một ký tự có phải là ký tự hoa không, rồI thực hiện các thao tác tương ứng.

Ví dụ 7.5:
    /* Doi mot ky tu hoa thanh ky tu thuong */
    #include
    #include
    main()
    {
        char c;
        printf("Please enter a character: ");
        scanf("%c", &c);
        if (c >= 'A' && c <= 'Z')
             printf("Lowercase character = %c", c + 'a' - 'A');
        else
             printf("Character Entered is = %c", c);
        getch();
    }

Biểu thức  c >= ‘A’ && c <= ‘Z’ kiểm tra ký tự nhập vào có là ký tự hoa không. Nếu biểu thức trả về  true, ký tự đó sẽ được đổi thành ký tự thường bằng cách sử dụng biểu thức c + ‘a’ – ‘A’, và được in ra màn hình qua hàm printf(). Nếu giá trị của biểu thức là false, câu lệnh sau else được chạy và chương trình hiển thị kí tự đó ra màn hình mà không cần thực hiện bất cứ sự thay đổi nào:

7.2.3 Nhiều lựa chọn – Các câu lệnh ‘if … else’:

Câu lệnh if cho phép ta lựa chọn thực hiện một hành động nào đó hay không. Câu lệnh if – else cho phép ta lựa chọn thực hiện giữa hai hành động. C cho phép ta có thể đưa ra nhiều lựa chọn hơn. Chúng ta mở rộng cấu trúc if – else bằng cách thêm vào cấu trúc else – if để thực hiện điều đó. Nghĩa là mệnh đề else trong một câu lệnh if – else lạI chứa một câu lệnh if – else khác. Do đó nhiều điều kiện hơn được kiểm tra và tạo ra nhiều lựa chọn hơn.
Cú pháp tổng quát trong trường hợp này như sau:

if (biểu thức) câu_lệnh;
else
     if (biểu thức) câu_lệnh;
     ……
     else câu_lệnh;

Cấu trúc này gọI là if–else–if ladder hay if-else-if staircase.
Cách canh lề (lùi vào trong) như trên giúp ta nhìn chương trình một cách dễ dàng khi có một hoặc hai lệnh if. Tuy nhiên khi có nhiều lệnh if hơn cách viết đó dễ gây ra nhầm lẫn vì nhiều câu lệnh sẽ phải lùi vào quá sâu. Vì vậy, lệnh if-else-if thường được canh lề theo dạng:

            if (biểu thức)
                câu_lệnh;
           else if (biểu thức)
                câu_lệnh;
           else if (biểu thức)
                câu_lệnh;
           ……….
           else
                câu_lệnh;

Các điều kiện được kiểm tra từ trên xuống dưới. Khi có một điều kiện nào đó là true, các câu lệnh gắn với nó sẽ được thực hiện và các lệnh còn lại sẽ được bỏ qua. Nếu không có điều kiện nào là true, các câu lệnh gắn với else cuối cùng sẽ được thực hiện. Nếu mệnh đề else đó không tồn tại, sẽ không có lệnh nào được thực hiện do tất cả các điều kiện đều false.

Ví dụ dưới đây nhận một số từ người dùng. Nếu số đó có giá trị từ 1 đến 3, chương trình sẽ in ra số đó, ngược lại chương trình in ra thông báo “Invalid choice”.

Ví dụ 7.6:
#include
#include
main()
{
     int x;
     x = 0;

     printf("Enter Choice (1 - 3): ");
     scanf("%d", &x);

     if (x == 1)
         printf("\nChoice is 1");
     else if ( x == 2)
         printf("\nChoice is 2");
     else if ( x == 3)
         printf("\nChoice is 3");
     else
         printf("\nInvalid Choice: Invalid Choice");
     getch();
}

Trong chương trình trên:
Nếu x = 1, hiển thị dòng chữ “Choice is 1”.
Nếu x = 2, hiển thị dòng chữ  “Choice is 2”.
Nếu x = 3, hiển thị dòng chữ “Choice is 3” được hiển thị.
Nếu x là bất kỳ một số nào khác 1, 2, hoặc 3, “Invalid Choice” được hiển thị:

Nếu chúng ta muốn thực hiện nhiều hơn một lệnh sau mỗi câu lệnh if hay else, ta phải đặt các câu lệnh đó vào trong cặp dấu ngoặc nhọn {}. Các câu lệnh đó tạo thành một nhóm gọi là lệnh phức hay một khối lệnh:

       if (result >= 45)
       {
              printf("Passed\n");
              printf("Congratulations\n");
       }
       else
       {
              printf("Failed\n");
              printf("Good luck next time\n");
       }

7.2.4 Các cấu trúc  if lồng nhau:

Một cấu trúc if lồng nhau là một lệnh if được đặt bên trong một lệnh if hoặc else khác. Trong C, lệnh else luôn gắn với lệnh if không có else gần nó nhất, và nằm trong cùng một khối lệnh với nó. Ví dụ:

     if (biểu thức–1)
     {
           if (biểu thức–2)
                câu_lệnh1;
           if (biểu thức–3)
                câu_lệnh2;
           else
                câu_lệnh3;      /* với if (biểu thức–3) */
     }
     else
           câu_lệnh4;           /* với if (biểu thức–1) */

Trong đoạn lệnh minh họa ở trên, nếu giá trị của biểu thức-1 là true thì lệnh if thứ hai sẽ được kiểm tra. Nếu biểu thức-2 là true thì lệnh câu_lệnh1 sẽ được thực hiện. Nếu biểu thứu-3 là true, câu_lệnh2 sẽ được thực hiện nếu không câu_lệnh3 được thực hiện. Nếu biểu thức-1 là false thì câu_lệnh4 được thực hiện.

Vì lệnh else trong cấu trúc else-if là không bắt buộc, nên có thể có một cấu trúc khác như dạng dưới đây:

     if (điều kiện-1)
           if (điều kiện-2)
                câu_lệnh1;
           else
                câu_lệnh2;
     câu lệnh kế tiếp;

Trong đoạn mã trên, nếu điều kiện-1 là true, chương trình sẽ chuyển đến thực hiện lệnh if thứ hai và điều kiện-2 được kiểm tra. Nếu điều kiện đó là true, câu_lệnh1 được thực hiện, nếu không câu_lệnh2 được thực hiện, sau đó chương trình thực hiện những lệnh trong câu lệnh kế tiếp. Nếu điều kiện-1 là false, chương trình sẽ chuyển đến thực hiện những lệnh trong câu lệnh kế tiếp.

Ví dụ, marks1 và marks2 là điểm hai môn học của một sinh viên. Điểm marks2 sẽ được cộng thêm 5 điểm nếu nó nhỏ hơn 50 và marks1 lớn hơn 50. Nếu marks2 lớn hơn hoặc bằng 50 thì sinh viên đạt loại ‘A’. Điều này có thể được biểu diễn bởi đoạn if có cấu trúc như sau:

     if (marks1 > 50 && marks2 < 50)
           marks2 = marks2 + 5;
     if (marks2 >= 50)
           grade = ‘A’;

Một số người đưa ra đoạn code như sau:

     if (marks1 > 50)
           if (marks2 < 50)
                marks2 = marks2 + 5;
           else
                grade = ‘A’;

Trong đoạn lệnh này, ‘A’ được gán cho biến grace chỉ khi marks1 lớn hơn 50 và marks2 lớn hơn hoặc bằng 50. Nhưng theo như yêu cầu của bài toán, bíến grace được gán giá trị ‘A’ sau khi thưc hiện việc kiểm tra để cộng điểm và kiểm tra giá trị của marks2. Hơn nữa, giá trị của biến grace không phụ thuộc vào marks1.

Vì lệnh else trong cấu trúc if-else là không bắt buộc, nên khi có lệnh else nào đó không được đưa vào trong chuỗi cấu trúc if lồng nhau chương trình sẽ trông không rõ ràng. Một lệnh else luôn được gắn với lệnh if gần nó nhất mà lệnh if này chưa được kết hợp với một lệnh else nào.

Ví dụ :
                        if (n >0)
                                    if ( a > b)
                                                z = a;
                                    else
                                                z = b;

Lệnh else đi với lệnh if bên trong. Việc viết lùi vào trong dòng là một cách thể hiện mối quan hệ đó. Tuy nhiên canh lề không có chức năng gắn else với lệnh if. Cặp dấu ngoặc nhọn {} giúp chúng ta thực hiện chức năng đó một cách chính xác.

          if (n > 0)
          {    if ( a > b)
                z = a;
          }
           else
                z = b;

Hình bên dưới biểu diễn sự kết hợp giữa if và else trong một chuỗi các lệnh if lồng nhau.



else kết hợp với if gần nhất.                    else kết hợp với if đầu tiên, bởi vì                                                                          cặp dấu ngoặc nhọn đã đặt lệnh if thứ 2 ở bên trong.

Theo chuẩn ANSI, có thể lồng nhau đến 15 mức. Tuy nhiên, hầu hết trình biên dịch cho phép nhiều hơn thế.

Một ví dụ về if lồng nhau được cho bên dưới:

Ví dụ 7.7:
#include
#include
main()
{
     int x, y;
     x = y = 0;
     printf("Enter Choice (1 - 3): ");
     scanf("%d", &x);
     if(x == 1)
     {
         printf("\nEnter value for y (1 - 5): ");
         scanf ("%d", &y);
         if (y <= 5)
             printf("\nThe value for y is: %d", y);
         else
             printf("\nThe value of y exceeds 5");
     }
     else
         printf ("\nChoice entered was not 1");
     getch();
}

Trong chương trình trên, nếu giá trị của x được nhập là 1, người dùng được yêu cầu nhập tiếp giá trị của y. Ngược lại, dòng chữ “Choice entered was not 1” được hiển thị. Lệnh if đầu tiên có lồng một if  trong đó để hiển thị giá trị của y nếu người dùng nhập vào một giá trị nhỏ hơn 5 cho y, hoặc ngược lại sẽ hiển thị dòng chữ “The value of y exceeds 5”:

Chương trình dưới đây đưa ra cách sử dụng của if lồng nhau.

Ví dụ 7.8:
Một công ty sản xuất 3 loại sản phẩm có tên gọi: văn phòng phẩm cho máy tính (computer stationery), đĩa cứng (fixed disks) và máy tính (computer).

Sản phẩm                                                        Mã
Computer Stationery                                        1
Fixed Disks                                                      2
Computers                                                       3

Công ty có chính sách giảm giá như sau:

Sản phẩm                                            Giá trị đặt hàng                        Tỷ lệ giảm giá
Computer Stationery                            $500/- hoặc hơn                                  12%
Computer Stationery                            $300/- hoặc hơn                                  8%
Computer Stationery                            dưới $300/-                                         2%
Fixed Disks                                          $2000/- hoặc hơn                                10%
Fixed Disks                                          $1500/- hoặc hơn                                5%
Computers                                           $5000/- hoặc hơn                                10%
Computer                                             $2500/- hoặc hơn                                5%

Dưới đây là chương trình tính giảm giá:

#include
#include
main()
{
   int productcode;
   float orderamount, rate = 0.0;
   printf("\nPlease enter the product code: ");
   scanf("%d", &productcode);
   printf("Please enter the order amount: ");
   scanf("%f", &orderamount);

   if (productcode == 1)
   {
        if (orderamount >= 500)
             rate = 0.12;
        else if (orderamount >= 300)
             rate = 0.08;
        else
             rate = 0.02;
   }
   else if (productcode == 2)
   {
        if (orderamount >= 2000)
             rate = 0.10;
       else if (orderamount >= 1500)
             rate = 0.05;
   }   
   else if (productcode == 3)
   {
        if (orderamount >= 5000)
             rate = 0.10;
        else if (orderamount >= 2500)
             rate = 0.05;
   }                         
   orderamount -= orderamount * rate;
   printf("The net order amount is % .2f \n", orderamount);
   getch();
}

Kết quả của chương trình:

Ở trên, else sau cùng trong chuỗi các else-if không cần kiểm tra bất kỳ điều kiện nào. Ví dụ, nếu mã sản phẩm được nhập vào là 1 và giá trị đặt hàng nhỏ hơn $300, thì không cần phải kiểm tra điều kiện, vì tất cả các khả năng đã được kiểm soát.
Kết quả thực thi chương trình với mã sản phẩm là 3 và giá trị đặt hàng là $6000 được trình bày ở trên.
Sửa đổi chương trình trên để chú ý đến trường hợp dữ liệu nhập là một mã sản phẩm không hợp lệ. Điều này có thể dễ dàng đạt được bằng cách thêm một lệnh else vào chuỗi lệnh if dùng kiểm tra mã sản phẩm. Nếu gặp một mã sản phẩm không hợp lệ, chương trình phải kết thúc mà không cần tính giá trị thực của đơn đặt hàng.

7.2.5 Câu lệnh ‘switch’:

Câu lệnh switch cho phép ta đưa ra quyết định có nhiều cách lựa chọn, nó kiểm tra giá trị của một biểu thức trên một danh sách các hằng số nguyên hoặc kí tự. Khi nó tìm thấy một giá trị trong danh sách trùng với giá trị của biểu thức điều kiện, các câu lệnh gắn với giá trị đó sẽ được thực hiện. Cú pháp tổng quát của lệnh switch như sau:

     switch (biểu_thức)
     {    case hằng_1:
                chuỗi_câu_lệnh;
                break;
           case hằng_2:
                chuỗi_câu_lệnh;
                break;
           case hằng_3:
                chuỗi_câu_lệnh;
                break;
           default:
                chuỗi_câu_lệnh;
     }

Ở đó, switchcase và default là các từ khoá, chuỗi_câu_lệnh có thể là lệnh đơn hoặc lệnh ghép và không cần đặt trong cặp dấu ngoặc. Biểu_thức theo sau từ khóa switch phải được đặt trong dấu ngoặc ( ), và toàn bộ phần thân của lệnh switch phải được đặt trong cặp ngoặc nhọn { }. Kiểu dữ liệu kết quả của biểu_thức và kiểu dữ liệu của các hằng theo sau từ khoá case phải đồng nhất. Chú ý, hằng số sau case chỉ có thể là một hằng số nguyên hoặc hằng ký tự. Nó cũng có thể là các hằng biểu thức –  những biểu thức không chứa bất kỳ một  biến nào. Tất cả các giá trị của case phải khác nhau.

Trong câu lệnh switch, biểu thức được xác định giá trị, giá trị của nó được so sánh với từng giá trị gắn với từng case theo thứ tự đã chỉ ra. Nếu một giá trị trong một case trùng với giá trị của biểu thức, các lệnh gắn với case đó sẽ được thực hiện. Lệnh break (sẽ nói ở phần sau) cho phép thoát ra khỏi switch. Nếu không dùng lệnh break, các câu lệnh gắn với case bên dưới sẽ được thực hiện không kể giá trị của nó có trùng với giá trị của biểu thức điều kiện hay không. Chương trình cứ tiếp tục thực hiện như vậy cho đến khi gặp một lệnh break. Chính vì thế, lệnh break được coi là lệnh quan trọng nhất khi dùng switch.

Các câu lệnh gắn với default sẽ được thực hiện nếu không có case nào thỏa mãn. Lệnh default là tùy chọn. Nếu không có lệnh default và không có case nào thỏa mãn, không có hành động nào được thực hiện. Có thể thay đổi thứ tự của case và default.

Xét một ví dụ.

Ví dụ 7.9:
    #include
    #include
    main ()
    {
        char ch;
       
        printf("\nEnter a lower cased alphabet (a - z): ");
        scanf("%c", &ch);
       
        if (ch < 'a' || ch > 'z')
            printf("\nCharacter not a lower cased alphabet");
        else
            switch (ch)
            {
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'u':
                printf("\nCharacter is a vowel");
                break;

            case 'z':
                printf ("\nLast Alphabet (z) was entered");
                break;

            default:
                printf("\nCharacter is a consonant");
                break;
            }
    getch();
    }

Chương trình trên nhận vào một kí tự ở dạng chữ thường và hiển thị thông báo kí tự đó là nguyên âm, là chữ z hay là một phụ âm. Nếu nó không phải ba loại ở trên, chương trình hiển thị thông báo “Character not a lower cased alphabet”:

Nên sử dụng lệnh break trong cả case cuối cùng hoặc default mặc dù về mặt logic là không cần thiết. Nhưng điều đó rất có ích nếu sau này chúng ta đưa thêm case vào cuối.

Dưới đây là một ví dụ, ở đó biểu thức của switch là một biến kiểu số nguyên và giá trị của mỗi case là một số nguyên.

Ví dụ 7.10:
    /* Integer constants as case labels */
    #include
    #include
    main()
    {
           int basic;

           printf("\n Please enter your basic: ");
           scanf("%d", &basic);

           switch (basic)
           {
                case 200:
                     printf("\n Bonus is dollar %d\n", 50);
                    break;
    
                case 300:
                     printf("\n Bonus is dollar %d\n", 125);
                    break;

                case 400:
                     printf("\n Bonus is dollar %d\n", 140);
                    break;

                case 500:
                     printf("\n Bonus is dollar %d\n", 175);
                    break;

                default:
                     printf("\n Invalid entry");
                     break;
           }
           getch();
    }

Kết quả:

Từ ví dụ trên, lệnh switch rất thuận lợi khi chúng ta muốn kiểm tra một biểu thức dựa trên một danh sách giá trị riêng biệt. Nhưng nó không thể dùng để kiểm tra một giá trị có nằm trong một miền nào đó hay không. Ví dụ, không thể dùng switch để kiểm tra xem basic có nằm trong khoảng từ 200 đến 300 hay không, để từ đó xác định mức tiền thưởng. Trong những trường hợp như vậy, ta phải sử dụng if-else.




Tóm tắt bài học
Ø  Các lệnh điều kiện cho phép chúng ta thay đổi luồng thực hiện của chương trình.
Ø  C hỗ trợ hai dạng câu lệnh lựa chọn : if và switch.
Ø  Sau đây là một vài câu lệnh điều kiện:
o   Lệnh if – khi một điều kiện được kiểm tra; nếu kết quả là true, các câu lệnh theo sau nó sẽ được thực thi và sau đó thực hiện lệnh tiếp theo trong chương trình chính. Ngược lại, nếu kết quả là false, sẽ thực hiện ngay lệnh tiếp theo trong chương trình chính.
o   Lệnh if … else – khi một điều kiện được kiểm tra; nếu kết quả là true, các câu lệnh theo sau if được thực thi. Nếu kết quả là false, thì các lệnh theo sau else được thực thi.
o   Các lệnh if lồng nhau là lệnh if bên trong một lệnh if khác.
o   Lệnh switch cho phép đưa ra quyết định có nhiều lựa chọn, nó kiểm tra giá trị của biểu thức điều kiện trong một danh sách các hằng. Nếu có, chương trình chuyển đến phần đó để thực hiện.





Kiểm tra tiến độ học tập

1.      Các lệnh ………… cho phép chúng ta thay đổi luồng thực hiện của chương trình.
                                      A. Điều kiện                                      B. Vòng lặp
                                      C. Tuần tự                                          D. Tất cả đều sai
2.      Lệnh else là một tuỳ chọn.                                                             (Đúng / Sai)
3.      ………… là lệnh if được đặt bên trong một lệnh if hoặc else.
                                      A. Nhiều lệnh if                     B. Lệnh if lồng nhau
                                      C. Lệnh if đảo                                   D. Tất cả đều sai
4.      Lệnh …………là một lệnh cho phép chọn nhiều hướng thi hành. Lệnh này kiểm tra giá trị của một biểu thức dựa vào một danh sách các hằng số nguyên hoặc hằng ký tự.
                                      A. Tuần tự                                         B. if
                                      C. switch                                            D. Tất cả đều sai
5.             
if (biểu_thức)
câu_lệnh1;
else
   câu_lệnh2;

Câu lệnh nào sẽ được thực thi khi giá trị của biểu_thức là false?
                                      A. câu_lệnh1                                     B. câu_lệnh2






Bài tập tự làm

1.      Viết chương trình nhập vào hai số a và b, và kiểm tra xem a có chia hết cho b hay không.
2.      Viết chương trình nhập vào hai số và kiểm tra xem tích của hai số này bằng hay lớn hơn 1000.
3.      Viết chương trình nhập vào hai số. Tính hiệu của hai số này. Nếu hiệu số này bằng với một trong hai số đã nhập thì hiển thị thông tin:
Hiệu bằng giá tri
Nếu hiệu không bằng với một trong hai giá trị đã nhập, hiển thị thông tin:
Hiệu không bằng bất kỳ giá trị nào đã được nhập

4.      Công ty Montek đưa ra các mức trợ cấp cho nhân viên ứng với từng loại nhân viên như sau:
                        Loại nhân viên                                      Mức trợ cấp
                                   A                                                        300
                                   B                                                        250
                       Những loại khác                                            100
Tính lương cuối tháng của nhân viên (Mức lương và loại nhân viên được nhập từ người dùng).

5.      Viết chương trình xếp loại sinh viên theo các qui luật dưới đây:
Nếu điểm => 75           -           Loại A
Nếu 60 <= điểm < 75   -           Loại B
Nếu 45 <= điểm < 60   -           Loại C
Nếu 35 <= điểm < 45   -           Loại D
Nếu điểm < 35                         -           Loại E
DIENTUCHIASE.COM- TÀI LIỆU MIỄN PHÍ VÀ LUÔN NHƯ VẬY!

Lập Trình C, Ngôn Ngữ C, Nhập môn C, Tự Học C, Tự Học Lập Trình C, Điện Tử Cơ Bản, Tài Liệu Vi Điều Khiển,

Đăng nhận xét

Author Name

{picture https://lh3.googleusercontent.com/-5Ns_H0UG4cU/Vuu5KrqbEnI/AAAAAAAAEZs/XgsHemy00D4eQ3ivA76v6FFEm7jg9reVwCCo/s512-Ic42/pham-van-ngoc-anh.jpg}

Tôi là Ngọc Anh. Tôi đến từ Nghệ An. Tôi tốt nghiệp một trường đại học tại Sài Gòn. Hiện tôi đang phát triển công ty riêng. Liên lạc với tôi qua:

{facebook https://www.facebook.com/phamvanngocanh}
{twitter https://twitter.com/nghiphong1993}
{google https://plus.google.com/+dientuchiase/posts}
{youtube https://www.youtube.com/channel/UCeJKhA_goBNFmDw6RKNtmYQ}

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.