Thiết kế C_C++mã hoa1_32giai mã tham khảo

 

#include <iostream>

#include <sstream>

#include <fstream>

#include <vector>

#include <map>

#include <bitset>

#include <limits.h>

#include <algorithm>

#include <string>

#include <cctype>

#include <bits/stdc++.h>

using namespace std;

 

class MyClass {

public:

    struct Point {

        long long x;

        int y;

        string mrs;

        vector<string> vmrs;

    };

 

    void Mahoa(Point &Ec) {

        string mbs = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        long long num = Ec.x;

        int bs = Ec.y;

        string tms = "";

 

        while (num > 0) {

            int tm = num % bs;

            tms = mbs[tm] + tms;

            num /= bs;

        }

        Ec.vmrs.push_back(tms);

        Ec.mrs += tms + "|";

    }

    Point mahoavii(const long long &xi = 0,const int &base = 7,

            const string &si = "",const vector<int> &v = {}) {

                        vector <int> vv=v;

                        Point pt;

                        pt.x = (xi < 1||xi > LLONG_MAX) ? 0 : xi;

        pt.y = (base < 1 || base > 32) ? 7 : base;

        pt.mrs = (si.empty()) ? si : "";

        if (vv.empty()) {vv.push_back(xi);

        } else {

            for (auto val : vv) {

                pt.x = val;

                Mahoa(pt);

            }

        }

        return pt;

    }

};

 

// ======================

// Class gia ma

// ======================

class RClass {

public:

    struct Point {

        long long x;

        int y;

        string mrs;

        vector<string> vmrs;

    };

 

    void Giaima(Point &Ec) {

        string token,tm="";

        stringstream ss(Ec.mrs);

 

        while (getline(ss, token, '|')) {

            if (token.empty()) continue;

 

            long long num = 0;

            for (char c : token) {

                int value = -1;

                if (isdigit(c)) value = c - '0';

                else if (c >= 'A' && c <= 'Z') value = c - 'A' + 10;

                else if (c >= 'a' && c <= 'z') value = c - 'a' + 10;

 

                if (value < 0 || value >= Ec.y) {

                    cout << "Ky tu " << c << " khong hop le trong he " << Ec.y << endl;

                    continue;

                }

                num = num * Ec.y + value;

            }

            tm+=to_string(num);

        }Ec.mrs.clear(); Ec.mrs=tm;

                        vector <string> ddd;

                        for(auto d:Ec.vmrs){

                                    for (char c : d) {

                int value = -1;

                if (isdigit(c)) value = c - '0';

                else if (c >= 'A' && c <= 'Z') value = c - 'A' + 10;

                else if (c >= 'a' && c <= 'z') value = c - 'a' + 10;

 

                if (value < 0 || value >= Ec.y) {

                    cout << "Ky tu " << c << " khong hop le trong he " << Ec.y << endl;

                    continue;

                }

                ddd.push_back(to_string(value));

            }         

                        }

                        Ec.vmrs.clear();

                        Ec.vmrs=ddd;

                        string kt;

                        for(auto j:Ec.vmrs){

                                    kt+=j+"|";

                                    if (kt==Ec.mrs) Ec.x = 0;

                        }

    }

    Point giaimavii(const long long &xi = 0,const int &base = 7,

            const string &si = "",const vector<string> &v = {}) {

                        vector<string> vd=v;

                        Point pt;

                        MyClass::Point pti;

                        pt.y = (base < 1 || base > 32) ? pti.y : base;

                        pt.x = (xi < 1||xi > LLONG_MAX) ? 0 : xi;

        pt.mrs = (si.empty()) ? pti.mrs : si;

        if (vd.empty()) vd.push_back(to_string(pt.x));

        else pt.vmrs=vd;

        Giaima(pt);

        return pt;

    }

};

class NhatTruong {

private:

    // ===== DAY CAC BIEN SO BM =====

    string ss, df, kqxl;

    char ch;

    double db;

    int so;

    vector<double> vec;

    vector<int> vii;

    vector<pair<int,int>> vp;

    vector<vector<double>> vvc;

    map<long long,int> mp;

    bitset<50> bits;

public:

    // ===== NHAP VA XUAT BIEN & Getter/Setter =====

    NhatTruong(): ss(""), ch('\0'), vec(), vp(), db(0), so(0), mp(), df(""), vii(), vvc() ,kqxl(""){};

~NhatTruong() {      cout << "thoat memory\n";}

           

    // Getter

    string getss(){ return ss; };

    string getdf(){ return df; };

    char getch(){ return ch; };

    double getdb(){ return db; };

    int getso(){ return so; };

    vector<double> getvec(){ return vec; };

    vector<int> getvii(){ return vii; };

    vector<pair<int,int>> getvp(){ return vp; };

    map<long long,int> getmp(){ return mp; };

 

    // Setter

    void setws(const string &dat){ ss = dat; } ;

    void setwdf(const string &dat) { df = dat; } ;

    void setwso(int dat){ so = dat; } ;

    void setwdb(double dat){ db = dat; } ;

    void setwch(char dat){ ch = dat; } ;

 

    // ===== XU LI  file =====

// ===== Doc file line den ss && vii =====

    void docfl (const string& tenf = ""){

string tenif = tenf.empty() ? "input.txt" : tenf;

        ifstream fin(tenif);

        if (!fin.is_open()){

            cerr << "Khong the mo file du lieu\n";

            ofstream fout(tenif);

            fout.close();

            return;

        }

        string lin;

        bool first = true;

                        ss.clear(); kqxl.clear();df.clear();

// /* while (fin >> lin)  {    */

        while (getline(fin, lin)) {

            ss += lin + " ";

            if (first) {

                df = lin;

                istringstream iss(df);

                iss >> so;

                first = false;

            }

        }

        fin.close();

        chuyenstrstream_vii();

    };

// ===== Doc file den ss&& vec =====

    void docf(const string& tenf = ""){

string tenif = tenf.empty() ? "input.txt" : tenf;

        ifstream fin(tenif);

        if (!fin.is_open()){

            cerr << "Khong the mo file du lieu\n";

            ofstream fout(tenif);

            fout.close();

            return;

        }

        string lin;

        bool first = true;

                        ss.clear(); kqxl.clear();df.clear();

// /* while (getline(fin, lin)) {            */

        while (fin >> lin){

              ss += lin + " ";

            if (first) {

                df = lin;

                istringstream iss(df);

                iss >> so;

                first = false;

            }

        }

        fin.close();

        chuyenstrstream_vec ();

    };

 

// Xuat =====  xuatf(string kq,tenf)   ===== ra file

    void xuatf(const string& kq="", const string& teno = "") {

        string tenof = teno.empty() ? "kqoutput.txt" : teno;

        string kqof = kq.empty() ? kqxl : kq;

        ofstream fout(tenof);

        if (!fout.is_open()) {

            cerr << "Khong the xuat file ket qua\n";

            return;

        }

        fout << kqof << endl;

        fout.close();

    };

// Xuat =====  xuatVec(vec,tenf)  ===== ra file

void xuatVec(const vector<double>& arr = {}, const string& tenf = "") {

    const vector<double>& tmp = arr.empty() ? vec : arr;

    string tenfile = tenf.empty() ? "vecoutput.txt" : tenf; //

    ofstream fout(tenfile);

    if (!fout.is_open()) {

        cerr << "Khong the mo file ket qua\n";

        return;

    }

    for (auto x : tmp) fout << x << " ";

    fout << endl;

    fout.close();

};

 

// Xuat =====  xuatVii(vii,tenf) =====  file

void xuatVii(const vector<int>& arr = {}, const string& tenf = "") {

    const vector<int>& tmp = arr.empty() ? vii : arr;

    string tenfile = tenf.empty() ? "viioutput.txt" : tenf;

    ofstream fout(tenfile);

    if (!fout.is_open()) {

        cerr << "Khong the mo file ket qua\n";

        return;

    }

    for (auto x : tmp) fout << x << " ";

    fout << endl;

    fout.close();

};

// // Xuat =====  xuatVp(vp,tenf) =====  file

void xuatVp(const vector<pair<int,int>>& arr = {}, const string& tenf = "") {

    const vector<pair<int,int>> &tmp = arr.empty() ? vp : arr;

 

    string tenfile = tenf.empty() ? "vpoutput.txt" : tenf;

    ofstream fout(tenfile);

    if (!fout.is_open()) {

        cerr << "Khong the mo file ket qua\n";

        return;

    }

    for (auto &p : tmp) {

        fout << "(" << p.first << ", " << p.second << ") \n";

    }

    fout << endl;

};

 

// Xuat ===== xuatDouble(double val , tenf) ===== ra file

void xuatDouble(double val, const string& tenf = "") {

    string tenfile = tenf.empty() ? "doubleoutput.txt" : tenf;

    ofstream fout(tenfile);

    if (!fout.is_open()) {

        cerr << "Khong the mo file ket qua\n";

        return;

    }

    fout << val << endl;

    fout.close();

};

 

// Xuat ===== xuatInt(int val, tenf) ===== ra file

void xuatInt(int val, const string& tenf = "") {

    string tenfile = tenf.empty() ? "intoutput.txt" : tenf;

    ofstream fout(tenfile);

    if (!fout.is_open()) {

        cerr << "Khong the mo file ket qua\n";

        return;

    }

    fout << val << endl;

    fout.close();

};

 

    // ===== CHUYEN KIEU DATA=====

    // ===== chuyenstrstream_vec(string) =====vec

    bool chuyenstrstream_vec(const string &si = "") {

        string csi = si.empty() ? ss : si; 

        vec.clear();

        stringstream sss(csi);

        double tmp;

        while (sss >> tmp) {

            vec.push_back(tmp);

        }

        return (vec.size()>0);

    };

 // ===== chuyenstr_vec(string) =====vec

    bool chuyenstr_vec(const string &si = "") {

            string csi = si.empty() ? ss : si;

    vec.clear();

    int dau = 1;

    double tmp = 0;

    double heSo = 0.1;

    bool dangDocSo = false;

    bool dangDocThapPhan = false;

 

    for (char c : csi) {

        if (c == '-') {

            if (dangDocSo) {

                vec.push_back(tmp * dau);

                tmp = 0; dau = 1; heSo = 0.1;

                dangDocSo = false; dangDocThapPhan = false;

            }

            dau = -1;

        } else if (isdigit(static_cast<unsigned char>(c))) {

            if (!dangDocThapPhan) {

                tmp = tmp * 10 + (c - '0');

            } else {

                tmp = tmp + (c - '0') * heSo;

                heSo /= 10;

            }

            dangDocSo = true;

        } else if (c == '.') {

            if (!dangDocSo) {

                // bo qua dau cham thua truoc so

                                                continue;

            }

            if (dangDocThapPhan) {

                // gap dau cham lan 2 ngat so

                vec.push_back(tmp * dau);

                tmp = 0; dau = 1; heSo = 0.1;

                dangDocSo = false; dangDocThapPhan = false;

            } else {

                dangDocThapPhan = true;

            }

        } else {

            if (dangDocSo) {

                vec.push_back(tmp * dau);

                tmp = 0; dau = 1; heSo = 0.1;

                dangDocSo = false; dangDocThapPhan = false;

            }

        }

    }

    if (dangDocSo) {

        vec.push_back(tmp * dau);

    }

    return true;

};

   

// ===== chuyenstrstream_vii(string) =====vii

    bool chuyenstrstream_vii(const string &si = "") {

        string csi = si.empty() ? ss : si; 

        vii.clear();

        istringstream sss(csi);

        int tmp;

        while (sss >> tmp) {

            vii.push_back(tmp);

        }

        return (vii.size()>0);

    };

     // ===== chuyenstr_vii(string) =====vii

    bool chuyenstr_vii(const string &si = "") {

            string csi = si.empty() ? ss : si;

    vec.clear();

    int dau = 1;

    double tmp = 0;

    double heSo = 0.1;

    bool dangDocSo = false;

    bool dangDocThapPhan = false;

 

    for (char c : csi) {

        if (c == '-') {

            if (dangDocSo) {

                vii.push_back((int)(tmp * dau));

                tmp = 0; dau = 1; heSo = 0.1;

                dangDocSo = false; dangDocThapPhan = false;

            }

            dau = -1;

        } else if (isdigit(static_cast<unsigned char>(c))) {

            if (!dangDocThapPhan) {

                tmp = tmp * 10 + (c - '0');

            } else {

                tmp = tmp + (c - '0') * heSo;

                heSo /= 10;

            }

            dangDocSo = true;

        } else if (c == '.') {

            if (!dangDocSo) {

                continue;

            }

            if (dangDocThapPhan) {

                vii.push_back((int)(tmp * dau));

                tmp = 0; dau = 1; heSo = 0.1;

                dangDocSo = false; dangDocThapPhan = false;

            } else {

                dangDocThapPhan = true;

            }

        } else {

            if (dangDocSo) {

                vii.push_back((int)(tmp * dau));

                tmp = 0; dau = 1; heSo = 0.1;

                dangDocSo = false; dangDocThapPhan = false;

            }

        }

    }

    if (dangDocSo) {

        vii.push_back((int)(tmp * dau));

    }

    return true;

};

 

// ===== chuyenvec_str(arr vec) =====s1

    string chuyenvec_str(const vector<double> &arr={}){

        const vector<double> &tmp = arr.empty() ? vec : arr;

        if (tmp.empty()) return "";

        string s;

        for(auto x:tmp){

            s += to_string(x) + " ";

        }

        return s;

    };

// ===== chuyenvec_strn(arr vec) =====s2

    string chuyenvec_strn(const vector<double> &arr={}) {

        const vector<double> &tmp = arr.empty() ? vec : arr;

        if (tmp.empty()) return "";

        string s;

        for (auto x : tmp) {

            ostringstream oss;

            oss << x;

            s += oss.str();

            s += " ";

        }

        return s;

    };

// ===== chuyenvii_str (arr vii) =====s1

    string chuyenvii_str(const vector<int> &v = {}) {

        const vector<int> &tmp = v.empty() ? vii : v;

        if (tmp.empty()) return "";

        string s;

        for (auto x : tmp) {

            s += to_string(x) + " ";

        }

        return s;

    };

// ===== chuyenvii_strn (arr vii) =====s2

    string chuyenvii_strn(const vector<int> &v={}) {

        const vector<int> &tmp = v.empty() ? vii : v;

        if (tmp.empty()) return "";

        string s;

        for (auto x : tmp) {

            ostringstream oss;

            oss << x;

            s += oss.str();

            s += " ";

        }

        return s;

    };

// ===== chuyenint_str (int ii) =====to_string()

    string chuyenint_str(int ii = -1) {

        int tmp = (ii == -1) ? so : ii;

        return to_string(tmp);

    };

// ===== chuyendb_str(double ii) =====to_string()

    string chuyendb_str(double ii = 0.0) {

        double tmp = (ii == 0.0) ? db : ii;

        return to_string(tmp);

    };

// ===== chuyenstr_db (string si) =====string df

    double chuyenstr_db(const string &si = "") {

        string csi = si.empty() ? df : si;

        istringstream sss(csi);

        double tmp = 0.0;

        sss >> tmp;

        return tmp;

    };

// ===== chuyenstr_int (string si) =====string df

    int chuyenstr_int(const string &si = "") {

        string csi = si.empty() ? df : si;

        istringstream sss(csi);

        int tmp = 0;

        sss >> tmp;

        return tmp;

    };

// ===== MyClass::Point mahoavii(a,b,c,d) =====

    MyClass::Point mavii(const long long &x = 0,const int &base = 7,

                        const string &si = "|",const vector<int> &v = {}) {

    long long mx = (x < 1 ? 0 : x);

    int mbase = (base < 1 || base > 32) ? 7 : base;

    string sii = (si.empty()) ? "|" : si;

    MyClass mc;

    auto pt = mc.mahoavii(mx, mbase, si,v);

    return pt;

};

    RClass::Point giaimav(const long long &x = 0,const int &base = 7,

                        const string &si = "",const vector<int> &v = {}) {

            MyClass::Point pti;

            long long mx = (x < 1||x>LLONG_MAX) ? 0 : x;

    int mbase = (base < 1 || base > 32) ? pti.y : base;

    string sii = (si.empty()) ? pti.mrs : si;

    vector<string> vi;

            for(auto c:v) vi.push_back(to_string(c));

            if(vi.empty()) vi.push_back(to_string(mx));

            vi = (vi[0]=="0") ? pti.vmrs : vi;

    RClass mcr;

    auto pt = mcr.giaimavii(mx,mbase,sii,vi);

    return pt;

};

// ===== HAM THONG KE & Logic =====

// ===== tongVec (double arr) =====vec

double tongVec(const vector<double> &arr = {}) {

    const vector<double> &tmp = arr.empty() ? vec : arr;

    double sum = 0;

    for (auto x : tmp) sum += x;

    return sum;

};

// ===== tongVii (int arr) =====vii

int tongVii(const vector<int> &arr = {}) {

    const vector<int> &tmp = arr.empty() ? vii : arr;

    int sum = 0;

    for (auto x : tmp) sum += x;

    return sum;

};

// ===== trungBinhVec (double arr) =====vec

double trungBinhVec(const vector<double> &arr = {}) {

    const vector<double> &tmp = arr.empty() ? vec : arr;

    if (tmp.empty()) return 0;

    return tongVec(tmp) / tmp.size();

};

// ===== minVec (double arr) =====vec

double minVec(const vector<double> &arr = {}) {

    const vector<double> &tmp = arr.empty() ? vec : arr;

    if (tmp.empty()) return 0;

    return *min_element(tmp.begin(), tmp.end());

};

// ===== minVii (int arr) =====vii

int minVii(const vector<int> &v = {}) {

    const vector<int> &tmp = v.empty() ? vii : v;

    if (tmp.empty()) return 0;

    return *min_element(tmp.begin(), tmp.end());

};

// ===== maxVec (double arr) =====vec

double maxVec(const vector<double> &arr = {}) {

    const vector<double> &tmp = arr.empty() ? vec : arr;

    if (tmp.empty()) return 0;

    return *max_element(tmp.begin(), tmp.end());

};

// ===== maxVii (int arr) =====vii

int maxVii(const vector<int> &v = {}) {

    const vector<int> &tmp = v.empty() ? vii : v;

    if (tmp.empty()) return 0;

    return *max_element(tmp.begin(), tmp.end());

};

// ===== demTu1 (string si) =====ss

  int demTu1(const string &si="") {

        string csi = si.empty() ? ss : si;

        stringstream ssin(csi);

        string word;

        int count = 0;

        while (ssin >> word) count++;

        return count;

    };

// ===== demTu2 (string si) =====ss

  int demTu2(const string &si="") {

        string csi = si.empty() ? kqxl : si;

        stringstream ssin(csi);

        string word;

        int count = 0;

        while (ssin >> word) count++;

        return count;

    };

    // /*===== duyet_vec([](double &x)) =====ss===vd duyet_vec([](double &x)) {x *= 2;}; */

    void duyet_vec(const std::function<void(double&)> &func) {

    for (auto &x : vec) {

        func(x);

    }

};

// /*===== duyet_vii([](int &x)) =====ss===vd duyet_vii([](int &x)) {x *= 2;}; */

    void duyet_vii(const std::function<void(int&)> &func) {

    for (auto &x : vii) {

        func(x);

    }

};

 

// ===== Giao dien nguoi dung =====khoidong()

    void khoidong1(){

            cout << "Ban muon nhap du lieu tu file hay truc tiep (f/p): ";

    char tl;

    cin >> tl;

    if(tl == 'f' || tl == 'F'){

        cout << "Nhap ten file input (vd: input.txt): ";

        string ten;

        cin >> ten;

        docf(ten);

    }

    else {

        cout << "Nhap chuoi du lieu dau vao: ";

        cin.ignore();

        string dv="";

        getline(cin, dv);

        ss.clear();kqxl.clear();df.clear();

        setws(dv);

        chuyenstrstream_vec();

        so=(int)vec[0];

        df=to_string(so);

    }

};

// ===== Giao dien khoi dong =====khoidong()

    void khoidong2(){

            cout << "Ban muon nhap du lieu tu file hay truc tiep (f/p): \n";

    char tl;

    cin >> tl;

    if(tl == 'f' || tl == 'F'){

        cout << "Nhap ten file input (vd: input.txt): \n";

        string ten;

        cin >> ten;

        docfl(ten);

    }

    else {

        cout << "Nhap chuoi du lieu dau vao: \n";

        cin.ignore();

        string dv="";

        getline(cin, dv);

        ss.clear();kqxl.clear();df.clear();

        setws(dv);

        chuyenstrstream_vii();

        so=vii[0];

        df=to_string(so);

    }

            };

// ===== Giao dien menu nguoi dung =====Tmenu(tenfile xuat.txt)

    void Tmenu() {

        int chon;

        do {

            cout << "\n===== MENU =====\n";

            cout << "1. Khoi dong 1(nhap chuoi || file || so thuc)\n";

            cout << "2. Khoi dong 2(nhap chuoi || file || so nguyen)\n";

            cout << "3. Xem du lieu nhap 1\n";

            cout << "4. Xem du lieu nhap 2\n";

            cout << "5. Dem so tu trong chuoi1\n";

            cout << "6. Dem so tu trong chuoi2\n";

            cout << "7. Xuat chuoi ket qua ra file\n";

            cout << "8. Xuat mang double ra file\n";

            cout << "9. Xuat mang int ra file\n";

            cout << "10. Xuat mang pair ra file\n";

            cout << "11. Xuat so double ra file\n";

            cout << "12. Xuat so int ra file\n";

            cout << "13. Chuan chuyen chuoi sang vector so thuc mo rong \n";

            cout << "14. Chuan chuyen chuoi sang vector so nguyen mo rong \n";

            cout << "15. Ma hoa \n";

            cout << "16. Giai Ma \n";

            cout << "0. Thoat\n";

            cout << "================\n";

            cout << "Moi ban chon chuc nang: ";

            cin >> chon;

            cin.ignore();

 

            switch (chon) {

                case 1: khoidong1(); break;

                case 2: khoidong2(); break;

                        case 3: {

                vector<double> v = getvec();

                cout << "Data input " << ss << "\n";

                cout << "Vector: " << chuyenvec_strn(v) << "\n";

                                    cout << "Du lieu dau file " << df << "\n";

                break;

            }

            case 4: {

                vector<int> v = getvii();

                cout << "Data input " << ss << "\n";

                cout << "Vector: " << chuyenvii_strn(v) << "\n";

                                    cout << "Du lieu dau file " << df << "\n";

                break;

            }

             case 5: cout << "So tu trong chuoi nhap " << demTu1() << "\n"; break;

                case 6: cout << "So tu trong chuoi kq= " << demTu2() << "\n"; break;

                case 7: {

                    cout << "Ban hay nhap ten tep muon xem ket qua hoac enter mac dinh: ";

                    string tenoff;

                    getline(cin, tenoff);

                    if (tenoff.empty()) tenoff = "NTmacdinh7.txt";

                    xuatf(kqxl, tenoff);

                    break;

                }

                case 8: {

                    cout << "Ban hay nhap ten tep muon xem ket qua hoac enter mac dinh: ";

                    string tenoff;

                    getline(cin, tenoff);

                    if (tenoff.empty()) tenoff = "NTmacdinh8.txt";

                    xuatVec(vec, tenoff);

                    break;

                }

                case 9: {

                    cout << "Ban hay nhap ten tep muon xem ket qua hoac enter mac dinh: ";

                    string tenoff;

                    getline(cin, tenoff);

                    if (tenoff.empty()) tenoff = "NTmacdinh9.txt";

                    xuatVii(vii, tenoff);

                    break;

                }

                case 10: {

                    cout << "Ban hay nhap ten tep muon xem ket qua hoac enter mac dinh: ";

                    string tenoff;

                    getline(cin, tenoff);

                    if (tenoff.empty()) tenoff = "NTmacdinh10.txt";

                    xuatVp(vp, tenoff);

                    break;

                }

                case 11: {

                    cout << "Ban hay nhap ten tep muon xem ket qua hoac enter mac dinh: ";

                    string tenoff;

                    getline(cin, tenoff);

                    if (tenoff.empty()) tenoff = "NTmacdinh11.txt";

                    xuatDouble(db, tenoff);

                    break;

                }

                case 12: {

                    cout << "Ban hay nhap ten tep muon xem ket qua hoac enter mac dinh: ";

                    string tenoff;

                    getline(cin, tenoff);

                    if (tenoff.empty()) tenoff = "NTmacdinh12.txt";

                    xuatInt(so, tenoff);

                    break;

                }

               case 13: {

    chuyenstr_vec();

    cout << "Cac phan tu vecdb sau chuyen la:\n";

    duyet_vec([](double &x) {

        cout << setw(5) << x;

    });

    break;

}

 

case 14: {

    chuyenstr_vii();

    cout << "Cac phan tu viint sau chuyen la:\n";

    duyet_vii([](int &x) {

        cout << setw(5) << x;

    });

    break;

}

case 15: {

            cout<<"Ban hay nhap so muon ma hoa va he ma hoa(enter 0 0 de nhan mac dinh)";

            long long k; int h;

            cin>>k>>h;

            vector<int> vmh=getvii();

            string s=getss();

    MyClass::Point pti=mavii(k,h,s,vmh);

    cout << "Ma hoa vector: " << pti.mrs <<"\n\n";

    for (auto &sj : pti.vmrs) {

        cout << sj <<" ";

            }cout <<"\n";

    break;

}

case 16: {

            cout<<"Ban muon nhap so nguyen de ma hoa va he ma hoa(enter 0 0 nhan mac dinh)";

            long long k; int h;

            cin>>k>>h;

            string s=getss();

    RClass::Point pti=giaimav(k,h,s,getvii());

    cout << "Ma hoa vector: " << pti.mrs <<"\n\n";

    for (auto &sj : pti.vmrs) {

        cout << sj <<" ";

    }cout <<"\,";

    break;

}

                case 0: cout << "Thoat chuong trinh.\n"; break;

                default: cout << "Lua chon khong hop le!\n"; break;

            }

        } while (chon != 0);

            };

            // /* ===== XU LY MO RONG =====*/

            int minusc(int a, int b){

if (a*b<=0) {a=abs(a); b=abs(b);}

    if (b == 0) return a;

    return minusc(b, a % b);

            };

int bscln(int a, int b){

if (a*b<=0) {a=abs(a); b=abs(b);}

return (a/minusc(a,b)*b);

};

            bool checkcapnt(int a, int b){

    if (a <= 0 || b <= 0) return false;

    return (minusc(a, b) == 1);

            };

 

bool caccapnt(int a, int b){

    vp.clear();

    if (a > b) swap(a, b);

    for (int i = a; i < b; i++) {

        for (int j = i + 1; j <= b; j++) {

            if (checkcapnt(i, j)) {

                vp.push_back({i, j});

            }

        }

    }

    return (vp.size()>0);

            };

};

int main (int argc, char** argv){

    NhatTruong T;

    cout << "Day la chuong trinh ....  \n";

            cout << "Ban chuan bi nhap Data input \n";

            T.Tmenu();

    cout << "Chuc mung, ban co the xem ket qua o file da xuat" << endl;

    return 0;

}

//////////////////////////////////

#include <iostream>

#include <sstream>

#include <vector>

#include <string>

using namespace std;

 

// ======================

// Class mã hóa

// ======================

class MyClass {

public:

    struct Point {

        long long x;

        int y;

        string mrs;

        vector<string> vmrs;

    };

 

    void Mahoa(Point &Ec) {

        string mbs = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        long long num = Ec.x;

        int bs = Ec.y;

        string tms = "";

 

        while (num > 0) {

            int tm = num % bs;

            tms = mbs[tm] + tms;

            num /= bs;

        }

        Ec.vmrs.push_back(tms);

        Ec.mrs += tms + "|";

    }

 

    Point mahoavii(const vector<int> &v, int base) {

        Point pt;

        pt.y = (base < 1 || base > 32) ? 7 : base;

        pt.mrs = "";

        pt.vmrs.clear();

 

        for (auto val : v) {

            pt.x = val;

            Mahoa(pt);

        }

        return pt;

    }

};

 

// ======================

// Class giải mã

// ======================

class RClass {

public:

    struct Point {

        long long x;

        int y;

        string mrs;

        vector<string> vmrs;

    };

 

    void Giaima(Point &Ec) {

        vector<string> decoded;

        string token;

        stringstream ss(Ec.mrs);

 

        while (getline(ss, token, '|')) {

            if (token.empty()) continue;

            long long num = 0;

            for (char c : token) {

                int value = -1;

                if (isdigit(c)) value = c - '0';

                else if (c >= 'A' && c <= 'Z') value = c - 'A' + 10;

                else if (c >= 'a' && c <= 'z') value = c - 'a' + 10;

                if (value < 0 || value >= Ec.y) {

                    cout << "Ky tu " << c << " khong hop le trong he " << Ec.y << endl;

                    continue;

                }

                num = num * Ec.y + value;

            }

            decoded.push_back(to_string(num));

        }

        Ec.vmrs = decoded;

        if (!decoded.empty()) Ec.x = stoll(decoded[0]);

    }

};

int main() {

    MyClass mc;

    RClass rc;

 

    // Mã hóa vector số

    auto ptEnc = mc.mahoavii({10, 15, 26}, 16);

    cout << "Ma hoa (mrs): " << ptEnc.mrs << endl;

 

    // Giải mã chuỗi vừa tạo

    RClass::Point ptDec;

    ptDec.y = 16;

    ptDec.mrs = ptEnc.mrs;

    rc.Giaima(ptDec);

 

    cout << "Giai ma (vmrs): ";

    for (auto &s : ptDec.vmrs) cout << s << " ";

    cout << endl;

}

Nếu muốn cộng dồn nhưng có kiểm soát

MyClass::Point mahoavii(const vector<int> &v, int base) {

    MyClass mc;

    MyClass::Point total;

    total.y = base;

    total.mrs = "";

    total.vmrs.clear();

 

    for (auto val : v) {

        MyClass::Point tmp;

        tmp.x = val;

        tmp.y = base;

        mc.Mahoa(tmp); // mã hóa từng số

        // cộng dồn vào Point tổng

        total.mrs += tmp.mrs;

        total.vmrs.insert(total.vmrs.end(), tmp.vmrs.begin(), tmp.vmrs.end());

    }

    return total;

}

Cách hoạt động hiện tại

Trong Mahoa(Point &Ec) bạn có:

Ec.vmrs.push_back(tms);

Ec.mrs += tms + "|";

nghĩa là mỗi lần gọi sẽ thêm một chuỗi mới vào vmrs và nối thêm vào mrs.

Nếu bạn truyền cùng một Point qua nhiều lần mã hóa, kết quả sẽ cộng dồn.

Nếu muốn ghi đè thay vì cộng dồn

Bạn chỉ cần reset trước khi thêm:

Ec.vmrs.clear();

Ec.mrs.clear();

Ec.vmrs.push_back(tms);

Ec.mrs = tms + "|";

Nếu muốn cộng dồn nhưng có kiểm soát

Bạn nên dùng một biến phụ (ví dụ Point tmp) để gom kết quả từng số, sau đó nối vào một Point tổng. Ví dụ:

MyClass::Point mahoavii(const vector<int> &v, int base) {

    MyClass mc;

    MyClass::Point total;

    total.y = base;

    total.mrs = "";

    total.vmrs.clear();

 

    for (auto val : v) {

        MyClass::Point tmp;

        tmp.x = val;

        tmp.y = base;

        mc.Mahoa(tmp); // mã hóa từng số

        // cộng dồn vào Point tổng

        total.mrs += tmp.mrs;

        total.vmrs.insert(total.vmrs.end(), tmp.vmrs.begin(), tmp.vmrs.end());

    }

    return total;

}

Giải thích

tmp là biến phụ để mã hóa từng số trong vector.

total là kết quả tổng hợp, gom tất cả chuỗi và vector lại.

Như vậy bạn vừa tránh bị chồng đè, vừa có thể cộng dồn một cách có kiểm soát.

Tóm lại:

Nếu bạn muốn mỗi lần gọi chỉ giữ kết quả mới → dùng clear() trước khi push.

Nếu bạn muốn gom nhiều kết quả → dùng biến phụ để cộng dồn rồi trả về một Point tổng

phân biệt như sau:

MyClass::Point tmp; 

Đây là cách bạn khai báo một biến kiểu Point nằm bên trong class MyClass. Vì Point là một struct được định nghĩa trong MyClass, nên bạn phải viết đầy đủ MyClass::Point để truy cập. Biến tmp này chỉ chứa dữ liệu (x, y, mrs, vmrs) chứ không có hàm.

MyClass mc; 

Đây là cách bạn tạo một đối tượng của class MyClass. Đối tượng này có thể gọi các hàm thành viên của MyClass, ví dụ:

mc.Mahoa(tmp);

Khi gọi như vậy, hàm Mahoa sẽ nhận tham chiếu tới tmp và thực hiện mã hóa, cập nhật dữ liệu trong tmp.

Nói ngắn gọn:

MyClass::Point là kiểu dữ liệu con (struct) bên trong class.

MyClass mc là đối tượng của class, dùng để gọi các hàm xử lý.

Ví dụ minh họa:

int main() {

    MyClass mc;              // tạo đối tượng class

    MyClass::Point pt;       // tạo biến kiểu Point

    pt.x = 26;

    pt.y = 16;

    mc.Mahoa(pt);            // gọi hàm mã hóa, cập nhật pt.mrs và pt.vmrs

    cout << "Ket qua ma hoa: " << pt.mrs << endl;

}

//////////////////////////////////////

Thiết kế gọn gàng

class MyClass {

public:

    struct Point {

        long long x;

        int y;

        string mrs;

        vector<string> vmrs;

    };

 

    void Mahoa(Point &Ec) {

        string mbs = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        long long num = Ec.x;

        int bs = Ec.y;

        string tms = "";

 

        while (num > 0) {

            int tm = num % bs;

            tms = mbs[tm] + tms;

            num /= bs;

        }

        Ec.vmrs.push_back(tms);

        Ec.mrs += tms + "|";

    }

 

    // Hàm tiện ích: nhận số hoặc vector, trả về Point đã mã hóa

    Point mahoavii(const long long &x = 0,

                   const int &base = 7,

                   const string &si = "",

                   const vector<int> &v = {}) {

        Point pt;

        pt.y = (base < 1 || base > 32) ? 7 : base;

        pt.mrs = si; // chỉ để nối thêm chuỗi phụ

 

        if (v.empty()) {

            pt.x = x;

            Mahoa(pt);

        } else {

            for (auto val : v) {

                pt.x = val;

                Mahoa(pt);

            }

        }

        return pt;

    }

};

int main() {

    MyClass mc;

 

    // Mã hóa một số đơn lẻ

    auto pt1 = mc.mahoavii(26, 16);

    cout << "Ma hoa 26 he 16: " << pt1.mrs << endl;

 

    // Mã hóa cả vector

    auto pt2 = mc.mahoavii(0, 16, "prefix-", {10, 15, 26});

    cout << "Ma hoa vector: " << pt2.mrs << endl;

 

    // In từng phần tử đã mã hóa

    for (auto &s : pt2.vmrs) {

        cout << " -> " << s << endl;

    }

}

Tóm lại

  • si chỉ để nối thêm chuỗi phụ (ví dụ nhãn, tiền tố, hậu tố).
  • Mã hóa thực sự dựa vào x hoặc vector<int> v.
  • Hàm mahoavii giúp bạn xử lý cả số đơn lẻ và danh sách số trong một lần gọi, tiện cho dữ liệu file hoặc mảng dài.

LLONG_MAX

 

class RClass {

public:

    struct Point {

        long long x;

        int y;

        string mrs;

        vector<string> vmrs;

    };

 

    void Giaima(Point &Ec) {

        vector<string> decoded;

        string token;

        stringstream ss(Ec.mrs);

 

        while (getline(ss, token, '|')) {

            if (token.empty()) continue;

            long long num = 0;

            for (char c : token) {

                int value = -1;

                if (isdigit(c)) value = c - '0';

                else if (c >= 'A' && c <= 'Z') value = c - 'A' + 10;

                else if (c >= 'a' && c <= 'z') value = c - 'a' + 10;

                if (value < 0 || value >= Ec.y) {

                    cout << "Ky tu " << c << " khong hop le trong he " << Ec.y << endl;

                    continue;

                }

                num = num * Ec.y + value;

            }

            decoded.push_back(to_string(num));

        }

        Ec.vmrs = decoded;

        if (!decoded.empty()) Ec.x = stoll(decoded[0]);

    }

 

    Point giaimavii(const long long &xi = 0,

                    const int &base = 7,

                    const string &si = "",

                    const vector<int> &v = {}) {

        Point pt;

        pt.y = (base < 1 || base > 32) ? 7 : base;

        pt.x = (xi < 1 || xi > LLONG_MAX) ? 0 : xi;

        pt.mrs = si;

 

        // Nếu có vector thì chuyển thành chuỗi mrs để giải mã

        if (!v.empty()) {

            for (auto val : v) {

                pt.mrs += to_string(val) + "|";

            }

        } else {

            pt.mrs += to_string(pt.x) + "|";

        }

 

        Giaima(pt);

        return pt;

    }

};

Giải thích

  • Giaima tách chuỗi mrs theo dấu |, chuyển từng token về số thập phân, lưu vào vmrs.
  • giaimavii chuẩn bị dữ liệu: gán x, y, nối chuỗi mrs từ xi hoặc từ vector v. Sau đó gọi Giaima để giải mã.
  • Trả về Point đã giải mã.

Nhận xét