Đếm số chữ số trong số nguyên n... Bổ sung một nút vào danh sách a, Bổ sung dầu dang sách Procedure bosung var L : Tro; X : integer; Var P: tro; Begin New p; P^.. Cho trước một số nguyên
Trang 1I.Viết các thủ tục và hàm đệ quy, ko đệ quy.
1 Tính Sn = 1 + 2 + 3 +… + n.
Function tong 1 (n : integer) : integer;
Var s, i : Integer;
Begin
S:= 0;
For i:=1 to n do S:= S+i;
Tong 1:= S;
END;
• Đệ quy
Function tong 1 (n : integer) : integer;
Begin
If n = 1 then tong 1:= 1;
Else tong1:= n + tong1 (n – 1);
End;
2 Tính Sn = 1 2 + 2 2 + 3 2 +……+n 2
Function tong 2 (n : integer) : word;
Var i: interger; s: word;
Begin
S:= 0;
If n > 0 then
For i:= 1 to n do S:= S +i*i
Tong 2 := S;
End;
• Đệ quy:
Function tong 2 (n : integer) : word;
Begin
If n = 1 then tong 2:= 1;
Else tong2:= n*n + tong2 (n – 1);
End;
3 Tính n!
Function Giaithua (n : integer) : word;
Var i: interger; s: word;
Begin
S:=1;
For i:= 1 to n do S:= S* i;
Giaithua:= S;
End;
• De quy
Function Giaithua (n : integer) : word;
Begin
If (n:= 0) or (n:=1) then Giaithua :=1; Else Giaithua := n*Giaithua (n – 1); End;
Trang 24 Chuyen thap phan sang nhi phan: Function Nhiphan (n : integer) : string;
Var St : string;
Begin
St:= ‘ ‘;
Repeat
If n mod 2 := 0 then St:= ‘0’ + st Else St:= ‘1’ + st;
n:= n div 2;
Until n;= 0;
Nhiphan:= S;
End;
* Procedure Nhiphan (n:integer);
Var
Begin
S := rong;
Repeat
X := n mod 2;
SPUSH (S, n, t, X);
n:= n div 2;
Until n:= 0 ;
While s <> rong do
Wrrite ( SPOP (S, nt));
End;
• De quy
Function Nhiphan (n : integer) : string; Begin
If n >= 2 then
Nhiphan (n div 2);
Write ( n mod 2);
End;
5 Hien thi so dao nguoc
Procedure daonguoc ( n : integer); Var m:integer;
Begin
Repeat m:=n mod 10;
Write (m);
n:= n div 10;
Until n:= 0;
End;
• De quy
Procedure daonguoc ( n : integer); Begin
If n <=0 then write (n);
Else Begin
Write (n mod 10);
Daonguoc (n div 10);
End;
End;
Trang 36 Tinh UCLN(a,b).
Function UCLN (a, b: integer): integer;
Var m : integer;
Begin
While a <> b do
If a > b then a := a – b
Else b := b – a;
UCLN :=b;
End;
• De quy
Function UCLN (a, b: integer): integer;
If a := b then UCLN := a
Else if a> b then UCLN := UCLN (a – b, b) else UCLN := UCLN ( a, b – a); End;
7 Kiem tra so nguyen to:
Function nguyento (n: integer) : Boolean;
Var a : integer;
Begin
a := 2
While ( a < n div 2) and ( n mod 2 <> 0)
Do a:= a + 1;
If a > n div 2 then nguyento := true; Else nguyento := False;
End;
8 Đếm số chữ số trong số nguyên n.
Trang 4* Function Dem(n:integer):integer;
Begin
If n<>0 then Dem:=Dem(n div 10) +1 Else Dem:=0;
End;
* Không Đệ Quy:
Function Dem(n:integer): integer;
Var a: word;
Begin
a:=0;
Repeat
a:=a+1;
n div 10;
Until n=0;
Dem:=a;
End;
9 Đếm số lẻ trong số nguyên n.
* Function Dem(n:integer):integer;
Begin
While n<>0 the do
Begin
If n mod 2 <>0 then Dem:=1 Else Dem:=Dem(n div 10); End;
Writeln(‘So le la:’); Return;
End;
* Không Đệ Quy:
Function Dem(n:integer):integer;
Var m:word;
Begin
m:=0;
Repeat
If n mod 2 <>0 them m:=1
Else n:=n div 10;
m:=m+1;
Until n=0;
Writeln(‘So le la:’, m);
End;
II QUEEN:
Trang 51 Nộp phần tử vào Queen và lấy phần tử ra khỏi Queen:
* Procedure QPUSH(Var Top, Botton:Tronut; X:integer);
Var P:Tronut;
Begin
New(P);
P^.info:=X;
P^.Link:=nil;
If Botton=nil then Botton:=P
Else Top^.Link:=P;
Top:=P;
End;
* Function QPOP(Var Top,Botton): Integer;
Var P:Tronut; X:integer;
Begin
X:=Botton.info;
P:=Botton;
Botton:=Botton.Link;
If (Botton=nil) then Top=nil;
Dispose(P);
QPOP:=X;
End;
III DANH SÁCH MÓC NỐI ĐƠN
1 Bổ sung một nút vào danh sách
a, Bổ sung dầu dang sách
Procedure bosung (var L : Tro; X : integer);
Var P: tro;
Begin
New (p);
P^ gtri := X;
P^ Next := L;
L:= P;
End;
b, Bổ sung cuối dang sách
Procedure bosung (var L : Tro; X : integer);
Var P: tro;
Begin
New (p);
P^ gtri := X;
P^ Next := nil;
If L := nil then L:= P;
Else Begin
T:= L;
While t^.next <> nil do T:=T^.next
T^.next := P;
End;
End;
2 Cho trước một số nguyên N, nếu trong danh sách chưa có N thì bổ sung thêm nút mới N vào cuối danh sách.
Procedure bosung (var L : Tro; N : integer);
Var P, T: tro;
Begin
New (p);
Trang 6P^ gtri := X;
P^ Next := nil;
If L := nil then L:= P;
Else
Begin
T:= L;
While (t^.next <> N) and (T^.next <> Nil) Do T:=T^.next ;
if T^.Next := Nil then T^ Next := P Else write (‘Giá trị đã có”);
End;
End;
3 Tìm nút lớn nhất
a, thủ tục: nút lớn trỏ bởi p
Procedure Lonnhat ( L : tro; var P : Tro);
var P : Tro
Begin
If L <> Nil then
Begin
P:=L; R:= P^ Next;
While N <> nil do;
Begin
If n^ gtri > P^.Gtri then
P:= R;
R := R^.Next;
End;
End;
End;
b, Hàm
Function Lonnhat ( L : tro; var P : Tro);
var P, R: Tro;
Begin
If L <> Nil then
Begin
P:=L; R:= P^ Next;
While N <> nil do;
Begin
If n^ gtri > P^.Gtri then
P:= R;
R := R^.Next;
End;
End;
Lonnhat:= P^.Next;
End;
Bài 4: đếm các nút lá trong danh sách
Function demnut ( L : tro) :integer;
var m := integer;
Begin
M:=0; P:= L While p<>Nil do Begin
Trang 7M:= m + 1;
P:= P^ Next;
End;
Demnut:=m;
End;
Bài 5: Tính giá trị trung bình của các nút:
Function demnut ( L : tro) :real;
var m := integer; s:= real;
Begin
M:=0; P:= L, S:=0;
While p<>Nil do
Begin M:= m + 1;
P:= P^ Next;
S:= S + P^.gtri;
End;
If m > 0 then trungbinh := S/m;
End;
Bài 6: Chèn một nút vào sau nút thứ n:
Procedure chen (var L : tro; P : Tro);
var P, Q : Tro; n, m : Integer;
Begin
Write (‘Nhập vị trí muốn chèn’);
Readln (n);
New (p);
P^ gtri := X;
P^ Next := nil;
If n:= 0 then
Begin
T^ Next: = L;
L:= P;
End;
Else
Begin
M:= 1; Q := L;
While (Q^ Next <> nil) and (m < n) do Begin Q:= Q^ Next; m := m +1; End;
if Q^ Next <> nil then
Writeln (‘có ít hơn n phần tử’);
Else
Begin
P^ Next := Q^ Next;
Q^ Next := P;
End;
End;
End;
Bài 7: xoá nút thứ n
Procedure xoá (var L : tro; n: Integer ); var P, Q : Tro; m : Integer;
Begin
If n:= 1 then Begin
P := L; L:= L^ next;
Trang 8Dispose (p);
End;
If n > 1 then
Begin
P := L; m := 1;
While ( m < n) and ( P^.next <> nil) do
Begin
M:= m + 1; q:= p;
P := P^ next;
End;
If P^.next := nil then
Writeln (‘Có ít hơn n phần tử’);
Else
Begin P^ Next := Q^ Next;
Dispose (p);
P:= Q ^ Next;
End;
End;
End;
Bài 8: Hoán đổi giá trị trong các nút sao cho khi duyệt danh sách ta được dãy số theo thứ tự tăng dần.
Procedure hoandoi (var L : tro);
var P, Q : Tro; m : Integer;
Begin
P:=L;
Repeat While P^ Next := nil do Begin
If R^ gtri < P^ gtri then Begin
M:= R^.Gtri;
R^ gtri = P^ gtri ; P^ gtri := m ; End;
R := R^.next;
End;
P := P^ next;
End;
Until P^ Next := nil;
End;
IV CÂY NHỊ PHÂN TÌM KIẾM
1 Viết chương trình tạo cây nhị phân cho trước rồi hiển thị nó theo thứ tự trước, sau.
-Procedure duyettruoc (T);
Begin
If T<> nil then
Begin
Write (T^.gtri);
Duyettruoc (T^ L);
Duyettruoc (T^ R);
End;
Trang 9-Procedure duyetsau (T);
Begin
If T<> nil then
Begin
Duyetsau (T^ L);
Duyetsau (T^ R);
Write (T^.gtri);
End;
End;
2 Viết chương trình tạo cây nhị phân tìm kiếm chứa các số nguyên nhập từ bàn phím trên một dòng rồi hiển thị
nó theo thứ tự giữa.
Procedure TaoNP (Var T := Tro);
Var x: Integer;
Begin
T:= Nil;
Write (‘Nhap day cac so nguyen tren mot dong);
While Not Eoln do
Begin
Readln (X);
Chennut (T, X);
End;
Write (‘duyetgiua’);
Duyetgiua (T);
End;
3 Đếm số nút Cành (đếm số toán tử) của cây.
*Function Dem canh (T);
If Rptr(T)=Lptr(T)=Nill then Return(0)
Else Return(1+Dem canh(Lptr(T)+Dem canh(Rptr(T));
*Không Đệ Quy:
Function Dem canh(T);
S:=Ø
Dem:=0;
If T≠ null then Spush(S,t);
While S≠ Ø Do
Begin
P:=Spop(S);
If (Lptr(P) ≠ null)or(Rptr(P) ≠ null) then
Dem:=Dem+1;
If Rptr(P) ≠ null then Spush(S, Rptr(P));
If Lptr(P) ≠ null then Spush(S, Lptr(P));
End;
Return(Dem);
4 Viết hàm đêm số nút của cây nhị phân cho trước
Function demnut (T : tro) : integer;
Var
Begin
P := T;
If T:= nil then demnut := 0;
Else demnut := 1 + demnut ( P^.L) +demnut (P^.R);
End;
5 Viết hàm tính chiều cao của một cây nhị phân cho trứơc.
Function Max (a,b :integer ) : integer;
Var
Begin
If a >b then Max := a else Max := b;
Trang 10Function Max (a,b :integer ) : integer;
Var
Begin
P:= T;
If P:= Nil then chieucao := 0;
Else
Chieucao := 1+Max(chieucao(P^.L),
chieucao (P^.R);
End;
6 Viết thủ tục hàm tính chiều cao và chiều sâu (còn gọi là mức) của một nút cho trước trong cây nhị phân tìm kiếm.
* Function chieucaonut (T: tro, X:integer ) : integer;
Var
Begin
P:= T;
While P <> nil do
Begin
If P^.gtri < X then P:= P^.R;
Else if P^.gtri > X then P:= P^.L;
Else chieucaonut := chieucao (p);
End;
End;
* Function chieusau (T: tro, X:integer ) : integer;
Var
Begin
P:= T;
If P := nil then chieusau := 1;
Else if P^.gtri := X then chieusau := 0;
Else if P^.gtri > X then
Chieusau := 1+ chieusau (P^ R, X);
Else Chieusau := 1+ chieusau (P^ L, X);
End;
7 Viết hàm đếm số nút lá trong cây nhị phân cho trước
Function demla (T: tro) : integer;
Var
Begin
P:= T;
If P := nil then demla := 0;
Else if (P^.L := Nil) and (P^.R :=nil);
Then demla :=1;
Else demla := demla (P^.L ) +demla (P^.R );
End;
8 Viết hàm đếm số nút bậc 2 trong cây nhị phân cho trước
Function nutbac2 (T: tro) : integer;
Var
Begin
P:= T;
If P := nil then SNB2:= 0
Else If T^.Left=Nil then SNB2:=SNB2(T^.Right)
Else If SNB2:=SNB2(T^.Left)
Trang 11Else SNB2:=1+SNB2(T^.Left)+SNB2(T^.Right);
Sonutbac2:=SNB2;
End;
9 Bổ sung một nút mới vào cây nhị phân.
Procedure bosung (Var T:Tronut; X:Integer);
Var Tròn,r,p,q:Tronut;
Begin
New(p);
p^.info:=X;
p^.Left:=p^.Right:=nil;
q:=T;
while q<>nil do
Begin r:=q;
if X<q^.info then q:=q^.Left else if X>q^.info then q:=q^.Right else if x=q^.info then
Begin write (‘Da ton tai’); exit;
End;
End;
If T=nil then T:=p Else if X<r^.info then r^.Left:=p
Else r^.Right:=p;
End;
V Cho đồ thị ko định hướng G = <V,E> với V= { 1,2,….,N} được lưu trữ trong ma trận kề A [ 1…n, 1…n]
với ý nghĩa A[i,j] = 1 nếu tồn tại cung i,j và A[i,j] = 0 nếu ko tồn tại cung i,j
1 Thủ tục thăm đồ thị theo chiều sâu.
Procedure Duyet sau (A:mang;n,v,w:integer);
Var
Begin
Write (A[v]);
KT[v]:=False;
For w:=1 to n Do
If (A[v,w]=1) and (KT[w]) then
Duyet sau(A,n,w);
End;
2.Xác định đồ thị cho trước có liên thông ko?
Function Lienthong (A:mang; n:integer) : boalean;
Var V: integer;
Begin
for := 1 to n do Kt [i] := true;
write (‘Nhap dinh xuat phat’);
readln (v);
Duyetsau (A,n,v);
for := 1 to n do
if kt [j] then lienthong := False;
Trang 12else := lienthong := true;
end;
3 Đếm số miền liên thông của đồ thị cho trước
Function Demlt (A:mang; n, v:integer) : boolean; Var V: integer;
Begin Dem := 01;
for := 1 to n do Kt [i] := true;
Duyetsau (A,n,v);
for := 1 to n do
if kt [j] then
Begin
Dem:= dem +1;
Duyetsau (A, n, J);
End;
Demlt := dem;
End;
4 Kiểm tra xem 2 đỉnh cho trước có liên thông ko?
Function kt (P,Q : integer) : Boolean;
Var
Begin
Kt := false;
For i:= 1 to n do Kt [i] := true;
For i:= 1 to n do
if (A[p,j] :=1) and kt [j] then begin
Kt := false;
If j := Q then Kt := true
Else KT := Kt (j, Q);
End;
End;
5 Kiểm tra một đồ thị có chu trình ko?
Function Chutrinh (P : integer) : Boolean;
Var
Begin
For i:= 1 to n do Kt [i] := true;
For i:= 1 to n do
if (A[p,j] :=1) and kt [j] then begin
A[p,j] := 0;
A[j,p] := 0;
Trang 13If kt (i,p) := True then
Chutrinh := true;
Else chutrin := false;
End;
End;
6 đồ thị có bao nhiêu cung:
Function socung (A:mang; n, v:integer) : boolean;
Var dem:= 0
Begin
for i:= 1 to n do
for j:= 1 to n do
if A[i,j] := 1 then Dem := Dem +1;
socung := dem div 2;
end;
7 Nếu đồ thị ko liên thông thì bổ sung thêm một số tối thiểu các cung để đồ thị liên thông.
Function Bosung ( Var A:mang; n:integer) : boalean;
Var V: integer;
Begin
for i:= 1 to n do Kt [i] := true;
if kt [j] then
begin
A[v,j] := 1;
A[j,v] := 1;
Bosung (A, n, J);
End;
End;