Niên luận Xây dựng cấu trúc dữ liệu số nguyên lớn, niên luận công nghệ thông tin, niên luận cntt, Xây dựng cấu trúc dữ liệu số nguyên lớn, Cấu trúc dữ liệu số, Niên luận Xây dựng cấu trúc dữ liệu số nguyên lớn, niên luận công nghệ thông tin, niên luận cntt, Xây dựng cấu trúc dữ liệu số nguyên lớn, Cấu trúc dữ liệu số
Trang 1TRƯỜNG ĐẠI HỌC TÂY ĐÔ
KHOA KỸ THUẬT CÔNG NGHỆ
GIẢNG VIÊN HƯỚNG DẪN:
VƯƠNG HUỲNH LONG
SINH VIÊN THỰC HIỆN:
Trần Gia Bảo MSSV: 13D480201019 LỚP: ĐẠI HỌC TIN HỌC 8
Trang 2Nhận xét của giảng viên hướng dẫn
Cần Thơ, ngày tháng năm
Giảng viên chấm
Trang 3ĐỀ TÀI: Xây dựng cấu trúc dữ liệu số nguyên lớn (Big-integer)
GIẢNG VIÊN HƯỚNG DẪN: GV VƯƠNG HUỲNH LONG
SINH VIÊN THỰC HIỆN: LÂM THÀNH ĐẠT
Tên đề tài, GVHD, SVTH, Nơi và năm thực hiện
Bố cục (0.5 điểm)
đánh giá điểm, Mục lục 3 cấp, Tài liệu tham khảo
II NỘI DUNG (Tối đa 4.5 điểm)
Giới thiệu (0.5 điểm)
III DEMO (Tối đa 3.5 điểm)
Giao diện (1 điểm)
Thao tác (2.5 điểm)
IV THƯỞNG (Tối đa 1.0 điểm)
Cần thơ, ngày tháng năm 2015
GIẢNG VIÊN CHẤM
VƯƠNG HUỲNH LONG
Trang 4LỜI CẢM ƠN
Đầu tiên tôi xin gửi lời cám ơn chân thành nhất đến Thầy Vương Huỳnh
Long người đã trực tiếp hướng dẫn, tận tình giải đáp những thắc mắc, giúp đỡ
tôi trong việc hình thành, phát triển và hoàn thành niên luận này.
Tôi cũng xin chân thành cảm ơn quý Thầy, Cô trường Đại học Tây Đô, những người đã người đã trực tiếp giảng dạy, truyền đạt những kiến thức bổ ích cho tôi, đó chính là những nền tảng cơ bản và là những hành trang kiến thức vô cúng quý giá Nhờ đó, tôi mới có thể hoàn thành tốt được bài niên luận này.
Trong quá trình làm niên luận không tránh khỏi những sai sót Kính mong nhận được sự góp ý và nhận xét từ quý Thầy, Cô cũng như các bạn để kiến thức của tôi ngày càng hoàn thiện hơn.
Xin chân thành cảm ơn!
Sinh viên thực hiện
Trần Gia Bảo
Trang 5MỤC LỤC
CHƯƠNG I : GIỚI THIỆU 5
1 Sơ lược về ngôn ngữ C# và BIG-INTEGER 5
1 1 Ngôn Ngữ C# 5
CHƯƠNG II : ỨNG DỤNG 7
2 Ứng dụng chương trình 7
2.1 Ý tưởng 7
2.2 Một số cú pháp của chương trình, chương trình con 8
2.3 Chương trình tính toán số nguyên cực lớn (BIG-INTEGER) 19
CHƯƠNG III : KẾT LUẬN 27
3 Kết luận 27
3.1 Kết quả đạt được 27
3.2 Hạn chế 27
3.3 Hướng phát triển 27
TÀI LIỆU THAM KHẢO 28
CHƯƠNG I : GIỚI THIỆU
1 Sơ lược về ngôn ngữ C# và BIG-INTEGER
1 1 Ngôn Ngữ C#
C# là một ngôn ngữ rất đơn giản, với khoảng 80 từ khoá, hơn mười kiểu dữ liệu dựng sẵn, nhưng C# có tính diễn đạt cao C# hỗ trợ lập trình có cấu trúc, hướng đối tượng, hướng thành phần.
Trọng tâm của ngôn ngữ hướng đối tượng là lớp Lớp định nghĩa kiểu dữ liệu mới, cho phép mở rộng ngôn ngữ theo hướng cần giải quyết C# có những từ khoá dành
Trang 6việc khai báo lớp, phương thức, thuộc tính mới C# hỗ trợ đầy đủ khái niệm trụ cột trong lập trình hướng đối tượng: đóng gói, thừa kế, đa hình.
Định nghĩa lớp trong C# không đòi hỏi tách rời tập tin tiêu đề với tập tin cài đặt như C++ Hơn thế, C# hỗ trợ kiểu sưu liệu mới, cho phép sưu liệu trực tiếp trong tập tin
mã nguồn Đến khi biên dịch sẽ tạo tập tin sưu liệu theo định dạng XML
C# được hỗ trợ khái niệm giao diện, interfaces Một lớp chỉ có thể kế thừa duy nhất một lớp cha nhưng có thể cài đặt nhiều giao diện.
C# có kiểu cấu trúc, struct không giống C++ Cấu trúc là kiểu hạng nhẹ và bị giới hạn Cấu trúc không thể thừa kế lớp hay được kế thừa nhưng có thê cài đặt giao diện.
C# cung cấp những đặc trưng lập trình hướng thành phần như property, sự kiện
và dẫn hướng khai báo Lập trình hướng component được hỗ trợ bởi CLR thông qua siêu
dữ liệu metadata Siêu dữ liệu mô tả các lớp bao gồm các phương thức và thuộc tính, thông tin bảo mật…
Assembly là một tập hợp các tập tin mà theo cách nhìn của lập trình viên là các thư viện liên kết động DLL hay tập tin EXE Trong NET một assembly là một đơn vị của việc tái sử dụng, xác định phiên bản, bảo mật và phân phối CLR cung cấp một số các lớp để thao tác với assembly.
C# cũng cho truy cập trực tiếp dùng con trỏ kiểu C++, nhưng vùng mã đó được xem như không an toàn CLR sẽ không thực thi việc thu dọn rác tự động các đối tượng được tham chiếu bởi con trỏ cho đến khi lập trình viên tự giải phóng.
1.2 Môi trường lập trình Microsoft Visual Studio:
Microsoft Visual Studio là một môi trường phát triển tích hợp (IDE) từ Microsoft
Nó được sử dụng để phát triển chương trình máy tính cho Microsoft Windows, cũng như các trang web, các ứng dụng web và các dịch vụ web Visual Studio sử dụng nền tảng phát triển phần mềm của Microsoft như Windows API, Windows Forms, Windows Presentation Foundation, Windows Store và Microsoft Silverlight Nó có thể sản xuất cả hai ngôn ngữ máy và mã số quản lý.
Visual Studio bao gồm một trình soạn thảo mã hỗ trợ IntelliSense cũng như cải tiến
mã nguồn Trình gỡ lỗi tích hợp hoạt động cả về trình gỡ lỗi mức độ mã nguồn và gỡ lỗi mức độ máy Công cụ tích hợp khác bao gồm một mẫu thiết kế các hình thức xây dựng giao diện ứng dụng, thiết kế web, thiết kế lớp và thiết kế giản đồ cơ sở dữ liệu Nó chấp nhận các plug-in nâng cao các chức năng ở hầu hết các cấp bao gồm thêm hỗ trợ cho các
hệ thống quản lý phiên bản (như Subversion) và bổ sung thêm bộ công cụ mới như biên
Trang 7tập và thiết kế trực quan cho các miền ngôn ngữ cụ thể hoặc bộ công cụ dành cho các khía cạnh khác trong quy trình phát triển phần mềm.
Visual Studio hỗ trợ nhiều ngôn ngữ lập trình khác nhau và cho phép trình biên tập
mã và gỡ lỗi để hỗ trợ (mức độ khác nhau) hầu như mọi ngôn ngữ lập trình Các ngôn ngữ tích hợp gồm có C,[1] C++ và C++/CLI (thông qua Visual C++), VB.NET (thông qua Visual Basic.NET), C thăng (thông qua Visual C#) và F thăng (như của Visual Studio 2010) Hỗ trợ cho các ngôn ngữ khác như J++/J thăng, Python và Ruby thông qua dịch vụ cài đặt riêng rẽ Nó cũng hỗ trợ XML/XSLT, HTML/XHTML, JavaScript và CSS Microsoft cung cấp phiên bản "Express" là phiên bản miễn phí của Visual Studio.
1.3 Khái niệm số nguyên lớn Big-Integer
Big-Integer là một cấu trúc cho một số nguyên cực lớn, thường thấy trong các ngôn ngữ lập trình hiện nay.
Chúng ta sử dụng nó khi muốn đại diện cho số nguyên lớn hơn giới hạn cho phép có Một ví dụ về đại diện cho số nguyên lớn để làm việc với mục đích mã hóa Trong khi các thuật toán mật mã thực có thể sử dụng một cái gì đó đặc biệt và hiệu quả hơn, sử dụng BigInteger để nhân số nguyên lớn với nhau là một cách tốt để hiển thị những gì xảy
ra một cách logic trong mã mật.
CHƯƠNG II : ỨNG DỤNG
2 Ứng dụng chương trình
2.1 Ý tưởng
Trong các ngôn ngữ lập trình, các kiểu số thường bị giới hạn ở một mức nào
đó Ví dụ như kiểu dữ liệu int của ngôn ngữ C++ thường giới hạn ở mức–2,147,483,648 đến 2,147,483,647 Tuy nhiên có những lúc ta cần phải thao tác với những số vượt quá giới hạn này Do đó ta cần phải có những phương pháp khác nhau để giải quyết vấn đề này Trước tiên biến dãi số thành dạng chuỗi (String) sau đó thực hiện tính toán và biến đổi các con số sao cho ra được kết quả đúng nhất.
Trang 82.2 Một số cú pháp của chương trình, chương trình con a) Các hàm :
Trang 9là 19) Nếu tổng c nhỏ hơn 10 thì thu được c và gán biến nhớ n = 0 Lưu giá trị c, nhét vào sau r Sau khi cộng đến cặp chữ số bên trái nhất, nếu nhớ còn là 1 thì thêm 1 vào sau r.
Trang 10Bước 3: Đảo ngược chuỗi r, ta có tổng.
//tách mỗi số thành hai phần nguyên và thập phân
string strnum1_p1 = strNum1.Substring(0, strNum1.IndexOf( '.' ));
string strnum1_p2 = strNum1.Substring(strNum1.IndexOf( '.' ) + 1); string strnum2_p1 = strNum2.Substring(0, strNum2.IndexOf( '.' ));
string strnum2_p2 = strNum2.Substring(strNum2.IndexOf( '.' ) + 1); bool flag = false ;
strNum2 = strnum2_p1 + strnum2_p2;
int [] arrNum1 = new int [strNum1.Length];
int [] arrNum2 = new int [strNum2.Length];
for ( int i = 0; i < strNum1.Length; i++)
//số mũ của 10 chính là số phần tử trong mảng int[]
int [] arrResult = new int [strNum1.Length + 1];
Trang 11StringBuilder strbd = new StringBuilder (arrResult.Length);
foreach ( int i arrResult)
//đưa dấu chấm vào kết quả ở vị trí x
if (flag == true && strNumBigger.Length == strResult.Length)
private void btnSub_Click(object sender, System.EventArgs e)
string strNum1 = txtNumber1.Text;
string strNum2 = txtNumber2.Text;
//tách mỗi số thành 2 phần nguyên và thập phân
string strnum1_p1 = strNum1.Substring(0, strNum1.IndexOf('.'));
string strnum1_p2 = strNum1.Substring(strNum1.IndexOf('.') + 1);
string strnum2_p1 = strNum2.Substring(0, strNum2.IndexOf('.'));
string strnum2_p2 = strNum2.Substring(strNum2.IndexOf('.') + 1);
//thêm số 0 vào phần trước và sau dấu chấm cho đủ
if (strnum1_p1.Length > strnum2_p1.Length)
Trang 12strnum2_p1 = strnum2_p1.PadLeft(strnum1_p1.Length, '0'); else if (strnum1_p1.Length < strnum2_p1.Length)
strnum1_p1 = strnum1_p1.PadLeft(strnum2_p1.Length, '0');
if (strnum1_p2.Length > strnum2_p2.Length)
strnum2_p2 = strnum2_p2.PadRight(strnum1_p2.Length, '0'); else if (strnum1_p2.Length < strnum2_p2.Length)
strnum1_p2 = strnum1_p2.PadRight(strnum2_p2.Length, '0'); // lấy về vị trí dấu chấm
int x = strnum1_p1.Length;
//ghép 2 phần thành 1 chuỗi (bỏ dấu chấm) à đưa vào mảng int[]
strNum1 = strnum1_p1 + strnum1_p2;
strNum2 = strnum2_p1 + strnum2_p2;
int[] arrNum1 = new int[strNum1.Length];
int[] arrNum2 = new int[strNum2.Length];
for (int i = 0; i < strNum1.Length; i++)
//đưa vào mảng int[]
int[] arrNumBig = new int[strNumBig.Length];
int[] arrNumSmall = new int[strNumSmall.Length];
for (int i = 0; i < strNumBig.Length; i++)
Trang 13//số mũ của 10 chính là chỉ số phần tử trong mảng int[]
int[] arrResult = new int[strNumBig.Length];
StringBuilder strbd = new StringBuilder(arrResult.Length);
foreach (int i in arrResult)
strbd.Append(i);
//đưa dấu chấm vào bằng Insert()
strbd.Insert(x, ".");
string strResult = strbd.ToString();
//nếu trước dấu chấm có > 1 số 0 thì chỉ để lại 1 số 0
string str1 = strResult.Substring(0, strResult.IndexOf('.'));
Trang 14//Đưa vào mảng int[]
int[] arrNumBig = new int[strNumBig.Length];
int[] arrNumSmall = new int[strNumSmall.Length];
for (int i = 0; i < strNumBig.Length; i++)
//chuyển số thập phần thành số nguyên và lấy về vị trí dấu chấm từ phải sang
string[] strTempN1 = myConvert(txtNumber1.Text).Split(new char[] { '~' }); string[] strTempN2 = myConvert(txtNumber2.Text).Split(new char[] { '~' }); int pos = Convert.ToInt32(strTempN1[1]) + Convert.ToInt32(strTempN2[1]); //Phép nhân hai số nguyên
string strNum1 = strTempN1[0];
string strNum2 = strTempN2[0];
//Đưa vào mảng int[]
int[] arrNum2 = new int[strNum2.Length];
for (int i = 0; i < strNum2.Length; i++)
arrstr[x] = Mul(strNum1, arrNum2[i]);
//thêm số 0 ở cuối chuỗi
arrstr[x] = arrstr[x].PadRight(arrstr[x].Length + x, '0');
x++;
}
Trang 15//cộng các số hạng nguyên bằng hàm addInt() với nhau
//đưa dấu chấm vào
strResult = strResult.Insert(strResult.Length - pos, ".");
Tiếp tục tính 124 chia cho 23 tìm thương và phần dư
Bước 1 Gán thương t=0; a=124; b=023
Bước 2 Nếu a nhỏ hơn b thì thương t và dư là a
Bước 3 Gán a=a-b và tăng t lên 1
Quay lại bước 2.
Trang 16Làm tương tự cho đến khi không còn chữ số nào để hạ xuống thì thương là dãy số bên trái (cắt bỏ 0 ở bên trái), số dư là dãy số bên phải.
string strNum1 = txtNumber1.Text;
string strNum2 = txtNumber2.Text;
// tách mỗi số thành hai phần nguyên và phần thập phân
string strnum1_p1 = strNum1.Substring(0, strNum1.IndexOf('.'));
string strnum1_p2 = strNum1.Substring(strNum1.IndexOf('.') + 1);
string strnum2_p1 = strNum2.Substring(0, strNum2.IndexOf('.'));
string strnum2_p2 = strNum2.Substring(strNum2.IndexOf('.') + 1);
// thêm số 0 vào sau dấu cho đủ
strNum1 = strnum1_p1 + strnum1_p2;
strNum2 = strnum2_p1 + strnum2_p2;
// Bỏ các số 0 nếu có
strNum1 = MyRemove(strNum1);
strNum2 = MyRemove(strNum2);
Trang 17// MessageBox.Show(strNum1 +"~"+ strNum2);
// Thực hiện phép chia 2 số nguyên
if (strNum1 == strNum2) {
txtResult.Text = "1"; }
else //Khi 2 số không bằng nhau {
string strResult = ""; //Nếu số bị chia (strNum1) lớn hơn if (NumBigger(strNum1, strNum2) == strNum1) {
string strtemp = strNum1.Substring(0, strNum2.Length); string strBookmark = strtemp; string phandu = ""; bool flag = true; while (phandu != "0" || strtemp != "00") {
//kết quả cố tối đa 80 chữ số (tính cả dấu chấm)
if (strResult.Length == 80) break; string[] arrKetqua = DivInt(strtemp, strNum2).Split( new char[] { '~' }); strResult += arrKetqua[0]; phandu = arrKetqua[1]; // MessageBox.Show("~"+arrKetqua[0]+"~"+arrKetqua[1]+"~"); if (strBookmark.Length < strNum1.Length) //vẫn còn số để hạ {
strBookmark = strNum1.Substring(0, strBookmark.Length + 1); //hạ số xuống để tiếp tục chia strtemp = phandu + strNum1.Substring(strBookmark.Length - 1, 1); if (strtemp.IndexOf('0') == 0) //Ex: 0.34/0.03 strtemp = strtemp.Substring(1); }
else if (strBookmark.Length == strNum1.Length) //hết số để hạ {
if (flag == true) {
strResult += "."; flag = false; }
//thêm 0 vào phần dư để tiếp tục chia strtemp = phandu + "0"; //nếu đã thêm 0 mà strtemp vẫn nhỏ hơn số bị chia if (NumBigger(strtemp, strNum2) == strNum2) {
// strResult += "0"; strtemp = phandu + "0"; }
}
}
}
//nếu số chia lớn hơn else if (NumBigger(strNum1, strNum2) == strNum2) {
Trang 18strResult = strResult.Substring(0, strResult.Length - 2);
// thực hiện tương tự phần trên ===============
string strtemp = strNum1.Substring(0, strNum2.Length);
string strBookmark = strtemp;
//nếu đã thêm 0 mà strtemp vẫn nhỏ hơn số bị chia
if (NumBigger(strtemp, strNum2) == strNum2)
Trang 19// txtResult.Text = "~"+strNum1 +"~"+ strNum2 +"~" + strResult;
}
}
}
2.3 Chương trình tính toán số nguyên cực lớn (BIG-INTEGER)
Đây là chương trình mô phỏng máy tính để tính toán các số nguyên cực lớn Chương trình có các chức năng cơ bản trong tính toán như cộng, trừ, nhân, chia, lấy lũy thừa, chia lấy dư.
Trang 21b ) Phép trừ
Trang 23c) Phép nhân
Trang 25d) Phép chia
Trang 26CHƯƠNG III : KẾT LUẬN
3 Kết luận
3.1 Kết quả đạt được
Sau khi làm xong niên luận tôi đã có thêm nhiều kinh nghiệm và kiến thức phục vụ việc học tập của tôi, không chỉ qua lý thuyết mà còn biết nhiều hơn về thực hành và các ứng dụng cơ bản của ngôn ngữ lập trình C# Nhờ thế tôi đã biết được các giải thuật cơ bản của máy tính, nâng cao khả năng lập trình căn bản của bản thân.
3.2 Hạn chế
- Cách sử dụng ngôn ngữ lập trình còn kém.
- Các cú pháp còn dài dòng, thô sơ.
- Chương trình Demo có thể nhiều lỗi.
3.3 Hướng phát triển
Từ kinh nghiệm rút ra sau khi làm xong niên luận và thu được từ các chương trình nhỏ bổ trợ cho kiến thực học tập và làm việc để trong tương lai có thể viết được một phần mềm hoàn chỉnh hơn, có ích hơn.