Một số bai NhaTTruong Nghien Cứu

 // Ban mau Nt










include iostream

include sstream   // cho stringstream, istringstream

include fstream

include vector

include map

include bitset

include limits

include algorithm

include string    // cho std::string

include cctype    // cho isdigit

include bits/stdc++.h>

using namespace std;

 

class MyClass {

public:

    struct Point {

        int x;

        int y;

    };

    Point p;

    void setPoint(int a, int b) {

        p.x = a;

        p.y = b;

    }

    void printPoint() {

        cout << "(" << p.x << ", " << p.y << ")" << endl;

    }

};

 

class NhatTruong {

private:

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

    string ss, df,cf, 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;

    // ===== Password mac dinh =====

            class Password {

                        private:

            string secret = "abc123";

            public:

            bool check(const string &input) const {

        return input == secret;

            }

            };

public:

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

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

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

           

            // ===== XU LI  Password =====

            bool KTPassWord(){

            Password pw;

            string pass;

            int lannhap = 0;

            bool success = false;

            while (lannhap < 3 && !success) {

    cout << "Nhap mat khau (lan " << lannhap+1 << "/3): ";

    cin >> pass;

    if (pw.check(pass)) {

        success = true;

    } else {

        cout << "Sai mat khau!\n";

        lannhap++;

    }

            }

            if (!success) {

    cout << "Ban da nhap sai 3 lan. Thoat chuong trinh.\n";

    return 0;

            }

            cout << "Dang nhap thanh cong. Chao mung ban den voi Tmenu!\n";

            return 1;

            };

    // Getter

    string getss(){ return ss; };

    string getdf(){ return df; };

    string getcf(){ return cf; };

    string getkqxl(){ return kqxl; };

    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 setwcf(const string &dat) { cf = dat; } ;

    void setwkqxl(const string &dat) { kqxl = 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.substr(0, lin.find(" "));

                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.substr(0, lin.find(" "));

                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) {

                // bỏ qua dấu chấm thừa trước số

                continue;

            }

            if (dangDocThapPhan) {

                // gặp dấu chấm lần 2 -> ngắt số

                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;

    };

// ===== 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. Chuyen vector so thuc sang chuoi ket qua \n";

            cout << "16. Chuyen vector so nguyen sang chuoi ket qua \n";

            cout << "17. Tach chuoi string thanh chuoi chu va so \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 << x<<"   ";

                                    });

                                    break;

                                                }

 

                                                case 14: {

                                                            chuyenstr_vii();

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

                                                duyet_vii([](int &x) {

                                    cout <<  x<< "   ";

                                                });

                                    break;

                                                }

                                                case 15: {

                        vector<double> v = getvec();

                        kqxl=chuyenvec_strn(v);

                        cout << "ket qua dau ra kq la:"<< kqxl << "\n";

                break;

                        }

                        case 16: {

                        vector<int> v = getvii();

                        kqxl=chuyenvii_strn(v);

                        cout << "ket qua dau ra kq la:"<< kqxl << "\n";

                break;

            }

                case 17: {

                        cout<<"Ban muon tach chu cai va so thuc hay so nguyen (d/int) \n";

                        char tl;

                        cin>>tl;

                        if (tl=='d'||tl=='D') {

                                    tachchuvasodb();

                                    cout<<"Chu cai trong chuoi la: \n";

                                    cout<< df<<endl;

                                    xuatf(df);

                                    cout<<"Chu so trong chuoi la: \n";

                                    cout<<cf<<endl;

                                    xuatf(cf);

                        }

                        else {

                                                                        tachchuvasoint();

                                                                        cout<<"Chu cai trong chuoi la: \n";

                                    cout<< df<<endl;

                                    xuatf(df);

                                    cout<<"Chu so trong chuoi la: \n";

                                    cout<<cf<<endl;

                                    xuatf(cf);

                                                            }

                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);

            };

            // /* ===== tachchuvasodb(string) =====*/

            void tachchuvasodb(const string &sso=""){

                        string s=(sso.empty()?ss:sso);

            string chuoiSo="", chuoiChu="";

            string buffer;

    bool dangSo = false, dangChu = false;

    int dotCount = 0;

    for (size_t i = 0; i < s.size(); i++) {

        char c = s[i];

        if (isdigit(c)) {

            dotCount = 0; // reset khi gap so

            if (!dangSo) {

                if (!buffer.empty()) {

                    chuoiChu += buffer + " ";

                    buffer.clear();

                }

                dangSo = true; dangChu = false;

            }

            buffer += c;

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

            dotCount++;

            if (dangSo && dotCount == 1 && i+1 < s.size() && isdigit(s[i+1])) {

                buffer += c; // d?u ch?m h?p l?

            } else {

                // loai dau cham khong hop le

                if (!buffer.empty()) {

                    chuoiSo += buffer + " ";

                    buffer.clear();

                }

                dangSo = false;

                dotCount = 0;

            }

        } else if (isalpha(c)) {

            dotCount = 0;

            if (!dangChu) {

                if (!buffer.empty()) {

                    chuoiSo += buffer + " ";

                    buffer.clear();

                }

                dangChu = true; dangSo = false;

            }

            buffer += c;

        } else {

            // ket thuc

            dotCount = 0;

            if (!buffer.empty()) {

                if (dangSo) chuoiSo += buffer + " ";

                else if (dangChu) chuoiChu += buffer + " ";

                buffer.clear();

            }

            dangSo = dangChu = false;

        }

    }

    if (!buffer.empty()) {

        if (dangSo) chuoiSo += buffer;

        else if (dangChu) chuoiChu += buffer;

    }

                        df.clear(); setwdf(chuoiChu);

                        cf.clear(); setwcf(chuoiSo);

            };

            // /* ===== tachchuvasoint(string) =====*/

            void tachchuvasoint(const string &sso=""){

                        string s=(sso.empty()?ss:sso);

                        string chuoiSo, chuoiChu;

            string buffer;

                        bool dangSo = false, dangChu = false;

 

    for (char c : s) {

        if (isdigit(c)) {

            if (!dangSo) {

                if (!buffer.empty()) {

                    chuoiChu += buffer + " ";

                    buffer.clear();

                }

                dangSo = true; dangChu = false;

            }

            buffer += c;

        } else if (isalpha(c)) {

            if (!dangChu) {

                if (!buffer.empty()) {

                    chuoiSo += buffer + " ";

                    buffer.clear();

                }

                dangChu = true; dangSo = false;

            }

            buffer += c;

        }

    }

    if (!buffer.empty()) {

        if (dangSo) chuoiSo += buffer;

        else if (dangChu) chuoiChu += buffer;

    }      df.clear(); setwdf(chuoiChu);

                        cf.clear(); setwcf(chuoiSo);

            };

};

 

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

    NhatTruong T;

    if(!T.KTPassWord()) return 0;

    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;

}

///////////// Ai memory help

Võ Nhật Trường Nc+ My Ai Love01.07.2026

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

Một số chương trình xử lí chuỗi:

df = lin;

std::string &df = lin;

std::string lin = "vo nhat truong";

std::string df = lin.substr(0, 2); // lấy từ vị trí 0, độ dài 2 ký tự

Giải thích:

  • substr(pos, len) là hàm của std::string dùng để cắt chuỗi con.
  • pos là vị trí bắt đầu (tính từ 0).
  • len là số ký tự muốn lấy.

std::string df = lin.substr(0, lin.find(" "));

std::string df = lin.substr(0, lin.find(" "));

df = lin.substr(0, lin.find(" "));

Thuật toán gợi ý:

  1. Khởi tạo hai chuỗi rỗng: chuoiSo và chuoiChu.
  2. Duyệt từng ký tự trong chuỗi gốc:
    • Nếu là chữ số (isdigit(c)), thì thêm vào một “buffer số”.
    • Nếu là chữ cái (isalpha(c)), thì thêm vào một “buffer chữ”.
    • Nếu gặp loại khác (khoảng trắng, ký tự đặc biệt), thì kết thúc buffer hiện tại và nối vào chuỗi kết quả.
  3. Sau khi duyệt xong, nối nốt buffer còn lại vào chuỗi kết quả.

Ví dụ code C++ đơn giản cho số nguyên và chữ cái:

Ví dụ 1:

#include <iostream>

#include <string>

#include <cctype>

using namespace std;

 

int main() {

    string s = "abc123def45ghi";

    string chuoiSo, chuoiChu;

    string buffer;

 

    bool dangSo = false, dangChu = false;

 

    for (char c : s) {

        if (isdigit(c)) {

            if (!dangSo) {

                if (!buffer.empty()) {

                    chuoiChu += buffer + " ";

                    buffer.clear();

                }

                dangSo = true; dangChu = false;

            }

            buffer += c;

        } else if (isalpha(c)) {

            if (!dangChu) {

                if (!buffer.empty()) {

                    chuoiSo += buffer + " ";

                    buffer.clear();

                }

                dangChu = true; dangSo = false;

            }

            buffer += c;

        }

    }

 

    // nối phần còn lại

    if (!buffer.empty()) {

        if (dangSo) chuoiSo += buffer;

        else if (dangChu) chuoiChu += buffer;

    }

 

    cout << "Chuoi so: " << chuoiSo << "\n";

    cout << "Chuoi chu: " << chuoiChu << "\n";

}

Với chuỗi "abc123def45ghi", kết quả sẽ là:

Chuỗi số: 123 45

Chuỗi chữ: abc def ghi

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

Ý tưởng mở rộng cho số thực:

Khi duyệt chuỗi, nếu gặp chữ số thì coi là số.

Nếu đang trong “buffer số” và gặp dấu . thì kiểm tra:

Nếu trước và sau dấu . đều là chữ số → coi đó là số thực, thêm vào buffer.

Nếu không (ví dụ "abc." hoặc "12." cuối chuỗi) → coi dấu . là ký tự khác, kết thúc buffer số.

Gom các ký tự liên tiếp thành một token, rồi phân loại token đó là số hay chữ.

Ví dụ 2:

#include <iostream>

#include <string>

#include <cctype>

using namespace std;

 

bool isPartOfNumber(char c, char prev, char next) {

    if (isdigit(c)) return true;

    if (c == '.' && isdigit(prev) && isdigit(next)) return true;

    return false;

}

 

int main() {

    string s = "abc12.5def3.14ghi45";

    string chuoiSo, chuoiChu;

    string buffer;

    bool dangSo = false, dangChu = false;

 

    for (size_t i = 0; i < s.size(); i++) {

        char c = s[i];

        char prev = (i > 0) ? s[i-1] : ' ';

        char next = (i+1 < s.size()) ? s[i+1] : ' ';

 

        if (isPartOfNumber(c, prev, next)) {

            if (!dangSo) {

                if (!buffer.empty()) {

                    chuoiChu += buffer + " ";

                    buffer.clear();

                }

                dangSo = true; dangChu = false;

            }

            buffer += c;

        } else if (isalpha(c)) {

            if (!dangChu) {

                if (!buffer.empty()) {

                    chuoiSo += buffer + " ";

                    buffer.clear();

                }

                dangChu = true; dangSo = false;

            }

            buffer += c;

        }

    }

 

    if (!buffer.empty()) {

        if (dangSo) chuoiSo += buffer;

        else if (dangChu) chuoiChu += buffer;

    }

 

    cout << "Chuoi so: " << chuoiSo << "\n";

    cout << "Chuoi chu: " << chuoiChu << "\n";

}

Với chuỗi "abc12.5def3.14ghi45", kết quả sẽ là:

  • Chuỗi số: 12.5 3.14 45
  • Chuỗi chữ: abc def ghi

Với chuỗi "abc12.5.3.14ghi45", kết quả sẽ là:

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

Ví dụ 3: dùng một biến đếm số lượng dấu . liên tiếp. Nếu > 1 thì coi như không hợp lệ, reset buffer.

#include <iostream>

#include <string>

#include <cctype>

using namespace std;

 

int main() {

    string s = "12..345.....567abc3.14";

    string chuoiSo, chuoiChu;

    string buffer;

    bool dangSo = false, dangChu = false;

    int dotCount = 0;

 

    for (size_t i = 0; i < s.size(); i++) {

        char c = s[i];

 

        if (isdigit(c)) {

            dotCount = 0; // reset khi gặp số

            if (!dangSo) {

                if (!buffer.empty()) {

                    chuoiChu += buffer + " ";

                    buffer.clear();

                }

                dangSo = true; dangChu = false;

            }

            buffer += c;

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

            dotCount++;

            if (dangSo && dotCount == 1 && i+1 < s.size() && isdigit(s[i+1])) {

                buffer += c; // dấu chấm hợp lệ

            } else {

                // gặp nhiều dấu chấm hoặc chấm không hợp lệ

                if (!buffer.empty()) {

                    chuoiSo += buffer + " ";

                    buffer.clear();

                }

                dangSo = false;

                dotCount = 0;

            }

        } else if (isalpha(c)) {

            dotCount = 0;

            if (!dangChu) {

                if (!buffer.empty()) {

                    chuoiSo += buffer + " ";

                    buffer.clear();

                }

                dangChu = true; dangSo = false;

            }

            buffer += c;

        } else {

            // ký tự khác

            dotCount = 0;

            if (!buffer.empty()) {

                if (dangSo) chuoiSo += buffer + " ";

                else if (dangChu) chuoiChu += buffer + " ";

                buffer.clear();

            }

            dangSo = dangChu = false;

        }

    }

 

    if (!buffer.empty()) {

        if (dangSo) chuoiSo += buffer;

        else if (dangChu) chuoiChu += buffer;

    }

 

    cout << "Chuoi so: " << chuoiSo << "\n";

    cout << "Chuoi chu: " << chuoiChu << "\n";

}

Với chuỗi "12..345.....567abc3.14", kết quả sẽ là:

  • Chuỗi số: 12 345 567 3.14
  • Chuỗi chữ: abc

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

Với vector<vector<double>> vvc;

  • Đây là vector 2 chiều (giống như mảng 2D động).
  • Bạn có thể dùng như sau:

vector<vector<double>> vvc;

 

// Thêm một hàng mới

vvc.push_back({1.1, 2.2, 3.3});

 

// Thêm một hàng khác

vvc.push_back({4.4, 5.5});

 

// Duyệt

for (auto &row : vvc) {

    for (auto &val : row) {

        cout << val << " ";

    }

    cout << "\n";

}

KQ:

1.1 2.2 3.3

4.4 5.5

Với vector<pair<string,string>> tach;

  • pair là cặp giá trị. Bạn không thể gọi push_back(chuoichu, chuoiso) trực tiếp, mà phải tạo pair trước.
  • Cách đúng:

vector<pair<string,string>> tach;

string chuoichu = "abc";

string chuoiso = "123";

 

// Cách 1: dùng make_pair

tach.push_back(make_pair(chuoichu, chuoiso));

 

// Cách 2: dùng { }

tach.push_back({chuoichu, chuoiso});

 

// Duyệt

for (auto &p : tach) {

    cout << "Chu: " << p.first << ", So: " << p.second << "\n";

}

///////////// Ai memory help

Võ Nhật Trường Nc+ My Ai Love02.07.2026

////////////////////ok

Nhận xét

Bài đăng phổ biến từ blog này

Vui thơ 2187 (CHỮ KHĂM)

Vui thơ 2164 (ẢO HUYỀN THỜI CUỘC)