//
Tài liệu chuyên Tin 10 – Chương I

Dữ liệu kiểu số nguyên


I / Loại : Thường dùng 5 loại chính


T/T Tên Miền giá trị Kích thước
1 Byte 0..255 1 Byte
2 ShortInt -128 .. 127 1 Byte
3 Interger -32768 .. 32767 2 Byte
4 Word 0 .. 65535 2 Byte
5 LongInt -2147483648..2147483647 4 Byte


II / Các cách biểu diễn số nguyên


1 – Dạng thập phân : Dùng các kí tự ‘0’ .. ‘9’
2 – Dạng nhị phân : Dùng 2 kí tự ‘0’ và ’1’
3 – Dạng Hecxa : Dùng các kí tự ‘0’,..’9’, và các chữ ‘A’,’B’,..,’F’
4 – Dạng cơ số n : Dùng n kí tự là ‘0’,..,’9’,’A’,..’F’,…,’Z’,…

Thí dụ :

5 = 1*2 2 + 0*2 1 + 1+ 2 0 5 trong hệ nhị phân là : 101
15 = 1*2 3 +1*2 2 + 1*2 1 + 1+ 2 0 15 trong hệ nhị phân là : 11111
150 = 1*2 7 +1*2 4 + 1*2 2 + 1+ 2 1 150 trong hệ nhị phân là : 10010110

150= 9*16 1 + 6*16 0 150 trong hệ Hecxa là 96
255=15*16 1 + 15*16 0 255 trong hệ Hecxa là FF

Lưu ý : Nếu có x = 0111000011011001 ( Dạng nhị phân )thì kể từ phải qua trái ta nói :
Bít 0 của x là 1
Bít 1 của x là 0
Bít 2 của x là 0
Bít 3 của x là 1
……………………..
Bít 15 của x là 0 ( Bít bêntrái nhất )

Thực hành : Muốn chuyển một số x ( Thí dụ nguyên dương kiểu Integer, ở dạng thập phân ) sang dạng n-phân ta tiến hành như sau :

Biểu diễn x dưới dạng :
x= a 15 * N 15 + a 14 * N 14 + .. + a 3 * N 3 + a 2 * N 2 + a 1 * N 1 + a 0 * N 0
Khi đó dạng N-phân của x là :
a15 a14 a13 … a3 a2 a1 a0 .

Một trong nhiều phương pháp tiến hành là sơ đồ sau đây :

x N
a0 T1 N
a1 T2 N
a2 ……….. T3 N
……
a i-3 T i-2 N
a i-2 T i-1 N
a i-1 T i N
a i 0

Trong hệ N- phân x được biểu diễn là ai a i-1 ai-2 …..a2 a1a0
150 : 2
0 75 : 2
1 37 : 2
1 18 : 2
0 9 : 2
1 4 : 2
0 2 : 2
0 1 : 2
0 0

Số x trong hệ nhị phân được biểu diễn là 10010110 ( Gồm các số dư lấy theo thứ tự ngược từ dưới lên )


III / Các phép toán với số nguyên


1 ) Các phép toán cộng,trừ,nhân,div( lấy thương nguyên ) ,mod ( lấy dư ). Cho kết quả là số nguyên .
2 ) Phép chia ( / ) cho kết quả là số thực . Thí dụ : 10/ 2 là giá trị kiểu thực
3 ) Phép so sánh 2 số : lớn hơn ( > ) , nhỏ hơn ( < ) , không lớn hơn ( = ) , bằng nhau ( = ) và không bằng nhau ( )
4 ) Phép nhân số nguyên dương x với luỹ thừa bậc N của 2 : x SHL N
5 ) Phép chia số nguyên dương x choluỹ thừa bậc N của 2 : x SHR N
6 ) Các phép toán xử lý trên các Bits của 2 số nguyên dương :

AND : 1 and 1 = 1 0 and 1 = 0 1 and 0 = 0 0 and 0 = 0
OR : 1 or 1 = 1 0 or 1 = 1 1 or 0 = 1 0 or 0 = 0
XOR : 1 xor 1 = 0 0 xor 1 = 1 1 xor 0 = 1 0 xor 0 = 0
NOT : Not 1 = 0 Not 0 = 1

Thí dụ :

x := 5 ; { 0101 }
y := 12; { 1100 }
___________________
x and y sẽ bằng 4 { 0100 }
x or y sẽ bằng 13 { 1101 }
x xor y sẽ bằng 9 { 1001 }

6 ) Phép Not trên số nguyên :

Not x = – ( X+1)

Thí dụ Not 5 = – 6
Từ đây suy ra định nghĩa số đối của số nguyên dương :

– x = ( Not x ) + 1

Vì thế trong hệ nhị phân người ta qui định nếu số x ( kiểu Integer ) có bit 15 bằng 1 thì x là số âm , ngược lại bít 15 bằng 0 thì x là số dương.
Cho x=5 { x = 0000000000000101 }
Ta có
Not x = 1111111111111010
1 = 0000000000000001
—————————————————–
– x = (Not x) +1 = 1111111111111011

Ta thử kiểm tra x + (-x) có bằng 0 hay không ?

x = 0000000000000101
-x = 1111111111111011
————————————-
x + (-x) = 0000000000000000
Vậy định nghĩa số đối của x như trên không dẫn đến điều vô lý !

Vài nhận xét đặc biệt

1 ) X OR X = X
2 ) X XOR X = 0
3 ) Nếu X AND (1 SHL k ) = 1 SHL k thì Bít k của X là 1, ngược lại bít này bằng 0

IV / Một số hàm với đối số nguyên

1) Random(N) Cho kết quả là số nguyên ngẫu nhiên trong đoạn [0,N-1]
Trước khi gọi hàm này , cần gọi thủ tục khởi động bộ tạo số ngẫu nhiên : Randomize;
2) Odd(N) Cho kết quả kiểu Boolean . Nếu Odd(N) bằng True thì N là số lẻ , ngược lại N là số chẵn .
3) Abs(N) Cho trị tuyệt đối của số nguyên N .


V / Một vài bài toán mẫu


Bài 1 : Cho số nguyên dương x dạng thập phân , hãy đổi sang dạng nhị phân .
Bài 2 : Cho số nguyên dương x dạng thập phân , hãy đổi sang dạng Hecxa .

Giải bài 1 :
Cách 1 :

Uses	Crt;
Var		x   	: integer;
		B	: Array[1..16] of Integer;
Procedure Taonhiphan( x : Integer);
		Var 	k : Integer;
Begin
		FillChar(B,Sizeof(B),0);
		k := 0;
		While x>0 do
			 Begin
				  Inc(k);
				  B[k] 	:= x mod 2;
				  x	:= x div 2;
			 End;
		For k := 16 downto 1 do Write(B[k]);
		Writeln;
End;
BEGIN
	Clrscr;
	For x := 1 to MaxInt do Taonhiphan(x);
	Readln
END.

Cách 2 : Lập bảng phương án các luỹ thừa của cơ số N


Uses   	Crt;
Const  	A	: Array[1..16] of LongInt=(1,2,4,8,16,32,64,128,256,512,1024,
				2048,4096,8192,16384,MaxInt+1);
Var		x	: Integer;
		k	: Byte;
Procedure   Taonhiphan(x : Integer);
		Begin
			  k	:= 15;
			  While (x>0) do
			  Begin
					While A[k]>x do
						Begin
						Write('0');
						Dec(k);
						End;
					Write('1');
					x	:= x-A[k];
					Dec(k);
			 End;
			 While k>0 do
			Begin
	 		  Write('0');
			  Dec(k);
			End;
			 Writeln;
		End;
BEGIN
		Clrscr;
		For x:= 1 to MaxInt do Taonhiphan(x);
		Readln
END.

Cách 3 Lấy giá trị của x từ các ô nhớ , hiện lên màn hình


Uses	Crt;
Var	x : Integer;
Procedure Taonhiphan(x : Integer);
	 Var 	k : Byte;
Begin
	 For k:=15 downto 0 do
		If  (x and ( 1 Shl k))= (1 Shl k) then Write('1') Else Write('0');
	 Writeln;
End;
BEGIN
	Clrscr;
	For x:=1 to MaxInt do Taonhiphan(x);
	Readln
END.

Giải bài 2 :
Cách 1 : Lập bảng giá trị các luỹ thừa của cơ số 16


Uses   	Crt;
Const  	A	: Array[0..3] of LongInt=(1,16,256,4096);
	B	: Array[1..15] of Char=('1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
Var	x	: LongInt;
	k	: Integer;
Procedure   TaoHecxa(x : LongInt);
	Var p : Byte;
		Begin
		  	k	:= 3;
			While (x>0) do
				Begin
					While A[k]>x do Begin  Write('0'); Dec(k);End;
					If k>=0 then
						Begin
							p 	:= x div A[k];
							Write(B[p]);
							x	:= x-p*A[k];
							Dec(k);
						End;
				End;
				While (k>=0) do  Begin  Write('0');  Dec(k);End;
				Writeln;
		End;
BEGIN
		Clrscr;
		x := 90000;
		TaoHecxa(x);
		Readln
END.

Cách 2 : Dựa vào các hàm xử lý Byte


Uses	Crt;
Const 	A	: Array[0..15] of char ='0123456789ABCDEF';
Var	x	: Integer;
Procedure   He16(x:Integer);
	 Begin
			Write(x,': ','$');
			Write(A[Hi(x) shr 4]);
			Write(A[(Hi(x) and $F)]);
			Write(A[Lo(x) shr 4]);
			Write(A[(Lo(x) and $F)]);
			Writeln;
	 End;
BEGIN
		  Clrscr;
		  For x:=0 to MaxInt do	He16(x);
		  Readln;
END.

Bài về nhà


1 ) Chuyển đổi 1 số nguyên dương từ hệ cơ số thứ nhất sang hệ cơ số thứ hai ( các cơ số này nhỏ hơn 32 )
2 ) Biểu diễn số nguyên âm sang hệ nhị phân
3 ) Biểu diễn số nguyên không âm có không quá 104 chữ số dưới dạng hệ cơ số 3
4 ) Cho 3 số nguyên không âm N1,N2,N3 . Định nghĩa trạng thái của chúng là số G=N1 xor N2 xor N3 . Hãy giảm số nào trong 3 số này , và giảm bao nhiêu để trạng thái mới của 3 số bằng 0 .
5 ) Bài tập nâng cao :
Trò chơi NIM với 3 đống sỏi như sau :
Cho 3 đống sỏi có số sỏi tương ứng là N1,N2,N3 . Hai người chơi lần lượt thay nhau bốc sỏi bớt đi từ 3 đống sỏi này theo qui tắc :
+ Có thể bốc từ 1 đống bất kỳ trong 3 đống , số sỏi bốc đi cũng tuỳ ý ( từ 1 đến hết số sỏi hiện còn của đống đó ) . Ai không còn sỏi bốc người đó thua cuộc . Lập trình trò chơi giữa người và máy sao cho máy có khả năng thắng nhiều nhất nếu máy đi trước .
Gợi ý :
Nhận thấy : Thế chơi cuối cùng sau khi người thắng đi xong là trạng thái 0 (= 0 xor 0 xor 0) , do đó sau khi bốc : trạng thái bằng 0 là điều kiện cần để thắng .
Nếu đến lượt máy bốc , trạng thái khác 0 thì máy phải bốc sao cho trạng thái bằng 0
Nếu đến lượt máy bốc , trạng thái đã bằng 0 rồi thì máy phải bốc 1 quân vu vơ để kéo dài trò chơi , đợi vận may do người kia sau khi đi sẽ mang lại cho máy ( họ tạo trạng thái khác 0 cho máy trước khi máy đi ). Tất nhiên nếu người chơi cũng biết qui luật thì máy đành chịu thua và vận may chỉ mỏng manh như trận đấu bóng đá xẩy ra cơ hội hậu vệ đội bạn sút vào lưới của họ !


Phần bài chữa


Bài 1 :

Uses    crt;
Const   Max 	= 34;
	H	: String = '0123456789ABCDEFGHIKLMNOPQRSTUVXYZ';
Var     c1,c2,so :  Longint;
	n      	 :  String;
Function Cosomin(S:String):Byte;
   Var i : Byte; ch : Char;
   Begin
		ch := '0';
		For i:=1 to length(s) do
			If s[i]>ch then ch := s[i];
		Cosomin:= Pos(ch,H);
   End;
Procedure Nhap;
	Var i : Byte;
	Begin
		 Repeat
			   Write('Cho biet co so thu nhat ');
			   {$i-}  Readln(c1);  {$i+}
		 Until (Ioresult=0) and (c1>=1) and (c1=cosomin(n)) and (c11) and (c20) do
		 Begin
			  p	:= H[n mod c2+1]+p;
			  n	:= n div c2;
		 End;
		 Doi10_C2:=p;
	End;
BEGIN
	 Repeat
		Clrscr;
		Nhap;
		So := DoiC1_10(n);
		Writeln(N,'[cs ',c1,']=',Doi10_C2(so),'[cs ',c2,']');
		Write(#10#13,'ESC : Thoat    .    Phim khac : tiep tuc ');
	 Until Readkey=#27;
END.

Bài 2 :


Uses	Crt;
Var	x : Integer;
Function Cong(a,b : String) : String; {Cộng 2 xâu chữ số trong hệ nhị phân }
	Var  i,p,nho 	: Byte;
		 Kq	: String;
	Begin
		 nho := 0; kq  := '';
		 For i := 16 downto 1 do
			  Begin
				p 	:= ord(a[i])+ord(b[i])-96 + nho;
				nho 	:= p div 2;
				kq  	:= char(p mod 2 +48)+ kq;
			  End;
		Cong := kq;
	End;
Procedure Taonhiphan_soam(x : Integer);
	 Var 	k 	: Byte;
		h,p 	: String;
Begin
	 h :='0000000000000001';
	 p :='0000000000000000';
	 For k:=15 downto 0 do
		If  (x and ( 1 Shl k))= (1 Shl k) then
			p[16-k] := '0' Else p[16-k] := '1';
	 Writeln(Cong(p,h));
End;
BEGIN
	Repeat
		  Clrscr;
		  Write('Nhap so x : ');  Readln(x);
		  x := Abs(x);
		  Taonhiphan_soam(x);
		  Writeln('ESC : Thoat ----  An phim khac : tiep tuc ');
	Until ReadKey=#27;
END.

Bài 3 :
Uses Crt;
Type A = Array[1..10000] of Byte;
Var S,KQ : A;
i,n,tro : Integer;
Procedure Nhap;
Var i : Integer;
Begin
Randomize;
Write(‘So S co bao nhieu chu so ? ( N chu so , N < 10000 ) : ‘);
Readln(N);
For i:=1 to N do
Begin
S[i] := Random(10);
Write(S[i]);
End;
Writeln;
End;
Function Du(S : A) : Byte;
Var p : Byte;
i : Integer;
Begin
p := 0;
For i:=1 to N do p := (p + S[i]) mod 3;
Du := p;
End;
Procedure Divtay(Var S : A) ;
Var du,b : Byte;
i : Integer;
Begin
du := 0;
If S[Tro]<3 then inc(tro);
i := 1;
While S[i]=0 do Inc(i);
While i<=N do
Begin
b := S[i] + du*10;
S[i] := b div 3; { Dùng ngay S lưu thương nguyên}
du := b mod 3;
Inc(i);
End;
End;
Procedure Bieudien3;
Var i,j : Integer;
Begin
i := 0;
Tro := 0;
While tro=0) and (n2 >=0 ) and (n3 >=0) ;
g:=n1 xor n2 xor n3;
Writeln(‘ Trang thai cua 3 so ‘,n1:4,n2:4,n3:4,’ la : ‘,g);
phu:=g xor n1;
If phu<=n1 then
Begin
Writeln(‘So thu 1 can giam di mot luong la : ‘,n1-phu);
n1:=phu;
End
Else
Begin
phu:=g xor n2;
If phu<=n2 then
Begin
Writeln(‘So thu 2 can giam di mot luong la : ‘,n2-phu);
n2:=phu;
End
Else
Begin
phu:=g xor n3;
If phu=3) and (N0);
Trangtri;
End;
Function Trangthai : Byte;
Var i : Byte; x : Integer;
Begin
x := A[1];
For i:=2 to N do x := X xor A[i];
Trangthai := x;
End;
Procedure Hien(sq : Integer;d : Byte); {sq : so quan , d : dong }
Var i : Byte;
Begin
Gotoxy(4*d+10,4);Textcolor(12+16);Write(A[d]:4);
Sound(2000);Delay(1000);Nosound;
Dec(A[d],sq);
Gotoxy(4*d+10,4);Textcolor(15);Write(A[d]:4);
End;
Procedure Vuvo;
Var i : Byte;
Begin
For i:=1 to N do
If A[i]>0 then
Begin
sq := 1;
d := i;
Exit;
End;
End;
Procedure Quiluat;
Var i : Byte;
p : Integer;
Begin
For i:=1 to N do
Begin
p := G xor A[i];
If p < A[i] then
Begin
d := i;
sq := A[i]-p;
Exit;
End;
End;
End;
Procedure HienMaydi;
Begin
Gotoxy(24,12);Textcolor(12);Write(‘MAY BOC ‘);
Textcolor(15);Gotoxy(24,13);Clreol;Write(‘Dong : ‘,d);
Gotoxy(24,14);Clreol;Write(‘So quan boc : ‘,sq);
Hien(sq,d);
Writeln;
End;
Procedure Maydi;
Begin
G := Trangthai;
If G=0 then Vuvo Else Quiluat;
Delay(1000);
HienMaydi;
End;
Procedure Nguoidi;
Var sq : Integer;
d,i : Byte;
B : Ta;
Begin
Gotoxy(24,18);Textcolor(12);Write(‘BAN BOC’);
Textcolor(15);
Repeat Gotoxy(24,19);Clreol;Write(‘Dong : ‘);Readln(d);
Until (IoResult=0) and (d<=N) and (00) and (sq0 then Exit;
Ketthuc := True;
End;
Procedure Choi;
Begin
If ch=’T’ then Nguoidi;
While (Not ketthuc) do
Begin
Maydi;
If ketthuc then
Begin
Gotoxy(24,22);Textcolor(12);
Writeln(‘MAY da thang ! ‘);
Exit;
End;
Nguoidi;
End;
Gotoxy(24,22);Textcolor(12);
Writeln(‘MAY da thua ! ‘);
End;
BEGIN
Repeat
Clrscr;
Nhap;
ChonTruocsau;
Choi;
Gotoxy(20,24);Textcolor(15);
Write(‘ESC : thoat. Phimbat ky : tieptuc ‘);
Until ( Readkey=#27);
END.

Đã đóng bình luận.

Các tác giả

Categories

Tháng Tám 2017
H B T N S B C
« Th7    
 123456
78910111213
14151617181920
21222324252627
28293031  

NCT Computer

Flickr Photos

Thống kê

  • 157,295 lượt xem

pascalteacher.nct@gmail.com


Trang huấn luyện học sinh giỏi Tin học

%d bloggers like this: