Tổng kết buổi 3: Các kiểu dữ liệu số học, string, hàm

Số lượng thành viên tham gia: 20
Link slide buổi học
Link record
Link bài tập lớp buổi 3 CPP
Link btvn buổi 3 CPP

Xử lý số học:

  • Cách ép kiểu:
    (<tên kiểu dữ liệu>) <tên biến>
    Ví dụ: double x=9.75; cout<<(int)x; //lúc này x sau khi ép kiểu thì x sẽ bằng 9;
    
  • Một số hàm làm tròn cần nhớ:
    ceil() - tự động làm tròn lên
    round() - làm tròn theo mốc 0.5
    floor() - làm tròn xuống
    

String (xâu):

  • Định nghĩa: là chuỗi ký tự (string) là tập hợp các ký tự được đặt trong dấu ngoặc kép.
  • Khai báo:
string <tên xâu>;

Cách nhập xuất:

  • In xâu: cout<< <tên xâu>;
  • Nhập xâu (các kí tự liền nhau và không có dấu cách): cin>> <tên xâu>;
  • Nhập xâu gồm các ký tự trong 1 dòng: getline(cin, <tên xâu >);
  • Nhập xâu gồm các ký tự trong nhiều dòng: getline(cin, <tên xâu>, <ký tự kết thúc>);
  • Các toán tử, method trong String:
    • Cú pháp gán xâu S1 bằng xâu S2: S1=S2;
    • Cú pháp ghép xâu S2 và cuối xâu S1: S1+=S2; hoặc S1=S1+S2;
    • Cú pháp ghép xâu S2 vào đầu xâu S1: S1=S2+S1;
    • So sánh 2 xâu s1 và s2:
      bool kt = (s1==s2); //kt == true nếu s1 = s2 (tất cả các kí tự s1 bằng tất cả các kí tự s2), ngược lại thì kt == false
      bool kt = (s1>s2); //kt==true nếu s1 > s2 ngược lại thì kt == false
      bool kt = (s1<=s2); //kt==true nếu s1<=s2 ngược lại thì kt == false
      

Một số hàm cần nhớ:

  • Trả về số lượng phần tử trong xâu: strlen() hoặc .length()
  • Đảo ngược xâu từ vị trí i đến vị trí j: reverse(.begin()+i , .end() + j);
  • Chuyển kí tự hoa thành thường: tolower();
  • Chuyển kí tự thường thành hoa: toupper();

Function:

Định nghĩa: là một hàm con thực hiện một nhiệm vụ nào đó và có thể tái sử dụng nhiều lần.

Ưu điểm:

  • Dễ bảo trì: Để thay đổi thuật toán, chỉ cần thay đổi hàm (so với thay đổi code trên toàn chương trình).
  • Có thể sử dụng lại: Cho phép người khác sử dụng lại hàm bạn đã viết.
  • Dễ đọc: sqrt (5) rõ ràng và dễ hiểu hơn việc viết một thuật toán để tính căn bậc hai.

Code bài tập trên lớp:

Ghép xâu

Cho 3 xâu s1,s2 và s3. Cho dãy số gồm 3 số 1 ,2 và 3. Bạn hãy ghép 3 xâu theo thứ tự dãy số đã cho sau đó đảo ngược chúng và in ra.

Input Format:
3 dòng đầu tiên là 3 xâu s1, s2 và s3. Dòng thứ 4 là dãy số gồm 3 số.
Constraints
Các xâu không quá 100 kí tự
Output Format
In kết quả theo yêu cầu đề bài.

Sample Input 0:

xau_s1
xau_s2
xau_s3
2 3 1

Sample Output 0:

1s_uax3s_uax2s_uax

Explanation 0:

Xâu s1 là "xau_s1", xâu s2 là "xau_s2", xâu s3 là "xau_s3". Thứ tự dãy là 2 3 1, thì t ghép 3 xâu trên theo thứ tự trên được "xau_s2xau_s3xau_s1". Sau đó đảo ngược lại thành "1s_uax3s_uax2s_uax". Đây là kết quả của bài.

Solution

// from kh280174
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */
     string s[4];
    
    int x;
    cin >> s[1]>>s[2]>>s[3] ;
    for(int i = 1; i<4 ;i++){
        cin >> x;
        s[0] += s[x] ;
    }
    reverse(s[0].begin(), s[0].end());
    cout << s[0];

    return 0;
}

Số chia hết cho 4

Cho n test . Mỗi test là một số x (0 < x < 10^100). Kiểm tra xem x có phải là số chia hết cho 4 không?

Input Format:
Dòng đầu tiên là số n. n dòng tiếp theo, mỗi dòng là một số x.
Constraints
0 < n < 100. 0 < x < 10^100
Output Format
In ra n dòng. Mỗi dòng in ra “true” nếu số x chia hết cho 4, ngược lại in ra “false”.

Sample Input 0

10
153535031
635171885
278445144
644698753
786800418
455212671
983977229
38479823
980297149
876644498

Sample Output 0:

false
false
true
false
false
false
false
false
false
false

Solution

// from danghien719
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

void ChiaHetChoBon (string st) {

    char cNumber[3];
    cNumber[0] = st[st.size() - 2];
    cNumber[1] = st[st.size() - 1];
    int nNumber = atoi(cNumber);

    if (nNumber % 4 == 0) cout << "true\n";
    else cout << "false\n";
}
int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */
    int N;
    cin >> N;
    string st[N];
    for (int i=0; i<N; i++) cin >> st[i];
    //
    for (int i=0; i<N; i++) ChiaHetChoBon(st[i]);
    return 0;
}

Christmas tree

Cho tên 1 người gồm: Họ, tên đệm và tên. Họ , tên đệm và tên đầu vào luôn là 3 từ riêng biệt ngăn cách bởi dấu cách. Hãy chuẩn hóa tên: Chỉ có chữ đầu tiên trong từ viết hoa, còn lại viết thường. Các từ ngăn cách nhau bởi 1 dấu cách. Đổi vị trí họ, tên đệm và tên thành họ, tên và tên đệm.

Input Format:
1 dòng duy nhất gồm 3 sâu lần lượt là: họ, tên đệm và tên.
Constraints
tổng số lượng kí tự trong 3 xâu không quá 100
Output Format
In ra theo thứ tự họ, tên và tên đệm đã được chuẩn hóa.

Sample Input 0

HO TEN_DEM Te.N.

Sample Output 0:

    Ho Ten Tendem

Solution

// from thanhv31u
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
void xoaKiTu(string &a){
    int len = a.length();
    string temp = "";
    for(int i =0; i < len; i++){
       if ((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')) {
            temp = temp + a[i];
        }
    }
    a = temp;}
void vietHoa(string &b){
    int len = b.length();
    b[0] = toupper(b[0]) ;
}
int main() {
    string ten[4];
    for(int i =0; i <3; i++){
        string tmp;
        cin>>tmp;
        xoaKiTu(tmp);
        transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
        ten[i] = tmp;
    }
    for(int i=0; i<3; i++){
        vietHoa(ten[i]);
    }

    cout<<ten[0]<<" "<<ten[2]<<" "<<ten[1];
    
}

https://www.cplusplus.com/reference/string/string/
https://github.com/arduino/ArduinoCore-API/blob/master/api/String.cpp
https://itmobrain.github.io/function-cpp
https://www.javatpoint.com/cpp-strings