Xây dựng chương trình xử lý số nguyên lớn
Trang 1PHẦN I: TỔNG QUANI.GIỚI THIỆU TỔNG QUAN:
Có thể nói trong thời đại ngày nay, với sự phát triển nhanh chóng của công nghệ
thông tin và một số lĩnh vực khác như :toán học, thiên văn học,…thì chúng ta phải đối mặt với việc phải tính toán những số liệu có thể lớn nhỏ khác nhau và đối với một số lĩnh vực số liệu nhỏ và ít thì ta có thể dung máy tính xách tay để tính toán Nhưng máy tính xách tay chỉ giúp chúng ta tính toán những con số có độ dài chừng vài số đến vài chục số,còn trên thực tế như lĩnh vực thiên văn học, hóa học,vật lí, nguyên tử…, thì những con sốcần được tính toán rất lớn và những số rất lớn như vậy được người ta đặt cho một tên gọi
chung là “Số Nguyên Lớn” Trong chương trình học của chúng ta thì chúng ta đã được
giới thiệu các kiểu khai báo như: kiểu INT và giá trị tối đa từ -32768 đến 32767 tương ứng với (2 byte), kiểu short thì giá trị tối đa từ -32768 đến 32767 tương ứng với (2 byte), kiểu LONG thì giá trị tối đa từ -2147483648 đến 214783647 tương ứng với (2 byte), kiểuUNSIGUED thì giá trị tối đa từ 0 (byte) đến 255 (byte), kiểu FLOAT thì chứa tối đa từ 1,2E-38 đến 3,4E+38 tương ứng với (4 byte), kiểu DOUBLE thì chứa tối đa từ 2,2E-308 đến 1,8E+308 tương ứng với (8 byte), LONG DOUBLE thì chứa tối đa 3,4E-4932 đến 1,8E+4932 tương ứng với (10 byte)…
Với tất cả các kiểu biến ở trên, thì ta có thể tính toán được những con số nhỏ, vừa, và tương đối lớn Còn đối với những con số cực lớn thì những kiêu khai báo trên không thể nào chứa nổi, vì vậy đòi hỏi chúng ta phải thiết kế một chương trình (giải thuật) để xử lý những con số đó
Số nguyên lớn là một lĩnh vực mặc dù con người quan tâm từ rất sớm, nhưng đến nay
để giải quyết trọn vẹn bài toán đó còn là một vấn đề đang được nghiên cứu Riêng em, hiện đang là một sinh viên năm 3, với lượng kiến thực còn hạn hẹp của mình,và giới hạn
về mặt thời gian của niên luận này và đây cũng là lần đầu tiên em nghiên cứu một đề tài
Trang 2có tính chất khoa học nên không tránh khỏi những sai sót Em xin chân thành biết ơn sự hướng dẫn hết lòng của giáo viên hướng dẫn.
Rất mong nhận được sự góp ý vô cùng quí báu của quí thầy cô, cùng toàn thể các bạn
để chương trình của em được hoàn thiện hơn
II MỤC TIÊU VÀ HƯỚNG GIẢI QUYẾT
1 MỤC TIÊU CẦN ĐẠT ĐƯỢC
a) Lý thuyết:
- Phải nắm vững và hiểu rỏ sử dụng thành thạo ngôn ngữ lập trình C Đặt biệt là kiểu con trỏ (danh sách lien kết đơn), khai báo khiểu cấu trúc, kiểu chuỗi… trong cơ sở dữ liệu
- Nắm rỏ cách thức tính cộng và trừ hai số nguyên
- Phải tìm ra thuật toán đơn giản nhất mà hiệu quả
b) Chương trình Demo:
- Trương trình phải dể sử dụng, cung cấp giao diên thân thiện với người dùng
- Cho phép tính toán một số nguyên lớn bất kì
- Kết quả tính toan luôn chính xác
2 HƯỚNG GIẢI QUYẾT
- Dữ liệu dược nhập vào từ bàn phím ( dữ liệu đầu vào la một chuổi số)
- Chuyển đổi chuổi vừa nhập thành từng số nguyên, cất từng số nguyên vào danhsách liên kết đơn
- Sử dụng những chương trình được cài đặc để xử lý
- Kết quả xuất ra là tổng và hiệu hai số nguyên lớn
Trang 3PHẦN II: ỨNG DỤNGI.CƠ SỞ LÝ THUYẾT:
Được sự hướng dẫn của giáo viên cùng với sự tìm tòi cùa bản thân thì em nhận thấy danh sách lien kết đơn phù hợp với yêu cầu của bài toán, vì trong danh sách liên kết đơn thì không giới hạn số phần tử không cần phải cấp phát ô nhớ trước dùng đến đâu thì cấp phát đến đó Vì vây chúng ta không gặp phải trường hợp bị tràn hay bị thừa bộ nhớ …
Trong quá trình thực hiện đề tài em có sử dụng một số hàm thư viện có sẵn trong cấu trúc dữ liệu Bên cạnh đó em cũng đã tự thiết kế nên một số chương trình con đễ đáp ứng và giải quyết vấn đề cộng và trừ hai số nguyên lớn
II CHƯƠNG TRÌNH CON MỘT SỐ HÀM TỰ ĐỊNH NGHĨA VÀ MỘT SỐ HÀM THƯ VIÊN
1 Cấu trúc dữ liệu mới:
Cài đặt cấu trúc node trong danh sách liên kết
typedef struct node
2 Các chương trình con tự định nghĩa và lưu đồ khối kèm theo:
a) Hàm đếm chiều dài của chuổi số nguyên:
- Đoạn code của hàm:
Trang 4- Lưu đồ khối của hàm:
b) Hàm đảo chuổi số nguyên:
- Đoạn code của hàm:
P!=end(l)
s=s+1 ; p=p->next
Endđúngsai
Trang 5- Lưu đồ khối của hàm:
c) Hàm hiệu chuổi a và b:
- Đoạn code của hàm:
void hieu(list l1,list l2,list *l4)
Trang 8sai
saisai
B
Trang 9đúngđúngsai
Trang 10if((retrieve(p,l1))==(retrieve(q,l2))) {
x= retrieve(p,l1)-(retrieve(q,l2)+t); insertlist(x,k,l3);
x= (m+retrieve(p,l1))-(retrieve(q,l2)+t);
Trang 12sai
sai
Trang 13retrieve(p,l1)>retrieve(q,l2)
Trang 15=end(l1)&
&
p=p->next ; t=0insertlist(x,k,l3)
sai
Trang 17q= first(l2);
k= first(*l3);
elementtype x,d,t=0;
while(p!=end(l1)&&q!=end(l2)) {
x= (retrieve(p,l1))+(retrieve(q,l2))+t; if(x<=9)
Trang 19saix= retrieve(p,l1)+retrieve(q,l2)+t
d = x-10
Trang 20sai
Trang 21d = x-10
B
đúng
đúngsai
Trang 22- Sử dụng các kiểu khai báo phù hợp vói yêu cầu của đề tài.
2)Phần chương trình nguồn:
- Sử dụng các hàm các thủ tục quen thuộc, câu lệnh đơn giản, ngắn gọn
- Chương trình dể đọc dể hiểu, chỉnh sửa dể dàng
3)Phần chương trình demo:
- Dể sử dụng.
- Giao diện thân thiện với người dùng.
- Kết quả luôn chính xác.
4)Bài học kinh nghiệm:
- Qua việc thực hiện niên luận này giúp em hiểu được nhiều hơn kĩ hơn về ngôn ngữ lập trình C.
- Biết dược nhiều vấn đề mới.
- Nâng cao khả năng tự học tìm tòi.
- Giúp em có thể giải quyết nhiều vấn đề khó trong thực tiễn bằng cách chuyễn đỗi những vấn đề đó thành chương trình và cuối cùng là nhờ khả năng xử lý của máy tính để giải quyết…
II.NHỮNG MẶT CÒN HẠN CHẾ:
- Vì đây là đề tài đầu tiên nên có những điểm giải quyết vấn đề chưa thật tối ưu
Trang 23- Vì thời gian hạn hẹp nên có những vấn đề em tìm hiểu chưa sâu và rộng nên sử
lý vấn đề chưa thật tối ưu
- Giải thuật có nhiều nơi còn hơi dài dòng quanh co
- Chưa áp dụng triệt để khả năng đồ họa trong C
- Trình bày chưa thật sự thuyết phục người đọc
III.ƯU ĐIỂM:
- Chương trình dể đọc dể hiểu, chỉnh sửa dể dàng.
- Không giới hạn chiều dài chuỗi số nguyên.
- Chương trình xử lý nhanh.
- Tốn it bộ nhớ.
- Tính toán chính xác.
IV.HƯỚNG PHÁT TRIÊN:
- Cải tiến giải thuật đến mức tối ưu nhất
- Áp dụng khả năng đồ họa trong C để chương trình nhìn bắt mắc hơn thân thiện với người sử dụng
- Phát triển giải thuật tổng hợp nhập 2 số nguyên và thực hiên phép toán cộng trừ nhân chia…
- Đọc số nguyên từ một tập tin bất kì