LOI NOI DAU
Khoa học công nghệ ngày nay đang ngày một phát triển, với những ứng dụng của khoa học công nghệ vào trong thực tiễn đã giúp cho đời sống con người được nâng lên một tầm cao mới
Trong đó sự phát triển mạnh mẽ nhất và cũng được ứng dụng nhiều
nhất vào đời sống của con người đó là khoa học vê máy tính Bao gồm cả các ứng dụng về phần cứng va phan mém
Với sự tìm tòi và nghiên cứu của các công ty phần mềm và các lập
trình viên trên thế giới Các ngôn ngữ lập trình mới xuất hiện liên tục, ngôn ngữ ra đời sau càng hỗ trợ nhiêu component hơn, giúp cho các lập trình viên
thiết kế các chương trình ứng dụng ngày càng đơn giản và thuận tiện
Tuy nhiên để nắm bắt được các ngôn ngữ lập trình mới một cách toàn điện và đây đủ đòi hỏi các lập trình viên phải có một căn bản lập trình tốt Điều đó có nghĩa là họ phải nghiên cứu và sử dụng thành thạo các ngôn ngữ hỗ trợ ít hơn (như C,C++)
Với mong muốn có một căn bản lập trình tốt để sau này có thể nghiên
cứu và tiếp thu nhanh các ngôn ngữ mới, em đã chọn ngôn ngữ C để thực hiện bài tập tốt nghiệp cuối khóa, với đề tài:
“ Viết chương trình nhân 2 số nguyên lớn ”
Đây là một đề tài rất hay, bởi đề tài đặt ra cho người thực hiện một khó khăn rất lớn là làm thế nào để lưu được kết quả của mỗi phép nhân Vì với các kiểu dữ liệu về số thông thường như int, long mt, float, .đều không
thể lưu được vì vượt quá giá trị có thể lưu của mỗi kiểu dữ liệu
Với sự giúp đỡ tận tình của thầy Dinh Tuan Long, cộng với sự tìm
tòi, học hỏi của bản thân em đã giải quyết được vẫn đề mà bài toán đặt ra bằng cách sử dụng mảng kí tự để giải quyết bài toán
Tuy nhiên do sự hạn chế về kiến thức lập trình và thời gian nghiên
cứu không sâu, nên có thể bài toán được giải quyết chưa triệt để Vì vậy
mong sự góp ý và chỉ bảo của các thầy, cô để em có thể có cách giải quyết
vẫn đề tốt hơn, đồng thời có thể hiểu sâu hơn về ngôn ngữ C
Trang 2Nội dung trình bày bài toán sẽ bao gồm 6 Chương:
- Chương 1 sẽ trình bày sơ bộ về những nét cơ bản, những tiện ích và
những hạn chê của ngôn ngữ C
- Chương 2 sẽ trình bày về việc tìm hiểu nội dung bài toán, những câu
hỏi cân được giải đáp, và sẽ giải đáp theo phương hướng nào
- _ Chương 3 sẽ trình bày một số giao diện sử dụng trong chương trình
- _ Chương 4 là những dòng mã lệnh thực hiện chương trình
Trang 3Chuong 1: Tim hiểu về ngôn ngữ C I LICH SU NGON NGU C
1 Giới thiệu về ngôn ngữ C
Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ đầu
thập niên 1970 bởi Ken Thompson và Dennis Ritchie để dùng trong hệ điều hành UNIX Từ đó, ngôn ngữ này đã lan rộng ra nhiều hệ điều hành khác và trở thành một những ngôn ngữ phô dụng nhật C là ngôn ngữ rất có hiệu quả và được ưa chuộng nhất để viết các phần mềm hệ thống, mặc dù nó cũng
được dùng cho việc viết các ứng dụng Ngoài ra, C cũng thường được dùng
làm phương tiện giảng dạy trong khoa học máy tính mặc dù ngôn ngữ này
không dược thiết kế dành cho người nhập môn Những phát triển ban đâu:
Phát triển khởi đầu của C xảy ra ở AT&T Bell Labs giữa 1969 và 1973; theo Ritchie thì thời gian sáng tạo nhât là vào năm 1972 Nó được đặt tên là C vì nhiêu đặc tính của nó rút ra từ một ngôn ngữ trước đó là B
Thêm vào đó, các điểm khác với ngôn ngữ nguyên thủy "B": Ken Thompson kê tới ngôn ngữ lập trình BCPL, nhưng ông ta cũng đã tạo ra ngôn ngữ là Bon đê vinh danh vợ mình
Có nhiêu truyên thuyêt vê nguôn gôc của C và hệ điêu hành liên quan tới nó là Unix bao gôm:
e Sự phát triển của C là kết quả của các lập trình viên đã muốn chơi Space Travel Ho da choi no trén mainframe cua hang làm việc, nhưng bị thiếu khả năng (chạy) và phải hỗ trợ khoảng 100 người
ding, Thompson va Ritchie tim thay rang họ đã không có đủ sự kiếm
soát tàu vũ trụ (của trò chơi) để tránh được các va chạm khỏi sự
chuyển dịch của các thiên thạch Do đó, họ quyết định để xuất trò chơi này sang một máy PDP-7 dé không trong văn phòng Nhưng nó lại không có hệ điều hành; do đó, họ viết một hệ điều hành Tiếp tục, họ quyết định để xuất hệ điều hành này sang PDP-11 cua văn phòng
Trang 4e Unix nguyén da dugc phat triển để tạo ra một hệ thống tự động lập hồ sơ cho các băng phát minh Phiên bản đầu tiên của Unix đã phát triển từ ngôn ngữ Assembly Sau đó, ngôn ngữ C đã được phát triển để từ đó thay thế hệ điều hành mới
Cho đến 1973, C đã trở nên đủ mạnh để dùng viết nhân cho Unix, thay vì trước nó chúng được viết bằng Assembly trong các máy PDP-I1/20 Đây là lần đầu tiên mà nhân của một hệ điều hành được lắp thành bằng một ngôn ngữ khác hơn Assembly
2 Những điểm mạnh và hạn chế của ngôn ngữ C
C là một ngôn ngữ lập trình tương đối nhỏ gọn vận hành gan voi phan
cứng và nó giống với ngôn ngữ Assembler hơn hầu hết các ngôn ngữ bậc cao Hơn thế, C đôi khi được đánh giá như là "có khả năng di động", cho
thấy sự khác nhau quan trọng giữa nó với ngôn ngữ bậc thấp như là Assembler, đó là việc mã C có thể được dịch và thi hành trong hầu hết các
máy tính, hơn hắn các ngôn ngữ hiện tại trong khi đó thì Assembler chỉ có thể chạy trong một số máy tính đặc biệt Vì lý do này C được xem là ngôn ngữ bậc trung
* Ưu điểm của ngôn ngữ C:
C đã được tạo ra với một mục tiêu là làm cho nó thuận tiện để viết các chương trình lớn với số lỗi ít hơn trong mẫu hình lập trình thủ tục mà lại
không đặt gánh nặng lên vai người viết ra trình dịch C, là những người bề
bộn với các đặc tả phức tạp của ngôn ngữ Cuối cùng C có thêm những chức năng sau:
e Một ngôn ngữ cốt lõi đơn giản, với các chức năng quan trọng chẳng hạn như là những hàm hay việc xử lý tập tin sẽ được cung câp bởi các
bộ thư viện các thủ tục
e Tập trung trên mẫu hình lập trình thủ tục, với các phương tiện lập trình theo kiêu câu trúc
e_ Một hệ thống kiểu đơn giản nhằm loại bỏ nhiều phép tốn khơng có ý nghĩa thực dụng
e Dùng ngôn ngữ tiền xử lý, tức là các câu lệnh tiền xử lý C, cho các
Trang 5e Mức thấp của ngôn ngữ cho phép dùng tới bộ nhớ máy tính qua việc xử dụng kiêu dữ liệu pointer
e Số lượng từ khóa rất nhỏ gọn
e_ Các tham số được đưa vào các hàm bằng giá trị, không băng địa chỉ
e Hàm các con trỏ cho phép hình thành một nền tảng ban đầu cho tính đóng và tính đa hình
e Hỗ trợ các bản ghi hay các kiểu dữ liệu kết hợp do người dùng từ khóa định nghĩa struct cho phớp các dữ liệu liên hệ nhau có thê được tập hợp lại và được điêu chỉnh như là toàn bộ
* Những điểm hạn chế của ngôn ngữ C:
Một số chức năng khác mà C không có (hay còn thiếu) nhưng có thé tim
thấy ở các ngôn ngữ khác bao gồm: e An toàn kiểu, e Tự động Thu dọn rac, e_ Các lớp hay các đối tượng cùng với các ứng xử của chúng, e Các hàm lồng nhau, e_ Lập trình tiêu bản hay Lập trình phố dụng,
e Qua tai va Qua tai toan tử,
e Cac hé tro cho da luéng, da nhiém va mang
Mặc dù C còn thiếu nhiều chức năng hữu ích nhưng lý do quan trọng để C
được chấp nhận vì nó cho phép các trình dịch mới được tạo ra một cách
nhanh chóng trên các nền tảng mới và vì nó cho phép người lập trỉnh dễ kiểm soát được những gì mà chưong trình (do họ viết) thực thi Day là điểm
thường làm cho mã C chạy hiệu quả hơn các ngôn ngữ khác Thường thì chỉ
có ngôn ngữ ASM chỉnh băng tay chạy nhanh hơn (ngôn ngữ C), bởi vì
ASM kiểm sốt được tồn bộ máy Mặc dù vậy, với sự phát triển các trình
dịch €, và với sự phức, tạp của các CPU hiện đại, C đã dần thu nhỏ khoảng cách khác biệt vê vận tôc này
Một lý do nữa cho việc C được xử dụng rộng rãi và hiệu quả là do các trình
địch, các thư viện và các phân rmmêm thông dịch của các ngôn ngữ bậc cao
Trang 6II NHUNG KIEN THUC SU DUNG TRONG CHUONG TRINH
I Su dung kiểu dữ liệu
Trong C sử dụng các kiểu đữ liệu:
- Ky tu (char) - §6 nguyén (int)
- §6 dau phay dong d6 chinh xac don (float) - §6 dau phay động chinh xac kép (double) a Kiéu char
Một giá tri kiéu char chiém m6t byte (8 bit) va biéu diễn được một ký tự thong qua bang ma ASCII Vi du: ky tu 0 <-> mi bang 048
Cé hai kiéu char la signed char va unsigned char Kiéu thir nhat biéu dién một số nguyên từ -128 đến 127, kiểu thứ hai có giá trị từ 0 đến 256
Kiểu Phạm vì biểu diễn Số kỷ tự Kích thước
[signed] char -128 -> 127 256 I byte
Unsigned char 0 -> 255 256 I byte
b Kiéu nguyén
Trong C cho phép str dung: sé nguyén (int), s6 nguyén dai (long) va số
nguyén khéng dau (unsigned) Kích cỡ và phạm vi biểu diễn :
Kiểu Phạm vi biểu diễn kích thước
Int -32768 232767 2 byte
Unsigned int 0 265535 2 byte
Long [int] -2147483648 D2147483647 4 byte
Unsigned long/int] 0 2 4294967295 4 byte
Các kiểu ký tự cũng được xem là một dạng của Kiểu nguyên
c Kiểu dấu phẩy động
Trong C cho phép sử dụng 3 loại giá trị dấu phây động là float, double và long double
Trang 7Kiéu Pham vi Chữ chữ số Kích thước
biểu diễn có nghĩa (byte) float 3.4E-38->3.4E+38 7-8 double 1.7E-308->1,.7E+308 15-16 8 long double 3.4K-4932->1.1E+4932 17-18 10 2 Sử dụng kiểu dữ liệu Mọi biến cần phải khai báo trước khi sử dụng Và được khai báo theo mâu sau: Type tên biên; Vi du: main()
{ int a,b,c; // Khai bao bién kiéu int og
long ad,bc,ac;// Khai bao bién kiéu long
unsigned au,bu,cu;// Khai bdo bién kiéu unsigned char ten,ho;// Khai bdo bién kiéu char
float x,y;// Khai bdo bién kiéu float
double xd,yd:// Khai bdo bién kiéu double
f
Vi trí khai báo: Các khai báo cần đặt ngay sau dẫu { đầu tiên của thân hàm và cần đứng trước mọi câu lệnh khác Chang hạn sau câu lệnh gán thì
không được khai bảo nữa Khởi đầu cho các biến:
Vi du:
int a,b = 20,c,d = 40;
Tức vừa khai báo vừa khởi đầu giá trị cho biến Trong trường hợp trên
biến b được gán cho giá trị bang 20, va bién d cting duge gan gia tri bang 40 Lay địa chỉ của biến: Mỗi biến được cấp phát một vùng nhớ gôm một
số byte liên tiếp Số hiệu của byte đầu chính là địa chỉ của biến Địa chỉ của biến chỉ dùng trong một số hàm như hàm scanf Để nhận địa chỉ của biến ta
dùng phép toán: & tên biến; 3 Sứ dung mang
Mảng là một tập hợp nhiêu phân tử có cùng một kiêu giả trị va có chung
Trang 8Có bao nhiêu kiểu đữ liệu cho biến thì cũng có bay nhiêu kiểu đữ liệu cho mảng
Máng bao gồm mảng một chiều và mảng nhiều chiều Ví dụ:
char ho[20],ten[20]; //khai bao mang mot chiéu kiéu char //méi mang gôm tôi đa 20 phan tử int matran[10][10];//Khai bdo mang hai chiéu kiéu int
//mang gom 10 hàng và 10 cột
Các phần tử của mảng được câp phát các khoảng nhớ liên tiếp nhau trong
bộ nhớ, đối với mảng hai chiều các phần tử mảng được sắp xếp theo hàng Chỉ số mảng: Một phân tử cụ thể của mảng được xác định nhờ các chỉ số
của nó Chỉ sô của mảng phải có giá trị int không được vượt quá kích thước của chiều tương ứng Số chỉ số phải bằng số chiều của mảng
Vi du:
int i=2,j=1;
afj+i-l] laaf[2];
Lay dia chi mang:
Có thê lây địa chỉ mảng một chiêu như: &a[I]; - Nhưng không cho phép lây địa chỉ mảng hai chiêu
4 Sứ dụng hàm a Ham printf
Ham printf c6 kha nang chuyén dạng, tạo khuôn và đưa gia tri các đối ra
màn hình Dạng tổng quát của hàm như sau: Int printf(const char *dk,[,danh sách các đối]);
- Với đối dk 1a bién con trỏ kiêu char chứa dia chỉ của chuỗi điều khiển
Chuối điêu khiển bao gôm ba loại ký tự: + Các ký tự điểu khiển:
lu Sang dòng mới
\f Sang trang moi \b Lui lai mot vi tri \t Dau tab
+ Các đặc tả chuyển dạng và tạo khuôn cho các đối tương ứng
+ Các ký tự không phải là đặc tả cũng không phải là ký tự điều khiển gọi là kỷ tự hiển thị (được đưa ra màn hình)
- Danh sách các đối:
Các đối cần được phân cách nhau bởi dấu phầy Đối có thể là một hằng, một
Trang 9dang va in ra theo cach cua dac ta tuong ung Khi ma mot dac ta khong tim
thấy đối tương ứng hoặc khi kiểu giá trị của đối tương ứng không tương
thích với ký tự chuyển dạng thì máy sẽ bị lẫn lộn và có thể đưa ra kết quả vô
nghĩa
- Gia tri cua ham printfQ:
Khi thành công, hàm cho biết số ký tự(kế cả ký tự điều khiến) được đưa ra Khi có lỗi, hàm có giá trị -I
b Ham scanf
Hàm scanf là hàm có nhiều chức năng tương tự như hàm printf nhưng theo chiều ngược lại Nó đọc thông tin từ thiết bị vào chuân(bàn phím), chuyển dịch chúng (thành số nguyên, thực, ) và lưu trữ vào bộ nhớ theo
các địa chỉ xác định Hàm có dạng:
int scanf(const char*dk,[,danh sach cac đối]);
- dk la bién con tré kiểu char chứa địa chỉ của chuỗi điều khiến
- danh sách các đối: Mỗi đối trong danh sách là một con trỏ chứa địa
chỉ của một vùng nhớ(địa chỉ, biến mảng, ) dùng để lưu một giá trị
đọc vào từ bàn phím Các đối cần được phân cách với nhau bởi dấu
phay
- Chuỗi điều khiển gồm các ký tự đặc tả chuyên dạng Mỗi đặc tả
chuyển đạng thường có một đối tương ứng
- Giá trị của hàm: Hàm cho một số nguyên bằng số giá trị nhận được
(lưu vào bộ nhớ)
Chú ý: Để việc nhập số liệu được chính xác ta nên làm theo các yêu cầu: + Số đối, số đặc tả và số trường vào phải bằng nhau
+ Giữa đối, đặc tả và trường vào cần có sự phù hợp c Ham getch Nhận một ký tự từ bộ đệm bàn phím, không cho hiện lên màn hình + Dạng hàm: int getch(void); + Công dụng: - Nếu có sẵn ký tự trong bộ đệm bàn phím, thì hàm nhận một ký tự trong đó
- Nếu bộ đệm rỗng, thì máy tạm dừng Khi gõ một ký tự thì hàm nhận
ngay được ký tự đó (Không cần bắm thêm Enter như trong các ham nhập từ stdin) Ký tự vừa gõ không được hiện lên màn hình
Trang 10d Ham gotoxy Cho phép đi chuyển con trỏ chuột đến vị trí bất kỳ trên màn hình
e Hàm cirscr Dùng đề xóa màn hình
2 9# dụng toán tử a Toán tu IF
Cho phép lựa chọn một trong hai nhánh tùy thuộc vào sự bằng không hay khác không của một biêu thức, nó có hai cách việt:
if(biếu thức) if(biéu thitc)
Khối lệnh I; Khối lệnh I;
else
Khối lệnh 2;
(Dang 1) (Dang 2)
- _ Biểu thức có thể nguyên hoặc thực * Sự hoạt động của toán tử if:
Trước tiên máy sẽ xác định giá trị của biểu thức Nếu thiểu thức đúng (có giá trị khác không) máy sẽ thực hiện khói lệnh I sau đó nhảy đến các lệnh viết sau khối lệnh 2 (hoặc thực hiện các lệnh tiếp theo ở Dạng 2) và sau đó thực hiện các lệnh viết sau đó
b Toán tit for
Cho ta một cách để tạo lên một chu trình * Biểu thức có dạng:
for(biéu thircl; biéu thirc 2; biéu thirc 3); Khối lệnh;
Trang 11- Xác định biểu thức 2
- Tùy thuộc vào tính đúng, sai của biểu thức 2, máy sẽ lựa chọn một trong hai nhánh
+ Nếu biểu thức 2 có giá trị 0 (sai), mãy sẽ ra khỏi for và
chuyến tới câu lệnh sau thân for
+ Nếu biểut thức 2 có giá trị khác 0 (đúng), máy sẽ thực hiện các câu lệnh trong thân for Khi gặp dấu ngoặc đóng } cuối cùng của thân
for hoặc gặp câu lệnh continue máy sẽ chuyên tới bước 4 (khởi đầu lại) - Tính biểu thức 3, sau đó quay trở lại bước 2 để bắt đầu một vòng mới của chu trình c Toan tw while Cũng giống như for, toán tử while dùng để xây dựng các chu trình; nó có dạng sau: while(biêu thức) Khối lệnh;
* Su hoat déng cua while:
- Xác định giá trị của biểu thức (viết sau while)
- Tùy thuộc vào tính đúng sai của biểu thức này, máy sẽ lựa chọn một
trong hai nhánh:
+ Nếu biểu thức có giá trị 0 (sai), máy sẽ ra khỏi chu trình và
chuyến tới câu lệnh sau thân while
+ Nếu biểu thức có giá trị khác 0 (đúng), máy sẽ thực hiện các
câu lệnh trong thân while Khi gặp dâu ngoặc nhọn đóng cuối cùng của thân while máy sẽ trở lại bước 1
đ Toán tử do whiÌe
Tương tự như toán tử for và while, nhưng khác với hai toán tử trên trong
chu trinh do while viéc kiểm tra điều kiện kết thúc đặt ở cuối chu trình Như
vậy thân chu trình bao giờ cũng được thực hiện it nhất một lần Toán tử do while có dạng:
do
khối lệnh;
while(biểu thức);
* Sự hoạt động của do while: Toán tử này thực hiện theo các bước sau - Thực hiện các câu lệnh trong than do while
- Khi gặp dẫu ngoặc nhọn cuối cùng của thân do while, máy sẽ xác
định giá trị của biểu thức sau từ khóa while
- Máy sẽ phân nhánh theo giá trị của biểu thức vừa nhận được
Trang 12+ Nếu biểu thức có gia tr] bang 0 (sai), may sé ra khoi chu trinh va chuyén téi cau lénh dung sau dau cham phẩy dat cudi toan tir do while
+ Nếu biéu thtrc c6 gid tri bang 1 (dung), may sé quay tro lai bước đầu, thực hiện biểu thức trong thân do while
Trang 13Chuong 2: Dat van dé va hwéng giải quyết bài toán
I TRINH BAY TONG QUAN VE CHUONG TRINH
Như đã trình bày ở Chương 1, thi viéc thuc hién bai toan khéng thé
thực hiện một cách thông thường như việc nhân hai s6 kiéu “int” hay kiéu “long”, mà để thực hiện nhân hai số nguyên lớn cỡ 20 chữ số ta phải dùng mảng để lưu trữ các phan tử nhập vào, cụ thể trong bài toán em sử dụng một
mảng kiêu “char”, từ đó mỗi phần tử nhập vào ta có thể coi như mỗi kí tự mà mỗi kí tự sẽ được lưu trữ vào mỗi phân tử trong mảng Số các phần tử nhập vào sẽ phụ thuộc vào độ lớn của mảng khai báo
Theo đề bài: “Nhân hai số nguyên lớn” với yêu cầu nhập vào hai số nguyên lớn (dưới 20 kí tự), và in ra tích hai số nguyên đó Mô tả phép nhân tay Theo sự góp ý của Thầy giáo hướng dẫn Em đã chia ra thành hai bài
toán nhỏ:
- _ Một là nhân một sô có 1 chữ số với một số nguyên lớn
- Hai la cong hai số nguyên lớn
Khi nhân một số với một số nguyên lớn, tương đương với việc lay số đó lần lượt nhân với từng thành phan trong số nguyên lớn: chẳng hạn, lẫy một
SỐ nhân với hàng đơn vị của của sô nguyên lớn, ta sẽ được hàng đơn vị của
số kết quả, cứ tiếp như vậy ta sẽ lần lượt nhân một số với hàng chục, hàng trăm và cuối cùng ta sẽ có kết quả của việc nhân một số với một số nguyên lớn
Như vậy ta sẽ có một số nhân lần lượt với từng phần tử trong một
mảng lưu trữ các số nguyên nhập vào, kết quả nhận được cũng sẽ lưu trữ vào
một mảng các chữ sô nguyên Được kết quả của việc nhân một số với một số nguyên lớn, cộng dồn các kết quả ta sẽ có được tích của hai số nguyên lớn
Việc cộng hai số nguyên lớn thực chất là việc cộng từng phần tử của hai mảng lưu trữ các số nguyên lại với nhau
Bài toán sử dụng hai hàm: Hàm nhan() va ham main() Ham nhan() sé làm nhiệm vụ nhân hai số nguyên lớn, còn hàm mainQ là hàm chính, để trình bày giao điện nhập, gọi hàm nhân và in ra kết quả phép tính
* Trong hàm nhan() sẽ phải thực hiện nhân một số với một số nguyên lớn, và sẽ có kết quả của phép nhân và phép cộng, vì vậy trong hàm sẽ phải sử dụng hai mảng để lưu trữ hai kết quả của phép nhân và phép cộng Đó là mang “int tg/]” dé luu trit két qua phép nhân và mang “int tong/7” dé luu trot két qua phép céng
Trong phép nhân và phép cộng, kết quả đều liên quan đến phép nhớ, nếu phép nhân với hàng đơn vị >=10 thì cần có một biến để lưu trữ giá trị nhớ
Trang 14cho lần nhân tiếp theo, tương tự phép cộng, nếu cộng hàng đơn vị được kết quả >=10 cũng cân một biến nhớ để lưu trữ giá trị nhớ cộng vào hàng chục
Vì vậy ở trong hàm nhan() phải sử dụng một biến nhớ chung là biễn “wo”
kiểu int
Và khi nhân hai số nguyên lớn ta sẽ thực hiện lấy từng số từ hàng đơn vị nhân với số kia và đến hàng chục, hàng trăm Vậy cần một biến dé quy
định phân tử mảng nào đem nhân là hàng đơn vị, hàng chục, tram Biến
“bac” kiểu int, sẽ quy định bậc của phần tử đem nhân
Cộng với một số các biến để sử dụng trong các vòng lặp như 1,J,ntg,nmax
* Trong hàm mainQ, vì đây là hàm chính dùng để cho phép nhập giá trị hai số nguyên và in ra kết quả phép nhân(ức gợi hàm nhan0) vì vậy trong
hàm sẽ phải sử dụng một số biến cục bộ cho phép hàm nhan() có thể sử dụng
được nó
- Hai biến mảng kiểu “char/7” dùng để lưu hai giá trị số nguyên nhập vào là son/j và sobn[], va hai mang kiểu “iz⁄/7” là “mang sl[] va mang
s2/T” dang dé tach và lưu trữ từng phân tử nhập vào
- Việc nhân hai SỐ nguyên bao gôm cả sô nguyên dương va số nguyên âm, vì vậy cần có biến để quy định dấu của số nhập vào, trong hàm sử dụng bién cuc bé 1a bién “dau” kiéu int
- Và một số các biến khác được sử dụng trong chương trình II SỬ DỤNG THUẬT TOÁN
1 Nhân một số với một số nguyên lớn
Giả sử ta lẫy một số nguyên a nhân với một số nguyên lớn
Sử dung mang “char son[]” để nhập số nguyên lớn, sau khi nhập từng phan tir mang son[ J sẽ được chuyển thành giá trị kiểu int và lưu vào trong
mot mang int s/// bang cách cộng thêm vao ma ASCII
Lúc này việc nhân sỐ nguyên a với số nguyên lớn là việc nhân một số với
từng phân tử trong mảng số nguyên s7/7
Ta sử dụng vòng lặp ƒo( duyệt từ đầu đến cuối mảng mảng s7/7 rồi lẫy
từng phần tử trong mảng nhân với a Nếu giá trị nhớ khác “0” thì sẽ được
Trang 15nhớ = tích / 10;//Chia lay phan nguyén
f
Ta sử dụng vòng lặp while để kiểm tra trong khi đến phần tử cuối cùng mà nhớ có giá trị khác “0” ta sử dụng phần tử mảng tiếp theo để lưu giá trị nhớ đó
while(nho)
{ tăng biên đêm níg lên 1; + ptu tgfit+1] = nho%10;
update lại biến nhớ;//nhớ = nhớ/10;
f
Kết quả của phép nhân sẽ bao gém tap hop cac phan tir nguyén luu trit trong mảng /ø/j
2 Cộng hai số nguyên lớn
Sau khi thực hiện phép nhân một số với một SỐ nguyên lớn ta được một mảng các phần tử như trên Vậy việc cộng hai số nguyên lớn được thực hiện trên việc cộng đồn từng phan tử mảng kết quả của phép nhân trên Chắng han cứ sau khi nhân được các phần tử hàng đơn vị ta thực hiện cộng
Trang 16nho = nho/10;
i
for(i=bdc,i<=ntg;i++)
{ tong[i] = tong/i] +tg/i] + nho; ;
nho = tong/ i]/10; tong/i] =tong/i]%10; i while(nho) { nights tong[ntg] = tong[ntg] + nho%10; nhớ = nho/10; i ỷ
Với hai thuật toán nhân một số với một số nguyên lớn và cộng hai số nguyên
lớn ta đã có thể hồn thành được bài tốn nhân hai số nguyên lớn Công việc còn lại chỉ là thực hiện phần giao diện in ra kết quả sao cho hợp lý, và dễ nhìn Kết hợp với việc xử lý một số lỗi mắc phải do sự hạn chế của ngôn ngữ gây ra để tạo nên một chương trình hoàn chỉnh
Ill XU LY CAC LOI NAY SINH
Việc khai báo nhập hai sô nguyên lớn là việc nhập hai xâu ký tự nên sẽ
nảy sinh một sô các lôi sau:
1 Lỗi nhập dữ liệu không đúng kiểu dữ liệu quy định:
- _ Vì khai báo mảng nhập là mảng kiểu xâu ký tự nên người nhập vẫn có
thé nhập được xâu ký tự, nếu người nhập xâu ký tự máy tính sẽ tự
động chuyển sang mã ASCII ứng với ký tự nhập đó, điều này sẽ làm sai lệch mục đích và kết quả thực hiện phép toán Vì vậy phải bắt lỗi
không cho phép người dùng nhập đữ liệu kiểu xâu ký tự
-_ Hoặc người dùng có thể nhập một số các ký tự khác ngoài ký tự kiểu
xâu và kiểu số, chang hạn như người dùng nhập các ký tự đặ biệt hoặc nhập khoảng trắng(dẫu cách - space), điều này cũng không hợp lệ và làm sai lệch kết quả phép toán
Trang 17Như vậy phải làm cho người dùng chỉ có thể nhập kiểu số, nhập dau âm đầu tiên, ngoài ra không thể nhập thêm bất cứ ký tự nào khác tránh sai
lệch kết quả chương trình
-> Phương án: Sử dụng hàm getch() dé bat từng ký tự nhập vào từ bàn phím, và kiểm tra trước khi cho phep nhập, nêu thỏa mãn điều kiện: dau âm đâu tiên hoặc chỉ có chữ số thì mới cho phép nhập
2 Lôi nhập quá số phần tử cho phép
Theo yêu cầu của đề bài, chỉ cho phép nhập tối đa 20 ký tự Nếu
người dùng nhập vào quá 20 phân tử thì sẽ bị tràn máng, dẫn đến kết quả sai lệch, không đúng với yêu cầu bài toán
-> Hướng giải quyết: sử dụng vòng lặp do while và kiểm tra điều kiện, việc nhập sẽ không có hiệu lực nếu nhập quá 20 phần tử
Trang 18Chương 3: Giao diện chương trình
1 Giao diện nhập hai số nguyên dương
Trang 192 Giao điện kết quả nhân hai số nguyên dương lớn
eG TÚ Nj 0 ee ee Cbg oh Be
Far SNe eT 5, Eel Teds Tak Takats ts katate ta kakata
So thu i: 1234567 o thu 2: 1234
Trang 203 Giao dién nhan hai sé nguyén am
CHUONG TRINH NHAP VA TINH HAI $0 NGUYEN LON
23 aXa1a1aXei
o thu 1: 1234567 o thu 2: 1234
Hu ta phep nhan tau!
Trang 214 Giao diện kêt quả nhân hai số nguyên âm
CHUONG TRINH NHAP VA TINH HAT 30 NGUYEM LON
rar ree rere T eet 5.5 eT Tee Eats Tar TT a}
o thu 1: 1234567 So thu 2: 1234
Mo ta phep nhan tayt Tich hai so la: 1234567 4738268 KIEN) 24069134 123456? 1523455678 o tiep tuc chuong trinh?¢C/K>ic So thu 1: -1234567 o thu 2: 1234
Trang 26if(dem==0) { dau2=1; } dem++; sobn|[1|=ch; printf("%oc",ch); s2[1|Esobn[1|-46; if(s2[0|==0) continue; I++; } len2=strlen(sobn); n2=1-1; if((ch—"-")&&(!dau2)) { if (dem==0) { dau2=-1; } dem++; printf("%c",ch); } }while(ch!=13);
printf("\n\nMo ta phep nhan tay!\n");
Trang 29Chuong 5: Tai liệu tham khảo
1 Kĩ thuật lập trình C/C++ co sở và nâng cao
Tac gia GS.TS PHAM VAN AT - Nha xuat bản thông kê
2 Giáo trình ngôn ngữ lập trình —- Khoa CNTH
Trang 30Chuong 6: Muc luc
0900801087.) o-o-4a314dỶ 1 Chương 1: Tim hiểu về ngôn ngữ C - - - - sec th HT ng ng ng neo 3 I80(058-00/€.9)816009 :.:.: ÔÔ 3 1 Giới thiệu VỀ ngôn Hgiữ C - - - - < tk sư E119 315 H111 0050 gen 3 2 Những điểm mạnh và hạn chế của ngôn NGI C, - 5- <cs sex ke seceeseeecke 4 II NHỮNG KIÊN THỨC SỬ DỤNG TRONG CHƯƠNG TRÌNH 6
1, Su dung Ki Ait VGU ceccecceccscccccccescsccsceccsccscsessessescesecasssescescsescescsacsscsescaecsecsceasace 6 2 Ste dung kiétu Ait Vig cecececesccssssssscscsssssscesscsscsescsscccssscseccassesecsescsacacacacscsecscseeaeaeas 7 3 7 2, 00 7 4 SỨ AUNG NAM, ersecsscsscssccccccccccceccesesessessensensnannaauanascececeeeeecesseseesessesscsnensnaacaaseaeasececs 8 5 Ste AUNG tOAN UU .eecccecccccccccccccceccecesensensenssnsnaacanccaeccececeeeceesesescesensusnsannaeseecaeceeceees 10
Chương 2: Đỹ/ vấn dé va hwéng gidi quyét Bai (OGM cece ccescseecssssssessssssscesseseeceees 13 I TRINH BAY TONG QUAN VE CHUONG TRÌNH 5 s6 8s š 13 II SU DUNG THUAT TOAN ccsccssessessessesssesecssessesscssecsecsecsecsecsecsseseesecsssesnesneanes 14 1 Nhân một số với M6t SỐ HMHVÊH ÏỚIH G-G- << k3 về v21 gi 14 2 Cộng hai số HgWJÊH ÏỚP - - - St KEkvv ch cv 1H gvgư cv ưeo 15 TIT XU LY CAC LOI NẢY SINH - 5-5 55Sx2x2xEvExEExEEkEEkrkrkrkerrree 16 1 Lỗi nhập dữ liệu không đúng kiểu đữ liệu quy định: - 5s cscseseeksees 16 2 Léi nhdp qua s6 phan tie ChO Phép.iscccccccccccsscsssssssvesccscssscscsssssovscscscscscassessssesssees 17 Chương 3: Giao diện chương rÌHhÌ c0 HH 00 80016 50 18 1 Giao điện nhập hai số HguyÊH đÌƠïHĐ, <5 < St ke 5 re crke 18 2 Giao điện kết quả nhân hai số nguyên dương ÏỚH -G- - set ke ve csed 19 3 Giao diện nhân hai 86 NQUVEN ÂẪHM Sex HE TK 5191161 nhu ng, 19 3 Giao điện nhân hai SỐ HIBMVÊH ÂỀTH - G- SG << SE vn vung gen geọ 20 4 Giao diện kết quả nhân hai số HgtÊH ÂÌHM - 5 Set ve, 21 Chivong 4: MG Wgudn ccccccccscsssssscssssscsssssssscscscsescscsescsesscscssscacsssesenscscseacacacseserevesaees 22 Chivong $5: Tai iG that 1 nốốốe 29