// 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
ý:
- Khởi tạo hai chuỗi rỗng: chuoiSo và chuoiChu.
- 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ả.
- 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

Không có nhận xét nào:
Đăng nhận xét
sunrise.tqb@gmail.com