Nhập mảng không biết trước số lượng

Dạ em chào mn.

Câu hỏi
Em muốn hỏi về code c++ nhập một mảng vào mà không biết trước trong mảng đó có bao nhiêu kí tự.

Ví dụ:

  • nếu biết trước số lượng:
    5
    1 2 3 4 5
  • nếu không biết trước:
    1 4 3 2 5

Mong muốn
Em có thử search mạng hay tìm hiểu code của những người khác thì có vài đặc điểm sau, khi em áp dụng thì nó bị lỗi vậy nên em mong mn có thể:

  • dùng cin, cout
  • em có thấy code có dùng push_back khá easy nhưng mà em mong muốn không ở dạng vecto ấy ạ.
  • nếu mở tệp thì có thể dùng freopen được không.
  • có thể viết hẳn code ra luôn thay vì chỉ ý tưởng thuật toán.

Cuối cùng, em cảm ơn mn rất nhiều ạ.
< Xin lỗi vì nếu em đòi hỏi hơi nhiều, cái em cũng bất lực lắm rồi, mà sắp thi nên cũng cuống cuống :>> >

1 Like

Đọc phần tử mà không biết trước số lượng phần tử:

for (string s; cin >> s; ) {
    // làm gì đó
}

Nếu bạn nói dòng này là xâu thì xâu này có 9 kí tự chứ không phải 5 kí tự nhé.

Đọc 1 dòng:

string s;
getline(cin, s);

Nếu muốn lưu trữ những string bạn vừa nhập thì bạn cần dùng mảng. Nếu dùng mảng tĩnh thì bạn phải biết trước số lượng string tối đa bạn cần nhập là bao nhiêu (ví dụ đề bài cho nhập tối đa không quá 10^5 xâu). Nếu không biết trước thì bạn vẫn nên dùng vector để độ phức tạp không cao.

Hoặc nếu không dùng vector thì bạn có thể dùng linked list (thông qua std::list). Tuy nhiên linked list không hỗ trợ truy cập phần tử (bằng [ ]) nên mỗi lần muốn lấy 1 phần tử bất kì thì bạn lại phải rất vất vả (và tốn công) duyệt và truy cập.

freopen không nhằm để mở tệp, vốn dĩ freopen chỉ pipe stdin/stdout vào file thôi. Người ta lợi dụng điểm này để vẫn được code cin, cout (do quen tay cin, cout rồi nên lười thay đổi).

Tốt nhất bạn cứ dùng ifstream để đọc và ofstream để in nhé.

#include <fstream>

int main() {
    ifstream fi("gi_do.inp");
    ofstream fo("gi_do.out");

    fi >> n;
    fo << n;
}
4 Likes

Dạ cho em xin phép hỏi thêm với trường hợp mảng thì sao ạ

Mình đã trả lời đây rồi, mình đang không hiểu ý bạn đang muốn hỏi gì. Bạn muốn hỏi cụ thể gì thì hỏi, hỏi là quyền của bạn, không cần phải xin phép.

Dạ vậy ở ví dụ cụ thể này luôn ý, để nhập mảng vào mà không biết trước số lượng thì mình không thể dùng:
for (i=1;i<=n;i++) cin>>a[i]
Em cũng có mò mấy cách mà fail hết. Mong anh giúp em với ạ <3

Dùng vector:

vector<int> a;
for (int x; cin >> x; a.push_back(x)) { }

Dùng mảng tĩnh (bài này cố định số lần nhập tối đa là 10^5):

int a[100000], n = 0;

int main() {
    for (int x; cin >> a[n++]; ) { }
}
3 Likes

Dạ vâng em cảm ơn nhiều nhiều ạ :heart_eyes:
Chúc anh có một ngày tốt lành :3

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