Nếu dãy không có số hoàn thiện nào thì ghi -1.. Hãy tính số lần lặp của xâu S1 trong xâu S2. Hãy tính tổng S của M và N và tìm số lần xuất hiện của các chữ số trong S... Cấu trúc file nh[r]
Trang 1MỘT SỐ BÀI TẬP
Bài 1:
Nhập một số thực x, nếu x >0 thì tính căn bậc hai x, nếu x<=0 thì thông báo ‘x không phải là số dương’
Bài 2:
In các ký tự trong bảng mã lên màn hình, mỗi hàng 15 ký tự.
Bài 3:
Nhập số đo bằng độ của một góc, tính số đo bằng radian của góc đó.
Bài 4:
Cho số tự nhiên n, hãy lập trình để tính các tổng sau :
a 1 + 1/22 + 1/32 + … + 1/n2
b 1 + 1/2! + 1/3! + … + 1/n!
Bài 5:
Nhập dãy số thực a Tách riêng các số >0 và sắp xếp thành dãy tăng
Thuật toán:
B1: Nhập n, dãy {a1, an)
B2: Dùng mảng b để tách các số >0.
B3: k:=0;
B4: Cho i chạy từ 1 -> n
Nếu a[i] >0 thì
- 4.1 Tăng k;
- 4.2 b[k]:=a[i];
B5: Ra khỏi vòng lặp, dùng thuật toán sắp xếp cho mảng b nếu k>0;
B6: In mảng a và b.
B7 Kết thúc.
Bài 6:
Nhập dãy số thực dương Tách dãy số thành 2 nửa sao cho trị tuyệt đối hiệu của tổng 2 nửa đạt min.
HD:
Đặt s1 là tổng của nửa đầu (từ số hạng thứ 1 đến số hạng thứ k)
s2 là tổng của nửa sau (từ số hạng thứ k+1 đến số hạng thứ n)
s là tổng của dãy
=> S= s1+s2;
Đặt h = │s2-s1│
Khi s2>=s1 thì h = s2-s1 = s-2s1
Khi s2<s1 thì h=s1-s2 = 2s1-s
Khởi đầu cho k=0, s1=0, s2=s Khi đó s2>s1.
Ta thấy Khi k tăng thì s1 tăng, s2 giảm => h giảm chừng nào s1<s2 đến một lúc nào đó thì s1sẽ
>s2 => h tăng theo k vậy h nhỏ nhất tại thời điểm h thôi giảm.
Thuật toán:
Dùng While
Chừng nào s2 >s1 thì tăng k => s1:=s1+a[k]
Ra khỏi vòng lặp:
s1 cũ = s1 - a[k];
h' cũ = S - 2S1' cũ = s - 2s1 + 2 a[k];
h= 2s1 - s;
h' - h = 2(2s1 - a[k])
+ Nếu h' - h < 0 => a[k] > 2s1 thì ta chọn h (tức là lấy k)
Trang 2+ Nếu h' - h > 0 => a[k] < 2s1 thì ta chọn h' (tức là lấy k -1)
Bài 7:
Nhập vào một dãy số thực a gồm n phần tử (5<n<100), tìm tổng của 5 phần nhỏ nhất của dãy.
Bài 8:
Nhập vào một dãy số thực a Tìm các số của dãy bằng tổng 2 số khác trong dãy.
HD: Dùng 3 vòng for lồng nhau:
Cho i chạy từ 1 đến n
Cho j chạy từ 1 đến n -1
Cho k chạy từ j+1 đến n
nếu i<>j và i <> k và a[i] = a[j] + a[k] thì
in ra màn hình a[i], a[j], a[k]
Bài 8:
Nhập dãy số thực a Tìm max (min) của các phần tử và tìm các giá trị đạt max (min).
HD:
- Dùng S để tính max các ptử.
- Khởi đầu S:=a[1]
- Dùng vòng lặp for Cho i: 2->n
Nếu S<a[i] thì s=a[i]
- Ra khỏi vòng lặp S là số lớn nhất.
- Dùng vòng lặp for Cho i: 1->n
Nếu s=a[i] thì in giá trị i.
Bài 9:
Dãy số sau được gọi là dãy Fibonaci :
a1 = 1 a2 = 1 a3 = 2 a4 = 3
an = an-1 + an-2 Viết chương trình tính 20 số Fibonaci đầu tiên và đưa ra kết quả vào một mảng 20 phần tử.
Phần xâu:
Bài 10:
Nhập vào một xâu ký tự.
a Đếm số lần xuất hiện của một ký tự nào đó trong xâu.
b Liệt kê các ký tự có mặt trong xâu cùng số lần xuất hiện của các ký tự đó.
HD:
a Dùng một biến Cho i chạy từ 1 đến length(xau), mỗi lần ký tự xuất hiện thì tăng biến đếm.
b Dùng một mảng 255 phần tử, ptử thứ k của mảng phụ tránh việc đếm số lần xuất hiện trong xâu của ký tự thứ k.
Ra khỏi vong lặp, in các ký tự có số đếm > 0.
Bài 11:
Nhập vào một xâu ký tự.
a Xét xem trong xâu có k ký tự kề nhau mà như nhau hay không.
b Tất cả các ký tự kề nhau mà như nhau thì chỉ để lại một.
HD:
Nhập xâu S.
n=length(s)
a Dùng biến d để đếm các bộ k ký tự kề nhau mà như nhau
biến d1 để đếm số ký tự như nhau vừa được đọc.
- Khởi đầu cho d = 0, d1=0;
Trang 3- Dùng vòng lặp for, cho i chạy từ 1-> n-1
Nếu s[i]=s[i+1] thì tăng d1
ngược lại cho d1=0;
nếu d1+1 >=k thì tăng d
Ra khỏi vòng lặp, nếu d >0 thì trả lời có.
b Dùng hàm XOA
Nếu còn 2 ký tự như nhau kề nhau thì
- Xoá bớt 1 ký tự;
- Hàm nhận giá trị true
Dùng vòng lặp while
Chừng nào hàm XOA còn true thì còn vòng lặp
Bài 12:
Viết chương trình tìm tất cả các số nguyên tố trong đoạn m, n (2 <= m < n < 10000).
Dữ liệu vào: Từ tệp văn bản nto.inp gồm 1 dòng chứa 2 số tự nhiên m, n.
Dữ liệu ra: Ghi vào tệp nto.out là một dòng chứa tất cả các số nguyên tố trong đoạn m, n Nếu không có thì ghi -1.
Ví dụ:
HD:
- Viết hàm kiểm tra số nguyên tố
function nguyento(n:integer): boolean;
var j:integer;
begin
nguyento:=true;
if n < 2 then nguyento:=false;
for j:=2 to trunc(sqrt(n)) do
if (n mod j = 0) then
begin
nguyento:=false;
break;
end;
end;
- Trong thủ tục xử lý ta cho i: m-> n nếu nguyento(i) thì ghi vào tệp và tăng đếm
- Nếu đếm = 0 thì ghi -1 ngược lại thì ghi đếm.
Bài 13:
Nhập vào một xâu ký tự Kiểm tra tính đối xứng của xâu đó Nếu xâu không đối xứng hãy đảo xâu.
Dữ liệu vào: Từ tệp văn bản xau.inp gồm xâu s
Dữ liệu ra: Ghi vào tệp xau.out cấu trúc như sau:
- Dòng đầu tiên ghi xâu s
- Dòng tiếp theo ghi kết quả
Bài 14:
Nhập một xâu ký tự Đưa xâu đó về dạng chuẩn, nghĩa là:
- Không còn ô trống ở đầu và cuối xâu;
- Không còn 2 ô trống kề nhau;
- Không còn các ô trống đứng liền sau dấu chấm;
- Ký tự đầu tiên và các ký tự sau dấu chấm phải viết hoa.
Dữ liệu vào: Từ tệp văn bản xau1.inp gồm xâu s
Dữ liệu ra: Ghi vào tệp xau1.out
Cách làm bai 14:
Dùng biến tiếp để xem vòng lặp còn tiếp tục được nữa không.
Khởi đầu tiep=true
Trang 4Dùng vòng lặp while chừng nào tiếp còn =true thì còn
Tiep=false;
nếu còn ô trống ở đầu hay ở cuối thì xoá ô trống đó;
tiep=true;
nếu còn 2 ô trống ở kề nhau thì xoá bớt ô trống thứ nhất trong 2 ô trống đó;
tiep=true;
nếu còn dấu chấm đứng liền trước ô trống thì xoá ô trống đó;
tiep=true
Ra khỏi vòng lặp while đó thực hiện thêm một vòng lặp For nữa.
Cho i chạy từ 1 đến độ dài xâu-1
nếu s[i]=dấu chấm thì nâng ký tự s[i+1] thành chữ hoa Cuối cùng nâng ký tự s[1] thanh chữ hoa.
Bài 15:
Cho dãy a Hãy tìm các số hoàn thiện trong dãy a đó.
Dữ liệu vào: Từ file văn bản ht.inp gồm một một dòng chứa các số tự nhiên N (N <=1000)
Dữ liệu ra: Ghi vào file văn bản ht.out gồm 1 dòng là các số hoàn thiện.
Nếu dãy không có số hoàn thiện nào thì ghi -1.
HD:
- Sử dụng hàm hoàn thiện function hoanthien(x: longint): Boolean;
- Khai báo S, i: longint;
- Gán hoanthien:=false;
- S:=0;
- Cho I chạy từ 1 – n div 2
Nếu (x mod i = 0) thì
S:=s + i
nếu s > x thì thoát khỏi vòng lặp
- Nếu s = x thì hoanthien:=true.
Hàm hoàn thiện:
function hoanthien(x: longint): Boolean;
var s,i: longint;
begin
hoanthien:=false ;
S:=0;
for i:=1 to (x div 2) do
if (x mod i = 0) then
begin
S:= S + i;
if s > x then exit;
end;
if s = x then hoanthien := true;
end;
Bài 16:
Các số chính phương đều có dạng N2 được gọi là các số tứ giác Các số có dạng N(N+1)/2 được gọi là các số tam giác.
Ví dụ: Các số tứ giác: 1, 4, 9, 16…
Các số tam giác: 1, 3, 6, 10…
Hãy tìm trong 1000 số đầu tiên những số vừa là tứ giác vừa là tam giác.
Dữ liệu vào: Từ file văn bản Bai16.inp là số tự nhiên N (N <= 1000)
Dữ liệu ra: Ghi vào file văn bản Bai16.out ghi tất cả các số vừa là tứ giác vừa là tam giác.
(Các số được ghi trên một dòng và phân cách nhau bởi một dấu cách trống)
HD:
- Sử dụng 2 biến logic: G4: Các số tứ giác; G3: Các số tam giác
- Cho biến i chạy từ 1-> n
Trang 5+ Gán: G4:= false;
G3:= false;
+ Cho j chạy từ 1 đến I div 2 thì
Nếu j2 = i thì G4:= true;
Nếu j*(j+1)/2 = i thì G3:=true;
- Nếu G4 và G3 thì ghi vào tệp.
Bài 17:
Cho dãy số a gồm các số tự nhiên Hãy tìm UCLN của dãy đó.
Dữ liệu vào: Từ file văn bản BAI17.INP là một dòng gồm N số tự nhiên (N <=1000).
Dữ liệu ra: Ghi vào file văn bản BAI17.OUT một số là UCLN của dãy a.
(Các số được ghi trên một dòng và phân cách nhau bởi một dấu cách trống)
HD:
function UCLN(a,b: integer): integer;
var r : integer;
begin
while b<>0 do
begin
r := a mod b;
a := b;
b := r;
end;
UCLN := a;
end;
procedure TinhUC;
var i,u : integer;
begin
u := a[1]; {u là UCLN của các phần tử từ 1 đến i}
for i := 2 to n do u := UCLN(u,a[i]); {là UCLN của các phần tử từ 1 đến i-1 và ai} writeln('UCLN cua ca day la:',u);
end;
Bài 18:
Dữ liệu vào: Từ file văn bản BAI18.INP gồm 2 dòng:
- Dòng 1 ghi số N (N >= 3) là số phần tử của dãy a;
- Dòng 2 là một dãy gồm N số nguyên.
Dữ liệu ra: Ghi vào file văn bản BAI18.OUT là một từ “CO” nếu dãy a là dãy cấp số cộng hoặc từ
“KHONG” nếu dãy a không phải là cấp số cộng.
Bài 19:
Cho 2 xâu S1 và S2 Hãy tính số lần lặp của xâu S1 trong xâu S2.
Dữ liệu vào: Từ file văn vản BAI19.INP gồm 2 dòng:
- Dòng 1: Chứa xâu S1;
- Dòng 2: Chứa xâu S2.
Dữ liệu ra: Ghi vào file văn bản BAI19.OUT là số lần lặp của xâu S1 trong xâu S2.
Ví dụ:
aaa
Bài 20:
Cho 2 số nguyên M và N Hãy tính tổng S của M và N và tìm số lần xuất hiện của các chữ số trong S.
Trang 6Dữ liệu vào: Từ file văn vản BAI20.INP gồm 2 dòng:
- Dòng 1: Chứa số M;
- Dòng 2: Chứa số N.
Dữ liệu ra: Ghi vào file văn bản BAI20.OUT gồm các dòng:
Dòng 1: Ghi 2 số nguyên M, N;
Dòng 2: Ghi giá trị tổng S;
- Các dòng tiếp theo ghi số lần xuất hiện của các chữ số trong S.
Ví dụ:
2345
-345
2345 -345 2000
0 : 3
2 : 1
Bài 21:
Nhập một mảng 2 chiều m dòng, n cột từ file BANGSO.TXT Cấu trúc file như sau: dòng đầu là 2
số m và n, cách nhau bằng dấu cách, m dòng sau, mỗi dòng n số nguyên.
a) Hãy in ra những số là số nguyên tố của mảng
b) Tìm vị trí phần tử lớn nhất trong mảng
c) Sắp xếp mỗi dòng của mảng tăng dần và in ra mảng dạng ma trận
HD
Ta khai báo một mảng 2 chiều và nhập dữ liệu từ file vào mảng Quá trình nhập từ file văn bản giống như nhập từ bàn phím, không cần thực hiện kiểm tra dữ liệu Để sắp xếp mảng theo yêu cầu,
ta thực hiện sắp xếp từng dòng của mảng bằng cách viết một thủ tục sắp xếp (kiểu đổi chỗ cho đơn giản) coi mỗi dòng của mảng như 1 mảng 1 chiều.
Bài 22:
Nhập vào một xâu s và đếm xem nó có bao nhiêu từ Từ là một dãy các kí tự, cách nhau bởi dấu cách?
Dữ liệu vào: Từ file văn bản BAI22.INP là một xâu S.
Dữ liệu ra: Ghi vào file văn bản BAI22.OUT là số từ của xâu.
Ví dụ:
Dai hoc vinh 2010 4
HD:
Cách đếm từ đơn giản nhất là đếm dấu cách: nếu s[i] là kí tự khác cách và s[i-1] là kí tự cách thì chứng tỏ s[i] là vị trí bắt đầu của một từ Chú ý là từ đầu tiên của xâu không có dấu cách đứng trước.
S:= ‘ ‘+S;
Bài 23:
Nhập vào một xâu S và in ra các từ đối xứng của xâu (Từ là một dãy các kí tự, cách nhau bởi dấu cách) Xâu đó có bao nhiêu từ là đối xứng?
Dữ liệu vào: Từ file văn bài BAI23.INP chứa xâu S.
Dữ liệu ra: Ghi vào file văn bản BAI23.OUT
a Nếu xâu có từ đối xừng thì ghi thành 2 dòng:
- Dòng 1: ghi các từ đối xứng
- Dòng 2: ghi số từ đối xứng.
b Nếu xâu không có từ đối xứng thì ghi -1.
Ví dụ:
Dai hoc vinh 2002 aga 2002 aga
2 Cong hoa xa hoi chu nghia -1
Trang 7HD
- Tách xâu đó thành các từ Cách đơn giản nhất tiến hành như sau:
1) Bỏ qua các dấu cách cho đến khi gặp một kí tự khác cách (hoặc hết xâu)
2) Ghi các kí tự tiếp theo vào xâu tạm cho đến khi gặp dấu cách hoặc hết xâu, khi đó ta được 1 từ 3) Nếu chưa hết xâu thì quay lại bước 1
- Mỗi khi tìm được một từ, ta kiểm tra tính đối xứng nếu từ đó là đối xứng thì ghi vào tệp và tăng biến đếm Ta cũng có thể lưu các từ tách được vào một mảng nếu bài tập yêu cầu dùng đến những
từ đó trong các câu sau.
- Kết thúc xâu ta ghi đếm vào tệp.
Bài 24:
Một số nguyên gọi là palindrom nếu nó đọc từ trái sang cũng bằng đọc từ phải sang
- Dữ liệu vào: Từ file text BAI24.INP là một dãy n phần tử nguyên dương, 5<= n<=20 và các phần tử có 2 đến 4 chữ số
- Dữ liệu ra: Ghi vào file text BAI24.OUT là một dòng gồm các số palindrom Nếu dãy không có số palindrom nào thì ghi -1.
Các số được ghi cách nhau bởi một dấu cách trống
HD:
Một số là palindrom thì xâu tương ứng của nó là xâu đối xứng Ta sẽ xây dựng một hàm kiểm tra một số có phải là palindrom không bằng cách chuyển số đó thành xâu và kiểm tra xâu đó có đối xứng không?
function palindrom(k : integer): boolean;
var x,y : string;
i : integer;
begin
str(k,x); {chuyển k thành xâu x}
y := '';
for i := length(x) downto 1 do
y := y + x[i]; {nếu x là đối xứng thì k là palindrom}
if x=y then palindrom := true else palindrom := false;
end;
Bài 25:
Tìm tất cả các số AMSTRONG trong đoạn m, n (100<=n < m <=999; n, m N*)
(Số AMSTRONG là số có ba chữ số sao cho tổng lập phương của các chữ số bằng chính số đó)
Dữ liệu vào: Từ file văn bản BAI25.INP là một dòng gồm 2 số nguyên dương m, n
Dữ liệu ra: Ghi vào file văn bản BAI25.OUT là một dòng gồm các số AMSTRONG nằm trong đoạn m, n Nếu trong đoạn đó không có số nào thoả mãn thì ghi -1.
HD:
Dùng 3 vòng for lồng nhau:
For x:=1 to 9 do
For y:=0 to 9 do
For z:=0 to 9 do
If x*x*x + y*y*y + z*z*z = x*100 + y*10 +z then
Write(f2,x,y,x,’ ‘);
Trang 8CHƯƠNG TRÌNH MẪU
Bài 4
a)
Var n , i : Word ;
S : Real ;
BEGIN
Write (' Nhap n : ') ; Readln (n) ;
S := 0 ;
For i := 1 To n Do
S := S + 1 / sqr(i) ;
Writeln (' S = ', S:0:2) ;
Readln ;
END
b)
Var n , i , j , p : Word ;
S : Real ;
BEGIN
Write (' Nhap n : ') ; Readln(n) ;
p := 1 ;
s := 0 ;
For i :=1 To n Do
Begin
p := p * i ; (* tính i *)
S := S + 1 / p ;
End ;
Writeln (' S = ', S:0:2) ;
Readln ;
END
Bài 5:
Var a,b: array[1 100] of real;
i,j,k,n: Integer;
x: real;
BEGIN
Write(nhap n = '); readln(n);
Writeln('Nhap day so');
K:=0;
For i:= 1 to n do
Begin
Read(a[i]);
If a[i]>0 then Begin
Inc(k);
b[k]:=a[i];
end;
end;
for i:=1 to k-1 do
for j:= i+1 to k do
if b[i] > b[j] then Begin
x:=b[i];
b[i]:=b[j];
b[j]:=x;
end;
if k=0 then writeln('khong co so duong') else for i:= 1 to k do write(b[i]:0:1);
writeln;
readln;
END
Trang 9Bài 6:
C1: program bai6;
uses crt;
var a,h:array[1 100] of integer;
i,n,k,s,s1,s2,min:integer;
begin
clrscr;
write('nhap mang');
write('moi nhap so ptu n= ');readln(n);
s:=0;
for i:=1 to n do begin
write('a[',i,']= ');readln(a[i]);
s:=s+a[i];
end;
for i:=1 to n do write(a[i]:3);writeln; s1:=0;s2:=s;
for i:=1 to n-1 do
begin
s1:=s1+a[i];
s2:=s2-a[i];
h[i]:=abs(s2-s1);
end;
for i:=1 to n-1 do write(h[i]:3); writeln; min:=h[1];
for i:=2 to n-1 do
if h[i]<min then
min:=h[i];
writeln('gtri hieu nho nhat la: ',min); for i:=1 to n-1 do
if h[i]=min then
writeln('vi tri tach: ',i:6);
readln
end
C2:
Var a: array[1 100] of real;
i,k,n: Integer;
S1,S: real;
BEGIN
Write('nhap so pt cua day'); readln(n);
S:=0;
For i:=1 to n do
Begin
Read(a[i]);
S:=S+a[i];
End;
Readln;
k:=0; s1:=0;s2:=s;
while s2 > s1 do
begin
inc(k);
s1:=s1+a[k];
end;
if a[k] < (2*s1-s) then
begin
s1:=s1-a[k];
k:=k-1;
end;
Writeln('day dau tu 1 den',k,'co tong s1=',s1:0:2);
Writeln('day sau tu k+1 den',n,'co tong s2=',S-s1:0:2); Readln;
END
Trang 10Bài 9:
Var
a : Array[1 20] Of Byte ;
i : Byte ;
BEGIN
a[1] :=1;
a[2] :=1;
For i:=3 to 20 do a[i]:=a[i-1]+a[i-2] ;
END
Bài 10:
C1:
{var s:string;
ch:char; dem,i:integer;
begin
write('Nhap xau:');readln(s);
write('Nhap ki tu:');readln(ch);
dem:=0;
for i:=1 to length(s) do
if s[i]=ch then dem:=dem+1;
write('dem:',dem:4);
readln;
end }
{cau 10b}
var s:string;
j,i:integer;
a:array [0 255] of byte;
begin
write('Nhap xau:');readln(s);
for i:=0 to 255 do a[i]:=0;
for i:=0 to 255 do
for j:=1 to length(s) do
if s[i]= chr(i) then a[i]:=a[i]+1;
for i:=0 to 255 do
if a[i] >0 then writeln('ki tu',chr(i),' xuat hien', a[i]:4,'lan'); readln;
end
C2:
program xau;
uses crt;
var st:string;
i,j,d:integer;ch:char;
begin clrscr;
write('nhap xau ki tu: ');readln(st);
{ write('nhap ki tu bat ki: ');readln(ch);
for i:=1 to length(st) do
if st[i]=ch then d:=d+1;
write('so lan xh ki tu ',ch,' trong xau la ',d);}
for j:=0 to 255 do
begin
d:=0;
for i:=1 to length(st) do
if ord(st[i])=j then d:=d+1;
if d<>0 then
writeln('so lan xh ktu ',chr(j),' la: ',d);
end;
readln