Thứ Tư, 27 tháng 5, 2009

Polyphase Merge(2)

Đây là bài cài đặt của bạn Vũ Âu, mà cũng thật có duyên, mình vô tình vô nhầm 3 cái blog khác nhau của bạn ấy. Bài này dựa sát theo bài cài đặt của thầy Long, mời các bạn xem qua.
 


//200090513_polymerge.cpp
//ES
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <iomanip.h>
#include <string.h>
#include <stdlib.h>

#define n 100
typedef int elem;
typedef struct
{
FILE *f;
elem buffer;
}tape;

int size=sizeof(elem);

int ss(int x, int y)
{
return x-y;
}

//mo tape
void opentape(tape &X, char *filename)
{
X.f=fopen(filename, "rb");
fread(&X.buffer,size, 1,X.f);
}

//doc tape
void readtape(tape &X, elem &x)
{
memcpy(&x,&X.buffer,size);
fread(&X.buffer,size,1,X.f);
}

//Chep 1 phan tu
void copyitemp(tape &X, tape &Y, int &EOR, elem &x, int (*comp)(elem, elem))
{
readtape(X,x);
fwrite(&x,size,1,Y.f);
EOR=feof(X.f)||comp(x,X.buffer)>0;
}

//Chep 1 run
void copyrun(tape &X, tape &Y, elem &x, int (*comp)(elem, elem))
{
int EOR;
do
{
copyitemp(X,Y,EOR,x,comp);
}while(!EOR);
}

//Chon file dich
void filedich(int a[], int d[], int &level, int &j)
{
int z,i;
if(d[j]<d[j+1])
j++;
else
{
if(d[j]==0)
{
z=a[n-2];//??
for(i=0; i<n-2; i++)
{
d[i]=a[i+1]+z-a[i];
a[i]=a[i+1]+z;
}
d[n-2]=z-a[n-2];
a[n-2]=z;
level++;
}
j=0;
}
d[j]--;
}

void polyphase(char *filename, int (*comp)(elem, elem))
{
int a[n], d[n], t[n], ta[n], mx, k, i, j,level,tt,dt,z,EOR;
elem last[n], x;
char s[n][20],s1[20];
tape f[n],F;

for(i=0; i<n; i++)
{
strcpy(s[i],"TMP.");
itoa(i,s1,10);
strcat(s[i],s1);
}
//------Phan phoi ban dau--------------
opentape(F,filename);
for(i=0; i<n-1; i++)
{
f[i].f=fopen(s[i],"wb");
a[i]=d[i]=1;
}
d[n-1]=0;
level=1;
j=0;
do
{
filedich(a,d,level,j);
copyrun(F,f[j],last[j],comp);
}while(!feof(F.f) && (j<n-2));
while(!feof(F.f))
{
filedich(a,d,level,j);
if(comp(last[j],F.buffer)>0)
copyrun(F,f[j],last[j],comp);
else
{
copyrun(F,f[j],last[j],comp);
if(!feof(F.f))
copyrun(F,f[j],last[j],comp);
else
d[j]++;
}
}
fclose(F.f);
for(i=0; i<n-1; i++)
fclose(f[i].f);
//----------------Tron-------
for(i=0; i<n; i++) //mo file f1,f2...f(n-1) de doc
t[i]=i;//luu y: t[i] chu k phai f[i]
for(i=0; i<n-1; i++) //mo du 1 ten cung k sao
opentape(f[i],s[i]);
//lap //cho den khi level =0
do
{
//mo f(tn) de ghi//sai, mo f[ti]
f[t[i]].f=fopen(s[t[i]],"wb");//???
//z=a[n-1]
z=a[n-2];
//lap //cho den khi z=0;
do
{
//k=0;//ghi nhan so run that
k=0;
//voi i=1..n-1 Thuc hien:
for(i=0; i<n-1; i++)
{
//-neu d[i]>0: d[i]=d[i]-1
//nguoc lai: {k=k+1;ta[k]=ti//ta la mang co run dang tron
if(d[i]>0)
d[i]--;
else
ta[k++]=t[i];//ta[k++]=t[i]//??
}
//neu k=0 thi: d[n]=d[n]+1;
if(k==0)
d[n-1]++;
/*nguoc lai:
-lap cho den khi k=0;*/
else
{
do
{
//min(fta1^,fta2^..ftak^):ftamx^
mx=0;
for(i=1; i<k; i++)
if(comp(f[ta[mx]].buffer,f[ta[i]].buffer)>0)
mx=i;
//Chep 1 phan tu tu ta[mx] vao t[n](EOR)
copyitemp(f[ta[mx]],f[t[n-1]],EOR,x,comp);
/*Neu EOR thi: tamx=tak
k=k-1*/
if(EOR)
ta[mx]=ta[--k];//????
}while(k>0);
//--------=> Tron xong 1 bo run---------
z--;
}
}while(z>0);
//dong ftn-1,ftn
fclose(f[t[n-2]].f);
fclose(f[t[n-1]].f);
//-----------------Chuyen muc--------------
z=a[n-2];
tt=t[n-1];
dt=d[n-1];
//voi i=n-1...1 thuc hien
for(i=n-2;i>=0;i--)
{
a[i+1]=a[i]-z;
t[i+1]=t[i];
d[i+1]=d[i];
}
a[0]=z;
t[0]=tt;
d[0]=dt;
level--;
//mo ft1 de doc
opentape(f[t[0]],s[t[0]]);
}while(level>0);
//mo F de ghi
F.f=fopen(filename,"wb");
opentape(f[t[0]],s[t[0]]);//hoi nay la file dich, gio doi lai la file dau
//Chep 1 run tu ft1 vao F
copyrun(f[t[0]],F,x,comp);
//dong ft1-ftn-1
fclose(F.f);
for(i=0; i<n-1; i++)
fclose(f[t[i]].f);
//don dep
for(i=0; i<n; i++)
remove(s[i]);
}

//tao file ngau nhien
void taofile(char *filename, int h)
{
srand((unsigned)time(NULL));
FILE *f=fopen(filename, "wb");
int i,x;
for(i=0; i<h; i++)
{
x=rand()%1000;
fwrite(&x, size,1,f);
}
fclose(f);
}

//in file
void infile(char *filename)
{
FILE *f= fopen(filename, "rb");
int x;
fread(&x,size,1,f);
while(!feof(f))
{
cout<<x<<" ";
fread(&x,size,1,f);
}
fclose(f);
}

void main()
{
int m;
cout<<"polyphase program"
<<"\nCompleted by Nguyen Thu Huong 20090514"
<<"\n---------------******----------------\n";
cout<<"Nhap so phan tu can tron: ";
cin >>m;
taofile("poly.txt",m);
infile("poly.txt");
cout<<"\n------------------------\n";
cout<<endl;
polyphase("poly.txt",ss);
infile("poly.txt");
cout<<endl;
}

Phương pháp lập học lập trình hiệu quả

Các ngôn ngữ lập trình ra đời và lỗi thời nhanh một cách đáng kinh ngạc trong ngành Khoa học Máy tính. Các ngôn ngữ lập trình mới thường chứa đựng những quy tắc khác nhau làm cho mọi người phải thường xuyên thay đổi cách dùng các công cụ cũng như thói quen lập trình. Nhưng việc học một ngôn ngữ lập trình mới để cung cấp thêm kiến thức cho nghề nghiệp của mình cũng là một nhu cầu chính đáng.
Trước khi học một ngôn ngữ mới, bạn thường đặt ra câu hỏi: Làm sao để học ngôn ngữ lập trình này được hiệu quả? Có một vài gợi ý nhỏ sau có thể giúp bạn học các ngôn ngữ lập trình dễ dàng hơn:
1. Nắm vững các kiểu dữ liệu cơ bản mà ngôn ngữ lập trình cung cấp.
Hầu hết các ngôn ngữ đều cung cấp kiểu số nguyên integer. Bạn phải tìm hiểu thêm thế nào là long integer hoặc short integer? Thế nào là kiểu liệt kê (Enumerated)? Thế nào là kiểu kí tự (Character)? Thế nào là kiểu chuỗi (String)? Ngôn ngữ có hỗ trợ kiểu số thực dấu chấm động hay không, và tầm giá trị của mỗi kiểu dữ liệu là bao nhiêu? Và khi một ngôn ngữ nào đó không hỗ trợ kiểu dữ liệu mà bạn cần dùng thì tốt hơn bạn nên chuyển sang dùng một ngôn ngữ khác.
2. Nắm vững cấu trúc dữ liệu cơ bản được ngôn ngữ cung cấp.
Chẳng hạn Pascal có cấu trúc mảng (array), Lisp có thể thao tác rất dễ dàng với cấu trúc danh sách (list), còn Java thì có thể làm việc với các lớp và các giao tiếp.…Và những vấn đề bạn nghĩ trong đầu cuối cùng phải được biểu diễn bằng các kiểu dữ liệu mà ngôn ngữ cung cấp, việc hiểu rõ mối quan hệ giữa chúng là nền tảng để giải quyết các vấn đề.
3. Ngôn ngữ cung cấp những toán tử dựng sẵn nào?
Ví dụ: Prolog xem tìm kiếm là một thao tác cơ bản, Snobol xem thao tác đối sánh mẫu trên các chuỗi (string pattern matching) là một toán tử cơ sở, các ngôn ngữ hàm (ML, Haskell) cho phép bạn tạo ra một giá trị mới nhưng không làm thay đổi cấu trúc hiện tại, APL cung cấp toán tử ma trận, … Danh sách các toán tử dựng sẵn của một ngôn ngữ sẽ cho ta biết những vấn đề mà những chuyên gia thiết kế ngôn ngữ đó cho là quan trọng nhất.
4. Nắm vững loại vấn đề mà ngôn ngữ có thể trợ giúp giải quyết.
Các ngôn ngữ thường được phát triển vì một lý do nào đó, thường là để giải quyết một loại vấn đề mang tính đặc trưng. Do đó, bạn nên cố gắng nắm rõ những chức năng đặc trưng của ngôn ngữ để giải quyết vấn đề đồng thời cũng nên tìm hiểu tại sao cùng một vấn đề nhưng dùng ngôn ngữ này để giải quyết lại dễ dàng hơn dùng ngôn ngữ khác.
5. Tìm hiểu những thư viện có sẵn trong ngôn ngữ.
Các ngôn ngữ thường có các thư viện do nhiều người đã phát triển để giải quyết những vấn đề khác nhau, bạn có thể sử dụng lại để giải quyết một vấn đề mới. Smalltalk có một thư viện đồ sộ với lượng mã luôn sẵn sàng để người lập trình sử dụng. C++ với thư viện chuẩn STL chứa nhiều cấu trúc dữ liệu thường dùng. Java có các thư viện cung cấp các tác vụ về mạng. Bạn hãy cố gắng tìm và sẽ thấy những gì cần thiết sẵn có.
6. Hãy học hỏi, mô phỏng lại!
Bắt đầu với việc mô phỏng lại các chương trình hiện có. Phải làm cho chúng có thể hoạt động trên hệ thống của bạn, bởi vì hệ thống mà nó được phát triển có thể không giống với hệ thống của bạn, và khi bạn có thể làm cho nó hoạt động tốt trên hệ thống của mình thì tức là bạn đã hiểu rõ về nó. Học các chương trình để hình dung được các tính năng khác nhau của ngôn ngữ.
7. Hãy thử nghiệm và rút ra kết luận!
Khi bạn đã có một vài chương trình có thể chạy tốt, bạn thử nghiệm bằng cách tạo ra một vài thay đổi. Bạn có thể lấy ra một chương trình và sửa lại nó để giải quyết một vấn đề sai khác chút ít so với chương trình ban đầu hay không? Bạn có thể lấy ra một phần nhỏ của chương trình và diễn đạt lại bằng cách khác hay không?
8. Hiện thực lại các vấn đề đã hiểu rõ bằng một ngôn ngữ mới.
Lấy một vài chương trình đã được viết trong một ngôn ngữ rồi cố gắng viết lại chúng trong ngôn ngữ mới. Không nên dịch từng câu lệnh sang ngôn ngữ mới mà hãy xem xét những tính năng đặc trưng nào của ngôn ngữ mới có thể dùng để giải quyết vấn đề. Cẩn thận xem xét những vấn đề nào dễ dàng hiện thực trong ngôn ngữ mới và những vấn đề nào khó khăn hơn. (Chương trình truyền thống đầu tiên nên viết là chương trình in ra chuỗi "hello world").
9. Khi gặp một vấn đề mới thì nên nghĩ về những vấn đề đã biết trước đó có cùng đặc điểm với vấn đề mới. Sau đó hãy bắt đầu thử nghiệm.

Thứ Hai, 25 tháng 5, 2009

Viết C theo tinh thần hướng đối tượng

Nhân vật ấn tượng nhất trong tuyệt tác Tiếu Ngạo Giang Hồ có lẽ ai cũng đồng ý là Lệnh Hồ công tử. Kim Dung tiên sinh đã kể rất nhiều tình tiết trong đó Hồ công tử lâm vào tình huống bi đát (như mất hết công lực) khi đối địch nhưng rốt cuộc vẫn chiến thắng. Lí do bởi công tử hiểu rõ được yếu quyết nguồn gốc của các chiêu thức, nên có thể vận dụng vào kiếm chiêu của mình và hoá giải tình huống đối thủ đặt ra một cách dễ dàng.

Nếu như võ công chỉ có vài môn phái chiếm đa số như kiếm tông, khí tông thì lập trình cũng vậy, chỉ có vài paradigm chiếm thế thượng phong như lập trình thủ tục, lập trình hướng đối tượng. Học là học cái tinh thần, thỉnh thoảng đâu đó ta nghe nói dùng PHP4 cũng có thể lập trình hướng đối tượng như PHP5, ngôn ngữ Ruby hướng đối tượng viết bằng ngôn ngữ C không hướng đối tượng là vì vậy.

Bài viết này trình bày vài nét phác thảo cách viết C theo tinh thần hướng đối tượng.

Tinh thần của hướng đối tượng có 4 điểm chính yếu, trong đó nhìn từ quan điểm của C thì quan trọng nhất là đóng gói, bởi chương trình = cấu trúc dữ liệu (data) + giải thuật (code) (bạn nào sắp đi xin việc nên nhớ câu hỏi "Chương trình là gì?" này, vì hay bị hỏi{#emotions_dlg.laughing}).

Lập trình BREW là cách tốt nhất để biết lập trình hướng đối tượng bằng C là như thế nào. C có con trỏ dữ liệu, con trỏ hàm, ép kiểu v.v. cực mạnh nên đóng gói rất dễ thực hiện, 3 điểm còn lại cố một tí cũng thực hiện được. BREW hơi "đặc biệt", nên xin dùng C bình thường để thử đóng gói:

typedef struct {
int r, c;
int *elements;
} Matrix;

int matrix_get_r(Matrix *this) {
return this->r;
}

int matrix_get_c(Matrix *this) {
return this->c;
}

void matrix_set_element(Matrix *this, int r, int c, int v) {
this->elements[r*(this->c) + c] = v;
}

int matrix_get_element(Matrix *this, int r, int c) {
return this->elements[r*(this->c) + c];
}

Matrix *matrix_new(int r, int c) {
Matrix *ret;

ret = (Matrix *) malloc(sizeof(Matrix));
ret->r = r;
ret->c = c;
ret->elements = (int *) malloc(r*c*sizeof(int));

return ret;
}

void matrix_delete(Matrix *this) {
free(this->elements);
this->elements = NULL;
free(this);
}


Trên đây là trích đoạn chương trình nhân ma trận dùng thư viện OpenMPI. Chương trình hoàn chỉnh đính kèm ở bài Xử lí song song. Ta thấy:




  • Dùng struct để gói dữ liệu, tên struct viết hoa.


  • Hàm có tiền tố suy ra từ tên struct.


  • Hàm xxx_new và xxx_delete dùng để sinh và huỷ.


  • Ngoài xxx_new, tham số đầu tiên của tất cả hàm đều là con trỏ struct.


  • Dùng con trỏ struct ở mọi nơi, không dùng thẳng struct.


  • Học hỏi qui định và qui ước của Ruby, ví dụ không truy cập thẳng dữ liệu của struct, mà phải thông qua hàm.


  • Hàm private có tiền tố _.



Trên thực tế rất ít dự án mã nguồn mở dùng C++, mà dùng C. Có 2 lí do chính:




  • Trình biên dịch C++ mã nguồn mở còn kém, ít nhất là kém hẳn trình biên dịch C.


  • C++ phức tạp, khó hơn C nhiều.



Tuy nhiên bạn thấy đấy, nếu nắm được tinh thần của hướng đối tượng, thì dùng ngôn ngữ không hướng đối tượng C vẫn có thể tận dụng cái hay của nó.


Đây là bài viết của Blog cộng đồng về Công nghệ thông tin


Chủ Nhật, 10 tháng 5, 2009

Cách tính thời gian chạy thuật toán

Đây là hướng dẫn trong congdongcviet.com. Bạn có thể dùng hàm clock() trong thư viện <ctime> như sau:



#include <ctime.h>
...
int main()
{
unsigned int start_time = clock();
// your complex algorithm here
...
unsigned int run_time= (clock() - start); // in ms
}
...

Chúc bạn vui. Thân.

Thứ Tư, 6 tháng 5, 2009

PHƯƠNG PHÁP TRỘN ĐA PHA

(Polyphase Merge)

Phương pháp trộn đa lối cân bằng đã loại bỏ các phép sao chép thuần túy thông qua việc gộp quá trình phân phối và quá trình trộn trong cùng một giai đoạn. Tuy nhiên các tập tin các tập tin chưa được sử dụng một cách có hiệu quả bởi vì trong cùng một lần duyệt thì phân nửa số tập tin luôn luôn giữ vai trò trộn (nguồn) và phân nửa số tập tin luôn luôn giữ vai trò phân phối (đích). Ta có thể cải tiến phương pháp trên bằng cách giải quyết thay đổi vai trò của các tập tin trong cùng một lần duyệt phương pháp này gọi là phương pháp trộn đa pha.

Ta xét ví dụ sau với 3 tập tin f1, f2, f3

clip_image001Bước 1: Phân phối luân phiên các run ban đầu của f0 vào f1 và f2

clip_image001[1]Bước 2: Trộn các run của f1, f2 vào f3 . Giải thuật kết thúc nếu f3 chỉ có một run

clip_image001[2]Bước 3: Chép nửa run của f3 vào f1

clip_image001[3]Bước 4: Trộn các run của f1 và f3 vào f2. Giải thuật kết thúc nếu f2 chỉ có một run.

clip_image001[4]Bước 5: Chép nửa số run của f2 vào f1. Lặp lại bước 2.

Phương pháp này còn có nhược điểm là mất thời gian sao chép nửa số run của tập tin này vào tập tin kia. Việc sao chép này có thể loại bỏ nếu ta bắt đầu với Fn run của tập tin f1 và Fn-1 run của tập tin f2, với Fn và Fn-1 là các số liên tiếp trong dãy Fibonacci.

Chúng ta xem xét các ví dụ sau:

Ví dụ 1: Trường hợp n=7, tổng số run ban đầu là 13+8=21 run

Phase

F 1

F2

F3

0

1, 1, 1, 1, 1, 1, 1, 1

1, 1, 1, 1, 1

Sort

1

1, 1, 1,

2, 2, 2, 2, 2

Merge 1

2

3, 3, 3

2, 2

Merge 2

3

5, 5

3

Merge 3

4

5

8

Merge4

5

13

Merge 5

6

21

Merge 6

Phase 0: Phân phối các run ban đầu

Phase 1: Trộn 8 run của f1 và f2 vào f3

Phase 2: Trộn 5 run của f1 và f3 vào f2

Phase 3: Trộn 3 run của f2 và f3 vào f1

Phase 4: Trộn 2 run của f1 và f2 vào f3

Phase 5: Trộn 1 run của f1 và f3 vào f2

Phase 6: Trộn 1 run của f2 và f3 vào f1

Ví dụ 2:

Phase

T6

T5

T4

T3

T2

T1

Tổng số runs được xữ lý

Phase 0

131

130

128

124

116

-

129

Phase 1

115

114

112

18

-

516

80

Phase 2

17

16

14

-

98

58

72

Phase 3

13

12

-

174

94

54

68

Phase 4

11

-

332

172

92

52

66

Phase 5

-

651

331

171

91

51

65

Phase 6

1291

-

-

-

-

-

129

Phase 0: Phân phối các run ban đầu

Phase 1: Trộn 16 run từ T2 đến T6 vào T1

Phase 2: Trộn 8 run của T1, T3, T4, T5, T6 vào T2

Phase 3: Trộn 4 run của T1, T2, T4, T5, T6 vào T3

Phase 4: Trộn 2 run của T6, T5, T3, T1, T6 vào T4

Phase 5: Trộn 1 run của T1, T2, T3, T4, T6 vào T5

Phase 6: Trộn 1 run từ T1 đến T5 vào T6.

Xem xét bảng trên ( từ dưới lên) chúng ta thấy có 7 bước phân bố theo dãy Fibonacci bậc 4 là: {1,0,0,0,0}, {1,1,1,1,1}, {2,2,2,2,1}, {4,4,4,3,2}, {8,8,7,6,4}, {16,15,14,12,8}, và {31,30,28,24,16}.

Với Số tập tin T=6 bảng sau cho thấy số run ban đầu được phân bố thích hợp:

Phân bố Fibonacci hoàn hảo với T=6

Level

T6

T5

T4

T3

T2

Total Runs

0

1

0

0

0

0

1

1

1

1

1

1

1

5

2

2

2

2

2

1

9

3

4

4

4

3

2

17

4

8

8

7

6

4

33

5

16

15

14

12

8

65

6

31

30

28

24

16

129

7

61

59

55

47

31

253

8

120

116

108

92

61

497

-

-

-

-

-

-

-

n

an

bn

cn

dn

en

tn

n+1

an+bn

an+cn

an+dn

an+en

an

tn+4an

Trong ví dụ 1, số run phân phối ban đầu cho các tập tin là 2 số Fibonacci kế tiếp nhau của dãy Fibonacci bậc 1: 0, 1, 1, 2, 3, 5, 8 . . .

Trong ví dụ 2 số run ban đầu phân bố cho các tập tin theo dãy Fibonacci bậc 4: 0, 0, 0, 0, 1, 1, 2, 4, 8, 16 . . .

Dãy Fibonacci bậc P tổng quát được định nghĩa như sau:

F(p)n = F(p)n-1 + ... + F(p)n-2 + ... + F(p)n-p , với n>=p

Và F(p)n = 0, với 0 <= n <= p-2; F(p)p-1 = 1

Dãy Fibonacci thông thường là dãy Fibonacci bậc 1.

Thông thường nếu chúng ta lấy p= T-1, phân bố trộn đa pha đối với P tập tin sẽ tương ứng với số Fibonacci bậc P.

Sưu tầm

Thứ Ba, 5 tháng 5, 2009

Fix một số lỗi của Oxford Dictionary

 

Hôm nay mình không mở được từ điển oxford nên lên google search thử, thấy cách này khá hay mình xin đăng lại nhé.

Image Hosted by ImageShack.us
By kenshin2004

Oxford Dictionary, viết một cách chính xác là Oxford Advanced’s Learner Dictionary (7th edition) là một trong những từ điển Anh - Anh tốt nhất mà tớ từng sử dụng. Và sẽ tuyệt vời hơn khi sử dụng nó kèm với Lạc Việt. Tớ dùng song song cả hai - đầu tiên, dùng OALD để tra từ Anh - Anh và đoán nghĩa; sau đó, dùng Lạc Việt để check lại. Thế nên nhiều lúc thấy, Lạc Việt dịch… ngu ngu àh :)) (chắc tại nó dịch sai… ý hiểu của tớ :D ). OALD có một số chức năng chính như:

- Phần Pronounce cho bạn nghe phát âm theo kiểu Anh - Anh, Anh - Mỹ cực chuẩn.

- Phần Practice cho phép bạn ghi âm lại giọng đọc của mình và so sánh với giọng đọc chuẩn.

- Phần Exercises có… n+1 bài tập giúp bạn nhớ từ.

Ngoài ra còn có thêm cả bộ từ điển chuyên ngành văn hoá - Cultural Guide, cùng nhiều chức năng hữu ích khác đang chờ bạn khám phá :hug:

Quả là một bộ từ điển tuyệt vời :x ngay cả khi… có một số lỗi củ chuối của phần mềm
  1. Lỗi “License data is invalid!”
    Image Hosted by ImageShack.us

    Lỗi này xuất hiện không chỉ với phần mềm mua ở các cửa hàng software mà còn xuất hiện ngay đối với các đĩa đi kèm theo sách (hix.. bộ sách của nó đắt lè :( Mua ở Đinh Lễ mà cũng mất khoảng 200-300k :(( ). Rất ngạc nhiên là, cùng một đĩa, cùng một máy, cùng một hệ điều hành, có khi hôm trước vừa dùng xong, xoá đi. Hôm sau cài lại, đã bị thông báo “invalid” rồi :-w

    Cách fix lỗi này rất đơn giản. Các bạn download file zip ở đây. Giải nén lấy file exe, copy đè vào file cùng tên trong thư mục cài đặt từ điển (thư mục cài đặt mặc định là: C:\Program Files\Oxford\OALD7). Sau đó, khởi động lại OALD là xong :hug:

  2. Lỗi Insert disc
    Mình đã thử dùng Virtual Drive và Ultra ISO đều không được. Nhưng lạ thay khi cài đặt bằng Daemon Tool thì không bị tình trang như vậy. Đây cũng là công cụ miễn phí, bạn thử dùng xem.
  3. Lưu ý là nếu máy bạn chưa có Quicktime bản 6 thì nên cài đặt nhé.

Thứ Bảy, 2 tháng 5, 2009

SUY NGHĨ SAI LẦM VỀ VIỆC HỌC PASCAL !!

Đây là bài viết mình copy từ A1Club, thấy hay và có ích nên mong muốn chia sẻ cho mọi người xem.

PHẢN BIỆN NHỮNG SUY NGHĨ SAI LẦM VỀ VIỆC HỌC PASCAL
& Tiếp cận với ngôn ngữ Pascal từ một vài bài toán thực tế

Phuctho, 3/2009
* * *

Thế là sắp hết năm học lớp 11 mà mình thấy việc học pascal của các bạn trong lớp chẳng có gì khả quan! Có lẽ các bạn không có đam mê với môn học này chăng hay các bạn còn có những điều chưa rõ về mục đích của việc học pascal trong nhà trường!

Đã có lần mình đọc được trên mạng một bài viết rất phản cảm nói về ngôn ngữ Pascal. Bài viết cho rằng việc học pascal là vô bổ, là phí phạm thời gian! là làm sao mà bộ GDĐT không cho học Visual Basic thay cho pascal vốn đã cũ rích! ...tóm lại bài viết đó có ý nói rằng pascal là ngôn ngữ thiếu tính thực tế, không thể viết phần mềm ứng dụng !!!!

Về phần mình, mình xin nhận xét rằng tác giả của bài viết trên đã có một cái nhìn phiếm diện, một cái nhìn nông cạn của một kẻ qua đường với một ngôn ngữ trong sáng như pascal!!! Không một người đam mê pascal và giỏi lập trình nào lại có những cái nhìn như vậy!!

Xin hỏi lại bạn rằng nếu điều bạn nói là đúng thì biết bao sinh viên CNTT trên toàn thế giới hiện nay vẫn còn học hợp ngữ (ASM) làm cái gì chứ? Là vì họ không muốn sử dụng những hàm, thủ tục có sẵn mà họ luôn muốn tìm hiểu cách thức làm việc và cách tạo ra nó, cách tạo ra cái gọi là vỏ giao diện!!

Xin lấy ví dụ sau: bạn biết trong Visual Basic có thủ tục khởi tạo menu nhưng nó chỉ cho phép bạn lựa chọn những kiểu menu sẵn có, làm việc theo cách quản lí của microsoft nhưng tôi không thích thế! với pascal, tôi làm được nhiều thứ hơn: tôi tự lập trình cái gọi là menu cho chương trình của mình, không giống ai, tự do, thích kiểu nào tôi sẽ tự lập trình kiểu đó!


Sau đây mình sẽ phân tích ích lợi từ việc học pascal và có lẽ cũng là nguyên nhân vì sao pascal được đưa vào giảng dạy trong nhà trường. Sau đó sẽ là những bài toán ứng dụng cơ bản để có thể thấy khả năng của pascal khi nó nằm dưới tay một coder.

Phần I: Vì sao chọn Pascal?

- Thứ nhất:
pascal là ngôn ngữ có cú pháp trong sáng, nghĩa là cú pháp trong pascal rất sáng sủa, không gò bó, trình bày theo cấu trúc dễ hiểu, khoa học!

- Thứ hai:
học pascal là học tiếp xúc với việc lập trình cấu trúc và các thuật toán (có thể coi thuật toán là sợi dây nối vững chắc giữa Tin học với Toán học)!!
Điều này được thể hiện rõ khi muốn giải bài toán nào đó, ta đều có thể áp dụng những thuật toán tin học đã được nghiên cứu trên khắp thế giới (vd: Vét cạn, Tham lam, Đệ quy, Quy hoạch động, ... các thuật toán sắp xếp như Bubble Sort, Selection Sort, Insertion Sort, Shell Sort, Quick Sort, Heap Sort, Radix Sort, Merge Sort,... các thuật toán tìm kiếm như DFS, BFS, Ford Bellman, Dijkstra, Floyd, Kruskal, Prim, Edmonds, Lawler,... nhiều vô kể mà có lẽ một học sinh giỏi cũng không biết hết nên có thể coi việc nghiên cứu thuật toán là một môn khoa học!!!

Thử hỏi việc học Visual Basic có trở nên khoa học như việc học Pascal hay đó chỉ là những cái lợi trước mắt từ Visual Basic đem lại mà bạn chạy theo trong khi không có kiến thức về khoa học máy tính (điều này, Pascal sẽ trang bị cho bạn) !

- Thứ ba:
việc học pascal tạo tiền đề vững chắc cho việc học các ngôn ngữ khác, rất quan trọng cho mọi sinh viên CNTT

-
Thứ tư: việc học pascal không xa rời thực tế cuộc sống! giống như tin học nói chung vậy! (sẽ chứng minh qua các ví dụ)


Phần II: Ứng dụng thực tiễn

Sau đây chỉ là 3 ví dụ mẫu cho các bài toán tin học

Vấn đề thứ nhất: Bài toán chia phần

Trong ngày sinh nhật, hai chị em An và Liên nhận được rất nhiều đồ chơi. Đồ chơi thứ i có ghi giá tiền Xi. Hai chị em quyết định mỗi người phải có trách nhiệm bảo quản một phần số đồ chơi và phân chia sao cho chênh lệch tổng giá trị đồ chơi mà mỗi người quản lí là ít nhất. Hãy giúp An và Liên thực hiện việc này!

Bài toán rất đơn giản nếu như số đồ chơi chỉ đếm trên đầu ngón tay nhưng lại trở nên vô vùng phức tạp khi số lượng đồ chơi là con số lớn (VD: 1000 đồ chơi hoặc hơn thế nữa!!!) Nếu vậy thì làm sao chia phần!? Có lẽ cả tháng bạn cũng chưa giải quyết được!! Song với phương pháp Quy Hoạch Động áp dụng được trên pascal, bạn sẽ có kết quả trong vòng vài giây!!

Vấn đề thứ hai: Bài toán cái túi

Trong siêu thị có n gói hàng (n < >)

Kết Luận

#Lập trình cấu trúc là tiền thân của lập trình hướng đối tượng và luôn mạnh mẽ khi giải quyết mọi vấn đề!
#Có thể nhận ra rằng pascal còn quá nhiều điều bí ẩn mà chúng ta chưa biết!
#Xin có lời khuyên rằng: nếu sau này bạn muốn trở thành một lập trình viên hay một hacker thì điều cốt lõi là bạn phải làm quen với những thuật toán tin học. Hãy tìm tài liệu về vấn đề này và bắt đầu chúng với Pascal.

=> Việc chọn Pascal hay C để giảng dạy trong nhà trường là một quyết định sáng suốt của bộ GDĐT

Bài đăng phổ biến