1. Trang chủ
  2. » Công Nghệ Thông Tin

Niên luận Xây dựng cấu trúc dữ liệu số nguyên lớn

28 1K 6

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 28
Dung lượng 728 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

TRƯỜ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 2

Nhậ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 4

LỜ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 5

MỤ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 6

việ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 7

tậ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 8

2.2 Một số cú pháp của chương trình, chương trình con a) Các hàm :

Trang 9

là 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 10

Bướ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 11

StringBuilder 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 12

strnum2_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 16

Là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 18

strResult = 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 21

b ) Phép trừ

Trang 23

c) Phép nhân

Trang 25

d) Phép chia

Trang 26

CHƯƠ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.

Ngày đăng: 13/09/2015, 19:49

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w