Việc nghiên cứu và lập trình ra các phần mềm, các ứng dụng mới là điều hướng tới của các sinh viên theo học công nghệ thông tin.Bản báo cáo này trình bày kết quả của việc lập trình các b
Trang 2TRƯỜNG ĐẠI HỌC VINH
KHOA CÔNG NGHỆ THÔNG TIN
-
BÁO CÁO
ĐỀ TÀI THỰC TẬP CƠ SỞ
Giáo viên HD: TS Trần Xuân Sang
Vinh, 8/2015
Trang 3Lời nói đầu 4
PHẦN 1: BÀI TOÁN 1 7
I NỘI DUNG ĐỀ 7
II GIẢI QUYẾT VẤN ĐỀ LÝ THUYẾT 7
1 Danh sách liên kết 7
2 LIFO là gì? 7
III THUẬT TOÁN GIẢI QUYẾT CÔNG VIỆC CHO MỖI HÀM 7
1 Lựa chọn ngôn ngữ lập trình 7
2 Xác định bài toán 7
3 Thuật toán và code các hàm 8
3.1 Thuật toán đọc các phần tử của tệp vào danh sách kết nối LIFO 8
3.2 Giải thuật sắp xếp danh sách 8
3.3 Giải thuật thêm một số mà không làm thay đổi tính tăng của danh sách 8 IV CHƯƠNG TRÌNH MINH HỌA 9
V BỘ DỮ LIỆU TEST VÀ KẾT QUẢ TƯƠNG ỨNG 12
PHẦN 2: BÀI TOÁN 2 13
I NỘI DUNG ĐỀ 13
II GIẢI QUYẾT VẤN ĐỀ LÝ THUYẾT 13
1 Trình bày thuật toán sắp xếp chọn 13
Trang 41 Lựa chọn ngôn ngữ lập trình 13
2 Xác định bài toán 13
3 Thuật toán SelectionSort 14
IV CHƯƠNG TRÌNH 14
VI BỘ DỮ LIỆU TEST VÀ KẾT QUẢ TƯƠNG ỨNG 15
Trang 5Lời cảm ơn
Ngày nay, công nghệ thông tin ngày càng phát triển và tỏ rõ tầm quan trọng trong tất cả các lĩnh vực, có thể nói công nghệ thông tin đã trở thành thước đo để đánh giá sự phát triển của xã hội hiện đại – nơi mà con người đang dần thoát khỏi cách làm việc thủ công, thô sơ và dần tiến đến tin học hóa trong tất cả các lĩnh vực để công việc có hiệu quả hơn, tiết kiệm thời gian và nhân lực
Việc nghiên cứu và lập trình ra các phần mềm, các ứng dụng mới là điều hướng tới của các sinh viên theo học công nghệ thông tin.Bản báo cáo này trình bày kết quả của việc lập trình các bài toán liên quan đến tệp và cấu trúc dữ liệu và giải thuật trong đề tài thực tập cơ sở Trong quá trình thực hiện em nhận được sự giúp đỡ nhiệt tình từ các giảng viên trong khoa công nghệ thông tin trường Đại Học Vinh
Nhân dịp này em xin gửi lời cảm ơn đến các thầy cô trong khoa công nghệ thông tin trường Đại Học Vinh đã tạo cơ hội giúp em được tham gia học hỏi, rèn luyện các kỹ năng cần thiết cho đợt thực tập cuối khóa Đặc biệt em xin gửi lời cảm ơn đến giảng
viên TS.Trần Xuân Sang đã quan tâm góp ý cho bài làm thực tập cơ sở và sẵn sàng trả
lời tất cả những thắc mắc khi cần thiết giúp em hoàn thành tốt bài làm của mình
Mặc dù đã có nhiều cố gắng nhưng do kiến thức còn hạn chế cùng với kinh nghiệm chưa có nên không tránh khỏi thiếu sót.Vì vậy em rất mong nhận được những ý kiến đóng góp bổ sung của thầy cô giáo và các bạn để bài làm thực tập cơ sở của em được hoàn thiện hơn
Em xin chân thành cảm ơn!
Trang 6Đ tài th c t p c s Mã đ 025 ề ự ậ ơ ở ề
Lời nói đầu
Ngày nay, chúng ta đang sống trong thế giới của công nghệ thông tin Tin học đã
đi vào tất cả các “ngõ ngách” của đời sống xã hội, từ những công việc đơn giản như giải một bài toán thuần tuý đến những vấn đề phức tạp như việc áp dụng tin học trong công nghệ viễn thông hay trong nghiên cứu vũ trụ…Việc ứng dụng công nghệ thông tin trong quản lý đã và đang đem lại nhiều lợi ích thiết thực cho doanh nghiệp từ việc lưu trữ dữ liệu đến việc tìm kiếm thông tin, lên các báo cáo…giúp cho công tác quản lý đựơc thực hiện một cách dể dàng hơn
Những năm gần đây trong lĩnh vực công nghệ thông tin, Việt Nam đã có những bước phát triển vượt bậc theo hướng đi thẳng đón đầu vào việc hiện đại hoá, công nghệ hoá, mạnh dạn đầu tư trang thiết bị, máy móc hiện đại
Trong thời gian thực tập tại VDC mặc dù được các Anh (Chị) tận tình hướng dẫn nhưng do thời gian thực tập ngắn, vốn kiến thức và kinh nghiệm thực tế còn hạn chế nên trong đề tài chắc chắn không tránh khỏi những thiếu sót Em rất mong nhận được sự đóng góp ý kiến từ phía cơ quan thực tập, quý Thầy (Cô) và các bạn để bài báo cáo này có thể hoàn thiện hơn
Trang 7ĐỀ TÀI THỰC TẬP CƠ SỞ - PHẦN LẬP TRÌNH
Mã đề: 025
Câu 1:
Viết chương trình đọc các phần từ của một tệp văn bản vào một danh sách kết nối LIFO.
Sắp xếp danh sách theo thứ tự tăng dần Nhập vào từ bàn phím một số nguyên x Chèn số
x vào danh sách sao cho không làm mất tính sắp xếp tăng của danh sách
Câu 2:
1 Trình bày thuật toán sắp xếp chọn
2 Nêu ví dụ minh họa
3 Cài đặt thuật toán
Trang 8Đ tài th c t p c s Mã đ 025 ề ự ậ ơ ở ề
Trang 9PHẦN 1: BÀI TOÁN 1
I N I DUNG Đ Ộ Ề
Viết chương trình đọc các phần từ của một tệp văn bản vào một danh sách kết nối LIFO Sắp xếp danh sách theo thứ tự tăng dần Nhập vào từ bàn phím một số nguyên x Chèn số x vào danh sách sao cho không làm mất tính sắp xếp tăng của danh sách
II GI I QUY T V N Đ LÝ THUY T Ả Ế Ấ Ề Ế
1 Danh sách liên k t ế
Danh sách liên kết là một tập hợp tuyến tính các phần tử cùng kiểu gọi là các nút (node),mỗi nút có các đặc điểm sau:
Mỗi nút có ít nhất hai trường, một trường gọi là trường dữ liệu (data), một trường là trường liên kết (link) trỏ tới (thường gọi là next)
Trường liên kết của phần tử thứ i của danh sách sẽ trỏ tới phần tử thứ (i+1) của danh sách
Phần tử đầu tiên gọi là head và phần tử cuối cùng gọi là tail Head không chứa
dữ liệu và trường next của tail chỉ vào NULL
Trường data là trường chứa dữ liệu lưu trong danh sách liên kết
2 LIFO là gì?
Lifo là viết tắt của “last-in-first-out”, hiểu đơn giản là phương pháp vào sau ra trước Ví
dụ ta nhập vào 1 mảng gồm dãy a1, a2,…,a(n-1), a(n) Xuất dãy ra sẽ xuất các phần tử từ sau đến trước lần lượt a(n), a(n-1),…., a2 ,a1
III THUẬT TOÁN GIẢI QUYẾT CÔNG VIỆC CHO MỖI HÀM.
1 Lựa chọn ngôn ngữ lập trình
Ngôn ngữ lập trình C
Trang 10Đ tài th c t p c s Mã đ 025 ề ự ậ ơ ở ề
INPUT:
-Tệp văn bản input.txt tệp đầu vào chứa các số nguyên.
-Mỗi số cách nhau 1 dấu cách trống hoặc ít nhất một dấu xuống dòng
OUTPUT:
-In ra màn hình kết quả có trong tệp input.txt
-Sắp xếp danh sách theo thứ tự tăng dần
-Chèn vào một số x mà không làm mất tính tăng của danh sách
3 Thuật toán và code các hàm
3.1 Thuật toán đọc các phần tử của tệp vào danh sách kết nối LIFO
Bước 1: Khai báo con biến con trỏ tệp và biến con trỏ kiểu node Kiểm tra có tồn tại tệp
input.txt không, nếu tồn tại thì bắt đầu đọc các dữ liệu từ tệp input.txt
Bước 2: Kiểm tra xem quá trình đọc tệp đã kết thúc hay chưa Nếu chưa thì thực hiện
bước 3
Ngược lại chuyển sang bước 4
Bước 3: Khởi tạo node mới, lấy dữ liệu ra và đưa lên đầu danh sách Quay lại bước 2 Bước 4: Đóng tệp và kết thúc.
3.2 Giải thuật sắp xếp danh sách
Bước 1: Ta khai báo hai biến con trỏ p1,p2 kiểu node dùng làm biến chạy, một biến kiểu
int làm biến trung gian, sau đó gán p1=f
Bước 2: Kiểm tra trong khi p1 chưa trỏ đến node cuối <while(p1->next != NULL)> thì gán p2 bằng node mà p1 trỏ tiếp theo< p2=p1->link>
Bước 3: Kiểm tra xem trong khi p2 chưa trỏ đến node cuối <while(p2!=NULL)> thì so
sánh giá trị của phần tử mà p1 đang trỏ tới có lớn hơn giá trị của phần tử mà p2 đang trỏ tới không, nếu đúng thì tiến hành đổi chỗ 2 node, ngược lại thì ta gán p2 bằng phần tử p2 đang trỏ đến:p2=p2->link
Bước 4: Khi p2==NULL thì gán p1 bằng node mà p1 đang trỏ đến Quay lại bước 2.
3.3 Giải thuật thêm một số mà không làm thay đổi tính tăng của danh sách
Bước 1: Ta khai báo một biến con trỏ tạm p1, và biến con trỏ x kiểu node.
Trang 11Bước 3: Tìm phần tử cuối của danh sách.
Bước 4: Tiến hành so sánh giá trị của node vừa tạo với giá trị của các phần tử của các
node có trong danh sách Nếu giá trị của nó lớn hơn giá trị của node đầu thì tiến hành chèn đầu, nếu lớn hơn giá trị của node cuối thì tiến hành chèn cuối, ngược lại thì chèn giữa
IV CHƯƠNG TRÌNH MINH HỌA
#include<conio.h>
#include<stdio.h>
#include<iostream>
typedef struct node
{
int info;
node *link;
};
// Doc tep vao danh sach ket noi LIFO
node *doctep(node *f)
{
FILE *u;
f==NULL;
node *p;
u=fopen("input.txt","r");
if(u==NULL)
{
printf("\nFILE khong ton tai!");
getch();
}
else{
Trang 12Đ tài th c t p c s Mã đ 025 ề ự ậ ơ ở ề
{
p=new node();
fscanf(u,"%d",&p->info);
p->link=f;
f=p;
} }
fclose(u);
return f;
}
//Xem danh sach
void xemdanhsach(node *f)
{
node *p;
p=f;
while (p!=NULL)
{
printf(" \t %d ",p->info);
p=p->link;
}
}
//Sap xep tang
void sapxeptang(node *f)
{
node *p1,*p2;
int tg;
p1=f;
while (p1->link!=NULL){
p2=p1->link;
while (p2!=NULL){
if (p1->info>p2->info){
Trang 13p1->info=p2->info;
p2->info=tg;
}
else
{
p2=p2->link;
}
}
p1=p1->link;
}
}
//Tim phan tu cuoi
node *timptcuoi(node *f){
node *p=f;
while(p->link!=NULL)
{
p=p->link;
}
return p;
}
//Them so x khong lam thay doi tinh tang cua danh sach
node *themx(node *f)
{
node *p,*x;
x=new(node);
printf("\n\t(*)Nhap so can them vao : ");
scanf("%d",&x->info);
node *l=timptcuoi(f);
if (f==NULL) {
Trang 14Đ tài th c t p c s Mã đ 025 ề ự ậ ơ ở ề
return x;
}
if((f->info)>=(x->info)){
x->link=f;
return x;
}
if((l->info)<(x->info)){
l->link=x;
x->link=NULL;
return f;
}
else
{
while (((p->link)->info)<(x->info))
p=p->link;
x->link=p->link;
p->link=x;
return f;
}
}
//Chuong trinh chinh
main()
{
node *f=NULL;
f=doctep(f);
printf("\n\t(*)Cac phan tu duoc doc tu tep la:");
xemdanhsach(f);
printf("\n\t(*)Day sau khi sap xep tang:");
sapxeptang(f);
xemdanhsach(f);
printf("\n\t(*)Them 1 so vao khong thay doi thu tu sap xep :");
f=themx(f);
Trang 15getch();
}
V BỘ DỮ LIỆU TEST VÀ KẾT QUẢ TƯƠNG ỨNG.
Tệp đầu vào input.txt:
Output:
Trang 16Đ tài th c t p c s Mã đ 025 ề ự ậ ơ ở ề
PHẦN 2: BÀI TOÁN 2
I NỘI DUNG ĐỀ
1 Trình bày thuật toán sắp xếp chọn
2 Nêu ví dụ minh họa
3 Cài đặt thuật toán
II GI I QUY T V N Đ LÝ THUY T Ả Ế Ấ Ề Ế
1 Trình bày thu t toán s p x p ch n ậ ắ ế ọ
Ý tưởng:
Chọn phần tử nhỏ nhất trong n phần tử ban đầu, đưa phần tử này về vị trí đúng là đầu tiên của dãy hiện hành Sau đó không quan tâm đến nó nữa, xem dãy hiện hành chỉ còn n-1 phần tử của dãy ban đầu, bắt đầu từ vị trí thứ 2 Lặp lại quá trình trên cho dãy hiện hành đến khi dãy hiện hành chỉ còn 1 phần tử Dãy ban đầu có n phần tử, vậy tóm tắt
ý tưởng thuật toán là thực hiện n-1 lượt việc đưa phần tử nhỏ nhất trong dãy hiện hành về
vị trí đúng ở đầu dãy
Giải thuật:
Bước 1: i=0
Bước 2: Tìm phần tử A[min] nhỏ nhất trong dãy hiện hành từ a[i]-> a[n-1]
Bước 3: Hoán vị a[min] và a[i]
Bước 4: Nếu i<=n-1 thì i=i+1 Lặp lại bước 2
Ngươc lại: Dừng, n phần tử đã nằm đúng vị trí
2 Ví d minh h a ụ ọ
Cho dãy X={X1, X2, Xn}, hãy sắp xếp dãy theo chiều không giảm
X = {7, 2, 5, 4, 1, 3, 8, 6}
Dãy ban đầu 7, 2, 5, 4, 1, 3, 8, 6}
i=0,min=4, swap(X[min],X[i]) ta có 1, 2, 5, 4, 7, 3, 8, 6
i=1, min=1, không đổi chỗ, ta có 1, 2, 5, 4, 7, 3, 8, 6
i=2, min=4, swap(X[min],X[i]) ta có 1, 2, 3, 4, 7, 5, 8, 6
i=3, min=3, không đổi chỗ, ta có 1, 2, 3, 4, 7, 5, 8, 6
i=4, min=5, swap(X[min],X[i]) ta có 1, 2, 3, 4, 5, 7, 8, 6
i=5, min=7, swap(X[min],X[i]) ta có 1, 2, 3, 4, 5, 6, 8, 7
i=6, min=7, swap(X[min],X[i]) ta có 1, 2, 3, 4, 5, 6, 7, 8(dãy đã sắp xếp)
Trang 17III GI I QUY T BÀI TOÁN VÍ D Ả Ế Ụ
1 L a ch n ngôn ng l p trình ự ọ ữ ậ
Ngôn ngữ lập trình C++
2 Xác đ nh bài toán ị
INPUT: Dãy n số nguyên
OUTPUT: Dãy số đã được sắp xếp không giảm
3 Thu t toán SelectionSort ậ
void SelectionSort(int A[],int n){
int min;
for(int i=0;i<n-1;i++){
min=i;
for(int j=i+1;j<n;j++) if(A[min]>A[j]) min = j;
if(min !=i) Swap(A[i],A[min]);
}
IV CH ƯƠ NG TRÌNH.
#include <iostream>
#include <conio.h>
#define max 100
using namespace std;
//Nhap mang
void NhapMang(int A[],int n) {
for(int i=0; i<n; i++) {
Trang 18Đ tài th c t p c s Mã đ 025 ề ự ậ ơ ở ề
cin>>A[i];
}
}
//Xuat mang
void XuatMang(int A[],int n){
cout<<endl;
for(int i=0; i<n; i++)
cout<<A[i]<<"\t";
}
//Hoan vi 2 phan tu
void Swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
//Thuat toan Selection Sort
void SelectionSort(int A[],int n) {
int min;
for(int i=0; i<n -1; i++) {
for(int j=i+1; j<n; j++)
}
}
//Chuong trinh chinh
int main() {
Trang 19cout<<"(*)Nhap so phan tu:";
cin>>n;
NhapMang(A,n);
cout<<"\n(*)Mang vua nhap la:";
XuatMang(A,n);
cout<<endl;
SelectionSort (A,n);
cout<<"\n(*)Mang vua sap xep la:";
XuatMang(A,n);
getch();
return 0;
}
VI BỘ DỮ LIỆU TEST VÀ KẾT QUẢ TƯƠNG ỨNG.