Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN BÀI TẬP CƠ BẢN - Đáp án ++ 1. Viết chương trình tính điểm trung bình 3 môn Toán, Lý , Hoá theo hệ số 2,1,1 sau đó xếp loại như sau: a. Loại Giỏi : ĐTB >= 8.0 và không có môn nào dưới 6,5 b. Loại Khá : 6.5=<ĐTB < 8.0 và không có môn nào dưới 5 c. Loại Trung bình : 5.0 =<ĐTB < 6.5 và không có môn nào dưới 3.5 d. Loại Yếu : Còn lại. program xep_loai_hoc_sinh; uses crt; var t,l,h,tbc, min:real; xl:string; begin write('moi nhap diem toan,ly,hoa: '); readln(t,l,h); min:=l; if min>t then min:=t; if min>h then min:=h; tbc:=(t*2+l+h)/4; if (tbc>=8) and (min>=6.5) then xl:='Gioi'; else if (tbc>=6.5) and (min>=5) then xl:=’Kha’; else if (tbc>=5) and (min>=3.5) then xl:='Trung binh' else xl:='yeu'; writeln(‘Diem trung binh:’,tbc:0:1,’ Xep loai:’,xl); readln; end. 2. VCT nhập vào tháng, năm và cho biết tháng đó có bao nhiêu ngày? var n,t,ngay:integer; begin write('nhap thang:');readln(t); write('nhap nam:');readln(n); case t of 1,3,5,7,8,10,12: ngay:=31; 4,6,9,11:ngay:=30; 2: if n mod 4 = 0 then ngay :=29 else ngay:=28; end; writeln('Thang:',t,' nam:',n,' co: ',ngay,' ngay'); readln; end. 3. VCT tìm ước chung lớn nhất và bội chung nhỏ nhất của hai số nhập vào từ bàn phím? var a,b,min,max,ucln:integer; begin write('moi nhap hai so can xac dinh: '); readln(a,b); max:=a; min:=b; if max mod min=0 then ucln:=min else if min mod max=0 then ucln:=max else begin repeat if max>min then max:=max-min else if max<min then min:=min-max; until max=min; ucln:=min; end; write('ucln ',ucln); write('bcnn ',a*b/ucln:1:1); Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN readln; end. 4. VCT giải hai bài toán cổ: 100 trâu 100 bó cỏ và vừa gà vừa chó 36 con 100 chân? var d,n,g:integer; begin for d:=1 to 20 do for n:=1 to 33 do for g:=1 to 98 do if d*5+n*3+g=100 then writeln('Trau dung:',d,' trau nam:',n,' trau gia:',g); readln; end. var i,j:integer; begin for i:=1 to 25 do for j:=1 to 50 do if (i*4+j*2=100) and (i+j=36) then writeln(i,' con cho, ',j,' con ga.'); readln; end. 5. VCT xuất các số nguyên tố từ n đến m.(Dùng chương trình con)? var j,n,m,i:integer; function ktranto(x:integer):boolean; begin ktranto:=true; for i:=2 to x -1 do if x mod i=0 then ktranto:=false; end; begin write('moi nhap n,m: '); readln(n,m); for j:=n to m do if ktranto(j) then writeln(j); readln; end. 6. VCT xuất các số hoàn hảo từ n đến m.(Dùng chương trình con)? var x,tu,j,i,n,m:integer; function ktrahhao(x:integer):boolean; begin tu:=0; ktrahhao:=false; for i:=1 to x div 2 do if x mod i=0 then tu:=i+tu; if tu=x then ktrahhao:=true; end; begin; write('moi nhap n,m: '); readln(n,m); for j:=n to m do if ktrahhao(j) then writeln(j); readln; end. 7. VCT tạo một mảng số nguyên gồm n phần tử nhỏ hơn 1000. Sắp xếp mảng theo tứ tự tăng dần và giảm dần. const n=10; var i,j,tam:integer; a:array[1 n]of integer; begin randomize; for i:=1 to n do a[i]:=random(1000); Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN for i:=1 to n-1 do for j:=i+1 to n do if a[i]<a[j] then begin tam:=a[i]; a[i]:=a[j]; a[j]:=tam; end; for i:=1 to n do writeln(a[i]); readln; end. 8. VCT đọc một số có 3 chữ số nhập vào từ bàn phím? uses crt; Var s:array[1 9] of string; a,b,c,n:integer; begin clrscr; repeat write('nhap so nguyen n:');readln(n); until (n>99)and(n<1000); a:=n div 100; b:=n div 10 mod 10 ; c:=n mod 10; s[1]:='mot'; s[2]:='hai'; s[3]:='ba'; s[4]:='bon'; s[5]:='nam'; s[6]:='sau'; s[7]:='bay'; s[8]:='tam'; s[9]:='chin'; if (b=0)and(c=0) then write(s[a],'tram'); if (b=0)and(c<>0)then write(s[a],'tram linh',s[c]); if (b<>0)and (c=0)then write(s[a],'tram',s[b],'muoi'); if (b<>0)and(c=5)then write(s[a],'tram',s[b],'lam'); if (b<>0)and(c<>0)and(c<>5)then write(s[a],'tram',s[b],'muoi',s[c]); readln; end. 9. VCT sửa danh từ riêng bò nhập sai. (VD: TraN QuANG kHai Tran Quang Khai) uses crt; var s:string; i:integer; begin write('nhap mot danh tu rieng:');readln(s); while s[1]=#32 do delete(s,1,1); while s[length(s)]=#32 do delete(s,length(s),1); while pos(#32#32,s)<>0 do delete(s,pos(#32#32,s),1); for i:=1 to length(s) do if (s[i]>=' A')AND(s[i]<='Z')then s[i]:=chr(ord(s[i])+32) ; s[1]:=upcase(s[1]); for i:=1 to length(s) do if s[i]=#32then s[i+1]:=upcase (s[i+1]); write('danh tu duoc sua lai la:',s); readln; end. 10. VCT in ngược các từ của một xâu, mỗi từ in ra trên một dòng và xuất ra số ký tự của mỗi từ? ( vd: Tran Quang Khai Khai : 4 ký tự Quang : 5 ký tự Tran : 4 ký tự uses crt; var s,s1,s2,t:string; Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN a:array[1 100] of string; b:array[1 100] of integer; i,j,k:integer; begin clrscr; write(' Nhap xau s:');readln(s); s:=s+' '; for i:= 1 to length(s) do if s[i]<>#32 then t:=t+s[i] else begin inc(j); a[j]:=t; t:=''; end; for i:=1 to j do b[i]:=length(a[i]); for k:=i downto 1 do writeln(a[k]:20,' :',b[k]:4,' ky tu'); readln; end. 11. VCT tách một xâu S ra thành 4 xâu: S1: chứa các chữ cái in HOA, S2: chứa các chữ cái thường; S3 chứa các số 09; S4 chứa các ký tự khác( :;><?/’”!@#$%^&* ) uses crt; var hoa,thuong,so:set of char; s,s1,s2,s3,s4:string; i:integer ; begin clrscr; write('nhap xau s:');readln(s); hoa:=['A' 'Z']; thuong:=['a' 'z']; so:=['0' '9']; for i:=1 to length(s) do if s[i] in hoa then s1:=s1+s[i] else if s[i] in thuong then s2:=s2+s[i] else if s[i] in so then s3:=s3+s[i] else s4:=s4+s[i]; writeln(s1:6); writeln(s2:6); writeln(s3:6); writeln(s4:6); readln; end. 12. VCT làm thay đổi chức năng phím CAPLOCK, khi tắt caplock ta gõ chữ cái thì xuất hiện chữ cái hoa, ngựơc lại khi bật đèn caplock ta gõ chữ cái thì xuất hiện chữ cái thường uses crt; var hoa,thuong:string; ch,t,h:char; Begin clrscr; for t:='a'to'z'do thuong:=thuong+t; for h:='A'to'Z'do hoa:=hoa+h; repeat ch:=readkey; if pos(ch,thuong)<>0 then ch:=upcase(ch) else if pos(ch,hoa)<>0 then ch:=chr(ord(ch)+32); write(ch); until ch=#13; end. 13. VCT nhập các kí tự từ bàn phím không cho hiện ký tự này lên mà chỉ hiện các dấu ‘*’ như kiểu mật khẩu. Hỏi có hiện mật khẩu không nếu có thì xuất mật khẩu vừa nhập ra. uses crt; Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN var s:string; ch,tl:char; Begin clrscr; write('Nhap mat khau:'); repeat ch:=readkey; write('*'); s:=s+ch; until ch=#13; writeln; write('Co hien mat khau khong(c/k):');readln(tl); if upcase(tl)='C' then write(' Mat khau la:',s); readln; end. 14. VCT đổi một số <4000 ra số La Mã ( L :50; C:100; D:500; M:1000 - vd:2364 MMCCDLXIV) var a,x,y,w,z:integer; n: array [0 3] of string; t: array [0 9] of string; c: array [0 9] of string; d: array [0 9] of string; begin n[1]:='C';n[2]:='CC';n[3]:='CCC'; t[1]:='M';t[2]:='MM';t[3]:='MMM';t[4]:='MD'; t[5]:='D';t[6]:='DM';t[7]:='DMM';t[8]:='DMMM';t[9]:='MC'; c[1]:='X';c[2]:='XX';c[3]:='XXX';c[4]:='XL'; c[5]:='L';c[6]:='LX';c[7]:='LXX';c[8]:='LXXX';c[1]:='XM'; d[1]:='I';d[2]:='II';d[3]:='III';d[4]:='IV'; d[5]:='V';d[6]:='VI';d[7]:='VII';d[8]:='VIII';d[1]:='IX'; {I$-} repeat write('moi nhap so: '); readln(a); until (a<4000) and (IOResult=0); {I$+} x:=a div 1000; y:=a mod 1000 div 100; w:=a mod 100 div 10; z:=a mod 10; write(n[x],t[y],c[w],d[z]); readln; end. 15. Viết chương trình điều chỉnh một số nguyên bò nhập sai từ bàn phím. Sau đó sẽ cho biết số nhập sai và số đã sửa nếu người sử dụng yêu cầu. Ví dụ: số nhập sai là: 23hdj43jj, chương trình sẽ sửa lại là:2343 var s,s1:string; i,j:integer; so:set of char; tloi:char; begin readln(s); so:=['0' '9']; for i :=1 to length(s) do if s[i]in so then s1:=s1+s[i]; write('Co hien so khong (c/k)');readln(tloi); if upcase(tloi)<>'C' then write('Tam biet') else if length(s1)<length(s)then write('Ban nhap so sai: ',s,' sua lai la: ',s1) else write('Ban nhap so chinh xac:',s);readln; end. 16. Nhập một xâu s bao gồm số và kí tự, in ra xâu đã sắp xếp số theo thứ tự tăng dần còn vò trí các kí tự vẫn giữ nguyên? Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN Ví dụ: nhập: abc6ghj7kkkkk1hhhh9 Kết quả: abc1ghj6kkkkk7hhhh9 var a:array[1 100]of integer; s,s1,s2:string; i,X,c,tam,j,n:integer; so : SET OF integer; Begin so:=['0' '9']; readln(s); for i:=1 to length(s) do if (s[i] in so) then begin val(s[i],x,c); j:=j+1; a[j]:=x end; for i:=1 to j-1 do for n:=i+1 to j do if a[i]>a[n] then begin tam:=a[i]; a[i]:=a[n]; a[n]:=tam; end; for i:=1 to j do begin str(a[i],s1); s2:=s2+s1; end; n:=0;s1:=''; for i:=1 to length(s) do if s[i] in so then begin inc(n); delete(s,i,1); insert(s2[n],s,i); end; write(s); readln; end. 17. VCT cho nhập một xâu ký tự trong đó có lẫn vào một số có 3 chữ số (vd: fffhgj234fgg)- có kiểm tra việc nhập sai (vd: jghjg45jk hoặc ggdg012gdg hoặc ggdgg34hjhh3…) và cho phép nhập lại. Kiểm tra cho biết số đó có phải là số nguyên tố không? var s,s1:string; x,vt,c,dem,i:integer; function ktranto(a:integer):boolean; begin ktranto:=true; for i:=2 to a-1 do if a mod i=0 then ktranto:=false; end; begin repeat dem:=0; write('moi nhap xau: '); readln(s); for i:=1 to length(s) do if s[i] in ['0' '9'] then begin dem:=dem+1; if dem=1 then vt:=i; s1:=copy(s,vt,3); Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN val(s1,x,c); end; until (c=0) and (x>99) and (dem=3); if ktranto(x) then write('day la so nguyen to :',x); readln; end. 18. VCT kiểm tra việc nhập một ký tự và một xâu ký tự bằng kí tự in hoa( nếu không đúng thì nhập lại) sau đó cho biết số lần ký tự xuất hiện trong xâu ký tự? uses crt; var i,dem:integer; ch:char; s:string; begin clrscr; repeat write('moi nhap ki tu: '); readln(ch); until ch in ['A' 'Z']; repeat write('moi nhap xau ki tu: '); readln(s); dem:=0; for i:=1 to length(s) do if s[i] in ['A' 'Z'] then inc(dem); until dem=length(s); dem:=0; for i:=1 to length(s) do if ch=s[I] then inc(dem); write(ch,' xuat hien ',dem, ' trong ', s); readln; end. 19. VCT nhập vào một 2 xâu S và s1 in ra các lý tự chung của hai xâu? var s,s1,s2:string; i:integer; begin write('moi nhap sau thu nhat: '); readln(s); write('moi nhap sau thu hai: '); readln(s1); i:=1; repeat s2:=copy(s,i+1,length(s)); if pos(s[i],s2)<>0 then delete(s,i,1) else inc(i); until pos(s[i],s2)=0; for i:=1 to length(s) do if pos(s[i],s1)<>0 then writeln('ki ',s[i],' xuat hien trong ca hai sau'); readln; end. 20. VCT vẽ các hình: a. Chữ nhật đặc. b. Chữ nhật rỗng. c. Tam giác cân đặc. d. Tam giác cân rỗng. e. Tam giác vuông đặc. f. Tam giác vuông rỗng. (Hình chữ nhật: nhập chiều dài và chiều rộng, Tam giác: nhập chiều cao; vẽ các hình trên với ký tự nhập từ bàn phím; có thể làm thành 6 bài riêng biệt hoặc làm chung một chương trình có lựa chọn ) uses crt; {BAI TOAN VE CAC LOAI HINH VOI KICH THUOC VA KI TU NHAP TU BAN PHIM} var c,h,n,d,r,luachon:integer; ch:char; begin clrscr; Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN writeln(' Ve hinh chu nhat dac, nhap:1'); writeln(' Ve hinh chu nhat rong, nhap:2'); writeln(' Ve tam giac can dac, nhap:3'); writeln(' Ve tam giac can rong, nhap:4'); writeln(' Ve tam giac vuong dac, nhap:5'); writeln(' Ve tam giac vuong rong, nhap:6'); writeln; repeat Write('Moi nhap so:'); readln(luachon); until (0<luachon)and(luachon<7); write('Nhap ky tu de ve hinh:');readln(ch); case luachon of 1: BEGIN write('nhap chieu dai hinh chu nhat dac:');readln(d); write('nhap chieu rong hinh chu nhat dac:');readln(r); clrscr; for c:=1 to d do begin for h:=1 to r do write(ch); writeln; end; END; 2: BEGIN write('nhap chieu dai hinh chu nhat rong:');readln(d); write('nhap chieu rong hinh chu nhat rong:');readln(r); clrscr; for c:=1 to d do begin for h:=1 to r do if (c=1)or(h=1)or(c=d)or(h=r) then write(ch) else write(' '); writeln; end; END; 3: BEGIN write('Nhap chieu cao tam giac can dac:');readln(n); clrscr; for c:=1 to n do begin for h:=n-c+1 to n+c-1 do begin gotoxy(h,c);write(ch);end; writeln; end; END; 4:BEGIN write('Nhap chieu cao tam giac can rong:');readln(n); clrscr; for h:=1 to n do begin for c:=1 to 2*n-1 do if (c=n-h+1) or (c=n+h-1)or(h=n) then write(ch) else write(' '); writeln; end; END; 5:BEGIN write('Nhap chieu cao tam giac vuong dac:');readln(n); clrscr; for h:=1 to n do begin for c:=1 to h do write(ch); writeln; end; END; 6:BEGIN write('Nhap chieu cao tam giac vuong rong:');readln(n); clrscr; for h:=1 to n do begin Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN for c:=1 to h do if (c=1)or(h=n)or(c=h)then write(ch) else write(' '); writeln; end; END; END;{KET THUC LENH CASE} readln; end. (Tìm cách giải khác cho các bài tập trên) Bµi 1: ViÕt ch¬ng tr×nh nhËp vµo mét x©u kÝ tù. In ra x©u ®¶o ngỵc mµ kh«ng lµm thay ®ỉi ý nghÜa cđa tõ. VÝ Dơ: Nguyen Van An in ra An Van Nguyen C1: var p,s:string; i,n:integer; begin write('nhap xau:'); readln(s); s:=' '+s; for i:=length(s) downto 1 do if s[i]=' 'then begin p:=copy(s,1,i); delete(s,1,i); write(' '+s); s:=p end; readln; end. C2: var st,s:string; i,n:integer; begin write('nhap xau st:');readln(st); while st[1]=#32 do delete(st,1,1); while st[length(st)]=#32 do delete(st,length(st),1); while pos(#32#32,st)<>0 do delete(st,pos(#32#32,st),1); st:=#32+st; writeln('liet ke cac tu trong xau'); for i:=length(st) downto 1 do if st[i]=' 'then begin s:=copy(st,1,i); delete(st,1,i); write(' '+st); st:=s end; readln; end. Bµi 2: NhËp vµo mét x©u kÝ tù chn hãa x©u ®ã (xãa c¸c kÝ tù tr¾ng thõa ë 2 bªn vµ ë gi÷a) LiƯt kª c¸c tõ trªn mét dßng. VÝ dơ : Nguyen V¨n An in ra: Nguyen Van An C1: var st,s:string; i:integer; begin write('nhap xau st:');readln(st); while st[1]=#32 do delete(st,1,1); while st[length(st)]=#32 do delete(st,length(st),1); while pos(#32#32,st)<>0 do delete(st,pos(#32#32,st),1); st:=st+#32; writeln('liet ke cac tu trong xau'); while pos(#32,st)<>0 do begin Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN writeln(copy(st,1,pos(#32,st))); delete(st,1,pos(#32,st)); s:=st; end; readln; end. C2: var st,s:string; i:integer; procedure xoatrangthua(var st:string); begin while st[1]=#32 do delete(st,1,1); while st[length(st)]=#32 do delete(st,length(st),1); while pos(#32#32,st)<>0 do delete(st,pos(#32#32,st),1); end; begin write('nhap xau st:');readln(st); xoatrangthua(st); st:=st+#32; writeln('liet ke cac tu trong xau'); for i:=length(st)downto 1 do begin while pos(#32,st)<>0 do begin writeln(copy(st,1,pos(#32,st))); delete(st,1,pos(#32,st)); s:=st; end; end; readln; end. Bµi 3: NhËp vµo mét x©u kÝ tù xãa c¸ch dÊu thõa c¸ch ë 2 ®Çu vµ ë gi÷a var st,s:string; i:integer; procedure xoatrangthua(var st:string); begin while st[1]=#32 do delete(st,1,1); while st[length(st)]=#32 do delete(st,length(st),1); while pos(#32#32,st)<>0 do delete(st,pos(#32#32,st),1); end; begin write('nhap xau st:');readln(st); xoatrangthua(st); st:=st+#32; writeln('liet ke cac tu trong xau'); for i:=length(st)downto 1 do begin while pos(#32,st)<>0 do begin write(copy(st,1,pos(#32,st))); delete(st,1,pos(#32,st)); s:=st; end; end; readln; end. Bµi 1: S¾p xÕp gi¶m dÇn [...].. .Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN program mang; var tg,min,max,i,n,j:integer; a:array[1 10] of integer; begin writeln('nhap so phan tu cua mang'); readln(n); writeln('nhap cac phan tu'); for i:=1... write('phan tu thu ',i,'la:'); readln(a[i]); end; for i:=1 to n-1 do for j:=i+1 to n do if a[i] > a[j] then begin tg:=a[i]; a[i]:=a[j]; a[j]:=tg; end; writeln(' mang sau khi da sap xep tang dan la:'); Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN for i:=1 to n do write(a[i]:3); s:=0; for i:=1 to n do if a[i] mod 2 =0 then s:=s+a[i]; writeln('tong cac phan tu co gia tri chan trong mang la=', s); readln; end . Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN BÀI TẬP CƠ BẢN - Đáp án ++ 1. Viết chương trình tính điểm trung bình 3 môn. dòng và xuất ra số ký tự của mỗi từ? ( vd: Tran Quang Khai Khai : 4 ký tự Quang : 5 ký tự Tran : 4 ký tự uses crt; var s,s1,s2,t:string; Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN a:array[1. end; write('ucln ',ucln); write('bcnn ',a*b/ucln:1:1); Bài tập Pascal BỒI DƯỢNG HỌC SINH GIỎI HUYỆN readln; end. 4. VCT giải hai bài toán cổ: 100 trâu 100 bó cỏ và vừa gà vừa chó 36 con 100