You are on page 1of 120

CHNG 2

SINH D LIU VO V RA
Hu ht cc bi ton tin u i hi d
liu vo v ra. Ngi ta thng dng ba
phng thc sinh v np d liu sau y:
Chng II. Sinh d liu vo v ra
1. Np d liu trc tip t bn phm.
Phng thc ny c dng khi d liu
khng nhiu.
2. Sinh d liu nh hm random (xem
chng 1). Phng thc ny nhanh chng
v tin li, nu kho t chc c th sinh
ngu nhin c cc d liu p ng c
mt s iu kin nh trc.
3. c d liu t mt tp, thng l tp
vn bn. Phng thc ny kh tin li khi
phi chun b trc nhng tp d liu phc
tp.
Kt qu thc hin chng trnh cng
thng c thng bo trc tip trn mn
hnh hoc ghi vo mt tp vn bn.
Bi 2.1. Sinh ngu nhin theo
khong
Sinh ngu nhin cho mng nguyn a n
phn t trong khong -M..M; M > 0.
c t
Ta vit th tc tng qut Gen(n,d,c) -
sinh ngu nhin n s nguyn trong khong
t d n c (d < c) (xem bi gii 1.4).
28
Chng II. Sinh d liu vo v ra
gii bi 2.1 ta ch cn gi
Gen(n,-M,M).
rng random(cd+1) bin thin
trong khong t 0 n c-d do
d+random(cd+1) s bin thin trong
khong t d n d+c-d = c.
(*------------------------
-----------------
sinh ngau nhien n so
nguyen trong khoang
d den c va ghi vao
mang a
--------------------------
--------------- *)
Procedure Gen(n,d,c:
integer);
var i,len: integer;
begin
randomize;
len := c-d+1;
for i:=1 to n do a[i]:=
d+random(len);
end;
(* Pascal *)
29
Chng II. Sinh d liu vo v ra
(*------------------------
------------------
Sinh ngau nhien cho
mang nguyen a
n phan tu trong khoang
-M..M; M > 0.
--------------------------
-----------------*)
program RGen;
uses crt;
const MN = 1000;
var a: array[1..MN] of
integer;
(*------------------------
--------------------
sinh ngau nhien n so
nguyen trong khoang
d den c va ghi vao mang
a
--------------------------
---------------- *)
Procedure Gen(n,d,c:
integer); t vit
procedure Xem(n: integer);
Hin th mng a, t vit
procedure Test;
30
Chng II. Sinh d liu vo v ra
var n: integer;
begin
n := 20;
{ sinh ngau nhien 20 so
trong khoang -8..8 }
Gen(n,-8,8);
Xem(n);
readln;
end;
BEGIN
Test;
END.
// C#
using System;
using
System.Collections.Generic
;
using System.Text;
namespace SangTao1
{
/*--------------------
------------------
* Sinh ngau
nhien n so
31
Chng II. Sinh d liu vo v ra
* trong khoang
d..c
*
--------------------------
---------*/
class RGen
{
static void
Main(string[] args)
{
Print(Gen(20,
-8, 8));
Console.ReadLi
ne();
}
static public int[]
Gen(int n, int d, int c)
{
Random r = new
Random();
int len = c-d+1;
int [] a = new
int[n];
for (int i = 0; i <
n; ++i)
32
Chng II. Sinh d liu vo v ra
a[i] = d +
r.Next(len);
return a;
}
static public void
Print(int [] a)
{
Console.WriteLine();
foreach (int x in a)
Console.Write(x + "
");
Console.WriteLine();
}
} // RGen
} // SangTao1
Bi 2.2. Sinh ngu nhin tng
Sinh ngu nhin n phn t c sp
khng gim cho mng nguyn a.
Thut ton
1. Sinh ngu nhin phn t u tin:
a[1] := random(n);
2. T phn t th hai tr i, tr c
sinh bng tr ca phn t st trc n cng
thm mt i lng ngu nhin:
33
Chng II. Sinh d liu vo v ra
(i = 2..n): a[i] := a[i - 1] + random(n),
do a[i] >= a[i - 1].
(* Pascal *)
(*------------------------
-------------------
Sinh ngau nhien cho
mang nguyen a
n phan tu sap khong
giam
--------------------------
-----------------*)
program IncGen;
uses crt;
const MN = 1000;
var a: array [1..MN] of
integer;
(*------------------------
----------------
Sinh ngau nhien day tang
gom n phan tu
--------------------------
---------------*)
procedure Gen(n: integer);
var i: integer;
begin
34
Chng II. Sinh d liu vo v ra
randomize;
a[1]:= random(5); {khoi
tao phan tu dau tien }
for i:= 2 to n do a[i]:=
a[i-1]+random(10);
end;
procedure Xem(n: integer);
t vit
procedure Test;
var n: integer;
begin
n := 200; { test voi 200
phan tu }
Gen(n); Xem(n); readln;
end;
BEGIN
Test;
END.
// C#
using System;
using
System.Collections.Generic
;
using System.Text;
namespace SangTao1
35
Chng II. Sinh d liu vo v ra
{
/*--------------------
-----------------
* Sinh ngau
nhien n so
* tao thanh day
khong giam
*
--------------------------
--------*/
class IncGen
{
static void
Main(string[] args)
{
Print(Gen(200)
);
Console.ReadLi
ne();
}
static public
int[] Gen(int n)
{
Random r = new
Random();
36
Chng II. Sinh d liu vo v ra
int [] a = new
int[n];
a[0] =
r.Next(5);
for (int i =
1; i < n; ++i)
a[i] =
a[i-1] + r.Next(10);
return a;
}
static public void
Print(int [] a) t vit
} // IncGen
} // SangTao1
Bi 2.3. Sinh hon v ngu nhin
Sinh ngu nhin cho mng nguyn a
mt hon v ca 1..n.
c t
Xut pht t hon v n v a = (1, 2,..., n)
ta i ch a[1] vi mt phn t tu (c
chn ngu nhin) a[j] s c mt hon v.
Ta c th thc hin vic i ch nhiu ln.
(* Pascal *)
37
Chng II. Sinh d liu vo v ra
(*-------------------------
----------------
Sinh ngau nhien cho
mang nguyen a
mot hoan vi cua 1..n
---------------------------
---------------*)
program GenPer;
const MN = 1000; { so
luong toi da }
Esc = #27; { dau
thoat }
BL = #32; { dau cach
}
var a: array[1..MN] of
integer;
(*-----------------------
Sinh du lieu
-----------------------*)
procedure Gen(n: integer);
var i,j,x: integer;
begin
{ Khoi tao hoan vi don
vi }
for i:= 1 to n do
a[i]:= i;
38
Chng II. Sinh d liu vo v ra
for i:= 1 to n do
begin
j := random(n)+1;
x := a[1]; a[1] :=
a[j]; a[j] := x;
end;
end;
procedure Xem(n: integer);
t vit
procedure Test;
var n: integer;
begin
randomize;
repeat {chon ngau nhien
kich thuoc n = 10..39}
n := random(30)+10;
Gen(n); Xem(n);
until ReadKey = Esc;
{ Nhan ESC de thoat }
end;
BEGIN
Test;
END.
// C#
using System;
39
Chng II. Sinh d liu vo v ra
using
System.Collections.Generic
;
using System.Text;
namespace SangTao1
{
/*--------------------
-------------
* Sinh ngau nhien
hoan vi
* 1..n
*
--------------------------
-----*/
class GenPer
{
static void
Main(string[] args)
{
Print(Gen(20))
;
Console.ReadLi
ne();
}
static public
int[] Gen(int n)
40
Chng II. Sinh d liu vo v ra
{
Random r = new
Random();
int[] a = new
int[n];
for (int i =
0; i < n; ++i)
a[i] =
i+1;
for (int i =
0; i < n; ++i)
{
int j =
r.Next(n);
int t =
a[0];
a[0] =
a[j]; a[j] = t;
}
return a;
}
static public void
Print(int [] a) t vit
} // IncGen
} // SangTao1
41
Chng II. Sinh d liu vo v ra
Bi 2.4. Sinh ngu nhin u
Sinh ngu nhin n phn t cho mng
nguyn a tho iu kin n phn t to
thnh k on lin tip c tng cc phn
t trong mi on bng nhau v bng
gi tr t cho trc.
Thut ton
1. Chn s lng cc phn t trong mi
on l random(n div k) + 1, khi
s lng cc phn t c pht sinh ngu
nhin s khng vt qu
k*(n div k) n
Sau ta s chnh sao cho s lng cc
phn t ng bng n.
2. Gi s a[d..c] l on th j cn c
sinh ngu nhin sao cho
a[d] + a[d + 1] + ...
+ a[c] = t
Ta sinh on ny nh sau:
2.1. Gn tr := t; { tr - gi tr
cn li ca tng }.
2.2. Gn tr ngu nhin 0..tr-1 cho
cc phn t a[d..(c - 1)]
42
Chng II. Sinh d liu vo v ra
(i = d..c ): a[i] :=
random(tr)
2.3. ng thi chnh gi tr cn li ca
tr:
tr := tr - a[i]
Ta c:
a[d] < t
a[d+1] < t - a[d]
a[d+2] < t - a[d+1] -
a[d]
...
a[c - 1] < t - a[d] -
a[d + 1] - ... - a[c -
2]
Chuyn v cc phn t a[*] trong biu
thc cui cng, ta thu c
a[d] + a[d + 1] + ... + a[c
1] < t
2.4. Ta t gi tr cn li ca tng ring
vo phn t cui on: a[c] := tr
s thu c a[d] + a[d + 1]
+ ... + a[c] = t.
(* Pascal *)
43
Chng II. Sinh d liu vo v ra
(*------------------------
-----------------
Sinh ngau nhien cho
mang nguyen a
n phan tu tao thanh k
doan lien tiep
co tong bang nhau
-----------------------------
-------------*)
program KGen;
uses crt;
const MN = 1000; {kich thuoc
toi da cua mang a}
Esc = #27; {dau thoat}
BL = #32; {dau cch}
var a: array[1..MN] of
integer;
(*---------------------------
Sinh du lieu
-----------------------------
*)
procedure Gen(n,k,t:
integer);
var i,j,p,tr,s: integer;
begin
44
Chng II. Sinh d liu vo v ra
if (k < 1) or (k > n) then
exit;
s := n div k;{s - so toi da
phan tu trong moi doan}
i := 0; {chi dan lien tuc
cho cac phan tu moi sinh}
for j := 1 to k do {sinh
doan thu j}
begin
tr := t;
for p := 1 to random(s) do
{ random(s)+1 = so phan tu
trong 1 doan }
begin
inc(i);
a[i] := random(tr);
tr := tr a[i]; {gia tri
con lai cua tong}
end;
inc(i); {i phan tu cuoi
cung cua doan j}
a[i] := tr;
end;
{bu 0 cho cac phan tu con
lai}
45
Chng II. Sinh d liu vo v ra
for i := i+1 to n do
a[i] := 0;
end;
procedure Xem(n: integer);
Hin th mng a, t vit
procedure Test;
var n,k: integer;
begin
randomize;
repeat
n := random(30) + 1;
k := random(8) + 1;
t := random(30)+10;
writeln('n = ',n,' k =
',k,' t = ',t);
Gen(n,k,t); Xem(n);
until ReadKey = Esc;
end;
BEGIN
Test;
END.
// C#
using System;
using
System.Collections.Generic;
46
Chng II. Sinh d liu vo v ra
using System.Text;
using System;
namespace SangTao1
{
class KGen
{
static void
Main(string[] args)
{
Random r = new
Random();
int n, k, t;
do
{
n =
r.Next(30) + 1;
t =
r.Next(30) + 1;
k = r.Next(8)
+ 1;
Console.Write
Line("\n n = " + n +
" k = "
+ k + " t = " + t);
Print(Gen(n,
k, t));
47
Chng II. Sinh d liu vo v ra
Console.Write("\
n Bam RETURN de tiep tuc: ");
} while
(Console.ReadLine() == "");
}
// sinh n phan tu
chia thanh k doan,
// moi doan co tong t
static public int[]
Gen(int n, int k, int t)
{
if (k < 1 || k > n)
return new int[0];
Random r = new
Random();
int[] a = new
int[n];
int s = n / k; // so
phan tu trong 1 doan
int i = 0;
for (int j = 0; j <
k; ++j)
{ // sinh doan thu j
int tr = t;
int endp =
r.Next(s);
48
Chng II. Sinh d liu vo v ra
for (int p = 0; p
< endp; ++p,++i)
{ a[i] =
r.Next(tr); tr -= a[i]; }
a[i++] = tr;
}
// dien 0 cho du n
phan tu
for (; i < n; ++i)
a[i] = 0;
return a;
}
static public void
Print(int[] a) t vit
} // KGen
} // SangTao1
Bi 2.5. Sinh ngu nhin t l
Sinh ngu nhin cho mng nguyn a c
n phn t to thnh hai on lin tip
c tng cc phn t trong mt on
gp k ln tng cc phn t ca on
kia.
Thut ton
49
Chng II. Sinh d liu vo v ra
1. Sinh ngu nhin tng t1 :=
random(n) + 1.
2. Tnh t2 := k*t1.
3. Gieo ng xu bng cch gi
random(2) xc nh tng no trong s
t1 v t2 c chn trc.
4. Sinh random(n div 2)+1 phn
t cho on th nht sao cho tng cc phn
t ca on ny bng t1 (xem bi 2.4).
5. Sinh nt cc phn t cho on th
hai sao cho tng cc phn t ca on ny
bng t2.
(* Pascal *)
program K2gen;
uses crt;
const MN = 1000;
var a: array[1..MN] of
integer;
(*------------------------
---
Sinh du lieu
--------------------------
---*)
50
Chng II. Sinh d liu vo v ra
procedure
Gen(n,k:integer);
var i,j,t1,t2:integer;
begin
if (k < 1) OR (k > n)
then exit;
t1 := random(n) + 1;
{tong mot doan; tong
doan con lai = k*t1 }
{chon ngau nhien doan co
tong lon dat truoc hay sau }
if random(2)= 0 then
t2 := k*t1
else
begin
t2 := t1; t1 := k*t2;
end;
i := 0; {sinh doan thu
nhat}
for j := 1 to random(n
div 2) do
begin
inc(i); a[i] :=
random(t1);
51
Chng II. Sinh d liu vo v ra
t1 := t1 a[i];
end;
inc(i); a[i] := t1;
while i < n do {sinh
doan thu hai }
begin
inc(i); a[i]:=
random(t2);
t2 := t2 a[i];
end;
a[n] := a[n] + t2;
end;
procedure Xem(n: integer);
t vit
procedure Test;
var n,k: integer;
begin
randomize;
repeat
n := random(30) + 1;
k := random(8) + 1;
write(' n = ',n,' k =
',k);
Gen(n,k); Xem(n);
52
Chng II. Sinh d liu vo v ra
until ReadKey = #27;
end;
BEGIN
Test;
END.
// C#
using System;
using
System.Collections.Generic;
using System.Text;
namespace SangTao1
{
class K2Gen
{
static void
Main(string[] args)
{
Random r = new
Random();
int n, k;
do
{
n =
r.Next(30) + 2;
53
Chng II. Sinh d liu vo v ra
k =
r.Next(8) + 1;
Console.Wri
teLine("\n n = " + n +
" k = " +
k);
int [] a =
new int [n];
int n1 =
Gen(a,n,k);
Print(a);
Test(a, n1,
k);
Console.Wri
te("\n Bam RETURN " +

" de tiep tuc: ");
} while
(Console.ReadLine() == "");
}
// Kiem tra ket qua
static void
Test(int[] a, int n1, int
k)
{
54
Chng II. Sinh d liu vo v ra
int t1 = 0;
for (int i = 0;
i < n1; ++i)
t1 += a[i];
Console.WriteLine("
\n Doan thu nhat: " +
"sum(a[0.." +
(n1 - 1) + "]) = " + t1);
int t2 = 0;
for (int i =
n1; i < a.Length; ++i)
t2 += a[i];
Console.WriteLine(
"\n Doan thu hai: " +
"sum(a["+n1+".."+
(a.Length - 1)+"]) = "+t2);
if ((t1 == k *
t2) || (t2 == k * t1))
Console.Wri
teLine("\n DUNG");
else
Console.WriteLine("\n
SAI");
}
55
Chng II. Sinh d liu vo v ra
static public int
Gen(int [] a, int n, int k)
{
Random r = new
Random();
int i = 0; //
phan tu thu i trong a
// n1 - so phan
tu trong doan 1
int n1 =
r.Next(n / 2) + 1;
int t1 = 0; //
tong doan 1
// sinh doan
thu 1
for (; i < n1;
++i) //
{
a[i] =
r.Next(10); t1 += a[i];
}
int t2 = k* t1;
int tt = t1;
56
Chng II. Sinh d liu vo v ra
// xac dinh
ngau nhien
// 0. t2 gap k
lan t1, hoac
// 1. t1 gap k
lan t2
if
(r.Next(2)==1)
{ // t1 gap k
lan t2
t1 = t2;
t2 = tt; a[i-1] += (t1-t2);
}
// sinh doan 2
for (; i < n; +
+i) //
{
a[i] =
r.Next(t2); t2 -= a[i];
}
a[n-1] += t2;
return n1;
}
57
Chng II. Sinh d liu vo v ra
static public void
Print(int[] a)
{
Console.WriteLi
ne();
foreach (int x
in a)
Console.Wr
ite(x + " ");
Console.WriteLi
ne();
}
} // K2Gen
} // SangTao1
Bi 2.6. Sinh ngu nhin tp tng
Sinh ngu nhin n s t nhin sp tng
v ghi vo mt tp vn bn c tn cho
trc.
Thut ton
Bn c xem trc tip chng trnh v
gii thch cch lm.
(* Pascal *)
58
Chng II. Sinh d liu vo v ra
(*------------------------
---------------
Sinh ngau nhien n so tu
nhien sap tang
va ghi vao tep van ban
co ten cho truoc
--------------------------
--------------*)
program FincGen;
uses crt;
const BL = #32; { dau cach
}
(*------------------------
---
Sinh du lieu
--------------------------
---*)
procedure Gen(fn: string;
n: integer);
var f: text; i: integer;
x: longint;
begin
assign(f,fn); {fn: file
name (ten tep)}
rewrite(f); randomize;
x := 0;
59
Chng II. Sinh d liu vo v ra
for i:= 1 to n do
begin
x := x+random(10);
write(f,x,BL);
{ moi dong trong file
chua 20 so }
if i mod 20 = 0 then
writeln(f);
end;
if i mod 20 <> 0 then
writeln(f);
close(f);
end;
procedure Test;
begin
Gen('DATA.INP',200);
write('Ket'); readln;
end;
BEGIN
Test;
END.
// C#
using System;
60
Chng II. Sinh d liu vo v ra
using
System.Collections.Generic
;
using System.Text;
using System.IO;
namespace SangTaoT1
{
class FincGen
{
static void
Main(string[] args)
{
string fn =
"Data.txt";
GenToFile(fn,
81);
Show(fn);
Console.ReadLine();
}
static public void
GenToFile(string fn, int
n)
{
StreamWriter f
= File.CreateText(fn);
61
Chng II. Sinh d liu vo v ra
Random r = new
Random();
int x =
r.Next(10);
for (int i =
0; i < n; ++i)
{
f.Write(x
+ " ");
// Moi
dong 20 so
if (i % 20
== 19) f.WriteLine();
x +=
r.Next(10);
}
if (n % 20 !=
19) f.WriteLine();
f.Close();
}
static public void
Show(string fn)
{
Console.WriteLin
e(File.ReadAllText(fn));
}
62
Chng II. Sinh d liu vo v ra
} // FincGen
} // SangTao1
Bi 2.7. Sinh ngu nhin tp cp
s cng
Sinh ngu nhin mt cp s cng c n
s hng v ghi vo mt tp vn bn c
tn cho trc.
Thut ton
1. Sinh ngu nhin s hng th nht
a[1] v cng sai d.
2. Sinh cc phn t a[i], i =
2..n
for i:=2 to n do a[i]:=
a[i1]+ d;
3. Ghi file
phc tp: n.
(* Pascal *)
program FCapCong;
uses crt;
const BL = #32;
procedure Gen(fn: string;
n: integer);
63
Chng II. Sinh d liu vo v ra
var f: text; i,d: integer;
x: longint;
begin
assign(f,fn);
rewrite(f);
randomize;
d := random(n div 4)+1;
{cong sai }
x := random(20);
write(f,x,BL);
for i:= 2 to n do
begin { mi dng ghi 20
s }
x:= x + d;
write(f,x,BL);
if i mod 20 = 0 then
writeln(f);
end;
if i mod 20 <> 0 then
writeln(f);
close(f);
end;
BEGIN
Gen('DATA.INP',200);
write('Ket'); readln;
END.
64
Chng II. Sinh d liu vo v ra
// C#
using System;
using
System.Collections.Generic;
using System.Text;
using System.IO;
namespace SangTao1
{
class FCapCong
{
static void
Main(string[] args)
{
string fn =
"Data.txt";
GenToFile(fn,
81);
Show(fn);
Console.ReadLine();
}
static public void
GenToFile(string fn, int n)
{
StreamWriter f
= File.CreateText(fn);
65
Chng II. Sinh d liu vo v ra
Random r = new
Random();
int s =
r.Next(n), d =
r.Next(10)+1;
for (int i = 0;
i < n; ++i)
{
f.Write(s +
" ");
if (i % 20
== 19) f.WriteLine();
s += d;
}
if (n % 20 !=
19) f.WriteLine();
f.Close();
}
static public void
Show(string fn)
{
Console.WriteLine(
File.ReadAllText(fn));
}
} // FcapCong
} // SangTao1
66
Chng II. Sinh d liu vo v ra
Bi 2.8. Sinh ngu nhin mng i
xng
Sinh ngu nhin cc gi tr ghi vo
mt mng hai chiu a[1..n, 1..n] sao
cho cc phn t i xng nhau qua
ng cho chnh, tc l
a[i, j] = a[j, i], 1 i, j N.
Thut ton
1. Sinh ngu nhin cc phn t trn
ng cho chnh a[i,i],i=1..n.
2. Sinh ngu nhin cc phn t nm
pha trn ng cho chnh a[i,j],
i=1..n, j=i+1..n ri ly i
xng: a[j,i]:= a[i,j].
phc tp: n
2
.
(* Pascal *)
program GenMatSym;
uses crt;
const MN = 100;
var a = array[1..MN,1..MN]
of integer;
procedure Gen(n: integer);
var i, j: integer;
67
Chng II. Sinh d liu vo v ra
begin
randomize;
for I := 1 to n do
begin
a[i,i] := random(n);
for j := i+1 to n do
begin
a[i,j]:=random(n);
a[j,i]:=a[i,j];
end;
end;
end;
procedure Xem(n: integer);
var i, j: integer;
begin
writeln;
for i:= 1 to n do
begin
writeln;
for j:= 1 to n do
write(a[i,j]:4);
end;
end;
BEGIN
Gen(20); Xem(20);
readln;
68
Chng II. Sinh d liu vo v ra
END.
// C#
using System;
using
System.Collections.Generic
;
using System.Text;
namespace SangTao1
{
class GenMatSym
{
static void
Main(string[] args)
{
int n = 20;
int[,] a =
Gen(n);
Print(a, n);
Console.WriteL
ine("\n Fini ");
Console.ReadLi
ne();
}
static public int
[,] Gen(int n)
69
Chng II. Sinh d liu vo v ra
{
int[,] a = new
int[n, n];
Random r = new
Random();
for (int i =
0; i < n; ++i)
{
a[i, i] =
r.Next(100);
for (int
j=i+1; j<n; ++j)
{ a[i, j]
= r.Next(100);
a[j, i]
= a[i, j];
}
}
return a;
}
// hin th mng a[0..(n-
1]
static public void
Print(int [,] a,int n) t
vit
70
Chng II. Sinh d liu vo v ra
} // GenMatSym
} // SangTao1
Bi 2.9. S cao h
cao ca mt s t nhin l tng cc
ch s ca s . Sinh ton b cc s
t nhin c ti a ba ch s v c
cao h cho trc. Ghi kt qu vo mt
tp vn bn c tn cho trc.
Thut ton
Bi ton ny c cch pht biu khc v
tng qut nh sau: c n cc nc dung tch
9 tha mi cc. Cho mt bnh ng h tha
nc. Hy xc nh mi phng n chia
nc vo cc cc.
Ta xt li gii vi n = 3. Ta c h = 0..27.
1. Cc s cn tm y c dng y = abc, a + b
+ c = h v a bin thin t mina n maxa,
trong mina l lng nc t nht trong
cc u tin a, maxa l lng nc ln nht
trong cc a. Nu y hai cc b v c, mi
cc 9 tha nc th lng nc cn li s l
ti thiu cho cc a. Ngc li, nu tng cng
ch c h < 9 tha nc th lng nc ti a
trong cc a phi l h. Ta c
71
Chng II. Sinh d liu vo v ra
if h 18 then mina := 0
else mina := h-18;
if h 9 then maxa := 9
else maxa := h;
2. Vi mi a = mina..maxa ta tnh
2.1. bc = h-a (bin bc cha tng
cc ch s b v c).
2.2. Gii bi ton nh vi n = 2.
if bc 9 then minb := 0
else minb := bc-9;
if bc 9 then maxb := 9
else maxb := bc;
2.3. Vi mi b = minb..maxb ta
tnh
y = 100*a + 10*b +
(bc b).
Ghi s ny vo tp.
(* Pascal *)
(*-
=-------------------------
----
Sinh cac so khong qua 3
chu so
72
Chng II. Sinh d liu vo v ra
co do cao h va ghi vao
tep fn
--------------------------
------*)
program HGen;
uses crt;
function
Gen(fn:string;h:integer):
integer;
var f: text;
a,b,bc,mina,maxa,minb,maxb
: integer;
x,y,d: integer;
begin {tong 3 chu so
toi da la 27, toi thieu la
0 }
if (h < 0) OR (h > 27)
then exit;
assign(f,fn);
rewrite(f);
d:= 0; {dem so luong cac
so do cao h}
if h <= 18 then mina :=
0 else mina := h-18;
if h >= 9 then
maxa := 9 else maxa := h;
73
Chng II. Sinh d liu vo v ra
for a := mina to maxa do
begin
x := 100*a;
bc := h-a;
if bc <= 9 then minb := 0
else minb := bc-9;
if bc >= 9 then
maxb := 9 else maxb := bc;
for b := minb to maxb
do
begin
y := x + 10*b + (bc -
b);
write(f,y:4);
inc(d); { Ghi moi
dong 10 so }
if d mod 10 = 0 then
writeln(f);
end;
end;
close(f);
Gen := d;
end;
procedure Test;
var n: integer;
begin
74
Chng II. Sinh d liu vo v ra
n :=
Gen('HEIGHT.NUM',10);
write('Tong cong ,n,'
so');
readln;
end;
BEGIN
Test;
END.
// C#
using System;
using
System.Collections.Generic;
using System.Text;
using System.IO;
namespace SangTao1
{
class HGen
{
static void
Main(string[] args)
{
string fn =
"HGen.txt";
int h = 10;
75
Chng II. Sinh d liu vo v ra
Console.WriteLine("\
n File " + fn);
Console.WriteLine("
H = " + h);
int d = Gen(fn,10);
Test(fn,d);
Console.WriteLine("\
n Fini ");
Console.ReadLine();
}
static public int
Gen(string fn, int h)
{
int a, b, mina,
maxa, minb, maxb,
bc, x, y, d = 0;
StreamWriter f =
File.CreateText(fn);
mina = (h <= 18) ? 0
: h-18;
maxa = (h <= 9) ?
h : 9;
for (a = mina; a <=
maxa; ++a)
{
76
Chng II. Sinh d liu vo v ra
x = 100*a; bc = h
- a;
minb = (bc <=
9) ? 0 : bc-9;
maxb = (bc >=
9) ? 9 : bc;
for (b = minb; b
<= maxb; ++b)
{
++d; y=x+10*b+
(bc-b); f.Write(y+" ");
if (d % 10 ==
0) f.WriteLine();
}
}
f.Close();
return d;
}
// Doc lai file de
kiem tra
static public void
Test(string fn,int d)
{
Console.WriteLin
e("\n Tong cong " +
77
Chng II. Sinh d liu vo v ra

d + " so");
Console.WriteLin
e(File.ReadAllText(fn));
}
} // HGen
} // SangTao1
Ch
1. C th gii bi ton trn bng phng
php vt cn dng ba vng for nh sau:
for a := 0 to 9 do
for b := 0 to 9 do
for c := 0 to 9
do
if a+b+c = h
then
w
rite(f,a,b,c,#32);
2. Phng php vt cn i hi 10*10*10
= 1000 ln duyt trong khi vi h = 10 ch
c 63 s tho mn iu kin ca u bi.
Dng phng php sinh ta nhn c ng
63 s cn tm, khng phi duyt tha s
no.
78
Chng II. Sinh d liu vo v ra
Bi 2.10. Tp cc hon v
Vi mi s n cho trc trong khong
1..9, ghi vo mt tp vn bn c tn
cho trc ton b cc hon v ca 1..n.
Hon v c sp xp tng theo th t
t in, th d 21345 < 21354.
Thut ton
1. Khi to v ghi hon v nh nht l
hon v n v s [1..n] =
(1,2,...,n).
2. Gi s ta ghi c hon v s[1.n]
vo tp. Hon v tip theo c to t s
thng qua hm Next nh sau:
2.1 Tm im gy: Tm ngc t s[n]
tr v trc n v tr i u tin tho
iu kin s[i] < s[i + 1].
- Nu khng tm c i tc l s l hon
v ln nht, s[1..n] = (n,n-
1,..,1). t tr false cho hm Next
v dng thut ton. Next = false c
ngha l khng tn ti hon v st sau hon
v s hay s l hon v ln nht.
- Nu tm c: thc hin bc 2.2.
79
Chng II. Sinh d liu vo v ra
2.2 Tm im vt: Tm ngc t
s[n] tr v trc n v tr j u
tin tho iu kin s[j] > s[i].
2.3. i ch s[i] vi s[j].
2.4. Lt: o li trt t ca dy s[i
+ 1..n] ta s thu c hon v
ng st sau hon v s.
3. t tr true cho hm Next. Next
= true c ngha l tm c hon v st
sau hon v s.
Ch
Khi khi tr hon v n v ta s dng
phn t s[0] = 0 lm lnh canh. Nh vy,
khi duyt ngc tm im gy ta khng
phi kim tra gii hn mng. Thay v vit
i := n-1;
while (i > 0) and (s[i] >
s[i+1]) do i:= i-1;
ta ch cn vit
i := n-1;
while (s[i] > s[i+1]) do i
:= i-1;
Hm Next c m t nh sau:
80
Chng II. Sinh d liu vo v ra
function Next(n:
integer): Boolean;
vari, j, t: integer;
begin
Next := false; i := n-1;
while (s[i] > s[i+1]) do
i:= i-1;
if i = 0 then exit;
{ s[i] < s[i+1], i l
im gy }
j := n; { Tm im vt
a[j] > a[i] }
while (s[j] < s[i]) do j
:= j-1;
{ i ch s[i] , s[j] }
t:= s[i]; s[i]:= s[j];
s[j]:= t;
{ Lt s[i+1..n] } i:=
i+1; j:= n;
while i < j do
begin
t:= s[i];s[i]:= s[j];
s[j]:= t;
i:= i+1; j:= j-1;
end;
Next:= true;
81
Chng II. Sinh d liu vo v ra
end;
Th d, vi n = 8, gi s ta ghi c
hon v s = 74286531, khi hon v st
sau s s c xy dng nh sau:
C C O

C C O

S 7 4 2 8 6 5 3 1
Tm im
gy: i = 3, v
s[3] < s[4]
7 4 2 8 6 5 3 1
Tm im
vt: j = 7, v
s[7] > s[3]
7 4 2 8 6 5 3 1
i ch im
gy v im
vt: s[3]
s[7]
7 4 3 8 6 5 2 1
Lt on
s[4..8]
7 4 3 1 2 5 6 8
Quy trnh hot ng ca hm Next
74286531 74312568
(* Pascal *)
program GenAllPer;
82
Chng II. Sinh d liu vo v ra
{$B-}
uses crt;
const MN = 9; {max n} BL =
#32; {dau cach}
vars: array[0..MN] of
integer;
function Next(n:
integer): Boolean; t vit
procedure Gen(n: integer);
const
fn = 'HoanVi.dat'; {ten
tep ket qua}
var
d: longint; {dem so
luong hoan vi}
i: integer;
f: text; {tep ket qua}
begin
if (n < 1) or (n > MN)
then exit;
assign(f,fn);
rewrite(f);
d := 0; {dem so hoan vi}
{Sinh hon v n v.
t lnh canh s[0] = 0}
83
Chng II. Sinh d liu vo v ra
for i := 0 to n do
s[i]:= i;
repeat
d := d+1; {Ghi hoan vi
thu d, s vao tep}
for i:= 1 to n do
write(f, s[i], BL);
writeln(f);
until not (next(n));
writeln(f,' Tong cong
',d, ' hoan vi');
close(f);
end;
BEGIN
Gen(5); write('fini');
readln;
END.
// C#
using System;
using
System.Collections.Generic
;
using System.Text;
using System.IO;
namespace SangTao1
84
Chng II. Sinh d liu vo v ra
{
class GenAllPer
{
static void
Main(string[] args)
{
string fn =
"HoanVi.txt";
int d =
Gen(fn,5);
Test(fn,d); //
Xem kt qu
Console.WriteL
ine("\n Fini ");
Console.ReadLi
ne();
}
// Sinh cc hon
v, ghi file fn
static public int
Gen(string fn, int n)
{
if (n < 1 | n
> 9) return 0;
int d = 0; //
dem so hoan vi d = n!
85
Chng II. Sinh d liu vo v ra
StreamWriter f
= File.CreateText(fn);
int[] a = new
int[n + 1];
for (int i=0;
i <= n; ++i) a[i]=i;
do { // Ghi
file
for (int
i=1; i <= n; ++i)
f.Wr
ite(a[i] + " ");
f.WriteLi
ne(); ++d;
} while
(Next(a));
f.Close();
return d;
}
static bool
Next(int[] a)//Hon v tip
{
int i, j, t, n
= a.Length-1;
for (i=n-1;
a[i] > a[i+1];--i) ;
86
Chng II. Sinh d liu vo v ra
if (i == 0)
return false;
for (j = n;
a[j] < a[i]; --j) ;
t = a[i]; a[i]
= a[j]; a[j] = t;
for (++i, j =
n; i < j; ++i, --j)
{ t = a[i];
a[i] = a[j]; a[j] = t; }
return true;
}
static public void
Test(string fn, int d)
{
Console.WriteL
ine("\n Tong cong "
+
d + " so");
Console.WriteL
ine(File.ReadAllText(fn));
}
} // GenAllPer
} // SangTao1
87
Chng II. Sinh d liu vo v ra
Bi 2.11. c d liu t tp vo
mng bit hai kch thc
c d liu kiu nguyn t mt tp vn
bn vo mt mng hai chiu.
Tp c cu trc nh sau:
- Hai s u tin n, m l kch thc
ca mng gm n dng v m ct.
- Tip n l cc d liu ghi lin tip
nhau theo tng dng ca mng.
- Cc s cch nhau t nht mt du
cch.
Th d:
2 3 -1 4 5 3 7 1
cho bit mng c n = 2 dng v m = 3
ct vi d liu nh sau:
-1 4 5
3 7 1
c t
Ta vit hm Doc cho gi tr true nu
c c d liu. Ch rng d liu vo l
ng do khng cn kim tra tnh ng
n ca chng. Nh vy Doc s cho gi tr
false trong trng hp khng m c
88
Chng II. Sinh d liu vo v ra
file, do ghi sai ng dn hoc file
khng c to lp t trc.
Ch th {$I-} yu cu h thng ch ghi
nhn ch khng bt cc li vo/ra, tc l
khng dng s thc hin chng trnh.
Bin h thng IORESULT s ghi nhn s
hiu li. Nu IORESULT=0 th thao tc
vo ra khng sinh li, ngc li, nu
IORESULT 0 tc l c li.
Ch th {$I+} yu cu h thng bt mi
li vo/ra. Nh vy, dng lnh
{$I-} reset(f); {$I+}
s c hiu nh sau:
Thot tin ta yu cu h thng b ch
bt li vo/ra {$I-}. Sau thc hin
lnh m tp c reset(f).Tip n
t li ch bt li {$I+}.
(* Pascal *)
uses crt;
const MN = 100;
var a: array[1..MN,1..MN]
of integer;
m,n: integer;
89
Chng II. Sinh d liu vo v ra
Function Doc(fn: string):
Boolean;
var
f: text;
i, j: integer;
begin
Doc := false;
assign(f,fn);
{$I-} reset(f); {$I+}
if IORESULT <> 0 then
exit; {khng m c
file}
read(f,n,m);{doc kich
thuoc n va m cua mang }
for i := 1 to n do
for j:= 1 to m do
read(f,a[i, j]);
close(f);
Doc := true;
end;
procedure Xem(n,m:
integer); Hin th mng 2
chiu, t vit
BEGIN
if Doc('DATA.INP') then
Xem(n,m)
90
Chng II. Sinh d liu vo v ra
else write('Khong mo
duoc tep ');
readln;
END.
// C#
using System;
using
System.Collections.Generic
;
using System.Text;
using System.IO;
namespace sabgTao1
{
class DocMang2Chieu
{
static void
Main(string[] args)
{
string fn =
"Data.inp";
int n = 0, m =
0;
int [,] a =
Doc(fn, ref n, ref m);
if (a != null)
91
Chng II. Sinh d liu vo v ra
{
PrintInput(fn);
Print(a, n, m);
}
else
Console
.WriteLine("\n " +
"
Khong mo duoc file " +fn);
Console.WriteL
ine("\n Fini ");
Console.ReadLi
ne();
}

static public
int[,] Doc(string fn,

ref int n, ref int m)
{
if (!
File.Exists(fn)) return
null;
// Cac dau
ngan
92
Chng II. Sinh d liu vo v ra
char[] cc
= new char[]
{
' ', '\n', '\t', '\r' };
// Mo tep ten
fn doc, tch, dong tep
string[] ss =
(File.ReadAllText(fn)).
Split(cc,
StringSplitOptions.
RemoveEmptyEntries)
;
// Chuyn
sang mng 1 chiu int [] c
int [] c =
Array.ConvertAll(ss,
new
Converter<string,int>(int.
Parse));
n = c[0]; m =
c[1];
int[,] a = new
int[n, m];
int k = 2;
for (int i =
0; i < n; ++i)
93
Chng II. Sinh d liu vo v ra
for (int j
= 0; j < m; ++j)
a[i,j]
= c[k++];
return a;
}
static void
Print(int[,] a, int n, int
m)
Hin th mng 2
chiu a, t vit
static public void
PrintInput(string fn)
c li file fn,
t vit
} // DocMang2Chieu
} // sangTao1
Gii thch
Trong cc my tnh hin i, b nh
trong RAM ln c th cha ton b
d liu trong hu ht cc file input v th
vi mi trng C# .NET bn nn c mt
ln d liu t cc file ny. Hm Doc cho ra
mng nguyn hai chiu. Nu file khng tn
94
Chng II. Sinh d liu vo v ra
ti, hm cho ra gi tr null. Bn cn chun
b trc file input vi tn Data.inp v ghi
vo th mc BIN\DEBUG trong Project
hin hnh. Nu ghi file vo th mc khc
th trong tham bin fn phi ghi chi tit
ng dn, th d
D:\\MyDIR\\Data.inp. Khi vit
ng dn, thay v vit du \ ta phi
vit hai du , tc l \\ v bn thn
du \ trong ng vai tr bo hiu k t
ng st sau n l k t iu khin, th d,
\n biu th du xung dng. Bn cng
c th vit du i mc @ cnh ng dn
ch th rng bn mun dng mt du
\ thay v hai du, th d,
@D:\MyDIR\Data.inp
Lnh File.ReadAllText(fn) m
file vi ng dn fn c ton b d liu
mt ln vo mt bin string sau t ng
ng file.
Lnh
Split(cc,StringSplitOptions.R
emoveEmptyEntries)
95
Chng II. Sinh d liu vo v ra
tch cc n v trong bin string ghi vo
bin string[] ss ng thi b i cc
du trng m t trong bin cc, bao gm du
cch , du xung dng \n, du tab
\t v du kt RETURN \r, cui
cng loi b cc n v rng, tc l cc
string khng cha k t no (Length =
0).
Lnh int[] c =
Array.ConvertAll(ss,
New
Converter<string,int>(int.Par
se));
chuyn cc string trong ss sang dng s
nguyn v ghi vo mng nguyn (mt chiu)
c. n y ton b d liu trong file input
fn c c v ghi vo mng nguyn c.
Cc mng trong C# c nh ch dn t 0
n Length-1. Theo iu kin ca u bi
c[0] cha gi tr n, c[1] cha gi tr m,
t c[2] tr i cha ln lt cc gi tr trn
cc dng ca mng hai chiu.
96
Chng II. Sinh d liu vo v ra
Bi 2.12. c d liu t tp vo
mng bit mt kch thc
c d liu kiu nguyn t mt tp vn
bn vo mt mng hai chiu a[n,m] cho
bit mt kch thc m (s ct).
Tp c cu trc nh sau:
- S u tin ghi s lng ct m ca mng
tc l s phn t trn mt dng.
- Tip n l cc d liu ghi lin tip
nhau theo tng dng ca mng.
- Cc s cch nhau t nht mt du cch.
Th d:
3 -1 4 5 3 7 1
s c b tr vo mng n = 3 dng, m
= 3 ct nh sau:
-1 4 5
3 7 1
Thut ton
1. M tp.
2. c gi tr u tin vo bin m: s
lng ct ca ma trn.
3. Mi ln c xong mt dng ta tng
con m dng (n) thm 1.
97
Chng II. Sinh d liu vo v ra
Ch
Do c th gp dng trng nn ta cn s
dng hm SeekEof. Hm SeekEof
duyt tip t v tr hin thi ca con tr tp,
b qua cc du trng (gm du cch, du
kt thc dng, du u dng, du nhy
TAB), nu gp du ht tp th cho gi tr
true, ngc li, nu sau khi b qua
cc du trng m cha gp du ht tp th
cho gi tr false.
(* Pascal *)
uses crt;
const MN = 100;
var a:
array[1..MN,1..MN] of
integer;
m,n: integer;
Function Doc(fn: string):
Boolean;
var f: text; j: integer;
begin
Doc := FALSE;
assign(f,fn);
{$I-} reset(f); {$I+}
98
Chng II. Sinh d liu vo v ra
if IORESULT <> 0 then
exit;
read(f,m); {m: so luong
cot}
n := 0; {n: so luong
dong}
while NOT SeekEof(f) do
begin
inc(n);
for j := 1 to m do
read(f,a[n,j]);
end;
close(f);
Doc := TRUE;
end;
procedure Xem(n,m:
integer); t vit
BEGIN
if Doc('DATA.INP') then
Xem(n,m)
else write('Khong mo
duoc tep ');
readln;
END.
Ch
99
Chng II. Sinh d liu vo v ra
Cn chun b trc d liu v ghi trong
tp vn bn DATA.INP, th d:
DATA.INP
3 -1 4 5 3 7 1
// C#
using System;
using
System.Collections.Generic;
using System.Text;
using System.IO;
namespace SangTao1
{
class DocMang2
{
static void
Main(string[] args)
{
string fn =
"Data.inp";
int n = 0, m =
0;
int [,] a =
Doc(fn, ref n, ref m);
100
Chng II. Sinh d liu vo v ra
if (a != null)
{
PrintInput(f
n);
Print(a, n,
m);
}
else
Console.WriteLine("\n " +
" Khong
mo duoc file " + fn);
Console.WriteLi
ne("\n Fini ");
Console.ReadLin
e();
}

static public
int[,] Doc(string fn,

ref int n, ref int m)
{
if (!
File.Exists(fn)) return
null;
101
Chng II. Sinh d liu vo v ra
int [] c =
Array.ConvertAll(
File.Read
AllText(fn).
Split(new
char[] {'
','\n','\t','\r'},
StringSplitOpti
ons.RemoveEmptyEntries),
new
Converter<string,int>(int.P
arse));
int k = 0;
m = c[k++]; n =
(c.Length-1)/m;
int[,] a = new
int[n, m];
for (int i = 0;
i < n; ++i)
for (int j
= 0; j < m; ++j)
a[i,j]
= c[k++];
return a;
}
102
Chng II. Sinh d liu vo v ra
static void Print(int
[,] a, int n, int m)
Hin th mng 2
chiu a[n,m], t vit
static public void
PrintInput(string fn)
Hin th file fn;
t vit
} // DocMang2
} // SangTao1
Gii thch
Bit s ct ca mng l m ta c th tnh
ra s dng n ca mng theo cng thc
n = (c.Length-1) / m, trong
c.Length cha s lng cc gi tr
c t file input, bao gm gi tr m
v n.m gi tr ca mng, tc l
c.Length = n.m+1.
Bi 2.13. c d liu t tp vo
mng i xng
c d liu kiu nguyn t mt tp vn
bn c tn fn vo mt mng hai chiu
i xng.
103
Chng II. Sinh d liu vo v ra
Tp c cu trc nh sau:
- S u tin ghi s lng ct (v ng
thi l s lng dng) ca mng.
- Tip n l cc d liu ghi lin tip
nhau theo na tam gic trn tnh t
ng cho chnh.
- Cc s cng dng cch nhau t nht
mt du cch.
Th d: 3 1 2 3 4 6 8 s c
b tr vo mng 3 3 nh sau:
1 2 3
2 4 6
3 6 8
Thut ton
1. M tp.
2. c gi tr u tin vo bin n: s
lng ct v dng ca ma trn vung i
xng.
3. Vi mi dng i ta c phn t trn
ng cho chnh ca dng a[i, i], sau
ta c cc phn t nm bn phi a[i, i],
tc l a[i, j] vi j = i + 1..n ri ly i xng
bng php gn a[j, i]:= a[i, j].
104
Chng II. Sinh d liu vo v ra
(* Pascal *)
uses crt;
const MN = 100;
var a:
array[1..MN,1..MN] of
integer;
n: integer; { kich
thuoc mang }
Function Doc(fn: string):
Boolean;
var f: text; i, j:
integer;
begin
Doc := FALSE;
assign(f,fn);
{$I-} reset(f); {$I+}
if IORESULT <> 0 then
exit;
read(f,n);
for i := 1 to n do
begin
read(f,a[i,i]);
for j := i+1 to n do
begin
105
Chng II. Sinh d liu vo v ra
read(f,a[i,j]);
a[j,i]:= a[i,j];
end;
end;
close(f); Doc:= TRUE;
end;
procedure Xem(n,m:
integer); t vit
BEGIN
if Doc('DATA.INP') then
Xem(n,n)
else write('Khong mo
duoc tep ');
readln;
END.
// C#
using System;
using
System.Collections.Generic
;
using System.Text;
using System.IO;
namespace SangTao1
{
class MangDoiXung
106
Chng II. Sinh d liu vo v ra
{
static void
Main(string[] args)
{
string fn =
"Data.inp";
int n = 0;
int [,] a =
Doc(fn, ref n);
if (a != null)
{
PrintInput(
fn);
Print(a,
n);
}
else
Console.WriteLine("\n " +
"
Khong mo duoc file "+fn);
Console.Wri
teLine("\n Fini ");
Console.Rea
dLine();
}
107
Chng II. Sinh d liu vo v ra
static public
int[,] Doc(string fn,

ref int n)
{
if (!
File.Exists(fn)) return
null;
int [] c =
Array.ConvertAll(

File.ReadAllText(fn).
Split(new char[]
{' ','\n','\t','\r'},
StringSplitOpti
ons.RemoveEmptyEntries),
new
Converter<string,int>(int.
Parse));
int k = 0; n =
c[k++];
int[,] a = new
int[n, n];
for (int i =
0; i < n; ++i)
108
Chng II. Sinh d liu vo v ra
for (int j
= i; j < n; ++j)
a[i,j]
= a[j,i] = c[k++];
return a;
}
static void
Print(int [,] a, int n)
Hin th mng 2
chiu a[n,n], t vit
static public void
PrintInput(string fn)
Hin th file fn,
t vit
} // MangDoiXung
} // SangTao1
Bi 2.14. m tu
Mt tp vn
bn c tn fn
c ghi s
mt vng
bin hnh ch
nht chiu
ngang 250 k
1 1 1 1 0 0 1 1 1
0 0 0 0 0 0 1 1 1
1 1 0 0 0 0 0 0 0
1 1 0 0 1 1 0 0 1
5 tu
109
Chng II. Sinh d liu vo v ra
t, chiu dc (s dng) khng hn ch.
Trn bin c cc con tu hnh ch nht
cha cc k t 1, vng nc c biu
th qua cc k t 0. Bit rng cc con
tu khng dnh nhau. Hy m s
lng tu.
V d, hnh bn c 5 tu.
Thut ton
V cc tu khng dnh nhau nn ta phn
bit cc tu qua mi tu, tc l gc A - gc
Ty-Bc ca tu. Ta c,
s lng tu = s lng mi tu
Mi tu l im nhn gi tr 1 v nu
bc mt bc sang tri hoc ln trn s
ln b hoc ri xung bin.
Sau khi m tp ta c v x l tng dng
vn bn y v so snh n vi dng x x l
trc . Nu y l dng u tin, tc l
dng nm st b Bc, ta khi tr cho x vi
110
Chng II. Sinh d liu vo v ra
250 ks t 0 tc l ta loi tr trng hp
bc ln b Bc. Khi x l y, ta ch tch
ring trng hp tu nm st b Ty, tc l
xt ring y[1]. Sau mi ln x l dng y ta
copy dng y sang x v lun gi cho x c
chiu di ti a 250 k t nh yu cu ca
u bi.
(* Pascal
*)
program
Ships;
{$B-}
uses crt;
const MN =
250;
boong = '1';
nuoc = '0';
Function Dem(fn: string):
integer;
var
A
0 0 0 0 0
B
0 1 1 1 1 1
0 1 1 1 1 1
D
0 0 0 0 0
C
Con tu ABCD
111
Chng II. Sinh d liu vo v ra
f: text; d,i: integer;
x,y: string;{x:dong
tren, y:dong duoi }
begin
Dem := 0; assign(f,fn);
{$I-} reset(f); {$I+}
if IORESULT <> 0 then
exit;
x := nuoc;
for i := 1 to 8 do
x:= x+x; {x = 00...0}
d := 0;
while NOT EOF(f) do
begin
readln(f,y);
if
(y[1]=boong)AND(x[1]=nu
oc) then d:=d+1;
for i:=2 to length(y)
do
if (y[i]=
boong) AND (y[i-1]= nuoc)
AND (x[i]=
nuoc) then d:=d+1;
x := y;
end;
112
Chng II. Sinh d liu vo v ra
Dem := d;
end;
BEGIN
n:= Dem('TAU.INP');
if n=0 then
write('Khong mo
duoc tep/khong co tau')
else write('Tong so tau:
',n);
readln;
END.
// C#
using System;
using
System.Collections.Generic
;
using System.Text;
using System.IO;
namespace SangTao1
{
class Ships
{
static public
string fn = "Tau.inp";
113
Chng II. Sinh d liu vo v ra
static public
string gn = "Tau.out";
static public char
boong = '1';
static public char
nuoc = '0';
static void
Main(string[] args)
{
Save(Count());
Test();
Console.WriteL
ine("\n Fini ");
Console.ReadLi
ne();
}
static public int
Count()// dem tau
{
StreamReader f
= File.OpenText(fn);
string x = new
string(nuoc,251);
string y;
string empty =
"";
114
Chng II. Sinh d liu vo v ra
int d = 0;
while
((y=(f.ReadLine()).Trim())

!= empty)
{
d +=
Scan(x, y); x = y;
}
f.Close();
return d;
}
// Snh dng tren
x vi dng di y
static public int
Scan(string x, string y)
{
int d = 0;
if
((y[0]==boong)&&(x[0]==nuo
c)) ++d;
for (int i = 1;
i < y.Length; ++i)
if
((y[i]==boong)&&(y[i-
1]==nuoc)
115
Chng II. Sinh d liu vo v ra
&&
(x[i]==nuoc)) ++d;
return d;
}
static public void
Save(int d) // ghi file
{ File.WriteAllText(
gn, d.ToString()); }
static public void
Test()
{
Console.WriteLine
("\n" +
File.Re
adAllText(fn) + "\n");
Console.WriteLine
("\n" +
File.Re
adAllText(gn) + "\n");
}
} // Ships
} // SangTao1
Bi 2.15. Sp on
116
Chng II. Sinh d liu vo v ra
Trong mt tp vn bn cha nhng
on ct ra t mt trc s. Mi on c
dng <d, c> trong "<" c th l mt
trong hai k t ( hoc [, > c th l mt
trong hai k t ) hoc], d v c l cc
biu thc dng x hoc x + y hoc x*y
vi x v y l nhng s t nhin. Ta lun
c d c. Chiu di ca on <d, c> l
hiu c - d. Hy sp xp cc on tng
theo chiu di v ghi chng vo mt tp
vn bn theo ng dng thc c c
ca mi on. C th thm, bt mt s
du cch trong v ngoi cc on. Trn
mi dng ca tp lun lun cha trn
mt s on.
Th d cho d liu vo trong file input
Doan.inp l:
[2+1,7) (4,4*3) (5,6]
Sau khi sp ta c kt qu sau trong
file output Doan.out:
(5,6] [2+1,7) (4,4*3)
Thut ton
117
Chng II. Sinh d liu vo v ra
Ta m t cu trc ca mi on nh
sau:
mo so1[toan1 so2] , so3[toan2 so4]
trong :
mo l mt trong hai du m ngoc:
( hoc [.
so1, so2, so3 v so4 l cc s t
nhin xut hin trong thnh phn ca
on.
toan1 v toan2 l du cc php ton
(+, *), nu c trong thnh phn
ca on.
dong l mt trong hai du ng
ngoc: ) hoc].
Trong m t trn, chng ta s dng k
php [*] ch ra thnh phn * c th b
qua.
Nu thnh phn th i (i = 1..2) ca on
khng c du php ton, th cng khng c
ton hng th hai, tc l thnh phn c
dng l mt s t nhin th ta t toan[i] =
BL (du cch).
Nu s th i khng xut hin trong
on, ta t so[i] = 0.
118
Chng II. Sinh d liu vo v ra
Th d:
on m
o
s
o
1
Toa
n1
s
o
2
s
o
3
Toa
n2
s
o
4
do
ng
[2+10,
7*6)
[ 2 + 1
0
7 * 6 )
[2+10,
7)
[ 2 + 1
0
7 BL 0 )
(2,7+5
]
( 2 BL 0 7 + 5 ]
Ngoi ra ta thm mt thnh phn len
xc nh chiu di ca on. len ca mi
on c tnh theo cng thc sau
len = TriCuoi-TriDau
TriCuoi = so3 Toan2 so4, nu
Toan2 l du '+' hoc '' v
TriCuoi = so3, nu Toan2 =
BL.
Tng t,
TriDau = so1 Toan1 so2, nu
Toan1 l du '+' hoc '' v
TriDau = so1, nu Toan1 =
BL.
119
Chng II. Sinh d liu vo v ra
Ta s dng cu trc bn ghi biu din
d liu cho mi on:
type
MangSo = array[1..4] of
integer; {4 toan hang}
MangToan = array[1..2] of
char; {2 toan tu +,*}
KieuDoan = record
mo: char;
dong: char;
so: MangSo;
Toan: MangToan;
len: integer;
end;
Cc on c c s c ghi dn vo
mng a vi bin m s phn t n:
type MangDoan =
array[0..1000] of KieuDoan;
var a: MangDoan; n:
integer;
Khi th tc tnh chiu di len ca mi
on s c ci t nh sau:
procedure LenSeg(i:
integer);
120
Chng II. Sinh d liu vo v ra
var dau, cuoi: integer;
begin
with a[i] do
begin
dau := so[1];
if Toan[1]='+' then
dau := dau+so[2]
else if Toan[1]='*'
then dau:=dau*so[2];
cuoi:=so[3];
if Toan[2]='+' then
cuoi:=cuoi+so[2]
else if Toan[2]='*'
then cuoi:=cuoi*so[2];
end;
len := cuoi-dau;
end;
Cu trc with x do T cho php ta
thc hin thao tc T trn cc thnh phn ca
bn ghi x m khng phi vit li phn tip
u x.
c cc on t tp ta s dng mt
my trng thi nh sau. Hy tng tng
mt bn b bt kn, do bn phi dng tay
121
Chng II. Sinh d liu vo v ra
nhn bit tng k t trong tp vn bn.
Mi ln bn s mt k t c no ri da
vo k t bn xc nh cc th tc cn
thc hin nhn bit tng i tng.
Mun vy ta s dng mt bin gi l bin
trng thi q vi mc ch ghi nhn cc tnh
hung gp v trn c s xc nh cc
thao tc cn thit. Gi q l bin trng thi.
Trong qu trnh c v x l tp input ta c
th gp nm trng thi nh sau:
q = 0: Trng thi d tm u on: Nu
gp k t m u mt on, c th l nu
gp k t c = '(' hoc c = '[' th cn
to mt on mi nh sau:
- Tng ch dn ghi nhn on mi:
n := n + 1;
- Ghi nhn k t m u on:
a[n].mo:= c;
- Khi tr mng s: a[n].so :=
(0, 0, 0, 0);
- Khi tr mng du cc php ton:
a[n].Toan:= (BL, BL);
- Chuyn qua trng thi q := 1 l
trng thi tm c so[1].
0: if c in['(','['] then
122
Chng II. Sinh d liu vo v ra
begin
n:=n+1; a[n].mo:=c;
a[n].so:=KhoiTriSo;
a[n].Toan:=KhoiTriToa
n;
q:= 1;
end;
Cc bin KhoiTriSo v
KhoiTriToan c khai bo v gn tr
khi u nh sau:
const
KhoiTriSo: MangSo =
(0,0,0,0);
KhoiTriToan: MangToan =
(BL,BL);
q = 1: Trng thi tm c s th nht,
so[1]: trng thi ny, nu gp ch s th
ta ghp thm ch s vo so[1], nu gp
du php ton th ta hiu l thnh phn th
nht ca on l mt biu thc dng:
so[1] Toan[1] so[2]
Ta ghi nhn du php ton vo trng
Toan[1] v chuyn qua trng thi q = 2
c s th hai. Nu gp du phy (,) l
123
Chng II. Sinh d liu vo v ra
du ngn gia hai thnh phn ca on ta
chuyn qua trng thi q = 3 c s
u tin ca thnh phn th hai, tc l c
so[3].
1: if c in ChuSo then
DocSo(n,1)
else if c in PhepToan then
begin a[n].Toan[1]:=c;
q:=2; end
else if c=',' then q:=3;
Th tc DocSo(i,j) nhn thm 1
ch s ghp vo bin
a[i].so[j].
q = 2: c s th hai, so[2]: trng thi
ny, nu gp ch s th ta ghp thm ch s
vo so[2], nu gp du phy l du
ngn gia hai thnh phn ca on ta
chuyn qua trng thi q = 3 c s u
tin ca thnh phn th hai, tc l c
so[3].
2: if c in ChuSo then
DocSo(n,2)
else if c =',' then q:=3;
124
Chng II. Sinh d liu vo v ra
q = 3: c s th ba, so[3]: trng thi
ny, nu gp ch s th ta ghp thm ch s
vo so[3], nu gp du php ton th
ta hiu l thnh phn th hai ca on l
mt biu thc dng:
so[3] Toan[2] so[4]
Ta ghi nhn du php ton vo trng
Toan[2] v chuyn qua trng thi q = 4
c s th t, so[4], nu gp k t c =
')' hoc c = ']' th ta hiu l kt
thc mt on, ta gi th tc KetDoan
thc hin cc thao tc sau:
- Ghi nhn k t ng on:
a[n].dong:= c.
- Tnh chiu di ca on: LenSeg(n);
- Chuyn qua trng thi q = 0 tip
tc vi on tip theo, nu cn.
procedure KetDoan;
begin
a[n].dong:=c; LenSeg(n);
q:=0;
end;
on chng trnh th hin trng thi q
= 3 khi s nh sau:
125
Chng II. Sinh d liu vo v ra
3: if c in ChuSo then
DocSo(n,3)
else if c in PhepToan
then
begin a[n].Toan[2]:=c;
q:=4 end
else if c in[')',']']
then KetDoan;
q = 4: c s th t, so[4]: trng thi
ny, nu gp ch s th ta ghp thm ch s
vo so[4], nu gp k t c = ')'
hoc c = ']' th ta hiu l kt thc
mt on, ta gi th tc KetDoan.
4: if c in ChuSo then
DocSo(n,4)
else if c in[')',']']
then KetDoan;
c tp xong ta dng th tc qsort sp
cc on tng dn theo chiu di. Sau khi
sp ta ghi cc on vo tp gn theo cc
trng.
(* Pascal *)
{$B-}
program Segments;
126
Chng II. Sinh d liu vo v ra
uses crt;
const
fn = 'DOAN.INP'; {Tep
input}
gn = 'DOAN.OUT';{Tep
output}
MN = 1000; {So luong
toi da cac doan}
BL = #32;{Dau cach}
ChuSo = ['0'..'9'];
PhepToan = ['+','*'];
type
MangSo = array[1..4] of
integer;
MangToan = array[1..2]
of char;
KieuDoan = record
mo: char; {dau mo
ngoac}
dong: char; {dau
dong ngoac}
so: MangSo; {4 so
trong doan}
127
Chng II. Sinh d liu vo v ra
Toan: MangToan;
{2 phep toan}
len: integer;
{chieu dai doan}
end;
MangDoan = array[0..MN]
of KieuDoan;
const
KhoiTriSo: MangSo =
(0,0,0,0);
KhoiTriToan: MangToan =
(BL,BL);
var
f,g:text;
a: MangDoan;
c: char;{ky tu dang
xet}
n: integer;{chi so doan
dang xet}
q: integer;{bien trang
thai}
(*------------------------
---------
128
Chng II. Sinh d liu vo v ra
Cac trang thai q = 0:
do tim dau doan
1: doc so[1]
2: doc so[2]
3: doc so[3]
4: doc so[4]
--------------------------
---------*)
procedure LenSeg(i:
integer); t vit
procedure KetDoan; t vit
(*------------------------
-----------------
Them 1 chu so vao so
thu j cua doan i
--------------------------
----------------*)
procedure DocSo(i,j:
integer);
begin
a[i].so[j]:=a[i].so[j]
*10+(ord(c)-ord('0'))
end;
129
Chng II. Sinh d liu vo v ra
(*------------------------
--------------
Doc cac doan
--------------------------
-------------*)
procedure doc;
begin
assign(f,fn); reset(f);
q:=0; n:=0;
while not eof(f) do
begin
read(f,c);
case q of
0: if c in['(','[']
then
begin
n:=n+1;
a[n].mo:=c;

a[n].so:=KhoiTriSo;

a[n].Toan:=KhoiTriToan;
q:=1;
end;
130
Chng II. Sinh d liu vo v ra
1: if c in ChuSo
then DocSo(n,1)
else if c in
PhepToan then
begin
a[n].Toan[1]:=c; q:=2 end
else if c=','
then q:=3;
2: if c in ChuSo
then DocSo(n,2)
else if c =','
then q:=3;
3: if c in ChuSo
then DocSo(n,3)
else if c in
PhepToan then
begin

a[n].Toan[2]:=c; q:=4;
end
else if c
in[')',']'] then KetDoan;
4: if c in ChuSo
then DocSo(n,4)
131
Chng II. Sinh d liu vo v ra
else if c in
[')',']'] then KetDoan;
end; { case }
end; { while }
close(f);
end;
procedure
qsort(d,c:integer);
var i,j,m: integer;
x: KieuDoan;
begin
i:=d; j:=c; m:=a[(i+j)
div 2].len;
while i<=j do
begin
while a[i].len < m do
i:=i+1;
while a[j].len > m do
j:=j-1;
if i<=j then
begin
x:=a[i]; a[i]:=a[j];
a[j]:= x;
i:=i+1; j:=j-1;
132
Chng II. Sinh d liu vo v ra
end;
end;
if d < j then qsort(d,j);
if i < c then qsort(i,c);
end;
procedure Ghi;
var i: integer;
begin
assign(g,gn); rewrite(g);
for i:=1 to n do
with a[i] do
begin
if Toan[1]<>BL then
write(g,mo,
so[1],Toan[1],so[2])
else write(g,mo,
so[1]);
if Toan[2]<>BL
then
write(g,',',so[3],T
oan[2],so[4],dong,BL)
else
write(g,',',so[3],dong,BL)
;
133
Chng II. Sinh d liu vo v ra
{ moi dong viet 10
doan }
if i mod 10 = 0 then
writeln(g);
end;
close(g);
end;
BEGIN
Doc; qsort(1,n); Ghi;
END.
// C#
using System;
using System.IO;
using System.Collections;
namespace SangTao1
{
class SapDoan
{
static public string fn
= "Doan.inp";
static public string gn
= "Doan.out";
static public string s;
// du lieu vao
134
Chng II. Sinh d liu vo v ra
static public Doan[] d
= new Doan[5000]; // cac doan
static public int n =
0; // so luong doan
static public char Ket
= '#';
static void
Main(string[] args)
{
s =
File.ReadAllText(fn) +
Ket.ToString();
Console.WriteLine("\
n Du lieu " +
"truoc
khi xu li:\n " + s);
n = DocDoan();
Console.WriteLine("\
n Tong cong " + n + " Doan");
Console.WriteLine(n)
; Printd();
QSort(d, 0, n-1);
Console.WriteLine("\
n Da sap: "); Printd();
Ghi(); XemLai();
135
Chng II. Sinh d liu vo v ra
Console.WriteLine("\
n Fini ");
Console.ReadLine();
}
static public void
XemLai()
{
Console.WriteLine("
\n Kiem tra lai:\n");
Console.WriteLine("
\n Input:\n" +
File
.ReadAllText(fn));
Console.WriteLine("
\n Output:\n" +
Fi
le.ReadAllText(gn));
}
static public int
DocDoan()
{
int n = -1;
int q = 0; // trang
thai
int i = 0; // bien
tro trong s
136
Chng II. Sinh d liu vo v ra
int dau, cuoi;
for (; s[i] != Ket;
++i)
{
switch(q)
{
case 0: // Tim
dau doan
if
(GapMo(s[i]))
{
++n;
d[n] = new Doan();
d[n]
.Mo = s[i]; q = 1;
}
break;
case 1: // Doc
so1
if
(GapSo(s[i]))
d[n]
.So1 = DocSo(ref i);
else if
(GapToan(s[i]))
137
Chng II. Sinh d liu vo v ra
{d[
n].Toan1 = s[i]; q = 2;}
else if
(s[i]==',') q = 3;
break;
case 2: // Doc
so2
if
(GapSo(s[i]))
d[n].
So2 = DocSo(ref i);
else if
(s[i]==',') q = 3;
break;
case 3: // Doc
so3
if
(GapSo(s[i]))
d[n
].So3 = DocSo(ref i);
else if
(GapToan(s[i]))
{

d[n].Toan2 = s[i]; q = 4;
}
138
Chng II. Sinh d liu vo v ra
else if
(GapDong(s[i]))

q = 5;
break;
case 4: // Doc
so4
if
(GapSo(s[i]))
d[n]
.So4 = DocSo(ref i);
else if
(GapDong(s[i]))

q = 5;
break;
case 5: // Xong
1 doan
d[n].Do
ng = s[--i];
dau =
d[n].So1;
if
(d[n].Toan1 == '+')
d
au += d[n].So2;
139
Chng II. Sinh d liu vo v ra
else if
(d[n].Toan1 == '*')

dau *= d[n].So2;
cuoi =
d[n].So3;
if
(d[n].Toan2 == '+')
c
uoi += d[n].So4;
else if
(d[n].Toan2 == '*')

cuoi *= d[n].So4;
d[n].Le
n = cuoi-dau;
Console
.Write("\n Doan "+

n + ". ");
d[n].Pr
int(); q = 0; break;
}
} // endfor
return (++n);
}
140
Chng II. Sinh d liu vo v ra
static public bool
GapSo(char c)
{ return (c >= '0' && c
<= '9'); }
static public bool
GapMo(char c)
{ return (c == '(' ||
c== '['); }
static public bool
GapDong(char c)
{ return (c == ')' ||
c== ']'); }
static public bool
GapToan(char c)
{ return (c == '+' ||
c== '*'); }
static public int
DocSo(ref int i)
{
int m = 0;
do
{ m = m * 10 + s[i+
+] - '0';
} while
(GapSo(s[i]));
--i;
141
Chng II. Sinh d liu vo v ra
return m;
}
static public void
Printd()
{ for (int i = 0;i < n;
++i) d[i].Print(); }
static public void
Ghi()
{
StreamWriter g =
File.CreateText(gn);
for (int i = 0; i <
n; ++i) d[i].FWrite(g);
g.Close();
}
static public void
QSort(Doan[] d,int s, int e)
{
int i = s, j = e, m =
d[(i+j)/2].Len;
Doan t;
while (i <= j)
{
while (d[i].Len <
m) ++i;
142
Chng II. Sinh d liu vo v ra
while (d[j].Len >
m) --j;
if (i <= j)
{
t = d[i]; d[i] =
d[j]; d[j] = t;
++i; --j;
}
}
if (s < j)
QSort(d,s,i);
if (i < e)
QSort(d,i,e);
}
} // SapDoan
public class Doan
{
public char Mo;
public char Dong;
public int So1;
public int So2;
public int So3;
public int So4;
public char Toan1;
public char Toan2;
143
Chng II. Sinh d liu vo v ra
public int Len;
public Doan()
{
Mo = '<'; Dong =
'>';
So1 = So2 = So3 =
So4 = 0;
Toan1 = Toan2 =
'#';
Len = 0;
}
public void
FWrite(StreamWriter g)
{
g.Write(Mo.ToStri
ng());
if (Toan1 != '#')
g.Write(So1 +
Toan1.ToString() + So2);
else
g.Write(So1);
g.Write(",");
if (Toan2 != '#')
g.Write(So3 +
Toan2.ToString() + So4);
144
Chng II. Sinh d liu vo v ra
else
g.Write(So3);
g.WriteLine(Dong.
ToString());
}
public void Print()
{
Console.Write(Mo.
ToString());
if(Toan1!='#')
Console.Write(S
o1+Toan1.ToString()+So2);
else
Console.Write(So1);
Console.Write(","
);
if(Toan2!='#')
Console.Write(S
o3+Toan2.ToString()+So4);
else
Console.Write(So3);
Console.WriteLine
(Dong.ToString()+

" Len = "+Len);
} // Print
145
Chng II. Sinh d liu vo v ra
} // Doan
} // SangTao1
146

You might also like