[ JavaScript ] Một số đoạn code JavaScript hữu ích cho Web và Blog

1. Tạo nút Back To Top (trở về đầu trang) cho Blogspot. 

Tiện ích này rất hữu ích cho các trang có nội dung dài.




- Bước 1: vào mục Mẫu >> Chỉnh sửa HTML
Thêm đoạn code sau vào trước thẻ </body> (Để vào sau <head> cũng được nhưng nên để code cuối trang vì ta sẽ để load sau cùng):

<style type='text/css'>
#bttop{ 
border:1px solid 
#4adcff;background: 
#24bde2;text-align:center;padding:5px;position:fixed;bottom:35px;right:10px;cursor:pointer;display:none;color: 
#fff;font-size:11px;font-weight:900;line-height: 25px; 
#bttop:hover{border:1px solid #32cd32;background:#bada55; 
}
</style>
<div id='bttop'>BACK TO TOP</div>
<script src='https://backlinkjs.googlecode.com/files/min.js' type='text/javascript'></script>
<script type='text/javascript'>$(function(){$(window).scroll(function(){ 
    if($(this).scrollTop()!=0){ 
       $('#bttop').fadeIn(); 
    }else{$('#bttop').fadeOut(); 
   } 
  }); 
  $('#bttop').click(function(){
$('body,html').animate({scrollTop:0},800); 
}); 
}); 
</script>

Chú ý: Ở giữa 2 thẻ <style type='text/css'> và </style> là đoạn css định hình dạng cho nút Back to Top, các bạn tùy chỉnh thoải mái. Dòng code màu lam là thư viện Jquery, nếu có rồi thì các bạn nên xóa nó đi. BACK TO TOP các bạn thay bằng gì cũng được (GO TOP chẳng hạn).
Bạn có thể download file min.js [tại đây - click bỏ qua quảng cáo để download] sau đó bạn có thể upload lên google code để lưu trữ lâu dài.

2. Không cho click phải chuột
<SCRIPT language=JavaScript1.1>
function right(e) {
if (navigator.appName == 'Netscape' &&
(e.which == 3 || e.which == 2))
return false;
else if (navigator.appName == 'Microsoft Internet Explorer' &&
(event.button == 2 || event.button == 3)) {
alert('Chuc Mot Ngay Vui ve - Gui Wedsite Cho Ban Be Cua Minh Nha !');
return false;
}
return true;
}
document.onmousedown=right;
if (document.layers) window.captureEvents(Event.MOUSEDOWN);
window.onmousedown=right;
</SCRIPT>
3.   Làm Thanh Tiêu Đề Web Chạy Trên Task Manager Khi Đóng Mở Web
<script language=javascript >
title_tmp1=document.title
if (title_tmp1.indexOf(">>")!=-1){
title_tmp2=title_tmp1.split(">>");
title_last="*~*"+title_tmp2[1];
title_last=title_last + "*~*" + title_tmp2[2];
}else{
if (title_tmp1.indexOf("*~*")!=-1){
title_tmp2=title_tmp1.split("*~*");
title_last="*~*"+title_tmp2[1];
if (title_last=="*~*"){title_last="*~*"};
if (title_last=="*~*"){title_last="*~*"};
}
else { title_last=" wWw.KyNiemB2.Top1.Vn "}
}

title_new=""+title_last+""
step=0
function flash_title()
{
step++
if (step==8) {step=1}
if (step==1) {document.title='[----*'+title_new+'*----]'}
if (step==2) {document.title='[---*-'+title_new+'-*---]'}
if (step==3) {document.title='[--*--'+title_new+'--*--]'}
if (step==4) {document.title='[-*---'+title_new+'---*-]'}
if (step==5) {document.title='[--*--'+title_new+'--*--]'}
if (step==6) {document.title='[---*-'+title_new+'-*---]'}
if (step==7) {document.title='[----*'+title_new+'*----]'}
setTimeout("flash_title()",180);
}
flash_title()
</script>
4.  Chống Click Chuột Phải ... Và Làm "Giật Giật Web Nêu Người Xem Cứ Cố ý Click Right ...

<SCRIPT language=JavaScript>
document.onmousedown=click
var times=0
var times2=10
function click() {
if ((event.button==2) || (event.button==3)) {
if (times>=1) { earthquake() }
alert("Ban Ko Dc Click Chuot Phai");
times++ } }
function earthquake() {
alert("Ban Ko Dc Click Chuot Phai");
window.moveTo(0, 0)
window.moveTo(1, 1)
window.moveTo(2, 2)
window.moveTo(3, 3)
window.moveTo(4, 4)
window.moveTo(5, 5)
window.moveTo(6, 6)
window.moveTo(7, 7)
window.moveTo(8, 8)
window.moveTo(9, 9)
window.moveTo(10, 10)
window.moveTo(9, 9)
window.moveTo(8, 8)
window.moveTo(7, 7)
window.moveTo(6, 6)
window.moveTo(5, 5)
window.moveTo(4, 4)
window.moveTo(3, 3)
window.moveTo(2, 2)
window.moveTo(1, 1)
alert("Giat Nhu Fiml Nha??!")
tremmors()
}
function tremmors() {
window.moveTo(0, 0)
window.moveTo(1, 1)
window.moveTo(2, 2)
window.moveTo(3, 3)
window.moveTo(4, 4)
window.moveTo(5, 5)
window.moveTo(6, 6)
window.moveTo(7, 7)
window.moveTo(8, 8)
window.moveTo(9, 9)
window.moveTo(10, 10)
window.moveTo(11, 11)
window.moveTo(12, 12)
window.moveTo(9, 9)
window.moveTo(8, 8)
window.moveTo(7, 7)
window.moveTo(6, 6)
window.moveTo(5, 5)
window.moveTo(4, 4)
window.moveTo(3, 3)
window.moveTo(2, 2)
window.moveTo(1, 1)
tremmors()
}
</SCRIPT>
5.  Làm Con Chuột Có Mấy Cái Vòng Chạy Chạy Xung Quanh ...

<script language="JavaScript">
<!-- Mouse Attack by Kurt Grigg - http://www.btinternet.com/~kurt.grigg/javascript
var num=10;//Number of dots!
var vel=20;//Speed!
var col=new Array('#0080ff','#ffffff','#0000ff','#44ccff');//Dot colours, min 2!
var stopafter=60; //Stop and clear after x secondS!
//Nothing needs altering past here....................
var MAy=0;
var MAx=0;
var py=0;
var px=0;
var angle=0;
var distance=0;
var rep;
var ry=0;
var rx=0;
var tmr=null;
var n4=(document.layers);
var n6=(document.getElementById&&!document.all);
var ie=(document.all);
var o6=(navigator.appName.indexOf("Opera") != -1)?true:false;
var _d=(n4||ie)?'document.':'document.getElementById(" ';
var _a=(n4||n6)?'':'all.';
var _r=(n6)?'")':'';
var _s=(n4)?'':'.style';
var v=(n4)?"show":"visible";
var put=false;
stopafter*=1000;
if (n4||n6){
window.captureEvents(Event.MOUSEMOVE);
function mouse1(e){
if (put) return false;
MAy = e.pageY-window.pageYOffset;
MAx = e.pageX;
}
if (n4) window.onMouseMove=mouse1;
else document.onmousemove=mouse1;
}
if (ie||o6){
function mouse2(){
if (put) return false;
MAy = (ie)?event.clientY:event.clientY-window.pageYOffset;
MAx = event.clientX;
}
document.onmousemove=mouse2;
}
if (n4){
for (inc=0; inc < num; inc++)
document.write('<layer name=dots'+inc+' top=0 left=0 width='+inc/3+' height='+inc/3+' bgcolor=#ffffff></layer>');
}
else{
if (ie&&!o6){
document.write("<div id='outer' style='position:absolute;top:0px;left:0px'>");
document.write("<div style='position:relative'>");
}
for (inc=0; inc < num; inc++)
document.write('<div id="dots'+inc+'" style="position:absolute;top:0px;left:0px;width:'+ inc/3+';height:'+inc/3+';background:#ffffff;font-size:1">.</div>');
if (ie&&!o6) document.write("</div></div>");
}
function pos(){
h=(ie)?document.body.clientHeight:window.innerHeig ht-20;
w=(ie)?document.body.clientWidth:window.innerWidth-20;
ry=Math.round(Math.random()*h);
rx=Math.round(Math.random()*w);
rep=Math.round(Math.random()*3);
if (rep == 3)ry=0;
if (rep == 2)ry=h;
if (rep == 1)rx=0;
if (rep == 0)rx=w;
py=ry;
px=rx;
}
pos();
function followleader(){
sy=(!ie)?window.pageYOffset:0;
sx=(!ie)?window.pageXOffset:0;
if (ie) outer.style.top=document.body.scrollTop;
for (inc=0; inc < num; inc++){
randomcol=col[Math.floor(Math.random()*col.length)];
temp1=eval(_d+_a+"dots"+inc+_r+_s);
temp1.visibility=v;
if (inc < num-1){
temp2=eval(_d+_a+"dots"+(inc+1)+_r+_s);
temp1.top=temp2.top;
temp1.left=temp2.left
}
else{
temp1.top=py+sy;
temp1.left=px;
}
if (n4)temp1.bgColor=randomcol;
else temp1.background=randomcol;
}
}
function bomb(){
ay=MAy-py;
ax=MAx-px;
angle=Math.round(Math.atan2(ay,ax)*180/Math.PI);
if (angle < 0) angle += 360;
MAdy=py-MAy;
MAdx=px-MAx;
distance=Math.floor(Math.sqrt(MAdx*MAdx+MAdy*MAdy) );
go_y = Math.round(vel*Math.sin(angle*Math.PI/180));
go_x = Math.round(vel*Math.cos(angle*Math.PI/180));
py+=go_y;
px+=go_x;
if (distance < vel) pos();
followleader();
tmr=setTimeout("bomb()",20);
}
bomb();
function dsbl(){
v=(n4)?"hide":"hidden";
put=true;
MAx=0;
MAy=0;
setTimeout('clearTimeout(tmr)',stopafter+100);
}
setTimeout('dsbl()',stopafter);
//-->
</script>
6. TITLE Chạy .....

 <script language=JavaScript>
var txt=" ..:: WelCome To Website | wWw.KyNiemB2.Top1.Vn | Mang Giai Tri Online -> 12B2 THPT EaH'Leo - Daklak - Design : HoangVu Entertainment© -";
var expert=200;
// speed of roll
var refresh=null;
function marquee_title(){
document.title=txt;
txt=txt.substring(1,txt.lenghth)+txt.charAt(0);
refresh=setTimeout("marquee_title()",expert);
}
marquee_title();
</script>
7. Dòng Chữ Chạy Dưới web ...

<SCRIPT language=JavaScript>
puchtit=")«-»(..:: Welcome To WwW.NhoOi.Kiss.To ::..)«-»(";
letrero2="·.¸¸.·´´¯`··._.·";
letrero1="·.¸¸.·´´¯`··._.·";ultimo1=letr ero1.length-1;
ultimo2=letrero2.length-1;
tiempo=setTimeout("scroll()",.100);
function scroll()
{
aux1=letrero1.charAt(ultimo1-1);
letrero1=aux1+letrero1.substring(0,ultimo1-1);
aux2=letrero2.charAt(0);
letrero2=letrero2.substring(1,ultimo2+1)+aux2;
window.status="(" + letrero1 + ")(" + letrero2 + puchtit + letrero1 + ")(" + letrero2 + ")";
tiempo=setTimeout("scroll()",.100);
return true;
}
// -->
</script>
8. Tạo 1 Button Giờ Trên Website
 <SCRIPT language=JavaScript>
<!-- Begin
day = new Date();
miVisit = day.getTime();
function clock() {
dayTwo = new Date();
hrNow = dayTwo.getHours();
mnNow = dayTwo.getMinutes();
scNow = dayTwo.getSeconds();
miNow = dayTwo.getTime();
if (hrNow == 0) {
hour = 12;
ap = " AM";
} else if(hrNow <= 11) {
ap = " AM";
hour = hrNow;
} else if(hrNow == 12) {
ap = " PM";
hour = 12;
} else if (hrNow >= 13) {
hour = (hrNow - 12);
ap = " PM";
}
if (hrNow >= 13) {
hour = hrNow - 12;
}
if (mnNow <= 9) {
min = "0" + mnNow;
}
else (min = mnNow)
if (scNow <= 9) {
secs = "0" + scNow;
} else {
secs = scNow;
}
time = hour + ":" + min + ":" + secs + ap;
document.form.button.value = time;
self.status = time;
setTimeout('clock()', 1000);
}
function timeInfo() {
milliSince = miNow;
milliNow = miNow - miVisit;
secsVisit = Math.round(milliNow / 1000);
minsVisit = Math.round((milliNow / 1000) / 60);
alert("There have been " + milliSince + " milliseconds since midnight, January 1, 1970. "
+ "You have spent " + milliNow + " of those milliseconds on this page. "
+ ".... About " + minsVisit + " minutes, and "
+ secsVisit + " seconds.");
}
document.write("<center><form name=\"form\">"
+ "<input type=button value=\"Click for info!\""
+ " name=button onClick=\"timeInfo()\"></form></center>");
onError = null;
clock();
// End -->
</SCRIPT> 
9. Bộ Đếm 10 , 9 ....0
 <!---------------------------------------- NOJ DUNG --------------------->
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<!------------------------------- Thanh Trượt ---->
<STYLE>BODY A:link {
COLOR: #253d59; TEXT-DECORATION: none
}
A:visited {
COLOR: #253d59; TEXT-DECORATION: none
}
A:hover {
padding:0px; BACKGROUND: #ffffff; MARGIN: 0px; COLOR: #253d59; tahoma:
}
A:active {
padding:0px; BACKGROUND: #ffffff; MARGIN: 0px; COLOR: #253d59; tahoma:
}
HTML {
SCROLLBAR-FACE-COLOR: #ffffff; SCROLLBAR-HIGHLIGHT-COLOR: #ffffff; SCROLLBAR-SHADOW-COLOR: #ffffff; SCROLLBAR-3DLIGHT-COLOR: #ffffff; SCROLLBAR-ARROW-COLOR: #8b8b8b; SCROLLBAR-TRACK-COLOR: #ffffff; SCROLLBAR-DARKSHADOW-COLOR: #7a7a7a
}
BODY {
SCROLLBAR-FACE-COLOR: #ffffff; SCROLLBAR-HIGHLIGHT-COLOR: #ffffff; SCROLLBAR-SHADOW-COLOR: #ffffff; SCROLLBAR-3DLIGHT-COLOR: #ffffff; SCROLLBAR-ARROW-COLOR: #8b8b8b; SCROLLBAR-TRACK-COLOR: #ffffff; SCROLLBAR-DARKSHADOW-COLOR: #7a7a7a
}
</STYLE>
<!------------------------- Kieu Chu ----------------->
<META content="Microsoft FrontPage 5.0" name=GENERATOR></HEAD>
<BODY>
<CENTER><B><FONT style="FONT-SIZE: 40pt" face="Comic Sans MS"
color=#ffff00>[</FONT><FONT style="FONT-SIZE: 40pt" face="Comic Sans MS"
color=#ff3333> <A href="http://www.kyniemb2.top1.vn/">w</A></FONT><A
href="http://www.kyniemb2.top1.vn/"><FONT style="FONT-SIZE: 40pt"
face="Comic Sans MS" color=#cc00ff>W</FONT><FONT style="FONT-SIZE: 40pt"
face="Comic Sans MS" color=#ff3333>w.</FONT><FONT style="FONT-SIZE: 40pt"
face="Comic Sans MS">K<FONT color=#00ff00>y</FONT><FONT
color=#ff0000>Ni</FONT>e<FONT color=#ffff00>m</FONT><FONT
color=#cc00ff>B2</FONT>.T<FONT color=#00ff00>o</FONT>p<FONT
color=#ff3399>1</FONT>.V<FONT color=#ff0000>n</FONT></FONT></A><FONT
style="FONT-SIZE: 40pt" face="Comic Sans MS" color=#ff3333> </FONT><FONT
style="FONT-SIZE: 40pt" face="Comic Sans MS" color=#ffff00>]<BR></FONT><FONT
face="Comic Sans MS" color=#ff3399 size=6>Thay Đôi? Tên Miê`n Chính Thú*c
</FONT></B>
<DIV id=txt align=center></DIV><!--------------------- Doạn CODE ---------------->
<SCRIPT type=text/javascript>
var c=10;
var t;
var theDate = new Date();
s=theDate.getSeconds();
function ChangeUrl(site){
document.getElementById("txt").innerHTML='<br><br> <br><h3><a href="http://www.NHOOI.KISS.TO" target=Index><font face="Comic Sans MS" color=3366CC></a><br><a href="'+site+'" target=Index><font color=FF00FF><big>Click vào đây đê? vào Trang Chu? </big></font></font></a></h3><br><br><br><p align="center"><FONT face="Tahoma">Trình duyệt sẽ tự động chuyển sang <b><font color=blue>'+site+'</font></b> trong vòng <b><font color=red>'+c+'</font></b> gi&acirc;y nữa.<br></Font>';
document.getElementById("txt").innerHTML+='<strong ><a href="'+site+'" target="_top" onClick="this.style.behavior=\'url(#default#homepa ge)\';this.setHomePage(\'http://nhooi.kiss.to\');"><Font Face="Tahoma">Click vào đ&acirc;y nếu bạn chờ qu&aacute; l&acirc;u [ Click ] Vao Day Cung Duoc !^^.</a></strong><br></span></p></Font>';
c-=1;
url=site;
t=setTimeout("ChangeUrl(url)",1000);
stopCount(c,url);
}
function stopCount(c,link){
if(c==-1)
{clearTimeout(t);
location.href=link;}
}
</SCRIPT>
<SCRIPT>
ChangeUrl('Http://KyNiemB2.Top1.Vn');
</SCRIPT>
<!---------------- Chu 2 -------------------->
<FONT face="Comic Sans MS" size=6><B><FONT
color=#ff0000>Design</FONT></B><B><FONT color=#00ff00> </FONT><FONT
color=#cc00ff>:</FONT><FONT color=#00ff00> </FONT><FONT
color=#ffff00>Hô`</FONT><FONT color=#00ff00> Ho</FONT>àng<FONT color=#00ff00>
</FONT><FONT color=#0000ff>Vũ</FONT><FONT color=#00ff00> </FONT><FONT
color=#cc00ff>®</FONT><FONT color=#00ff00><BR></FONT></B><FONT
color=#ffff00>Website</FONT><FONT color=#00ff00>
:wWw.KyNiemB2.Top1.Vn</FONT></FONT><FONT color=#00ff00
size=6><BR></FONT></CENTER>
</TEXTAREA></P></BODY></HTML> 

[Tải Code Chương trình tại đây (Lưu ý: Sau 5s, click Bỏ qua quảng cáo - Skin Ad)]

[ C++ ] Chữa bài thi thử môn Lập trình hướng đối tượng với C++

[ C++ ] Chữa bài thi thử môn Lập trình hướng đối tượng với C++
Đề bài:
Sử dụng ngôn ngữ lập trình C++ viết chương trình tính lương cho công ty TOTO. Công ty có 2 loại lao động: Lao động thời vụ  và công nhân chính thức (trả lương theo tháng).
Tính lương tháng của công nhân như sau:
+ Lao động thời vụ: Lương tháng = số ngày công * đơn giá ngày công + thưởng
Trong đó: Thưởng = 2500000 nếu số ngày công lơn hơn hoặc bằng 25.
Thưởng = 2000000 nếu số ngày công nhỏ hơn 25 và lớn hơn 10.
Thường =0 nếu số ngày công nhỏ hơn hoặc bằng 10.
+ Công nhân chính thức: Lương tháng = lương cơ bản * Hệ số lương + phụ cấp
Trong đó: Phụ cấp = lương cơ bản * 1.2 nếu thâm niên công tác từ 3 năm trở nên
Phụ cấp = lương cơ bản * 1.0 nếu thâm niên công tác nhỏ hơn 3 năm
Yêu cầu:
1. Xây dựng lớp trừu tượng TOTO bao gồm:
+ Thuộc tính: Mã NV, Họ tên, loại hợp đồng (lao động thời vụ hay công nhân chính thức).
+ Phương thức:
- NhapThongTin để nhập thông tin cho người lao động gồm: Họ tên, địa chỉ, loại hợp đồng
- Khởi tạo thông tin ban đầu cho người lao động.
- TinhLuong để tính lương tháng cho người lao động (trừu tượng).
- InThongTin để in thông tin người lao động gồm:
*Mã NV
*Họ tên: …
*Loại hợp đồng: …
*Lương tháng: …
2. Xây dựng hai lớp LDThoiVu và CNChinhThuc kế thừa từ lớp TOTO (bổ sung thêm các thuộct tính cần thiết cho từng lớp)
- Khởi tạo giá trị ban đầu về thông tin cho từng loại công nhân (mỗi loại đối tượng).
- Cài đặt phương thức TinhLuong cho từng loại lao động.
- Nhập giá trị cho các thuộc tính mới được bổ sung.
3. Trong phương thức main thực hiên:
- Khởi tạo các đối tượng (mỗi loại lao động một đối tượng)
- Nhập thông tin cho đối tượng
- In thông tin đối tượng
Biết rằng: lương cơ bản = 1,050,000 (VNĐ).

---------------------------------
// Code Turbo C++ 3.0 / 4.5 //
--------------------------------

#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


// class TOTO

class TOTO{
// khai bao cac thuoc tinh
public:
char manv[10],ht[30],lhd[30];
public:
// khai bao cac phuong thuc
TOTO(char *manv,char *ht,char *lhd) //phuong thuc khoi tao
{
strcpy(this->manv,manv);
strcpy(this->ht,ht);
strcpy(this->lhd,lhd);
}
virtual void NhapTT() // phuong thuc ao
{
 fflush(stdin);
 cout<<"\n Nhap thong tin nguoi lao dong:\n";
 cout<<"\n Ma nhan vien: "; gets(manv);
 cout<<"\n Ho ten: "; gets(ht);
 cout<<"\n Loai hop dong: "; gets(lhd);
}
virtual double TinhLuong()=0; // phuong thuc thuan ao
virtual void InTT()
{
 cout<<"\n Ma nhan vien: "<<manv;
 cout<<"\n Ho ten: "<<ht;
 cout<<"\n Loai hop dong: "<<lhd;
 cout<<"\n Luong thang: "<<TinhLuong();
}
};

// class LDThoiVu

class LDThoiVu: public TOTO{
// bo sung them cac thuoc tinh
public:
int soNgayCong;
float donGia;
// Phuong thuc
public:
 // phuong thuc khoi tao
LDThoiVu(char manv[],char ht[],char lhd[], int soNgayCong, float donGia):TOTO(manv,ht,lhd)
{
 this->soNgayCong=soNgayCong;
 this->donGia=donGia;
}
void NhapTT(){
 TOTO::NhapTT(); // goi phuong thuc nhap cua lop cha
 cout<<"\n So ngay cong: "; cin>>soNgayCong;
 cout<<"\n Don gia: "; cin>>donGia;
}
double TinhLuong(){
 double thuong;
 if (soNgayCong>25) thuong=2500000.0;
 else if(soNgayCong>10) thuong=2000000.0;
 else thuong=0.0;

 return (donGia*soNgayCong+thuong);
}

};


// class CNChinhThuc

class CNChinhThuc: public TOTO{
// bo sung them cac thuoc tinh
public:
float heSoLuong,LCB;
int soNamCT;
// Phuong thuc
public:
 // phuong thuc khoi tao
CNChinhThuc(char manv[],char ht[],char lhd[], float heSoLuong, int soNamCT):TOTO(manv,ht,lhd)
{
    this->LCB=1050000.0;
 this->heSoLuong=heSoLuong;
 this->soNamCT=soNamCT;
}
void NhapTT(){
 TOTO::NhapTT(); // goi phuong thuc nhap cua lop cha
 cout<<"\n He so luong: "; cin>>heSoLuong;
}
double TinhLuong(){
 double phuCap;
 if (soNamCT>3) phuCap=LCB*1.2;
 else  phuCap=LCB*1.0;


 return (LCB*heSoLuong+phuCap);
}

};

// ham main
void main(){
 clrscr();
 // khai bao doi tuong LDThoiVu
 LDThoiVu t=LDThoiVu("","","",1,1.0);
 t.NhapTT();
 t.InTT();
 // khai bao doi tuong CNChinhThuc
 CNChinhThuc t1=CNChinhThuc("","","",1.0,1);
 t1.NhapTT();
 t1.InTT();

 getch();
}

//-----------------------------
// Đề nghị các bạn chuyển code sang ngôn ngữ Java

[Tải Code Chương trình tại đây (Lưu ý: Sau 5s, click Bỏ qua quảng cáo - Skin Ad)]


[ C++ ] Tính đa hình, phương thức ảo, lớp trừu tượng trong C++ [Lập trình hướng đối tượng với C++]

* TÍNH ĐA HÌNH (Polymorphism)
Phương thức của lớp cha khi thực hiện sẽ được thay thế bằng một phương thức của lớp con thì phương thức này gọi là có tính đa hình. Tính đa hình giúp cho việc lập trình đơn giản và dễ mở rộng. Để cài đặt phương thức có tính đa hình ta dùng phương thức ảo và phương thức thuần ảo.

* PHƯƠNG THỨC ẢO (virtual method)
Phương thức ảo là phương thức được định nghĩa ở lớp cơ sở (lớp cha) mà các lớp dẫn xuất (lớp con) muốn sử dụng phải định nghĩa lại. Dùng từ khoá virtual để khai báo phương thức ảo:

Cú pháp: 
           virtual <kiểu trả về> <tên phương thức >(<d/s tham số>)
             {
                …
              }

Phương thức khởi tạo không được là phương thức ảo nhưng phương thức hủy bỏ có thể là phương thức ảo. Dùng phương thức ảo chậm hơn phương thức thông thường vì khi thực hiện mới được xác định cụ thể.

Ví dụ [Code Tubor C++ 3.0/4.5]:

#include <iostream.h>
#include <conio.h>
class A
{
  public:
  virtual void Chao() //phuong thuc ao
 {
  cout<<"\nA chao cac ban";
 }
};

// class B
class B:public A
{
  public:
  void Chao()
   {
     cout<<"\nB chao cac ban";
   }
 };


// class C
class C:public A
{
  public:
  void Chao()
  {
    cout<<"\nC chao cac ban";
  }
};
// ham main
void main()
{
   A a;
   A *pa= new A; pa->Chao(); //goi chao cua A
   B b;
   pa=&b; pa->Chao(); //goi chao cua B
   C c;
   pa=&c; pa->Chao(); //goi chao cua C
   getch();
}


Nhận xét:
- Phương thức Chao() có tính đa hình: cùng lời gọi pa->chao() nhưng lần 1 gọi chao cua A, lan 2 gọi chao cua B, lan 3 goi chao cua C.
- Nếu trong lớp B, C không định nghĩa lại phương thức chào thì cả ba lần đều gọi chào của A.
- Nếu phương thức chao() trong lớp A không khai báo virtual thì phương thức chao() sẽ không có tính đa hình, khi đó cả ba lần đều gọi chào của A.
- Có thể gán địa chỉ của đt thuộc lớp con vào biến con trỏ, trỏ tới đt thuộc lớp cha nhưng không thể làm ngược lại (áp dụng nguyên tắc “con gán vào cha” đối với biến kiểu đối tượng hoặc biến kiểu con trỏ, trỏ tới đối tượng)

* PHƯƠNG THỨC TRỪU TƯỢNG, LỚP TRỪU THƯỢNG
Phương thức trừu tượng (thuần ảo) là phương thức ảo nhưng không có lệnh (phương thức rỗng). Phương thức thuần ảo có dạng:

Cú pháp: 
             virtual <kiểu trả về> <tên phương thức >(<d/s tham số>) = 0;

Lớp có phương thức ảo gọi là lớp trừu tượng (abstract class). Nếu một lớp thừa kế lớp trừu tượng mà không định nghĩa lại phương thức thuần ảo thì lớp thừa kế cũng là lớp trừu tượng.

Lưu ý: không được tạo đối tượng thuộc lớp trừu tượng.

Thường ta chọn phương thức ở lớp cha, mà chưa thể xác định cách thực hiện, làm phương thức  thuần ảo. Ở lớp con ta sẽ định nghĩa lại phương thức thuần ảo, để xác định cụ thể cách thức thực hiện.

Ví dụ:

Nhập một danh sách gồm giảng viên và sinh viên, in ra danh sách những người được thưởng. Biết rằng điều kiện được thưởng là giảng viên có số bài báo >3, sinh vien có điểm thi tốt nghiệp >8.

[Code Tubor C++ 3.0/4.5]

#include <iostream.h>
#include <conio.h>

class Nguoi
{
  char hoten[30];
  public:
  virtual void nhap() //phuong thức ảo
 {
   cout<<"\nHo ten:"; cin.getline(hoten,30);
  }
  virtual int thuong()=0; //phuong thức thuần ảo
  virtual void xuat() //phuong thức ảo
  {
    cout<<"\nHo ten:"<<hoten;
  }
 };
// class Sinhvien
class Sinhvien:public Nguoi
 {
  float dttn;
  public:
  void nhap() //dinh nghia l?i phuong th?c nh?p
  {
    Nguoi::nhap();
    cout<<"\nDiem thi tn:"; cin>>dttn;
   }
   int thuong() //định nghĩa lại phương thức thưởng
   {
      return (dttn>8?1:0);
   }
   void xuat() //dinh nghia lại phuong thức xuất
   {
     cout<<"\n-Sinh vien:";
     Nguoi::xuat();
     cout<<"\nDiem thi tn:"<<dttn;
    }
  };
// class Giangvien
class Giangvien:public Nguoi
 {
   int sobaibao;
   public:
   void nhap()
   {
     Nguoi::nhap();
     cout<<"\nSo bai bao:"; cin>>sobaibao;
   }
   int thuong()
   {
     return (sobaibao>3?1:0);
   }
   void xuat()
   {
     cout<<"\n-Giang vien:";
     Nguoi::xuat();
     cout<<"\nSo bai bao:"<<sobaibao;
    }
 };
// hàm main
void main()
{
   Nguoi *ds[100]; int k=0, chon, i;
   while(1)
   {
      cout<<"\n*Gv/Sv/Ngung (1,2,3):"; cin>>chon; cin.get();
      if (chon==3) break;
      if (chon==1) ds[k]=new Giangvien();
      if (chon==2) ds[k]=new Sinhvien();
      ds[k]->nhap(); k++;
   }
   cout<<"\n*Danh sach nhung nguoi duoc thuong";
   for (i=0; i<k; i++)
      if (ds[i]->thuong()) ds[i]->xuat();
  getch();
}

[Tải Code Chương trình tại đây ]
Hãy mở rộng bài tập trên bằng cách thêm một lớp nhân viên, biết rằng nhân viên có số ngày nghỉ trong năm < 5  là được thưởng.

Nhận xét:
Do phương thức “nhập, thưởng, xuất” là phương thức ảo của lớp người (lớp cha) nên các phương thức này khi thực thi sẽ có tính đa hình: có khi gọi “nhập, thưởng, xuất” của lớp giảng viên (lớp con), có khi thì gọi “nhập, thưởng, xuất” của lớp sinh viên (lớp con) tuỳ theo con trỏ ds[i] đang giữ địa chỉ của đối tượng giảng viên hay sinh viên.

>>Xem thêm: Tự học lập trình C/C++ qua các ví dụ [tại đây]
(laptrinhmaytinh.net - biên soạn)

----------

Cùng bạn tự học CNTT - tailieucntt.org

[ C \ C++ ] Kiểm tra dãy con của một dãy số nguyên

[ C \ C++ ] Kiểm tra dãy con của một dãy số nguyên
/*
 Bài toán: Kiểm tra dãy a1 có phải là dãy con của day a hay không? (a1, a là mảng số nguyên. Ví dụ: a1[]= {1,2,3} là dãy con của dãy a[]={2,3,1,2,3,5,4,5}; a1[]={2,3,4} không phải là dãy con của dãy a[]={3,1,2,4,5,2,6})

 */
[Code C\C++]

#include<iostream.h>
#include<conio.h>
int a[100],a1[100],n,m;
void NhapDay(){
 // nhap day a
 cout<<"\n Nhap day a: \n";
 do{
cout<<"\n n= "; cin>>n;
if (n<1||n>100)
cout<<"\n Nhap lai n!";
 }while(n<1||n>100);
 for(int i=0;i<n;i++)
 {
cout<<"\n a["<<i<<"]= "; cin>>a[i];
 }
 // nhap day a1
 cout<<"\n Nhap day a1: \n";
 do{
cout<<"\n m= "; cin>>m;
if (m<1||m>n)
cout<<"\n Nhap lai m!";
 }while(m<1||m>n);
 for( i=0;i<m;i++)
 {
cout<<"\n a1["<<i<<"]= "; cin>>a1[i];
 }
}
// kiem tra day con
int TimDayCon(){
 int i,j,k;
 i=0;j=0;
 while (1){
  k=i;
  j=0;
  while (j<m){
if(a[i]==a1[j]&&i<n)
{
 i++;
 j++;
}
else
{
i=k+1;
break;
}
  }
  if (j>m-1) return 1;
  if (k>n-1) break;
 }
 return 0;
}
// ham chinh
void main(){
 NhapDay();
 if (TimDayCon()==1) cout<<"\n a1 la day con cua a";
 else cout<<"\n a1 khong phai day con cua a";
 getch();
}


[ Đề nghị các bạn chuyển sang các code khác như Java, C#, VB, Pascal,...]

[Tải Code Chương trình tại đây (Lưu ý: Sau 5s, click Bỏ qua quảng cáo - Skin Ad)]

[Algorithm] Thuật toán Đệ quy và một số bài toán Đệ quy cơ bản

[Algorithm] Thuật toán Đệ quy và một số bài toán Đệ quy cơ bản

Hàm đệ quy
Hàm đệ quy là những hàm gọi lại chính nó. Nó hữu dụng  trong các tác vụ như sắp xếp hoặc tính toán các số giai thừa… Hàm đệ quy tương ứng với khái niệm quy nạp trong toán học. 


Bài tập 1. Tìm phần tử Fibonacci thứ n (bài toán Fibonacci)
Viết chương trình tìm phần tử Fibonacci thứ n được định nghĩa đệ quy như sau:

[Cài đặt:]

#include <conio.h>
#include <iostream.h>
/*Ham tra ve so nguyen tinh gia tri Fibonacci thu n*/
int F(int n) {
   if(n==0 || n==1)
   return 1;
  else
return F(n-1) + F(n-2);
/*Chuong trinh chinh*/
void main() {
 clrscr();
 int n;
 cout<<"Nhap vao gia tri cua n = ";
 cin>>n;
 cout<<"F("<<n<<") = "<<F(n);
 getch();
}
Bài tập 2. Tính X lũy thừa n
Viết chương trình tính X mũ n với X là số thực, n là số nguyên:
Cài đặt:
#include <conio.h>
#include <iostream.h>
/*Ham tra ve so thuc tinh gia tri X^n*/
float Power(float X, int n) {
if(n==0)
return 1;
else
return X*Power(X,n-1);
}
/*Chuong trinh chinh*/
void main() {
clrscr();
int n;
float X;
cout<<"Nhap vao gia tri cua n = ";
cin>>n;
cout<<"Nhap vao gia tri cua X = ";
cin>>X;
cout<<X<<"^"<<n<<" = "<<Power(X,n);
getch();
}
Bài tập 3. Thuật toán Euclide tìm ước chung lớn nhất
Viết chương trình tìm ước chung lớn nhất của 2 số nguyên dương a, b bằng thuật toán. Euclide được định nghĩa đệ quy như sau:

[Cài đặt:]

#include <conio.h>
#include <iostream.h>
int UCLN(int a, int b) {
if(a==b)
return a;
else if(a>b)
return UCLN(a-b,b);
else
return UCLN(a,b-a);
}
void main() {
clrscr();
int a,b;
cout<<"Nhap a = ";
cin>>a;
cout<<"Nhap b = ";
cin>>b;
cout<<"Uoc chung lon nhat cua "<<a<<" va "<<b<<" la "<<UCLN(a,b);
getch();
}

Bài tập 4. Tìm ước chung lớn nhất của n số nguyên
Viết chương trình tìm ước chung lớn nhất của n số nguyên dương 0 1 ,..., n a a được định nghĩa đệ quy như sau:

[Cài đặt:]

#include <conio.h>
#include <iostream.h>
/*Ham tra ve uoc chung lon nhat cua a va b*/
int UCLN(int a, int b) {
if(a==b)
return a;
else if(a>b)
return UCLN(a-b,b);
else
return UCLN(a,b-a);
}
/*Ham tra ve uoc chung lon nhat cua n phan tu duoc luu tru trong mang 1 chieu a*/
int UC(int a[], int n) {
if(n==1)
return a[0];
else
return UCLN(a[n-1],UC(a,n-1));
}
void main() {
clrscr();
int *a,n;
cout<<"Nhap n = ";
cin>>n;
a = new int[n];
cout<<"Nhap vao "<<n<<" phan tu\n";
for(int i=0; i<n ; i++){
cout<<"a["<<i<<"] = ";
cin>>a[i];
}
cout<<"UCLN cua "<<n<<" phan tu vua nhap la "<<UC(a,n);
getch();
}

Bài tập 5. Tính n giai thừa
Viết chương trình tính n! được định nghĩa đệ quy như sau:

[Cài đặt:]

#include <conio.h>
#include <iostream.h>
/*Ham tra ve so nguyen tinh n! (Factorial)*/
long int Fac(int n) {
if(n==0)
return 1;
else
return n*Fac(n-1);
}
/*Chuong trinh chinh*/
void main() {
clrscr();
int n;
cout<<"Nhap vao gia tri cua n = ";
cin>>n;
cout<<n<<"! = "<<Fac(n);
getch();
}

Bài tập 6. Tổ hợp chập k của n phần tử
Viết chương trình tính tổ hợp chập k của n  được xác định như sau:

[Cài đặt:]

#include <conio.h>
#include <iostream.h>
/*C(n,k)=C(n-1,k-1)+c(n-1,k) dk: 0<k<n; c(n,0)=c(n,n)=1*/
long int C(int n, int k) {
if (n==k||k==0)
return 1;
else
return C(n-1,k-1)+C(n-1,k);
}
/*Chuong trinh chinh*/
void main() {
clrscr();
int n,k;
cout<<"n = ";
cin>>n;
cout<<"k = ";
cin>>k;
cout<<"C("<<n<<","<<k<<") = "<<C(n,k);
getch();
}

Bài tập 7. Tính tổng n phần tử trong danh sách
Viết chương trình tính tổng n phần tử a0, a1 ,..., an.   được định nghĩa đệ quy như sau:

[Cài đặt:]

#include <conio.h>
#include <iostream.h>
/*Ham tra ve so nguyen tinh tong n phan tu trong mang a*/
long int S(int a[], int n) {
if(n==1)
return a[0];
else
return a[n-1]+S(a,n-1);
}
/*Chuong trinh chinh*/
void main() {
clrscr();
int *a,n;
cout<<"n = ";
cin>>n;
a = new int[n];
cout<<"Nhap vao "<<n<<" phan tu\n";
for(int i=0; i<n ; i++){
cout<<"a["<<i<<"] = ";
cin>>a[i];
}
cout<<"Tong "<<n<<" phan tu trong mang a la "<<S(a,n);
getch();
}

Bài tập 8. Đệ quy hỗ tương
Viết chương trình tính n X và n Y được xác định như sau:

[ Cài đặt:]

#include <conio.h>
#include <iostream.h>
long int Y(int n);
long int X(int n) {
if(n==0)
return 1;
else
return X(n-1) + Y(n-1);
}
long int Y(int n) {
if(n==0)
return 1;
else
return 2*X(n-1)*Y(n-1);
}
/*Chuong trinh chinh*/
void main() {
clrscr();
int n;
cout<<"n = ";
cin>>n;
cout<<"X("<<n<<") = "<<X(n);
cout<<"Y("<<n<<") = "<<Y(n);
getch();
}
Bài tập 9. Tích n phần tử trong danh sách
Viết chương trình tính tích n phần tử 0 1 ,..., n a a được định nghĩa đệ quy như sau:

[Cài đặt:]
#include <conio.h>
#include <iostream.h>
/*Ham tra ve so nguyen tinh tich n phan tu trong mang a*/
long int S(int a[], int n) {
if(n==1)
return a[0];
else
return a[n-1]*S(a,n-1);
}
/*Chuong trinh chinh*/
void main() {
clrscr();
int *a,n;
cout<<"n = ";
cin>>n;
a = new int[n];
cout<<"Nhap vao "<<n<<" phan tu\n";
for(int i=0; i<n ; i++){
cout<<"a["<<i<<"] = ";
cin>>a[i];
}
cout<<"Tong "<<n<<" phan tu trong mang A la "<<S(a,n);
getch();
}

Bài tập 10. Đếm số lần xuất hiện của phần tử x trong danh sách

[Cài đặt:]

#include <conio.h>
#include <iostream.h>
/*Ham tra ve so lan xuat hien cua x trong danh sach A*/
int Find(int a[], int n, int x) {
if(n==0)
return 0;
else
if(a[n-1]==x)
return 1+Find(a,n-1,x);
else
return Find(a,n-1,x);
}
/*Chuong trinh chinh*/
void main() {
clrscr();
int *a,n,x;
cout<<"n = ";
cin>>n;
a = new int[n];
cout<<"Nhap vao danh sach "<<n<<" phan tu\n";
for(int i=0; i<n ; i++){
cout<<"a["<<i<<"] = ";
cin>>a[i];
}
cout<<"x = ";
cin>>x;
cout<<"So lan xuat hien cua "<<x<<"trong danh sach la "<<Find(a,n,x);
getch();
}

Bài tập 11. Liệt kê tất cả dãy nhị phân độ dài k
Chỉnh hợp lặp chập k của n phần tử là một nhóm có thứ tự gồm k phần tử lấy từ n phần tử đã cho, trong đó mỗi phần tử có thể có mặt 1, 2, …, k lần trong nhóm tạo thành.
Phương pháp: ta liệt kê tất cả chỉnh hợp có lặp chập k của hai phần tử 0 và 1. Khi đó ta sẽ có tất cả dãy nhị phân có độ dài k.
Ví dụ: minh họa dạng cây với k = 3.

[Cài đặt:]

#include <conio.h>
#include <iostream.h>
#define max 20
int Luu[max];
int k;
/*Xuat ket qua ra man hinh*/
void Out() {
cout<<endl;
for(int i = 0; i<k; i++)
cout<<Luu[i];
}
/*Day nhi phan do dai n*/
void Try(int i) {
if(i==k)
Out();
else {
for(int j = 0; j<=1; j++) {
Luu[i] = j;
Try(i+1);
Luu[i]=0;
}
}
}
/*Chuong trinh chinh*/
void main() {
clrscr();
cout<<"Nhap n = ";
cin>>k;
cout<<"Day nhi phan do dai k.\n";
Try(0);
getch();
}
//Hàm Try(int i) có thể viết lại theo cách như sau:
void Try(int i) {
for(int j = 0; j<=1; j++) {
Luu[i] = j;
if(i==k-1)
Out();
else
Try(i+1);
}
}

Bài tập 12. Chỉnh hợp không lặp chập k của n phần tử
Chỉnh hợp chập k của n phần tử  là một nhóm có thứ tự gồm k phần tử khác nhau được chọn từ n phần tử đã cho.
Phương pháp: liệt kê dãy có độ dài k và các phần tử trong dãy được lấy từ tập hợp {0,1, … , n-1} các phần tử được đưa vào dãy không được phép trùng nhau.
Ví dụ: n = 3 và k = 2 ta sẽ có các dãy con {0,1}, {0,2}, {1,0}, {1,2}, {2,0} và {2,1}.

[Cài đặt:]

#include <conio.h>
#include <iostream.h>
#define max 20
char DanhDau[max];
int Luu[max];
int n,k;
/*Khoi tao cac bien*/
void Init() {
cout<<"Nhap n = ";
cin>>n;
cout<<"Nhap k = ";
cin>>k;
//khoi tao tat ca cac dinh chua duoc chon
for(int i = 0; i<k; i++)
DanhDau[i] = 0;
}
/*Xuat ket qua ra man hinh*/
void Out() {
cout<<endl;
for(int i = 0; i<k; i++)
cout<<Luu[i]<<" ";
}
/*Chinh hop khong lap chap k*/
void Try(int i) {
if(i==k)
Out();
else {
for(int j = 0; j<n; j++)
if(DanhDau[j] == 0) { //neu dinh j chua duoc chon
DanhDau[j] = 1; //chon dinh j
Luu[i] = j; //luu lai gia tri j
Try(i+1); //tim phan tu tiep theo
DanhDau[j] = 0; //phuc hoi dinh j
}
}
}
/*Chuong trinh chinh*/
void main() {
clrscr();
cout<<"Chinh hop khong lap n chap k";
Init();
Try(0);
getch();
}
//Hàm Try(int i) có thể viết lại theo cách như sau:
void Try(int i) {
for(int j = 0; j<n; j++)
if(DanhDau[j]==0) {
Luu[i] = j;
if(i==n-1)
Out();
else {
DanhDau[j] = 1;
Try(i+1);
DanhDau[j] = 0;
}
}
}

Bài tập 13. Hoán vị mảng số nguyên có n phần tử
Phương pháp: tương tự phương pháp làm bài tập 13 nhưng ở đây ta thay tập hợp {0, 1, … , n-1} là tập hợp giá trị n phần tử của mảng và độ dài của dãy là n.
Ví dụ: n = 3 và A = {-1,0,1} ta sẽ có các dãy con tương ứng là {-1,0}, {-1,1}, {0,-1}, {0,1}, {1,-1} và {1,0}.

[Cài đặt:]

#include <conio.h>
#include <iostream.h>
#define max 20
char DanhDau[max]; //mang danh dau dinh duoc chon
int Luu[max], A[max], n;
/*Khoi tao cac bien*/
void Init() {
cout<<"Nhap n = ";
cin>>n;
for(int i = 0; i<n; i++) {
/*Danh dau vi tri i chua chon*/
DanhDau[i] = 0;
cout<<"A["<<i<<"] = ";
cin>>A[i];
}
}
/*Xuat ket qua ra man hinh*/
void Out() {
cout<<endl;
for(int i = 0; i<n; i++)
cout<<Luu[i]<<" ";
}
/*Hoan vi mang n phan tu*/
void Try(int i) {
if(i==n)
Out();
else {
for(int j = 0; j<n; j++)
if(DanhDau[j] == 0) { //neu dinh j chua duoc chon
DanhDau[j] = 1; //chon dinh j
Luu[i] = A[j]; //luu lai gia tri dinh duoc chon
Try(i+1); //tim dinh tiep theo
DanhDau[j] = 0; //phuc hoi dinh j
}
}
}
/*Chuong trinh chinh*/
void main() {
clrscr();
Init();
cout<<"Hoan vi cac phan tu trong mang A";
Try(0);
getch();
}
Hàm Try(int i) có thể viết lại theo cách như sau:
void Try(int i) {
for(int j = 0; j<n; j++)
if(DanhDau[j]==0) {
Luu[i] = A[j];
if(i==n-1)
Out();
else {
DanhDau[j] = 1;
Try(i+1);
DanhDau[j] = 0;
}
}
}
Bài tập 14. Đặt n quân hậu trên bàn cờ vua
Mô tả bài toán: liệt kê tất cả phương án đặt n quân hậu trên bàn cờ vua cấp nxn sao cho n quân hậu không được phép ăn nhau.
Ví dụ: cho bàn cờ vua cấp 8x8 . Dưới đây là 1 phương án đặt quân hậu:

[Cài đặt:]

#include <conio.h>
#include <iostream.h>
#define max 20
char a[max]; //danh dau cot
char b[2*max-1]; //danh dau huong Dong-Bac
char c[2*max-1]; //danh dau huong Tay-Bac
int Luu[max]; //luu ket qua tim duoc
int n;
/*Khoi tao cac bien*/
void Init() {
cout<<"Nhap n = ";
cin>>n;
//tat ca cac cot chua duoc chon
for(int i = 0; i<n; i++)
a[i] = 0;
//tat ca cac huong chua duoc chon
for( i = 0; i<2*n-1; i++) {
b[i] = 0;
c[i] = 0;
}
}
/*Xuat ket qua ra man hinh*/
void Out() {
cout<<endl;
for(int i = 0; i<n; i++)
cout<<"("<<i+1<<","<<Luu[i]+1<<") ";
}
/*Chinh hop khong lap chap k*/
void Try(int i) {
if(i==n)
Out();
else {
for(int j = 0; j<n; j++)
if(a[j] == 0 && b[i+j] == 0 && c[i-j+n] == 0) {
a[j] = 1; //danh dau cot j
b[i+j] = 1; //danh dau huong Dong-Bac thu i+j
c[i-j+n] = 1; //danh dau huong tay-Bac thu j-i+n
Luu[i] = j; //luu vi tri dat hau (i,j)
Try(i+1); //tim vi tri dat hau tiep theo
a[j] = 0; //phuc hoi cot j
b[i+j] = 0; //phuc hoi huong Dong-Bac thu i+j
c[i-j+n] = 0; //phuc hoi huong tay-Bac thu j-i+n
}
}
}
/*Chuong trinh chinh*/
void main() {
clrscr();
Init();
cout<<"Dat Hau";
Try(0);
getch();
}
Bài tập 15. Mã đi tuần
Mô tả bài toán: đặt quân mã tại ô có vị trí (x,y) trên bàn cờ vua cấp nx n. Hãy liệt kê tất cả các phương án quân mã xuất phát tại vị trí (x,y) có thể nhảy đến tất cả các ô khác trên bàn cờ với điều kiện mỗi ô quân mã chỉ được phép đi qua đúng 1 lần.
Ví dụ: cho bàn cờ vua cấp 8x8 . Ta có 2 phương án đặt quân mã như sau:

[Cài đặt:]

#include <iostream.h>
#include <conio.h>
#define max 10
int A[max][max]; //Mang danh dau
int B[max][max]; //Mang luu duong di
int X[8]={-1,-2,-2,-1,1,2,2,1};
int Y[8]={-2,-1,1,2,2,1,-1,-2};
int n, x, y, Dem=0;
//Khoi tao
void Init() {
cout<<"Nhap n = ";
cin>>n;
cout<<"Nhap x = ";
cin>>x;
cout<<"Nhap y = ";
cin>>y;
for(int i = 0; i<n; i++)
for(int j = 0; j<n; j++)
A[i][j] = 0; //tat ca cac o chua duoc danh dau
B[x][y] = 1; //duong di dau tien
A[x][y] = 1; //danh dau o duoc chon
}
//Xuat ket qua ra man hinh
void Out() {
Dem++;
for(int i = 0; i<n; i++) {
for(int j = 0; j<n; j++) {
printf("%3d",B[i][j]);
}
cout<<endl;
}
cout<<endl;
}
//Tim duong di
void Try(int i) {
if(i > n*n)
Out();
else {
for(int j = 0; j<8; j++) {
int x1 = x + X[j];
int y1 = y + Y[j];
if(x1>=0 && x1<n && y1>=0 && y1<n && A[x1][y1]==0){
A[x1][y1] = 1; //danh dau o (i,j)
B[x1][y1] = i; //luu lai duong di
x = x1; //lay toa do x moi
y = y1; //lay toa do y moi
Try(i+1); //tim duong di tiep theo
A[x1][y1] = 0; //phuc hoi o (i,j)
B[x1][y1] = 0; //xem nhu o chua di qua
x = x1 - X[j]; //phuc hoi dinh x
y = y1 - Y[j]; //phuc hoi dinh y
}
}
}
}
//chuong trinh chinh
void main() {
clrscr();
Init();
Try(2);
if (Dem==0)
cout<<"Khong co duong di";
else
cout<<"So phuong an tim duoc"<<Dem;
getch();
}


----------


Cùng bạn tự học CNTT - tailieucntt.org

[ Database ] Hướng dẫn chuyển Database SQL Server đã được tạo từ máy mình sang một máy khác

Hướng dẫn cách cơ bản hay sử dụng khi chuyển Database SQL Server đã được tạo từ máy mình sang một máy khác.

Lưu ý: các cách đều sử dụng SQL Server Management Studio

Cách 1: đơn giản nhất là Backup từ máy mình rồi Restore lại khi sang máy khác.

Click chuột phải vào Database rồi chọn Tasks >> Backup




Ở máy kia, tạo một Database mới sau đó click chuột phải vào Database mới đó chọn Tasks >> Restore >> Database..



Nhấn vào From device và Add đường dẫn đến file backup



Click chọn tên file vừa Add và nhấn OK



Cách 2: Generate Script Database

Click chuột phải vào Database chọn Tasks >> Generate Scripts..



Nhấn Next cho đến bước Set Scripting Options, Nếu bạn chỉ muốn sao chép cấu trúc Database (gồm các Table, SP, Function, ..) mà không gồm dữ liệu trong các Table thì tiếp tục nhấn Next, nếu muốn sao chép cả dữ liệu thì Click vào Advanced



Trong Option Types of data  to script chọn Schema and data



Sau đó bạn sẽ được 1 file dạng .sql, mang file này sang máy khác chỉ cần kéo file vào SSMS và nhấn Execute để tạo Database.



Cách 3: Copy file Database .mdf rồi Attach lại ở máy khác





Trong 3 cách trên, tôi thường dùng cách 2 nhất, do nếu bạn dùng các phiên bản SQL Server không đồng nhất ở các máy thì cũng không bị lỗi, cách 1 và 3 nếu SQL Server ở máy tạo Database có phiên bản cao hơn máy khác thì khi add vào sẽ không được. Cách 1 thường được dùng nếu bạn lập trình Web do trên Hosting bạn chỉ có thể chọn Restore.

(tham khảo toi88)

[ Sort ] Thuật toán Merge-Sort [Code C++]

 Thuật toán Merge-Sort 

+ Tư tưởng của thuật toán Merge-Sort

Mô tả bài toán: cho 2 danh sách A và B lần lượt có m và n phần tử đã sắp xếp theo thứ tự. Bài toán đặt ra trộn 2 danh sách A và B với nhau thành danh sách C cũng là một danh sách có thứ tự.

+ Thuật toán:

Bước 1: khởi tạo ba chỉ số chạy trong vòng lặp i = 0, j = 0, k = 0 tương ứng cho ba mảng A, B và C.
Bước 2: tại mỗi bước nếu cả hai chỉ số (i<m và j<n) ta chọn min(A[i],B[j]) và lưu nó vào trong C[k]. Chuyển sang Bước 4.
Bước 3: tăng giá trị k lên 1 và quay về Bước 2.
Bước 4: sao chép tất cả các giá trị còn lại từ các danh sách mà chỉ số còn vi phạm (tức i<m hoặc j<m) vào trong mảng C.

Hình minh họa:

+ Cài đặt thuật toán [Code C++]

#include <iostream.h>
#include <conio.h>
#define max 100
// nhap day
void NhapMang(int A[],int n) {
for(int i=0; i<n; i++) {
cout<<"Phan tu "<<i<<" = ";
cin>>A[i];
}
}
// in day
void XuatMang(int A[],int n) {
cout<<endl;
for(int i=0; i<n; i++)
cout<<A[i]<<"\t";
}
// merge sort
void MergeSort(int m, int n, int &k, int A[], int B[], int C[]) {
int i = 0, j = 0;
k = 0;
while (i < m && j < n) {
if (A[i] <= B[j]) {
C[k] = A[i];
i++;
}
else
{
C[k] = B[j];
j++;
}
k++;
}
if (i < m) {
for (int p = i; p < m; p++) {
C[k] = A[p];
k++;
}
}
else
{
for (int p = j; p < n; p++) {
C[k] = B[p];
k++;
}
}
}
// ham main
void main() {
int A[max],B[max],C[max],n,m,k;
clrscr();
cout<<"\n Nhap so phan tu cua day A: n = ";
cin>>n;
cout<<"\n Nhap so phan tu cua day B: m = ";
cin>>m;
cout<<"Nhap day A:\n";
NhapMang(A,m);
cout<<"Nhap day B:\n";
NhapMang(B,n);
cout<<"\n => Sap xep tron 2 mang A, B \n";
MergeSort(m,n,k,A,B,C);
XuatMang(C,k);
getch();
}
//==============================


--------------------------------------------
Xem thêm các thuật toán khác: 


------------------------
Tự học lập trình C++:

[ Sort ] Thuật toán Heap-Sort [Code C++]

Thuật toán sắp xếp vun đống - heap sort

+ Tư tưởng của thuật toán Heap-Sort (săp xếp vun đống)

Ta xem danh sách n phần tử a1, a2, a3, ... an  là cây nhị phân.
Cây nhị phân này được xác định như sau: tại nút thứ i tương ứng với chỉ số thứ i của mảng có con trái là nút 2*(i+1)-1 và con phải 2*(i+1) nếu 2*(i+1)-1 và 2*(i+1) nhỏ hơn n.

Thuật toán được mô tả như sau:
- Xây dựng Heap (đống) sao cho với mọi nút cha đều có giá trị lớn hơn nút con. Khi đó nút gốc là nút có giá trị lớn nhất.
- Hoán vị nút gốc với nút thứ n – 1 và xây dựng lại Heap mới với n – 2 nút và tiếp tục hoán vị nút gốc với nút lá cuối của cây mới sau n – 2 bước ta sẽ thu được danh sách được sắp xếp theo thứ tự.

Ví dụ: xét danh sách trước khi sắp xếp



+ Cài đặt thuật toán [Code Tubor C++]

#include <iostream.h>
#include <conio.h>
#define max 100
// nhap day
void NhapMang(int A[],int n) {
for(int i=0; i<n; i++) {
cout<<"nhap Phan tu thu A["<<i<<"] =";
cin>>A[i];
}
}
// in day
void XuatMang(int A[],int n) {
cout<<endl;
for(int i=0; i<n; i++)
cout<<A[i]<<"\t";
}
// doi cho 2 so
void Swap(int &a,int &b) {
int temp = a;
a = b;
b = temp;
}
//hoan vi nut cha thu i phai lon hon nut con (vun dong)
void Heapify(int A[],int n, int i) {
int Left = 2*(i+1)-1;
int Right = 2*(i+1);
int Largest;
if(Left<n && A[Left]>A[i])
Largest = Left;
else
Largest = i;
if(Right<n && A[Right]>A[Largest])
Largest = Right;
if(i!=Largest) {
Swap(A[i],A[Largest]);
Heapify(A,n,Largest);
}
}
//xay dung Heap sao cho moi nut cha luon lon hon nut con tren cay (tao cay)
void BuildHeap(int A[], int n) {
for(int i = n/2-1; i>=0; i--)
Heapify(A,n,i);
}
// heap-sort
void HeapSort(int A[], int n) {
BuildHeap(A,n);
for(int i = n-1; i>0; i--){
Swap(A[0],A[i]);
Heapify(A,i,0);
}
}
// ham main
void main() {
int A[max], n;
clrscr();
cout<<"Nhap so phan tu:";
cin>>n;
NhapMang(A,n);
cout<<"\nMang vua nhap la:";
XuatMang(A,n);
cout<<"\nSap xep theo Heap Sort:";
HeapSort(A,n);
XuatMang(A,n);
getch();
}

//======================================

--------------------------------------------
Xem thêm các thuật toán khác: 


------------------------
Tự học lập trình C++:

----------

[ Sort ] Thuật toán Quick - Sort [ code C++ ]

Thuật toán sắp xếp nhanh - Quick Sort 

+ Ý tưởng thuật toán

Xét dãy n phần tử a1, a2, a3, .... an.
Bước 1: chọn khóa pivot (chốt): a(Left + Righ)/ 2.
Bước 2: Phân vùng. Những phần tử nhỏ hơn khóa thì nằm bên trái của khóa, những phần tử lớn hơn khóa thì nằm bên phải của khóa và những phần tử bằng khóa có thể nằm bất cứ chỗ nào trên dãy.
Bước 3: sắp xếp cho cả hai phân vùng mới bên trái và bên phải.

+ Mô tả hoạt động của thuật toán Quick Sort:


+ Cài đặt thuật toán  [ Code Tubor C++  ]
#include <iostream.h>
#include <conio.h>
#define max 100
// nhap mang
void NhapMang(int A[],int n) {
for(int i=0; i<n; i++) {
cout<<"nhap Phan tu thu A["<<i<<"] =";
cin>>A[i];
}
}
// in mang
void XuatMang(int A[],int n) {
cout<<endl;
for(int i=0; i<n; i++)
cout<<A[i]<<"\t";
}
// doi cho 2 so
void Swap(int &a,int &b) {
int temp = a;
a = b;
b = temp;
}
// thuat toan quick-sort
void QuickSort(int A[], int Left, int Right) {
int i = Left, j = Right;
int pivot = A[(Left + Right) / 2];
/* partition */
while (i <= j) {
while (A[i] < pivot)
i++;
while (A[j] > pivot)
j--;
if (i <= j) {
Swap(A[i],A[j]);
i++;
j--;
}
}
/* recursion */
if (Left < j)
QuickSort(A, Left, j);
if (i < Right)
QuickSort(A, i, Right);
}
// ham main
void main() {
int A[max], n;
clrscr();
cout<<"Nhap so phan tu:";
cin>>n;
NhapMang(A,n);
cout<<"\nMang vua nhap la:";
XuatMang(A,n);
cout<<"\nSap xep theo Quick Sort:";
QuickSort(A,0,n-1);
XuatMang(A,n);
getch();
}
//======================================


--------------------------------------------
Xem thêm các thuật toán khác: 

Danh mục bài viết