BàitậpTin8 (SBT) Bài 8: Lệnh lặp While . Do 8.6. Hãy viết các câu lệnh Pascal yêu cầu ngời sử dụng nhập một số thực nằm trong khoảng từ 1 đến 10 và yêu cầu nhập lại nếu số không thoả mãn. 8.8. Hãy viết chơng trình thực hiện các nhiệm vụ sau đây: a. Nhập từ bàn phím một số nguyên n biểu diễn sĩ số của một lớp (1<=n<=45). Khi ngời sử dụng nhập một số nguyên ngoài khoảng này, chơng trình cảnh báo và yêu cầu nhập lại. Chơng trình chỉ kết thúc khi một số hợp lệ đợc nhập. b. Nhập vào từ bàn phím một số thực x, biểu diễn điểm của học sinh (0<=x<=10) và đợc làm tròn đến một phần t điểm. Ví dụ, các số nhập vào hợp lệ là 7.25, 6.5, 9.0, 8.75. Chơng trình cảnh báo khi số nhập vào không hợp lệ và yêu cầu nhập lại. Chơng trình chỉ kết thúc khi một số hợp lệ đợc nhập. 8.9. Viết chơng trình để ngời sử dụng nhập một số khác 0 rồi tính và in ra màn hình tổng các nghịch đảo của các số này. Chơng trình kết thúc khi ngời sử dụng nhập số 0 đầu tiên (nghịch đảo của số n là 1/n) 8.10. Trong bàitập 7.6 chúng ta đã xét bài toán gửi tiết kiệm với số tiền ban đầu là a (triệu đồng), lãi suất k% với chu kì tính lãi là c tháng (nghĩa là cứ sau c tháng thì lãi suất đợc tính và đợc cộng vào số tiền gốc để tính lãi cho c tháng tiếp theo; trờng hopự c bằng 1 là lãi suất hàng tháng) và viết chơng trình tính số tiền ngời đó rút đợc sau khoảng thời gian t (tháng). Chúng ta xét bài toán ngợc nh sau: a. Hãy viết chơng trình cho biết ngời đó phải gửi bao nhiêu tháng để thu đợc tổng số tiền cả gốc và lãi không ít hơn b (triệu đồng) b. Nhập chơng trình vào máy tính để chạy và lu tệp chơng trình với tên BT8_10.pas 8.12. Viết chơng trình sử dụng câu lệnh lặp while . do để tính tổng n S 1 . 3 1 2 1 1 ++++= với n 1 , giá trị là sai số cho trớc và đợc nhập vào từ bàn phím. 8.13. Viết chơng trình trò chơi Thử vận may theo mô tả nh sau: - Đầu tiên máy tính sinh ra một số ngẫu nhiên n để biểu diễn số lợt chơi (sử dụng hàm random()) - ở mỗi lợt chơi máy tính sẽ sinh ra một số ngẫu nhiên. Trớc khi thông báo số này, ngời chơi sẽ đoán đó là số chẵn (bằng cách nhập số 0) hay số lẻ (bằng cách nhập số 1) - Kết thúc n lợt chơi, máy tính sẽ thông báo tổng số lần đoán đúng và tỉ lệ đoán đúng của ngời chơi và thông báo về sự may mắn của ngời chơi. Nếu tỉ lệ đoán đúng là: + Từ 80% trở lên thì thông báo rất may mắn; + Từ 65% đến dới 80% thì thông báo may mắn; 1 + Từ 50% đến dới 65% thì thông báo bình thờng; + Dới 50% thì thông báo không may mắn; 8.14. Hãy xem quy luật sinh sản của loài thỏ ở bài 7.14 a. Viết chơng trình cho biết sau khoảng thời gian là bao nhiêu tháng thì ta có một đàn thỏ không ít hơn m cặp thỏ từ một cặp thỏ bố mẹ ở tháng đầu tiên. m là số nguyên dơng nhập từ bàn phím nằm trong khoảng từ 1 đến 10000. Giả sử không tính đến các nguyên nhân làm cho thỏ chết, nh già, yếu, bệnh tật hoặc bị con thú khác ăn thịt. b. Nhập chơng trình vào máy tính và lu với tên tệp là BT8_14.pas. Hãy chạy ch- ơng trình và cho biết kết quả với các dữ liệu thử m=500, 1000, 2000, 5000, 10000. 8.15. Sử dụng câu lệnh lặp while . do, viết lại thuật toán và chơng trình để nhập số tự nhiên đầu tiên n và tính tổng các ớc số thực sự của n. 8.16. Ước số chung lớn nhất của hai số nguyên dơng a và b, kí hiệu là UCLN(a,b), có thể đợc tính bằng một trong hai thuật toán sau đây: a. Thuật toán trừ liên tiếp: Xét hai số ban đầu a và b, ta lấy số lớn hơn trừ đi số nhỏ hơn. Sau đó lại xét hai số là số nhỏ hơn và hiệu vừa tìm đợc . Tiếp tục quá trình đó cho đến khi nhận đợc hai số bằng nhau, đó chính là UCLN(a,b). INPUT: a, b là hai số nguyên dơng. OUTPUT: UCLN(a, b) B1: Nhập a, b>0 B2: Nếu a = b, chuyển tới bớc 5. B3: Nếu a>b, gán a=a-b; Ngợc lại, gán b = b-a B4: Quay lại bớc 2 B5: In ra a (a là UCLN(a,b)) B6: Kết thúc thuật toán. b. Thuật toán chia liên tiếp: Xét hai số ban đầu a, b. Tính r là số d của phép chia a cho b. Nếu số d r khác 0 thì xét cặp số a (bằng b), b (bằng r), . Kết thúc quá trình lặp (r=0), b chính là UCLN(a,b) INPUT: a, b là hai số nguyên dơng. OUTPUT: UCLN(a, b) B1: Nhập a, b>0 B2: gán r = a mod b B3: Nếu r khác 0, gán a = b, gán b = r. B4: In ra b (b chính là UCLN(a,b)) B5: Kết thúc thuật toán. 1/ Hãy kiểm tra lại hai thuật toán với cùng số bộ dữ liệu thử và cho biết trong hai thuật toán nói trên, thuật toán nào cho kết quả nhanh hơn (tức là thực hiện với số lần lặp ít hơn) 2 2/ Hãy viết chơng trình Pascal tính UCLN(a,b) bằng thuật toán em thích hoặc thấy dễ hiểu hơn trong hai thuật toán nói trên và lu tệp chơng trình với tên BT8_16.pas 8.17. Mặc dù ngôn ngữ lập trình Pascal không có kiểu dữ liệu phân số, nhng ta vẫn có cách để nhập phân số, in ra màn hình và thực hiện các phép tính trên phân số. Trong bàitập này ta chỉ xét đến phép cộng phân số. - Việc nhập một phân số a/b với b khác 0 đợc thực hiện bằng cách nhập riêng tử số a và mẫu số b. - Phân số a/b đợc in ra màn hình dới dạng a/b bằng lệnh: write(a, / , b) hoặc lệnh writeln(a, / , b) - Phép cộng hai phân số a/b và c/d (b,d khác 0) cho kết quả là phân số m/n, trong đó m = ad + bc và n = bd. lu ý, phân số m/n có thể là phân số cha tối giản. Để tìm phân số tối giản p/q của phân số m/n, ta chỉ việc chia tử số và mẫu số của nó cho ớc chung lớn nhất của m và n (xem thuật toán tìm UCLN trong bài 8.16). a. Hãy viết chơng trình Pascal làm các nhiệm vụ sau: - Nhập từ bàn phím hai phân số a/b và c/d. Để đơn giản ta giả thiết a, b, c, d đều nguyên dơng và việc nhập là đúng đắn, không cần kiểm tra bằng chơng trình. - Tính phân số p/q = a/b + c/d, tối giản p/q và in p/q lên màn hình. b. Nhập thử chơng trình trên vào máy tính và lu với tên BT8_17.pas. Chạy thử chơng trình với dữ liệu là một số cặp phân số. 8.18. Ngời ta đã chứng minh rằng các tổng T n : 1 1 . 3 1 2 1 1 . 4 1 3 1 2 1 1 3 1 2 1 1 2 1 1 3 2 1 + ++++= +++= ++= += n T T T T n luôn 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 một số thực A và tìm số tự nhiên nhỏ nhất N sao cho A N T n >++++= 1 . 3 1 2 1 1 Bài 9: Làm việc với dãy số (mảng) 9.2. Viết chơng trình để sử dụng biến mảng để tính giá trị trung bình của N số nguyên đợc nhập vào từ bàn phím. 3 9.4. Điểm kiểm tra môn Tin học của n học sinh lớp 8A đợc khai báo nh là mảng a trong bàitập 9.3. Để in ra màn hình điểm của n học sinh trong lớp, có hai cách: - Cách 1: In ra một dãy điểm theo hàng, khi hết độ rộng màn hình thì tự động xuống dòng. - Cách 2: In ra thành một cột điểm, mỗi điểm in trên một dòng. Hãy viết hai đoạn chơng trình tơng ứng với 2 cách thực hiện nói trên. 9.5. Điểm kiểm tra môn Tin học của n học sinh lớp 8B đợc biểu diễn bởi mảng a nh trong mô tả bài 9.3. Các chỉ số của các phần tử trong mảng a đồng thời cũng là số thứ tự của các học sinh trong danh sách lớp (thay cho tên học sinh). Để in ra màn hình số thứ tự của các học sinh đạt điểm cao nhất lớp, bạn Thành đã viết đoạn chơng trình Pascal sau đây: max:=0; for i:=1 to n do if max<a[i] then begin max:=a[i]; writeln(STT cua HS co diem cao nhat la:, i); end; Tuy nhiên khi chạy thử chơng trình Thành thấy rằng đoạn chơng trình trên không cho kết quả đúng. Em hãy giải thích tại sao và viết lại đoạn chơng trình đó cho đúng. 9.6. Kết hợp các kết quả trong bài 9.3, 9.4, 9.5 hãy viết chơng trình Pascal thực hiện các nhiệm vụ sau đây: a, Nhập vào từ bàn phím điểm kiểm tra môn Toán của n học sinh trong một lớp (n<=50) b. In ra màn hình số thứ tự của các học sinh đạt điểm cao nhất, với quy ớc STT của dãy điểm đã nhập chính là số thứ tự của học sinh (thay cho tên) c. In ra màn hình số lợng và tỷ lệ học sinh đạt điểm giỏi (>=8.0) d. In ra màn hình số lợng và tỷ lệ học sinh đạt điểm dới 5. 9.8. Bạn Phan dùng 3 biến mảng, lần lợt biểu diễn cớc phí điện thoại, điện, dịch vụ Internet của gia đình mình trong 12 tháng năm vừa qua. a/ Viết chơng trình Pascal thực hiện các nhiệm vụ sau đây: - Nhập số tiền chi cho 3 dịch vụ từng tháng từ bàn phím. - Tính và in ra màn hình tổng số tiền mà gia đình bạn Phan phải trả cho các dịch vụ này trong năm vừa qua. - Hãy cho biết dịch vụ nào có tổng chi lớn nhất? - Cho biết trung bình mỗi tháng gia đình Phan phải trả bao nhiêu cho các dịch vụ nói trên. 4 b. Nhập chơng trình vào máy tính để chạy thử, lu chơng trình lên đĩa với tên tệp BT9_8.pas. 9.9. Cho một dãy số gồm n số thực và một số thực x. Viết chơng trình nhập n số thực đó và đếm xem có bao nhiêu số trong dãy không lớn hơn x. 9.10. Nhập vào từ bàn phím một dãy số nguyên không âm. Hãy in ra màn hình chỉ số i nhỏ nhất sao cho tổng các phần tử từ 1 đến i lớn hơn 100. 9.11. Viết chơng trình Pascal tính giá trị của đa thức: P(x) = a 0 + a 1 x + a 2 x 2 + .+ a n x n có các hệ số cho trong một mảng số thực. Bậc n của đa thức và mảng hệ số a 0 , a 1 , a 2 , ., a n đợc nhập từ bàn phím. Gợi ý: Sử dụng công thức sau (gọi là công thức Hooc nơ): P(x) = a 0 + x(a 1 + x(a 2 + .+ x(a n-1 +a n x) .) 9.12. Đoạn chơng trình đựơc dùng để sắp xếp lại dãy số đợc ghi trong mảng n phần tử, theo thứ tự tăng dần: for i:=1 to n do for j:=i to n do if a[i]>a[j] then begin tg:=a[i]; a[i]:=a[j]; a[j]:=tg; end; Hãy kiểm tra việc thực hiện chơng trình trên với một số bộ dữ liệu cụ thể. 9.13. Viết chơng trình chèn thêm một số nguyên vào một dãy số nguyên đã đợc sắp xếp theo thứ tự tăng dần sao cho dãy số bảo toàn đợc thứ tự sắp xếp của nó. Dãy số, số các số hạng và số nguyên cần chèn đợc nhập từ bàn phím. 9.14. Cho một dãy n số đợc nhập vào đầu 1 mảng gồm 100 phần tử (n<100). Hãy viết đoạn chơng trình nhập dãy số vào mảng và các đoạn chơng trình thực hiện các công việc tơng ứng sau: - Nhập một số và thêm nó vào vị trí cuối của dãy. - Nhập một số và chèn nó vào vị trí đầu tiên của dãy số (đẩy các phần tử về sau một vị trí) - Nhập một số và chèn nó vào vị trí k sao cho dãy con từ 1 đến k là dãy số không giảm. 9.15. a, Hãy viết chơng trình Pascal để thực hiện nhiệm vụ sau đây: - Nhập vào từ bàn phím một dãy không quá 30 số nguyên 5 - Kiểm tra rồi cho biết dãy số vừa nhập có phải là một dãy số nguyên không giảm hay không. Ví dụ dãy 3, 4, 4, 5, 5, 8 là một dãy không giảm. b, Lu chơng trình với tên BT9_15.pas. Chạy thử chơng trình với các dãy số khác nhau. 9.16. Trong bàitập này em sẽ làm quen với mảng có các phần tử là kiểu xâu. Cách khai báo và sử dụng mảng kiểu xâu cũng giống nh mảng kiểu số, nhng chúng không thể thực hiện đợc các phép toán số học trên các phần tử của mảng. Cửa hàng của mẹ Tuấn có n mặt hàng (1<=n<=40), tên các mặt hàng đợc biểu diễn bởi mảng sau đây: ten:array[1 40] of string; Đơn giá các mặt hàng đợc biểu diễn bởi mảng sau đây: dongia: array[1 40] of integer; Em hãy giúp Tuấn viết chơng trình thực hiện các công việc sau đây: a, Nhập tên và đơn giá của n mặt hàng từ bàn phím. b, Tính và in ra màn hình đơn giá trung bình của tất cả các mặt hàng. c, Tìm và in ra màn hình tên các mặt hàng có đơn giá không nhỏ hơn đơn giá trung bình. d, Nhập chơng trình vào máy tính để chạy thử và lu chơng trình với tên BT99_16.pas 9.17. Viết chơng trình mô phỏng bảng điểm của lớp em. Bảng điểm gồm các cột sau đây: Số thứ tự, Họ và tên, Điểm toán và Điểm văn. Chơng trình sẽ giúp thực hiện các công việc sau: - Nhập sĩ số của lớp (<=50) - Nhập Họ và tên, Điểm toán và Điểm văn của từng bạn trong lớp. Số thứ tự sẽ đ- ợc tự động tạo ra và in ra màn hình. Khi nhập điểm của một bạn, chơng trình in ra màn hình số thứ tự và họ tên đã nhập dới dạng một bảng để theo dõi. - Tạo bảng điểm với 4 cột, mỗi hàng là số thứ tự, họ và tên và điểm tơng ứng của một bạn. - In ra màn hình điểm trung bình của cả lớp theo từng môn học. 6 . Bài tập Tin 8 (SBT) Bài 8: Lệnh lặp While . Do 8. 6. Hãy viết các câu lệnh Pascal yêu cầu ngời sử dụng. chơng trình trên vào máy tính và lu với tên BT8_17.pas. Chạy thử chơng trình với dữ liệu là một số cặp phân số. 8. 18. Ngời ta đã chứng minh rằng các tổng T