So sánh 3 số trong Pascal

Tìm số lớn nhất trong 3 số được nhập từ bàn phím.

Bài giải

-------------------- ######## --------------------

Cách giải bài toán này đơn giản như sau:

So sánh 3 số trong Pascal

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

  • Lấy một biến tạm giữ giá trị lớn nhất, ta gọi đó là max
  • Gán giá trị số đầu tiên cho max, bây giờ max là số đầu tiên
  • So sánh max với số thứ 2, nếu số thứ 2 lớn hơn max, gán giá trị max bằng số thứ 2
  • So sánh max với số thứ 3, nếu số thứ 3 lớn hơn max, gán giá trị max bằng số thứ 3

Chúng ta sẽ sử dụng cấu trúc điều khiển if else trong C++ để giải quyết bài toán trên như sau:

#include  
using namespace std; 
int main() 
{ 
    int a, b, c, max;
    cout << "Nhap a = ";
    cin >> a;
    cout << "Nhap b = ";
    cin >> b;
    cout << "Nhap c = ";
    cin >> c;
    max = a;
    if(max < b) {
        max = b;
    }
    if(max < c) {
        max=c; 
    }
    cout << "So lon nhat trong 3 so " << a << ", " << b << ", " << c << " la: " << max;
    return 0;
} 

Và kết quả sau khi thực thi chương trình trên như sau:

Khi nhập a = 5, b = 3 và c = 7:

Bài viết này được đăng tại [free tuts .net]

Khi nhập a = 1, b = 5, và c = 2:

Khi nhập a = 6, b = 3, và c = 2:

8. Bài tập if else C++

Cùng chuyên mục:

Các bạn thân mến!
PASCAL là một ngôn ngữ lập trình cơ bản, hầu hết mọi người trong chúng ta đều đã từng học qua. Nó là một ngôn ngữ lập trình đơn giản rất dễ học, tuy ứng dụng không được phong phú, vì Pascal và sản phẩm của nó chạy trên nền DOS, nhưng ngôn ngữ này rất mạnh về cấu trúc logic của nó!
Trong bài viết này, tôi sẽ giới thiệu với các bạn cách sử dụng PASCAL để giải quyết các bài toán tổ hợp chọn số. Một mặt các bạn sẽ giải bằng kiến thức tổ hợp thông thường, mặt khác các bạn sẽ có được một công cụ để kiểm tra kết quả của mình.
Các bạn có thể Download chương trình PASCAL tại http://www.mediafire.com/?dzazztnza1w

Trước tiên, tôi xin nêu ra một số đề bài:

Bài toán 1: Có bao nhiêu số tự nhiên lẻ có $5$ chữ số, trong số đó phải có mặt chữ số $3$?

Bài toán 2: Cho các chữ số $\{0,1,2,3,4,5,6\}$ Tính tổng của các số tự nhiên chẵn, có $4$ chữ số đôi một khác nhau, được lập từ $7$ chữ số trên.

Bài toán 3: Cho $A=\{0,1,2,3,5,7,8,9\}$. Có bao nhiêu số tự nhiên chẵn có $5$ chữ số, trong số đó phải có mặt số $1$ và số $3$, được tạo thành từ $A$
____________________________________
$\boxed{1}$ Bây giờ ta bắt tay vào giải quyết Bài toán 1 (bằng PASCAL)
Bước1:Xây dựng thuật toán:
- Ta cần xây dựng số $\overline{abcde}$, vậy cần có $5$ biến $a,b,c,d,e$ kiểu shortint
- Thêm một biến $S$ kiểu longint để nhận kết quả.
- Đầu tiên gán kết quả $S:=0$
- Vì $a \ne 0$ nên ta sẽ cho $a$ chạy từ $1$ đến $9$
- $b,c,d$ ta cho chạy từ $0$ đến $9$
- Vì $\overline{abcde}$ là số lẻ nên ta cho $e$ chạy từ $1$ đến $9$ và chỉ thực hiện công việc tiếp nếu $e \in \{1,3,5,7,9\}$
- Cuối cùng nếu số tạo thành thoả mãn điều kiện "có mặt chữ số 3"
thì ta cho kết quả $S$ tăng thêm 1 đơn vị.
Thuật toán thật đơn giản phải không nào!
Bước 2: Viết code và trình bày kết quả:

[quotename='PASCAL CODE 01']
Var a,b,c,d,e: shortint;
S: longint;
Begin
S:=0;
for a:=1 to 9 do
for b:=0 to 9 do
for c:=0 to 9 do
for d:=0 to 9 do
for e:=1 to 9 do
if ((e=1)or(e=3)or(e=5)or(e=7)or(e=9))and((a=3)or(b=3)or(c=3)or(d=3)or(e=3)) then
S:=S+1;
Write('So cac so thoa man la S= ',S);
Readln;
End.
[/quote]
Chạy chương trình trên ta được kết quả là $\text{So cac so thoa man la S= }21672$

$\boxed{2}$ Giải bài toán 2:

Bài toán 2: Cho các chữ số $\{0,1,2,3,4,5,6\}$ Tính tổng của các số tự nhiên chẵn, có $4$ chữ số đôi một khác nhau, được lập từ $7$ chữ số trên.


Bước1:Xây dựng thuật toán:
- Ta cần xây dựng số $\overline{abcd}$, vậy cần có $4$ biến $a,b,c,d$ kiểu shortint
- Thêm một biến $S$ kiểu longint để nhận kết quả.
- Đầu tiên gán kết quả $S:=0$
- Vì $a \ne 0$ nên ta sẽ cho $a$ chạy từ $1$ đến $6$
- $b,c$ ta cho chạy từ $0$ đến $6$
- Vì $\overline{abcd}$ là số chẵn nên ta cho $d$ chạy từ $0$ đến $6$ và chỉ thực hiện công việc tiếp nếu $d \in \{0,2,4,6\}$
- Cuối cùng nếu số tạo thành thoả mãn điều kiện "các chữ số đôi một khác nhau"
thì ta cho kết quả $S$ cộng thêm giá trị của $\overline{abcd}=1000*a+100*b+10*c+d$
Thuật toán thật đơn giản phải không nào!
Bước 2: Viết code và trình bày kết quả:

[quotename='PASCAL CODE 02']
Var a,b,c,d: shortint;
S: longint;
Begin
S:=0;
for a:=1 to 6 do
for b:=0 to 6 do
for c:=0 to 6 do
for d:=0 to 6 do
if ((d=0)or(d=2)or(d=4)or(d=6))and((a<>b)and(a<>c)and(a<>d)and(b<>c)and(b<>d)and(c<>d)) then
S:=S+1000*a+100*b+10*c+d;
Write('So cac so thoa man la S= ',S);
Readln;
End.
[/quote]
Chạy chương trình trên ta được kết quả là $\text{So cac so thoa man la S= }1577160$

$\boxed{3}$ Giải bài toán 3
Bài toán 3: Cho $A=\{0,1,2,3,5,7,8,9\}$. Có bao nhiêu số tự nhiên chẵn có $5$ chữ số, trong số đó phải có mặt số $1$ và số $3$, được tạo thành từ $A$


Bước1:Xây dựng thuật toán:
- Ta cần xây dựng số $\overline{abcde}$, vậy cần có $5$ biến $a,b,c,d$ kiểu shortint
- Thêm một biến $S$ kiểu longint để nhận kết quả.
- Đầu tiên gán kết quả $S:=0$
- Vì $a \ne 0$ nên ta sẽ cho $a$ chạy từ $1$ đến $9$ và chỉ lấy các giá trị thuộc A
- $b,c,d$ ta cho chạy từ $0$ đến $9$ và chỉ lấy các giá trị thuộc A
- Vì $\overline{abcde}$ là số chẵn nên ta cho $e$ chạy từ $0$ đến $8$ và chỉ thực hiện công việc tiếp nếu $e \in \{0,2,8\}$
- Cuối cùng nếu số tạo thành thoả mãn điều kiện "phải có mặt chữ số 1 và chữ số 3"
thì ta cho kết quả $S$ tăng thêm 1 đơn vị
Thuật toán thật đơn giản phải không nào!
Bước 2: Viết code và trình bày kết quả:

[quotename='PASCAL CODE 03']
Var a,b,c,d,e: shortint;
S: longint;
Begin
S:=0;
for a:=1 to 9 do
for b:=0 to 9 do
for c:=0 to 9 do
for d:=0 to 9 do
for e:=0 to 8 do
if ((e=0)or(e=2)or(e=8))and((a<>4)and(a<>6))and((b<>4)and(b<>6))and((c<>4)and(c<>6))
and((d<>4)and(d<>6))
and(((a=1)and((b=3)or(c=3)or(d=3)))or((b=1)and((a=3)or(c=3)or(d=3)))
or((c=1)and((a=3)or(b=3)or(d=3)))or((d=1)and((a=3)or(b=3)or(c=3))))
then
S:=S+1;
Write('So cac so thoa man la S= ',S);
Readln;
End.
[/quote]
Chạy chương trình trên ta được kết quả là $\text{So cac so thoa man la S= }1644$
_______________________________________________
Qua 3 ví dụ trên, các bạn có thể thấy rằng:
Ta dùng vòng lặp for ... to ...do liên tiếp cho mọi biến, cho đến khi điều kiện logic được thoả (yêu cầu của đề bài)
Ta phải "giải thích" cho ngôn ngữ PASCAL hiểu cái yêu cầu đó bằng ngôn ngữ logic and (và) or (hoặc)
not (phủ định), ...
Bài viết sau tôi sẽ post lên các bài tập cho các bạn tự luyện.
Bài toán 4: Vé xe hạnh phúc:
- Một vé xe buýt bất kỳ có mã số là một dãy gồm $6$ số tự nhiên, được gọi là vé xe hạnh phúc nếu tổng của $3$ chữ số đầu bằng tổng của $3$ chữ số cuối. Tính xem có tất cả bao nhiêu vé xe hạnh phúc.

Bài toán 5: (Câu VIIb - Đề thi thử số 2 - VMF)
- Cho tập $A=\{0,1,2,5,7,8\}$. Có bao nhiêu số tự nhiên chia hết cho 6, có đúng 5 chữ số, được chọn từ tập $A$

Bài toán 6:
- Cho tập $A=\{0,1,2,4,7,8,9\}$. Có bao nhiêu số tự nhiên nhỏ hơn 80000 mà chia hết cho 3, có các chữ số được chọn từ tập $A$

Bài toán 7:
- Cho tập $A=\{0,1,2\}$. Có bao nhiêu số tự nhiên có đúng $6$ chữ số được tạo thành từ $A$, sao cho số đó có ít nhất một cặp số $0,2$ đứng cạnh nhau.

Bài toán 8:
- Có bao nhiêu số tam giác (số tam giác là số tự nhiên $n$ có dạng $n=\dfrac{k(k+1)}{2}$) lớn hơn $500$ và nhỏ hơn $50000$ ?

Bài làm

Var a,b,c,d,e,f: shortint;
	   S: longint;
Begin
		 S:=0;
		 for a:=0 to 9 do
		   for b:=0 to 9 do
			 for c:=0 to 9 do
				for d:=0 to 9 do
				  for e:=0 to 9 do
				   for f:=0 to 9 do
					if a + b + c = d + e + f then S:=S+1;
		 Write('So cac so thoa man la S= ',S);
		 Readln;
End.

a thế ơi, bài của a có vấn đề ở khúc if a + b + c = d + e + f then S:=S+1;
khi lập trình trong pascal, pascal sẽ ưu tiên phần so sánh trước rồi mới tới cộng trừ sau, tức thay vì nó cộng 2 vế như ý muốn của a thì nó đi so sánh $c=d$ vì thế nên phần mềm sẽ báo lỗi.

Theo e khúc đó nên viết thành if (a + b + c) = (d + e + f) then S:=S+1;

thì pascal sẽ ưu tiên phần trong ngoặc rồi mới bắt đầu so sánh, lúc này máy sẽ chạy đúng với ý tưởng của a
So sánh 3 số trong Pascal


Write('So cac so thoa man la S= ',S); theo e thì nên viết thành Write('So cac so thoa man la S= ',S:3);

thật ra phần này ko bắt buộc, nhưng nếu sử dụng S thì kết quả ra dạng 3.00000000000000E+0000, rất xấu, nếu viết S:3 thì máy hiển thị là 3, dễ nhìn hơn
So sánh 3 số trong Pascal