Lập trình C: Bài 5 – if else, switch case trong C
Trong cuộc sống có rất nhiêu điều chúng ta phải lựa chọn, ví như lựa chọn giữa người ta yêu và người yêu ta, chọn nghe theo con tim hay là lý trí,… Nếu hôm nay được nghỉ thì sẽ ở nhà học hay là đi chơi, nếu có người yêu thì ngồi code hay đi mua kem cùng ăn ngoài cổng trường, vân vân và mây mây. Và lập trình là đi từ cuộc sống, phục vụ cuộc sống nên nó cũng phải có những thứ như vậy. Bài này chúng ta sẽ tìm hiểu về các lệnh để phục vụ những lựa chọn như vậy, các lệnh này gọi là lệnh rẽ nhánh.
Nội dung
Trước khi tìm hiểu về cấu trúc các lệnh rẽ nhánh, chúng ta nên tìm hiểu một chút về lệnh đơn và khối lệnh.
1. Lệnh và khối lệnh
Lệnh là một tác vụ, biểu thức, hàm, cấu trúc điều khiển… nào đó đơn lẻ.
Ví dụ:
x = x + 2; // đây là một lệnh đơn printf("Day la mot lenh\n"); // đây cũng là một lệnh đơn.
Khối lệnh: là một dãy các câu lệnh được bọc bởi cặp dấu { }.
Ví dụ:
{ //dau khoi a = 78; b = 26; printf("Tong %d + %d = %d", a, b, a+b); } //cuoi khoi
Khi muốn thực hiện một dãy các câu lệnh liên tiếp nào đó thì chúng ta dùng khối lệnh, tức là đặt chúng vào cặp dấu {} và viết thụt vào 1 tab cho dễ nhìn.
Lưu ý: Khi một lệnh được đặt trong cặp ngoặc {} thì cũng được coi là khối lệnh.
2. Lệnh if và if else
2.1 Lệnh if
Lệnh if dịch ra có nghĩa là nếu cái này thì làm cái kia. Ví dụ nếu bạn có người yêu thì chắc bạn sẽ đi chơi cùng ẻm chứ không ngồi xem bài của mình…
Cú pháp của lệnh if
Chú ý:
Không đặt dấu chấm phẩy sau câu lệnh if. Ví dụ: if (a > 0);
Khi đặt dấu chấm phẩy ở lệnh if thì coi như kết thúc lệnh if tại đó nên khối lệnh sẽ không được thực hiện dù điều kiện đúng hay sai.
Ví dụ: Ban đầu bạn có 100 (tỷ), hãy nhập vào một số tiền. Nếu số tiền là số dương thì cộng thêm vào ví của bạn ngược lại thì không làm gì cả. In ra số tiền bạn có sau khi nhập.
#include <stdio.h> int main() { int x = 100; // So tien ban dau ban co int y; // so tien nhap moi printf("Nhap so tien = "); scanf("%d", &y); if( y > 0 ) // neu so tien nhap vao lon hon 0 thi cong vao vi { x = x + y; } printf("So tien sau = %d \n", x); return 0; }
Thật đơn giản. Bạn chạy chương trình và xem cách nó hoạt động nhé.
2.2 Lệnh if – else
Lệnh if-else là dạng đủ của lệnh if. if là nếu, else là ngược lại.
Cú pháp lệnh if – else
Ví dụ: Tương tự ví dụ trên. Ban đầu bạn có 100 (tỷ), vợ bạn có 50 (tỷ), hãy nhập vào một số tiền. Nếu số tiền là số dương thì cộng thêm vào ví của bạn một nửa, của vợ bạn một nửa, ngược lại thì chỉ cộng vào ví của bạn (bản chất là trừ đi vì số tiền có thể âm hoặc bằng 0). In ra số tiền bạn và vợ bạn có sau khi nhập.
#include <stdio.h> int main() { float x = 100, y = 50; // So tien ban va vo ban co float z; // so tien nhap moi printf("Nhap so tien = "); scanf("%f", &z); if( z > 0 ) // neu so tien nhap vao lon hon 0 thi cong vao vi { x = x + z / 2; y = y + z / 2; } else { x = x + z; } printf("So tien cua ban = %.2f \n", x); printf("So tien cua vo ban = %.2f \n", y); return 0; }
Khá là đơn giản. Bạn thử chạy và xem kết quả nhé. (Ở bài này mình dùng kiểu float vì có phép chia nên số tiền có thể lẻ).
2.3 Lệnh if else lồng nhau và if-else-if
Trong nhiều trường hợp, chúng ta cần phải xử lý nhiều điều kiện chứ không chỉ có 1 điều kiện. Do vậy chúng ta có thể lồng nhiều câu lệnh if else vào với nhau.
Ví dụ: Công ty đang triển khai một loại cân sao cho cân theo cặp phục vụ cho cân các cặp tình nhân, và thông báo ra bạn trai nặng hơn hay bạn gái nặng hơn hay hai bạn nặng bằng nhau.
Như vậy chúng ta cần xử lý 3 trường hợp chứ không phải chỉ đơn giản là nếu và ngược lại nữa. Chúng ta có code như sau:
#include <stdio.h> int main() { float a; // can nang cua ban trai float b; // can nang cua ban gai printf("Nhap vao can nang ban trai va ban gai: \n"); scanf("%f%f", &a, &b); if( a > b ) { printf("Ban trai nang hon!\n"); } else { if( a < b) { printf("Ban gai nang hon\n"); } else { printf("Hai ban nang bang nhau\n"); } } return 0; }
Ok. Vậy là chúng ta sử dụng được chúng lồng vào nhau. Tuy nhiên cách này sẽ làm code hơi rối và tốn giấy mực. Bạn có thể sử dụng lệnh if-else-if như sau:
#include <stdio.h> int main() { float a; // can nang cua ban trai float b; // can nang cua ban gai printf("Nhap vao can nang ban trai va ban gai: \n"); scanf("%f%f", &a, &b); if( a > b ) { printf("Ban trai nang hon!\n"); } else if( a < b) { printf("Ban gai nang hon\n"); } else { printf("Hai ban nang bang nhau\n"); } return 0; }
Cách code và ý nghĩa cũng rất rõ ràng, dễ hiểu thôi :).
2.4 Toán tử điều kiện – If else rút gọn
Chúng ta có một toán tử rút gọn của lệnh if else như sau:
điều kiện ? biểu thứ 1: biểu thức 2;
Nếu điều kiện đúng thì biểu thức 1 được thực hiện và giá trị của biểu thức 1 là giá trị của toàn bộ lệnh. Nếu điều kiện sai thì biểu thức 2 được thực hiện và giá trị của biểu thức 2 trở thành giá trị của toàn bộ lệnh.
Ví dụ:
#include <stdio.h> int main() { int x = 3; int y = 4; int z; z = x > y ? x : y; printf("z = %d\n", z); x = x > y ? x : 100; printf("x = %d\n", x); return 0; }
Kết quả sau khi chạy chương trình:
z = 4
x = 100
Như vậy ta thấy biểu thức 2 và biểu thức 3 có thể là 1 giá trị biến, hằng, hoặc một hàm nào đó có trả về giá trị.
2. Lệnh switch case
Lệnh switch cũng giống cấu trúc if, nhưng nó mềm dẻo hơn và linh động hơn nhiều so với sử dụng if. Tuy nhiên, nó cũng có mặt hạn chế là kết quả của biểu thức phải là giá trị hằng nguyên (có giá trị cụ thể). Một bài toán sử dụng lệnh switch thì cũng có thể sử dụng if, nhưng ngược lại thì còn tùy thuộc vào giải thuật của bài toán.
Cấu trúc lệnh switch case
Ví dụ: Nhập vào 1 số từ 1->5 và in ra cách đọc tương ứng:
#include <stdio.h> int main() { int a; printf("Nhap a = "); scanf("%d",&a); switch(a) { case 1: printf("Mot\n"); break; case 2: printf("Hai\n"); break; case 3: printf("Ba\n"); break; case 4: printf("Bon\n"); break; case 5: printf("Nam\n"); break; } return 0; }
Các bạn chạy thử, và thử bỏ một vài lệnh break xem nó ra sao nhé.
Ngoài ra, chúng ta có cấu trúc switch-case-default nữa. Nguyên lý hoạt động giống như switch-case nhưng nếu các trường hợp đều không thỏa mãn thì sẽ thực hiện lệnh của trường hợp default (dịch là trường hợp mặc định).
#include <stdio.h> int main() { int a; printf("Nhap a = "); scanf("%d",&a); switch(a) { case 1: printf("Mot\n"); break; case 2: printf("Hai\n"); break; case 3: printf("Ba\n"); break; case 4: printf("Bon\n"); break; case 5: printf("Nam\n"); break; default: printf("Ban da nhap mot so khac\n"); break; } return 0; }
3. Khi nào dùng if-else, khi nào dùng switch-case
Như mình đã nói ở trên, lệnh switch case có tính mềm dẻo và linh động hơn if else, cách viết cũng thoáng và khó nhầm hơn if else nhưng một bài dùng được switch case thí chắc chắn dùng được bằng if else còn khi dùng if else lại chưa chắc dùng được bằng switch case.
Vậy các bạn nên dùng switch case khi:
- Số lượng điều kiện là lớn như dạng menu chọn,… -> switch case viết sẽ lạch mạc, dễ kiểm soát.
- Các trường hợp điều kiện phải có giá trị là số nguyên hoặc ký tự.
Các trường hợp còn lại, các bạn hãy dùng if – else.
Bài tập:
- Viết chương trình nhập vào 4 số nguyên. Tìm và in ra số lớn nhất.
Hướng dẫn: Ta có 4 số nguyên a, b, c, d. Tìm 2 số nguyên lớn nhất x, y của 2 cặp (a, b) và (c, d). Sau đó so sánh x và y để tìm ra số nguyên lớn nhất.Hãy nhập vào một số là 1 tháng trong năm, in ra xem tháng đó có bao nhiêu ngày. (Coi như không có năm nhuận).
Hãy lập trình chương trình giải phương trình bậc 2: với a, b, c nhập từ bàn phím.
Viết chương trình nhập vào 3 giá trị nguyên dương a, b, c. Kiểm tra xem a, b, c có phải là 3 cạnh của tam giác không? Nếu là 3 cạnh của tam giác thì tính diện tích của tam giác theo công thức:
với p là nửa chu vi tam giác.
Viết chương trình tính tiền điện gồm các điều kiện sau:
- Tiền thuê bao điện kế: 1000đ/tháng
- Định mức sử dụng điện cho mỗi hộ là: 50 KW với giá 230đ/KW
- Nếu phần vượt định mức <= 50KW thì tính giá 480đ/KW
- Nếu 50KW < phần vượt định mức < 100KW thì tính giá 700đ/K
Nếu phần vượt định mức >= 100KW thì tính giá 900đ/KW
Chỉ số mới và cũ được nhập vào từ bàn phím. In ra màn hình chỉ số cũ, chỉ số mới, tiền trả định mức, tiền trả vượt định mức, tổng tiền phải trả.
Sao lưu đồ a và b giống nhau vậy? admin coi lại đi.
Admin cho vd trường hợp b cho dễ hiểu. Thanks!
Cảm ơn bạn. Mình đã sửa lại và thêm ví dụ rồi nhé.
Bạn viết rất súc tích và dễ hiểu, cảm ơn nhiều! nếu có thể bạn cho mình thêm nhiều bài tập cơ bản nữa được không?
Bài tập cơ bản thì mình chỉ nghĩ ra vậy thôi. Khi lf các bài lớn sẽ dùng rất nhiều 😉
có phần giải bài tập không anh
Bài tập các bạn tự giải hoặc thảo luận với nhau nhé
Đây là code giải phương trình bậc 2 của e ạ ! E mới học C nên còn chỗ nào không đúng mong a chỉ giúp !
#include
#include
#include
int main(){
int a, b, c;
printf(” Giai phuong trinh bac hai\n”);
printf(“Vui long nhap 3 so a, b, c:”);
printf(“\na =”); scanf(“%d”, &a);
printf(“b =”); scanf(“%d”, &b);
printf(“c =”); scanf(“%d”, &c);
int denta = b*b – 4*a*c;
if (denta > 0){
printf(“Phuong trinh co 2 nghiem:”);
printf(“x = %.2f hoac x = %.2f\n”, (-b + sqrt(denta)) / (2*a), (-b – sqrt(denta)) / (2*a));
}else{
if(denta == 0){
printf(“Phuong trinh co nghiem kep: x = %.2g\n”, -b /2*a);
}else{
printf(“Phuong trinh vo nghiem\n”);
}
}
system (“pause”);
return 0;
}
Theo mình, nếu mình để a =0 thì không ra nghiệm được vì delta = b^2 >=0 nên máy sẽ tính kiểu a sẽ nằm dưới mẫu, mà mẫu = 0 thì sai rồi. Chính vì thế, bạn nên đặt điều kiện cho a phải khác 0, nếu không thì cũng sai yêu cầu bài toán vì họ yêu cầu mình giải phương trình bậc 2.
theo mình biết thì bạn thiếu mất trường hợp a= 0
Chào anh,
anh có thể cho em hỏi mục “TUT C cơ bản” ở bên phải anh dùng plugin gì không ạ 😀 Nó phân bài theo series khá hay.
Em cảm ơn anh.
Ah, mình tự code thêm để nó thành 1 loạt bài theo mình chỉ định 🙂
Tiền thuê bao điện kế: 1000đ/tháng
Định mức sử dụng điện cho mỗi hộ là: 50 KW với giá 230đ/KW
Nếu phần vượt định mức <= 50KW thì tính giá 480đ/KW
Nếu 50KW < phần vượt định mức < 100KW thì tính giá 700đ/K
Nếu phần vượt định mức <= 100KW thì tính giá 900đ/KW
– Anh quân cho em hỏi là " Nếu phần vượt định mức 100Kw thì tính giá 900đ/Kw chứ ạ?
Chắc dòng cuối họ viết lộn đó (đáng lẽ là >=100) vì dòng trên <100 rồi.
dinh muc la 50kW
k co gai tien sau dau
Viết chương trình tính tiền điện gồm các khoảng sau:
– Tiền thêu bao điện kế: 1000 đ/tháng.
– Định mức sử dụng cho mỗi hộ là 50 Kw.
– Phần định mức tính giá 450 đ/kW.
– Nếu phần vượt định mức <= 50 kw thì tính giá phạt cho phần này là 700 đ/kwh.
– Nếu phần định mức vượt hơn 50 kw và nhỏ hơn 100 kw thì tính giá phạt cho phần này là 910 đ/kwh.
Làm sao để dùng đc lệnh if else với chuỗi ạ, em chạy đc nhưng kiểu gì KQ cũng ra “Dung” zậy???
#include
int main ()
{
char* d;
printf(“Con gi sang di bang 4 chan, trua di bang 2 chan, chiu di bang 3 chan?\n”);
scanf(“%s”,&d);
if(d=”con nguoi”)
{
printf(“Dung”);
}
else
{
printf(“Sai”);
}
return 0;
}
Bạn xem bài này nhé: https://cachhoc.net/2014/12/16/lap-trinh-c-bai-8-chuoi-ky-tu-trong-c/
Có cách nào ngắn hơn không ạ @@, làm xong mà nhìn hoa cả mắt
#include
#include
int main ()
{
int thang;
printf(“Hay nhap thang “);
scanf(“%d”,&thang);
switch(thang)
{
case 1:printf(“Thang %d co 31 ngay”,thang);
break;
case 3:printf(“Thang %d co 31 ngay”,thang);
break;
case 5:printf(“Thang %d co 31 ngay”,thang);
break;
case 7:printf(“Thang %d co 31 ngay”,thang);
break;
case 8:printf(“Thang %d co 31 ngay”,thang);
break;
case 10:printf(“Thang %d co 31 ngay”,thang);
break;
case 12:printf(“Thang %d co 31 ngay”,thang);
break;
case 4:printf(“Thang %d co 30 ngay”,thang);
break;
case 6:printf(“Thang %d co 30 ngay”,thang);
break;
case 9:printf(“Thang %d co 30 ngay”,thang);
break;
case 11:printf(“Thang %d co 30 ngay”,thang);
break;
case 2:printf(“Thang 2 co 29 ngay”);
break;
default:printf(“Thang %d khong ton tai”,thang);
}
_getch();
return 0;
}
Có đó. Tìm hiểu xem nhé.
có cách này gọn hơn bạn ạ
#include
// Hãy nhập vào một số là 1 tháng trong năm,
//in ra xem tháng đó có bao nhiêu ngày.
int main()
{
int a;
printf(“Nhap thang “);
scanf(“%d”,&a);
switch(a)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: printf(“Co 31 ngay!”);
break;
case 4:case 6:case 9:case 11: printf(“Co 30 ngay!”);
break;
case 2: printf(“co 28 ngay”);
break;
}
return 0;
}
#include
int main()
{
int sodiensd,tien,sodiencu,sodienmoi;
int tientradinhmuc,tienvuotdinhmuc;
printf(“nhap vao chi so dien cu :”);
scanf(“%d”,&sodiencu);
printf(“nhap vao so dien moi”);
scanf(“%d”,&sodienmoi);
sodiensd=sodienmoi-sodiencu;
printf(“so dien ban su dung thang nay la %d \n”,sodiensd);
if (sodiensd50&&sodiensd100&&sodiensd<=150)
{
tien=sodiensd*700;
tientradinhmuc=sodiensd*230;
tienvuotdinhmuc=tien-tientradinhmuc;
}
else
{
tien=sodiensd*900;
tientradinhmuc=sodiensd*230;
tienvuotdinhmuc=tien-tientradinhmuc;
}
printf("tien dinh muc la %d \n tien vuot dinh muc la %d\n tong tien phai tra la%d \n",tientradinhmuc,tienvuotdinhmuc,tien);
return 0;
}
Đây là code bài 5 mọi người xem giúp ạ
int main()
{
float a=10000; /*tien thue 1 bao dien ke*/
int b=230; /*dinh muc su dung dien 50wvoi gia 230d/kw */
float c; /*chi so cu*/
float d; /*chi so moi*/
float e;
printf(“nhap vao chi so cu va chi so moi\n”);
scanf(“%f%f”,&c,&d);
if(d-c<=50)
{
printf("chi so cu :%f",c);
printf("chi so moi: %f",d);
printf("tien tra dinh muc la:50KW voi gia 230d");
e=abs(d-c) * 480;
printf("tien tra vuot dinh muc: %fd",e);
printf("tong tien phai tra: %fd",e+230);
}
else if(50<(d-c)<100)
{
printf("chi so cu :%f",c);
printf("chi so moi: %f",d);
printf("tien tra dinh muc la:50KW voi gia 230d");
e= abs(d-c)*700;
printf("tien tra vuot dinh muc: %fd",e);
printf("tong tien phai tra: %fd",e+230);
}
else
{
printf("chi so cu :%f",c);
printf("chi so moi: %f",d);
printf("tien tra dinh muc la:50KW voi gia 230d");
e=abs(d-c)*900;
printf("tien tra vuot dinh muc: %fd",e);
printf("tong tien phai tra: %fd",e+230);
}
return 0;
}
Viết bằng if else, thầy xem hộ em có sai không với
#include
#include
int main()
{
float a, b;//chi so cu, chi so moi
printf(“so dien cu va so dien moi”);
scanf(“%f%f”,&a,&b);
printf(“\ntien thue bao dien ke = 1000d”);
if(b-a<=50) printf("\ntong tien phai tra: %f", 230*(b-a));
else{
if(50<b-a<=100){
printf("\ntien tra dinh muc: 11.500");
printf("\nso tien vuot dinh muc: %f", 480*(b-a-50));
printf("\ntong so tien phai tra: %f", 50*230+480*(b-a-50)+1000);
}
else{
if(100<b-a<150){
printf("\ntien tra dinh muc: 11.500");
printf("\nso tien vuot dinh muc: %f", 480*50+700*(b-a-100));
printf("\ntong so tien tra: %f", 11.500+480*50+700*(b-a-100)+1000);
}
else{
if(150<=b-a){
printf("\ntien tra dinh muc: 11.500");
printf("\nso tien vuot dinh muc: %f", 480*50+700*50+900*(b-a-150));
printf("\ntong so tien phai tra: %f",11.500+480*50+700*50+900*(b-a-150)+1000);
}
}
}
}
return 0;
}
cho em hỏi nên học c hay c++ trước ạ ?
Học cái nào trước cũng được nhé.
Dạ AD ơi, ad giải thích nguyên lí hoạt động của cái switch-case đc ko ạ, em vẫn chưa hiểu 1 số chỗ
+ lệnh nào để nó tăng giá trị a rồi so sánh
mong đc ad giúp đỡ ạ
switch-case có chức năng giống if-else. Ko có lệnh nòa tăng trong switch-case cả.
tiền thuê bao điện kế là sao ạ
mong anh giải thích
kiểu phí cho cái công tơ ý.