Skip navigation.

Smile for life

Khinh vũ phi dương

Rất nhiều tài liệu đủ thể loại

Kill Process được bảo vệ

Trong Task Manager nếu bạn dùng chức năng End Process thì bạn chỉ kết thúc được một số Process của các chương trình bình thường. Đối với các Process được bảo vệ như tiến trình của OS hay các trình diệt virus thì bạn không thể kết thúc dễ dàng như thế. Điều này cũng tương tự khi ta dùng hàm API TerminateProcess().

Nguyên lý: Một process có thể Kill một Process khác được bảo vệ nếu như process này có đặc quyền DEBUG các process khác, sau đó process này có thể dùng hàm API TerminateProcess(hProcess,0)!
Đoạn mã sau dùng để gán quyền DEBUG cho một process:

Code:

void GetDebugPriv( void )
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;

if ( ! OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return;

if ( !LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) )
{
CloseHandle( hToken );
return;
}

tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );

CloseHandle( hToken );
}

Bảo vệ Web chống lại SQL Injection

1. SQL Injection là gì? Việc thiết kế và đưa vào hoạt động một website luôn đòi hỏi các nhà phát triển phải quan tâm đến các vấn đề về an toàn, bảo mật nhằm giảm thiểu tối đa khả năng bị tấn công từ các tin tặc. Tuy nhiên, thông thường các nhà phát triển đa số tập trung vào các vấn đề an toàn trong việc chọn hệ điều hành, hệ quản trị CSDL, webserver sẽ chạy ứng dụng, ... Ví dụ, người ta thường quan tâm nhiều đến các lỗ hổng về an toàn trên IIS hơn là quan tâm đến các đoạn mã của ứng dụng có tiềm ẩn các lỗ hổng nghiêm trọng hay không. Một trong số các lỗ hổng này đó là SQL injection attack. SQL injection là một kĩ thuật cho phép những kẻ tấn công thi hành các câu lệnh truy vấn SQL bất hợp pháp (không được người phát triển lường trước) bằng cách lợi dụng lỗ hổng trong việc kiểm tra dữ liệu nhập trong các ứng dụng web. Hậu quả của nó rất tai hại vì nó cho phép những kẻ tấn công có thể thực hiện các thao tác xóa, hiệu chỉnh, … do có toàn quyền trên cơ sở dữ liệu của ứng dụng. Lỗi này thường xảy ra trên các ứng dụng web có dữ liệu được quản lí bằng các hệ quản trị CSDL như SQL Server, Oracle, DB2,Sysbase. Xét một ví dụ điển hình, thông thường để cho phép người dùng truy cập vào các trang web được bảo mật,hệ thống thường xây dựng trang đăng nhập để yêu cầu người dùng nhập thông tin về tên đăng nhập và mật khẩu. Sau khi người dùng nhập thông tin vào, hệ thống sẽ kiểm tra tên đăng nhập và mật khẩu có hợp lệ hay không để quyết định cho phép hay từ chối thực hiện tiếp. Trong trường hợp này, người ta có thể dùng 2 trang, một trang HTML để hiển thị form nhập liệu và một trang ASP dùng để xử lí thông tin nhập từ phía người dùng. Ví dụ: Login.htm <form action="ExecLogin.asp" method="post"> Username: <input type="text" name="txtUsername">
Password: <input type="password" name="txtPassword">
<input type="submit"> </form> ExecLogin.asp <% Dim p_strUsername, p_strPassword, objRS, strSQL p_strUsername = Request.Form("txtUsername") p_strPassword = Request.Form("txtPassword") strSQL = "SELECT * FROM tblUsers " & _ "WHERE Username='" & p_strUsername & _ "' and Password='" & p_strPassword & "'" Set objRS = Server.CreateObject("ADODB.Recordset") objRS.Open strSQL, "DSN=..." If (objRS.EOF) Then Response.Write "Invalid login." Else Response.Write "You are logged in as " & objRS("Username") End If Set objRS = Nothing %> Thoạt nhìn, đoạn mã trong trang ExecLogin.asp dường như không chứa bất cứ một lỗ hổng về an toàn nào. Người dùng không thể đăng nhập mà không có tên đăng nhập và mật khẩu hợp lệ. Tuy nhiên, đoạn mã này thực sự không an toàn và là tiền đề cho một SQL injection attack. Đặc biệt, chỗ sơ hở nằm ở chỗ dữ liệu nhập vào từ người dùng được dùng để xây dựng trực tiếp câu lệnh truy vấn SQL. Chính điều này cho phép những kẻ tấn công có thể điều khiển câu truy vấn sẽ được thực hiện. Ví dụ, nếu người dùng nhập chuỗi sau vào trong cả 2 ô nhập liệu username/password của trang Login.htm: ‘ or ‘’ = ‘ .Lúc này, câu truy vấn sẽ được gọi thực hiện là: SELECT * FROM tblUsers WHERE Username='' or ''='' and Password = '' or ''='' Câu truy vấn này là hợp lệ và sẽ trả về tất cả các bản ghi của tblUsers và đoạn mã tiếp theo xử lí người dùng đăng nhập bất hợp pháp này như là người dùng đăng nhập hợp lệ. Một ví dụ khác của SQL injection attack nữa là khi các trang web sử dụng dữ liệu nhập vào theo dạng querystring ( bằng cách gõ cặp tham số và giá trị trực tiếp trên thanh địa chỉ hoặc dùng form với thuộc tính ACTION là GET). Ví dụ sau minh họa một trang ASP nhận dữ liệu cho biến ID thông qua querystring và phát sinh nội dung của trang đó dựa trên ID: <% Dim p_lngID, objRS, strSQL p_lngID = Request("ID") strSQL = "SELECT * FROM tblArticles WHERE ID=" & p_lngID Set objRS = Server.CreateObject("ADODB.Recordset") objRS.Open strSQL, "DSN=..." If (Not objRS.EOF) Then Response.Write objRS("ArticleContent") Set objRS = Nothing %> Trong các tình huống thông thường, đoạn mã này hiển thị nội dung của article có ID trùng với ID được chuyển đến cho nó dưới dạng querystring. Ví dụ, trang này có thể được gọi như sau: http://www.example.com/Article.asp?ID=1055, để hiển thị nội dung của article có ID là 1055. Giống như ví dụ đăng nhập ở trước, đoạn mã này để lộ sơ hở cho một SQL injection attack. Kẻ tấn công có thể thay thế một ID hợp lệ bằng cách gán ID cho một giá trị khác, để thực hiện một lệnh SQL bất hợp pháp, ví dụ như: 0 or 1=1 (nghĩa là, http://www.example.com/Article.asp?ID=0 or 1=1). Câu truy vấn SQL lúc này sẽ trả về tất cả các article từ bảng dữ liệu vì nó sẽ thực hiện câu lệnh: SELECT * FROM tblArticles WHERE ID=0 or 1=1 Tất nhiên ví dụ này dường như không có gì nguy hiểm, nhưng hãy thử tưởng tượng kẻ tấn công có thể xoá toàn bộ CSDL bằng cách chèn vào các đoạn lệnh nguy hiểm như lệnh DELETE. Tất cả chỉ là đơn giản thay đổi chuỗi gán dữ liệu cho ID, ví dụ như: http://www.example.com/Article.asp?ID=1055; DELETE FROM tblArticles. 2. Các tác hại và cách phòng tránh Tác hại từ SQL Injection attack tùy thuộc vào môi trường và cách cấu hình hệ thống. Nếu ứng dụng sử dụng quyền dbo (quyền của người sở hữu CSDL - owner) khi thao tác dữ liệu, nó có thể xóa toàn bộ các bảng dữ liệu, tạo các bảng dữ liệu mới, … Nếu ứng dụng sử dụng quyền sa (quyền quản trị hệ thống), nó có thể điều khiển toàn bộ hệ quản trị CSDL và với quyền hạn rộng lớn như vậy nó có thể tạo ra các tài khoản người dùng bất hợp pháp để điều khiển hệ thống của bạn. Để phòng tránh các nguy cơ có thể xảy ra, hãy bảo vệ các câu truy vấn SQL là bằng cách kiểm soát chặtchẽ tất cả các dữ liệu nhập nhận được từ đối tượng Request (Request, Request.QueryString, Request.Form, Request.Cookies, and Request.ServerVariables). - Trong trường hợp dữ liệu nhập vào là chuỗi, như trong ví dụ 1, lỗi xuất phát từ việc có dấu nháy đơn trong dữ liệu. Để tránh điều này, thay thế các dấu nháy đơn bằng hàm Replace để thay thế bằng 2 dấu nháy đơn: p_strUsername = Replace(Request.Form("txtUsername"), "'", "''") p_strPassword = Replace(Request.Form("txtPassword"), "'", "''") - Trong trường hợp dữ liệu nhập vào là số, như trong ví dụ 2, lỗi xuất phát từ việc thay thế một giá trị được tiên đoán là dữ liệu số bằng chuỗi chứa câu lệnh SQL bất hợp pháp. Để tránh điều này, đơn giản hãy kiểm tra dữ liệu có đúng kiểu hay không: p_lngID = CLng(Request("ID")) Như vậy, nếu người dùng truyền vào một chuỗi, hàm này sẽ trả về lỗi ngay lập tức. Ngoài ra để tránh các nguy cơ từ SQL Injection attack, nên chú ý loại bỏ bất kì thông tin kĩ thuật nào chứa trong thông điệp chuyển xuống cho người dùng khi ứng dụng có lỗi. Các thông báo lỗi thông thường tiết lộ các chi tiết kĩ thuật có thể cho phép kẻ tấn công biết được điểm yếu của hệ thống. Cuối cùng, để giới hạn mức độ của SQL Injection attack, nên kiểm soát chặt chẽ và giới hạn quyền xử lí dữ liệu đến tài khoản người dùng mà ứng dụng web đang sử dụng. Các ứng dụng thông thường nên tránh dùng đến các quyền như dbo hay sa. Quyền càng bị hạn chế, thiệt hại càng ít. Các tài liệu tham khảo SQL Injection FAQ: http://www.sqlsecurity.com/DesktopDefault.aspx?tabindex=2&tabid=3 Advanced SQL Injection : http://www.nextgenss.com/papers/advanced_sql_injection.pdf Preventing SQL Injection: http://www.owasp.org/asac/input_validation/sql.shtml Biên dịch từ: http://www.4guysfromrolla.com/webtech/061902-1.shtml Biên dịch bởi Lê Đình Duy (Khoa CNTT – ĐHKHTN Tp.HCM)

Tự viết một chương trình Sniffer đơn giản

Bài này mình hướng dẫn các bạn viết một sniffer (nghe lén) packet đơn giản trên Windows. Để lập trình được thì cần các bạn hiểu rõ cách lập trình socket trong ngôn ngữ C.
Với cách lập trình socket thông thường chúng ta sử dụng SOCK_STREAM, SOCK_DGRAM tức lập trình ở mức Application của mạng mà thôi, để lập trình ở mức IP (tức tầng Network trong 4 tầng của Internet: Tầng vật lý --> Tầng Ip--> Tầng TCP --> Tầng ứng dụng) sử dụng SOCK_RAW là một dạng socket "thô"
Điều đầu tiên bao giờ chúng ta cũng phải khởi tạo thư viện Winsocket
Hàm khởi tạo thư viện như sau:
Code:

void InitWinSock()
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0) return;
}

Chi tiết hàm WSAStartup có thể xem trợ giúp của MSDN ...

Cách tạo một Raw Socket như sau:
Code:

intCreateRawSocket()
{
intsock;
if ((sock=WSASocket(AF_INET,SOCK_RAW,0,NULL,NULL,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) return 0;
return sock;
}

Hàm trên trả về một sock mới nếu như không gặp lỗi

Như chúng ta đã biết mô hình mạng Internet được phân chia thành 4 tầng (Tầng vật lý <--> Tầng Ip<--> Tầng TCP <--> Tầng ứng dụng) tương ứng với 7 tầng của mô hình OSI (Tầng vật lý <--> Tầng liên kết <--> Tầng mạng <--> Tầng vận chuyển <--> Tầng phiên <---> Tầng trình diễn <--> Tầng ứng dụng). Mình khỏi phải nhắc lại mô hình OSI như thế nào vì có rất nhiều bài viết trong diễn đàn đã nói đến OSI
Giới thiệu cấu trúc của gói IP, TCP, ICMP
a. Gói IP (ở tầng IP)
Định nghĩa một struct mô tả gói IP
Code:

struct ip_hdr{
unsignedcharver_ihl;//<-- Version (4 bits) + Internet Header Length (4 bits)
unsignedchartos;//<-- Type Of Service
unsigned shorttol_len//<-- Total Length (Ip Header + TCP Header + Data)
unsignedshortid//<-- Identification
unsignedshortoffset//<-- Frame Offset trong đó 8 bits cho flags
unsignedcharttl//<-- Time to Live
unsigned charprotocol//<-- Protocol
unsigned shortchecksum//<-- Header Checksum
unsigned intsaddr//<-- Source Address
unsignedintdaddr//<-- Destination Address
};

b. Gói TCP
Định nghĩa một struct mô tả gói TCP
Code:

struct tcp_hdr{
unsignedshortsport//<-- Source Port
unsigned shortdport//<-- Destiantion Port
unsigned intseq_num//<-- Sequence Number
unsignedintack_num//<-- Acknowledgment Number
unsigned chardataoffset//<--Data Offset
unsigned charflags//Flags: SYN, ACK, FIN, RST, PUSH, URG (2 bits) + 6 bits Reserve
unsigned shortwindow//Windows
unsigned shortchecksum //Checksum
unsigned shorturgpointer //Urgent Pointer
}

c. Gói ICMP
Định nghĩa một struct mô tả gói ICMP
Code:

struct icmp_hdr{
unsigned chartype//Type
unsigned charcode//Code
unsigned shortchecksum
unsigned shortid//Identification
unsigned shortsequence
unsigned shorttimestamp
}

Ở trên là toàn bộ định nghĩa về các gói IP, ICMP, TCP. Trong bài này mình chỉ hướng dẫn bắt các gói TCP và ICMP mà thôi, còn các gói khác thì có thể làm tương tự

Code:

#include <winsock2.h>
#include <stdio.h>
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#pragma comment (lib,"ws2_32.lib")
voidInitWinSock();
intCreateRawSocket();
intSniffer(intsock);
intpacketcapture(char *packet);
inttcp_display(struct ip_hdr*ip,struct tcp_hdr *tcp);
inticmp_display(struct ip_hdr *ip,struct icmp_hdr *icmp);
struct ip_hdr
{
unsigned charver_ihl;//VER va IHL (Internet Header Length)
unsigned chartos;//Type of Server
unsigned shorttol_len;//Total Length=IpHeader + TCP Header + Data
unsigned shortid;//Identification
unsigned shortoffset;//Frame offset
unsigned charttl;//Time To Live
unsigned charprotocol;
unsigned shortchecksum;
unsigned intsaddr;//Source Address
unsigned intdaddr;//Destination Address
};

struct tcp_hdr
{
unsigned shortsport;//Source Port
unsigned shortdport;//Detinations Port
unsigned intseqnum;//Sequence;
unsigned intacknum;//Acknowlege
unsigned chardataoffset;//Data Offset
unsigned charflags;//SYN, URG, FIN, ACK, RST, PUSH + Preserve
unsigned short windows;
unsigned shortchecksum;
unsigned shorturgpointer;
};
struct icmp_hdr
{
unsigned chartype;
unsigned charcode;
unsigned shortchecksum;
unsigned shortid;
unsigned shortsequence;
unsigned shorttimestamp;
};
intsocksniffer;
intmain()
{
InitWinSock();
socksniffer=CreateRawSocket();
printf("Seamoun (http://nhomvicki.net)\n");
printf("Sniffer TCP, ICMP v1.0\n\n");
printf(" Packet Capture ...\n");
Sniffer(socksniffer);
return 0;
}
//Ham khoi tao thu vien WinSock
void InitWinSock()
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0) return;
}
//Ham tao RawSocket
intCreateRawSocket()
{
intsock;
if ((sock=WSASocket(AF_INET,SOCK_RAW,0,NULL,NULL,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) return 0;
return sock;
}
//Ham thuc hien Sniffer
intSniffer(int sock)
{
DWORD dwBufferLen[10], dwBufferInLen = 1, dwBytesReturned = 0;

char *HostName=new char [32];
unsigned longnSize=32;
structhostent*hp;
sockaddr_infrom,dest;
intsread,fromlen=sizeof(from);

char *packet=new char [2048];
if (GetComputerName(HostName,&nSize)==0) return -1;
if ((hp=gethostbyname(HostName))==0) return -1;
delete(HostName);

inti=0;
while ((hp->h_addr_list[i+1])!=NULL)
{
i++;
}
memcpy(&from.sin_addr.s_addr,hp->h_addr_list,hp->h_length);
if ((hp=gethostbyname(inet_ntoa(from.sin_addr)))==NULL) return -1;

memset(&dest,0,sizeof(dest));
memcpy(&dest.sin_addr.s_addr,hp->h_addr_list[0],hp->h_length);
dest.sin_family=AF_INET;
dest.sin_port=htons(8000);
if (bind(sock,(struct sockaddr *)&dest,sizeof(dest))==SOCKET_ERROR) return -1;

//WSAIoctl : dieu khien vao ra socket
if(WSAIoctl(sock, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL) == SOCKET_ERROR)return(-1);

//Don nhan va su ly goi du lieu
while (1)
{
sread=recvfrom(sock,packet,8191,0,(struct sockaddr *)&from.sin_addr,&fromlen);
if ((sread==SOCKET_ERROR)||sread<0) continue ;
packetcapture(packet);
}
delete(packet);

return 0;
}
//Ham thuc hien phan tich goi du lieu
intpacketcapture(char *packet)
{
struct ip_hdr*ip;
struct tcp_hdr*tcp;
struct icmp_hdr*icmp;
ip=(struct ip_hdr *)packet;
tcp=(struct tcp_hdr *)(packet+sizeof(struct ip_hdr));
icmp=(struct icmp_hdr *)(packet+sizeof(struct ip_hdr));
switch(ip->protocol)
{
case 6:
tcp_display(ip,tcp);
break;
case 1:
icmp_display(ip,icmp);
break;
default:
break;
}
return 0;
}
//Ham hien thi goi TCP
inttcp_display(ip_hdr *ip,tcp_hdr *tcp)
{
printf("TCP: [%d] %s:%d", ntohs(ip->tol_len), inet_ntoa(*(struct in_addr *)&ip->saddr), ntohs(tcp->sport));
printf(" > %s:%d|ttl = %d|win = %d|checksum = %d|flag = %d\n\n", inet_ntoa(*(struct in_addr *)&ip->daddr),
ntohs(tcp->dport), ip->ttl, ntohs(tcp->windows), tcp->checksum, tcp->flags);
return 0;
}
//Ham hien thi goi ICMP
int icmp_display(struct ip_hdr *ip, struct icmp_hdr *icmp)
{

printf("ICMP: [%d] %s", ntohs(ip->tol_len), inet_ntoa(*(struct in_addr *)&ip->saddr));
printf(" > %s type = %d|code = %d|ttl = %d|seq = %x\n", inet_ntoa(*(struct in_addr *)&ip->daddr), icmp->type, icmp->code, ip->ttl, ntohs(icmp->sequence));
return 0;
}


Kết quả khi chạy chương trình
+ Thực hiện gửi gói ICMP bằng cách dùng lệnh PING
Code:

C:\>ping 10.0.0.2
Reply from 10.0.0.2: bytes=32 time<10ms TTL=64
Reply from 10.0.0.2: bytes=32 time=15ms TTL=64
Reply from 10.0.0.2: bytes=32 time=15ms TTL=64
Reply from 10.0.0.2: bytes=32 time=15ms TTL=64

Ping statistics for 10.0.0.2:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 15ms, Average = 11ms

Chương trình Sniffer:
Seamoun (http://nhomvicki.net)
Sniffer TCP, ICMP v1.0

Packet Capture ...
ICMP: [60] 10.0.0.1 > 10.0.0.2 type = 8|code = 0|ttl = 128|seq = 3d00
ICMP: [60] 10.0.0.2 > 10.0.0.1 type = 0|code = 0|ttl = 64|seq = 3d00
ICMP: [60] 10.0.0.1 > 10.0.0.2 type = 8|code = 0|ttl = 128|seq = 3e00
ICMP: [60] 10.0.0.2 > 10.0.0.1 type = 0|code = 0|ttl = 64|seq = 3e00
ICMP: [60] 10.0.0.1 > 10.0.0.2 type = 8|code = 0|ttl = 128|seq = 3f00
ICMP: [60] 10.0.0.2 > 10.0.0.1 type = 0|code = 0|ttl = 64|seq = 3f00
ICMP: [60] 10.0.0.1 > 10.0.0.2 type = 8|code = 0|ttl = 128|seq = 4000
ICMP: [60] 10.0.0.2 > 10.0.0.1 type = 0|code = 0|ttl = 64|seq = 4000


+Thực hiện gửi gói TCP bằng netcat
Code:

C:\>nx -vv -n 10.0.0.1

Chương trình Sniffer:
Seamoun (http://nhomvicki.net)
Sniffer TCP, ICMP v1.0

Packet Capture ...
TCP: [64] 10.0.0.1:80 > 10.0.0.2:1033|ttl = 128|win = 64240|checksum = 55340|flag = 18
TCP: [60] 10.0.0.2:1033 > 10.0.0.1:80|ttl = 64|win = 5840|checksum = 5942|flag = 2
TCP: [52] 10.0.0.2:1033 > 10.0.0.1:80|ttl = 64|win = 5840|checksum = 23589|flag = 16

seamoun - HVA
Example Code : http://www.rumint.org/software/rumint/rumint_2.11_source.zip

Ebooks Photoshop Tip & Strick

Mình xin giới thiệu Ebook các thủ thuật Photoshop:

http://www.mediafire.com/?8xm2w4zebyj

Ratatouille, DVDRip (2007)



http://www.mediafire.com/?4iax1eyt6g0
http://www.mediafire.com/?0tizlb441ni
http://www.mediafire.com/?7ttm1wjy1zk
http://www.mediafire.com/?f0kysjsmohy
http://www.mediafire.com/?cnm50y3hqj3
http://www.mediafire.com/?5gx34jd2jnj
http://www.mediafire.com/?aj0nmwbyrjn
http://www.mediafire.com/?5dminntlnyg
http://www.mediafire.com/?clddkqyvzxl
http://www.mediafire.com/?5tamnfgo1ym
http://www.mediafire.com/?45jjz6ljyd0
http://www.mediafire.com/?b3j9f1220gj
http://www.mediafire.com/?5otjgqqmslm
http://www.mediafire.com/?57rq1myxjyx

Password:

tehparadox.com

Microsoft Windows Crystal XP V3 2008


Features

1-All latest hotfixes integrated till this moment
2-More speed while browsing internet and network computers
3-New programs has been added with the latest versions
4-More useful registry tweaks
5-Faster connection speed has been unlocked
6-Annoying windows error message has been disabled
7-windows file protection has been disabled
8-New beautiful background wallpapers
9-New style icons and themes
10-Transparent glass aero
11-New boot screen and logon screen
and much more

Windows Crystal XP V3
--------------------------------------------------------------------------
Only install this edition of Windows onto a freshly formatted partition

First of all there is {no languages or drivers has been removed}
======================================

Removed

Help and support files
Wallpapers and backgrunds {Replaced}
Windows Sounds
Old Windows Themes {Replaced}
Wordpad
Movie Maker
Old Windows Cursures {Replaced}
Old screen savers

Integrated

All latest microsoft sp2 hotfixes till july 2007
Internet Explorer 7

Media Player 11
Flash player 9
Direct x9
Control panel addons:
1-Boot safe
2-Boot Vis
3-Clear Type Tuning
4-Cpu-Z.CPL
5-Dial-a-fix
6-HD Tune
7-HostXpert
8-Mem Test
9-MS Autoplay Repair Wizard
10-MS Time Zone
11-MS Virtual cd-Rom
12-MS Config
13-Msi Cleanup Utility
14-Services and Devices
15-Startup Control Panel
16-Tweakui
17-User Accounts 2
18-Win Update List
19-Xp-Antispy


Default Programs

1-Foxit pdf reader
2-K-Lite Mega codec pack
3-Node23 Antiviruse
4-Orbit Downloader
5-Tuneup Utilities
6-Winamp mp3 player
7-Windows Live Messenger
8-Winrar Corporat
9-Yahoo Messenger

Optional Programs

1-Firefox Web Browser
2-Microsoft .NET Framework Version 2.0
3-Microsoft Java
4-Faststone Image Viewer
5-Nero Micro v7.7.5.1
6-UltraISO Premium Edition
7-Powertoy Image Resizer
8-Utorrent
9-Paint .Net
10-Flash Games

Mirror 1:
http://mihd.net/5w20v1 
http://mihd.net/md5igq 
http://mihd.net/0ami75 
http://mihd.net/ptjxeb 
http://mihd.net/qwbzc4 
http://mihd.net/4fl75j

Mirror 2:
http://www.zshare.net/download/3195716966ac11/ http://www.zshare.net/download/319584291623df/ http://www.zshare.net/download/319592973dc1e5/ http://www.zshare.net/download/3196257375f2d7/ http://www.zshare.net/download/31962823dd4808/ http://www.zshare.net/download/320245564e390b/

In ra bảng cửu chương

uses crt;
VAR a,b:Integer;
BEGIN
clrscr;
     a:=1;
               While a <= 10 do
                     Begin
                          b:=1;
                          While b <= 10 do
                                  Begin
                                       Write('  ',a,' x ', b,' = ',a*b);
                                       b:=b+1;
                                  end;
                          a:= a + 1;
                      end;
     readln;
end.

Toán thuật trong Pascal



THUẬT TOÁN KIỂM TRA SỐ NGUYÊN TỐ
Thuật toán của ta dựa trên ý tưởng: nếu n >1 không chia hết cho số nguyên nào trong tất cả các số từ 2 đến thì n là số nguyên tố. Do đó ta sẽ kiểm tra tất cả các số nguyên từ 2 đến có round(sqrt(n)), nếu n không chia hết cho số nào trong đó thì n là số nguyên tố.
Nếu thấy biểu thức round(sqrt(n)) khó viết thì ta có thể kiểm tra từ 2 đến n div 2.
Hàm kiểm tra nguyên tố nhận vào một số nguyên n và trả lại kết quả là true (đúng) nếu n là nguyên tố và trả lại false nếu n không là số nguyên tố.
function ngto(n:integer):boolean;
var i:integer;
begin
ngto:=false;
if n<2 then exit;
for i:=2 to trunc(sqrt(n)) do
if n mod i=0 then exit; {nếu n chia hết cho i thì n không là nguyên tố => thoát luôn}
ngto:=true;
end;
Chú ý: Dựa trên hàm kiểm tra nguyên tố, ta có thể tìm các số nguyên tố từ 1 đến n bằng cách cho i chạy từ 1 đến n và gọi hàm kiểm tra nguyên tố với từng giá trị i.
THUẬT TOÁN TÍNH TỔNG CÁC CHỮ SỐ CỦA MỘT SỐ NGUYÊN
Ý tưởng là ta chia số đó cho 10 lấy dư (mod) thì được chữ số hàng đơn vị, và lấy số đó div 10 thì sẽ được phần còn lại. Do đó sẽ chia liên tục cho đến khi không chia được nữa (số đó bằng 0), mỗi lần chia thì được một chữ số và ta cộng dồn chữ số đó vào tổng.
Hàm tính tổng chữ số nhận vào 1 số nguyên n và trả lại kết quả là tổng các chữ số của nó:
function tongcs(n:integer): integer;
var s : integer;
begin
s := 0;
while n <> 0 do begin
s := s + n mod 10;
n := n div 10;
end;
tongcs := s;
end;
Chú ý: Tính tích các chữ số cũng tương tự, chỉ cần chú ý ban đầu gán s là 1 và thực hiện phép nhân s với n mod 10.
THUẬT TOÁN EUCLIDE TÍNH UCLN
Ý tưởng của thuật toán Euclide là UCLN của 2 số a,b cũng là UCLN của 2 số b và a mod b, vậy ta sẽ đổi a là b, b là a mod b cho đến khi b bằng 0. Khi đó UCLN là a.
Hàm UCLN nhận vào 2 số nguyên a,b và trả lại kết quả là UCLN của 2 số đó.
function UCLN(a,b: integer): integer;
var r : integer;
begin
while b<>0 do begin
r := a mod b;
a := b;
b := r;
end;
UCLN := a;
end;
Chú ý: Dựa trên thuật toán tính UCLN ta có thể kiểm tra được 2 số nguyên tố cùng nhau hay không. Ngoài ra cũng có thể dùng để tối giản phân số bằng cách chia cả tử và mẫu cho UCLN.
THUẬT TOÁN TÍNH TỔNG CÁC ƯỚC SỐ CỦA MỘT SỐ NGUYÊN
Để tính tổng các ước số của số n, ta cho i chạy từ 1 đến n div 2, nếu n chia hết cho số nào thì ta cộng số đó vào tổng. (Chú ý cách tính này chưa xét n cũng là ước số của n).
function tongus(n : integer): integer;
var i,s : integer;
begin
s := 0;
for i := 1 to n div 2 do
if n mod i = 0 then s := s + i;
tongus := s;
end;
Chú ý: Dựa trên thuật toán tính tổng ước số, ta có thể kiểm tra được 1 số nguyên có là số hoàn thiện không: số nguyên gọi là số hoàn thiện nếu nó bằng tổng các ước số của nó.
CÁC THUẬT TOÁN VỀ VÒNG LẶP
THUẬT TOÁN TÍNH GIAI THỪA MỘT SỐ NGUYÊN
Giai thừa n! là tích các số từ 1 đến n. Vậy hàm giai thừa viết như sau:
function giaithua(n : integer) : longint;
var i : integer; s : longint;
begin
s := 1;
for i := 2 to n do s := s * i;
giaithua := s;
end;
THUẬT TOÁN TÍNH HÀM MŨ
Trong Pascal ta có thể tính ab bằng công thức exp(b*ln(a)). Tuy nhiên nếu a không phải là số dương thì không thể áp dụng được.
Ta có thể tính hàm mũ an bằng công thức lặp như sau:
function hammu(a : real; n : integer): real;
var s : real; i : integer;
begin
s := 1;
for i := 1 to n do s := s * a;
hammu := s;
end;
THUẬT TOÁN TÍNH CÔNG THỨC CHUỖI
Thuật toán tính hàm ex:

Đặt: và , ta được công thức truy hồi:

Khi đó, ta có thể tính công thức chuỗi trên như sau:
function expn(x: real; n : integer): real;
var s,r : real; i : integer;
begin
s := 1; r := 1;
for i := 1 to n do begin
r := r * x / i;
s := s + r;
end;
expn := s;
end;
CÁC BÀI TẬP VỀ MẢNG 1 CHIỀU VÀ 2 CHIỀU
BÀI TẬP 1
Nhập vào một số n (5<=n<=10) và n phần tử của dãy a, 1<ai<100 (có kiểm tra dữ liệu khi nhập).
a)In ra các phần tử là số nguyên tố của dãy.
b)Tính ước chung lớn nhất của tất cả các phần tử của dãy.
c)Tính biểu thức sau:

d)Sắp xếp dãy tăng dần và in ra dãy sau sắp xếp.
HƯỚNG DẪN
Ta nên chia chương trình thành các chương trình con, mỗi chương trình thực hiện một yêu cầu. Ngoài ra ta cũng viết thêm các hàm kiểm tra nguyên tố, hàm mũ, hàm UCLN để thực hiện các yêu cầu đó.
Chương trình như sau:
Khai báo dữ liệu:
uses crt;
var n : integer;
a : array[1..10] of integer; {n<=10 nên mảng có tối đa 10 phần tử}



Thủ tục nhập dữ liệu, có kiểm tra khi nhập.
procedure nhap;
var i : integer;
begin
clrscr;
write('NHAP VAO SO PHAN TU N = ');
repeat
readln(n);
if (5<=n) and (n<=10) then break; {nếu thoã mãn thì dừng vòng lặp}
writeln('Khong hop le (5<=n<=10). Nhap lai!!!'); {ngược lại thì báo lỗi}
until false;

writeln('NHAP VAO N PHAN TU (1<ai<100)');
for i := 1 to n do begin
write('a',i,'=');
repeat
readln(a);
if (1<a) and (a<100) then break;
writeln('Khong hop le. Nhap lai!!!');
until false;
end;
end;

function ngto(n : integer): boolean; {hàm kiểm tra nguyên tố, xem giải thích ở phần trên}
var i : integer;
begin
ngto := false;
if n < 2 then exit;
for i := 2 to round(sqrt(n)) do
if n mod i = 0 then exit;
ngto := true;
end;
Thủ tục in các số nguyên tố của một mảng
procedure inngto;
var i :integer;
begin
writeln('CAC PHAN TU NGUYEN TO TRONG DAY:');
for i := 1 to n do{duyệt qua mọi phần tử từ 1 đến n}
if ngto(a) then writeln(a);{nếu ai là nguyên tố thì in ra}
end;

function UCLN(a,b: integer): integer;
var r : integer;
begin
while b<>0 do begin
r := a mod b;
a := b;
b := r;
end;
UCLN := a;
end;

Thủ tục tính UCLN của các phần tử của một mảng
procedure TinhUC;
var i,u : integer;
begin
u := a[1];{u là UCLN của các phần tử từ 1 đến i}
for i := 2 to n do u := UCLN(u,a); {là UCLN của các phần tử từ 1 đến i-1 và ai}
writeln('UCLN cua ca day la:',u);
end;

function hammu(a : real; n : integer): real; {hàm mũ tính an}
var s : real; i : integer;
begin
s := 1;
for i := 1 to n do s := s * a;
hammu := s;
end;
Thủ tục tính tổng các phần tử có lấy mũ:
procedure tong;
var s : real; i : integer; {s phải khai báo là số thực để tránh tràn số}
begin
s := 0;
for i := 1 to n do s := s + hammu(a,i); {s := s + (ai)i}
writeln('Tong can tinh:',s:10:0);
end;
Thủ tục sắp xếp tăng dần các phần tử của một mảng:
procedure sxep;
var i,j,tg : integer;
begin
for i := 1 to n-1 do
for j := i + 1 to n do
if a > a[j] then begin
tg := a; a := a[j]; a[j] := tg;
end;
writeln('DAY SAU KHI SAP XEP TANG DAN:');
for i := 1 to n do writeln(a);
end;
Chương trình chính: lần lượt gọi từng thủ tục
BEGIN
nhap;
inngto;
tinhuc;
tong;
sxep;
END.


BÀI TẬP 2
Tìm phần tử nhỏ nhất, lớn nhất của một mảng (cần chỉ ra cả vị trí của phần tử).
HƯỚNG DẪN
Giả sử phần tử min cần tìm là phần tử k. Ban đầu ta cho k=1. Sau đó cho i chạy từ 2 đến n, nếu a[k] > a thì rõ ràng a bé hơn, ta gán k bằng i. Sau khi duyệt toàn bộ dãy thì k sẽ là chỉ số của phần tử min. (Cách tìm min này đơn giản vì từ vị trí ta cũng suy ra được giá trị).
procedure timmin;
var i, k : integer;
begin
k := 1;
for i := 2 to n do
if a[k] > a then k := i;
writeln('Phan tu nho nhat la a[',k,']=',a[k]);
end;
Tìm max cũng tương tự, chỉ thay dấu so sánh.
procedure timmax;
var i, k : integer;
begin
k := 1;
for i := 2 to n do
if a[k] < a then k := i;
writeln('Phan tu lon nhat la a[',k,']=',a[k]);
end;
Chú ý:
1. Nếu áp dụng với mảng 2 chiều thì cũng tương tự, chỉ khác là để duyệt qua mọi phần tử của mảng 2 chiều thì ta phải dùng 2 vòng for. Và vị trí một phần tử cũng gồm cả dòng và cột.
Ví dụ 1. Tìm phần tử nhỏ nhất và lớn nhất của mảng 2 chiều và đổi chỗ chúng cho nhau:
procedure exchange;
var i,j,i1,j1,i2,j2,tg : integer;
begin
i1 := 1; j1 := 1; {i1,j1 là vị trí phần tử min}
i2 := 1; j2 := 1; {i2,j2 là vị trí phần tử max}
for i := 1 to m do
for j := 1 to n do begin
if a[i1,j1] > a[i,j] then begin {so sánh tìm min}
i1 := i; j1 := j; {ghi nhận vị trí min mới}
end;
if a[i2,j2] < a[i,j] then begin {so sánh tìm max}
i2 := i; j2 := j; {ghi nhận vị trí max mới}
end;
end;
tg := a[i1,j1]; a[i1,j1] := a[i2,j2]; a[i2,j2] := tg; {đổi chỗ}
end;
2. Nếu cần tìm phần tử lớn nhất / nhỏ nhất hoặc sắp xếp 1 dòng (1 cột) của mảng 2 chiều thì ta cũng coi dòng (cột) đó như 1 mảng 1 chiều. Chẳng hạn tất cả các phần tử trên dòng k đều có dạng chỉ số là a[k,i] với i chạy từ 1 đến n (n là số cột).

Ví dụ 2. Tìm phần tử lớn nhất của dòng k và đổi chỗ nó về phần tử đầu dòng.
procedure timmax(k : integer);
var i, vt, tg : integer;
begin
vt := 1; {vt là vị trí của phần tử min dòng k}
for i := 1 to n do
if a[k,i] > a[k,vt] then vt := i; {các phần tử dòng k có dạng a[k,i]}
tg := a[k,1]; a[k,1] := a[k,vt]; a[k,vt] := tg;
end;
Ví dụ 3. Sắp xếp giảm dần cột thứ k.
procedure sapxep(k: integer);
var i,j,tg : integer;
begin
for i := 1 to m-1 do {mỗi cột có m phần tử, vì bảng có m dòng}
for j := i+1 to m do
if a[i,k] > a[j,k] then begin {các phần tử cột k có dạng a[i,k]}
tg := a[i,k]; a[i,k] := a[j,k]; a[j,k] := tg;
end;
end;
BÀI TẬP 3
Tìm các phần tử thoả mãn 1 tính chất gì đó.
HƯỚNG DẪN
Nếu tính chất cần thoả mãn là cần kiểm tra phức tạp (chẳng hạn: nguyên tố, hoàn thiện, có tổng chữ số bằng 1 giá trị cho trước…) thì ta nên viết một hàm để kiểm tra 1 phần tử có tính chất đó không. Còn tính chất cần kiểm tra đơn giản (chẵn / lẻ, dương / âm, chia hết, chính phương…) thì không cần.
Sau đó ta duyệt qua các phần tử từ đầu đến cuối, phần tử nào thoả mãn tính chất đó thì in ra.
Ví dụ 1. In ra các số chính phương của một mảng:
Để kiểm tra n có chính phương không, ta lấy căn n, làm tròn rồi bình phương và so sánh với n. Nếu biểu thức sqr(round(sqrt(n))) = n là true thì n là chính phương.
Vậy để in các phần tử chính phương ta viết:
for i := 1 to n do begin
if sqr(round(sqrt(a))) = a then writeln(a);
Ví dụ 2. In ra các số hoàn thiện từ 1 đến n:
Để kiểm tra số có hoàn thiện ta dùng hàm tổng ước (đã có ở phần đầu).
for i := 1 to n do begin
if tongus(i) = i then writeln(i);
Ví dụ 3. In ra các phần tử của mảng chia 3 dư 1, chia 7 dư 2:
for i := 1 to n do begin
if (a mod 3=1) and (a mod 7=2) then writeln(a);
Ví dụ 4. In ra các số có 3 chữ số, tổng chữ số bằng 20, chia 7 dư 2.
Ta dùng hàm tổng chữ số đã có ở trên:
for i := 100 to 999 do begin {duyệt qua mọi số có 3 chữ số}
if (tongcs(i)=20) and (i mod 7=2) then writeln(i);
Chú ý: Nếu áp dụng với mảng 2 chiều thì cũng tương tự, chỉ khác là để duyệt qua mọi phần tử của mảng 2 chiều thì ta phải dùng 2 vòng for.
Ví dụ, để in các phần tử nguyên tố của 1 mảng 2 chiều:
for i := 1 to m do begin
for j := 1 to n do begin
if ngto(a[i,j]) then writeln(a[i,j]);
BÀI TẬP 4
Nhập và in mảng 2 chiều dạng ma trận (m dòng, n cột).
HƯỚNG DẪN
Để nhập các phần tử của mảng 2 chiều dạng ma trận, ta cần dùng các lệnh sau của unit CRT (nhớ phải có khai báo user crt ở đầu chương trình).
GotoXY(a,b): di chuyển con trỏ màn hình đến vị trí (a,b) trên màn hình (cột a, dòng b). Màn hình có 80 cột và 25 dòng.
whereX: hàm cho giá trị là vị trí cột của con trỏ màn hình.
whereY: hàm cho giá trị là vị trí dòng của con trỏ màn hình.
Khi nhập 1 phần tử ta dùng lệnh readln nên con trỏ màn hình sẽ xuống dòng, do đó cần quay lại dòng của bằng lệnh GotoXY(j * 10, whereY -1 ), nếu ta muốn mỗi phần tử của ma trận ứng với 10 cột màn hình.
procedure nhap;
var i,j : integer;
begin
clrscr;
write('Nhap m,n = '); readln(m,n);
for i := 1 to m do begin
for j := 1 to n do begin
write('A[',i,',',j,']='); readln(a[i,j]); {nhập xong thì xuống dòng}
gotoXY(j*10,whereY-1); {di chuyển về dòng trước, vị trí tiếp theo}
end;
writeln; {nhập xong 1 hàng thì xuống dòng}
end;
end;
Để in bảng dạng ma trận thì đơn giản hơn, với mỗi dòng ta sẽ in các phần tử trên 1 hàng rồi xuống dòng:
procedure inbang;
var i,j : integer;
begin
for i := 1 to m do begin{viết các phần tử của hàng i }
for j := 1 to n do write(a[i,j]:6); {mỗi phần tử chiếm 6 ô để căn phải cho thẳng cột và không sít nhau}
writeln;{hết 1 hàng thì xuống dòng}
end;
end;
CÁC BÀI TẬP VỀ XÂU KÍ TỰ
BÀI TẬP 1
Nhập vào một xâu s khác rỗng và thực hiện chuẩn hoá xâu, tức là:
a)Xoá các dấu cách thừa
b)Chuyển những kí tự đầu từ thành chữ hoa, những kí tự khác thành chữ thường.
HƯỚNG DẪN
Chương trình như sau:
var s : string;
procedure chuanhoa(var s : string); {s là tham biến để có thể thay đổi trong chương trình con}
var i : integer;
begin
while s[1]=' ' do delete(s,1,1); {xoá các kí tự cách thừa ở đầu xâu}
while s[length(s)]=' ' do delete(s,length(s),1); {xoá các kí tự cách thừa ở cuối xâu}
{xoá các kí tự cách thừa ở giữa các từ: nếu s[i-1] là cách thì s là dấu cách là thừa. Phải dùng vòng lặp for downto vì nếu trong quá trình xoá ta làm giảm chiều dài của xâu, nếu for to sẽ không dừng được.}
for i := length(s) downto 2 do
if (s=' ') and (s[i-1]=' ') then delete(s,i,1);
{Chuyển kí tự đầu xâu thành chữ hoa}
s[1] := Upcase(s[1]);
for i := 2 to length(s) do
if s[i-1]=' ' then s := Upcase(s) {Chuyển s là kí tự đầu từ thành chữ hoa.}
else
if s in ['A'..'Z'] then{s là kí tự chữ hoa không ở đầu một từ}
s := chr(ord(s) + 32); {thì phải chuyển thành chữ thường}
end;

BEGIN
write('Nhap vao 1 xau s:');
readln(s);
chuanhoa(s);
writeln('Xau s sau khi chuan hoa:',s);
readln;
END.
BÀI TẬP 2
Nhập vào một xâu x khác rỗng và thông báo xâu đó có phải là xâu đối xứng hay không?
HƯỚNG DẪN
Xâu đối xứng nếu nó bằng chính xâu đảo của nó. Vậy cách đơn giản nhất là ta sẽ xây dựng xâu đảo của x và kiểm tra xem nó có bằng x không. Để xây dựng xâu đảo của x, cách đơn giản nhất là cộng các kí tự của x theo thứ tự ngược (từ cuối về đầu).

Chương trình:
var x : string;
(************************************************)
function doixung(x : string) : boolean; {hàm kiểm tra xâu đối xứng}
var y : string;
i : integer;
begin
y := '';
{xây dựng y là xâu đảo của x, bằng cách cộng dần các kí tự của x vào y theo thứ tự ngược}
for i := length(x) downto 1 do y := y + x;
{so sánh x và xâu đảo của nó}
if x=y then doixung := true else doixung := false;
end;
BEGIN
write('Nhap vao 1 xau:');
readln(x);
if doixung(x) then
writeln('Xau doi xung!')
else
writeln('Xau khong doi xung!');
readln;
END.
BÀI TẬP 3
Nhập vào một xâu s và đếm xem nó có bao nhiêu từ. Từ là một dãy các kí tự, cách nhau bởi dấu cách?
HƯỚNG DẪN
Cách đếm từ đơn giản nhất là đếm dấu cách: nếu s là kí tự khác cách và s[i-1] là kí tự cách thì chứng tỏ s là vị trí bắt đầu của một từ. Chú ý là từ đầu tiên của xâu không có dấu cách đứng trước.
Chương trình:
var s : string;
{Hàm đếm số từ của một xâu}
function sotu(s : string) : integer;
var i, dem : integer;
begin
{cộng thêm dấu cách phía trước xâu để đếm cả từ đầu tiên}
s := ' ' + s; dem := 0;
for i := 2 to length(s) do {s là vị trí bắt đầu 1 từ}
if (s[i-1]=' ') and (s<>' ') then dem := dem + 1;
sotu := dem;
end;
BEGIN
write('Nhap vao 1 xau:');
readln(s);
writeln('So tu trong xau la:',sotu(s));
readln;
END.
BÀI TẬP 4
Nhập vào một xâu s và in ra các từ của nó (Từ là một dãy các kí tự, cách nhau bởi dấu cách). Xâu có bao nhiêu từ là đối xứng?
HƯỚNG DẪN
Có nhiều cách để tách một xâu thành các từ. Cách đơn giản nhất tiến hành như sau:
1)Bỏ qua các dấu cách cho đến khi gặp một kí tự khác cách (hoặc hết xâu).
2)Ghi các kí tự tiếp theo vào xâu tạm cho đến khi gặp dấu cách hoặc hết xâu, khi đó ta được 1 từ.
3)Nếu chưa hết xâu thì quay lại bước 1.
Mỗi khi tìm được một từ, ta ghi luôn nó ra màn hình, nếu từ đó là đối xứng thì tăng biến đếm. Ta cũng có thể lưu các từ tách được vào một mảng nếu bài tập yêu cầu dùng đến những từ đó trong các câu sau.
Chương trình:
var s : string;
dem : integer;
{Hàm kiểm tra từ đối xứng}
function doixung(x : string) : boolean;
var y : string;
i : integer;
begin
y := '';
for i := length(x) downto 1 do y := y + x;
if x=y then doixung := true else doixung := false;
end;
{Thủ tục thực hiện tách từ}
procedure tach;
var i, len : integer;
t : string;
begin
writeln('Cac tu trong xau:');
i := 1; len := length(s);
repeat
{B1: bỏ qua các dấu cách cho đến khi hết xâu hoặc gặp 1 kí tự khác cách:}
while (s=' ') and (i<=len) do inc(i);
if i>=len then break; {nếu hết xâu thì dừng}
t := '';{t là biến tạm lưu từ đang tách}
{B2: lấy các kí tự khác cách đưa vào biến tạm cho đến khi hết xâu hoặc gặp 1 kí tự cách:}
while (s<>' ') and (i<=len) do begin
t := t + s;
inc(i);
end;
{in ra từ vừa tách được và kiểm tra đối xứng}
writeln(t);
if doixung(t) then inc(dem);
until i >= len;
writeln('So tu doi xung trong xau:',dem);
end;
(************************************************)
BEGIN
write('Nhap vao 1 xau:');
readln(s);
tach;
END.
BÀI TẬP 5
Một số nguyên gọi là palindrom nếu nó đọc từ trái sang cũng bằng đọc từ phải sang. Ví dụ 121 là một số palindrom. Nhập một dãy n phần tử nguyên dương từ bàn phím, 5<= n<=20 và các phần tử có 2 đến 4 chữ số. In ra các số là palindrom trong dãy.
HƯỚNG DẪN
Một số là palindrom thì xâu tương ứng của nó là xâu đối xứng. Ta sẽ xây dựng một hàm kiểm tra một số có phải là palindrom không bằng cách chuyển số đó thành xâu và kiểm tra xâu đó có đối xứng không?
Chương trình:
uses crt;
var n : integer;
a : array[1..20] of integer;
{Thủ tục nhập dữ liệu}
procedure nhap;
var i : integer;
begin
clrscr;
repeat
write('n= '); readln(n);
if (n<=20) and (n>=5) then break; {nếu đã thoả mãn thì thoát khỏi vòng lặp}
writeln('Yeu cau 5<=n<=20. Nhap lai!');
until false;
for i := 1 to n do
repeat
write('A[',i,']='); readln(a);
if (a<=9999) and (a>=10) then break; {a có 2 đến 4 chữ số}
writeln('Yeu cau cac phan tu co 2 den 4 chu so. Nhap lai!');
until false;
end;
{Hàm kiểm tra bằng các kiểm tra xâu đối xứng}
function palindrom(k : integer): boolean;
var x,y : string;
i : integer;
begin
str(k,x);{chuyển k thành xâu x}
y := '';
for i := length(x) downto 1 do y := y + x;
{nếu x là đối xứng thì k là palindrom}
if x=y then palindrom := true else palindrom := false;
end;
{In kết quả:}
procedure palin;
var i : integer;
begin
writeln('Cac so la palindrom trong day:');
for i := 1 to n do
if palindrom(a) then writeln(a);
readln;
end;
(* Chương trình chính *)
BEGIN
nhap;
palin;
END.
CÁC BÀI TẬP VỀ TỆP
BÀI TẬP 1
Nhập một mảng 2 chiều m dòng, n cột từ file BANGSO.TXT. Cấu trúc file như sau: dòng đầu là 2 số m và n, cách nhau bằng dấu cách, m dòng sau, mỗi dòng n số nguyên.
a)Hãy in ra những số là số nguyên tố của mảng.
b)Tìm vị trí phần tử lớn nhất trong mảng.
c)Sắp xếp mỗi dòng của mảng tăng dần và in ra mảng dạng ma trận.
HƯỚNG DẪN
Ta khai báo một mảng 2 chiều và nhập dữ liệu từ file vào mảng. Quá trình nhập từ file văn bản giống như nhập từ bàn phím, không cần thực hiện kiểm tra dữ liệu.
Để sắp xếp mảng theo yêu cầu, ta thực hiện sắp xếp từng dòng của mảng bằng cách viết một thủ tục sắp xếp (kiểu đổi chỗ cho đơn giản) coi mỗi dòng của mảng như 1 mảng 1 chiều.
Chương trình:
var m,n : integer;
a : array[1..100,1..100] of integer;
(* Nhập dữ liệu *)
procedure nhap;
var f : text;
i,j : integer;
begin
assign(f,'BANGSO.TXT'); reset(f);
readln(f,m,n);
for i := 1 to m do
for j := 1 to n do read(f,a[i,j]);
close(f);
end;

function ngto(k : integer): boolean;
var i : integer;
begin
ngto := false;
if k < 2 then exit;
for i := 2 to round(sqrt(k)) do
if k mod i = 0 then exit;
ngto := true;
end;

procedure inngto;
var i,j : integer;
begin
writeln('Cac phan tu nguyen to cua mang:');
for i := 1 to m do
for j := 1 to n do
if ngto(a[i,j]) then write(a[i,j],' ');
writeln;
end;

procedure timmax;
var max,i,j,im,jm : integer;
begin
max := a[1,1]; im := 1; jm := 1; {im, jm lưu toạ độ phần tử đạt max}
for i := 1 to m do
for j := 1 to n do
if max < a[i,j] then begin
max := a[i,j];{mỗi lần gán max thì gán toạ độ luôn}
im := i; jm := j;
end;
writeln('Phan tu lon nhat bang la A[',im,',',jm,']=',max);
end;
{Thủ tục thực hiện sắp xếp tăng dần dòng thứ k. Các phần từ dòng k có dạng a[k,i]}
procedure xepdong(k: integer);
var i,j, tg : integer;
begin
for i := 1 to n do
for j := i+1 to n do
if a[k,i] > a[k,j] then begin
tg := a[k,i]; a[k,i] := a[k,j]; a[k,j] := tg;
end;
end;

procedure sapxep;
var i,j : integer;
begin
for i := 1 to m do xepdong(i); {sắp xếp từng dòng}
writeln('Mang sau khi sap xep:');
for i := 1 to m do begin{in dạng ma trận}
for j := 1 to n do write(a[i,j] : 5); {in các phần tử trên 1 dòng}
writeln;{in hết 1 dòng thì xuống dòng}
end;
end;
BEGIN
nhap;
inngto;
timmax;
sapxep;
END.
BÀI TẬP 2
Nhập 2 số m, n từ bàn phím, sau đó sinh ngẫu nhiên mn số nguyên ngẫu nhiên có giá trị từ 15 đến 300 để ghi vào file BANG.TXT. Sau đó thực hiện các yêu cầu sau:
a)In mn số đã sinh dạng ma trận m dòng, n cột.
b)In ra các số chính phương.
Yêu cầu: không được dùng mảng 2 chiều để lưu trữ dữ liệu.
HƯỚNG DẪN
Do yêu cầu không được dùng mảng 2 chiều để lưu trữ dữ liệu nên ta sẽ đọc file đến đâu, xử lí đến đấy.
-Để sinh các số ngẫu nhiên từ a đến b, ta dùng biểu thức a + random(b-a+1).
-Để kiểm tra số k có phải là số chính phương không, ta lấy căn bậc 2 của k, làm tròn rồi bình phương. Nếu kết quả bằng k thì k là số chính phương. Tức là kiểm tra sqr(round(sqrt(k))) = k.
Chương trình:
var m,n : integer;
f : text;
procedure sinh;
var
i,j : integer;
begin
write('Nhap vao 2 so m,n: '); readln(m,n);
assign(f,'BANG.TXT'); rewrite(f);
writeln(f,m,' ',n);
for i := 1 to m do begin
for j := 1 to n do
write(f,15 + random(300-15+1) : 6); {sinh số ngẫu nhiên từ 15 đến 300}
writeln(f);
end;
close(f);
end;
{Hàm chính phương}
function cp(k : integer) : boolean;
begin
if sqr(round(sqrt(k))) = k then cp := true
else cp := false;
end;

procedure chinhphuong;
var
i,j,k : integer;
begin
assign(f,'BANG.TXT'); reset(f);
readln(f,m,n);
writeln('CAC SO CHINH PHUONG CUA BANG:');
for i := 1 to m do begin
for j := 1 to n do begin
read(f,k);
if cp(k) then write(k,' '); {vừa đọc vừa xử lí}
end;
end;
close(f);
end;

procedure inbang;
var
i,j,k : integer;
begin
assign(f,'BANG.TXT'); reset(f); {mở lại để in dạng ma trận}
readln(f,m,n);
writeln(#10,'IN BANG DANG MA TRAN:');
for i := 1 to m do begin
for j := 1 to n do begin
read(f,k);
write(k : 6);{đọc đến đâu in đến đó}
end;
writeln;
end;
close(f);
end;

BEGIN
sinh;
chinhphuong;
inbang;
END.
CÁC BÀI TẬP VỀ BẢN GHI
BÀI TẬP 1
Viết chương trình quản lí sách. Mỗi cuốn sách gồm tên sách, tên nhà xuất bản, năm xuất bản, giá tiền, số lượng:
a)Đưa ra danh sách các cuốn sách của nhà xuất bản Giáo dục.
b)Tính tổng số tiền sách.
c)Sắp xếp danh sách theo năm xuất bản giảm dần và ghi kết quả ra màn hình.
d)In ra màn hình các cuốn sách có giá tiền<=10.000đ và xuất bản sau năm 2000.
HƯỚNG DẪN
Mô tả mỗi cuốn sách là một bản ghi, các thông tin về nó (tên sách, tên tác giả,…) là các trường. Danh sách cuốn sách sẽ là một mảng các bản ghi.
Khai báo kiểu dữ liệu mô tả sách như sau:
type
sach = record
ten : string[30];{tên sách}
nxb : string[20];{tên Nhà xuất bản}
namxb : integer;{năm xuất bản}
soluong : integer;{số lượng}
gia : real;{giá tiền}
end;
Thông tin của tất cả các cuốn sách ta lưu trong một mảng các bản ghi kiểu sach:
var
ds : array[1..100] of sach;
n : integer;
Nhập dữ liệu: ta nhập tên sách trước. Nếu tên sách là xâu rỗng thì đừng nhập, ngược lại lần lượt nhập các thông tin khác:
procedure nhap;
var t : string;
begin
ClrScr;
writeln('NHAP THONG TIN VE CAC CUON SACH');
writeln('(nhap ten sach la xau rong neu muon dung)');
repeat
write('Ten sach: ');
readln(t);
if t='' then break;
n := n + 1;
with ds[n] do begin
ten := t;
write('NXB: ');readln(nxb);
write('Nam xuat ban: ');readln(namxb);
write('So luong: ');readln(soluong);
write('Gia tien: ');readln(gia);
end;
until false;
end;

Câu a: ta sẽ duyệt qua toàn bộ danh sách các cuốn sách, kiểm tra nếu tên nhà xuất bản là Giáo dục thì in ra tất cả các thông tin của cuốn sách tương ứng:
procedure insach;
var
i : integer;
begin
Clrscr;
writeln('CAC CUON SACH CUA NXB GIAO DUC:');
for i:=1 to n do
with ds do
if nxb='Giao duc' then begin
writeln('Ten:',ten);
writeln('Nam xuat ban:',namxb);
writeln('So luong:',soluong);
writeln('Gia tien:',gia);
end;
readln;
end;

Câu b: ta cũng duyệt qua toàn bộ các cuốn sách, nhân số lượng và giá tiền rồi cộng dồn vào một biến tổng. Sau đó in ra biến tổng đó:
procedure tinh;
var i : integer;
tong : real;
begin
tong := 0;
for i := 1 to n do
with ds do tong := tong + gia * soluong;
writeln('TONG GIA TRI CUA TAT CA CAC CUON SACH:', tong:0:3);
end;

Câu c: Sắp xếp danh sách giảm dần theo năm xuất bản bằng phương pháp nổi bọt (2 vòng for). Chú ý biến trung gian trong đổi chỗ phải có kiểu sach thì mới gán được.
procedure sxep;
var i,j : integer;
tg : sach;
begin
for i := 1 to n do
for j := i + 1 to n do
if ds.namxb < ds[j].namxb then begin
tg := ds; ds := ds[j]; ds[j] := tg;
end;
for i:=1 to n do
with ds do begin
writeln('Ten:',ten);
writeln('Nam xuat ban:',namxb);
writeln('So luong:',soluong);
writeln('Gia tien:',gia);
end;
readln;
end;
Câu d: ta làm tương tự việc in danh sách các sách của NXB Giáo dục:
procedure inds;
var i : integer;
begin
writeln('CAC CUON SACH GIA RE HON 10000 VA XUAT BAN TU NAM 2000:');
for i := 1 to n do
with ds do
if (gia <= 10000) and (namxb >= 2000) then writeln(ten);
end;

Chương trình chính: Lần lượt gọi các chương trình con theo thứ tự:
BEGIN
nhap;
insach;
tinh;
sxep;
inds;
readln;
END.
BÀI TẬP 2
Viết chương trình quản lí cán bộ. Thông tin về cán bộ gồm tên, tuổi, hệ số lương, phụ cấp, thu nhập.
a)Nhập thông tin cán bộ từ file văn bản CANBO.TXT. Các thông tin gồm tên, tuổi, hệ số lương, phụ cấp, mỗi thông tin trên một dòng.
Tính thu nhập = hệ số lương  350000đ + phụ cấp
b)Đưa ra danh sách các bộ trẻ (tuổi <= 30), in đầy đủ các thông tin
c)Sắp xếp tên cán bộ theo abc và ghi lên file truy cập trực tiếp SAPXEP.DAT.
d)Đọc danh sách từ file SAPXEP.DAT, in ra màn hình các cán bộ có thu nhập từ 3 triệu trở lên.
HƯỚNG DẪN
Làm tương tự bài 1, chú ý là nhập dữ liệu từ file chứ không phải từ bàn phím. Do đó không cần ghi các thông tin yêu cầu nhập ra màn hình. Hơn nữa, phải tạo trước một file văn bản là CANBO.TXT để chương trình có thể chạy mà không báo lỗi.
Toàn văn chương trình:
uses crt;
type
canbo = record
ten : string[20];
tuoi : byte;
hsl, phucap, thunhap: real;
end;
var
ds : array[1..100] of canbo;
n : integer;
(*********************************************)
procedure nhap;
var f : text;
begin
assign(f,'CANBO.TXT'); reset(f);
n := 0;
while not eof(f) do begin
n := n + 1;
with ds[n] do begin
readln(f,ten);
readln(f,tuoi);
readln(f,hsl);
readln(f,phucap);
thunhap := hsl * 350000 + phucap;
end;
end;
close(f);
end;
(*********************************************)
procedure in30;
var i : integer;
begin
writeln('DANH SACH CAC CAN BO TRE:');
for i := 1 to n do
with ds do
if tuoi <= 30 then begin
writeln('Ten:',ten);
writeln('Tuoi:',tuoi);
writeln('He so luong:',hsl :0 :3);
writeln('Phu cap:',phucap :0 :3);
writeln('Thu nhap:',thunhap :0 :3);
end;
end;
(*********************************************)
procedure sxep;
var i,j : integer;
tg : canbo;
begin
for i := 1 to n do
for j := i + 1 to n do
if ds.ten > ds[j].ten then begin
tg := ds; ds := ds[j]; ds[j] := tg;
end;
end;
(*********************************************)
procedure ghitep;
var f : file of canbo;
i : integer;
begin
assign(f,'SAPXEP.DAT'); rewrite(f);
for i := 1 to n do write(f,ds);
close(f);
end;
procedure doctep;
var f : file of canbo;
i : integer;
begin
assign(f,'SAPXEP.DAT'); reset(f);
i := 0;
while not eof(f) do begin
i := i + 1;
read(f,ds);
end;
n := i;
close(f);
end;
(*********************************************)
procedure in3M;
var i : integer;
begin
writeln('DANH SACH CAC CAN BO CO THU NHAP CAO:');
for i := 1 to n do
with ds do
if thunhap >= 3000000 then begin
writeln('Ten:',ten);
writeln('Tuoi:',tuoi);
writeln('Thu nhap:',thunhap :0 :3);
end;
end;

(*********************************************)
BEGIN
nhap;
in30;
sxep;
in3M;
readln;
END.

Tính hàm Sin bằng khai triển chuỗi Taylor - Ngôn ngữ Pascal

uses crt;
var si,eps,gt,x,tu,mau:real;
    dau:shortint;
BEGIN
     clrscr;
     write('Nhap so thuc x : ');
     readln(x);

     tu:=x;
     mau:=1;
     eps:=x;
     gt:=1;
     si:=x;
     dau:=-1;

     repeat
      tu:=tu*x*x;
      mau:=mau*(gt+1)*(gt+2);
      eps:=tu/mau;
      si:=si+dau*eps;
      dau:=dau*-1;
      gt:=gt+2;
     until eps<0.00001;
     writeln('Sin(',x:0:2,') = ',si:0:2);
     readln;
END.
January 2010
M T W T F S S
December 2009February 2010
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31