Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (249.94 KB, 31 trang )
<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
<b>1.</b> Khi soạn thảo văn bản trên máy tính và u cầu chương trình tìm kiếm một cụm từ trong văn bản
và thay thế bằng một cụm từ khác, thực chất ta đã yêu cầu máy tính thực hiện những lệnh gì? Có
thể thay đổi thứ tự những lệnh đó mà vẫn khơng thay đổi kết quả được khơng?
<b>2.</b> Trong ví dụ về rơ-bốt, nếu thay đổi thứ tự của hai lệnh trong chương trình, rơ-bốt có thực hiện
được cơng việc nhặt rác khơng? Hãy xác định vị trí mới của rơ-bốt sau khi thực hiện xong lệnh
“Hãy quét nhà” và đưa ra các lệnh để rơ-bốt trở lại vị trí ban đầu của mình.
<b>3.</b> Hãy cho biết lí do cần phải viết chương trình để điều khiển máy tính.
<b>4.</b> Tại sao người ta phải tạo ra các ngơn ngữ lập trình trong khi có thể điều khiển máy tính bằng
ngơn ngữ máy?
<b>5.</b> Chương trình dịch làm gì?
<b>6.</b> Hãy cho biết các bước cần thực hiện để tạo ra các chương trình máy tính.
<b>1.</b> Khi soạn thảo văn bản trên máy tính và yêu cầu chương trình tìm kiếm một cụm từ trong văn bản
và thay thế bằng một cụm từ khác, thực chất ta đã yêu cầu máy tính thực hiện rất nhiều lệnh. Có
thể mơ tả các lệnh với các mức độ chi tiết khác nhau. Dưới đây chỉ mô tả những lệnh cơ bản nhất
theo trật tự thực hiện việc thay thế một cụm từ tìm được:
1. Sao chép cụm từ cần tìm vào bộ nhớ (ta gọi đây là cụm từ 1).
2. Sao chép cụm từ sẽ thay thế cụm từ tìm được vào bộ nhớ (cụm từ 2).
3. Tìm cụm từ 1 trong văn bản.
4. Xóa cụm từ 1 tìm được trong văn bản.
5. Sao chép cụm từ 2 vào vị trí con trỏ trong văn bản.
Dưới đây mô tả một cách chi tiết hơn:
1. Sao chép dãy kí tự cần tìm vào bộ nhớ (dãy 1).
2. Sao chép dãy kí tự sẽ thay thế dãy kí tự tìm được vào bộ nhớ (dãy 2).
3. Đặt con trỏ trước kí tự đầu tiên trong văn bản.
4. Sao chép dãy kí tự (tính từ vị trí con trỏ sang phải) có độ dài bằng dãy kí tự cần tìm vào bộ
nhớ (dãy 3).
5. So sánh dãy 1 và dãy 3. Nếu dãy 3 không trùng với dãy 1, chuyển đến lệnh 8.
6. Xóa dãy 3 trong văn bản.
7. Sao chép dãy 2 vào vị trí con trỏ soạn thảo trong văn bản.
8. Di chuyển con trỏ sang phải một kí tự và quay lại lệnh 4.
<b>2.</b> Nếu thay đổi thứ tự của hai lệnh trong chương trình điều khiển rô-bốt, rô-bốt sẽ không thực hiện
được công việc nhặt rác vì rơ-bốt sẽ khơng đi đúng hướng và có thể khơng đi tới vị trí có rác,
hoặc thực hiện việc nhặt rác tại vị trí khơng có rác,.... Ví dụ, nếu thay đổi thứ tự của lệnh 1 “Tiến
2 bước” và lệnh 2 “Quay trái, tiến 1 bước”, tác dụng của cả hai lệnh này sẽ là “Quay trái và tiến
3 bước”. Khi đó rơ-bốt sẽ nhặt rác tại vị trí khơng có rác. Nói chung, các lệnh điều khiển rơ-bốt
hay chương trình cần được đưa ra theo một thứ tự xác định sao cho ta đạt kết quả mong muốn.
Trong một số ít trường hợp, ta có thể đưa ra các lệnh khác nhau, nhưng vẫn đạt kết quả. Chẳng
hạn, trong ví dụ về rơ-bốt, thay cho hai câu lệnh đầu tiên, ta có thể điều khiển rơ-bốt đến đúng vị
trí có rác bằng các lệnh sau: “Quay trái, tiến 1 bước” và “Quay phải, tiến 2 bước” hoặc “Quay
phải, tiến 2 bước”, “Quay trái, tiến 2 bước” và “Quay trái, tiến 4 bước”. Trong một số ít các
Vị trí mới của rô-bốt sau khi thực hiện xong lệnh “Hãy quét nhà” là vị trí có thùng rác (ở góc đối
diện). Ta có nhiều cách khác nhau để đưa ra hai lệnh để rơ-bốt trở lại vị trí ban đầu của mình,
một trong các cách đó là hai lệnh “Quay trái, tiến 5 bước” và “Quay trái, tiến 3 bước”.
<b>3.</b> Lí do: Điều khiển máy tính tự động thực hiện các công việc đa dạng và phức tạp mà một lệnh
đơn giản không đủ để chỉ dẫn.
<b>4.</b> Tuy ngôn ngữ máy cũng là một loại ngơn ngữ lập trình, nhưng ở đây chúng ta hiểu ngơn ngữ lập
trình là ngơn ngữ lập trình bậc cao. Trong ngơn ngữ máy mọi chỉ thị đều được biểu diễn bằng
các con số nhị phân 0 và 1. Ngơn ngữ máy khó đọc và khó sử dụng, tuy vậy ngơn ngữ máy là
ngơn ngữ duy nhất mà bộ vi xử lí có thể nhận biết và thực hiện một cách trực tiếp. Ngoài ra yếu
điểm chính của các chương trình viết bằng ngơn ngữ máy là phụ thuộc vào phần cứng máy tính.
Các ngơn ngữ lập trình bậc cao được phát triển để khắc phục các yếu điểm trân của ngôn ngữ
máy. Ngôn ngữ lập trình sử dụng các cụm từ tự nhiên nên dễ nhớ, dễ học và không phụ thuộc
vào phần cứng máy tính.
<b>5.</b> Chương trình dịch là chương trình có chức năng chuyển đổi chương trình được viết bằng ngơn
ngữ lập trình thành chương trình thực hiện được trên máy tính. Như vậy, chương trình dịch
chuyển đổi tệp gồm các dịng lệnh được soạn thảo thành tệp có thể chạy trên máy tính.
<b>1.</b> Hãy cho biết các thành phần cơ bản của một ngôn ngữ lập trình .
<b>2.</b> Ta có thể viết các chương trình bằng các câu lệnh có các chữ cái của tiếng Việt, chẳng hạn “rẽ
trái”, được không? Tại sao?
<b>3.</b> Tên trong chương trình là gì? Cho biết sự khác biệt từ khóa và tên, cách đặt tên trong chương
trình.
<b>4.</b> Trong số các tên sau đây do người viết chương trình đặt trong một chương trình Pascal, tên nào
là hợp lệ và tên nào không hợp lệ: <b>a</b>, <b>Tamgiac</b>,<b> 8a</b>,<b> Tamgiac</b>, <b>beginprogram</b>, <b>end</b>, <b>b1</b>, <b>abc</b>?
<b>5.</b> Hãy cho biết các phần chính trong cấu trúc của mọi chương trình và vai trị của chúng. Trong các
phần đó, phần nào là quan trọng nhất?
<b>6.</b> Hãy cho biết chương trình Pascal sau đây có hợp lệ khơng, tại sao?
<i>a</i>)<i> Chương trình 1.</i>
<b>begin</b>
<b>end.</b>
<i>b</i>)<i> Chương trình 2.</i>
<b>begin</b>
<b>program CT_thu;</b>
<b>writeln('Chao cac ban');</b>
<b>end.</b>
<b>1.</b> Các thành phần cơ bản ngơn ngữ lập trình gồm <i>bảng chữ cái</i> và <i>các quy tắc</i> để viết các câu lệnh
(cú pháp) có ý nghĩa xác định, cách bố trí các câu lệnh,... sao cho có thể tạo thành một chương
trình hồn chỉnh và chạy được trên máy tính. Lưu ý rằng các <i>quy tắc </i>nhắc đến ở đây bao gồm
<b>2.</b> Không. Các cụm từ sử dụng trong chương trình (từ khóa, tên) phải được viết bằng các chữ cái
trong bảng chữ cái của ngôn ngữ lập trình. Các ngơn ngữ lập trình phổ biến hiện nay đều có bảng
chữ cái là bảng chữ cái tiếng Anh và các kí hiệu khác, trong đó khơng có các chữ cái có dấu của
tiếng Việt.
Lưu ý rằng câu hỏi trong bài là “viết chương trình bằng các câu lệnh...”. Điều này khơng có
nghĩa là trong chương trình khơng thể có các chữ cái có dấu của tiếng Việt (hay của một ngôn
ngữ khác) như là dữ liệu dạng văn bản cần xử lí. Các chữ có dấu đó sẽ được ngơn ngữ lập trình
xử lý mã kí tự tương ứng trong các bảng mã ASCII mở rộng. Ví dụ chương trình Pascal sau đây
hồn tồn hợp lệ:
<b>begin</b>
<b>program CT_thu;</b>
<b>3.</b> Tên trong chương trình là dãy các chữ cái hợp lệ được lấy từ bảng chữ cái của ngơn ngữ lập
trình. Từ khố của một ngơn ngữ lập trình (hay cịn được gọi là <i>từ dành riêng</i>) là tên chỉ được
dùng cho các mục đích sử dụng do ngơn ngữ lập trình quy định, khơng được dùng cho bất kì
mục đích nào khác.
Người lập trình có thể đặt tên một cách tùy ý nhưng phải tn thủ các quy tắc của ngơn ngữ lập
trình cũng như của chương trình dịch, trong đó (1) Hai đại lượng khác nhau phải có tên khác
nhau; (2) Tên khơng được trùng với các từ khố.
<b>4.</b> Các tên hợp lệ: <b>a</b>, <b>Tamgiac</b>,<b> beginprogram</b>, <b>b1</b>, <b>abc</b>, tên không hợp lệ: <b>8a </b>(bắt đầu bằng số),<b> Tamgiac</b>
(có dấu cách), <b>end </b>(trùng với từ khóa).
<b>5.</b> Xem SGK, Mục 4, Bài 2.
<b>6.</b> <i>a</i>) Chương trình 1 là chương trình Pascal đầy đủ và hồn tồn hợp lệ, mặc dù chương trình này
chẳng thực hiện điều gì cả. Phần nhất thiết phải có trong chương trình là phần thân chương trình
được đảm bảo bằng hai từ <b>begin</b> và <b>end.</b> (có dấu chấm).
<b>1.</b> Hãy nêu ít nhất một lí do cho thấy sự cần thiết phải phân chia dữ liệu thành các kiểu!
<b>2.</b> Hãy nêu ít nhất hai kiểu dữ liệu và một phép tốn có thể thực hiện được trên một kiểu dữ liệu,
nhưng phép tốn đó khơng có nghĩa trên kiểu dữ liệu kia.
<b>3.</b> Cho dãy chữ số 2010. Dãy chữ số đó có thể thuộc kiểu dữ liệu nào?
<b>4.</b> Cho hai xâu kí tự “<i>Lớp</i>” và “<i>8A</i>”. Hãy thử định nghĩa một “phép tốn” có thể thực hiện được trên
hai xâu kí tự đó.
<b>5.</b> Hãy phân biệt ý nghĩa của các câu lệnh Pascal sau đây:
<b>Writeln('5+20=','20+5');</b> và<b> Writeln('5+20=',20+5);</b>
Hai lệnh sau có tương đương với nhau khơng? Tại sao?
<b>Writeln('100');</b> và<b> Writeln(100);</b>
<b>6.</b> Viết các biểu thức tốn dưới đây với các kí hiệu trong Pascal:
<i><b>a.</b></i>
<i>a</i> <i>c</i>
<i><b>c.</b></i>
1
( 2)
5
<i>a</i>
<i>b</i>
<i>x</i>
<i><b>d.</b></i> (<i>a</i>2<i>b</i>)(1<i>c</i>)3
<b>7.</b> Chuyển các biểu thức được viết trong Pascal sau đây thành các biểu thức toán:
<i><b>a.</b></i> <b>(a+b)*(a+b)-x/y</b>
<i><b>b.</b></i> <b>b/(a*a+c)</b>
<i><b>c.</b></i> <b>a*a/(2*b+c)*(2*b+c)</b>
<i><b>d.</b></i> <b>1+1/2+1/2*3+1/3*4+1/4*5</b>
<b>8.</b> Hãy xác định kết quả của các phép so sánh sau đây:
<i>a.</i> 15 8 ≥ 3
<i>b.</i> (20 15)2≠ 25
<i>c.</i> 112<sub> = 121</sub>
<i>d. x </i>> 10 3<i>x</i>
<b>9.</b> Viết các phép so sánh trong Bài tập 8 với các kí hiệu trong Pascal.
<b>1.</b> Vì dữ liệu và các thao tác xử lí dữ liệu rất đa dạng, lí do dễ nhận thấy nhất là việc phân chia dữ
liệu thành các kiểu giúp xác định các phép xử lí (phép tốn) có thể thực hiện trên mỗi kiểu dữ
liệu. Ngồi ra việc phân chia kiểu dữ liệu còn cho biết các giá trị có thể (phạm vi) của dữ liệu,
giúp cho việc quản lý tài nguyên của máy tính (đặc biệt là bộ nhớ trong) một cách hiệu quả.
<b>2.</b> Có thể nêu các ví dụ sau đây:
<i><b>a.</b></i> Dữ liệu kiểu số và dữ liệu kiểu xâu kí tự. Phép cộng được định nghĩa trên dữ liệu số, nhưng
khơng có nghĩa trên dữ liệu kiểu xâu.
<i><b>b.</b></i> Dữ liệu kiểu số nguyên và dữ liệu kiểu số thực. Phép chia lấy phần nguyên và phép chia lấy
phần dư có nghĩa trên dữ liệu kiểu số ngun, nhưng khơng có nghĩa trên dữ liệu kiểu số
thực.
<b>3.</b> Dãy chữ số 2010 có thể thuộc kiểu dữ liệu số nguyên, số thực hoặc kiểu xâu kí tự. Tuy nhiên, để
chương trình dịch Turbo Pascal hiểu 2010 là dữ liệu kiểu xâu, chúng ta phải viết dãy số này
trong cặp dấu nháy đơn (’).
<b>var a: real; b: integer;</b>
<b> begin</b>
<b> writeln('123');</b>
<b> writeln(123);</b>
<b> a:=2010;</b>
<b> b:=2010;</b>
<b> end.</b>
<b>4.</b> Cho hai xâu kí tự “<i>Lớp</i>” và “<i>8A</i>”. Có thể định nghĩa nhiều “phép tốn” trên tập hợp các dữ liệu
kiểu xâu. Chẳng hạn phép ghép: <i>Lớp</i> + <i>8A</i> = <i>Lớp8A</i>.
<b>5.</b> Lệnh <b>Writeln('5+20=','20+5');</b> in ra màn hình hai xâu ký tự '5+20' và '20+5' liền nhau: 5+20 =
20+5, cịn lệnh <b>Writeln('5+20=',20+5);</b> in ra màn hình xâu ký tự '5+20' và tổng của 20+5 như sau:
5+20=25.
Hai lệnh <b>Writeln('100');</b> và<b> Writeln(100); </b>không tương đương với nhau vì một lệnh in ra màn
hình xâu ký tự biểu diễn số 100 còn lệnh kia in ra màn hình số 100.
<b>6.</b> Các biểu thức trong Pascal:
<i><b>a.</b></i> <b>a/b+c/d</b>
<i><b>b.</b></i> <b>a*x*x+b*x+c</b>
<i><b>c.</b></i> <b>1/x-a/5*(b+2)</b>
<i><b>d.</b></i> <b>(a*a+b)*(1+c)*(1+c)*(1+c)</b>
<b>7.</b> Các biểu thức toán tương ứng:
<i><b>a.</b></i>
2
(<i>a b</i>) <i>x</i>
<i>y</i>
<i><b>c.</b></i>
2
2
(2 )
<i>a</i>
<i>b c</i>
<i><b>d.</b></i>
1 1 1 1
1
2 2.3 3.4 4.5
<b>8.</b> Kết quả của các phép so sánh:
<i>a.</i> Đúng.
<i>b.</i> Sai.
<i>c.</i> Đúng.
<i>d.</i> Đúng khi <i>x </i>> 2.5; ngược lại, phép so sánh có kết quả sai.
<b>9.</b> <i>a</i>) <b>15-8>=3</b>; <i>b</i>) <b>(20-15)*(20-15)<>25</b>; <i>c</i>) <b>11*11=121</b>; <i>d</i>) <b>x>10-3*x</b>.
<b>1.</b> Biến là gì? Hãy cho biết phép gán giá trị cho một biến là gì, cho ví dụ và giải thích.
<b>2.</b> Khai báo biến gồm những gì? Hãy thử mơ tả hoạt động của máy tính khi thực hiện lệnh khai báo
một biến trong chương trình.
<b>3.</b> Giả sử <b>A</b> được khai báo là biến với kiểu dữ liệu số thực, <b>X</b> là biến với kiểu dữ liệu xâu. Các phép
gán sau đây có hợp lệ khơng?
<i>a)</i> Gán số nguyên 4 cho biến <b>A</b>.
<i>b)</i> Gán số 3242 cho biến <b>X</b>.
<i>c)</i> Gán xâu ‘3242’ cho biến <b>X</b>.
<i>d)</i> Gán xâu ‘Ha Noi’ cho biến <b>A</b>.
<b>4.</b> Nêu sự khác nhau giữa biến và hằng và cho một vài ví dụ về biến và hằng.
<b>5.</b> Giả sử ta đã khai báo một <i>hằng</i><b>Pi</b> với giá trị 3.14. Có thể gán lại giá trị 3.1415 cho <b>Pi</b> trong phần
thân chương trình được khơng? Tại sao?
<b>6.</b> Trong Pascal, khai báo nào sau đây là đúng?
<i><b>a)</b></i> <b>var tb: real;</b>
<i><b>b)</b></i> <b>var 4hs: integer;</b>
<i><b>c)</b></i> <b>const x: real;</b>
<i><b>d)</b></i> <b>var R = 30;</b>
<b>7.</b> Hãy liệt kê các lỗi có thể trong chương trình dưới đây và sửa lại cho đúng:
<b>var a,b:= integer;</b>
<b>const c:= 3;</b>
<b>begin </b>
<b> a:= 200</b>
<b> b:= a/c;</b>
<b> write(b);</b>
<b>readln</b>
<b>end. </b>
<b>8.</b> Hãy cho biết kiểu dữ liệu của các biến cần khai báo dùng để viết chương trình để giải các bài
tốn dưới đây:
<i>a)</i> Tính diện tích <i>S </i>của hình tam giác với độ dài một cạnh <i>a </i>và chiều cao tương ứng <i>h </i>(<i>a</i>
và <i>h </i>là các số tự nhiên được nhập vào từ bàn phím).
<i>b)</i> Tính kết quả <i>c </i>của phép chia lấy phần nguyênvà kết quả <i>d </i>của phép chia lấy phần dư
của hai số nguyên <i>a </i>và <i>b</i>.
<b>10.</b>Viết chương trình tính diện tích và chu vi đường trịn có bán kính <i>r</i>, trong đó <i>r</i> là một số nguyên
dương được nhập từ bàn phím.
<b>1.</b> Xét về mặt lập trình, biếnđại lượng được dùng để lưu trữ dữ liệu và dữ liệu được biến lưu trữ có
thể thay đổi trong khi thực hiện chương trình. Xét về mặt lưu trữ dữ liệu, có thể xem biến là
“tên” của một vùng nhớ được dành sẵn để lưu dữ liệu trong suốt quá trình thực hiện chương
trình.
Gán giá trị cho một biến về thực chất là lưu dữ liệu tương ứng vào vùng nhớ được đặt tên và
dành riêng cho biến. Việc thực hiện các tính tốn và xử lí với biến có nghĩa là thực hiện tính tốn
và xử lí với dữ liệu được gán đó.
Giả sử <b>X</b> được khai báo là biến với kiểu dữ liệu số nguyên và <b>X</b> được gán dữ liệu là số 5. Sau khi
khai báo, chương trình sẽ dành riêng một vùng nhớ nào đó cho biến <b>X</b>, và khi gán 5 cho <b>X</b> thì
vùng nhớ đó lưu dữ liệu 5. Lệnh ghi <b>X</b> ra màn hình có nghĩa là ghi số 5 ra màn hình.
<i>Lưu ý</i>. Khi một vùng nhớ được khai báo để lưu dữ liệu làm giá trị của một biến, vùng nhớ đó sẽ
khơng được phép sử dụng vào mục đích khác. Do vậy, một trong những kĩ năng lập trình là sử
dụng càng ít biến càng tốt, nhất là trong những trường hợp việc sử dụng bộ nhớ bị hạn chế.
Nhưng với công nghệ hiện nay, bộ nhớ máy tính đã có dung lượng rất lớn nên vấn đề hạn chế sử
dụng biến trong chương trình đã khơng cịn là vấn đề cấp thiết.
<b>2.</b> Việc khai báo biến gồm: Khai báo tên biến và khai báo kiểu dữ liệu của biến.
Khi khai báo biến, ngoài việc tên biến được đưa vào danh sách các đối tượng quản lí, máy tính
(thơng qua chương trình dịch) sẽ xác định kiểu của biến và dành một vùng nhớ có độ lớn thích
hợp với phạm vi kiểu của biến để lưu giá trị của biến. Ví dụ, cũng để lưu các giá trị là số nguyên,
khi khai báo biến kiểu byte, máy tính chỉ dành vùng nhớ có độ lớn 1 byte, nhưng khi khai báo
biến kiểu ngun, máy tính sẽ dành vùng nhớ có độ lớn 2 byte, hoặc vùng nhớ 6 byte được dành
cho biến được khai báo với kiểu số thực,... Nhờ thế việc sử dụng bộ nhớ sẽ hiệu quả hơn. Ngoài
ra máy tính sẽ biết áp dụng các phép tốn thích hợp đối với giá trị của biến.
<b>3.</b> Đáp án: <i>a)</i> Hợp lệ; <i>b)</i> Không hợp lệ; <i>c)</i> Hợp lệ; <i>d)</i> Không hợp lệ.
<b>4.</b> Mặc dù đều cùng phải khai báo trước khi có thể sử dụng trong chương trình, sự khác nhau giữa
biến và hằng là ở chỗ giá trị của hằng khơng thay đổi trong suốt q trình thực hiện chương trình,
<b>5.</b> Khơng thể gán lại giá trị 3.1415 cho <b>Pi</b> trong phần thân chương trình vì giá trị của hằng khơng
thay đổi trong suốt q trình thực hiện chương trình.
<b>6.</b> <i>a</i>) Hợp lệ; <i>b</i>) Khơng hợp lệ vì tên biến khơng hợp lệ; <i>c</i>) Khơng hợp lệ vì hằng phải được cho giá
trị khi khai báo; <i>d</i>) <i>c</i>) Không hợp lệ vì biến khơng được gán giá trị khi khai báo, cách gán giá trị
cũng không đúng cú pháp.
<b>7.</b> Các lỗi trong chương trình: (1) Thừa dấu bằng ở dòng 1 (chỉ cần dấu hai chấm); (2) Thừa dấu hai
chấm ở dòng 2 (với hằng chỉ cần dấu bằng); (3) Thiếu dấu chấm phẩy ở dòng 4; (4) Khai báo
kiểu dữ liệu của biến <i>b </i>không phù hợp: Khi chia hai số nguyên, kết quả luôn luôn là số thực, cho
dù có chia hết hay khơng. Do đó cần phải khai báo biến <i>b </i>là biến có kiểu dữ liệu số thực.
<b>8.</b> Cách khai báo hợp lý:
<b>9.</b> Cần sử dụng các biến sau đây với mỗi học sinh trong lớp: <i>Ten </i>là biến kiểu xâu, <i>Diem </i>là biến kiểu
số nguyên và <i>Trungbinh </i>là biến kiểu số thực.
<b>10.</b>Chương trình Pascal có thể như sau đây:
<b>uses crt;</b>
<b>var r: integer; C,S: real;</b>
<b>begin</b>
<b>clrscr;</b>
<b>write('Nhap ban kinh r = '); readln(r);</b>
<b>C:=2*Pi*r;</b>
<b>S:=Pi*r*r;</b>
<b>1.</b> Hãy chỉ ra INPUT và OUTPUT của các bài toán sau:
<i>a)</i> Xác định số học sinh trong lớp cùng mang họ Trần.
<i>b)</i> Tính tổng của các phần tử lớn hơn 0 trong dãy <i>n</i> số cho trước.
<i>c)</i> Tìm số các số có giá trị nhỏ nhất trong <i>n</i> số đã cho.
<b>2.</b> Giả sử <i>x</i> và <i>y</i> là các biến số. Hãy cho biết kết quả của việc thực hiện thuật toán sau:
Bước 1. <i>x</i><i>x</i> + <i>y</i>
Bước 2. <i>y</i><i>x</i> - <i>y</i>
Bước 3. <i>x</i><i>x</i> - <i>y</i>
<b>3.</b> Cho trước ba số dương <i>a</i>, <i>b</i> và <i>c</i>. Hãy mơ tả thuật tốn giải ghi kết quả ba số đó có thể là ba
cạnh của một tam giác hay không.
<b>4.</b> Cho hai biến <i>x </i>và <i>y</i>. Hãy mô tả thuật tốn đổi giá trị của các biến nói trên để <i>x </i>và <i>y</i> có giá trị
tăng dần.
<b>5.</b> Cho ba biến <i>x</i>, <i>y</i> và <i>z</i>. Hãy mô tả thuật tốn đổi giá trị của các biến nói trên để <i>x</i>, <i>y</i> và <i>z </i>có giá
trị tăng dần. Hãy xem lại Ví dụ 5 để tham khảo.
<b>6.</b> Hãy mơ tả thuật tốn tính tổng các phần tử của dãy số <i>a</i>1, <i>a</i>2,..., <i>an</i> cho trước.
<b>7.</b> Hãy mô tả thuật toán nhập <i>n </i>số <i>a</i>1, <i>a</i>2, ..., <i>an</i> từ bàn phím và ghi ra màn hình số nhỏ nhất các
số đó. Số <i>n </i>cũng được nhập từ bàn phím.
<b>8.</b> Hãy mơ tả thuật tốn giải các bài tốn sau:
<i>a)</i> Đếm số các số dương trong dãy số <i>A</i> = {<i>a</i>1, <i>a</i>2,.., <i>an</i>} cho trước.
<i>b)</i> Hãy mô tả thuật tốn tính tổng các số dương trong dãy số <i>A</i> = {<i>a</i>1, <i>a</i>2,..., <i>an</i>} cho trước.
<b>1.</b> Đáp án:
<i>a)</i> INPUT: Danh sách họ của các học sinh trong lớp.
OUTPUT: Số học sinh có họ Trần.
<i>b)</i> INPUT: Dãy <i>n</i> số.
OUTPUT: Số các số có giá trị nhỏ nhất.
<b>2.</b> Sau ba bước, <i>x </i>có giá trị ban đầu của <i>y </i>và <i>y </i>có giá trị ban đầu của <i>x</i>, tức giá trị của hai biến <i>x </i>và <i>y</i>
được hốn đổi cho nhau.
<b>3.</b> Mơ tả thuật tốn:
INPUT: Ba số dương <i>a </i>>0, <i>b </i>>0 và <i>c </i>>0.
OUTPUT: Thơng báo “<i>a</i>, <i>b</i> và <i>c</i> có thể là ba cạnh của một tam giác” hoặc thông báo “<i>a</i>, <i>b</i> và <i>c</i>
không thể là ba cạnh của một tam giác”.
<i>Bước 1</i>: Tính <i>a </i>+ <i>b</i>. Nếu <i>a </i>+ <i>b</i> ≤ <i>c</i>, chuyển tới bước 5.
<i>Bước 4</i>: Thông báo “<i>a</i>, <i>b</i> và <i>c</i> có thể là ba cạnh của một tam giác” và kết thúc thuật toán.
<i>Bước 5</i>: Thông báo “<i>a</i>, <i>b</i> và <i>c</i> không thể là ba cạnh của một tam giác” và kết thúc thuật tốn.
<b>4.</b> Có thể giải bài tốn này bằng cách sử dụng một biến phụ hoặc khơng dùng biến phụ.
<i>Thuật tốn 1. </i>Sử dụng biến phụ <i>z</i>.
INPUT: Hai biến <i>x </i>và <i>y</i>.
OUTPUT: Hai biến<i> x </i>và <i>y</i> có giá trị tăng dần.
<i>Bước 1</i>: Nếu <i>x</i> ≤ <i>y</i>, chuyển tới bước 5.
<i>Bước 2</i>: <i>z </i><i>x</i>.
<i>Bước 3</i>: <i>x </i><i>y</i>.
<i>Bước 4</i>: <i>y </i><i>z</i>.
<i>Bước 5</i>: Kết thúc thuật tốn.
<i>Thuật tốn 2. </i>Khơng sử dụng biến phụ (Xem Bài tập 2 ở trên).
INPUT: Hai biến <i>x </i>và <i>y</i>.
OUTPUT: Hai biến<i> x </i>và <i>y</i> có giá trị tăng dần.
<i>Bước 1</i>: Nếu <i>x</i> ≤ <i>y</i>, chuyển tới bước 5.
<i>Bước 2</i>: <i>x</i><i>x</i> + <i>y</i>.
<i>Bước 3</i>: <i>y</i><i>x</i><i>y</i>.
<i>Bước 4</i>: <i>x</i><i>x</i><i>y</i>.
<i>Bước 5</i>: Kết thúc thuật toán.
<b>5.</b> Trước hết, nếu cần, ta hoán đổi giá trị hai biến <i>x </i>và <i>y</i> để chúng có giá trị tăng dần. Sau đó lần
lượt so sánh <i>z </i>với <i>x </i>và <i>z </i>với <i>y</i>,sau đóthực hiện các bước hoán đổi giá trị cần thiết (xem lại Ví dụ
5 trong Bài 5, SGK).
INPUT: Ba biến <i>x, y </i>và <i>z</i>.
<i>Bước 2</i>: <i>z</i><i>x</i>, <i>x</i><i>y</i>, <i>y</i><i>z</i>. (Sau bước này <i>x </i>và <i>y </i>có giá trị tăng dần.)
<i>Bước 3</i>: Nếu <i>y</i> ≤ <i>z </i>, chuyển tới bước 6.
<i>Bước 4</i>: Nếu <i>z</i> < <i>x</i>, <i>t</i><i>x </i>, <i>x</i><i>z </i>và <i>z</i><i>t</i>, (với <i>t </i>là biến trung gian) và chuyển đến bước 6.
<i>Bước 5</i>: <i>t</i><i>y </i>, <i>y</i><i>z </i>và <i>z</i><i>t</i>.
<i>Bước 6</i>: Kết thúc thuật tốn.
<b>6.</b> Thuật tốn tính tổng các phần tử của dãy số <i>A</i> = {<i>a</i>1, <i>a</i>2,..., <i>an</i>} cho trước.
INPUT: <i>n </i>và dãy <i>n </i>số <i>a</i>1, <i>a</i>2,..., <i>an</i>.
OUTPUT: Tổng <i>S</i> = <i>a</i>1 + <i>a</i>2 +... + <i>an</i>.
<i>Bước 1</i>: <i>S</i> 0; <i>i</i> 0.
<i>Bước 2</i>: <i>i</i><i>i</i> + 1.
<i>Bước 3</i>: Nếu <i>i</i> ≤ <i>n</i>, <i>S</i><i>S</i> + <i>ai</i> và quay lại bước 2.
<i>Bước 4</i>: Thông báo <i>S</i> và kết thúc thuật tốn.
<b>7.</b> Thuật tốn tìm số nhỏ nhất trong dãy <i>n</i> số <i>a</i>1, <i>a</i>2, ..., <i>an</i> cho trước. Thuật toán này tương tự như
thuật tốn tìm giá trị lớn nhất trong dãy <i>n </i>số đã cho (xem Ví dụ 6, Bài 5). Điều khác biệt là thêm
các bước nhập số <i>n</i> và dãy <i>n</i> số <i>a</i>1, <i>a</i>2, ..., <i>an</i>.
INPUT: <i>n </i>và dãy <i>n </i>số <i>a</i>1, <i>a</i>2,..., <i>an</i>.
OUTPUT: <i>Min</i> = Min{<i> a</i>1, <i>a</i>2, ..., <i>an</i>}
<i>Bước 1</i>: Nhập <i>n </i>và dãy <i>n </i>số <i>a</i>1, <i>a</i>2,..., <i>an</i>.
<i>Bước 2</i>: Gán <i>Min</i><i>a</i>1; <i>i</i> 1.
<i>Bước 3</i>: <i>i</i><i>i</i> + 1.
<i>Bước 4</i>: Nếu <i>i</i> > <i>n</i>, chuyển đến bước 5.
<i>Bước 5</i>: Nếu <i>ai</i> < <i>Min</i>, gán <i>Min</i> <i>ai</i> rồi quay lại bước 3. Trong trường hợp ngược lại, quay lại
bước 3.
<i>Bước 6</i>: Ghi giá trị <i>Min</i> ra màn hình và kết thúc thuật tốn.
<b>8.</b> <i>a) </i>Đếm số các số dương trong dãy số <i>A</i> = {<i>a</i>1, <i>a</i>2,.., <i>an</i>} cho trước.
INPUT: <i>n </i>và dãy <i>n </i>số <i>a</i>1, <i>a</i>2,..., <i>an</i>.
OUTPUT: <i>Soduong</i> = Số các số <i>ai</i> > 0.
<i>Bước 1</i>: Gán <i>Soduong</i> 0.
<i>Bước 2</i>: <i>i</i><i>i</i> + 1.
<i>Bước 3</i>: Nếu <i>i</i> > <i>n</i>, chuyển đến bước 5.
<i>Bước 4</i>: Nếu <i>ai</i> > 0, gán <i>Soduong </i><i>Soduong </i>+1 rồi quay lại bước 2. Trong trường hợp ngược
lại, quay lại bước 2.
<i>Bước 5</i>: Thông báo giá trị <i>Soduong</i> và kết thúc thuật tốn.
<i>b) </i>Tính tổng các số dương trong dãy số <i>A</i> = {<i>a</i>1, <i>a</i>2,..., <i>an</i>} cho trước.
INPUT: <i>n </i>và dãy <i>n </i>số <i>a</i>1, <i>a</i>2,..., <i>an</i>.
<i>Bước 1</i>: <i>S</i> 0; <i>i</i> 0.
<i>Bước 2</i>: <i>i</i><i>i</i> + 1.
<i>Bước 3</i>: Nếu <i>ai</i> > 0, <i>S</i><i>S</i> + <i>ai</i>; ngược lại, giữ nguyên <i>S</i>.
<b>1.</b> Em hãy nêu một vài ví dụ về các hoạt động hằng ngày phụ thuộc vào điều kiện.
<b>2.</b> Hãy cho biết các điều kiện hoặc phép so sánh sau đây cho kết quả đúng hay sai:
<i>a)</i> 123 là số chia hết cho 3.
<i>b)</i> Nếu ba cạnh <i>a</i>, <i>b </i>và <i>c </i>của một tam giác thỏa mãn <i>c</i>2 <sub>> </sub><i><sub>a</sub></i>2<sub> + </sub><i><sub>b</sub></i>2<sub> thì tam giác đó có một</sub>
góc tù (> 90o<sub>).</sub>
<i>c)</i> 152<sub> > 200.</sub>
<i>d)</i> <i>n</i>! ≤ <i>n</i>2<sub> với mọi số tự nhiên </sub><i><sub>n</sub></i><sub>.</sub>
<i>e)</i> <i>x</i>2<sub> < 1.</sub>
<b>3.</b> Hai người bạn cùng chơi trị đốn số. Một người nghĩ trong đầu một số tự nhiên nhỏ hơn 10.
Người kia đoán xem bạn đã nghĩ số gì. Nếu đốn đúng, người đốn sẽ được cộng thêm 1
điểm, nếu sai sẽ không được cộng điểm. Luân phiên nhau nghĩ và đoán. Sau 10 lần, ai được
nhiều điểm hơn, người đó sẽ thắng.
Hãy phát biểu các điều kiện ở trị chơi là gì? Hoạt động nào sẽ được thực hiện, nếu điều kiện
đó thoả mãn? Hoạt động nào sẽ được thực hiện, nếu điều kiện đó khơng thoả mãn?
<b>4.</b> Một trị chơi máy tính rất hứng thú đối với các em nhỏ là hứng trứng. Một quả trứng rơi từ
một vị trí ngẫu nhiên trên cao. Người chơi dùng các phím mũi tên hoặc để điều khiển
một biểu tượng chiếc khay di chuyển theo chiều ngang để hứng quả trứng. Nếu hứng trượt,
quả trứng bị rơi, vỡ và người chơi tiếp tục di chuyển khay để hứng quả trứng khác.
Điều kiện để điều khiển chiếc khay trong trị chơi là gì? Hoạt động nào sẽ được thực hiện,
nếu điều kiện đó thoả mãn? Hoạt động nào sẽ được thực hiện, nếu điều kiện đó khơng thoả
mãn?
<b>5.</b> Các câu lệnh Pascal sau đây được viết đúng hay sai?
<i>a)</i> <b>if x:=7 then a=b;</b>
<i>b)</i> <b>if x>5; then a:=b;</b>
<i>c)</i> <b>if x>5 then; a:=b; </b>
<i>d)</i> <b>if x>5 then a:=b; m:=n; </b>
<i>e)</i> <b>if x>5 then a:=b; else m:=n;</b>
<b>6.</b> Sau mỗi câu lệnh sau đây
<i>a)</i> <b>if (45 mod 3)=0 then X:=X+1;</b>
<i>b)</i> <b>if X>10 then X:=X+1;</b>
giá trị của biến <i>X </i>sẽ là bao nhiêu, nếu trước đó giá trị của <i>X </i>bằng 5?
<b>7.</b> Giả sử cần viết chương trình nhập một số tự nhiên vào máy tính và ghi ra màn hình kết quả
số đã nhập là số chẵn hay lẻ, chẳng hạn “<i>5 là số lẻ</i>”, “<i>8 là số chẵn</i>”. Hãy mơ tả các bước của
thuật tốn để giải quyết bài tốn trên và viết chương trình Pascal để thực hiện thuật tốn đó.
<b>8.</b> Viết chương trình nhập sử dụng hai biến <i>X </i>và <i>Y</i> để lưu hai số nhập từ bàn phím, sau đó đổi
giá trị của các biến đó để <i>X </i>và <i>Y</i> có giá trị tăng dần (xem Bài tập 3, Bài 5).
<b>9.</b> Hãy mơ tả thuật tốn và viết chương trình nhập ba số thực <i>a</i>,<i> b</i> và <i>c </i>từ bàn phím vào máy
tính, sau đó sắp xếp và ghi các số đó ra màn hình theo <i>thứ tự tăng dần</i> (xem Bài tập 8 và
thuật tốn trong Ví dụ 5, Bài 5).
<b>10.</b> Hãy mơ tả thuật tốn và viết chương trình nhập ba số thực <i>a</i>,<i> b</i> và <i>c </i>từ bàn phím vào máy
tính, sau đó kiểm tra ba số đó có thể là các cạnh của tam giác đều, tam giác cân hoặc tam
giác vuông hay không và ghi kết quả ra màn hình (xem Bài 3, Bài thực hành 4).
<b>1.</b> Có thể nêu rất nhiều vài ví dụ về các hoạt động hằng ngày phụ thuộc vào điều kiện. Dưới đây là
một số ví dụ:
<i>a)</i> Nếu đạt điểm tổng kết cả năm cao hơn 8.5, em sẽ đạt danh hiệu “<i>Học sinh giỏi</i>”.
<i>b)</i> Nếu không được cắm điện, máy tính để bàn của em sẽ khơng hoạt động được.
<i>c)</i> Nếu bị bệnh, em (cần phải) đi đến phịng khám để bác sĩ khám bệnh.
<i>d)</i> Nếu khơng được tưới đủ nước đúng thời kì phát triển, lúa sẽ không cho thu hoạch cao.
<b>2.</b> Đáp án: <i>a</i>) Đúng; <i>b</i>) Đúng; <i>c</i>) Sai; <i>d</i>) Sai; <i>e</i>) Sai, nếu <i>x </i>≥ 1.
<b>3.</b> Giả sử <i>Điểm_1</i> là số điểm của người thứ nhất và <i>Điểm_2</i> là số điểm của người thứ hai, ngoài ra
một người thứ nhất trong đầu một số tự nhiên <i>n </i>< 10.
Điều kiện ở trò chơi là người thứ hai đốn đúng số <i>n</i>. Khi đó <i>Điểm_2</i> được cộng thêm 1; ngược
lại, <i>Điểm_2</i> được giữ nguyên. Tương tự, nếu người thứ hai nghĩ số tự nhiên <i>m</i>, và điều kiện thứ
hai là người thứ nhất đoán đúng số <i>m </i>đó. Khi đó <i>Điểm_1</i> được cộng thêm 1; ngược lại, <i>Điểm_1</i>
được giữ nguyên.
Điều kiện ở trò chơi là sau 10 lần, nếu <i>Điểm_1</i> > <i>Điểm_2</i> thì người thứ nhất được tuyên bố thắng
cuộc; ngược lại, người thứ hai thắng. Trường hợp <i>Điểm_1</i> = <i>Điểm_2</i> thì khơng có người thắng và
người thua.
<b>4.</b> Điều kiện để điều khiển chiếc khay trong trị chơi người chơi nhấn phím mũi tên hoặc . Nếu
người chơi nhấn phím , biểu tượng chiếc khay sẽ di chuyển sang phải một đơn vị khoảng
cách; nếu phím được nhấn, biểu tượng chiếc khay sẽ di chuyển sang trái. Nếu một phím khác
ngồi hai phím mũi tên trên được nhấn, chiếc khay vẫn giữ nguyên vị trí.
<b>5.</b> Đáp án: <i>a</i>) Sai (thừa dấu hai chấm); <i>b</i>) Sai (thừa dấu chấm phảy thứ nhất); <i>c</i>) Sai (thừa dấu chấm
phảy sau từ <b>then</b>); <i>d</i>) Đúng, nếu phép gán <b>m:=n</b> không phụ thuộc điều kiện <b>x>5</b>; ngược lại, sai và
<b>6.</b> <i>a</i>) Vì 45 chia hết cho 3, điều kiện được thỏa mãn nên giá trị của <i>X </i>được tăng lên 1, tức bằng 6; <i>b</i>)
Điều kiện không được thỏa mãn nên câu lệnh không được thực hiện, tức <i>X </i>giữ nguyên giá trị 5.
<b>7.</b> Thuật toán:
<i>Bước 1</i>. Nhập số <i>n</i>.
<i>Bước 2</i>. Nếu <i>n</i> chia hết cho 2, ghi ra màn hình “<i>n </i>là số chẵn”; ngược lại, ghi ra màn hình “<i>n </i>là số
lẻ”.
<i>Bước 3</i>. Kết thúc thuật tốn.
<b>8.</b> Chương trình Pascal:
<b>uses crt;</b>
<b>var X,Y,Z: real;</b>
<b>begin</b>
<b>clrscr;</b>
<b>write('Nhap so X = '); readln(Y);</b>
<b>write('Nhap so Y = '); readln(Y);</b>
<b>if X>Y then begin Z:=X; X:=Y; Y:=Z;</b>
<b>writeln(X,’ ’,Y);</b>
<b>readln</b>
<b>end.</b>
<b>9.</b> Thuật toán:
<i>Bước 1</i>. Nhập ba số <i>A</i>, <i>B </i>và <i>C</i>.
<i>Bước 2</i>. Nếu <i>A </i>> <i>B</i>, <i>X </i><i>A</i>, <i>A </i><i>B</i>, <i>B </i><i>X</i>.
<i>Bước 3</i>. Nếu <i>C </i>> <i>A</i>, <i>X </i><i>A</i>, <i>A </i><i>C</i>, <i>C </i><i>X</i>.
<i>Bước 4</i>. Nếu <i>C </i>< <i>B</i>, <i>X </i><i>B</i>, <i>B </i><i>C</i>, <i>C </i><i>X</i>.
<i>Bước 5</i>. Ghi giá trị các biến theo thứ tự <i>A</i>, <i>B </i>và <i>C</i> và kết thúc thuật toán.
Chương trình Pascal:
<b>uses crt;</b>
<b>var </b> <b>A, B, C, X: integer; </b>
<b>begin</b>
<b>clrscr;</b>
<b>write('Nhap so A: '); readln(A);</b>
<b>write('Nhap so B: '); readln(B);</b>
<b>write('Nhap so C: '); readln(C);</b>
<b>if A>B then begin X:=A; A:=B; B:=X end;</b>
<b>if C<A then begin X:=A; A:=C; C:=X end;</b>
<b>if C<B then begin X:=B; B:=C; C:=X end;</b>
<b>writeln(A,' ',B,' ',C);</b>
<b>readln;</b>
<b>end.</b>
<b>10.</b>Thuật toán:
<i>Bước 2</i>. Nếu <i>A </i>+ <i>B </i>< <i>C </i>hoặc <i>B </i>+ <i>C </i>< <i>A </i>hoặc <i>C </i>+ <i>A </i>< <i>B</i>, thông báo <i>A</i>, <i>B </i>và <i>C</i> không phải là ba
cạnh của một tam giác và chuyển tới bước 5.
<i>Bước 3</i>. Nếu <i>A</i>2<sub>+ </sub><i><sub>B</sub></i>2<sub>= </sub><i><sub>C </sub></i><sub>hoặc </sub><i><sub>B</sub></i>2<sub>+ </sub><i><sub>C</sub></i>2<sub>= </sub><i><sub>A</sub></i>2<sub>hoặc </sub><i><sub>C</sub></i>2<sub>+ </sub><i><sub>A</sub></i>2<sub>= </sub><i><sub>B</sub></i><sub>, thông báo </sub><i><sub>A</sub></i><sub>, </sub><i><sub>B </sub></i><sub>và </sub><i><sub>C</sub></i><sub> là ba cạnh của</sub>
một tam giác vuông và chuyển tới bước 5.
<i>Bước 4</i>. Nếu <i>A </i>= <i>B </i>và <i>B </i>= <i>C</i>, thông báo <i>A</i>, <i>B </i>và <i>C</i> là ba cạnh của một tam giác đều; ngược lại,
nếu <i>A </i>= <i>B </i>hoặc <i>B </i>= <i>C </i>hoặc <i>A </i>= <i>C</i>, thông báo <i>A</i>, <i>B </i>và <i>C</i> là ba cạnh của một tam giác cân.
<i>Bước 5</i>. Kết thúc thuật tốn.
Chương trình Pascal:
<b>program Sap_xep;</b>
<b>uses crt;</b>
<b>var </b> <b>A, B, C, X: integer;</b>
<b>begin</b>
<b>clrscr;</b>
<b>write('Nhap so A: '); readln(A);</b>
<b>write('Nhap so B: '); readln(B);</b>
<b>write('Nhap so C: '); readln(C);</b>
<b>if (A+B<C) or (B+C<A) or (A+C<B)</b>
<b> then writeln('Day khong la ba canh cua mot tam giac') else</b>
<b> if (A*A=B*B+C*C) or (B*B=A*A+C*C) or (C*C=A*A+B*B)</b>
<b> then writeln('Day la ba canh cua tam giac vuong') else</b>
<b> then writeln('Day la ba canh cua tam giac deu') else</b>
<b> if (A=B) or (B=C) or (C=A)</b>
<b> then writeln('Day la ba canh cua tam giac can') else</b>
<b> writeln('Day chi la ba canh cua tam giac thuong');</b>
<b>readln;</b>
<b>1.</b> Cho một vài ví dụ về hoạt động được thực hiện lặp lại trong cuộc sống hàng ngày!
<b>2.</b> Hãy mơ tả các bước của thuật tốn để vẽ hình ... <i>a</i>) và ... <i>b</i>) sau đây:
<i>Hình ...a</i>) <i>Hình ... b</i>)
Thao tác lặp cần thực hiện để có các hình trên và điều kiện để kết thúc thao tác đó là gì
<b>3.</b> Hãy cho biết tác dụng của câu lệnh lặp!
<b>4.</b> Chúng ta nói rằng khi thực hiện các hoạt động lặp, chương trình kiểm tra một điều kiện. Với lệnh
lặp
<b>for </b><<i>biến đếm</i>> <b>:=</b> <<i>giá trị đầu</i>><b> to</b> <<i>giá trị cuối</i>> <b>do </b><<i>câu lệnh</i>><b>;</b>
của Pascal, điều kiện cần phải kiểm tra là gì?
<b>5.</b> Chương trình Pascal sau đây thực hiện hoạt động nào?
<b>var i: integer;</b>
<b>begin</b>
<b>for i:=1 to 1000 do;</b>
<b>end.</b>
<b>6.</b> Hãy mơ tả thuật tốn để tính tổng sau đây (<i>n </i>là số tự nhiên được nhập vào từ bàn phím):
A = ( 1)
1
...
5
.
3
1
4
.
2
1
3
.
1
1
<i>n</i>
<i>n</i>
<b>7.</b> Các câu lệnh Pascal có hợp lệ khơng, vì sao?
<i>a</i>) <b>for i:=100 to 1 do writeln(’A’);</b>
<i>b</i>) <b>for i:=1.5 to 10.5 do writeln(’A’);</b>
<i>c</i>) <b>for i=1 to 10 do writeln(’A’);</b>
<i>d</i>) <b>for i:=1 to 10 do; writeln(’A’);</b>
<i>e</i>) <b>var x: real; for x:=1 to 10 do writeln(’A’);</b>
<b>8.</b> Một số ngơn ngữ lập trình, ví dụ Pascal, khơng có sẵn hàm tính lũy thừa. Hãy mơ tả thuật toán và
sử dụng câu lệnh lặp với số lần xác định trước để viết chương trình Pascal tính lũy thừa bậc <i>n</i> của
số nguyên <i>X</i>.
<b>10.</b>Viết chương trình Pascal nhập <i>n </i>số nguyên từ bàn phím và ghi ra màn hình số các số dương
trong các số đó. Số <i>n </i>cũng được nhập vào từ bàn phím. (Xem Bài tập 5a, Bài 5.)
<i><b>1.</b></i> Có thể nêu rất nhiều vài ví dụ về các hoạt động lặp. Dưới đây là một số ví dụ:
<i>a)</i> Hàng ngày em đặt đồng hồ báo thức lúc 6 giờ để dậy sớm tập thể dục.
<i>b)</i> Hàng ngày (hoặc hàng tuần) bác lái xe khách lái xe để chuyên chở hành khách xuất phát
từ một thời gian và địa điểm nhất định và đi theo một tuyến đường đã được xác định
trước.
<i>c)</i> Mỗi lần được khởi động, máy tính của em sẽ thực hiện cùng các hoạt động tự kiểm tra
các thành phần máy tính, sau đó khởi động hệ điều hành theo một trình tự đã được quy
định trước.
<i><b>2.</b></i> <i>a</i>) Có thể thấy, để vẽ được hình ...a), thao tác chính cần thực hiện là vẽ nửa đường tròn theo
hướng nhất định. Ta gọi thao tác vẽ nửa đường tròn theo hướng <i>A </i>là vẽ nửa đường trịn có bán
kính 1 đơn vị bắt đầu từ một điểm xác định, đường kính nối điểm đầu và điểm cuối của nửa
đường trịn vng góc với hướng <i>A </i>và nửa đường trịn “cong về hướng <i>A</i>” (hình...). Ta chỉ xét <i>A</i>
là các hướng <i>lên trên</i>, <i>xuống dưới</i>, <i>sang trái</i>, <i>sang phải</i>.
Với các hướng, ta định nghĩa phép toán sau: <i>lên trên</i> + 1 = <i>sang trái</i>, <i>sang trái</i> +1 = <i>xuống dưới</i>,
<i>xuống dưới </i>+1 = <i>sang phải</i>, <i>sang phải</i> +1 = <i>lên trên</i>. Khi đó có thể mơ tả các bước của thuật tốn
để vẽ hình ... a) như sau:
<i>Hình ...</i> <i>Hình ...</i>
Có thể mơ tả các bước của thuật tốn để vẽ hình ... a) như sau:
<i>Bước 1</i>. Xác định điểm bắt đầu vẽ là <i>X</i>.
<i>Bước 2</i>. Đặt <i>i </i>= 0 và đặt <i>hướng</i> = <i>lên trên</i>.
<i>Bước 3</i>. Vẽ nửa đường tròn theo hướng đã đặt.
<i>Bước 4</i>. <i>i </i>= <i>i </i>+ 1.
<i>Bước 5</i>. Nếu <i>i </i>> 4, chuyển bước 6; ngược lại, đặt <i>hướng </i>= <i>hướng </i>+ 1 và quay lại bước 3.
<i>Bước 6</i>. Kết thúc thuật tốn.
<i><b>Lưu ý</b></i>. Khi trình bày thuật tốn lần đầu tiên cho học sinh khơng nên định nghĩa các phép toán với
các hướng mà chỉ nên liệt kê đủ bốn hướng trong thuật toán.
<i>b</i>) Thuật toán tương tự như trên. Thao tác chính cần lặp lại là vẽ hình vng. Tại mỗi bước, giữ
ngun tâm hình vng và thay đổi hướng vẽ một góc 30o<sub>.</sub>
<i><b>3.</b></i> Câu lệnh lặp có tác dụng làm đơn giản và giảm nhẹ cơng sức của người viết chương trình!
<b>for </b><<i>biến đếm</i>> <b>:=</b> <<i>giá trị đầu</i>><b> to</b> <<i>giá trị cuối</i>> <b>do </b><<i>câu lệnh</i>><b>;</b>
của Pascal, điều kiện cần phải kiểm tra chính là giá trị của <i>biến đếm </i>lớn hơn <i>giá trị cuối</i>. Nếu
điều kiện không được thỏa mãn, <i>câu lệnh </i>được tiếp tục thực hiện; ngược lại, chuyển sang câu
lệnh tiếp theo trong chương trình.
<i><b>5.</b></i> Tuy có vịng lặp 1000 lần, nhưng chương trình Pascal nói trên khơng thực hiện bất kì một hoạt
động nào. Tuy nhiên đây vẫn là câu lệnh hợp lệ.
<i><b>6.</b></i> Thuật tốn tính tổng
A = ( 1)
1
...
5
.
3
1
4
.
<i>Bước 1</i>. Gán <i>A </i> 0, <i>i </i> 1.
<i>Bước 2</i>. <i>A </i>
1
( 2)
<i>i i</i> <sub>.</sub>
<i>Bước 3</i>. <i>i </i><i>i </i>+ 1.
<i>Bước 4</i>. Nếu <i>i </i>≤ <i>n</i>, quay lại bước 2.
<i>Bước 5</i>. Ghi kết quả <i>A </i>và kết thúc thuật toán.
<i><b>7.</b></i> Trừ <i>d</i>), tất cả các câu lệnh đều không hợp lệ: <i>a</i>) Giá trị đầu phải nhỏ hơn giá trị cuối; <i>b</i>) Các giá
trị đầu và giá trị cuối phải là số nguyên; <i>c</i>) Thiếu dấu hai chấm khi gán giá trị đầu; <i>d</i>) Thừa dấu
chấm phảy thứ nhất, nếu như ta muốn lặp lại câu lệnh <b>writeln(’A’)</b>mười lần, ngược lại câu lệnh là
hợp lệ; <i>e</i>) Biến <b>x</b>đã được khai báo như là biến có dữ liệu kiểu số thực và vì thế không thể dùng
để xác định giá trị đầu và giá trị cuối trong câu lệnh lặp.
<i><b>8.</b></i> Thuật toán:
<i>Bước 1</i>. Nhập các số <i>n </i>và <i>x</i>.
<i>Bước 2</i>. <i>A </i>1, <i>i </i> 0 (<i>A </i>là biến lưu lũy thừa bậc <i>n </i>của <i>x</i>).
<i>Bước 3</i>. <i>i</i><i>i </i>+ 1, <i>A </i><i> A</i>.<i>x</i>.
<i>Bước 4</i>. Nếu <i>i </i>< <i>n</i>, quay lại bước 3.
<i>Bước 5</i>. Thông báo kết quả <i>A </i>là lũy thừa bậc <i>n </i>của <i>x</i> và kết thúc thuật tốn.
Chương trình Pascal có thể như sau:
<b>var n,i,x: integer; a: longint;</b>
<b>begin</b>
<b>write('Nhap x='); readln(x);</b>
<b>write('Nhap n='); readln(n);</b>
<b>A:=1;</b>
<b>for i:=1 to n do A:=A*X;</b>
<b>writeln(x,' mu ',n,' bang ',A);</b>
<b>end.</b>
<i><b>9.</b></i> Thuật toán:
<i>Bước 1</i>. Nhập số <i>n</i>.
<i>Bước 2</i>. <i>A</i>32768 (gán số nhỏ nhất có thể trong các số kiểu nguyên cho <i>A</i>), <i>i</i>1.
<i>Bước 4</i>. Nếu <i>Max </i>< <i>A</i>, <i>Max </i><i>A</i>.
<i>Bước 5</i>. <i>i</i><i>i </i>+ 1.
<i>Bước 6</i>. Nếu <i>i </i>≤ <i>n</i>, quay lại bước 3.
<i>Bước 7</i>. Thông báo kết quả <i>Max </i>là số lớn nhất và kết thúc thuật tốn.
Chương trình Pascal có thể như sau:
<b>uses crt;</b>
<b>var n,i,Max,A: integer;</b>
<b>begin</b>
<b>clrscr;</b>
<b>write('Nhap N='); readln(n);</b>
<b>Max:=-32768;</b>
<b>for i:=1 to n do</b>
<b> begin write('Nhap so thu ',i,':'); readln(A);</b>
<b> if Max<A then Max:=A end;</b>
<b>writeln('So lon nhat: ',Max);</b>
<b>end.</b>
<i><b>Lưu ý.</b></i> Trong chương trình trên chúng ta chỉ sử dụng hai biến <b>A</b> và <b>Max</b> để giải bài toán. Một
cách tự nhiên, để nhập <i>n</i> số chúng ta cần tới <i>n </i>biến. Tuy nhiên, ở đây việc xử lí các giá trị trong
dãy số có thể thực hiện bằng cách chỉ cần so sánh các giá trị đã được nhập vào, do đó chúng ta
chỉ cần một biến để lưu lần lượt các giá trị nhập vào là đủ. Một cách giải quyết khác là sử dụng
biến mảng (xem Bài tập 6, Bài 9).
<i><b>10.</b></i>Lời giải bài này tương tự như lời giải của Bài 9 ở trên. Xem thuật toán trong lời giải Bài tập 5a,
Bài 5. Chương trình Pascal có thể như sau:
<b>uses crt;</b>
<b>var n,i,SoDuong,A: integer;</b>
<b>begin</b>
<b>clrscr;</b>
<b>write('Nhap N='); readln(n);</b>
<b>if n>0 then</b>
<b> begin</b>
<b> SoDuong:=0;</b>
<b> for i:=1 to n do</b>
<b> begin write('Nhap so thu ',i,':'); readln(A);</b>
<b> if A>0 then SoDuong:=SoDuong+1 end;</b>
<b> writeln('So cac so duong = ',SoDuong)</b>
<b> end</b>
<b>1.</b> Nêu một vài ví dụ về hoạt động lặp với số lần chưa biết trước!
<b>2.</b> Hãy phát biểu sự khác biệt giữa câu lệnh lặp với số lần lặp cho trước và câu lệnh lặp với số
lần lặp chưa biết trước.
<b>3.</b> Một chương trình máy tính vẽ trên màn hình các đường trịn tiếp xúc nhau tại một điểm như
hình ... dưới đây:
<i>Hình ...</i>
Đường trịn lớn nhất có bán kính <i>R </i>được vẽ đầu tiên. Sau mỗi bước, bán kính đường trịn
giảm 1/2 đơn vị và đường trịn cuối cùng là đường trịn nhỏ nhất có bán kính lớn hơn 1.2
đơn vị.
Hãy mơ tả thuật tốn để có chương trình trên.
<b>4.</b> Hãy tìm hiểu các thuật toán sau đây và cho biết khi thực hiện thuật tốn, máy tính sẽ bao
nhiêu vịng lặp? Khi kết thúc, giá trị của <i>S </i>bằng bao nhiêu? Viết chương trình Pascal thể hiện
các thuật tốn đó!
<i>a</i>) Thuật tốn 1
<i>Bước 1</i>. <i>S </i> 10, <i>x </i> 0.5.
<i>Bước 2</i>. Nếu <i>S </i> 5.2, chuyển tới bước 4.
<i>Bước 3</i>. <i>S </i><i>S </i><i>x</i> và quay lại bước 2.
<i>Bước 4</i>. Thông báo <i>S </i>và kết thúc thuật toán.
<i>b</i>) Thuật toán 2
<i>Bước 1</i>. <i>S </i> 10, <i>n </i> 0.
<i>Bước 2</i>. Nếu <i>S ≥ </i>10, chuyển tới bước 4.
<i>Bước 3</i>. <i>n </i><i>n </i>+ 3, <i>S </i><i>S</i><i>n</i> quay lại bước 2.
<i>Bước 4</i>. Thông báo <i>S </i>và kết thúc thuật toán.
Cho nhận xét của em!
<b>5.</b> Hãy tìm hiểu các cụm câu lệnh sau đây và cho biết với các câu lệnh đó chương trình thực
hiện bao nhiêu vòng lặp? Hãy rút ra nhận xét của em!
<i><b>a)</b></i> <b>S:=0; n:=0;</b>
<b>while S<=10 do</b>
<i><b>b)</b></i> <b>S:=0; n:=0;</b>
<b>while S<=10 do</b>
<b> n:=n+1; S:=S+n;</b>
<b>6.</b> Hãy chỉ ra lỗi trong các câu lệnh sau đây:
<i><b>a)</b></i> <b>X:=10; while X:=10 do X:=X+5;</b>
<i><b>b)</b></i> <b>X:=10; while X=10 do X=X+5;</b>
<i><b>c)</b></i> <b>S:=0; n:=0; while S<=10 do n:=n+1; S:=S+n;</b>
<b>7.</b> Viết thuật tốn và chương trình Pascal có câu lệnh lặp với số lần khơng xác định để tính lũy
thừa bậc <i>n </i>của <i>A</i> (tức <i>An</i><sub>), với </sub><i><sub>n</sub></i><sub> là số tự nhiên và </sub><i><sub>A</sub></i><sub> là số thực được nhập vào từ bàn phím.</sub>
Hãy so sánh với thuật toán trong Bài tập 8, Bài 7.
<b>8.</b> Hãy liệt kê các bước của thuật tốn với số lần lặp khơng xác định để tính tích của <i>N</i> số tự
nhiên đầu tiên, với <i>N</i> là số tự nhiên được nhập vào từ bàn phím.
<b>9.</b> Số nguyên <i>p </i>được gọi là ước số thực sự của số nguyên <i>q</i>, nếu <i>q </i>chia hết cho <i>p </i>và <i>p </i>khác1 và
khác chính số <i>q</i>. Viết thuật tốn và chương trình để nhập số tự nhiên <i>n</i> và tính tổng các ước
số thực sự của <i>n</i>.
<b>10.</b> Người ta đã chứng minh rằng các tổng sau đây
1 2 3
1 1 1 1 1 1 1 1 1
, , , ..., ...
2 2 3 2 3 4 <i>n</i> 2 3 1
<i>T</i> <i>T</i> <i>T</i> <i>T</i>
<i>n</i>
ln ln tăng (có thể lớn hơn một số bất kì), mặc dù chỉ cộng thêm một số rất nhỏ ở mỗi
bước.Viết chương trình nhập số thực <i>A</i> và tìm số tự nhiên nhỏ nhất <i>N</i> sao cho 1 + 1/2 + 1/3 +
.... + 1/<i>N</i> ><i>A</i>.
<b>1.</b> Có thể nêu rất nhiều vài ví dụ về các hoạt động lặp với số lần lặp chưa biết trước. Dưới đây là
một số ví dụ:
<i>a)</i> Tìm một từ nhất định bị gõ sai chính tả trong văn bản và sửa lại cho đúng. Số từ cần phải
sửa chưa được biết trước.
<i>b)</i> Khi chuẩn bị tô phở để phục vụ cho khách, cô bán hàng thường thực hiện các công việc
sau đây: Cho một lượng bánh phở vào nồi nước phở để làm nóng bánh phở, cho bánh phở
đã làm nóng vào bát, làm chín một ít thịt và cho vào bát bánh phở đã được làm nóng, cho
thêm gia vị, thêm nước phở đang được đun sơi và bát phở,... Các thao tác đó được thực
hiện lặp lại mỗi khi có khách ăn phở. Trong suốt ca bán hàng số lần thực hiện các thao tác
lặp đó là khơng thể biết trước.
<i>c)</i> Trong xưởng may, mỗi cô công nhân may cùng một chi tiết của chiếc áo, hay chiếc quần
với các đường may đã được thiết kế trước. May xong một sản phẩm, cô công nhân sẽ may
sản phẩm tiếp theo cho đến khi hết giờ làm việc.
<b>2.</b> Sự khác biệt giữa câu lệnh lặp với số lần lặp cho trước và câu lệnh lặp với số lần lặp chưa biết
trước là ở các điểm sau đây:
<i>a)</i> Như tên gọi của nó, câu lệnh lặp với số lần lặp cho trước chỉ thị cho máy tính thực hiện
một lệnh hoặc một nhóm lệnh với số lần đã được xác định từ trước, còn với câu lệnh lặp
với số lần lặp chưa biết trước thì số lần lặp chưa được xác định trước.
biết trước, điều kiện tổng quát hơn nhiều, có thể là kiểm tra một giá trị của một số thực,
cũng có thể là một điều kiện tổng quát khác, ví dụ như một số có chia hết cho 3 hay
không,...
<i>c)</i> Trong câu lệnh lặp với số lần cho trước, <i>câu lệnh </i>được thực hiện ít nhất một lần, sau đó
kiểm tra điều kiện. Trong câu lệnh lặp với số lần chưa xác định trước, trước hết điều kiện
được kiểm tra. Nếu điều kiện được thỏa mãn, <i>câu lệnh </i>mới được thực hiện. Do đó có thể
có trường hợp <i>câu lệnh </i>hồn tồn khơng được thực hiện.
<b>3.</b> Mơ tả thuật toán:
<i>Bước 1</i>. Đặt <i>S </i><i>R </i>(<i>S </i>là bán kính đường trịn sẽ vẽ), <i>n </i> 0, <i>x </i> 0.5.
<i>Bước 2</i>. Nếu <i>S </i>< 1.2, chuyển tới bước 4.
<i>Bước 3</i>. Vẽ đường trịn bán kính <i>S</i>, <i>S </i><i>S </i><i>x</i> và quay lại bước 2.
<i>Bước 4</i>. Kết thúc thuật tốn.
<b>4.</b> <i>a</i>) Thuật tốn 1: 10 vịng lặp được thực hiện. Khi kết thúc thuật toán <i>S </i>= 5.0. Đoạn chương trình
Pascal tương ứng:
<b>S:=10; x:=0.5;</b>
<b>while S>5.2 do S:=S-x;</b>
<b>writeln(S);</b>
<i>b</i>) Thuật tốn 2: Khơng vịng lặp nào được thực hiện vì ngay từ đầu điều kiện đã không được
thỏa mãn nên các bước 2 và 3 bị bỏ qua. <i>S </i>= 10 khi kết thúc thuật toán. Đoạn chương trình
<b>S:=10; n:=0;</b>
<b>while S<10 do</b>
<b> begin n:=n+3; S:=S-n end;</b>
<b>writeln(S);</b>
<i>Nhận xét</i>: Trong các thuật tốn và chương trình trên, điều kiện được kiểm tra trước khi các bước
lặp được thực hiện. Do đó nếu điều kiện khơng được thỏa mãn ngay từ đầu, các bước lặp sẽ bị bỏ
qua. Điều này đặc biệt đúng đối với câu lệnh lặp <b>while..do</b>.
<b>5.</b> <i>a</i>) Chương trình thực hiện 5 vịng lặp. <i>b</i>) Vịng lặp trong chương trình được thực hiện vơ tận vì
sau câu lệnh <b>n:=n+1; </b>câu lệnh lặp kết thúc nên điều kiện <b>S=0 </b>luôn luôn được thỏa mãn.
<i>Nhận xét</i>: Trong câu lệnh thực hiện, điều kiện cần phải được thay đổi để sớm hay muộn chuyển
sang trạng thái không thỏa mãn. Khi đó vịng lặp mới được kết thúc sau hữu hạn bước. Để làm
được điều này, <i>câu lệnh</i> trong câu lệnh lặp <b>while..do </b>thường là <i>câu lệnh ghép</i>.
<b>6.</b> <i>a</i>) Thừa dấu hai chấm trong điều kiện; <i>b</i>) Thiếu dấu hai chấm trong câu lệnh gán; <i>c</i>) Thiếu các từ
khóa <b>begin </b>và <b>end </b>trước và sau các lệnh <b>n:=n+1; S:=S+n</b>, do đó vịng lặp trở thành vơ tận.
<b>7.</b> Viết thuật tốn và chương trình Pascal có câu lệnh lặp với số lần khơng xác định để tính lũy thừa
bậc <i>n </i>của <i>x</i> (tức <i>xn</i><sub>), với </sub><i><sub>n</sub></i><sub> là số tự nhiên và </sub><i><sub>x</sub></i><sub> là số thực được nhập vào từ bàn phím. Hãy so sánh</sub>
với thuật tốn trong Bài tập 8, Bài 7.
<i>Thuật toán</i>:
<i>Bước 1</i>. Đọc các giá trị <i>x </i>và <i>n</i>.
<i>Bước 2</i>. <i>A </i> 1, <i>k </i> 1.
<i>Bước 4</i>. <i>A </i>= <i>A</i>.<i>x</i>, <i>k </i><i>k </i>+ 1 và quay lại bước 3.
<i>Bước 5</i>. Thông báo kết quả là <i>A </i>và kết thúc thuật toán.
Chương trình Pascal:
<b>var n,k: integer;</b>
<b> A, LT: real;</b>
<b>begin</b>
<b>write(‘Nhap so A= ‘); readln(A);</b>
<b>write(‘Nhap so n= ‘); readln(n);</b>
<b>LT:=1; k:=1;</b>
<b>while k<=n do begin LT:=LT*A, k:=k+1 end</b>
<b>end.</b>
<b>8.</b> Tính tích của <i>N</i> số tự nhiên đầu tiên với số lần lặp không xác định (với <i>N</i> là số tự nhiên được
nhập vào từ bàn phím).
<i>Bước 1</i>. Đọc giá trị <i>N.</i>
<i>Bước 2</i>. <i>T </i> 1, <i>k </i> 1.
<i>Bước 3</i>. Nếu <i>k </i>≤ <i>N</i>, <i>T </i>= <i>T</i>.<i>k</i>; ngược lại, chuyển xuống bước 5.
<i>Bước 4</i>. <i>k </i><i>k </i>+ 1 và quay lại bước 3.
<i>Bước 5</i>. Kết thúc thuật toán.
<b>9.</b> Thuật toán:
<i>Bước 1</i>. Đọc giá trị <i>n.</i>
<i>Bước 3</i>. Nếu <i>i </i>> <i>n </i> 1, chuyển xuống bước 5.
<i>Bước 4</i>. Nếu <i>n </i>chia hết cho <i>i</i>, <i>S </i><i>S </i>+ <i>i</i>, <i>i </i><i>i </i>+ 1 và quay lại bước 3.
<i>Bước 5</i>. Ghi giá trị <i>S </i>và kết thúc thuật tốn.
Chương trình có thể như sau:
<b>var n,i,S: integer;</b>
<b>begin</b>
<b>write('Cho so tu nhien n= '); readln(n);</b>
<b>i:=2; S:=0;</b>
<b>while i<=n-1 do</b>
<b> begin</b>
<b> if (n mod i)=0 then S:=S+i; </b>
<b> i:=i+1;</b>
<b> end;</b>
<b>write('Tong cac uoc so thuc su cua ',n,' la: ',S);</b>
<b>readln;</b>
<b>end.</b>
<b>10.</b>Chương trình có thể như sau:
<b>Var A, sum: real;</b>
<b>i: integer;</b>
<b>Begin</b>
<b>Write('cho so A: '); readln(A);</b>
<b>i:=1; sum:= 0;</b>
<b>While (sum<=A) do</b>
<b>Begin</b>
<b>sum:= sum+1/i;</b>
<b>i:= i+1;</b>
<b>end;</b>
<b>Write('Gia tri N bang ', i:6);</b>
<b>Readln;</b>
<b>1.</b> “Có thể xem biến mảng là một biến được tạo từ nhiều biến có cùng kiểu, nhưng chỉ dưới một tên
duy nhất.” Phát biểu đó đúng hay sai?
<b>2.</b> Hãy nêu các lợi ích của việc sử dụng biến mảng trong chương trình.
<b>3.</b> Các khai báo biến mảng sau đây trong Pascal đúng hay sai:
<i>a)</i> <b>var X: Array[10,13] Of Integer;</b>
<i>b)</i> <b>var X: Array[5..10.5] Of Real;</b>
<i>c)</i> <b>var X: Array[3.4..4.8] Of Integer; </b>
<i>d)</i> <b>var X: Array[10..1] Of Integer; </b>
<i>e)</i> <b>var X: Array[4..10] Of Real;</b>
<b>4.</b> Câu lệnh khai báo mảng sau đây có được máy tính thực hiện khơng?
<b> var N: integer;</b>
<b> A: array[1..N] of real;</b>
<b>5.</b> Viết chương trình Pascal sử dụng mảng để nhập từ bàn phím các phần tử của một dãy số. Độ dài
của dãy cũng được nhập từ bàn phím.
<b>6.</b> Đoạn chương trình sau dùng để sắp xếp lại dãy số được ghi trong mảng <i>A</i>[<i>i</i>], <i>i</i> = 1,2,..., <i>N</i>, theo
thứ tự tăng dần:
<b>For i:=1 to N do</b>
<b>For j:=i to N do</b>
<b>If A[i] > A[j] then </b>
<b>Begin Tg:=A[i]; A[i]:=A[j]; A[j]:=Tg; End;</b>
Hãy kiểm tra tính đúng đắn của đoạn chương trình trên.
<b>7.</b> Hãy viết chương trình nhập 5 số ngn từ bàn phím và ghi ra màn hình số lớn nhất trong 5 số đó
theo hai cách: khơng sử dụng biến mảng và sử dụng biến mảng.
<b>8.</b> Viết chương trình sử dụng biến mảng để tính giá trị trung bình của tổng <i>N</i> số ngun được nhập
vào từ bàn phím.
<b>9.</b> Viết chương trình sử dụng biến mảng để nhập <i>n</i> số nguyên từ bàn phím và tính tổng các số
dương trong số các số đó (xem lại Bài tập 7<i>b</i>, Bài 5).
<b>10.</b>Trong Bài tập 9, em đã viết chương trình để tính tổng các ước số thực sự của một số nguyên,
nhưng chưa liệt kê được các ước số đó. Hãy viết chương trình sử dụng biến mảng để in các ước
số của số nguyên <i>n </i>(được nhập vào từ bàn phím).
<b>1.</b> Đúng.
<b>2.</b> Lợi ích chính của việc sử dụng biến mảng là rút gọn việc viết chương trình, có thể sử dụng câu
lệnh lặp để thay nhiều câu lệnh. Ngồi ra chúng ta cịn có thể lưu trữ và xử lí nhiều dữ liệu có nội
dung liên quan đến nhau một cách hiệu quả.
<b>4.</b> Không. Giá trị nhỏ nhất và lớn nhất của chỉ số mảng phải được xác định trong phần khai báo
chương trình.
<b>5.</b> Chương trình có thể như sau:
<b>uses crt;</b>
<b>var N, i: integer;</b>
<b> A: array[1..100] of real;</b>
<b>begin</b>
<b>clrscr;</b>
<b>write(’Nhap so phan tu cua mang, n= ’); readln(n);</b>
<b>for i:=1 to n do</b>
<b> begin</b>
<b> write(’Nhap gia tri ’,i,’cua mang, a[’,i,’]= ’);</b>
<b> read(a[i])</b>
<b> end;</b>
<b>end.</b>
<b>6.</b> Đúng.
<b>7.</b> <i>a</i>) Nếu không sửdụng biến mảng, chương trình có thể dài như sau:
<b>uses crt;</b>
<b>var So_1, So_2, So_3, So_4, So_5, Max: integer;</b>
<b>begin</b>
<b>clrscr;</b>
<b>write('Nhap so thu nhat: '); readln(So_1);</b>
<b>write('Nhap so thu hai: '); readln(So_2);</b>
<b>write('Nhap so thu ba: '); readln(So_3);</b>
<b>write('Nhap so thu tu: '); readln(So_4);</b>
<b>write('Nhap so thu nam: '); readln(So_5);</b>
<b>If Max<So_2 then Max:=So_2;</b>
<b>If Max<So_3 then Max:=So_3;</b>
<b>If Max<So_4 then Max:=So_4;</b>
<b>If Max<So_5 then Max:=So_5;</b>
<b>writeln('So lon nhat: ',Max);</b>
<b>end.</b>
<i>b</i>) Nếu sửdụng biến mảng, chương trình chỉ ngắn gọn như sau:
<b>uses crt;</b>
<b>var i, Max: integer;</b>
<b> A: array[1..5] of integer;</b>
<b>begin</b>
<b>clrscr;</b>
<b>for i:=1 to 5 do</b>
<b>Max:=a[1];</b>
<b>for i:=2 to 5 do If Max<a[i] then Max:=a[i];</b>
<b>writeln('So lon nhat: ',Max);</b>
<b>end.</b>
<i>Lưu ý</i>. Xem cách viết chương trình ngắn gọn hơn và khơng sử dụng biến mảng trong Bài tập 9,
Bài 7. Tuy nhiên, cách viết đó sẽ không cho kết quả mong muốn nếu sau khi nhập giá trị của các
<b>8.</b> Viết chương trình sử dụng biến mảng để tính giá trị trung bình của tổng <i>N</i> số nguyên được nhập
vào từ bàn phím.
<b>uses crt;</b>
<b>var N, i: integer;</b>
<b> TB: real;</b>
<b> A: array[1..100] of real;</b>
<b>begin</b>
<b>clrscr;</b>
<b>write(’Nhap so phan tu cua mang, n= ’); read(n);</b>
<b>for i:=1 to n do</b>
<b> begin </b>
<b> write(’Nhap gia tri ’,i,’cua mang, a[’,i,’]= ’);</b>
<b> readln(a[i])</b>
<b> end;</b>
<b>TB:=0;</b>
<b>for i:=1 to n do TB:=TB+a[i];</b>
<b>TB:=TB/n;</b>
<b>write(’Trung binh bang ’,TB);</b>
<b>9.</b> Chương trình nhập <i>n</i> số nguyên từ bàn phím và tính tổng các số dương:
<b>uses crt;</b>
<b>var n,k,S: integer;</b>
<b> </b> <b>X: array[1..1000] of integer;</b>
<b>begin</b>
<b>clrscr;</b>
<b>write('Nhap so tu nhien n: '); readln(n);</b>
<b>for k:=1 to n do</b>
<b> begin write('Nhap X[',k,']='); readln(X[k]) end;</b>
<b>S:=0;</b>
<b>for k:=1 to n do</b>
<b> if X[k]>0 then S:=S+X[k];</b>
<b>writeln('Tong cac duong S=',S);</b>
<b>readln;</b>
<b>10.</b>Nội dung Bài 2 của Bài thực hành 6 là viết chương trình nhận biết một số tự nhiên có phải là số
nguyên tố hay không. Nội dung của Bài tập 9, Bài 8, là viết chương trình tính tổng các ước số
thực sự của một số nguyên, nhưng chưa liệt kê được các ước số đó. Để có thể liệt kê, chương
trình cần phải ghi lại chúng. ý tưởng chính là sử dụng một biến mảng phục vụ cho điều này.
Chương trình tương tự như trong Bài tập 9, Bài 8:
<b>uses crt;</b>
<b>var n,i,k,S: integer;</b>
<b> X: array[1..10000] of integer;</b>
<b>begin</b>
<b>clrscr;</b>
<b>i:=2; S:=0;</b>
<b>for k:=1 to (n-1) do X[k]:=0; {Dat lai = 0}</b>
<b>write('Cho so tu nhien n>2: n= '); readln(n);</b>
<b>while i<=(n-1) do {Ghi lai uoc so vao X[i]}</b>
<b> begin if (n mod i)=0 then begin X[i]:=i; S:=S+X[i] end;</b>
<b> i:=i+1;</b>
<b> end;</b>
<b>writeln('Tong cac uoc so thuc su cua ',n,' la: ',S);</b>
<b>if S<>0 then begin write('Cac uoc so cua ',n,' la: ');</b>
<b>for i:=1 to (n-1) do if X[i]<>0 then write(X[i],' ') end</b>
<b>else writeln(n,' la so nguyen to.');</b>