Nhờ giải thích đoạn code

e có đoạn code này

#include <iostream>
#include <map>
#include <fstream>
using namespace std;

string st;
map <char, int> xh;

int main()
{
    cin >> st;

    ifstream file(st);
    if(!file) return 0;

    std::map<char, int >::iterator it;
    string s;
    while( getline(file, s) )
    {
        int d[1000] = {0};
        for(int i=0; i<s.size(); i++)
         if( s[i] >='a' && s[i]<='z' )
         {
            it = xh.find(s[i]);
            d[s[i]-'a'] ++;
            if(it->second == 0)
                xh.insert(pair<char, int> (s[i], 1 ) );
            else
                 if(d[s[i]-'a'] == 1 ) (it->second)++ ;
            }

    }
    file.close();


    for (it = xh.begin(); it!= xh.end(); ++it)
    {
        std::cout << it->first << ": " << it->second << '\n';
    }
    
    xh.clear();
    
    return 0;
}

đề bài là: Hãy đọc tệp và in ra từng chữ cái cùng số lượng từ chứa chữ cái này. Kết quả in sắp theo thứ tự từ điển. Không in những chữ cái không xuất hiện trong tệp.
e không hiểu dòng " if(d[s[i]-‘a’] == 1 ) (it->second)++ ;" , có ai giải thích giúp e với ạ

@sincos Bạn vui lòng đọc warning message mà mình gửi cho bạn, edit topic này và báo lại cho mình biết. Nếu trong vòng 24h kể từ khi topic được tạo mà bạn không có phản hồi thì topic này sẽ tự động bị đóng.

  1. if là đâu điều kiện, bên trong ngoặc là true (truly) thì thực hiện lệnh (block lệnh) gì đó, false (falsy) thì không làm
  2. == 1 là phép so sánh
  3. d[…] là lấy phần tử thứ … của mảng d
  4. s[i] là lấy phần tử thứ i của mảng s, - là phép trừ, ‘a’ là kí tự ‘a’, trừ 2 kí tự với nhau thì có độ chêch lệch thứ tự theo bảng ascii

bạn còn thắc mắc chỗ nào?

đối với câu hỏi như thế này, bạn nên chạy từng dòng code bằng “tay” (hoặc debug từng lệnh trên ide) với một file nhỏ xem người ta thực hiện như thế nào mà học ý tưởng
hoc là học ý tưởng, cách xử lý, còn cú pháp thì chỉ có nhiêu đó mà thôi, tại sao phải cố đọc code của người khác

2 Likes

dạ vâng, mình đang tham khảo cách làm ạ.
ý mình hỏi là tại sao khi (d[s[i]-‘a’] ==1) lại công thêm 1 ở it->second vì bên trên có

 it = xh.find(s[i]);
 d[s[i]-'a'] ++;

.

mình nói rồi, cái này bạn cần hỏi người viết code, mỗi người có một ý tưởng và suy nghĩ khác nhau để giải cùng một bài toàn, kể cả cùng ý tưởng thì nhiều người cũng ra nhiều đoạn code khác nhau
cách học của bạn đang đi ngược
mỗi lần đọc được kí tự … thi người ta tăng biến đếm số lượng kí tự … lên 1, nên mới ra code như vậy
còn bây giờ bạn tự nhào vô hỏi chỗ đó, trong khi cái quan trọng là ý tưởng viết bằng lời kiểu “bước 1 đọc từng dòng, bước 1.1 …, bước 1.2…” rồi sau đó thực hiện code như mô tả thì bạn lại không học
mà những câu hỏi kiểu này người ta cũng chẳng buồn trả lời đâu

cũng không biết thế nào, cũng có thể bạn thấy cách học hiện tại của bạn là phù hợp, nên thôi, mình ý kiến vậy đủ rồi, chúc bạn may mắn

4 Likes

vâng, trước tiên thì mình xin lỗi nếu đã làm phiền bạn.
mình đã hiểu ý tưởng của bài này r và biết các bước làm là thế nào nhưng mình không hiểu lắm với phần code như trên nên mình mới hỏi.
còn bài này là mình nhận được từ 1 đứa bạn, mình có hỏi về vấn đề kia nhưng nó nói là đi chép, không hiểu nên mình mới đăng nên đây hỏi.
thật sự xin lỗi bạn nhiều…

bạn không có gì để xin lỗi mình cả, mặc dù mình reply gay gắt nhưng cũng không có ý gì cả, mục đích là bạn bạn tự xem lại cách học thôi
còn lỗi thì chắc bạn tự xin lỗi bản thân bạn thôi
nếu bạn đã có ý tưởng và biết cách giải thì bạn nên tự viết code sẽ hay hơn, đó là cách bạn tự phát triển kĩ năng code.
đã biết cách giải, lại không tự thực hiện giải mà lại đi đọc bài giải của người khác rồi lại phải cố hiểu bài giải của người khác. bạn tự đánh giá lại thôi

7 Likes

vâng, mình có làm r nhưng cách của mình dài quá nên mình tham khảo thêm.
cảm ơn bạn đã nhắc nhở! :+1: :+1: :+1: .

Thắc mắc của bạn rất hay. Vì bạn đã nhìn ra được điểm bất hợp lý của đoạn code trên. Bạn nên tự viết code cho riêng mình sau khi đax hiểu và có ý tưởng thay vì copy từ đâu đó.
PS: đoạn code trên xử lý khá là cồng kềnh và không phải là 1 đáp án tốt để bạn tham khảo. Bạn thử tự làm và upload version khác độc lập với đoạn code trên để mn có thể góp ý cho bạn

6 Likes

Xử lý cồng kềnh thật.
Bài em làm là phần đầu trong kĩ thuật xử lý mã huffman:“đếm tần số xuất hiện của mỗi kí tự trong thông điệp”.
Em có thể tham khảo nó.

4 Likes

dạ vâng, mình cảm ơn ạ

dạ vâng, e cảm ơn ạ :+1: :+1: :+1:

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?