để ựưa dữ liệu ra màn hình chúng ta dùng phương thức Write(...) hoặc WriteLine(...) trong lớp Consolẹ
- Ta có thể ựưa ra màn hình một số nguyên, thực, ký tự, xâu ký tự, logic trực tiếp như sau:
int x=5;
ConsolẹWriteLine(4); //Xuất một số nguyên ra màn hình ConsolẹWriteLine(4.6); //Xuất một số thực ra màn hình
ConsolẹWriteLine(4.6+x);//Xuất một biểu thức có gia trị thực ra màn hình ...
- Ta có thể ựưa ra màn hình kết hợp của nhiều kiểu dữ liệu khác nhau ( nguyên, thực, ký tự, xâu ký, logic) theo các cách khác nhau thông qua vắ dụ sau:
hoặc ta có thể viết như sau: int a=4,b=5,c=2;
int max=(a>b?a:b)>c?(a>b?a:b):c;
ConsolẹWriteLine(ỘMax(Ộ + b + Ộ,Ợ + a + Ộ,Ợ + c + Ộ)=Ợ + max);
int a=4, b=5, c=2;
int max=(a>b?a:b)>c?(a>b?a:b):c;
ở cách thứ hai này ta có thể phát biểu một cách tổng quát như sau: ConsolẹWrite(dòng diều khiển[, danh sách ựối]);
Trong ựó:
dòng diều khiển: là một hằng xâu ký tự ựặt trong hai dấu Ộ....Ợ, nó bao gồm các loại ựối tượng sau: Các ký tự thông thường, các ký tự ựặc biệt và các ựặc tả có dạng: {i,-j:dt } có thể ựặt bất kỳ ở vị trắ nào trong xâu với: i là thứ tự của một ựối mà ta cần ựưa giá trị của chúng ra tại vị trắ ựặt ựặc tả(các ựối có thứ tự bắt ựầu từ không), j là ựộ rộng dành cho ựối cần ựưa rănếu j mà lớn hơn ựộ dài của dữ liệu cần ựưa ra thì giá trị ựó ựược căn phải, nếu muốn căn trái thì ta thêm dấu trừ phắa trước, còn nếu j mà nhỏ hơn ựộ dài thực tế của dữ liệu cần ựưa ra thì không có gì thay ựổi), d là ựịnh dạng dữ liệu ựưa ra, vắ dụ ựịnh dạng là C ựịnh dạng theo kiểu tiền tệ, N ựịnh dạng kiểu số, G ựịnh dạng chuẩn..., t là số chữ số thập phân(chỉ áp dụng cho số thực)
danh sách các ựối: các ựối có thể là hằng, biến, biểu thức... và ựặt cách nhau một dấu phẩy
Sự khác nhau giữa Write(...) và WriteLine(...) là:
Write(...) sau khi viết dữ liệu ra màn hình thì con trỏ ựặt ở cuối dòng còn WriteLine(...) sau khi viết dữ liệu ra màn hình thì con trỏ ựặt ở ựầu dòng tiếp theo
Xét vị dụ:
using System; class ViDu{
static void Main(){
double a, b, c,max;
a = 4.5643; b = 3.234; c = 2.724; max=(a>b?a:b)>c?(a>b?a:b):c;
ConsolẹWrite("\n\n\t\tCHUONG TRINH TIM MAX CUA BA SO\n"); ConsolẹWriteLine("\tMax({0,-6:N2},{1,-6:N2},{2,-6:N2})={3,6:N2}", a, b, c, max); ConsolẹReadKey(); } } 4.2.2. Nhập dữ liệu vào từ bàn phắm
để nhập dữ liệu vào từ bàn phắm chúng ta dùng phương thức ReadLine có trong lớp Console như sau:
Kiểudữliệu Tênbiến;
Tênbiến=KiểudữliệụParse(ConsolẹReadLine());
Thông thường trong qua trình nhập dữ liệu chúng ta thương kết hợp phương thức Write với ReadLine trong lớp Consolẹ
Xét vắ dụ:
using System; class ViDu{
static void Main(){ double a, b, c,max;
ConsolẹWrite("\n\n\t\tCHUONG TRINH TIM MAX CUA BA SO\n"); ConsolẹWrite("Nhap a="); a = doublẹParse(ConsolẹReadLine()); ConsolẹWrite("Nhap b="); b = doublẹParse(ConsolẹReadLine()); ConsolẹWrite("Nhap c="); c = doublẹParse(ConsolẹReadLine()); max=(a>b?a:b)>c?(a>b?a:b):c; ConsolẹWriteLine("\n\tMax({0,-6:N2},{1,-6:N2},{2,-6:N2})={3,6:N2}", a, b, c, max); ConsolẹReadKey(); } } Chú ý:
- Hàm ConsolẹReadLine() yêu cầu chúng ta nhập vào từ bàn phắm một dãy ký tự và kết thúc quá trình nhập bằng cách nhấn phắm Enter(↵)
- để nhập một xâu ký tự chúng ta thực hiện các bước như sau: string s;
ẦẦẦẦẦẦẦẦẦẦ. s=ConsolẹReadLine();
BộI 5: BộI THùC HộNH VÒ CịC THộNH PHẵN Cầ BờN BộI 6: CÊU TRóC Rỳ NHịNH
6.1. Khèi lỷnh
Một dãy các câu lệnh ựược bao bởi các dấu { } gọi là một khối lệnh.
Vắ dụ: { a=2; b=3; ConsolẹWrite(Ộa={0}\nb={1}},a,b); }
C# xem khối lệnh cũng như một câu lệnh riêng lẻ. Nói cách khác, chỗ nào viết ựược một câu lệnh thì ở ựó cũng có quyền ựặt một khối lệnh.
Khai báo ở ựầu khối lệnh :
Trong C# việc khai báo các biến và mảng có thể ở bất cứ chỗ nào chương trình và phải bên trong một lớp miễn là trước khi sử dụng phải khai báo chúng. Nhưng một thói quen lập trình tốt là chúng ta nên khai báo chúng ở ựầu các khối lệnh, ựầu các hàm { int a,b; float x,y,z; a=b=3; x=5.5; y=a*x; z=b*x; }
Sự lồng nhau của các khối lệnh và phạm vi hoạt ựộng của các biến và
mảng:
Bên trong một khối lệnh lại có thể viết lồng khối lệnh khác. Sự lồng nhau theo cách như vậy là không hạn chế.
Khi máy bắt ựầu làm việc với một khối lệnh thì các biến và mảng khai báo bên trong nó mới ựược hình thành và ựược cấp phát bộ nhớ. Các biến này chỉ tồn tại trong thời gian máy làm việc bên trong khối lệnh và chúng lập tức bị giải phóng ngay sau khi máy ra khỏi khối lệnh. Vậy :
+ Giá trị của một biến hay một mảng khai báo bên trong một khối lệnh không thể ựưa ra sử dụng ở bất kỳ chỗ nào bên ngoài khối lệnh ựó.
+ Ở bất kỳ chỗ nào bên ngoài một khối lệnh ta không thể can thiệp ựến các biến và các mảng ựược khai báo bên trong khối lệnh
+ Nếu có một biến ựã ựược khai báo ở ngoài một khối lệnh và không trùng tên với các biến khai báo bên trong khối lệnh này thì biến ựó cũng có thể sử dụng cả bên trong cũng như bên ngoài khối lệnh.
Vắ dụ :
Xét ựoạn chương trình sau : { int a=5,b=2; { int c=4; b=a+b; ConsolẹWrite(Ộ\nc ={0,3 :N2}\t b={1,3:N2}Ợ,c,b) ; } ConsolẹWrite("\na ={0,3:N2}\t b={1,3:N2}",a,b); } 6.2. Cịc cÊu tróc rỳ nhịnh 6.2.1. Cấu trúc rẽ nhánh if a/ Cấu trúc rẽ nhánh if dạng khuyết Cú pháp câu lệnh if (btựk) công_việc; Trong ựó: * if là từ khoá
* btựk là một biểu thức cho giá trị logic
* Công_việc có thể là một lệnh ựơn, một khối lệnh hay một cấu trúc ựiều khiển nào ựó
Vắ dụ:
if ( a>0)
Sơ ựồ cú pháp
Nguyên tắc hoạt ựộng: đầu tiên máy tắnh toán giá trị của btựk. Nếu btựk có
giá trị True thì máy tiến hành thực hiện Công_việc sau ựó tiến hành thực hiện các câu lệnh tiếp theo sau câu lệnh if. Nếu btựk có giá trị là False thì máy bỏ qua việc thực hiện Công_việc trong câu lệnh if mà tiến hành thực hiện ngay các câu lệnh sau câu lệnh if.
b/ CÊu tróc rỳ nhịnh if dỰng ệẵy ệự Cú pháp câu lệnh if (btựk) công_việc1; else công_việc2; Trong ựó:
* if, else là từ khoá
* btựk là một biểu thức cho giá trị logic
* Công_việc1,Công_việc2 có thể là một lệnh ựơn, một cấu trúc ựiều khiển nào ựó hay một khối lệnh
Vắ dụ:
if ( a>0)
ConsolẹWrite(a + ỘLa so duongỘ) ; else
ConsolẹWrite(a + ỘLa so khong duongỘ) ; btệk
True
Cềng_viỷc;
Sơ ựồ thực hiện
Nguyên tắc hoạt ựộng: đầu tiên máy tắnh toán giá trị của btựk. Nếu btựk có
giá trị True thì máy tiến hành thực hiện Công_việc1 sau ựó tiến hành thực hiện các câu lệnh tiếp theo sau câu lệnh if. Nếu btựk có giá trị là False thì máy tiến hành thực hiện công_việc2 sau ựó tiến hành thực hiện các câu lệnh tiếp theo sau câu lệnh if.
Vắ dụ1: Lập chương trình giải phương trình bậc nhất dạng ax+b=0 using System;
using hue = System.Console; // Gan ten tu dat cho mot lop class Program
{
static void Main(string[] args) {
Double a, b, x;
huẹWrite("Nhap vao gia tri a"); a = doublẹParse(huẹReadLine()); huẹWrite("Nhap vao gia tri a"); b = doublẹParse(huẹReadLine()); if (a == 0)
{
if (b == 0) {
huẹWriteLine("Phuong trinh co vo so nghiem"); }
else {
huẹWriteLine("Phuong trinh vo nghiem");
btệk
True
Cềng_viỷc1
False
} } else {
x = -b / a;
huẹWriteLine("Phuong trinh co mot nghiem x=" + x); }
huẹReadLine(); }
}
Vắ dụ 2: Lập chương trình giải phương trình bậc hai ax2+bx+c=0 using System;
class PTB2 {
static void Main() {
float a, b, c, delta;
ConsolẹWriteLine("Ban hay nhap vao ba so");
ConsolẹWrite("a="); a = float.Parse(ConsolẹReadLine()); ConsolẹWrite("b="); b = float.Parse(ConsolẹReadLine()); ConsolẹWrite("c="); c = float.Parse(ConsolẹReadLine()); if (a == 0)
{
ConsolẹWrite("Day la phuong trinh bac nhat Ax+C=0\n"); if (b != 0)
ConsolẹWriteLine("Phuong trinh co nghien duy nhat x={0}", -b / c); else
if (c == 0)
ConsolẹWriteLine("Phuong trinh vo so nghiem"); else
ConsolẹWriteLine("phuong trinh vo nghiem"); }
else {
ConsolẹWriteLine("Day la phuong trinh bac hai Ax^2+Bx+C=0"); delta = b * b - 4 * a * c;
if (delta < 0)
ConsolẹWrite(" Phuong trinh vo nghiem trong truong so thuc"); if (delta == 0)
ConsolẹWrite("Phuong trinh co nghiem kep x1=x2={0,8:N2", -b / (2 * a));
if (delta > 0) {
ConsolẹWriteLine("Phuong trinh co hai nghiem phan biet:"); ConsolẹWriteLine("x1={0,8:N2}\nx2={1,8:N2}", (-b - Math.Sqrt(delta)) / (2 * a), (-b + Math.Sqrt(delta)) / (2 * a)); } } ConsolẹReadKey(); } } 6.2.2. Cấu trúc rẽ nhánh switch Cú pháp câu lệnh switch ( bieu_thuc) { case e1:Khối_lệnh_1;[break;] case e2: Khối_lệnh_2;[break;]
...
case en: Khối_lệnh_n;[break;] [default: Khối_lệnh_n+1; break;] }
Trong ựó: + switch, case, default là các từ khoá
+ bieu_thuc: là một biểu thức cho giá trị nguyên hoặc là xâu + ei:là giá trị nguyên mà biểu thức có thể nhận ựược.
+ Những phần ựặt trong hai dấu [ và ] có thể có hoặc không
Sự hoạt ựộng của cấu trúc ựiều khiển switch phụ thuộc vào giá trị của
bieu_thuc
* Khi giá trị này bằng ei máy sẽ nhảy tới khối lệnh có nhãn case ei và thực hiện Khối_lệnh_ị Nếu Khối_lệnh_i là rỗng thì ta có thể ựặt break sau Khối_lệnh_i hoặc không, với trường hợp không có break thì máy sẽ tiến hành
nhảy xuống thực hiện Khối_lệnh_(i+1). Nếu Khối_lệnh_i khác rỗng(tức là có công việc phải thực hiện) thì sau Khối_lệnh_i ta phải ựặt câu lệnh break. Khi máy gặp câu lệnh break thì máy sẽ thoát khỏi cấu trúc switch và thực hiện các câu lệnh tiếp theo sau cấu trúc lệnh nàỵ
* Khi giá trị của bieu_thuc khác tất cả các giá trị ei thì cách làm việc của máy lại phụ thuộc vào sự có mặt hay không có mặt của default. Khi có default máy nhảy tới câu lệnh có nhãn default. Khi không có default máy tiến hành thực hiện các câu lệnh sau cấu trúc nàỵ
Vắ dụ 1: Viết chương trình nhập vào một số từ 1 ựến 7 in ra thứ tương ứng. using System;
namespace ThuMay {
class Program {
static void Main(string[] args) {
ConsolẹWriteLine("Nhap vao thu la con so:"); int t = int.Parse(ConsolẹReadLine()); switch (t) { case 1: ConsolẹWriteLine("Chu Nhat"); case 2: ConsolẹWriteLine("Thu hai"); break; case 3: ConsolẹWriteLine("Thu ba"); break; case 4: ConsolẹWriteLine("Thu tu"); break; case 5: ConsolẹWriteLine("Thu nam"); break; case 6: ConsolẹWriteLine("Thu sau"); break; case 7: ConsolẹWriteLine("Thu bay"); break;
default :
ConsolẹWriteLine("Thu khong hop le"); } ConsolẹReadKey(); } } }
Vắ dụ 2: Nhập vào một tháng của một năm bất kỳ sau ựó cho biết tháng ựó có bao nhiêu ngày:
using System; class Songay {
static void Main() {
int month, year,sumday;
ConsolẹWrite("Nhap thang="); month = int.Parse(ConsolẹReadLine()); ConsolẹWrite("Nhap year="); year = int.Parse(ConsolẹReadLine()); switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: sumday=31;break; case 4: case 6: case 9:
case 11: sumday = 30; break;
case 2: if (year % 400==0 || (year % 4 == 0 && year % 100 != 0)) sumday = 29;
else
break;
default: sumday = 0; break; }
if (sumday > 0)
ConsolẹWrite("So ngay cua {0}/{1} la {2} ngay", month, year, sumday);
ConsolẹReadKey(); }
}
Bội 7: BộI THùC HộNH VÒ CÊU TRóC Rỳ NHịNH BộI 8: CÊU TRóC LẳP WHILE, DOẦWHILE 8.1. CÊu tróc lẳp while
Cú pháp câu lệnh
while(btựk) Công_việc; Trong ựó:
* while là từ khoá
* btựk là một biểu thức cho giá trị logic
* Công_việc có thể là một lệnh ựơn, một cấu trúc ựiều khiển nào ựó hay một khối lệnh.
Sơ ựồ cú pháp
Sự hoạt ựộng: Câu lệnh while ựược tiến hành lần lượt ựược tiến hành theo
các bước sau:
btệk
True
Cềng_viỷc
Bước 1: Tiến hành tắnh toán giá trị của btựk.
Bước 2: Nếu biểu thức ựiều kiện có giá trị là False máy sẽ thoát khỏi chu trình và tiến hành thực hiện các câu lệnh sau câu lệnh whilẹ Nếu biểu thức ựiều kiện có giá trị là True máy sẽ tiến hành thực hiện Công_việc và quay về bước 1.
Vắ dụ 1: Nhập vào hai số nguyên bất kỳ và cho biết ước số chung lớn nhất của hai số nguyên ựó.
using System; class VD {
static void Main() {
int a, b;
ConsolẹWrite("Nhap a="); a = int.Parse(ConsolẹReadLine()); ConsolẹWrite("Nhap b="); b = int.Parse(ConsolẹReadLine()); a=Math.Abs(a);b=Math.Abs(b); while (a != b) { if (a > b) a -= b; if (b > a) b -= a; }
ConsolẹWrite("Uscln la:{0}", a);// hoac ConsolẹWrite("Uscln la:{0}", b); ConsolẹReadKey(); } } 8.2. CÊu tróc lẳp dọ..while Cú pháp câu lệnh do {
Công việc cần thực hiện; }while(btựk);
- while ,do là từ khoá
- btựk là một biểu thức cho giá trị logic
Sơ ựồ cú pháp
Sự hoạt ựộng: Câu lệnh dọ..while ựược tiến hành lần lượt theo các bước
sau:
Bước 1: Thực hiện Công_việc
Bước 2: Sau khi thực hiện xong Công_việc máy tiến hành tắnh toán giá trị của btựk.
+ Nếu btựk có giá trị True máy sẽ trở lại bước 1 ựể tiếp tục thực hiện vòng lặp mới của chu trình.
+ Nếu btựk có giá trị bằng False máy sẽ ra khỏi chu trình và chuyển tới câu lệnh ựứng sau cấu trúc dọ..whilẹ
Vắ dụ áp dụng
Vắ dụ 1: Bài toán gửi tiền tiết kiệm, giả sử ta có số tiền là a gửi vào ngân hàng. Hỏi sau bao nhiêu tháng ta thu ựược số tiền là b(b>a) biết rằng lãi xuất hàng tháng là 5%
using System; class VD1 {
static void Main() {
double a, b; int t=0; do {
ConsolẹWrite("Nhap so tien ban co:"); a = doublẹParse(ConsolẹReadLine()); if (a < 0)
ConsolẹWrite("Ban nhap sai, hay nhap la"); } while (a < 0);
btựk
True
Cềng_viỷc
do {
ConsolẹWrite("Nhap so tien ban du dinh muon co:"); b = doublẹParse(ConsolẹReadLine());
if (b < a)
ConsolẹWrite("Ban nhap sai, hay nhap lai"); } while (b < a);
// Di tim thoi gian can thiet do
{
a = a + a * 0.05; t = t + 1;
} while (a < b);
ConsolẹWrite("Ban phai mat {0} nam {1} thang", t / 12, t % 12); ConsolẹReadKey();
} }
Vắ dụ 2: Nhập vào một số nguyên dương sau ựó phân tắch số nguyên ựó ra thừa số nguyên tố
using System; class VD2 {
static void Main() {
int n, i;
i = 2;// la so nguyen to dau tien
ConsolẹWrite("Nhap n="); n = int.Parse(ConsolẹReadLine()); ConsolẹWrite("n="); do { while (n % i == 0) { ConsolẹWrite("{0}*", i); n = n / i; }
if (i == 2) i = 3; else i = i + 2; } while (n != 1); ConsolẹWrite("\b "); ConsolẹReadKey(); } }
BộI 9: CÊU TRóC LẳP FOR Vộ MéT Sè LỷNH ậIÒU KHIÓN KHịC 9.1. CÊu tróc lẳp for Cú pháp câu lệnh for(bt1;btựk;bt2) Công_việc; Trong ựó: * for là từ khoá
* bt1,bt2 là các biểu gán, btựk là một biểu thức cho giá trị logic
* Công_việc có thể là một lệnh ựơn , một cấu trúc ựiều khiển nào ựó hay một khối lệnh
Sơ ựồ cú pháp
Sự hoạt ựộng của câu lệnh for ựược tiến hành theo các bước sau:
Bước 1: Xác ựịnh giá trị của bt1 Bước 2: Xác ựịnh giá trị của btựk
btệk True bt2 False Cềng_viỷc bt1
Bước 3: Tuỳ thuộc vào tắnh ựúng, sai của biểu thúc btựk máy sẽ tiến hành lựa chọn một trong hai nhánh sau:
Nếu btựk có giá trị False, máy sẽ ra khỏi vòng lặp for và chuyển tới câu lệnh sau cấu trúc for
Nếu btựk có giá trị True, máy sẽ tiến hành thực hiện các câu lệnh trong thân for . Khi thực hiện xong Công_việc hay gặp câu lệnh continue trong thân for máy sẽ chuyển sang buớc 4(khởi ựầu lại).
Bước 4: Tắnh bt2 sau ựó quay lại bước 2 ựể bắt ựầu lại vòng lặp mới của chu trình.
Chú ý:
+) Các bt1,bt2,btựk có thể vắng mặt nhưng phải ựể lại dấu chấm phẩỵ +) Nếu btựk vắng mặt thì máy coi luôn ựúng. Khi ựó muốn thoát khỏi vòng lặp thì phải dùng câu lệnh return, break hay gotọ
+) Các bt1,bt2 có thể gồm nhiều biểu thức cách nhau bởi dấu phẩy
+) Thông thường bt1 dùng ựể khởi gán giá trị cho các biến trong vòng lặp, bt2 dùng ựể thay ựổi giá trị của các biến ựiều khiển trong vòng lặp sao cho lúc ựầu btựk cho giá trị True nhưng sau một số hữu hạn bước thực hiện thì btựk cho giá trị False
Vắ dụ 1: Nhập vào một số nguyên dương n sau ựó tắnh n! using System;
class VD6 {
static void Main() {
int n, i,s;
ConsolẹWrite("Nhap vao so nguyen n="); n = int.Parse(ConsolẹReadLine()); for (s = 1, i = 1; i <= n;++i) s = s * i; ConsolẹWrite("{0}!={1}", n, s); ConsolẹReadKey(); } } Vắ dụ 2: Tắnh S=Sin(Sin(...Sin(x))...)
using System; class VD6 {
static void Main() {
double x, s; int i, n;
ConsolẹWrite("Nhap vao so nguyen n="); n = int.Parse(ConsolẹReadLine());
ConsolẹWrite("Nhap x theo don vi do="); x = doublẹParse(ConsolẹReadLine()); x = Math.PI * x / 180;
for (s=x,i=n; i>=1;--i) s = Math.Sin(s);
ConsolẹWrite("S={0:N3}",s); ConsolẹReadKey();
} }
Vắ dụ 3: Lập chương trình tìm số có ba chữ số sao cho số ựó bằng tổng lập phương các chữ số của nó
using System; class VD8 {
static void Main() {
int n, a, b, c;
ConsolẹWriteLine("Cac so thoa man yeu cau bai toan la:"); for (a = 1; a <= 9; ++a) for (b = 0; b <= 9; ++b) for (c = 0; c <= 9; ++c) if (a * 100 + b * 10 + c == a * a * a + b * b * b + c * c * c) ConsolẹWrite("{0}\t", a * 100 + b * 10 + c); ConsolẹReadKey(); }
}
Vắ dụ 4: Lập chương trình nhập vào một số nguyên dương n sau ựó tắnh n!! . n!! ựược tắnh như sau: nếu n là số chẵn thì n!!=2.4.6Ầ.N, nếu n là số lẻ thì n!!=1.3.5.7Ần.
using Viet = System.Console; namespace GiaThuaKep
{
class Program {
static void Main(string[] args) {
Viet.WriteLine("Nhap vao so can tinh n!!"); int n = int.Parse(Viet.ReadLine());
long gt=1; if (n % 2 == 0) {
for(int i=2; i<=n;i+=2) { gt=gt*i; } } else {
for (int i = 1; i <= n; i+=2) { gt = gt * i; } } Viet.WriteLine("{0}!!={1}", n, gt); Viet.ReadLine(); } } }
Vắ dụ 5: Lập chương trình giải bài toán trăm trâu, trăm cỏ: Trâu ựứng ăn năm trâu nằm ăn ba lụ khụ trâu già ba con một bó.
using Viet = System.Console; namespace Trau_Co
{
class Program {
static void Main() {
int td,tn,tg;
// td co kha nang nhan cac gia tri tu 1->100%5(20) // tn co kha nang nhan cac gia tri tu 1 ->100%3 (33)
// Thu lan luot cac gia tri co kha nang nhan duoc cua trau dung int phuong_an = 0;
for (td = 1; td <= 20; td++) {
// Voi moi gia tri trau dung thu cac gia tri nhan duoc trau nam for (tn = 1; tn <= 33; tn++)
{
// trau nam = 100-td-tn. tg = 100 - td - tn;
// neu thoa man bieu thuc thi day la mot phuong an