SLIDE1

Sunday, May 31, 2015

[C/C++] lập trình giải mã mật thư Cesar

Cho một đoạn mật thư đã được mã hóa thành những chuỗi kí tự 0,1 với mỗi 5 kí tự số sẽ tương ứng với một kí tự trong bảng chữ cái alphabel. Thứ tự bảng mã sẽ giống với bảng chữ cái alphabel (Ví dụ a=00001 thì z=11010,a=01001 thì z=00001). Độ dịch của bảng sẽ là một số ngẫu nhiên từ 1 đến 100, bạn phải tìm ra để có được bảng mã đúng
Ví dụ: với a=00001
01111011001100101101100000100100001 0100110100 sẽ được giải mã là “olympia it”

000110000110101 011000000100011 0001001111 000111000010100sẽ được giải mã là “cau lac bo cpt”
Input: file1.inp
Đoạn mật thư tối đa 100000 kí tự
Output: file1.out

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
char dich(string s,int i)
{
    if(s=="00000") return 97-i;
    if(s=="00001") return 98-i;
    if(s=="00010") return 99-i;
    if(s=="00011") return 100-i;
    if(s=="00100") return 101-i;
    if(s=="00101") return 102-i;
    if(s=="00110") return 103-i;
    if(s=="00111") return 104-i;
    if(s=="01000") return 105-i;
    if(s=="01001") return 106-i;
    if(s=="01010") return 107-i;
    if(s=="01011") return 108-i;
    if(s=="01100") return 109-i;
    if(s=="01101") return 110-i;
    if(s=="01110") return 111-i;
    if(s=="01111") return 112-i;
    if(s=="10000") return 113-i;
    if(s=="10001") return 114-i;
    if(s=="10010") return 115-i;
    if(s=="10011") return 116-i;
    if(s=="10100") return 117-i;
    if(s=="10101") return 118-i;
    if(s=="10110") return 119-i;
    if(s=="10111") return 120-i;
    if(s=="11000") return 121-i;
    if(s=="11001") return 122-i;
    if(s=="11010") return 123-i;
    if(s=="11011") return 124-i;
    if(s=="11100") return 125-i;
    if(s=="11101") return 126-i;
    if(s=="11110") return 127-i;
    if(s=="11111") return 128-i;
    return 48;
}
void main()
{
    fstream t("file1.inp",ios::in);
    fstream f("file1.out",ios::out);
    string s,c;
    char a;
    int i,j;
    for(int k=1;k<100;k++)
    {
        while(!t.eof())
        {
            getline(t,s);
            i=0;
            while(i<s.size())
            {
                c=s.substr(i,5);
                i+=5;
                a=dich(c,k);
                f<<a;
                if(s[i]==' ')
                {
                    i++;
                    f<<" ";
                }
            }
            f<<endl;
        }
        f<<endl;
        t.clear();
        t.seekg(0,ios::beg);
    }
    t.close();
    system("pause");
}

Friday, May 29, 2015

[opp c++] nhập xuất điểm trong tọa độ oxy

lâp trình oop c++ định nghĩa và nhập xuất điểm trong tọa độ oxy , định nghĩa lớp điểm theo hướng đối tượng c++.nhập xuất nạp chồng toán tử

Wednesday, May 27, 2015

trắc nghiệm office 2010 có đáp án

Câu 1:Trong các phần mềm sau, phần mềm nào là phần mềm ứng dụng?
A. Windows XP
B. Microsoft Word
C. Linux
D. Unix
Câu 2: Trên hệ điều hành Windows, để chuyển đổi cửa sổ chương trình cần làm việc ta:
A. Nháy chọn biểu tượng chương trình tương ứng trên thanh công việc (Taskbar).
B. Nhấn giữ phím Alt và gõ phím Tab cho đến khi chọn được cửa sổ chương trình.
C. Nháy vào một vị trí bất kỳ trên cửa sổ chương trình muốn kích hoạt.
D. Các ý trên đều đúng.

Tuesday, May 26, 2015

các vị trí nghề nghiệp thuộc ngành CNTT hiện nay

Liệt kê các vị trí nghề nghiệp thuộc ngành CNTT hiện nay
1.     Nhân viên thiết kế đồ họa website
- Design giao diện layout website, banner, logo website cho khách hàng
- Đưa ra sản phẩm sáng tạo dựa trên ý tưởng của khách hàng
- Có kinh nghiệm về thiết kế đồ họa và thiết kế web.
- Thành thạo các phần mềm thiết kế web cơ bản như: Photoshop, CorelDraw hoặc Illustrator, Flash…và có khả năng sử dụng các phần mềm hỗ trợ
- Đọc hiểu tài liệu tiếng Anh tốt là một lợi thế.
- Sáng tạo, hoạt bát.
- Biết lập trình action script là một lợi thế; html + css, đã có kinh nghiệm design các trang CMS, ecommerce dựa trên các hệ thống như wordpress, joomla, codeigniter.. là 1 lợi thế
_ Tốt nghiệp đại học hoặc cao đẳng trở lên chuyên ngành mỹ thuật/thiết kế đồ họa CNTT
_ Có ít nhất 1 năm kinh nghiệm trong lĩnh vực thiết kế mỹ thuật/đồ họa website

ứng dụng CNTT trong quản lý bán hàng

I.                  Ứng dụng CNTT trong quản lý bán hàng
quản lý bán hàng bằng phần mềm là một hệ thống được sử dụng để giảm chi phí hoạt động đồng thời thúc đẩy hoạt động kinh doanh. Phần mềm này có thể được sử dụng cho các quá trình khác nhau bao gồm giao nhiệm vụ cho nhân viên, quản lý luồng công việc, và theo dõi tiến độ công việc. Phần mềm sẽ cho phép các tổ chức kinh doanh tập trung vào năng lực cốt lõi và lợi thế chiến lược, ngoài ra nó còn giúp sắp xếp các mục tiêu kinh doanh của công ty với các chương trình khuyến mãi và bán hàng.

thống kê 10 ứng dụng CNTT được thực tiễn hóa

thống kê 10 ứng dụng CNTT được thực tiễn hóa, tin học hóa trong đời sống hiện nay, mô tả tóm tắt ứng dụng

1.     Phần mềm quản lý phòng net Gcafe


GCafe Plus – Internet Cafe là phần mềm hỗ trợ công tác quản lý tại các điểm truy cập Internet công cộng, đáp ứng nghị định 72 của chính phủ về việc quản lý các điểm truy cập Internet. GCafe Plus là phần mềm hỗ trợ quản lý mọi mặt tại các điểm truy cập Internet công cộng. Từ việc quản lý tự động thời gian truy cập, tính tiền sử dụng của các máy trạm trong đó bao gồm tiền truy cập Internet và tiền sử dụng các dịch vụ kèm theo ví dụ: Nước uống, kẹo bánh, … Phương thức tính tiền truy cập Internet với bảng giá động theo từng ngày trong tuần, theo thời gian truy cập, quản lý sử dụng thẻ hội viên, quản lý và cân đối các thu chi hàng ngày, các báo cáo tài chính thông dụng, đến việc cung cấp các khả năng theo dõi, điều khiển, bảo vệ toàn bộ các máy tính trạm… Với giao diện trực quan, thân thiện hoàn toàn bằng tiếng Việt.

2.     Phần mềm thi bằng lái xe máy


ứng dụng CNTT trong quản lý bệnh viện

Do tính phức tạp và đa dạng của các chuyên ngành y khoa, do tính đa dạng của mô hình và quản lý bệnh viện cho nên việc thiết kế một bộ phần mềm quản lý bệnh viện tổng thể dùng chung cho các bệnh viện là cực kỳ khó khăn, phức tạp. Các quốc gia giàu có như Mỹ, Anh Quốc, Canada, Úc... đã đầu tư nhiều tiền để trang bị một hệ thống y tế điện tử quốc gia dùng chung cho các bệnh viện nhưng cho đến thời điểm cuối năm 2011 vẫn chưa có quốc gia nào đạt đến trình độ này. Các bệnh viện chỉ ứng dụng đến mức quản lý thông tin bệnh nhân trong phạm vi bệnh viện. Đa phần các tính năng quản lý còn rời rạc, chưa kết nối thành 1 hệ thống hoàn chỉnh.
Hiện nay tại Việt Nam đã có phần mềm đầy đủ tính năng quản lý liên hoàn trên cùng một hệ thống. Các chức năng của phần mềm được phân thành các phân hệ dành cho từng đối tượng riêng. Dưới đây là liệt kê và tóm tắt chức năng chính của hệ thống phần mềm quản lý bệnh nhân.

thống kê 10 website thương mại điện tử có tiếng

1.     Vatgia.com

Kinh doanh đa dạng hàng hóa sản phẩm: điện thoại, máy tính, máy ảnh, linh phụ kiện máy tính, điện thoại, các mặt hàng thời trang, ô tô, xe máy, xe đạp,...
Chấp nhận thanh toán qua thẻ Visa, mastercard, hổ trợ thanh toán qua ví điện tử Baokim.vn, qua đó có thể thanh toán qua các tài khoản ngân hàng thông dụng ở việt nam như Vietcombank, donga bank, ACB, vietin bank,Hdbank, vpbank,..

đề xuất mô hình kinh doanh trực tuyến hay

I.                   ĐỀ XUẤT MÔ HÌNH KINH DOANH TRỰC TUYẾN

*TÊN MÔ HÌNH ĐƯỢC ĐỀ XUẤT: “Mô hình đặt phòng khách sạn online cho tất cả các khách sạn ở thành phố Hồ Chí Minh.” tác giả: Trương Trung Việt

mô hình kinh doanh trực tuyến của Amazon

A.                 MÔ HÌNH KINH DOANH TRỰC TUYẾN CỦA AMAZON

1.                  Giới thiệu sơ lược về Amazon


mô hình kinh doanh trực tuyến của Kay

A.                 MÔ HÌNH KINH DOANH TRỰC TUYẾN CỦA KAY

1.                  Giới thiệu sơ lược về Kay



Ø  Được biết đến như là một trang thương mại điện tử cao cấp, Kay cung cấp các sán phẩm chất lượng vào thị trường Việt Nam nhầm đáp ứng nhu cầu cao của khách hàng và các sản phẩm độc đáo chỉ có duy nhất tại Kay. Kay được sinh ra nhờ sự kết hợp giữa kiến thức và chuyên môn từ 2 "người anh em" đáng tin khác của nó là DiaDiem.com và YuMe.vn.
Ø  Kay tập trung kinh doanh ở 3 mảng chính: dịch vụ (spa, nha khoa, ăn uống,...), du lịch và mua sắm (thời trang, hàng công nghệ).  Để trở thành một địa chỉ mua sắm trực tuyến đáng tin cậy, KAY.vn đặc biệt chú trọng chất lượng sản phẩm và dịch vụ được bán ra, đảm bảo quy trình trong việc kiểm tra chất lượng nhà cung cấp cũng như các đối tác khác.  

mô hình kinh doanh của hotdeal

A.                 MÔ HÌNH KINH DOANH TRỰC TUYẾN CỦA HOTDEAL

1.                  Giới thiệu lược về hotdeal



Ø  Hotdeal.vn là <a href="website hàng đầu v cung cp các phiếu giảm giá nhà hàng, ăn ung, spa làm đẹp, du lịch và các sản phẩm thời trang, gia dng.

cấu trúc cây nhị phân tìm kiếm và các thao tác trên cây

cấu trúc cây nhị phân tìm kiếm và các thao tác trên cây. định nghĩa, và các thao tháo cần thiết phải có khi cài đặt 1 cay nhị phân tìm kiếm

Ðịnh nghĩa cây nhị phân tìm kiếm


Cây nhị phân
Bảo đảm nguyên tắc bố trí khoá tại mỗi nút:
Các nút trong cây trái nhỏ hơn nút hiện hành
Các nút trong cây phải lớn hơn nút hiện hành


Ưu điểm của cây nhị phân tìm kiếm


Nhờ trật tự bố trí khóa trên cây :
Định hướng được khi tìm kiếm
Cây gồm N phần tử :
Trường hợp tốt nhất h = log2N
Trường hợp xấu nhất h = Ln
Tình huống xảy ra trường hợp xấu nhất ?


Cấu trúc dữ liệu của cây nhị phân tìm kiếm


Cấu trúc dữ liệu của 1 nút
    typedef struct tagTNode
    {  
        int Key; //trường dữ liệu là 1 số nguyên
        struct tagTNode *pLeft;
        struct tagTNode *pRight;
    }TNode;
Cấu trúc dữ liệu của cây
    typedef TNode *TREE;

Các thao tác trên cây nhị phân tìm kiếm



Tạo 1 cây rỗng
Tạo 1 nút có trường Key bằng x
Thêm 1 nút vào cây nhị phân tìm kiếm
Xoá 1 nút có Key bằng x trên cây
Tìm 1 nút có khoá bằng x trên cây


Tạo cây rỗng


Cây rỗng -> địa chỉ nút gốc bằng NULL
    void CreateTree(TREE &T)
    {
        T=NULL;
    }

Tạo 1 nút có Key bằng x


TNode *CreateTNode(int x)
{
        TNode *p;
        p = new TNode; //cấp phát vùng nhớ động
        if(p==NULL)
            exit(1); // thoát
        else
        {
            p->key = x; //gán trường dữ liệu của nút = x
            p->pLeft = NULL;
            p->pRight = NULL;
        }
        return p;
}


Thêm một nút x


Rằng buộc: Sau khi thêm cây đảm bảo là cây nhị phân tìm kiếm.
int insertNode(TREE &T, Data X)
{   if(T)
    {   if(T->Key == X) return 0;
        if(T->Key > X) return insertNode(T->pLeft, X);
        else    return insertNode(T->pRight, X);}
        T   = new TNode;
        if(T == NULL)   return -1;
        T->Key  = X;
        T->pLeft =T->pRight = NULL;
    return 1;
}

Tìm nút có khoá bằng x (không dùng đệ quy)


TNode * searchNode(TREE Root,  Data x)
{       Node *p = Root;
        while (p != NULL)
        {   if(x == p->Key) return p;
            else  
            if(x < p->Key)  p = p->pLeft;
            else    p = p->pRight;
        }
        return NULL;
}

Tìm nút có khoá bằng x (dùng đệ quy)


TNode *SearchTNode(TREE T, int x)
{
    if(T!=NULL)
    {
        if(T->key==x)
            return T;
        else
            if(x>T->key)
                return SearchTNode(T->pRight,x);
            else
                return SearchTNode(T->pLeft,x);
    }
    return NULL;
}

Hủy 1 nút có khoá bằng X trên cây


Hủy 1 phần tử trên cây phải đảm bảo điều kiện ràng buộc của Cây nhị phân tìm kiếm
Có 3 trường hợp khi hủy 1 nút trên cây
TH1: X là nút lá
TH2: X chỉ có 1 cây con (cây con trái hoặc cây con phải)
TH3: X có đầy đủ 2 cây con
TH1: Ta xoá nút lá mà không ành hưởng đến các nút khác ttrên cây
TH2: Trước khi xoá x ta móc nối cha của X với con duy nhất cùa X.
TH3: Ta dùng cách xoá gián tiếp

Hủy 1 nút có 2 cây con


Ta dùng cách hủy gián tiếp, do X có 2 cây con
Thay vì hủy X ta tìm phần tử thế mạng Y. Nút Y có tối đa 1 cây con.
Thông tin lưu tại nút Y sẽ được chuyển lên lưu tại X.
Ta tiến hành xoá hủy nút Y (xoá Y giống 2 trường hợp đầu)
Cách tìm nút thế mạng Y cho X: Có 2 cách
 C1: Nút Y là nút có khoá nhỏ nhất (trái nhất) bên cây con phải X
C2: Nút Y là nút có khoá lớn nhất (phải nhất) bên cây con trái của X

Cài đặt thao tác xoá nút có trường Key = x


void DeleteNodeX1(TREE &T,int x)
{
    if(T!=NULL)
    {
        if(T->Key<x)    DeleteNodeX1(T->Right,x);
        else
        {
            if(T->Key>x)    DeleteNodeX1(T->Left,x);
            else  //tim thấy  Node có trường dữ liệu = x
            {   TNode *p;  
                p=T;
                if (T->Left==NULL)  T = T->Right;
                else
                {   if(T->Right==NULL)  T=T->Left;
                    else    ThayThe1(p, T->Right);// tìm bên cây con phải
                }
                delete p;
            }
        }
    }
    else    printf("Khong tim thay phan can xoa tu");
}

Hàm tìm phần tử thế mạng 


void ThayThe1(TREE &p, TREE &T)
{    if(T->Left!=NULL)
        ThayThe1(p,T->Left);
else
     {
        p->Key = T->Key;
        p=T;
        T=T->Right;
    }
}

cấu trúc cây trong lập trình c/c++

cấu trúc cây trong lập trình c/c++, cấu trúc cây rất quan trọng trong lập trình quản lý dữ liệu


Định Nghĩa Cây


Cây là một tập hợp T các phần tử (gọi là nút của cây), trong đó có một nút đặc biệt gọi là nút gốc, các nút còn lại được chia thành những tập rời nhau T1, T2, …,Tn theo quan hệ phân cấp, trong đó Ti cũng là 1 cây. Mỗi nút ở cấp i sẽ quản lý một số nút ở cấp i+1. Quan hệ này người ta gọi là quan hệ cha – con.

Một Số Khái Niệm


Bậc của một nút: là số cây con của nút đó .
Bậc của một cây: là bậc lớn nhất của các nút trong cây 
Nút gốc: là nút không có nút cha.
Nút lá: là nút có bậc bằng 0 .
Mức của một nút:
Mức (gốc (T) ) = 0.
Gọi T1, T2, T3, ... , Tn là các cây con của T0 : Mức (T1) = Mức (T2) = . . .  = Mức (Tn) = Mức (T0) + 1.
Độ dài đường đi từ gốc đến nút x: là số nhánh cần đi qua kể từ gốc đến x.

Một Số Tính Chất Của Cây Nhị Phân


Số nút nằm ở mức i  2i.
Số nút lá  2h-1, với h là chiều cao của cây.
Chiều cao của cây h  log2(N)
N = số nút trong cây
Số nút trong cây  2h-1.

Cấu Trúc Dữ Liệu Của Cây Nhị Phân


typedef struct tagTNode
{
Data Key; 
struct tagTNode *pLeft; struct tagTNode *pRight; 
}TNode;

typedef TNode *TREE;


Duyệt Cây Nhị Phân 


 Có 3 trình tự thăm gốc :
 Duyệt trước
 Duyệt giữa
 Duyệt sau
  Độ phức tạp O (log2(h))
    Trong đó h là chiều cao cây

Duyệt Trước 


void NLR(TREE Root)
{
if (Root != NULL)
{
<Xử lý Root>; //Xử lý tương ứng theo nhu cầu NLR(Root->pLeft);
NLR(Root->pRight);
}
}

Duyệt Giữa

void LNR(TREE Root)
{
if (Root != NULL)
{
LNR(Root->pLeft);
<Xử lý Root>; // Xử lý tương ứng theo nhu cầu 
LNR(Root->pRight);
}
}

Duyệt Sau

void LRN(TREE Root)
{
if (Root != NULL)
{
LRN(Root->pLeft);
LRN(Root->pRight);
<Xử lý Root>; // Xử lý tương ứng theo nhu cầu 
}
}

con trỏ và cấu trúc dữ liệu động

vấn đề về con trỏ và cấu trúc dữ liệu động trong lập trình c/c++. biến tĩnh, biến động, khai báo vùng nhớ,..

Biến Tĩnh


Được khai báo tường minh, có tên gọi
Tồn tại trong phạm vi khai báo
Được cấp phát trong stack
Kích thước không đổi => không tận dụng hiệu quả bộ nhớ
Ví dụ : int x,y;
char c;
float f[5];
Khi biết chắc nhu cầu sử dụng đối tượng trước khi thực sự xử lý : dùng biến không động


Ví Dụ Hạn Chế Của Biến Tinh


Tổ chức danh sách lớp học
Dùng mảng tĩnh :
typedef struct
{
    char ten[20];
int maso;
}Hocvien;
Hocvien danhsach[50];
Số lượng học viên <50 => lãng phí
Số lượng học viện > 50 => thiếu chỗ !

Biến Động 


Không được khai báo tường minh, không có tên gọi
Xin khi cần, giải phóng khi sử dụng xong
Được cấp phát trong heap
Linh động về kích thước
Vấn đề : biến động không có tên gọi tường minh, làm sao thao tác ?


Kiểu con trỏ


Kiểu con trỏ dùng lưu địa chỉ của một đối tượng dữ liệu khác.
Biến thuộc kiểu con trỏ Tp là biến mà giá trị của nó là địa chỉ cuả một vùng nhớ ứng với một biến kiểu T, hoặc là  giá trị NULL.
Khai báo trong  C :
typedef int *intpointer;
intpointer p;
Bản thân biến con trỏ là không động
Dùng biến con trỏ để lưu giữ điạ chỉ của biến động => truy xuất biến động thông qua biến con trỏ


Các thao tác trên kiểu con trỏ


Tạo ra một biến động và cho con trỏ ‘p’ chỉ đến nó:
void* malloc(size);
void* calloc(n,size);
new // hàm cấp phát bộ nhớ trong C++
Hủy một biến động do p chỉ đến :
Hàm free(p) huỷ vùng nhớ cấp phát bởi hàm malloc hoặc calloc do p trỏ tới
Hàm delete p huỷ vùng nhớ cấp phát bởi hàm new do p trỏ tới

Kiểu danh sách


Danh sách = { các phần tử có cùng kiểu}
Danh sách là một kiểu dữ liệu tuyến tính :
Mỗi phần tử có nhiều nhất 1 phần tử đứng trước
Mỗi phần tử có nhiều nhất 1 phần tử đứng sau
Là kiểu dữ liệu quen thuộc trong thực tế :
Danh sách học sinh
Danh mục sách trong thư viện
Danh bạ điện thoại
Danh sách các nhân viên trong công ty



Các hình thức tổ chức danh sách


 CTDL cho mỗi phần tử ?
 Thể hiện liên kết của các phần tử ?
 Hai hình thức cơ bản :
Liên kết ngầm : Mảng
Liên kết tường minh : Danh sách liên kết


Danh sách liên kết ngầm(mảng)


Mối liên hệ giữa các phần tử được thể hiện ngầm:
xi : phần tử thứ i trong danh sách
xi , xi+1 là kế cận trong danh sách
Phải lưu trữ liên tiếp các phần tử trong bộ nhớ
công thức xác định địa chỉ phần tử thứ i: address(i) = address(1) + (i-1)*sizeof(T)
Ưu điểm : Truy xuất trực tiếp, nhanh chóng
Nhược điểm:
 Sử dụng bộ nhớ kém hiệu quả
Kích thước cố định
Các thao tác thêm vào , loại bỏ không hiệu quả


Liên kết tuờng minh(Danh sánh liên kết)


CTDL cho một phần tử
Thông tin bản thân
Địa chỉ của phần tử kế trong danh sách
Mỗi phần tử là một biến động
Ưu điểm
+ Sử dụng hiệu quả bộ nhớ
+ Linh động về số lượng phần tử


Các loại danh sách liên kết


Danh sách liên kết đơn: Mỗi phần tử liên kết với phần tử đứng sau nó trong danh sách
Danh sách liên kết kép: Mỗi phần tử liên kết với phần tử đứng trước và sau nó trong danh sách
Danh sách liên Vòng: Phần tử cuối danh sách liên với phần tử đầu danh sách
Danh sách liên kết đơn vòng
Danh sách liên kết đôi vòng

class MYINT định nghĩa kiểu dữ liệu giống int c/c++

lập trình oop c++ định nghĩa lớp MYINT có hoạt động như kiểu dữ liệu 'int' nhưng phép cộng hai MYINT hoạt động như phép trừ hai int và ngược lại.
MYINT.h
#pragma once
#include<iostream>
using namespace std;
class MYINT
{
private:
    float x;
public:
    MYINT(void);
    ~MYINT(void);
    friend ostream &operator<<(ostream &out,const MYINT&); 
    friend istream &operator>>(istream &in,MYINT&);
    MYINT operator+(const MYINT&);
    MYINT operator-(const MYINT&);
    MYINT operator*(const MYINT&);
    MYINT operator/(const MYINT&);
    void operator++();
    void operator--();
};


MYINT.cpp
#include "MYINT.h"
MYINT::MYINT(void)
{
}
MYINT::~MYINT(void)
{
}
ostream &operator<<(ostream &out,const MYINT &a)
{
    out<<a.x;
    return out;
}
istream &operator>>(istream &in,MYINT &a)
{
    in>>a.x;
    return in;
}
MYINT MYINT::operator+(const MYINT &a)
{
    MYINT z;
    z.x=this->x-a.x;
    return z;
}
MYINT MYINT::operator-(const MYINT &a)
{
    MYINT z;
    z.x=this->x+a.x;
    return z;
}
MYINT MYINT::operator*(const MYINT &a)
{
    MYINT z;
    z.x=this->x*a.x;
    return z;
}
MYINT MYINT::operator/(const MYINT &a)
{
    MYINT z;
    z.x=this->x/a.x;
    return z;
}
void MYINT::operator++()
{
    x++;
}
void MYINT::operator--()
{
    x--;
}
main.cpp
#include"MYINT.h"
void main()
{
    MYINT x,y;
    cin>>x>>y;
    cout<<x+y<<endl;
    cout<<x-y<<endl;
    system("pause");
}

class INTEGER định nghĩa kiểu dữ liệu giống int của C/C++

lập trình oop c++ định nghĩa lớp INTEGER có thể hoạt động như để mỗi INTEGER giống hệt như một 'int' của ngôn ngữ C/C++.(tự định nghĩa lại kiểu dữ liệu int)
INTEGER.h
#pragma once
#include<iostream>
using namespace std;
class INTEGER
{
private:
    float x;
public:
    INTEGER(void);
    ~INTEGER(void);
    friend ostream &operator<<(ostream &out,const INTEGER&); 
    friend istream &operator>>(istream &in,INTEGER&);
    INTEGER operator+(const INTEGER&);
    INTEGER operator-(const INTEGER&);
    INTEGER operator*(const INTEGER&);
    INTEGER operator/(const INTEGER&);
    void operator++();
    void operator--();
};


INTEGER.cpp
#include "INTEGER.h"
INTEGER::INTEGER(void)
{
}
INTEGER::~INTEGER(void)
{
}
ostream &operator<<(ostream &out,const INTEGER &a)
{
    out<<a.x;
    return out;
}
istream &operator>>(istream &in,INTEGER &a)
{
    in>>a.x;
    return in;
}
INTEGER INTEGER::operator+(const INTEGER &a)
{
    INTEGER z;
    z.x=this->x+a.x;
    return z;
}
INTEGER INTEGER::operator-(const INTEGER &a)
{
    INTEGER z;
    z.x=this->x-a.x;
    return z;
}
INTEGER INTEGER::operator*(const INTEGER &a)
{
    INTEGER z;
    z.x=this->x*a.x;
    return z;
}
INTEGER INTEGER::operator/(const INTEGER &a)
{
    INTEGER z;
    z.x=this->x/a.x;
    return z;
}
void INTEGER::operator++()
{
    x++;
}
void INTEGER::operator--()
{
    x--;
}
main.cpp
#include"INTEGER.h"
void main()
{
    INTEGER x,y;
    cin>>x>>y;
    cout<<x+y<<endl;
    cout<<x-y<<endl;
    cout<<x*y<<endl;
    cout<<x/y<<endl;
    x++;y--;
    cout<<x<<" "<<y;
    system("pause");
}

class CString biểu diễn khái niệm chuỗi ký tự

Hãy định nghĩa lớp CString biểu diễn khái niệm chuỗi ký tự với các phương thức thiết lập, huỷ bỏ, các hàm thành phần và các phép toán cần thiết (+, gán, so sánh hai chuỗi).
cstring.h
#pragma once
#include<iostream>
#include<string>
using namespace std;
class cstring
{
private:
    string s;
public:
    cstring();
    ~cstring();
    friend ostream &operator<<(ostream &out,const cstring &a);
    friend istream &operator>>(istream &in,cstring &a);
    cstring operator+(const cstring &a);
    void operator=(const cstring &a);
    bool operator<(const cstring &a);
    bool operator<=(const cstring &a);
    bool operator>(const cstring &a);
    bool operator>=(const cstring &a);
    bool operator==(const cstring &a);
    bool operator!=(const cstring &a);
};
cstring.cpp
#include"cstring.h"
cstring::cstring()
{
}
cstring::~cstring()
{
}
ostream &operator<<(ostream &out,const cstring &a)
{
    out<<a.s;
    return out;
}
istream &operator>>(istream &in,cstring &a)
{
    getline(in,a.s);
    return in;
}
cstring cstring::operator+(const cstring &a)
{
    cstring z;
    z.s=s;
    z.s+=a.s;
    return z;
}
void cstring::operator=(const cstring &a)
{
    s=a.s;
}
bool cstring::operator<(const cstring &a)
{
    if(s<a.s) return true;
    return false;
}
bool cstring::operator<=(const cstring &a)
{
    if(s<=a.s) return true;
    return false;
}
bool cstring::operator>(const cstring &a)
{
    if(s>a.s) return true;
    return false;
}
bool cstring::operator>=(const cstring &a)
{
    if(s>=a.s) return true;
    return false;
}
bool cstring::operator==(const cstring &a)
{
    if(s==a.s) return true;
    return false;
}
bool cstring::operator!=(const cstring &a)
{
    if(s!=a.s) return true;
    return false;
}
main.cpp
#include"cstring.h"
void main()
{
    cstring s,x;
    cin>>s>>x;
    if(s>x) cout<<"OK";
    system("pause");
}

Sunday, May 24, 2015

code javascript tạo pop up like fanpage facebook

tạo pop up like fanpage facebook cho web,blog, code javascript like facebook, hiển thị theo cookie, không làm phiền khách. chỉ cần dán code vào body web hoặc tạo widget html và dán code vào đối với blogspot.

<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js' type='text/javascript'></script>
<style>
#fbox-background {
    display: none;
    background: rgba(0,0,0,0.8);
    width: 100%;
    height: 100%;
    position: fixed;
    top: 0;
    left: 0;
    z-index: 99999;
}

#fbox-close {
    width: 100%;
    height: 100%;
}

#fbox-display {
    background: #eaeaea;
    border: 5px solid #828282;
    width: 340px;
    height: 230px;
    position: absolute;
    top: 32%;
    left: 37%;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
}

#fbox-button {
    float: right;
    cursor: pointer;
    position: absolute;
    right: 0px;
    top: 0px;
}

#fbox-button:before {
    content: "CLOSE";
    padding: 5px 8px;
    background: #828282;
    color: #eaeaea;
    font-weight: bold;
    font-size: 10px;
    font-family: Tahoma;
}

#fbox-link,#fbox-link a.visited,#fbox-link a,#fbox-link a:hover {
    color: #aaaaaa;
    font-size: 9px;
    text-decoration: none;
    text-align: center;
    padding: 5px;
}
</style>
<script type='text/javascript'>
//<![CDATA[
jQuery.cookie = function (key, value, options) {
// key and at least value given, set cookie...
if (arguments.length > 1 && String(value) !== "[object Object]") {
options = jQuery.extend({}, options);
if (value === null || value === undefined) {
options.expires = -1;
}
if (typeof options.expires === 'number') {
var days = options.expires, t = options.expires = new Date();
t.setDate(t.getDate() + days);
}
value = String(value);
return (document.cookie = [
encodeURIComponent(key), '=',
options.raw ? value : encodeURIComponent(value),
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
options.path ? '; path=' + options.path : '',
options.domain ? '; domain=' + options.domain : '',
options.secure ? '; secure' : ''
].join(''));
}
// key and possibly options given, get cookie...
options = value || {};
var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
};
//]]>
</script>
<script type='text/javascript'>
jQuery(document).ready(function($){
if($.cookie('popup_facebook_box') != 'yes'){
$('#fbox-background').delay(5000).fadeIn('medium');
$('#fbox-button, #fbox-close').click(function(){
$('#fbox-background').stop().fadeOut('medium');
});
}
$.cookie('popup_facebook_box', 'yes', { path: '/', expires: 7 });
});
</script>
<div id='fbox-background'>
<div id='fbox-close'>
</div>
<div id='fbox-display'>
<div id='fbox-button'>
</div>
<iframe allowtransparency='true' frameborder='0' scrolling='no' src='//www.facebook.com/plugins/likebox.php?
href=https://www.facebook.com/laptrinh321&width=402&height=255&colorscheme=light&show_faces=true&show_border=false&stream=false&header=false'
style='border: none; overflow: hidden; background: #fff; width: 339px; height: 200px;'></iframe>
<div id="fbox-link">Powered by <a style="padding-left: 0px;" href="http://helplogger.blogspot.com" rel="nofollow">Helplogger</a></div>
</div>
</div>
chúc các bạn thành coog với code javascript like fanpage facebook này.
thấy hay hãy like fanpage ở góc phải để theo dõi lập trình 321 để ủng hộ tinh thần chia sẽ nhé

Friday, May 22, 2015

class CDate biểu diễn ngày tháng năm và các phép toán+-

5. Định nghĩa lớp CDate biểu diễn khái niệm ngày, tháng, năm với các phép toán +, - (cộng, trừ thêm một số ngày), ++, -- (thêm bớt một ngày), - (khoảng cách giữa hai CDate tính bằng ngày). Phép toán <<, >> để xuất, nhập dữ liệu loại CDate.
cdate.h
#pragma once
#include<iostream>
using namespace std;
class cdate
{
private:
    int ngay,thang,nam;
public:
    cdate(void);
    ~cdate(void);
    bool check(const int&,const int&,const int&);
    cdate operator+(const int&);
    cdate operator-(const int&);
    long long operator-(const cdate&);
    void operator++();
    void operator--();
    friend ostream &operator<<(ostream &out,const cdate&);
    friend istream &operator>>(istream &in,cdate &);
};


cdate.cpp
#include "cdate.h"
cdate::cdate(void)
{
}
cdate::~cdate(void)
{
}
bool cdate::check(const int &a,const int &b,const int &c)
{
    switch(b)
    {
    case 1:case 3:case 5: case 7: case 8: case 10: case 12:
        if(a<=0 || a>31) return false;
        break;
    case 4: case 6: case 9: case 11:
        if(a<=0 || a>30) return false;
        break;
    case 2:
        if(c%400==0 ||(c%4==0 && c%100!=0))
        {
            if(a<=0 || a>29) return false;
        }
        else if(a<=0 || a>28) return false;
        break;
    default: return false;
    }
    return true;
}
istream &operator>>(istream &in,cdate &d)
{
    bool k;
    do{
        k=false;
        cout<<"ngay =";in>>d.ngay;
        cout<<"thang=";in>>d.thang;
        cout<<"nam  =";in>>d.nam;
        k=d.check(d.ngay,d.thang,d.nam);
        if(k==false) cout<<"khong hop le!\n";
    }while(!k);
    return in;
}
cdate cdate::operator+(const int &x)
{
    cdate d;
    d.ngay=ngay;
    d.thang=thang;
    d.nam=nam;
    int k=d.ngay+x;
    do{
        switch(d.thang)
        {
        case 1:case 3:case 5: case 7:case 8: case 10: case 12:
            if(k>31)
            {
                d.thang++;
                if(d.thang==13)
                {
                    d.thang=1;
                    d.nam++;
                }
                k-=31;
            }
            else
            {
                d.ngay=k;
                k=0;
            }
            break;
        case 4:case 6: case 9: case 11:
            if(k>30)
            {
                d.thang++;
                k-=30;
            }
            else
            {
                d.ngay=k;
                k=0;
            }
            break;
        case 2:
            if(d.nam%400==0 || (d.nam%4==0 && d.nam%100!=0))
            {
                if(k>29)
                {
                    d.thang++;
                    k-=29;
                }
                else
                {
                    d.ngay=k;
                    k=0;
                }
            }
            else
            {
                if(k>28)
                {
                    d.thang++;
                    k-=28;
                }
                else
                {
                    d.ngay=k;
                    k=0;
                }
            }
            break;
        }
    }while(k>0);
    return d;
}
ostream &operator<<(ostream &out,const cdate& d)
{
    out<<d.ngay<<"/"<<d.thang<<"/"<<d.nam;
    return out;
}
cdate cdate::operator-(const int &a)
{
    cdate d;
    d.ngay=ngay;
    d.thang=thang;
    d.nam=nam;
    int x=a;
    do{
        if(d.ngay>x)
        {
            d.ngay-=x;
            x=0;
        }
        else
        {
            x-=d.ngay;
            d.thang--;
            switch(d.thang)
            {
            case 1:case 3: case 5: case 7: case 8: case 10:
                d.ngay=31;
                break;
            case 4: case 6: case 9: case 11:
                d.ngay=30;
                break;
            case 2:
                if(d.nam%400==0 || (d.nam%4==0 && d.nam%100!=0)) d.ngay=29;
                else d.ngay=28;
                break;
            case 0:
                d.thang=12;
                d.nam--;
                d.ngay=31;
                break;
            }
        }
    }while(x>0);
    return d;
}
long long cdate::operator-(const cdate &d)
{
    cdate x;
    x.ngay=ngay;
    x.thang=thang;
    x.nam=nam;
    long long a=x.ngay;
    do{
        switch(x.thang)
        {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            a+=31;
            x.thang--;
            if(x.thang==0)
            {
                x.nam--;
                x.thang=12;
            }
            break;
        case 4: case 6: case 9: case 11:
            a+=30;
            x.thang--;
            break;
        case 2:
            if(x.nam%400==0 || (x.nam%4==0 && x.nam%100!=0))
            {
                a+=29;
                x.thang--;
            }
            else
            {
                a+=28;
                x.thang--;
            }
        }
    }while(x.nam>0);

    x.ngay=d.ngay;
    x.thang=d.thang;
    x.nam=d.nam;
    long long b=x.ngay;
    do{
        switch(x.thang)
        {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            b+=31;
            x.thang--;
            if(x.thang==0)
            {
                x.nam--;
                x.thang=12;
            }
            break;
        case 4: case 6: case 9: case 11:
            b+=30;
            x.thang--;
            break;
        case 2:
            if(x.nam%400==0 || (x.nam%4==0 && x.nam%100!=0))
            {
                b+=29;
                x.thang--;
            }
            else
            {
                b+=28;
                x.thang--;
            }
        }
    }while(x.nam>0);
    return a-b;
}
void cdate::operator++()
{
    ngay++;
    switch(thang)
    {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
        if(ngay>31)
        {
            ngay=1;
            thang++;
            if(thang>12)
            {
                nam++;
                thang=1;
            }
        }
        break;
    case 4: case 6: case 9: case 11:
        if(ngay>30)
        {
            ngay=1;
            thang++;
        }
        break;
    case 2:
        if(nam%400==0 || (nam%4==0 && nam%100!=0))
        {
            if(ngay>29)
            {
                ngay=1;
                thang++;
            }
        }
        else
        {
            if(ngay>28)
            {
                ngay=1;
                thang++;
            }
        }
    }
}
void cdate::operator--()
{
    ngay--;
    if(ngay==0)
    {
        thang--;
        switch(thang)
        {
        case 1: case 3: case 5: case 7: case 8: case 10:
            ngay=31;
            break;
        case 0:
            ngay=31;
            thang=12;
            nam--;
            break;
        case 4: case 6: case 9: case 11:
            ngay=30;
            break;
        case 2:
            if(nam%400==0 || (nam%4==0 && nam%100!=0)) ngay=29;
            else ngay=28;
            break;
        }
    }
}
main.cpp
#include"cdate.h"
void main()
{
    cdate x,y;
    cin>>x;
    x++;
    cout<<x<<endl;
    x--;
    cout<<x;
    system("pause");
}

class CTime biểu diễn giờ phút giây và các phép toán

4. Định nghĩa lớp CTime biểu diễn khái niệm thời điểm có các thành phần giờ phút giây. Định nghĩa các phép toán +, - (cộng, trừ thêm một số nguyên giây), - (phép trừ hai CTime để được một CTimSpan), ++, -- (thêm bớt một giây). Phép toán <<, >> để xuất, nhập dữ liệu loại CTime.
ctime.h
#pragma once
#include<iostream>
using namespace std;
class ctime
{
private:
    int hour,minutes,second;
public:
    ctime(int=0,int=0,int=0);
    ~ctime(void);
    ctime operator+(const int&);
    ctime operator-(const int&);
    void operator++();
    void operator--();
    friend ostream &operator<<(ostream &out,const ctime &a);
    friend istream &operator>>(istream &in,ctime &a);
};



ctime.cpp
#include "ctime.h"
ctime::ctime(int a,int b,int c)
{
    hour=(a<0 || a>23)?0:a;
    minutes=(b<0 || b>59)?0:b;
    second=(c<0 || c>59) ? 0:c;
}
ctime::~ctime(void)
{
}
ctime ctime::operator+(const int& x)
{
    ctime c;
    int a,b;
    a=(this->second+x)/60;
    c.second=(this->second+x)%60;
    b=(this->minutes+a)/60;
    c.minutes=(this->minutes+a)%60;
    c.hour=hour+b;
    return c;
}
ostream &operator<<(ostream &out,const ctime &a)
{
    if(a.hour<0 || a.minutes<0||a.second<0) out<<"-";
    out<<(a.hour<10 && a.hour>=0?"0":"")<<abs(a.hour)<<":"
        <<(a.minutes<10 && a.minutes>=0?"0":"")<<abs(a.minutes)<<":"
        <<(a.second<10 && a.second>=0?"0":"")<<abs(a.second);
    return out;
}
istream &operator>>(istream &in,ctime &a)
{
    in>>a.hour>>a.minutes>>a.second;
    return in;
}
ctime ctime::operator-(const int&x)
{
    ctime c;
    int a,b;
    a=(this->second-x<0)?-1:0;
    c.second=(a==-1)?60+second-x:second-x;
    b=(minutes+a)<0?-1:0;
    c.minutes=(b==-1)?60+minutes+a:minutes+a;
    c.hour=b+hour;
    if(c.hour<0)
    {
        a=(-this->second+x<0)?-1:0;
        c.second=(a==-1)?60-second+x:-second+x;
        b=(-minutes+a)<0?-1:0;
        c.minutes=(b==-1)?60-minutes+a:-minutes+a;
        c.hour=-(b-hour);
        if(c.hour==0)
        {
            if(c.minutes!=0) c.minutes=0-c.minutes;
            else if(c.second!=0) c.second=0-c.second;
        }
        return c;
    }
    return c;
}
void ctime::operator++()
{
    ctime c;
    int a,b;
    a=(this->second+1)/60;
    c.second=(this->second+1)%60;
    b=(this->minutes+a)/60;
    c.minutes=(this->minutes+a)%60;
    c.hour=hour+b;
    hour=c.hour;
    minutes=c.minutes;
    second=c.second;
}
void ctime::operator--()
{
    ctime c;
    int a,b;
    a=(this->second-1<0)?-1:0;
    c.second=(a==-1)?60+second-1:second-1;
    b=(minutes+a)<0?-1:0;
    c.minutes=(b==-1)?60+minutes+a:minutes+a;
    c.hour=b+hour;
    if(c.hour<0)
    {
        a=(-this->second+1<0)?-1:0;
        c.second=(a==-1)?60-second+1:-second+1;
        b=(-minutes+a)<0?-1:0;
        c.minutes=(b==-1)?60-minutes+a:-minutes+a;
        c.hour=-(b-hour);
        if(c.hour==0)
        {
            if(c.minutes!=0) c.minutes=0-c.minutes;
            else if(c.second!=0) c.second=0-c.second;
        }
        hour=c.hour;
        minutes=c.minutes;
        second=c.second;
    }
    hour=c.hour;
    minutes=c.minutes;
    second=c.second;
}
main.cpp
#include"ctime.h"
void main()
{
    ctime x;
    cin>>x;
    x++;
    cout<<x<<endl;
    x--;
    cout<<x<<endl;;
    system("pause");
}


Wednesday, May 20, 2015

class ctimespan biểu diễn thời gian trong OOP C++

Định nghĩa lớp dữ liệu CTimeSpan để biểu diễn khái niệm khoảng thời gian, các hàm thành phần và các phép toán cần thiết.
ctimespan.h
#pragma once
#include<iostream>
using namespace std;
class ctimespan
{
private:
 int hour,minutes,second;
public:
 ctimespan(int=0,int=0,int=0);
 ~ctimespan(void);
 ctimespan operator+(const ctimespan&);
 ctimespan operator-(const ctimespan&);
 bool operator<(ctimespan&);
 bool operator<=(ctimespan&);
 bool operator>(ctimespan&);
 bool operator>=(ctimespan&);
 bool operator==(ctimespan&);
 bool operator!=(ctimespan&);
 friend ostream &operator<<(ostream &out,const ctimespan &a);
 friend istream &operator>>(istream &in,ctimespan &a);
};

ctimespan.cpp
#include "ctimespan.h"
ctimespan::ctimespan(int a,int b,int c)
{
 hour=(a<0 || a>23)?0:a;
 minutes=(b<0 || b>59)?0:b;
 second=(c<0 || c>59) ? 0:c;
}
ctimespan::~ctimespan(void)
{
}
ctimespan ctimespan::operator+(const ctimespan &x)
{
 ctimespan c;
 int a,b;
 a=(this->second+x.second)/60;
 c.second=(this->second+x.second)%60;
 b=(this->minutes+x.minutes+a)/60;
 c.minutes=(this->minutes+x.minutes+a)%60;
 c.hour=hour+b+x.hour;
 return c;
}
ostream &operator<<(ostream &out,const ctimespan &a)
{
 if(a.hour<0 || a.minutes<0||a.second<0) out<<"-";
 out<<(a.hour<10 && a.hour>=0?"0":"")<<abs(a.hour)<<":"
  <<(a.minutes<10 && a.minutes>=0?"0":"")<<abs(a.minutes)<<":"
  <<(a.second<10 && a.second>=0?"0":"")<<abs(a.second);
 return out;
}
istream &operator>>(istream &in,ctimespan &a)
{
 in>>a.hour>>a.minutes>>a.second;
 return in;
}
ctimespan ctimespan::operator-(const ctimespan&x)
{
 ctimespan c;
 int a,b;
 a=(this->second-x.second<0)?-1:0;
 c.second=(a==-1)?60+second-x.second:second-x.second;
 b=(minutes-x.minutes+a)<0?-1:0;
 c.minutes=(b==-1)?60+minutes-x.minutes+a:minutes-x.minutes+a;
 c.hour=b+hour-x.hour;
 if(c.hour<0)
 {
  a=(-this->second+x.second<0)?-1:0;
  c.second=(a==-1)?60-second+x.second:-second+x.second;
  b=(-minutes+x.minutes+a)<0?-1:0;
  c.minutes=(b==-1)?60-minutes+x.minutes+a:-minutes+x.minutes+a;
  c.hour=-(b-hour+x.hour);
  return c;
 }
 return c;
}

bool ctimespan::operator<(ctimespan&x)
{
 ctimespan c;
 int a,b;
 a=(this->second-x.second<0)?-1:0;
 c.second=(a==-1)?60+second-x.second:second-x.second;
 b=(minutes-x.minutes+a)<0?-1:0;
 c.minutes=(b==-1)?60+minutes-x.minutes+a:minutes-x.minutes+a;
 c.hour=b+hour-x.hour;
 if(c.hour<0) return true;return false;
}
bool ctimespan::operator<=(ctimespan&x)
{
 ctimespan c;
 int a,b;
 a=(this->second-x.second<0)?-1:0;
 c.second=(a==-1)?60+second-x.second:second-x.second;
 b=(minutes-x.minutes+a)<0?-1:0;
 c.minutes=(b==-1)?60+minutes-x.minutes+a:minutes-x.minutes+a;
 c.hour=b+hour-x.hour;
 if(c.hour<=0) return true;return false;
}
bool ctimespan::operator>(ctimespan&x)
{
 ctimespan c;
 int a,b;
 a=(this->second-x.second<0)?-1:0;
 c.second=(a==-1)?60+second-x.second:second-x.second;
 b=(minutes-x.minutes+a)<0?-1:0;
 c.minutes=(b==-1)?60+minutes-x.minutes+a:minutes-x.minutes+a;
 c.hour=b+hour-x.hour;
 
 if(c.hour>=0 && (c.minutes!=0 || c.second!=0)) return true;return false;
}
bool ctimespan::operator>=(ctimespan&x)
{
 ctimespan c;
 int a,b;
 a=(this->second-x.second<0)?-1:0;
 c.second=(a==-1)?60+second-x.second:second-x.second;
 b=(minutes-x.minutes+a)<0?-1:0;
 c.minutes=(b==-1)?60+minutes-x.minutes+a:minutes-x.minutes+a;
 c.hour=b+hour-x.hour;
 if(c.hour>=0 && c.minutes>=0 && c.second>=0) return true;return false;
}
bool ctimespan::operator==(ctimespan&x)
{
 if(second==x.second && minutes==x.minutes && hour==x.hour) return true;return false;
}
bool ctimespan::operator!=(ctimespan&x)
{
 if(second!=x.second || minutes!=x.minutes || hour!=x.hour) return true;return false;
}
main.cpp
#include"ctimespan.h"
void main()
{
 ctimespan x(1,1,1),y(28,28,28);
 cout<<x+y<<endl;
 cout<<x-y<<endl;
 if(x<y) cout<<1; else cout<<0;
 if(x<=y) cout<<1; else cout<<0;
 if(x>y) cout<<1; else cout<<0;
 if(x>=y) cout<<1; else cout<<0;
 if(x==y) cout<<1; else cout<<0;
 if(x!=y) cout<<1; else cout<<0;
 system("pause");
}

Saturday, May 16, 2015

[OOP C++] quản lý nhân viên và tính lương cho từng nhân viên

bài tập OOP C++. Giả sử Công ty có hai loại nhân viên: Nhân viên văn phòng và Nhân viên sản xuất. Viết chương trình quản lý và tính lương cho từng nhân viên của công ty: Mỗi nhân viên cần quản lý các thông tin sau: Họ tên, ngày sinh, lương Công ty cần tính lương cho nhân viên như sau: - Đối với nhân viên sản xuất:  Lương=lương căn bản + số sản phẩm * 5.000 - Đối nhân viên văn phòng:  lương = số ngày làm việc * 100.000
nhanvien.h
#pragma once
#include<iostream>
using namespace std;
class nhanvien
{
protected:
 char hoten[100];
 int ngay,thang,nam;
public:
 nhanvien(void);
 ~nhanvien(void);
 virtual void nhap();
 virtual void xuat();
 virtual long luong();
};

nhanvien.cpp
#include "nhanvien.h"
nhanvien::nhanvien(void)
{
}
nhanvien::~nhanvien(void)
{
}
void nhanvien::nhap()
{
 cout<<"ho ten:";fflush(stdin);gets(hoten);
 cout<<"ngay sinh d/m/y :";
 cin>>ngay;cin.ignore();cin>>thang;cin.ignore();cin>>nam;
}
void nhanvien::xuat()
{
 cout<<hoten<<endl<<"ngay sinh: "<<ngay<<"/"<<thang<<"/"<<nam<<endl;
}
long nhanvien::luong()
{
 return 0;
}
sanxuat.h
#pragma once
#include "nhanvien.h"
class sanxuat :
 virtual public nhanvien
{
private:
 long luongcoban,sosp;
public:
 sanxuat(void);
 ~sanxuat(void);
 virtual void nhap();
 virtual void xuat();
 virtual long luong();
};

sanxuat.cpp
#include "sanxuat.h"


sanxuat::sanxuat(void)
{
}


sanxuat::~sanxuat(void)
{
}
void sanxuat::nhap()
{
 nhanvien::nhap();
 cout<<"luong co ban:";cin>>luongcoban;
 cout<<"so san pham:";cin>>sosp;
}
void sanxuat::xuat()
{
 nhanvien::xuat();
 cout<<"luong co ban:"<<luongcoban<<endl<<"so san pham :"<<sosp<<endl;
}
long sanxuat::luong()
{
 return luongcoban+sosp*5000;
}
vanphong.h
#pragma once
#include "nhanvien.h"
class vanphong :
 virtual public nhanvien
{
private:
 int songay;
public:
 vanphong(void);
 ~vanphong(void);
 virtual void nhap();
 virtual void xuat();
 virtual long luong();
};

canphong.cpp
#include "vanphong.h"


vanphong::vanphong(void)
{
}


vanphong::~vanphong(void)
{
}
void vanphong::nhap()
{
 nhanvien::nhap();
 cout<<"so ngay lam viec: ";cin>>songay;
}
void vanphong::xuat()
{
 nhanvien::xuat();
 cout<<"so ngay lam viec:"<<songay<<endl;
}
long vanphong::luong()
{
 return songay*100000;
}
quanlynhanvien.h
#pragma once
#include"nhanvien.h"
#include<vector>
using namespace std;
class quanlynhanvien
{
private:
 nhanvien **x;
 int n;
public:
 quanlynhanvien(void);
 ~quanlynhanvien(void);
 void nhap();
 void xuat();
};

quanlynhanvien.cpp
#include "quanlynhanvien.h"
#include"vanphong.h"
#include"sanxuat.h"

quanlynhanvien::quanlynhanvien(void)
{
 n=0;
 x=new nhanvien*[1000];
}


quanlynhanvien::~quanlynhanvien(void)
{
 delete []x;
}
void quanlynhanvien::nhap()
{
 int k;
 for(int i=0;;i++)
 {
  do{
   cout<<"\nloai nhan vien: \n1-van phong\n2-san xuat\n0-ket thuc\n";
   cin>>k;
   if(k!=1 && k!=2 && k!=0) cout<<"\nkhong hop le!\n";
  }while(k!=1 && k!=2 && k!=0);
  if(k==0) return;
  else if(k==1)
  {
   n++;
   x[i]=new vanphong;
  }
  else
  {
   n++;
   x[i]=new sanxuat;
  }
  x[i]->nhap();
 }
}
void quanlynhanvien::xuat()
{
 cout<<"so nhan vien = "<<n<<"\n";
 for(int i=0;i<n;i++)
 {
  cout<<endl;
  x[i]->xuat();
  cout<<"luong = "<<x[i]->luong();
  cout<<endl;
 }
}
main.cpp
#include"quanlynhanvien.h"
void main()
{
 quanlynhanvien x;
 x.nhap();
 x.xuat();
 system("pause");
}

tính giá trị biểu thức bằng cây nhị phân

lập trình c++ trính giá trị biểu thức toán học gồm số nguyên, dấu ngoặc (), phép toán +-*/ bằng phương pháp cây nhị phân.
#include<iostream>
#include<string>
using namespace std;
typedef struct tagnode
{
     string s;
     struct tagnode *left;
     struct tagnode *right;
}node;
node *taonode(string s)
{
     node *p=new node;
     if(p==NULL)
     {
          cout<<"khong du bo nho";
          system("pause");
          exit(1);
     }
     p->s=s;
     p->left=p->right=NULL;
     return p;
}
typedef node *cay;
void taocay(cay &t)
{
     t=NULL;
}
int vitridau(string s,int j)
{
     for(int i=j+1;i<s.size();i++)
          if(s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/' || s[i]=='(')
               return i;
     return -1;
}
int timngoac(string s,int i)
{
     int j,dem=1;
     for(j=i+1;j<s.size();j++)
     {
          if(s[j]=='(') dem++;
          else if(s[j]==')') dem--;
          if(dem==0) return j;
     }
     return -1;
}
void xulyngoac(string &s)
{
     if(s[0]=='(')
     {
          int i=timngoac(s,0);
          if(i==s.size()-1)
          {
               s.erase(0,1);
               s.erase(s.size()-1,1);
          }
     }
}
void doidau(string &c)
{
     int x=0;
     do{
          x=vitridau(c,x);
          if(x!=-1)
          {
               if(c[x]=='(') x=timngoac(c,x);
               else if(c[x]=='-' && c[x-1]!='*' && c[x-1]!='/') c[x]='+';
               else if(c[x]=='+' && c[x-1]!='*' && c[x-1]!='/') c[x]='-';
               //chỉ đổi dấu + thành - và dấu - thành cộng khi nó là dấu của 1 số hạng
               //nếu nó dấu của 1 thừa số thì dữ nguyên không thay đổi gì cả mặc dù
               //dấu của node của cây tức s[i] là dấu - vì dấu của thừa số không liên quan đến số hạng
          }
     }while(x!=-1);
}
node *setcay(string s)
{
     xulyngoac(s);
     node *p;
     int k,j,x;
     string a,b,c;
     int i=vitridau(s,0);//tìm vị trí dấu đầu tiên trong biểu thức, có 2 trường hợp, có dấu và không có dấu
     if(s[0]=='(') i=0;
     if(i==-1)// trường hợp không có dấu
     {
          p=taonode(s);
          return p;
     }
     else//trường hợp có dấu, có 3 trường hợp nhỏ
     {
          if(s[i]=='+' || s[i]=='-')// dấu + hoặc -
          {
               a=s[i];
               p=taonode(a);
               b=s.substr(0,i);
               xulyngoac(b);
               c=s.substr(i+1,s.size()-i-1);
               xulyngoac(c);
               //đổi dấu các số hạng phía sau nếu s[i] là dấu -
               if(s[i]=='-') doidau(c);
               p->left=setcay(b);
               p->right=setcay(c);
          }
          else if(s[i]=='*' || s[i]=='/')//dấu * hoặc /
          {
               k=i;
               //tìm vị trí dấu + hoặc - phía sau dấu ngoặc nhưng nằm ngoài dấu ngoặc
               do{
                    k=vitridau(s,k);
                    if(k!=-1)
                    {
                         if(s[k]=='(') k=timngoac(s,k);
                         if(k>0 && (s[k]=='+' || s[k]=='-') && (s[k-1]!='*' && s[k-1]!='/')) break;
                    }
               }while(k!=-1);
               if(k==-1)//nếu không có thì node sẽ là dấu * hoặc / tại vị trí i ban đầu
               {
                    a=s[i];
                    p=taonode(a);
                    b=s.substr(0,i);
                    xulyngoac(b);
                    c=s.substr(i+1,s.size()-i-1);
                    xulyngoac(c);
                    p->left=setcay(b);
                    p->right=setcay(c);
               }
               else//nếu tìm thấy thì node là dấu tìm thấy
               {
                    a=s[k];
                    p=taonode(a);
                    b=s.substr(0,k);
                    xulyngoac(b);
                    c=s.substr(k+1,s.size()-k-1);
                    xulyngoac(c);
                    //doi dau +-
                    if(s[k]=='-') doidau(c);
                    p->left=setcay(b);
                    p->right=setcay(c);
               }
          }
          else if(s[i]=='(')//dấu mở ngoặc (
          {
               j=timngoac(s,i);//tìm vị trí dấu đóng ngoặc
               
               if(s[j+1]=='+' || s[j+1]=='-')//sau dấu đóng ngoặc là dấu + hoặc - thì node là dấu + hoặc -
               {
                    a=s[j+1];
                    p=taonode(a);
                    b=s.substr(0,j+1);
                    xulyngoac(b);
                    c=s.substr(j+2,s.size()-j-2);
                    xulyngoac(c);
                    //doi dau +-
                    if(s[j+1]=='-') doidau(c);
                    p->left=setcay(b);
                    p->right=setcay(c);
               }
               else if(s[j+1]=='*' || s[j+1]=='/')//nếu sau đóng ngoặc là * hoặc /
               {
                    k=j+1;
                    //tiếp tục tìm dấu + - phía sau nó mà nằm ngoài tất cả dấu ngoặc
                    do{
                         k=vitridau(s,k);
                         if(k!=-1)
                         {
                              if(s[k]=='(') k=timngoac(s,k);
                              if(k>0 && (s[k]=='+' || s[k]=='-') && (s[k-1]!='*' && s[k-1]!='/')) break;
                         }
                    }while(k!=-1);
                    if(k==-1)//nếu không tìm thấy thì node là dấu */ tại trí j+1
                    {
                         a=s[j+1];
                         p=taonode(a);
                         b=s.substr(0,j+1);
                         xulyngoac(b);
                         c=s.substr(j+2,s.size()-j-2);
                         xulyngoac(c);
                         p->left=setcay(b);
                         p->right=setcay(c);
                    }
                    else//nếu tìm thấy thì node là dấu tìm thấy
                    {
                         a=s[k];
                         p=taonode(a);
                         b=s.substr(0,k);
                         xulyngoac(b);
                         c=s.substr(k+1,s.size()-k-1);
                         xulyngoac(c);
                         //doi dau +-
                         if(s[j+1]=='-') doidau(c);
                         p->left=setcay(b);
                         p->right=setcay(c);
                    }
               }
          }
     }
     return p;
}
long atol(string s)
{
     long x=0,d=1;
     int j=0,k=0;
     if(s[0]=='+' || s[0]=='-')
     {
          j=1;
          if(s[0]=='-') k=1;
     }
     for(int i=s.size()-1;i>=j;i--)
     {
          switch(s[i])
          {
          case '0':x+=0*d;break;
          case '1':x+=1*d;break;
          case '2':x+=2*d;break;
          case '3':x+=3*d;break;
          case '4':x+=4*d;break;
          case '5':x+=5*d;break;
          case '6':x+=6*d;break;
          case '7':x+=7*d;break;
          case '8':x+=8*d;break;
          case '9':x+=9*d;break;
          }
          d*=10;
     }
     if(k==0)return x;
     return -x;
}
long tinh(cay t)
{
     long x;
     if(t)
     {
          if(t->s=="+") return tinh(t->left)+tinh(t->right);
          else if(t->s=="-") return tinh(t->left)-tinh(t->right);
          else if(t->s=="*") return tinh(t->left)*tinh(t->right);
          else if(t->s=="/") return tinh(t->left)/tinh(t->right);
          else return atol(t->s);
     }
     return 0;
}
void main()
{
     cay t;
     taocay(t);
     string s;
     cout<<"nhap bieu thuc toan hoc cua cac so nguyen duong:\n";
     getline(cin,s);
     t=setcay(s);
     cout<<"gia tri bieu thuc = "<<tinh(t)<<endl;
     system("pause");
}

Friday, May 15, 2015

OOP C++ cộng trừ nhân chia số phức

Làm lại bài số phức với một phương thức thiết lập duy nhất cho phép quan điểm một số thực như một số phức đặc biệt (phần ảo bằng 0). Định nghĩa các phép toán cộng ,trừ nhân chia, so sánh,….. +, -, *, /, = =, !=, ! trên số phức. Định nghĩa phép toán << và >> để xuất và nhập dữ liệu vào số phức.sophuc.h
#pragma once
#include<iostream>
using namespace std;
class sophuc
{
private:
    float t,a;
public:
    sophuc(float =0,float =0);
    ~sophuc(void);
    float dodai();
    sophuc operator+(const sophuc &);
    sophuc operator-(const sophuc &);
    sophuc operator*(const sophuc &);
    sophuc operator/(const sophuc &);
    bool operator<(sophuc &);
    bool operator<=(sophuc &);
    bool operator>(sophuc &);
    bool operator>=(sophuc&);
    bool operator==(sophuc&);
    bool operator!=(sophuc&);
    friend ostream &operator<<(ostream &out,const sophuc &a);
    friend istream &operator>>(istream &in,sophuc &a);
};
sophuc.cpp
#include "sophuc.h"

sophuc::sophuc(float b,float c)
{
    t=b;a=c;
}
float sophuc::dodai()
{
    return sqrt(t*t+a*a);
}

sophuc::~sophuc(void)
{
}
sophuc sophuc::operator+(const sophuc &x)
{
    sophuc c;
    c.t=x.t+this->t;
    c.a=x.a+this->a;
    return c;
}
ostream &operator<<(ostream &out,const sophuc &a)
{
    if(a.t==0 && a.a!=0) out<<a.a<<"i";
    else if(a.a==0 && a.t!=0) out<<a.t;
    else if(a.t==0 && a.a==0) out<<0;
    else out<<a.t<<((a.a>0)?" + ":" - ")<<abs(a.a)<<"i";
    return out;
}
istream &operator>>(istream &in,sophuc &a)
{
    cout<<"phan thuc=";in>>a.t;
    cout<<"phan ao=";in>>a.a;
    return in;
}
sophuc sophuc::operator-(const sophuc&x)
{
    sophuc c;
    c.t=t-x.t;
    c.a=a-x.a;
    return c;
}
sophuc sophuc::operator*(const sophuc&x)
{
    sophuc c;
    c.t=t*x.t-a*x.a;
    c.a=t*x.a+a*x.t;
    return c;
}
sophuc sophuc::operator/(const sophuc&x)
{
    sophuc c;
    c.t=(t*x.t+a*x.a)/(x.t*x.t+x.a*x.a);
    c.a=(x.t*a-t*x.a)/(x.t*x.t+x.a*x.a);
    return c;
}
bool sophuc::operator<(sophuc&x)
{
    if(dodai()<x.dodai()) return true;return false;
}
bool sophuc::operator<=(sophuc&x)
{
    if(dodai()<=x.dodai()) return true;return false;
}
bool sophuc::operator>(sophuc&x)
{
    if(dodai()>x.dodai()) return true;return false;
}
bool sophuc::operator>=(sophuc&x)
{
    if(dodai()>=x.dodai()) return true;return false;
}
bool sophuc::operator==(sophuc&x)
{
    if(dodai()==x.dodai()) return true;return false;
}
bool sophuc::operator!=(sophuc&x)
{
    if(dodai()!=x.dodai()) return true;return false;
}
main.cpp
#include"sophuc.h"
void main()
{
    sophuc a,b,c;
    cin>>a>>b;
    cout<<a+b<<endl;
    cout<<a-b<<endl;
    cout<<a*b<<endl;
    cout<<a/b<<endl;
    if(a>b) cout<<1<<endl;else cout<<0<<endl;
    if(a>=b) cout<<1<<endl;else cout<<0<<endl;
    if(a<b) cout<<1<<endl;else cout<<0<<endl;
    if(a<=b) cout<<1<<endl;else cout<<0<<endl;
    if(a==b) cout<<1<<endl;else cout<<0<<endl;
    if(a!=b) cout<<1<<endl;else cout<<0<<endl;
    system("pause");
}

Thursday, May 14, 2015

cộng trừ nhân chia số nguyên lớn không giới hạn

viết chương trình định nghĩa kiểu số nguyên lớn không giới hạn, lập trình thực hiện các phép toán công (+) trừ (-) nhân (*) chia (/) các số nguyên lớn đó. thông thường ta thấy các kiểu float, int có giới hạn của nó, khi vượt quá giớ hạn thì báo lỗi hoặc cho kết quả sai, sau khi học qua danh sách liên kết thì t có thực hiện bài tập giải quyết số nguyên lớn không giới hạn, định nghĩa và thiết kế thuật toán công trừ nhân chia các số nguyên lớn đó. dưới đây là code của chương trình đó, tuy nhiên t không viết chú thích nên có phần khó. dã học qua danh sách liên kết và năm rõ về nó thì sẽ dễ đọc code hơn. mỗi node trong danh sách sẽ lưu 1 chữ só của số nguyên lớn, 1 biến kiểu char trong danh sách để lưu dấu ccủa số là dương hay âm. giá trị của mỗi node trong danh sách theo thứ tự từ đầu đến cuối là giá trị các chữ số của số nguyên lớn. do đó khi công trừ nhân chia, ta duyệt từng node trong danh sách là tiến hành tính toán trên đó, cộng trừ nhân thì thực hiện từ cuối lên đầu, còn chia thì thực hiện duyệt từ đầu đến cuối
#include<iostream>
#include<string>
#include<Windows.h>
using namespace std;
typedef struct tagnode
{
    int x;
    struct tagnode *next;
    struct tagnode *pre;
}node;
typedef struct tagsolon
{
    char c;
    node *dau;
    node *cuoi;
}solon;
void xuat(solon n);
void taosolon(solon &n);
node *taonode(int x);
void themdau(solon &n,node *p);
void nhap(solon &n);
void cong(solon n1,solon n2,solon &n);
void tru(solon n1,solon n2,solon &n);
int sosanh(solon n1,solon n2);
void nhan(solon n1,solon n2,solon &n);
void nhan1so(solon n1,int x,solon &n);
void themcuoi(solon &n,node *p);
void xoa(solon &n);
void xoatruocQ(solon &n,node *Q);
void xoacuoi(solon &n);
void chia(solon n1,solon n2,solon &n);
void xuly(solon &n);

void main()
{
    solon n,n1,n2;
    taosolon(n);taosolon(n1);taosolon(n2);
    cout<<"nhap 2 so nguyen:\n";
    cout<<"a=";nhap(n1);
    cout<<"b=";nhap(n2);
    cout<<"\n1.cong."
        <<"\n2.tru."
        <<"\n3.nhan."
        <<"\n4.chia.\n\n";
    int k;
    cin>>k;
    switch(k)
    {
    case 1:cong(n1,n2,n);cout<<"a+b = ";xuat(n);cout<<endl;break;
    case 2:tru(n1,n2,n);cout<<"a-b = ";xuat(n);cout<<endl;break;
    case 3:nhan(n1,n2,n);cout<<"a*b = ";xuat(n);cout<<endl;break;
    case 4:chia(n1,n2,n);break;
    }
    system("pause");
}


void chia(solon n1,solon n2,solon &n)
{
    if(n1.c==n2.c) n.c='+';
    else n.c='-';
    int q=sosanh(n1,n2);
    if(q<0)
    {
        cout<<"ket qua = 0 \ndu ";xuat(n1);
    }
    else if(q==0) cout<<"ket qua = 1";
    else
    {
        int i;
        solon a;taosolon(a);
        solon b;taosolon(b);
        solon c;taosolon(c);
        node *p,*p2,*p1;
        p1=n1.dau;
        p2=n2.dau;
        while(p2!=NULL)
        {
            p=taonode(p1->x);
            themcuoi(a,p);
            p1=p1->next;
            p2=p2->next;
        }
        while(p1!=NULL)
        {
            q=sosanh(a,n2);
            if(q<0)
            {
                p=taonode(0);
                themcuoi(n,p);
                p=taonode(p1->x);
                themcuoi(a,p);
            }
            else if(q==0)
            {
                p=taonode(1);
                themcuoi(n,p);
                xoa(a);
                p=taonode(p1->x);
                themcuoi(a,p);
            }
            else
            {
                for(i=1;i<=9;i++)
                {
                    xoa(b);
                    nhan1so(n2,i,b);
                    q=sosanh(a,b);
                    if(q<0)
                    {
                        xoa(b);
                        nhan1so(n2,i-1,b);
                        break;
                    }
                }
                i--;
                p=taonode(i);
                themcuoi(n,p);
                xoa(c);
                tru(a,b,c);
                xoa(a);
                p2=c.dau;
                while(p2!=NULL)
                {
                    p=taonode(p2->x);
                    themcuoi(a,p);
                    p2=p2->next;
                }
                p=taonode(p1->x);
                themcuoi(a,p);
            }
            if(p1!=NULL)p1=p1->next;
        }
        // thuc hien 1 lan nua
        q=sosanh(a,n2);
        if(q<0)
        {
            p=taonode(0);
            themcuoi(n,p);
        }
        else if(q==0)
        {
            p=taonode(1);
            themcuoi(n,p);
        }
        else
        {
            for(i=1;i<=9;i++)
            {
                xoa(b);
                nhan1so(n2,i,b);
                q=sosanh(a,b);
                if(q<0)
                {
                    xoa(b);
                    nhan1so(n2,i-1,b);
                    break;
                }
            }
            i--;
            p=taonode(i);
            themcuoi(n,p);
            xoa(c);
            tru(a,b,c);
            xoa(a);
            p2=c.dau;
            while(p2!=NULL)
            {
                p=taonode(p2->x);
                themcuoi(a,p);
                p2=p2->next;
            }
        }
        if(p1!=NULL)p1=p1->next;
        //end
        xuly(n);xuly(a);
        cout<<"a/b = ";xuat(n);cout<<endl;
        if(a.dau!=NULL)
        {
            cout<<"du ";
            xuat(a);
            cout<<endl;
        }
    }
}
void xoatruocQ(solon &n,node *Q)
{
    if(Q==NULL) xoacuoi(n);
    else
    {
        node *p=Q->pre;
        if(p!=NULL)
        {
            if(p==n.dau)
            {
                n.dau=Q;
                n.dau->pre=NULL;
                delete p;
            }
            else
            {
                p->pre->next=Q;
                Q->pre=p->pre;
                delete p;
            }
        }
    }
}
void xuly(solon &n)
{
    node *p=n.dau;
    while(p!=NULL && p->x==0)
    {
        p=p->next;
        xoatruocQ(n,p);
    }
}
void nhan(solon n1,solon n2,solon &n)
{
    node *p,*p1,*p2;
    long long i,dem=0;
    solon a;taosolon(a);
    solon b;taosolon(b);
    p=n2.cuoi;
    while(p!=NULL)
    {
        xoa(a);
        nhan1so(n1,p->x,a);
        for(i=0;i<dem;i++)
        {
            p1=taonode(0);
            themcuoi(a,p1);
        }
        xoa(b);
        p2=n.cuoi;
        while(p2!=NULL)
        {
            p1=taonode(p2->x);
            themdau(b,p1);
            p2=p2->pre;
        }
        xoa(n);
        cong(a,b,n);
        p=p->pre;
        dem++;
    }
    if(n1.c==n2.c) n.c='+';
    else n.c='-';
    xuly(n);
}
void xoa(solon &n)
{
    while(n.dau!=NULL) xoacuoi(n);
}
void xoacuoi(solon &n)
{
    node *p=n.cuoi;
    if(p!=NULL)
    {
        if(n.dau==n.cuoi)
        {
            n.dau=n.cuoi=NULL;
            delete p;
        }
        else
        {
            n.cuoi=p->pre;
            n.cuoi->next=NULL;
            delete p;
        }
    }
}
void themcuoi(solon &n,node *p)
{
    if(n.dau==NULL)n.dau=n.cuoi=p;
    else
    {
        n.cuoi->next=p;
        p->pre=n.cuoi;
        n.cuoi=p;
    }
}
void nhan1so(solon n1,int x,solon &n)
{
    node *p1,*p;
    int k,m=0;
    p1=n1.cuoi;
    while(p1!=NULL)
    {
        k=p1->x*x+m;
        if(k>=10)
        {
            m=k/10;
            k=k%10;
        }
        else m=0;
        p=taonode(k);
        themdau(n,p);
        p1=p1->pre;
    }
    if(m>0)
    {
        p=taonode(m);
        themdau(n,p);
    }
}
void tru(solon n1,solon n2,solon &n)
{
    int q=sosanh(n1,n2);
    int k,m;
    node *p,*p1,*p2;
    if(q==0) return;
    if(n1.c=='+' && n2.c=='+')
    {
        if(q>0)
        {
            m=0;n.c='+';
            p1=n1.cuoi;p2=n2.cuoi;
            while(p1!=NULL && p2!=NULL)
            {
                if(p1->x < (p2->x + m))
                {
                    k=10+p1->x-p2->x-m;
                    m=1;
                }
                else
                {
                    k=p1->x-p2->x-m;
                    m=0;
                }
                p=taonode(k);
                themdau(n,p);
                p1=p1->pre;
                p2=p2->pre;
            }
            while(p1!=NULL)
            {
                if(p1->x < m)
                {
                    k=10+p1->x-m;
                    m=1;
                }
                else
                {
                    k=p1->x-m;
                    m=0;
                }
                p=taonode(k);
                themdau(n,p);
                p1=p1->pre;
            }
        }
        else
        {
            m=0;n.c='-';
            p1=n1.cuoi;p2=n2.cuoi;
            while(p1!=NULL && p2!=NULL)
            {
                if(p2->x < (p1->x + m))
                {
                    k=10+p2->x-p1->x-m;
                    m=1;
                }
                else
                {
                    k=p2->x-p1->x-m;
                    m=0;
                }
                p=taonode(k);
                themdau(n,p);
                p2=p2->pre;
                p1=p1->pre;
            }
            while(p2!=NULL)
            {
                if(p2->x < m)
                {
                    k=10+p2->x-m;
                    m=1;
                }
                else
                {
                    k=p2->x-m;
                    m=0;
                }
                p=taonode(k);
                themdau(n,p);
                p2=p2->pre;
            }
        }
    }
    else if(n1.c=='-' && n2.c=='-')
    {
        if(q>0)
        {
            m=0;n.c='-';
            p1=n1.cuoi;p2=n2.cuoi;
            while(p1!=NULL && p2!=NULL)
            {
                if(p1->x < (p2->x + m))
                {
                    k=10+p1->x-p2->x-m;
                    m=1;
                }
                else
                {
                    k=p1->x-p2->x-m;
                    m=0;
                }
                p=taonode(k);
                themdau(n,p);
                p1=p1->pre;
                p2=p2->pre;
            }
            while(p1!=NULL)
            {
                if(p1->x < m)
                {
                    k=10+p1->x-m;
                    m=1;
                }
                else
                {
                    k=p1->x-m;
                    m=0;
                }
                p=taonode(k);
                themdau(n,p);
                p1=p1->pre;
            }
        }
        else
        {
            m=0;n.c='+';
            p1=n1.cuoi;p2=n2.cuoi;
            while(p1!=NULL && p2!=NULL)
            {
                if(p2->x < (p1->x + m))
                {
                    k=10+p2->x-p1->x-m;
                    m=1;
                }
                else
                {
                    k=p2->x-p1->x-m;
                    m=0;
                }
                p=taonode(k);
                themdau(n,p);
                p2=p2->pre;
                p1=p1->pre;
            }
            while(p2!=NULL)
            {
                if(p2->x < m)
                {
                    k=10+p2->x-m;
                    m=1;
                }
                else
                {
                    k=p2->x-m;
                    m=0;
                }
                p=taonode(k);
                themdau(n,p);
                p2=p2->pre;
            }
        }
    }
    else if(n1.c=='+' && n2.c=='-')
    {
        n2.c='+';
        cong(n1,n2,n);
    }
    else if(n1.c=='-' && n2.c=='+')
    {
        n2.c='-';
        cong(n1,n2,n);
    }
    xuly(n);
}
void cong(solon n1,solon n2,solon &n)
{
    if(n1.c==n2.c)
    {
        n.c=n1.c;
        int k,m=0;
        node *p1=n1.cuoi,*p2=n2.cuoi,*p;
        while(p1!=NULL && p2!=NULL)
        {
            k=p1->x+p2->x+m;
            if(k>=10)
            {
                m=k/10;
                k=k%10;
            }
            else m=0;
            p=taonode(k);
            themdau(n,p);
            p1=p1->pre;
            p2=p2->pre;
        }
        while(p1!=NULL)
        {
            k=p1->x+m;
            if(k>=10)
            {
                m=k/10;
                k=k%10;
            }
            else m=0;
            p=taonode(k);
            themdau(n,p);
            p1=p1->pre;
        }
        while(p1!=NULL)
        {
            k=p1->x+m;
            if(k>=10)
            {
                m=k/10;
                k=k%10;
            }
            else m=0;
            p=taonode(k);
            themdau(n,p);
            p1=p1->pre;
        }
        if(m>0)
        {
            p=taonode(m);
            themdau(n,p);
        }

    }
    else if(n1.c=='+' && n2.c=='-')
    {
        n2.c='+';
        tru(n1,n2,n);
    }
    else
    {
        n1.c='+';
        tru(n2,n1,n);
    }
    xuly(n);
}
int sosanh(solon n1,solon n2)
{
    node *p1=n1.cuoi,*p2=n2.cuoi;
    while(p1!=NULL && p2!=NULL)
    {
        p1=p1->pre;
        p2=p2->pre;
    }
    if(p1==NULL && p2!=NULL) return -1;
    if(p1!=NULL && p2==NULL) return 1;
    if(p1==NULL && p2==NULL)
    {
        p1=n1.dau;
        p2=n2.dau;
        while(p1!=NULL && p2!=NULL)
        {
            if(p1->x > p2->x) return 1;
            if(p1->x < p2->x) return -1;
            p1=p1->next;
            p2=p2->next;
        }
        return 0;
    }
}
void xuat(solon n)
{
    node *p=n.dau;
    if(p==NULL)
    {
        cout<<0;
        return;
    }
    if(p!=NULL && n.c=='-') cout<<n.c;
    while(p!=NULL)
    {
        cout<<p->x;
        p=p->next;
    }
}
void taosolon(solon &n)
{
    n.c='+';
    n.dau=n.cuoi=NULL;
}
node *taonode(int x)
{
    node *p=new node;
    if(p==NULL) exit(1);
    p->x=x;
    p->next=p->pre=NULL;
    return p;
}
void themdau(solon &n,node *p)
{
    if(n.dau==NULL) n.dau=n.cuoi=p;
    else
    {
        p->next=n.dau;
        n.dau->pre=p;
        n.dau=p;
    }
}
void nhap(solon &n)
{
    string s;
    node *p;
    long long i,j=0;
    getline(cin,s);
    if(s[0]=='-')
    {
        n.c='-';
        j=1;
    }
    else if(s[0]=='+')
    {
        n.c='+';
        j=1;
    }
    else n.c='+';
    for(i=s.size()-1;i>=j;i--)
    {
        switch(s[i])
        {
        case '0':p=taonode(0);break;
        case '1':p=taonode(1);break;
        case '2':p=taonode(2);break;
        case '3':p=taonode(3);break;
        case '4':p=taonode(4);break;
        case '5':p=taonode(5);break;
        case '6':p=taonode(6);break;
        case '7':p=taonode(7);break;
        case '8':p=taonode(8);break;
        case '9':p=taonode(9);break;
        }
        themdau(n,p);
    }
}
trên đây là toàn bộ code của chương trình cộng trừ nhân chia số nguyên lớn không giới hạn. code hơi dài, t mất 10 tiếng đồng hồ để suy nghĩ cách làm và cài đặt code, pro đọc qua thấy hay thì like và cải tiến code hoặc gởi form liên hệ code hay hơn để t học hỏi nhé!

cộng trừ nhân chia đa thức bậc n bất kỳ

viết chương trình c/c++ thực hiện định nghĩa đa thức bậ n bất kỳ và cộng trừ nhân chia trên đa thức. cách làm của Toàn dưới đây là dùng danh sách liên kết đôi để làm. mỗi node sẽ lưu 1 số hạng gồm 2 thông tin là hệ số và số mũ, ngoài thông tin còn có 2 con trỏ của danh sách liên kết. cộng trừ nhân chia đa thức theo kiểu này gây khó khăn cho lập trình nhưng chương trình được tối ưu và chạy nhanh.
#include<iostream>
using namespace std;
typedef struct tagnode
{
    float heso,somu;
    struct tagnode *next,*pre;
}node;
node *taonode(float heso,float somu)
{
    node *p=new node;
    if(p==NULL) exit(1);
    p->heso=heso;
    p->somu=somu;
    p->next=p->pre=NULL;
    return p;
}
typedef struct tagdathuc
{
    node*dau,*cuoi;
}dathuc;
void taodathuc(dathuc &l)
{
    l.dau=l.cuoi=NULL;
}
void themcuoi(dathuc &l,node *p)
{
    if(l.dau==NULL) l.dau=l.cuoi=p;
    else
    {
        l.cuoi->next=p;
        p->pre=l.cuoi;
        l.cuoi=p;
    }
}
void nhap(dathuc &l)
{
    node *p;
    float heso,somu;
    cout<<"nhap so da thuc, ket thuc khi nhap he so = 0\n";
    do{
        cout<<"he so = ";cin>>heso;
        if(heso!=0)
        {
            cout<<"so mu = ";cin>>somu;
            p=taonode(heso,somu);
            themcuoi(l,p);
        }
        cout<<endl;
    }while(heso!=0);
}
void xuat(dathuc l)
{
    node *p=l.dau;
    if(p==NULL)
    {
        cout<<0;
        return;
    }
    while(p!=NULL)
    {
        if(p==l.dau)
        {
            if(p->somu==0) cout<<p->heso;
            else if(fabs(p->heso)!=1 && p->somu!=1) cout<<p->heso<<"X^"<<p->somu;
            else if(fabs(p->heso)!=1 && p->somu==1) cout<<p->heso<<"X";
            else if(fabs(p->heso)==1 && p->somu!=1) cout<<(p->heso==1?"X^":"-X^")<<p->somu;
            else cout<<(p->heso==1?"X":"-X");
        }
        else
        {
            if(p->somu==0) cout<<(p->heso<0?" - ":" + ")<<fabs(p->heso);
            else if(fabs(p->heso)!=1 && p->somu!=1) cout<<(p->heso<0?" - ":" + ")<<fabs(p->heso)<<"X^"<<p->somu;
            else if(fabs(p->heso)!=1 && p->somu==1) cout<<(p->heso<0?" - ":" + ")<<fabs(p->heso)<<"X";
            else if(fabs(p->heso)==1 && p->somu!=1) cout<<(p->heso==1?" + X^":" - X^")<<p->somu;
            else cout<<(p->heso==1?" + X":" - X");
        }
        p=p->next;
    }
}
void sapxep(dathuc &l)
{
    node *p1=l.dau,*p2;
    while(p1!=NULL)
    {
        p2=p1->next;
        while(p2!=NULL)
        {
            if(p2->somu>p1->somu)
            {
                swap(p1->heso,p2->heso);
                swap(p1->somu,p2->somu);
            }
            p2=p2->next;
        }
        p1=p1->next;
    }
}
void xoatruocQ(dathuc &l,node *Q)
{
    node *p;
    if(Q==NULL)
    {
        p=l.cuoi;
        if(l.dau==l.cuoi)
        {
            l.dau=l.cuoi=NULL;
            delete p;
        }
        else if(p!=NULL)
        {
            l.cuoi=l.cuoi->pre;
            l.cuoi->next=NULL;
            delete p;
        }
    }
    else
    {
        p=Q->pre;
        if(p!=NULL)
        {
            if(p==l.dau)
            {
                l.dau=l.dau->next;
                l.dau->pre=NULL;
                delete p;
            }
            else
            {
                p->pre->next=Q;
                Q->pre=p->pre;
                delete p;
            }
        }
    }
}
void rutgon(dathuc &l)
{
    node *p1=l.dau,*p2;
    while(p1!=NULL)
    {
        p2=p1->next;
        while(p2!=NULL)
        {
            if(p2->somu==p1->somu)
            {
                p1->heso+=p2->heso;
                p2=p2->next;
                xoatruocQ(l,p2);
            }
            else p2=p2->next;
        }
        p1=p1->next;
    }
}
void themtruocQ(dathuc &l,node *Q,node *p)
{
    if(Q==l.dau)
    {
        l.dau->pre=p;
        p->next=l.dau;
        l.dau=p;
    }
    else
    {
        p->pre=Q->pre;
        p->next=Q;
        Q->pre->next=p;
        Q->pre=p;
    }
}
void insert(dathuc &l,node *p)
{
    node *p1=l.dau;
    while(p1!=NULL && p1->somu > p->somu) p1=p1->next;
    if(p1!=NULL)
    {
        if(p1->somu == p->somu) p1->heso += p->heso;
        else themtruocQ(l,p1,p);
    }
    else themcuoi(l,p);
}
void xuly(dathuc &l)
{
    node *p=l.dau;
    while(p!=NULL)
    {
        if(p->heso==0)
        {
            p=p->next;
            xoatruocQ(l,p);
        }
        else p=p->next;
    }
}
int cong(dathuc l1,dathuc l2,dathuc &l)
{
    node *p=l1.dau,*a;
    while(p!=NULL)
    {
        a=taonode(p->heso,p->somu);
        themcuoi(l,a);
        p=p->next;
    }
    p=l2.dau;
    while(p!=NULL)
    {
        a=taonode(p->heso,p->somu);
        insert(l,a);
        xuly(l);
        p=p->next;
    }
    xuly(l);
    if(l.dau==NULL) return 0;
    return 1;
}
int tru(dathuc l1,dathuc l2,dathuc &l)
{
    node *p=l2.dau;
    while(p!=NULL)
    {
        p->heso=-p->heso;
        p=p->next;
    }
    cong(l1,l2,l);
    p=l2.dau;
    while(p!=NULL)
    {
        p->heso=-p->heso;
        p=p->next;
    }
    if(l.dau==NULL) return 0;
    return 1;
}
int nhan(dathuc l1,dathuc l2,dathuc &l)
{
    node *p,*p1,*p2;
    p2=l2.dau;
    while(p2!=NULL)
    {
        p1=l1.dau;
        while(p1!=NULL)
        {
            p=taonode(p2->heso*p1->heso,p2->somu+p1->somu);
            insert(l,p);
            p1=p1->next;
        }
        p2=p2->next;
    }
    xuly(l);
    if(l.dau==NULL) return 0;
    return 1;
}
void xoacuoi(dathuc &l)
{
    node *p=l.cuoi;
    if(p==NULL) exit(1);
    if(l.dau==l.cuoi)
    {
        l.dau=l.cuoi=NULL;
        delete p;
    }
    else
    {
        l.cuoi=p->pre;
        l.cuoi->next=NULL;
        delete p;
    }
}
void xoa(dathuc &l)
{
    while(l.dau!=NULL) xoacuoi(l);
}
void chia(dathuc l1,dathuc l2)
{
    node *p,*p1;
    dathuc a,b,du;
    taodathuc(a);taodathuc(b);taodathuc(du);
    p1=l1.dau;
    while(p1!=NULL)
    {
        p=taonode(p1->heso,p1->somu);
        themcuoi(du,p);
        p1=p1->next;
    }
    while(du.dau!=NULL && du.dau->somu >= l2.dau->somu)
    {
        p=taonode(du.dau->heso / l2.dau->heso,du.dau->somu - l2.dau->somu);
        themcuoi(a,p);
        xoa(b);
        if(nhan(l2,a,b)==0) break;
        xoa(du);
        if(tru(l1,b,du)==0) break;
    }
    xuat(a);
    if(du.dau!=NULL)
    {
        cout<<"\n du ";
        xuat(du);
    }
}
void main()
{
    dathuc l1,l2,l;
    taodathuc(l1);taodathuc(l2);taodathuc(l);
    nhap(l1);nhap(l2);
    rutgon(l1);sapxep(l1);
    cout<<"\nda thuc 1 = ";xuat(l1);cout<<endl;
    rutgon(l2);sapxep(l2);
    cout<<"\nda thuc 2 = ";xuat(l2);cout<<endl;
    int k;
    cout<<"\n\n1.cong da thuc 1+2"
        <<"\n2.tru da thuc 1-2"
        <<"\n3.nhan da thuc 1*2"
        <<"\n4.chia da thuc 1/2\n";
    cin>>k;
    cout<<"ket qua = ";
    switch(k)
    {
    case 1:cong(l1,l2,l);xuat(l);break;
    case 2:tru(l1,l2,l);xuat(l);break;
    case 3:nhan(l1,l2,l);xuat(l);break;
    case 4:chia(l1,l2);break;
    }
    cout<<endl;
    system("pause");
}
trên đây là toàn bộ code của chương trình c/c++ cộng trù nhân chia đa thức bậc n bất kỳ bằng phương pháp sử dụng danh sách liên kết đôi.