



















Preview text:
lOMoAR cPSD| 58490434
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC NHA TRANG
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO THỰC TẬP CƠ SỞ
MÔ PHỎNG CÁC THUẬT TOÁN SẮP XẾP BẰNG CÁC THUẬT
TOÁN ĐỒ HỌA CƠ BẢN VỚI C++
Giảng viên hướng dẫn: Nguyễn Thị Hương Lý
Sinh viên thực hiện: Nguyễn Hùng Thiện Tùng
Mã số sinh viên: 64132855 Khánh Hòa – 2024 lOMoAR cPSD| 58490434 MỤC LỤC PHẦN MỞ ĐẦU
1. Lý do chọn đề tài:
Ngành công nghệ thông tin đang trở thành trụ cột quan trọng trong
sự phát triển của xã hội. Các ứng dụng công nghệ đã xâm nhập vào hầu hết
mọi khía cạnh của cuộc sống, đòi hỏi người làm việc trong lĩnh vực này
phải luôn cập nhật và phát triển kỹ năng. Nhằm đáp ứng nhu cầu học tập
và áp dụng các kiến thức lý thuyết, em chọn thực hiện đề tài: Mô phỏng
các thuật toán sắp xếp bằng các thuật toán đồ họa cơ bản với C+ +.
2. Mục tiêu của đề tài.
• Củng cố và ứng dụng kiến thức lập trình, bao gồm cấu trúc điều khiển,
mảng, chuỗi và các kiểu dữ liệu phức tạp.
• Nâng cao kỹ năng thực hành và làm quen với lập trình C++.
• Mô phỏng trực quan quá trình hoạt động của các thuật toán sắp xếp, đề cao khả năng tư duy logic.
3. Phạm vi nghiên cứu.
• Các thuật toán sắp xếp như Bubble Sort, Selection Sort, Insertion Sort...
• Sử dụng các đồ họa đơn giản như thanh cột, thay đổi màu sắc để thể hiện
từng bước thực thi thuật toán.
4. Phương pháp nghiên cứu.
• Tìm kiếm tài liệu hữu ích từ Internet và sách chuyên ngành.
• Lập trình thực tế trên C++, thử nghiệm và tối ưu hóa. lOMoAR cPSD| 58490434
Chương 1. TỔNG QUAN VỀ VẤN ĐỀ NGHIÊN CỨU
1.1 CƠ SỞ LÝ THUYẾT
1.1.1 Tổng quan về các thuật toán sắp xếp
• Thuật toán sắp xếp là một trong những bài toán cơ bản trong khoa học máy tính, dùng để sắp
xếp một dãy các phần tử theo một thứ tự nhất định, có thể là tăng dần hoặc giảm dần. Các thuật
toán sắp xếp phổ biến bao gồm Quick Sort, Merge Sort, Bubble Sort, Insertion Sort, Selection
Sort và nhiều thuật toán khác. Mỗi thuật toán có những ưu và nhược điểm riêng, tùy thuộc vào
bài toán và các yêu cầu cụ thể như độ phức tạp tính toán và độ ổn định.
• Mục đích của việc mô phỏng các thuật toán sắp xếp là giúp người học và người nghiên cứu có
thể hiểu rõ hơn về cách hoạt động của các thuật toán này qua hình ảnh trực quan. Điều này sẽ
giúp quá trình học trở nên sinh động và dễ tiếp cận hơn, đặc biệt trong việc nhận diện các bước
tiến hành của thuật toán.
Các thuật toán sắp xếp cơ bản được mô phỏng
Trong đề tài này, các thuật toán sắp xếp cơ bản được lựa chọn để mô phỏng bao gồm:
Thuật toán Bubble Sort: Đây là một trong những thuật toán sắp xếp đơn giản nhất, hoạt
động bằng cách liên tục hoán đổi các phần tử không đúng thứ tự trong mảng.
Thuật toán Selection Sort: Thuật toán này tìm phần tử nhỏ nhất trong mảng và di chuyển nó về đầu mảng.
Thuật toán Insertion Sort: Thuật toán này hoạt động bằng cách đưa phần tử vào vị trí thích
hợp trong phần mảng đã được sắp xếp.
Thuật toán Quick Sort: Thuật toán này chia mảng thành các phần nhỏ hơn và đệ quy sắp xếp
các phần đó. Đây là thuật toán sắp xếp nhanh với độ phức tạp trung bình O(n log n).
Các thuật toán này được mô phỏng trực quan qua đồ họa, với mỗi bước thay đổi trong mảng
được thể hiện bằng các đoạn đường thẳng hoặc hình chữ nhật có chiều dài tương ứng với giá trị
của phần tử trong mảng.
Mô phỏng các thuật toán sắp xếp Bubble Sort
Bubble Sort là thuật toán sắp xếp đơn giản nhưng khá chậm với độ phức tạp O(n²). Nó hoạt động
bằng cách so sánh hai phần tử liền kề nhau và hoán đổi chúng nếu chúng không theo thứ tự mong muốn.
Trong mô phỏng của tôi, mỗi lần hoán đổi phần tử được thể hiện bằng việc thay đổi màu sắc của
các phần tử trong mảng. Màu sắc sẽ thay đổi để đánh dấu các phần tử đang được so sánh và hoán đổi.
1.1.2 Giới thiệu về đồ họa trong C++
• Trong C++, đồ họa có thể được triển khai qua thư viện graphics.h, đây là một thư viện đồ họa
cơ bản cho phép vẽ hình ảnh, đối tượng và các yếu tố đồ họa khác trực tiếp trên màn hình. Thư
viện này chủ yếu sử dụng trong các môi trường lập trình như Turbo C++ hoặc các IDE hỗ trợ đồ họa. lOMoAR cPSD| 58490434
• Các chức năng đồ họa như vẽ đường thẳng, hình chữ nhật, hình tròn, và thậm chí là việc sử
dụng màu sắc khác nhau sẽ được dùng để mô phỏng các bước của thuật toán sắp xếp. Mỗi thay
đổi trong danh sách sắp xếp sẽ được hiển thị trên màn hình, giúp người dùng quan sát sự thay
đổi của các phần tử trong suốt quá trình.
1.2 CÔNG CỤ VÀ NGÔN NGỮ LẬP TRÌNH ĐƯỢC SỬ DỤNG
1.2.1 Ngôn ngữ lập trình C++
• C++ là một ngôn ngữ lập trình phổ biến được phát triển bởi Bjarne Stroustrup vào đầu những
năm 1980. Đây là ngôn ngữ có tính mạnh mẽ và linh hoạt, hỗ trợ lập trình hướng đối tượng, lập
trình hàm và lập trình thủ tục. C++ cho phép người lập trình kiểm soát tài nguyên hệ thống, đặc
biệt là bộ nhớ, qua việc sử dụng con trỏ và quản lý tài nguyên trực tiếp.
• C++ được sử dụng rộng rãi trong các ứng dụng phần mềm đòi hỏi hiệu suất cao như hệ điều
hành, trò chơi, và các ứng dụng có yêu cầu đồ họa. Trong đề tài này, C++ được chọn làm ngôn
ngữ lập trình chính để triển khai và mô phỏng các thuật toán sắp xếp, vì C++ có khả năng xử lý
dữ liệu lớn và thực hiện các thao tác tính toán phức tạp một cách nhanh chóng và hiệu quả.
• C++ cũng hỗ trợ việc xây dựng các chương trình đồ họa qua việc tích hợp với thư viện đồ họa,
giúp việc mô phỏng và trực quan hóa quá trình hoạt động của các thuật toán sắp xếp trở nên dễ dàng và sinh động.
1.2.2 Công cụ phát triển Dev-C++
• Dev-C++ là một môi trường phát triển tích hợp (IDE) phổ biến dành cho ngôn ngữ lập trình C
và C++. Đây là công cụ nhẹ, dễ sử dụng, và cung cấp các tính năng mạnh mẽ cho lập trình viên C++.
• Dev-C++ cung cấp đầy đủ các tính năng như soạn thảo mã nguồn, biên dịch, gỡ lỗi, và quản lý
các dự án lập trình. IDE này hỗ trợ các thư viện C++ phổ biến và có khả năng biên dịch mã
nguồn thành các ứng dụng thực thi trên nhiều hệ điều hành.
• Một trong những điểm mạnh của Dev-C++ là giao diện người dùng trực quan, giúp các lập
trình viên dễ dàng viết và thử nghiệm mã nguồn mà không gặp phải các rắc rối phức tạp. Bên
cạnh đó, Dev-C++ cũng hỗ trợ việc tích hợp các thư viện đồ họa như graphics.h, điều này rất
hữu ích trong việc mô phỏng các thuật toán sắp xếp trong dự án của chúng ta.
• Trong đề tài này, Dev-C++ được sử dụng như công cụ chính để biên dịch và chạy mã nguồn
C++, đồng thời hỗ trợ các thư viện đồ họa giúp hiển thị trực quan quá trình thực hiện các thuật toán sắp xếp.
1.2.3 Thư viện đồ họa graphics.h
• Graphics.h là một thư viện đồ họa phổ biến trong C++ được sử dụng để vẽ hình ảnh, đối tượng
và các yếu tố đồ họa trên màn hình. Thư viện này hỗ trợ các thao tác cơ bản như vẽ các đường
thẳng, hình chữ nhật, hình tròn, hình elip, và nhiều đối tượng đồ họa khác. Ngoài ra, graphics.h
cũng cung cấp khả năng thao tác với các màu sắc, font chữ và các tính năng đồ họa nâng cao khác. lOMoAR cPSD| 58490434
• Thư viện graphics.h là công cụ lý tưởng để mô phỏng các thuật toán sắp xếp trong C++ vì nó
giúp hình dung các thao tác như hoán đổi, tìm kiếm, phân chia, và các thay đổi khác trong
mảng. Mỗi bước thực hiện của thuật toán sắp xếp sẽ được thể hiện thông qua các thay đổi đồ
họa như màu sắc, kích thước và vị trí của các phần tử trên màn hình. Điều này không chỉ giúp
người dùng dễ dàng theo dõi tiến trình thuật toán mà còn làm tăng tính sinh động và trực quan của ứng dụng.
• Cùng với Dev-C++ và C++, thư viện graphics.h hỗ trợ trực quan hóa các thuật toán sắp xếp
như Bubble Sort, Selection Sort, Insertion Sort, và Quick Sort, giúp người dùng dễ dàng hiểu
và theo dõi quá trình thay đổi của các phần tử trong mảng theo từng bước
Chương 2. Đặc tả bài toán
2.1 BÀI TOÁN Bài toán đặt ra trong đề tài này là: MÔ PHỎNG CÁC THUẬT
TOÁN SẮP XẾP BẰNG ĐỒ HỌA
• Vận dụng kiến thức lập trình C++
• Các thuật toán sắp xếp: Bubble, Selection, Insertion,Quicksort.
• Các thuật toán đồ họa cơ bản : sinh đường thẳng, vẽ hình chữ nhật, tô màu(scanline)
2.2 HƯỚNG XỬ LÝ VÀ CÁC THUẬT TOÁN ĐỂ THỰC HIỆN CÁC YÊU CẦU
2.2.1 Mô phỏng và thể hiện các thuật toán sắp xếp cơ bản bằng đồ họa
Mỗi phần tử trong mảng được thể hiện bằng một thanh dọc, chiều cao của thanh tương ứng với giá trị của phần tử.
2.2.1.1 Thuật toán Bubble Sort
Bubble Sort là thuật toán sắp xếp đơn giản nhất, thực hiện qua việc liên tục so sánh và đổi chỗ
các phần tử liền kề nếu chúng không theo thứ tự. Quá trình này được lặp lại cho đến khi không
còn sự thay đổi nào nữa. Để mô phỏng thuật toán này bằng đồ họa:
Trong mô phỏng của tôi, mỗi lần hoán đổi phần tử được thể hiện bằng việc thay đổi màu sắc của
các phần tử trong mảng. Màu sắc sẽ thay đổi để đánh dấu các phần tử đang được so sánh và hoán đổi
2.2.1.2 Thuật toán Selection Sort
Selection Sort hoạt động theo cách chọn phần tử nhỏ nhất (hoặc lớn nhất, tùy thuộc vào thứ tự
sắp xếp) và đổi chỗ nó với phần tử đầu tiên chưa được sắp xếp. Để mô phỏng thuật toán này:
Trong mô phỏng của tôi, phần tử được tìm thấy là phần tử nhỏ nhất sẽ được làm nổi bật bằng
một màu sắc khác biệt, đồng thời chỉ ra sự thay đổi của các phần tử sau mỗi lần hoán đổi ,làm
nổi bật phần tử đang được so sánh và phần tử đang được chọn để hoán đổi.
2.2.1.3 Thuật toán Insertion Sort
Insertion Sort xây dựng mảng đã sắp xếp một cách dần dần, mỗi phần tử mới được "chèn" vào vị
trí thích hợp trong phần mảng đã được sắp xếp trước đó. Để mô phỏng thuật toán này: lOMoAR cPSD| 58490434
Trong mô phỏng, mỗi lần chèn phần tử vào mảng, đồ họa sẽ thể hiện sự thay đổi vị trí của phần
tử và làm nổi bật nó bằng màu sắc.
2.2.1.4 Thuật toán Quick Sort
Quick Sort là thuật toán chia để trị, nó chọn một phần tử làm "pivot" và phân chia mảng thành
hai phần: phần tử nhỏ hơn pivot và phần tử lớn hơn pivot. Sau đó, nó sắp xếp hai phần này một
cách đệ quy. Để mô phỏng thuật toán này:
Một thanh đặc biệt sẽ được chọn làm pivot và các phần tử được phân chia thành hai nhóm.
Trong mô phỏng của Quick Sort, mỗi lần phân chia mảng và chọn pivot sẽ được thể hiện rõ ràng
bằng cách vẽ các phần tử mảng theo các nhóm, mỗi nhóm được tô màu khác nhau để dễ phân
biệt. Pivot cũng được làm nổi bật để cho thấy phần tử đang được sử dụng trong quá trình phân chia.
Chương 3. CÀI ĐẶT CHƯƠNG TRÌNH
3.1 Mã nguôn của chương trình: #include #include #include #include #define MAX 100 #define INPUT "text.txt" #define Y 4 //Hàm void readfile();
void INPoint(struct toado m[MAX],int size); void vekhung();
void quickSortMidPivot( int left, int right); void
mouse(); void keyboard(); void selection(); void
bubble(); void insertion(); void vediem(struct toado
m[MAX],int color); void vediem1(struct toado
points[MAX],int size); void scanline(int x1, int y1, int x2, int y2, int fillColor);
void shuffle(struct toado point[MAX],int size); void quick(int l, int r);
void todiem(struct toado point, int color, int n); //BienToanCuc lOMoAR cPSD| 58490434 int sodinh; FILE *fp; char buffer[10]; int enable_click=1; int X; struct toado{ int value; }; struct toado td[MAX]; //doc file void readfile(){ fp=fopen(INPUT,"r");
if(fp==NULL){printf("File not Found");return;
} fscanf(fp,"%d",&sodinh); printf("\n so phan
tu can sx la %d \n",sodinh); for(int i=0;i%d",&td[i].value); } fclose(fp); } //ham ngau nhien
void randomArray(struct toado point[MAX], int size) { srand(time(NULL));
for (int i = 0; i < size; i++) {
point[i].value = rand() % 100 + 1; } } //ve giao dien void vekhung(){ setcolor(5); setlinestyle(0, 1, 3); rectangle(10, 10, 1380, 610); setcolor(11 );
rectangle(1250, 40, 1350, 100); settextstyle(2, 0, 7);
outtextxy(1270, 60, "Shuffle"); lOMoAR cPSD| 58490434 setcolor(10);
rectangle(75, 640, 275, 700); // Nút "Read File" settextstyle(2, 0, 9);
outtextxy(95, 655, "Read File");
rectangle(425, 640, 625, 700); // Nút "Try Again" settextstyle(2, 0, 9);
outtextxy(440, 655, "Try Again");
rectangle(775, 640, 975, 700); // Nút "Key Board" settextstyle(2, 0, 9);
outtextxy(785, 655, "Key Board");
rectangle(1125, 640, 1325, 700); // Nút "Random" settextstyle(2, 0, 9);
outtextxy(1145, 655, "Random"); setcolor(13); // Các l?a ch?n s?p x?p rectangle(75,
740, 275, 800); settextstyle(2, 0, 9); outtextxy(95, 752, "Selection");
rectangle(425, 740, 625, 800); settextstyle(2, 0, 9);
outtextxy(465, 752, "Bubble");
rectangle(775, 740, 975, 800); settextstyle(2, 0, 9);
outtextxy(800, 752, "Insertion");
rectangle(1125, 740, 1325, 800); settextstyle(2, 0, 9);
outtextxy(1170, 752, "Quick"); } //xu ly click chuot void mouse(){
int x, y; while(enable_click){
if(ismouseclick(WM_LBUTTONDOWN)){
getmouseclick(WM_LBUTTONDOWN, x, y); if (x
>= 75 && x <= 275 && y >= 640 && y <= 700) { printf("Read File\n"); readfile(); lOMoAR cPSD| 58490434 cleardevice(); vekhung(); vediem1(td, sodinh); }
if (x >= 425 && x <= 625 && y >= 640 && y <=
700) { printf("Try Again\n"); enable_click
= 1; cleardevice(); vekhung(); sodinh = 10; randomArray(td, sodinh); vediem1(td, sodinh); }
if (x >= 775 && x <= 975 && y >= 640 && y <= 700) { printf("Key Board\n"); cleardevice(); vekhung(); keyboard(); vediem1(td, sodinh); }
if (x >= 1125 && x <= 1325 && y >= 640 && y <=
700) { printf("Random\n"); cleardevice();
vekhung(); sodinh=10; randomArray(td, sodinh); vediem1(td, sodinh); }
if(x >= 1250 && x <= 1350 && y >= 40 && y <= 100){ printf("Shuffle\n"); cleardevice(); vekhung(); shuffle(td,sodinh); vediem1(td, sodinh); }
if(x >= 75 && x <= 275 && y >= 740 && y <=
800){ printf("Selection sort\n");
enable_click = 0; setcolor(4);
rectangle(75, 740, 275, 800); settextstyle(2, 0, 9);
outtextxy(95, 752, "Selection"); selection(); } lOMoAR cPSD| 58490434
if(x >= 425 && x <= 625 && y >= 740 && y <=
800){ printf("Bubble sort\n");
enable_click = 0; setcolor(4);
rectangle(425, 740, 625, 800); settextstyle(2, 0, 9);
outtextxy(465, 752, "Bubble"); bubble(); }
if(x >= 775 && x <= 975 && y >= 740 && y <= 800){ printf("Insertion sort\n");
enable_click = 0; setcolor(4);
rectangle(775, 740, 975, 800); settextstyle(2, 0, 9);
outtextxy(800, 752, "Insertion"); insertion(); // }
if(x >= 1125 && x <= 1325 && y >= 740 && y <= 800){ printf("Quick sort\n");
enable_click = 0; setcolor(4); // Màu d? cho l?a ch?n
rectangle(1125, 740, 1325, 800); settextstyle(2, 0, 9);
outtextxy(1170, 752, "Quick");
quickSortMidPivot(0,sodinh-1); cleardevice(); vekhung(); vediem1(td,sodinh); for (int i = 0; i < sodinh; i++) { todiem(td[i], 9, i); } enable_click=1; } }
// xu ly su kien khi muon thoat ra thi chuot phai
if(ismouseclick(WM_RBUTTONDOWN)){
getmouseclick(WM_RBUTTONDOWN, x, y); printf("\nExiting..\n"); closegraph(); break; lOMoAR cPSD| 58490434 } delay(100); } } //hàm tron
void shuffle(struct toado point[MAX], int size) { srand(time(NULL));
for (int i = size - 1; i > 0; i--) { int j = rand() % (i + 1); int temp = point[i].value;
point[i].value = point[j].value; point[j].value = temp; } } //doc tu ban phim void keyboard(){ fp=fopen(INPUT,"r");
if(fp==NULL){printf("File not Found");return;
} fscanf(fp,"%d",&sodinh); for(int
i=0;iprintf("td[%d].value = ",i); scanf("%d",&td[i].value); } fclose(fp); } //to mau
void scanline(int x1, int y1, int x2, int y2, int
Color) { for (int y = y1; y <= y2; y++) { for
(int x = x1; x <= x2; x++) { putpixel(x, y,Color); } } } //ve 1 diem
void vediem(struct toado point, int color, int n){ setcolor(color); X=1000/sodinh;
rectangle(200 + X * n, 500 - point.value * Y, 200 + X * (n + 1),
500); settextstyle(1, 0, 3); if(point.value>=10){
outtextxy(200 + X * n+6 , 500 - point.value * Y - 30, itoa(point.value, buffer, 10)); }
else outtextxy(200 + X * n+16 , 500 - point.value * Y - 30, itoa(point.value, buffer, 10)); } lOMoAR cPSD| 58490434 //to mau 1 diem
void todiem(struct toado point, int color, int n){ setcolor(color);
rectangle(200 + X * n, 500 - point.value * Y, 200 + X * (n + 1),
500); settextstyle(1, 0, 3); if(point.value>=10){
outtextxy(200 + X * n+6 , 500 - point.value * Y - 30, itoa(point.value, buffer, 10)); }
else outtextxy(200 + X * n+16 , 500 - point.value * Y - 30, itoa(point.value, buffer,
10)); scanline(201+X*n,500-point.value*Y,199+X*(n+1),500,color); } //ve mang
void vediem1(struct toado points[MAX],int
size){ for(int i=0;ivediem(points[i],15,i); } }
void vediem2(struct toado points[MAX],int size,int
minsize){ for(int i=size-1;i>minsize;i--){ vediem(points[i],2,i); } } //xoa diem sau khi thay doi
void xoadiem(struct toado point,int color,int n){ setcolor(color);
rectangle(200 + X * n, 500 - point.value * Y, 200 + X * (n + 1),
500); settextstyle(1, 0, 3); if(point.value>=10){
outtextxy(200 + X * n+6 , 500 - point.value * Y - 30, itoa(point.value, buffer, 10));} else
outtextxy(200 + X * n + 16, 500 - point.value * Y - 30, itoa(point.value, buffer, 10)); }
//select void selection(){ for(int i
= 0; i < sodinh - 1; i++) { int min=i; vediem(td[i],4,i); delay(700);
for (int j = i + 1; j < sodinh; j++) { if(td[j].value xoadiem(td[min],15,min); min=j;
vediem(td[i],4,i); vediem(td[j],5,j); delay lOMoAR cPSD| 58490434 (700) ; }} vediem(td[min],2,min); delay(400); cleardevice(); int tam = td[i].value; td[i].value = td[min].value; td[min].value = tam; vediem1(td,sodinh); } vekhung(); mouse();
for (int i = 0; i < sodinh; i++) { todiem(td[i], 9, i); } enable_click=1; } //bubble void bubble(){
for(int i=sodinh-1;i>0;i--){
for(int k=0;kvediem1(td,sodinh); vediem2(td,sodinh,i); vediem(td[k+1],4,k+1);
vediem(td[k],4,k); delay(400);
if(td[k].value>td[k+1].value){ cleardevice(); int tam = td[k+1].value; td[k+1].value=td[k].value; td[k].value=tam; delay(10); vediem1(td,sodinh); vediem2(td,sodinh,i); vediem(td[k+1],9,k+1) ; vediem(td[k],9,k); delay(400); } cleardevice(); lOMoAR cPSD| 58490434 } } vekhung(); mouse(); for(int i=0;i enable_click=1; }
//insert void insertion(){ for
(int i = 1; i < sodinh; i++) { int j = i; vediem(td[i],4,i);
while (j >= 0 && td[j].value delay(500); vediem(td[j-1],4,j-1); vediem(td[j],4,j); delay(200); int tam=td[j].value; td[j].value=td[j-1].value; td[j-1].value=tam; cleardevice(); vediem1(td,sodinh); vediem(td[j],2,j); vediem(td[j-1],2,j-1); j-- ; } delay(500 );vediem1 lOMoAR cPSD| 58490434 (td,sodinh ); } vekhung(); mouse();
for (int i = 0; i < sodinh; i++) { todiem(td[i],9, i); } enable_click=1; } //phan hoach
void quickSortMidPivot(int left, int right) {
if (left >= right) return; int mid = (right
+ left) / 2; int pivot = td[mid].value;
cleardevice(); vediem1(td, sodinh); vediem(td[mid], 2, mid); lOMoAR cPSD| 58490434
delay(500); int i = left; int
j = right; while (i <= j) {
while (td[i].value < pivot) i++;
while (td[j].value > pivot) j--; if (i <= j) { int temp = td[i].value; td[i].value = td[j].value; td[j].value = temp; cleardevice(); vediem1(td, sodinh); vediem(td[mid], 2, mid); vediem(td[i], 5, i); vediem(td[j], 5, j); delay(1000); i++; j--; } } cleardevice(); vediem1(td, sodinh);
for (int k = left; k <= j; k++) { vediem(td[k], 4, k); }
for (int k = i; k <= right; k++) { vediem(td[k], 6, k); }
delay(1000); if (left < j)
quickSortMidPivot(left, j); if (i <
right) quickSortMidPivot(i, right); } lOMoAR cPSD| 58490434 int main(){ setcolor(15); initwindow(1400,900); vekhung(); mouse(); getch(); }
3.2 Cấu trúc của chương trình
Chương trình được chia thành các phần chính sau:
Khởi tạo giao diện:
Màn hình giao diện chính được tạo ra bằng cách sử dụng thư viện graphics.h, bao gồm các
nút bấm để người dùng có thể lựa chọn hành động như "Đọc file", "Chạy lại", "Nhập từ bàn
phím", "Tạo ngẫu nhiên" và các thuật toán sắp xếp.
Các điểm dữ liệu được hiển thị dưới dạng cột biểu diễn giá trị của chúng và sẽ thay đổi khi
thuật toán sắp xếp được thực hiện.
Đọc dữ liệu từ file hoặc nhập từ bàn phím:
Dữ liệu có thể được nhập từ file hoặc bàn phím. Khi chọn "Đọc file", chương trình sẽ đọc
mảng dữ liệu từ một file văn bản đã định dạng trước.
Người dùng cũng có thể nhập mảng dữ liệu trực tiếp từ bàn phím nếu chọn "Nhập từ bàn phím".
Các thuật toán sắp xếp: Selection Sort, Bubble Sort, Insertion Sort, Quick Sort
Quản lý giao diện người dùng:
Các sự kiện chuột được xử lý để người dùng có thể tương tác với giao diện. Khi người dùng
click vào các nút, chương trình sẽ thực hiện các hành động tương ứng như đọc file, tạo mảng
ngẫu nhiên, thực hiện thuật toán sắp xếp, v.v.
Giao diện sẽ hiển thị các cột biểu diễn các giá trị mảng và các bước thay đổi trong quá trình thực
hiện thuật toán sắp xếp. lOMoAR cPSD| 58490434
3.3 Mô tả chi tiết các chức năng trong chương trình
3.3.1 Giao diện đồ họa
3.3.2 Đọc file và nhập dữ liệu từ bàn phím
Chương trình hỗ trợ đọc dữ liệu từ file với định dạng đã quy định (Text.txt). Người dùng có
thể chọn " Readfile" để nạp dữ liệu từ file. Nếu người dùng muốn nhập dữ liệu thủ công,
chương trình cũng hỗ trợ nhập từ bàn phím khi chọn "KeyBoard".
Đọc file: mặc đinh file cần đọc là Text.txt lOMoAR cPSD| 58490434
Khi chọn vào Readfile: Sẽ tiến hành đọc file và vẽ các cột với giá trị tương ứng
Nhập từ bàn phím ( Keyboard ): lOMoAR cPSD| 58490434 Sau khi nhập: Mã nguồn :