Đề thi pascal học sinh giỏi lớp 9
You are viewing this post: Đề thi pascal học sinh giỏi lớp 9
Dưới đây là tổng hợp đề thi pascal học sinh giỏi lớp 9 mới nhất được cập nhập bởi An Vượng Villa. Mời các bạn tham khảo để làm tốt các bài tập pascal lớp 9 nhé.

I. Đề thi pascal học sinh giỏi lớp 9
II. Lời giải đề thi pascal lớp 9
Bài 1 đề pascal
PROGRAM dong_ho; USES crt; VAR n:LONGINT; f:TEXT; m:BYTE; BEGIN assign(f,'DONGHO_INP.txt'); reset(f); read(f,n); close(f); assign(f,'DONGHO_OUT.txt'); rewrite(f); IF abs(n)>1000000 THEN BEGIN write(f,'n=',n,' la qua lon'); close(f); exit; END; m:=1; IF n>=0 THEN BEGIN m:=n+m; WHILE m>12 DO m:=m-12; END ELSE BEGIN n:=n*-1; WHILE m<=n DO m:=m+12; m:=m-n; END; write(f,m); close(f); END.
Nhận xét: Thuật toán hơi dài nhưng viết theo ý hiểu -> OK
PROGRAM tim_so; USES crt; VAR n,i:WORD; f:TEXT; a:ARRAY[1..10000] OF INTEGER; num,max:INTEGER; ok:BOOLEAN; BEGIN assign(f,'TIMSO_INP.txt'); reset(f); readln(f,n); IF n<=10000 THEN FOR i:=1 TO n DO readln(f,a[i]); close(f); assign(f,'TIMSO_OUT.txt'); rewrite(f); {Rang buot du lieu} IF n>10000 THEN BEGIN writeln(f,'n is too large'); close(f); exit; END; FOR i:=1 TO n DO IF (a[i]<-32000) OR (a[i]>32000) THEN BEGIN write(f,'a[',i,'] is too large'); close(f); exit; END; max:=a[1]; {Tim so lon nhat} FOR i:=2 TO n DO IF max<a[i] THEN max:=a[i]; num:=a[1]; {Gan cho num gia tri be nhat} FOR i:=2 TO n DO IF num>a[i] THEN num:=a[i]; {Tim so lon nhi} FOR i:=1 TO n DO IF (num<a[i]) AND (a[i]<max) THEN num:=a[i]; {Xac dinh truong hop No solution} ok:=FALSE; FOR i:=1 TO n DO IF num<>a[i] THEN ok:=TRUE; IF ok THEN write(f,num) ELSE write(f,'No solution'); close(f); END.
Bài 2 đề pascal
Nhận xét bài số 2: Thuật toán của em đúng nhưng dài quá em có thể suy nghĩ theo những hướng sau để thuật toán ngắn lại hơn:
- Hướng 1: Sắp xếp dãy số từ lớn đến bé giả sử a[1] ; a[2] … . Nếu mảng có ít hơn 2 phần tử hoặc a[2] = a[1] thì No solution còn không thì a[2] là kết quả (Cách suy nghĩ này đơn giản có điều thuật toán phải mất công sắp xếp mảng – nếu dữ liệu nhỏ thì vẫn OK)
- Hướng 2: Em hoàn toàn có thể cải tiến vòng lặp tìm số lớn nhất để nó tìm được luôn số lớn nhì trong đó. Em hãy suy nghĩ để viết lại cho gọn hơn nhé.
PROGRAM so_nguyen_to_tuong_duong; USES crt; VAR f:TEXT; ok,yes:BOOLEAN; n,m,min,i:WORD; PROCEDURE NT(so:WORD); VAR i:WORD; BEGIN ok:=TRUE; FOR i:=2 TO so-1 DO IF so MOD i = 0 THEN ok:=FALSE; END; BEGIN assign(f,'NTTD_INP.txt'); reset(f); read(f,n); read(f,m); close(f); assign(f,'NTTD_OUT.txt'); rewrite(f); yes:=TRUE; IF n>m THEN min:=m ELSE min:=n; FOR i:=2 TO min DO BEGIN ok:=FALSE; IF (n MOD i = 0) OR (m MOD i = 0) THEN NT(i); IF ok THEN IF (n MOD i <> 0) OR (m MOD i <> 0) THEN yes:=FALSE; END; IF yes THEN write(f,'YES') ELSE write(f,'NO'); close(f); END.
Nhận xét bài số 2: Em làm sai những vấn đề sau:
- Chương trình con tìm số nguyên tố em chưa xử lí số 0, 1 vì vậy chương trình này vẫn cho 0, 1 là số nguyên tố em cần nhớ “số nguyên tố là số tự nhiên lớn hơn 1 và không có ước nào khác ngoài 1 và chính nó“. Có vẻ em thích dùng chương trình con PROCEDURE thầy thì lại thích dùng FUNCTION trong những trường hợp này (Nhưng không sao tùy sở trường của em). Với thuật toán kiểm tra số n có phải là số nguyên tố không em cũng chỉ cần kiểm tra xem nó có ước nhỏ hơn hoặc bằng căn bậc hai của n thôi bởi nếu n có ước lớn hơn căn bậc hai của n thì cũng có ước nhỏ hơn căn bậc hai của n
- Phần chương trình đoạn xử lí của em rất hay tuy nhiên có lẽ em hiểu chưa đúng, em cần nhớ định nghĩa người ta đưa ra: “Hai số tự nhiên được gọi là Nguyên tố tương đương nếu chúng có chung các ước số nguyên tố” Em đưa vào biến Min = Min(m,n) là chương trình sẽ xử lí sai những trường hợp một trong hai số có ước nguyên tố lớn hơn số kia – em hãy suy nghĩ thật kĩ câu này nhé.
- Một vài VD chương trình sẽ sai (1; 3) ; (5 ; 35) những cặp này không nguyên tố tương đương nhưng chương trình của em chắc chắn sẽ báo YES.
Hướng khắc phục:
- Xử lí trường hợp nhỏ hơn 2 trong chương trình con kiểm tra số nguyên tố
- Có thể thay Min = Min(m,n) bằng Max = Max(m,n) chương trình sẽ đúng
III. Một số dạng bài tập pascal thi học sinh giỏi
Đề pascal
Bài 1. (6.0 điểm)
Cho hai số A và B là hai số nguyên dương và A phải nhỏ hơn B (0 < A, B < 100).
Yêu cầu: Viết chương trình cho phép nhập hai số A và B đó từ bàn phím.
Hãy thực hiện:
a) Tìm các số nguyên tố từ A đến B.
b) Tìm ước chung lớn nhất của A và B.
Ví dụ:
Nhập từ bàn phím |
Kết quả |
-Nhap A: 10
-Nhap B: 25 |
-Cac so nguyen to:
11 13 17 19 23 -Uoc chung lon nhat la: 5 |
Bài 2. (6.0 điểm)
Việc bảo vệ máy tính để hạn chế người khác thâm nhập là một vấn đề đặt ra cho mọi nguời sử dụng máy tính. Để tăng tính an toàn trong lưu trữ, một nguời đã quyết định giấu mật khẩu truy cập máy tính của mình vào một xâu S với một qui ước sao cho khi cần anh ta có thể lấy lại được mật khẩu từ S. Là một người yêu thích số học anh ta chọn mật khẩu P là một số tự nhiên và mã hóa P = P1 + P2 + … +Pi với (Pi là số nguyên, 0<=Pi<=9, 0<i<200) đem dấu các số Pi vào một xâu ký tự S.
Chẳng hạn xâu S=’mat #223 ma 678 @’ chứa mật khẩu là 28 vì P=2+2+3+6+7+8
Yêu cầu: Cho một xâu ký tự S chiều dài không quá 255 ký tự. Viết chương trình tìm mật khẩu P đã dấu trong xâu S biết P có giá trị nhỏ hơn 1000.
Ví dụ:
Nhập từ bàn phím |
Kết quả |
Nhap xau S: thihoc5sinhgioi3huyen65 | P = 19 |
Bài 3. (8.0 điểm)
Tại một văn phòng của Ủy ban nhân dân tỉnh có M người nộp hồ sơ, theo thứ tự bắt số từ 1 đến M. Tùy theo loại hồ sơ mà người ta xử lí trong thời gian nào đó của người thứ i là ti (i=1..M).
Yêu cầu: Viết chương trình nhập vào số nguyên dương M (0<M<=100) và dãy số nguyên dương t1, t2, …, tn (1<=ti<=10; i=1..M) theo thứ tự là số người nộp hồ sơ và thời gian xử lí hồ sơ. Hãy tính thời gian (phút) chờ của người thứ K (K=1..M) và chở bao nhiêu người để đến lượt mình.
Ví dụ:
Nhập từ bàn phím |
Kết quả |
-Nhap so nguoi nop ho so M = 5
-Nhap thoi gian tung nguoi cho: 2 3 2 5 6 -Nhap nguoi thu k = 4 |
-Nguoi thu 4 phai cho 3 nguoi nua
-Thoi gian cho la 7 phut |
Hướng dẫn giải
Bài 1. (6.0 điểm)
Cho hai số A và B là hai số nguyên dương và A phải nhỏ hơn B (0 < A, B < 100).
Yêu cầu: Viết chương trình cho phép nhập hai số A và B đó từ bàn phím.
Hãy thực hiện:
a) Tìm các số nguyên tố từ A đến B.
b) Tìm ước chung lớn nhất của A và B.
Chương trình:
Program Bai1;
Uses crt; Var A,B,i,r: integer; |
0,5 điểm |
Function ngto(n: integer): boolean;
Var i: integer; Begin Ngto:=false; If n<2 then exit; For i:=2 to trunc(sqrt(n)) do If n mod i = 0 then exit; Ngto:=true; End; |
1,5 điểm |
Begin
Clrscr; Write(‘Nhap A = ‘); Readln(A); Write(‘Nhap B = ‘); Readln(B);
|
0,5 điểm |
Writeln(‘-Cac so nguyen to: ‘);
For i:=A to B do If ngto(i) then write(i,’ ‘); |
1,0 điểm |
While B<>0 do
Begin r:=A mod B; A:=B; B:=r; End; Writeln(‘Uoc chung lon nhat la: ‘,A); End. |
1,5 điểm |
Bộ test thử đúng: 1,0 điểm
Nhập từ bàn phím |
Kết quả |
-Nhap A: 48
-Nhap B: 72 |
-Cac so nguyen to:
53 59 61 67 71 -Uoc chung lon nhat la: 24 |
Bài 2. (6.0 điểm)
Việc bảo vệ máy tính để hạn chế người khác thâm nhập là một vấn đề đặt ra cho mọi nguời sử dụng máy tính. Để tăng tính an toàn trong lưu trữ, một nguời đã quyết định giấu mật khẩu truy cập máy tính của mình vào một xâu S với một qui ước sao cho khi cần anh ta có thể lấy lại được mật khẩu từ S. Là một người yêu thích số học anh ta chọn mật khẩu P là một số tự nhiên và mã hóa P = P1 + P2 + … +Pi với (Pi là số nguyên, 0<=Pi<=9, 0<i<200) đem dấu các số Pi vào một xâu ký tự S.
Chẳng hạn xâu S=’mat #223 ma 678 @’ chứa mật khẩu là 28 vì P=2+2+3+6+7+8
Yêu cầu: Cho một xâu ký tự S chiều dài không quá 255 ký tự. Viết chương trình tìm mật khẩu P đã dấu trong xâu S biết P có giá trị nhỏ hơn 1000.
Chương trình:
Program Bai2;
Uses crt; Var S: string; i, j, P: integer; |
0,5 điểm |
Begin
Clrscr; Write(‘Nhap xau S: ‘); Readln(S); |
0,5 điểm |
i:=1;
P:=0; While i<=length(S) do If S[i] in [‘0’..’9’] then Begin Val(s[i],j); P:=P+j; End; |
2,5 điểm |
Writeln(‘P = ‘,P);
End. |
0,5 điểm |
Bộ test thử đúng mỗi bộ: 1,0 điểm
Nhập từ bàn phím |
Kết quả |
Nhap xau S: ki2thichon5hoc5sinhgioi3cap61huyen65 | P = 33 |
Nhap xau S: tinhoc5that65thu1vi5 | P = 22 |
Bài 3. (8.0 điểm)
Tại một văn phòng của Ủy ban nhân dân tỉnh có M người nộp hồ sơ, theo thứ tự bắt số từ 1 đến M. Tùy theo loại hồ sơ mà người ta xử lí trong thời gian nào đó của người thứ i là ti (i=1..M).
Yêu cầu: Viết chương trình nhập vào số nguyên dương M (0<M<=100) và dãy số nguyên dương t1, t2, …, tn (1<=ti<=10; i=1..M) theo thứ tự là số người nộp hồ sơ và thời gian xử lí hồ sơ. Hãy tính thời gian (phút) chờ của người thứ K (K=1..M) và chở bao nhiêu người để đến lượt mình.
Chương trình:
Program Bai3;
Uses crt; Var M, i, K, t: integer; A: array[1..1000] of integer ; |
1,0 điểm |
Begin
Clrscr; Write(‘-Nhap so nguoi nop ho so M = ‘); Readln(M); Writeln(‘-Nhap thoi gian tung nguoi cho: ‘); For i:=1 to M do read(a[i]); Write(‘-Nhap nguoi thu K = ‘); Readln(K); |
1,0 điểm |
T:=0;
For i:=1 to K-1 do t:=t+a[i]; |
2,0 điểm |
Writeln(‘Nguoi thu ‘,K,’ phai cho ‘,K-1,’ nguoi nua’);
Writeln(‘Thoi gian cho la ‘,t,’ phut); End; |
1,0 điểm |
V. Video hướng dẫn đề thi pascal nâng cao
The article is compiled and aggregated from many sources by An Vượng Villa.
See more articles in the same category here: Tin Học