SLIDE1

Saturday, June 20, 2015

[oop c++] phạm vi truy xuất trong kế thừa

Truy xuất theo chiều dọc:
Hàm thành phần của lớp con có quyền truy xuất các thành phần của lớp cha hay không?
Truy xuất theo chiều ngang:
Các thành phần của lớp cha, sau khi kế thừa xuống lớp con, thì thế giới bên ngoài có quyền truy xuất thông qua đối tượng của lớp con hay không?

[oop c++] Kế thừa - định nghĩa, cú pháp, sử dụng

Kế thừa

 là một đặc điểm của ngôn ngữ dùng để biểu diễn mối quan hệ đặc biệt hóa – tổng quát hóa giữa các lớp. Các lớp được trừu tượng hóa và được tổ chức thành một sơ đồ phân cấp lớp.
Sự kế thừa là một mức cao hơn của trừu tượng hóa, cung cấp một cơ chế gom chung các lớp có liên quan với nhau thành một mức khái quát hóa đặc trưng cho toàn bộ các lớp nói trên.

[oop c++] Quan hệ giữa các lớp đối tượng

Giữa các lớp đối tượng có những loại quan hệ sau:

Quan hệ một một (1-1)
Quan hệ một nhiều (1-n)
Quan hệ nhiều nhiều (n-n)
Quan hệ đặc biệt hóa, tổng quát hóa

Thursday, June 18, 2015

[oop c++] Các nguyên tắc xây dựng lớp


  1. Hình thành lớp: Khi ta nghĩ đến “nó” như một khái niệm riêng lẻ ->Xây dựng lớp biểu diễn khái niệm đó.
  2. Lớp là biểu diễn cụ thể của một khái niệm vì vậy tên lớp luôn là danh từ.
  3. Các thuộc tính của lớp là các thành phần dữ liệu nên chúng luôn là danh từ.
  4. Các hàm thành phần (các hành vi) là các thao tác chỉ rõ hoạt động của lớp nên các hàm là động từ.
  5. Các thuộc tính có thể suy diễn từ những thuộc tính khác thì dùng hàm thành phần để thực hiện tính toán. Ví dụ chu vi, diện tích của một tam giác
  6. Tuy nhiên, nếu các thuộc tính suy diễn dòi hỏi nhiều tài nguyên hoặc thời gian để thực hiện tính toán, ta có thể khai báo là dữ liệu thành phần.
  7. Dữ liệu thành phần nên được kết hợp:
  8. Trong mọi trường hợp, nên có phương thức thiết lập (Constructor) để khởi động đối tượng
  9. Nên có phương thức thiết lập có khả năng tự khởi động không cần tham số
  10. Nếu đối tượng có nhu cầu cấp phát tài nguyên thì phải có phương thức thiết lập, copy constructor để khởi động đối tượng bằng đối tượng cùng kiểu và có destructor để dọn dẹp. Ngoài ra còn có phép gán (chương 4).
  11. Nếu đối tượng đơn giản không cần tài nguyên riêng ->Không cần copy constructor và destructor


[oop c++] Thành viên tĩnh – static member

Trong C, static xuất hiện trước dữ liệu được khai báo trong một hàm nào đó thì giá trị của dữ liệu đó vẫn được lưu lại như một biến toàn cục.
Trong C++, nếu static xuất hiện trước một dữ liệu hoặc một phương thức của lớp thì giá trị của nó vẫn được lưu lại và có ý nghĩa cho đối tượng khác của cùng lớp này.
Các thành viên static có thể là public, private hoặc protected.

Đối với class, static dùng để khai báo thành viên dữ liệu dùng chung cho mọi thể hiện của lớp:

Một bản duy nhất tồn tại trong suốt quá trình chạy của chương trình.
Dùng chung cho tất cả các thể hiện của lớp.
Bất kể lớp đó có bao nhiêu thể hiện.

Ví dụ
class Rectangle
{
    private:
       int width;
       int length;
       static int count;
    public:
       void set(int w, int l);
       int area();
}

Ví dụ
Đếm số đối tượng MyClass:
class MyClass{
    public:
        MyClass();
        ~MyClass();
        void printCount();
    private:
        static int count;
};

int MyClass::count = 0;
MyClass::MyClass(){
    this -> count++;
}
MyClass::~MyClass(){
    this -> count--;
}
void MyClass::printCount(){
    cout << “There are currently ” << this  count << “ instance(s) of MyClass.\n”;
}
void main()
{
    MyClass* x = new MyClass;
    x -> printCount();
    MyClass* y = new MyClass;
     x -> printCount();
     y -> printCount();
    delete x;
     y -> printCount();
}


Phương thức static?

Đối với các phương thức static, ngoài ý nghĩa tương tự với dữ liệu, còn có sự khác biệt cơ bản đó là việc cho phép truy cập đến các phương thức static khi chưa khai báo đối tượng (thông qua tên lớp)
Các thành viên lớp tĩnh public có thể được truy cập thông qua bất kỳ đối tượng nào của lớp đó, hoặc chúng có thể được truy cập thông qua tên lớp sử dụng toán tử định phạm vi.
Các thành viên lớp tĩnh private và protected phải được truy cập thông qua các hàm thành viên public của lớp hoặc thông qua các friend của lớp.
Các thành viên lớp tĩnh tồn tại ngay cả khi đối tượng của lớp đó không tồn tại.
Để truy cập một thành viên lớp tĩnh public khi các đối tượng của lớp không tồn tại, đơn giản thêm vào đầu tên lớp và toán tử định phạm vi cho thành viên dữ liệu.
Để truy cập một thành viên lớp tĩnh private hoặc protected khi các đối tượng của lớp không tồn tại, một hàm thành viên public phải được cung cấp và hàm phải được gọi bởi thêm vào đầu tên của nó với tên lớp và toán tử định phạm vi.

[oop c++] hàm bạn, lớp bạn (friend function)

Hàm bạn, lớp bạn (Friend function)


Giả sử có lớp Vector, lớp Matrix
Cần viết hàm nhân Vector với một Matrix
Hàm nhân:
Không thể thuộc lớp Vector
Không thể thuộc lớp Matrix
Không thể tự do
Giải pháp: Xây dựng hàm truy cập dữ liệu?
Hàm bạn không thuộc lớp. Tuy nhiên, có quyền truy cập các thành viên private của lớp.
Khi định nghĩa một lớp, có thể khai báo một hay nhiều hàm “bạn” (bên ngoài lớp)
Ưu điểm:
Kiểm soát các truy nhập ở cấp độ lớp – không thể áp đặt hàm bạn cho lớp nếu điều đó không được dự trù trước trong khai báo của lớp.
Dùng từ khóa friend để khai báo, định nghĩa hàm bạn
Đây là cách cho phép chia sẻ dữ liệu giữa các đối tượng với một hàm tùy ý trong chương trình (hàm friend) hoặc chia sẻ các thành phần của đối tượng có thuộc tính private hay protected với các đối tượng khác (lớp friend).
Các tính chất của quan hệ friend:
Phải được cho, không được nhận
Lớp B là bạn của lớp A, lớp A phải khai báo rõ ràng B là bạn của nó
Không đối xứng, Không bắc cầu
Quan hệ friend có vẻ như vi phạm khái niệm đóng gói (encapsulation) của OOP nhưng có khi lại cần đến nó để cài đặt các mối quan hệ giữa các lớp và khả năng đa năng hóa toán tử trên lớp (sẽ đề cập ở chương sau)

Ví dụ
class COUNTERCLASS{
    int Counter;
public:
    char CounterChar;
    void Init( char );
    void AddOne( ){
        Counter++;
    }
    friend int Total (int);
};
COUNTERCLASS MyCounter[26];     //Có 26 đối tượng
int Total(int NumberObjects)
{
    for (int i=0, sum=0; i<NumberObjects; i++)
        sum += MyCounter[i].Counter
        //Tính tổng số ký tự trong số các Objects ký tự
    return sum;
}

Lưu ý:
Vị trí của khai báo “bạn bè” trong lớp hoàn toàn tùy ý
Trong hàm bạn, không còn tham số ngầm định this như trong hàm thành phần
Hàm bạn của một lớp có thể có một hay nhiều tham số, hoặc có thể có giá trị trả về thuộc kiểu lớp đó
Một lớp có thể truy cập đến các thành phần có thuộc tính private của một lớp khác.
Để thực hiện được điều này, chúng ta có thể lấy toàn bộ một lớp làm bạn (lớp friend) cho lớp khác.

Ví dụ
class TOM{
public:
    friend class JERRY;     //Có lớp bạn là JERRY
private:
    int SecretTom;      //Bí mật của TOM
};
class JERRY{
public:
    void Change(TOM T){
        T.SecretTom++;  //Bạn nên có thể truy cập
    }
};

Wednesday, June 17, 2015

[oop c++] hàm thiết lập constructor, hủy bỏ destructor

Trong hầu hết các thuật giải, để giải quyết một vấn đề thường phải thực hiện các công việc:
Khởi tạo giá trị cho biến, cấp phát vùng bộ nhớ của biến con trỏ, mở tập tin để truy cập,…
Hoặc khi kết thúc, chúng ta phải thực hiện quá trình ngược lại như: Thu hồi vùng bộ nhớ đã cấp phát, đóng tập tin,…
Các ngôn ngữ OOP có các phương thức để thực hiện công việc này một cách “tự động” gọi là phương thức thiết lập và phương thức hủy bỏ.

Constructor 

[oop c++] con trỏ this và phép gán đối tượng

Con trỏ this


Từ khoá this trong định nghĩa của các hàm thành phần lớp dùng để xác định địa chỉ của đối tượng dùng làm tham số ngầm định cho hàm thành phần.
Con trỏ this tham chiếu đến đối tượng đang gọi hàm thành phần.
Ví dụ:
int Trung(point pt){
return (this -> x == pt.x && this -> y == pt.y);
}

Phép gán đối tượng

Là việc sao chép giá trị các thành phần dữ liệu từ đối tượng a sang đối tượng b tương ứng từng đôi một
Ví dụ:
point a, b;
a.init(5,2);
b = a;

[OOP C++] Phạm Vi Truy Xuất Thành Phần Đối Tượng

Trong định nghĩa của lớp ta có thể xác định khả năng truy xuất thành phần của một lớp nào đó từ bên ngoài phạm vi lớp.
private, protected và public là các từ khoá xác định phạm vi truy xuất
Mọi thành phần được liệt kê trong phần public đều có thể truy xuất trong bất kỳ hàm nào.
Những thành phần được liệt kê trong phần private chỉ được truy xuất bên trong phạm vi lớp.
Trong lớp có thể có nhiều nhãn private và public
Mỗi nhãn này có phạm vi ảnh hưởng cho đến khi gặp một nhãn kế tiếp hoặc hết khai báo lớp.
Nhãn private đầu tiên có thể bỏ qua vì C++ ngầm hiểu rằng các thành phần trước nhãn public đầu tiên là private.

Tuesday, June 16, 2015

Viết chương trình nhập số thực a từ bàn phím và tìm số tự nhiên n nhỏ nhất sao cho: 1 + 1/2 + 1/3 +…+ 1/n > a Với số n tìm được hãy tính tổng vế trái.

chuong trinh c:
/*
Viết chương trình nhập số thực a từ bàn phím và tìm số tự nhiên n nhỏ nhất sao cho:
1 + 1/2 + 1/3 +…+ 1/n > a Với số n tìm được hãy tính tổng vế trái.
*/
#include<stdio.h>
#include<conio.h>
int main()
{
    float a,t;
    int n,i;
    printf("a=");
    scanf("%f",&a);
    t=0;i=0;
    while(t<=a)
    {
        i++;
        t+=float(1)/float(i);
    }
    printf("N = %d\ntong vt = %f",i,t);
    getch();
    return 0;
}

Monday, June 15, 2015

[C/C++] nhập vào họ và tên, in ra tên

viết chương trình [C/C++] nhập vào họ và tên, sau đó xử lý chuỗi và in ra tên của người đó.
#include<stdio.h>
#include<string.h>
#include<conio.h>
int main()
{
    char s[100];
    printf("ho ten:");
    fflush(stdin);
    gets(s);
    char a[100];
    char c;
    int j=0;
    for(int i=strlen(s)-1;i>=0 && s[i]!=' ';i--) a[j++]=s[i];
    a[j]='\0';
    for(int i=0;i<strlen(a)/2;i++)
    {
        c=a[i];
        a[i]=a[strlen(a)-1-i];
        a[strlen(a)-1-i]=c;
    }
    printf("ten: %s",a);
    getch();
    return 0;
}

Thursday, June 11, 2015

hàm xóa node trong cây nhị phân tìm kiếm

hàm xóa node trong cây nhị phân tìm kiếm
void thaythe(tree &t,node *p)
{
    if(t->left) thaythe(t->left,p);
    //nếu nhánh bên trái còn tức là khác NULL thì tiếp tực nhảy đến nhánh bến trái
    //cho đến khi nào nó là cực trái thì thôi
    else//nó đã là node cực trái
    {
        p->key=t->key;
        //p là con trỏ truyền vào, mọi thay đỏi về bộ nhớ, ô nhớ hay giá trị đều thay đỏi trên
        //hàm xoa(tree &t,int x) đã gọi nó.
        //lúc này p là node cần xóa ở hàm xóa, ta không xóa node mà thay thế giá trị cho nó
        //rồi chuyển nó đến 1 ô nhớ khác, 
        //ô nhớ mà t đang tìm để thay thế để hàm xoa() gọi delete nó.
        p=t;//node t là node ta đã tìm ra để thay thế 
        //nên p=t; tức là sẽ xóa T thay cho p ban đầu
        //nên p(node sẽ xóa ở hàm ngoài) nhảy đến ô nhớ của node thay thế là node T , p=t;
        t=t->right;
        //vì t sẽ bị xóa thông qua p nên t phải nhay đến nhánh bên phải 
        //để làm liến mạch liên kết với cha như đã lý giải ở hàm xóa
        //vì sao lại trỏ right là không phải trỏ left?
        //vì T là node thay thế, là node cực trái, 
        //tức nhánh trái = NULL còn nhánh phải có thể khác NULL
        //hoắc bằng NULL, t không cần xác định, chỉ cần 
        //trỏ t->right để làm liền mạch liên kết đến node cha đã gọi đến nó
        //là ok.
    }
}
void xoa(tree &t,int x)//hàm xóa node trong cây nhị phân tìm kiếm
{
    if(t)//nếu cây t!=NULL
    {
        if(x<t->key) xoa(t->left,x);//nếu x < key xóa bên trái
        else if(x>t->key) xoa(t->right,x);//xóa bên phải
        else//đã tìm thấy node cần xóa
        {
            node *p=t;//gán node cần xóa cho p
            if(t->left==NULL) t=t->right;
            //nếu node cần xóa có 1 cây con bên phải
            else if(t->right==NULL) t=t->left;
            //hoặc 1 cây con bên trái
            //thì T được truyền vào trong đối số hàm nhảy sang trái hoăc sang phải như trên
            //vì sao nó liên kết được với node cha??
            //vì node cha đang trỏ đến con trỏ t (tree &t) 
            //ở dạng tham chiếu luôn nên mọi thay đổi trên t
            //thì đều thay đổi trên cấu trúc của node cha, node gọi đến hàm này
            //vì thế node cha của node cần xóa hiện tại 
            //sẽ trỏ đến t, và khi t=t->right; thì
            //node cha của node cần t cần xóa vẫn đang trỏ 
            //đến t với giá trị là ô địa chỉ mới t->right;
            else thaythe(t->right,p);
            //nếu ndoe t cần xóa có 2 nhánh con thì tìm node cực trái của nhánh phải
            //hoặc ngược lại cũng có thể được
            delete p;
        }
    }
    //lưu ý cần nhớ.
    //khi đối số của hàm là còn trỏ hoặc tham chiếu 
    //thì mọi thay đổi trên nó đều thay đổi đến biến của hàm đã gọi nó, 
    //thay đổi đến cụ diện chung của biến, của hàm đã gọi nó.
}

Wednesday, June 10, 2015

[C/C++] chương trình quản lý sách

Viết chương trình quản lí sách. Mỗi cuốn sách gồm tên sách, tên nhà xuất bản, năm xuất bản, giá tiền, số lượng:
a. Đưa ra danh sách các cuốn sách của nhà xuất bản Giáo dục.
b. Tính tổng số tiền sách.
c. Sắp xếp danh sách giảm theo năm xuất bản và in kết quả ra màn hình.
d. In ra màn hình các cuốn sách có giá tiền<=10.000đ và xuất bản sau năm 2006.

#include<iostream>
#include<string>
using namespace std;
struct sach
{
    string ten,nxb;
    int nam,soluong;
    long long gia;
};
void nhap(sach *l,int n)
{
    for(int i=0;i<n;i++)
    {
        cout<<"\nnhap sach thu "<<i+1<<endl;
        cout<<"ten sach:";fflush(stdin);getline(cin,l[i].ten);
        cout<<"ten nha xuat ban :";fflush(stdin);getline(cin,l[i].nxb);
        cout<<"nam :";cin>>l[i].nam;
        cout<<"so luong:";cin>>l[i].soluong;
        cout<<"gia:";cin>>l[i].gia;
    }
}
void xuatnxbgiaoduc(sach *l,int n)
{
    for(int i=0;i<n;i++)
        if(l[i].nxb=="giao duc") cout<<l[i].ten<<endl;
}
long long tongtien(sach *l,int n)
{
    long long tong=0;
    for(int i=0;i<n;i++) tong+=l[i].gia;
    return tong;
}
void sapxep(sach *l,int n)
{
    for(int i=0;i<n-1;i++)
        for(int j=i+1;j<n;j++)
            if(l[i].nam < l[j].nam) swap(l[i],l[j]);
    for(int i=0;i<n;i++) cout<<l[i].ten<<endl;
}
void xuattien10(sach *l,int n)
{
    for(int i=0;i<n;i++)
        if(l[i].nam >= 2006 && l[i].gia<=10000) cout<<l[i].ten<<endl;
}
void main()
{
    sach l[100];
    int n;
    cout<<"nhap so loai sach:";cin>>n;
    nhap(l,n);
    cout<<"\ncac loai sach nha xuat ban giao duc\n";
    xuatnxbgiaoduc(l,n);
    cout<<"\ntong so tien sach = "<<tongtien(l,n);
    cout<<"\ndanh sach giam theo nam xuat ban\n";
    sapxep(l,n);
    cout<<"\ncac sach sau 2006 va tien <=10.000\n";
    xuattien10(l,n);
    system("pause");
}

[C/C++] quản lý điểm của lớp học

Viết chương trình quản lý điểm của một lớp học gồm có các chức năng sau:
a. Nhập hồ sơ của một sinh viên gồm có: Họ và tên, năm sinh, điểm trung bình học kỳ 1 và điểm trung bình học kỳ 2.
b. In danh sách các học sinh của lớp có điểm trung bình cả năm từ 5 điểm trở lên và theo thứ tự giảm dần của điểm trung bình cả năm.
c. In danh sách các học sinh phải thi lại (điểm trung bình dưới 5).
#include<iostream>
#include<string>
using namespace std;
struct sinhvien
{
    string ten;
    int nam;
    float dtb1,dtb2;
};
void main()
{
    sinhvien list[100];
    int n;
    cout<<"\nnhap so luong sinh vien N=";cin>>n;
    for(int i=0;i<n;i++)
    {
        cout<<"\nNhap sinh vien thu "<<i+1<<endl;
        cout<<"\nho ten:";fflush(stdin);getline(cin,list[i].ten);
        cout<<"nam sinh:";cin>>list[i].nam;
        cout<<"diem trung binh hk1:";cin>>list[i].dtb1;
        cout<<"diem trung binh hk2:";cin>>list[i].dtb2;
    }
    ///sap xep giam dan
    for(int i=0;i<n-1;i++)
        for(int j=i+1;j<n;j++)
            if((list[i].dtb1+list[i].dtb2)/2 < (list[j].dtb1+list[j].dtb2)/2) swap(list[i],list[j]);
    //xuat
    cout<<"danh sach >=5\n";
    for(int i=0;i<n;i++)
        if((list[i].dtb1+list[i].dtb2)/2 >=5) cout<<list[i].ten<<endl;
    cout<<"danh sach thi lai\n";
    for(int i=0;i<n;i++)
        if((list[i].dtb1+list[i].dtb2)/2 <5) cout<<list[i].ten<<endl;
    system("pause");
}

Thursday, June 4, 2015

đề thi và đáp án môn cấu trúc dữ liệu và giải thuật

đề thi và đáp án môn CTDL & GT cấu trúc dữ liệu và giải thuật , lập trình c/c++
1. tạo 2 danh sách liên kết đơn l1,l2 với giá trị của các node trong danh sách là số nguyên.việc nhập mỗi danh sách kêt thúc khi nhập vào số 0. in các giá trị l1, l2 ra màn hình
2. viết hàm merge thực hiện việc trộn luân phiên danh sách l2 vào l1 sao cho sau khi trộn l2 rỗng
3. viết hàm sắp xếp danh sách l1 giảm dần theo trường dữ liệu.
4. chèn 1 số nguyên vào danh sách sao cho vẫn đảm bảo tính giảm dần của l1.

code bài làm:

#include<iostream>
using namespace std;
typedef struct tagnode
{
    int x;
    struct tagnode *next;
}node;
typedef struct taglist
{
    node *dau;
    node *cuoi;
}list;
void khoitao(list &l)
{
    l.dau=l.cuoi=NULL;
}
node *taonode(int x)
{
    node *p=new node;
    if(p==NULL) exit(1);
    p->x=x;
    p->next=NULL;
    return p;
}
void themcuoi(list &l,node *p)
{
    if(l.dau==NULL) l.dau=l.cuoi=p;
    else
    {
        l.cuoi->next=p;
        l.cuoi=p;
    }
}
void nhap(list &l)
{
    int x;
    node *p;
    do{
        cin>>x;
        if(x!=0)
        {
            p=taonode(x);
            themcuoi(l,p);
        }
    }while(x!=0);
}
void xuat(list l)
{
    node *p=l.dau;
    while(p!=NULL)
    {
        cout<<p->x<<" ";
        p=p->next;
    }
}
void sapxep(list &l)
{
    node *p1=l.dau,*p2;
    while(p1!=NULL)
    {
        p2=p1->next;
        while(p2!=NULL)
        {
            if(p2->x > p1->x) swap(p1->x,p2->x);
            p2=p2->next;
        }
        p1=p1->next;
    }
}
void xoadau(list &l)
{
    if(l.dau!=NULL)
    {
        node *p=l.dau;
        if(l.dau==l.cuoi)
        {
            l.dau=l.cuoi=NULL;
            delete p;
        }
        else
        {
            l.dau=l.dau->next;
            delete p;
        }
    }
}
void themdau(list &l,node *p)
{
    if(l.dau==NULL) l.dau=l.cuoi=p;
    else
    {
        p->next=l.dau;
        l.dau=p;
    }
}
void themsauQ(list &l,node *Q,node *p)
{
    if(Q==NULL) themdau(l,p);
    else if(Q==l.cuoi) themcuoi(l,p);
    else
    {
        p->next=Q->next;
        Q->next=p;
    }
}
void merge(list &l1,list &l2)
{
    node *p=l1.dau,*p1;
    while(l2.dau!=NULL && p!=NULL)
    {
        p1=taonode(l2.dau->x);
        themsauQ(l1,p,p1);
        xoadau(l2);
        if(p!=l1.cuoi) p=p->next;
        if(p!=l1.cuoi) p=p->next;
    }
}
void insert(list &l,int a)
{
    node *p1=taonode(a);
    node *p=l.dau,*p2=NULL;
    while(p!=NULL)
    {
        if(a>p->x)
        {
            if(p2==NULL) themdau(l,p1);
            else themsauQ(l,p2,p1);
            break;
        }
        p2=p;
        p=p->next;
    }
}
void main()
{
    list l1,l2;
    khoitao(l1);khoitao(l2);
    cout<<"nhap l1:\n";
    nhap(l1);
    cout<<"nhap l2:\n";
    nhap(l2);
    cout<<"\nxuat cac gia tri:\nl1: ";
    xuat(l1);
    cout<<"\nl2: ";
    xuat(l2);
    cout<<"\ncac gia tri l1,l2 sau khi merge:\n";
    merge(l1,l2);
    cout<<"l1: ";xuat(l1);
    cout<<"\nl2: ";xuat(l2);
    cout<<"\nsau khi sap xep giam danh sach l1:\n";
    sapxep(l1);
    xuat(l1);
    cout<<"\nnhap X=";
    int x;cin>>x;
    insert(l1,x);
    cout<<"l1: ";xuat(l1);
    cout<<endl;
    system("pause");
}

Tuesday, June 2, 2015

thao tác file với thư viện fstream

Để sử dụng được thư viện fstream, ta phải include thư viện fstream và using namespace std;

#include <fstream>
using namespace std;
Điều đầu tiên, ta tạo ra một đối tượng fstream. Ta sẽ thao tác với file thông qua đối tượng đó.

fstream f;
Để mở một file, ta dùng phương thức open sau:

f.open(filePath, mod);
Trong đó:

filePath có kiểu dữ liệu là const char*, là đường dẫn đến file cần mở.
mod là chế độ mở file. Chúng ta có một số chế độ như sau:
ios::in Mở file để đọc.
ios::out Mở file có sẵn để ghi
ios::binary Mở file ở chế độ nhị phân.
ios:ate Mở file và đặt con trỏ file vào cuối file.
ios::app Mở file và ghi dữ liệu vào cuối file. Nếu file không tồn tại thì tạo file mới.
ios::trunc Chế độ mở file, xóa bỏ hoàn toàn nội dung trong file được mở.

Monday, June 1, 2015

kinh nghiệm phỏng vấn học bổng NVĐ FPT


Dưới đây là chia sẻ của một bạn tân sinh viên khóa 10 vừa nhận học bổng trị giá 100%. Hy vọng những chia sẻ này sẽ giúp ích cho các bạn phần nào trong cuộc phỏng vấn giành học bổng rất giá trị của ĐH FPT. Chúc các bạn thành công nhé.