You are on page 1of 6

Báo cáo thảo luận bài tập lớn

Học phần: kỹ thuật lập trình


Nhóm 1
Thành viên:

1 B19DCVT018 Trần Duy Anh


2 B19DCVT021 Vũ Thị Vân Anh
3 B19DCVT011 Lê Xuân Anh
4 B19DCVT025 Nguyễn Gia Bách
5 B19DCVT024 Đoàn Văn Bách
6 B19DCVT028 Giáp Thị Ngọc Bích
7 B19DCVT043 Ma Đình Chiến
8 B19DCVT050 Phạm Hữu Chuyển
9 B19DCVT033 Bùi Đức Cường
1
0 B19DCVT037 Nguyễn Mạnh Cường
1
1 B19DCVT038 Phạm Đình Cường
1
2 B19DCVT079 Lê Tiến Đạt
1
3 B19DCVT051 Vũ Văn Doanh
1
4 B19DCVT089 Lê Tuấn Đồng
1
5 B19DCVT096 Nguyễn Hồng Đức
1
6 B19DCVT098 Nguyễn Minh Đức
1
7 B19DCVT062 Vũ Văn Dũng
1
8 B19DCVT056 Nguyễn Xuân Dũng
Phần 1 đọc file
 Tạo một class để định nghĩa đối tượng số nguyên dương lớn theo như đề bài (VD:
big_int).
 Trong class có: biến thành viên là linked list dùng để chứa giá trị của số lớn đó và hai
hàm thành viên là cộng và nhân.
 Trong chương trình chính khai báo hai đối tượng thuộc class big_int (VD: num1;
num2).

 Sử dụng ifstream để đọc số các phép toán từ file sau đó thực hiện bằng vòng lặp để
tính toán.
 Đầu tiên trong một dòng đọc số đầu tiên và lưu vào num1, đến khi gặp một char
không phải là số thì lưu vào một biến để nhớ phép toán (VD: bool cal; cal = 0 thì
cộng, cal = 1 thì nhân), sau đó tiếp tục đọc cho đến hết dòng.

 Sau khi đã lưu hai số lớn vào num1 và num2, dựa vào kiểu phép toán lưu trong cal,
gọi hàm thành viên tương ứng để tính toán và dùng ofstream để ghi vào file.

Code minh họa:


class solon
{
private:
    int *so;
    int sopt;
    bool soam;
public:
    solon(){so=new int[100];soam=false;}
    void ChuyenSo(int mang[],char so[])
    {
        for(int i=0;i<strlen(so);i++)
            {
                char tam=so[strlen(so)-i-1];
                mang[i]=atoi(&tam);
            }
    }
    friend ostream & operator <<(ostream &out,solon &p);
    friend istream & operator >>(istream &cn,solon &p);
};

Phần 2: xử lý phép tính các số lơn


I.Cộng số nguyên lớn:

B1: chuẩn hóa hai xâu a, b để có độ dài bằng nhau, nếu xâu nào có độ dài ngắn hơn thì
thêm ‘0’ vào đầu xâu đó

B2: Duyệt từ cuối hai xâu về đầu

tạo xâu kết quả c = a, và biến nhớ = 0

tách từng phần tử của hai xâu chuyển sang kiểu số và tính tổng

tổng=( num1[i] + 48)+ (num2[i] +48) + nhớ

ta tính : nhớ= tổng /10

tổng = tổng %10

chuyển đổi giá trị tổng sang xâu kí tự rồi gán vào xâu kết quả

tổng= tổng-48

B3: Lưu ý cộng thêm giá trị nhớ lần cuối nếu nhớ khác ‘0’

Code minh họa:


solon operator+(solon p)
    {
        solon kq;
        if(p.sopt>sopt)
        {
            int m=p.sopt-sopt;
            for(int i=1;i<=m;i++)
            {
                so[sopt-1+i]=0;
            }
            sopt=p.sopt;
        }
        else
        {
            int m=sopt-p.sopt;
            for(int i=1;i<=m;i++)
            {
                p.so[p.sopt-1+i]=0;
            }
            p.sopt=sopt;
        }
        kq.sopt=sopt+1;
        int nho=0;
        for(int i=0;i<sopt;i++)
        {
            kq.so[i]=(so[i]+p.so[i]+nho)%10;
            nho=(so[i]+p.so[i]+nho)/10;
        }
        if(nho>0)
        {
            kq.so[sopt]=nho;
        }
        else
        {
            kq.sopt=sopt;
        }
        return kq;
    }

II.Trừ hai số nguyên lớn:

B1: Chuẩn hóa hai xâu để có độ dài bằng nhau, thêm kí tự ‘ 0’ vào đầu xâu nào có chiều dài
nhỏ hơn để có hai xâu (num1 và num2) có độ dài bằng nhau.

B2: Duyệt i chạy từ cuối hai xâu về đầu

 Tạo xâu kết quả c = a, khởi tạo biến nhớ ban đầu =0;
 Tách từng phần tử của xâu chuyển sang kiểu số và Tính hiệu:
hiệu = (num1[i]+48) –( num2[i] + 48 )- nhớ

Nếu hiệu < 0 thì {hiệu = hiệu + 10, mượn = 1}

Nếu hiệu > 0 thì mượn bằng 0

 Chuyển đổi giá trị hiệu tìm được sang xâu kí tự rồi gán vào kết quả
 Xử lý xâu kết quả nếu xâu có độ dài lớn hơn 1 mà phần tử đầu tiên của mảng xâu là
‘0’

III.Nhân  hai số nguyên lớn: 


 Duyệt từ cuối xâu a về đầu xâu
 Tách từng phần tử của xâu a nhân với xâu b
 Cộng liên tiếp các kết quả thu được ( trước khi cộng hai xâu thêm kí tự  ‘ 0 ‘ vào sau
xâu thứ 2)
 Xử lí các kí tự ‘ 0 ‘ trước xâu sau khi cộng
Code minh họa:
solon operator *(solon p)

    {
        solon kq;
        int bac=0;
        if(sopt<p.sopt)
        {
            solon x;
            x.sopt = sopt;
            for(int i=0;i<sopt;i++)
                x.so[i] = so[i];
            sopt = p.sopt;
            for(int i=0;i<sopt;i++)
                so[i] = p.so[i];
            p.sopt = x.sopt;
            for(int i=0;i<p.sopt;i++)
                p.so[i] = x.so[i];
        }
                bac=p.sopt;
                int x = sopt;
                solon *mang = new solon[bac];
                // Mang so lon se cong don vao sau cac phep nhan voi tung chu
so
                for(int i=0;i<bac;i++)
                {
                    mang[i].sopt = x+1;
                    for(int j=0;j<x+1;j++)//gán cho tat ca cac mang bang 0
                        mang[i].so[j]=0;
                    x++;
                }
                int l=0;                               //xac dinh lam voi mang
nao
                for(int j=0;j<p.sopt;j++)
                {
                    int nho=0,g=0;
                    for(int k=0;k<sopt;k++)
                    {
                        mang[l].so[g+l] = (so[k]*p.so[j]+nho)%10;
                        nho = (so[k]*p.so[j]+nho)/10;
                        g++;
                    }
                    //het vong for neu con nho thi them mot phan tu nua
                    if(nho!=0)
                    {
                        mang[l].so[g+l]= nho;
                    }
                    else
                    {
                        mang[l].sopt = g+l;
                    }
                    l++;
                }
               for(int i=0;i<bac;i++)
                {
                    int z= mang[bac-1].sopt - mang[i].sopt;
                    for(int j=1;j<=z;j++)
                    {
                        mang[i].so[mang[i].sopt-1+j]=0;
                    }
                    mang[i].sopt = mang[bac-1].sopt;
                }
                kq.sopt = mang[bac-1].sopt+1;
                int nhokq=0;
                //cong tat ca cac so trong mang
                for(int i=0;i<mang[bac-1].sopt;i++)
                {
                    int w=0;
                    for(int j=0;j<bac;j++)
                    {
                        w += mang[j].so[i];
                    }
                    kq.so[i] = (w+nhokq)%10;
                    nhokq = (w+nhokq)/10;
                }
                if(nhokq!=0)
                {
                    kq.so[mang[bac-1].sopt] = nhokq;
                }
                else
                    kq.sopt = mang[bac-1].sopt;
        return kq;
    }

IV.Chia số nguyên lớn:


 Lấy số kí tự của xâu a bằng số kí tự của xâu b lưu vào xâu chia
 Chừng nào số xâu chia còn lớn hơn xâu b thì tiến hành trừ liên tiếp xâu chia cho xâu
b, ghi lại số lần trừ có thể là thương tìm được
 Hạ từng kí tự của xâu a xuống xâu chia
 Hủy các kí tự ‘ 0 ‘ vô nghĩa của xâu a và xâu b

You might also like