ngÔn ngỮ lẬp trÌnh c/c++fit.hnue.edu.vn/~trungnc/textbookandlecturenote/ki thuat lap trinh...

68
Faculty of Information Technology NGÔN NGỮ LẬP TRÌNH C/C++ TS. Nguyễn Chí Trung Khoa Công nghệ thông tin Đại học Sư Phạm Nội

Upload: others

Post on 29-Dec-2019

7 views

Category:

Documents


0 download

TRANSCRIPT

  • Facu

    lty o

    f In

    form

    ati

    on

    Tech

    no

    log

    y

    NGÔN NGỮ LẬP TRÌNH C/C++

    TS. Nguyễn Chí Trung

    Khoa Công nghệ thông tin

    Đại học Sư Phạm Hà Nội

  • 1. Cài đặt xâu kí tự bằng con trỏ kiểu char

    2. XD các phép toán trên xâu lí tự thông qua con trỏ kiểu char

    3. Một số bài toán xử lí xâu kí tự trên lớp String của C++

    4. Mảng các phần tử là xâu lí tự

    5. Truyền xâu kí tự vào hàm

    6. Truyền xâu kí tự vào hàm; Dùng file văn bản vào/ra DL xâu kí tự

    Chương 5. Con trỏ và xâu lí tự

  • • Cài đặt xâu kí tự bằng mảng kiểu char

    • Cài đặt xâu kí tự bằng con trỏ kiểu char

    • Cấp phát bộ nhớ động cho con trỏ kiểu char

    • Xây dựng các phép toán trên xâu kí tự quản lí bởi con

    trỏ kiểu char

    1. Cài đặt xâu kí tự bằng con trỏ kiểu char

  • • Xâu kí tự có thể được cài đặt bằng mảng kiểu char như sau:

    char s[10];

    • Nếu s chứa xâu kí tự “Hi Mom!”, nó được lưu trữ trong mảng sau:

    • Các chú ý:

    xâu s trong C là mảng kí tự, mỗi s[i] là một kí tự, i = 0, 1, ..., 9

    s lưu được 9 kí tự

    kí tự thứ 7 là kí tự ‘\0’ (NULL) được tự động thêm vào. Điều

    này khác với mảng chuẩn; không được phép gán s[7] bằng kí tự

    khác, vì nó đè lên NULL.

    Tên mảng s là hằng địa chỉ

    Cài đặt xâu kí tự bằng mảng kiểu char

    NCT.FIT.HNUE 4

    s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9]

    H i M o m ! \0 ? ?

  • • Khởi tạo xâu được cài đặt bởi mảng kiểu char có thể thực hiện

    bằng một trong 2 cách sau:

    • Cách 1

    char s[50] = “Hello World!” ;

    //Không cần đủ kích thước

    //Kí tự NULL được tự động thêm vào cuối

    • Cách 2

    char s[] = “Hello!” ;

    //Tự động tính kích thước mảng

    //Khác với lệnh

    char s[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘!’};

    Cài đặt xâu kí tự bằng mảng kiểu char

    NCT.FIT.HNUE 5

  • • Có thể dùng con trỏ kiểu char để cài đặt xâu kí tự

    char *s ;

    • Chú ý so sánh hai cách dùng mảng kiểu char và con trỏ kiểu char

    Cài đặt xâu kí tự bằng con trỏ kiểu char

    NCT.FIT.HNUE 6

    char x[10]; char *y;

    - Nhập được bằng gets(x)

    - In ra được bằng puts(x)

    - Không gán được hằng xâu kí

    tự cho biến mảng kí tự x, tức

    là lệnh x = “Hello” sai (vì

    không gán 2 hằng địa chỉ cho

    nhau)

    - Không nhập được bằng

    gets(y) vì chưa biết y trỏ vào

    địa chỉ xâu kí tự nào

    - In ra được bằng puts(y) vì

    khi đó mặc định y đã trỏ tới

    địa chỉ xác định của 1 xâu

    - Nhưng y=“Hello!” đúng.

  • • Nhập xâu được xác định bởi con trỏ kiểu char trong C

    #include

    #include

    #include

    int main(){

    char *s; int n=30;

    s=(char*) malloc (n*sizeof(char));

    puts("nhap s: "); gets(s);

    cout

  • • Nhập xâu được xác định bởi con trỏ kiểu char trong C++

    #include

    #include

    using namespace std;

    int main(){

    char *s; int n=30;

    s = new char[n+1];

    cout

  • Phân biệt 2 cách dùng malloc và new

    NCT.FIT.HNUE 9

    Trong C Trong C++

    char tg[100];

    gets(tg);

    /* Cấp phát bộ nhớ cho con trỏ s kiểu

    char để có thể chứa được dãy ký tự

    trong mảng tg */

    char *s;

    int len;

    len=strlen(tg);

    s=(char*) malloc ((len+1)*sizeof(char));

    strcpy(s,tg);

    //......Các lệnh sử dụng s

    free(s); /* Giải phóng bộ nhớ */

    char tg[100];

    gets(tg);

    /* Cấp phát bộ nhớ cho con trỏ s

    kiểu char để có thể chứa được dãy

    ký tự trong mảng tg */

    char *s;

    int len=strlen(tg);

    s = new char[len+1]

    strcpy(s,tg);

    //.... Các lệnh sử dụng s

    delete s; // Giải phóng bộ nhớ

    • Phân biệt 2 cách dùng malloc và new trong hai đoạn trình sau

  • Cài đặt xâu kí tự bằng con trỏ kiểu char

    NCT.FIT.HNUE 10

    #include

    #include

    #include

    using namespace std;

    int main(){

    char tg[100];

    cout

  • 2. Xây dựng các phép toán cơ bản trên xâu

    được quản lý bởi con trỏ kiểu char

    • Hàm copy(s, i, n) và hàm clean(s)

    • Hàm Syntax(s) và các hàm

    delete(s, i, n);

    insert(x, s, k);

    pos(x, s);

  • • Các hàm và thủ tục thông dụng trên xâu trong Pascal

    Review: Các hàm và thủ tục tiện ích trên xâu

    NCT.FIT.HNUE 12

    Hàm và thủ tục Ví dụ

    copy(s, i, n) copy(‘K64K, FIT’, 2, 3) = ‘64K’

    copy(‘K64K, FIT’, 7, 10) = ‘FIT’

    pos(x, s) pos(‘64K’, ‘K64K, FIT’) = 2

    (Nếu bằng 0 thì không có x trong s)

    delete(s, i, n) s := ‘K64K, FIT.HNUE’;

    delete(s, 5, 5); s = ‘K64K.HNUE’

    Insert(x, s, i) s := ‘K64K.HNUE’;

    Insert(‘, FIT’, s, 5); s = ‘K64K, FIT.HNUE’;

  • • Xây dựng hàm copy(s, k, n). Vận dụng để đếm số từ trong xâu

    Hàm copy

    NCT.FIT.HNUE 13

    #include

    #include

    #define max 200

    using namespace std;

    char *copy(char *s,int k,int n);

    int main() {

    char x[max],s[max];

    int k,lx,d=0;

    cout

  • • Xây dựng hàm clean(s) xóa các dấu cách vô nghĩa trong xâu

    Hàm clean

    NCT.FIT.HNUE 14

    #include

    #include

    #define max 100

    using namespace std;

    char *clean(char *s);

    void mycout(char *s);

    int main() {

    char tg[max],*s;

    cout

  • Xây dựng chương trình để sửa lỗi cú pháp trong văn bản

    Chương trình để sửa lỗi cú pháp trong văn bản

    NCT.FIT.HNUE 15

    #include

    #include

    #include

    #define max 100

    #define sperator ','

    #define pointstop '.'

    using namespace std;

    //

    char *myinsert(char *x,char *s,int k);

    char *mydelete(char *s,int k,int n);

    char *mycopy(char *s,int k,int n);

    int pos(char *x,char *s);

    char *syntax(char *s,char symbol);

    void mycout(char *s);

    //

    int main() {

    char tg[max],s[max],x[max];

    cout

  • Xây dựng các hàm myinsert, mydelete

    Các hàm insert, delete kiểu char

    NCT.FIT.HNUE 16

    char *myinsert

    (const char *x,char *s,int k)

    {

    int i,j1=0,j2=0;

    char s1[max],s2[max];

    for(i=0;i

  • Xây dựng các hàm mycopy, pos, và mycout

    Các hàm copy, pos và cout

    NCT.FIT.HNUE 17

    char *mycopy(char *s,int k,int n) {

    int i,j=0;

    char *s1;

    s1 = new char [strlen(s)+1];

    for(i=0;s[i]!='\0';i++)

    if((i>=k)&&(j

  • Xây dựng hàm Syntax kiểu char

    Hàm syntax kiểu char

    NCT.FIT.HNUE 18

    char *syntax(char *s,char symbol) {

    #define space ' '

    #define error1 " ," // cách phẩy

    #define error2 ", " // phẩy cách cách

    #define error3 " ." // cách chấm

    #define error4 ". " // chấm cách cách

    int k,ls,i=0;

    ls=strlen(s);

    while(i-1) mydelete(s,k,1);

    while((k=pos(error2,s))>-1) mydelete(s,k+1,1);}

    else {

    while((k=pos(error3,s))>-1) mydelete(s,k,1);

    while((k=pos(error4,s))>-1) mydelete(s,k+1,1);}

    return(s); }

  • 3. Một số bài toán xử lí xâu kí tự

    sử dụng lớp String của C++

    • Phong cách lập trình mới

    • Lớp String

  • • Bài 1. Hãy lập trình đếm số lần xuất hiện của xâu con

    trong một xâu

    • INPUT: Xâu S và xâu x

    • OUTPUT: d = số lần xuất hiện của x trong S

    Đếm xâu con

    NCT.FIT.HNUE 20

  • • Bài 1. Đếm số lần xuất hiện của xâu con x trong xâu s

    Đếm xâu con

    NCT.FIT.HNUE 21

    #include

    using namespace std;

    string s, x; int d;

    void enter()

    { cin >> s >> x;

    }

    void solve()

    { for(int i=0; i+x.size()

  • • Bài 2. Hãy lập trình Đếm số từ, số câu, số từ độ dài 3; tìm một từ

    dài nhất, tìm một câu dài nhất. Giả sử giữa hai từ trong xâu Input

    chỉ có một dấu cách.

    • INPUT: Xâu S

    • OUTPUT:

    – st : số từ trong S

    – sc: số câu trong S

    – st3: số từ độ dài 3 trong xâu S

    – wm: từ dài nhất

    – sm: câu có độ dài dài nhất trong các câu trong S

    Thống kê văn bản

    NCT.FIT.HNUE 22

  • • Bài 2. Đếm số từ, số câu, tìm từ max, câu max, từ leng = 3

    Thống kê văn bản

    NCT.FIT.HNUE 23

    #include

    using namespace std;

    const int maxn=1000;

    int t;

    string s[maxn], S;

    void enter() {

    while(cin>>s[++t]);

    t--; S="";

    for(int i=1; i

  • • Bài 2. Đếm số từ, số câu, tìm từ max, câu max, từ leng = 3

    Thống kê văn bản

    NCT.FIT.HNUE 24

    void solve(){

    int danhDau=0, slTu=0,

    slTuDoDai3=0;

    int tudodaiMax=0,

    caudodaiMax=0, slCau=0;

    string wm, sm;

    for(int i=0; i

  • • Bài 2. Đếm số từ, số câu, tìm từ max, câu max, từ leng = 3

    Thống kê văn bản

    NCT.FIT.HNUE 25

    #define task "bai2"

    int main() {

    freopen(task".inp", "r", stdin);

    freopen(task".out", "w", stdout);

    enter();

    solve();

    return 0;

    }

  • • Bài 3. Một văn bản bị lỗi thừa dấu cách là văn bản có ít nhất một

    trong các lỗi sau:

    – Giữa 2 từ có nhiều hơn một dấu cách

    – Có dấu cách ở đầu văn bản

    – Có dấu cách ở cuối văn bản

    • Hãy lập chương trình tạo và sử dụng hàm sửa lỗi về thừa dấu cách

    trong văn bản.

    • INPUT: S: Một đoạn văn bản có lỗi thừa dấu cách

    • OUTPUT: S: Đoạn văn bản không có lỗi thừa dấu cách

    Sửa lỗi dấu cách trong văn bản

    NCT.FIT.HNUE 26

  • • Bài 3. Sửa lỗi dấu cách

    Sửa lỗi dấu cách trong văn bản

    NCT.FIT.HNUE 27

    #include

    using namespace std;

    string c; string s;

    string read_paragraph( istream &is )

    {

    string line, s="";

    do

    {

    getline(is, line);

    if(line!="")s+=line+'\n';

    } while(line!="");

    return s;

    }

  • • Bài 3. Sửa lỗi dấu cách

    Sửa lỗi dấu cách trong văn bản

    NCT.FIT.HNUE 28

    void enter()

    {

    s=read_paragraph(cin);

    }

    string fix( string s )

    {

    while(s.size()>0 && s[0]==‘ ')

    s.erase(0, 1);

    while(s.size()>0 && s[(int)s.size()-1]==' '

    || s[(int)s.size()-1]=='\n')

    s.erase((int)s.size()-1, 1);

    string res="";

    for(int i=0; i

  • • Bài 3. Sửa lỗi dấu cách

    Sửa lỗi dấu cách trong văn bản

    NCT.FIT.HNUE 29

    void solve()

    {

    s=fix(s);

    cout

  • • Bài 4. Một văn bản bị lỗi về dấu ngăn cách, ví dụ dấu ngăn cách là

    dấu phẩy (,), là văn bản có ít nhất một trong các lỗi sau:

    – Có dấu cách trước dấu phẩy, ví dụ “Ha Noi , thu do cua Viet

    Nam”

    – Không có dấu cách sau dấu phẩy, ví dụ “Ha Noi ,thu do cua Viet

    Nam”

    • Hãy lập chương trình tạo và sử dụng một hoặc một số hàm sửa lỗi

    về các dấu ngăn cách sau đây trong văn bản: dấu phẩy (,), dấu chấm

    (.), dấu hai chấm (:), dấu chấm than (!).

    • INPUT: S: Một đoạn văn bản có lỗi về dấu ngăn cách

    • OUTPUT: S: Đoạn văn bản không có lỗi về dấu ngăn cách

    Sửa lỗi dấu cách tổng quát trong văn bản

    NCT.FIT.HNUE 30

  • • Bài 4. Sửa lỗi dấu cách tổng quát

    Sửa lỗi dấu cách tổng quát trong văn bản

    NCT.FIT.HNUE 31

    #include

    using namespace std;

    string c; string s;

    string read_paragraph( istream &is )

    {

    string line, s="";

    do

    {

    getline(is, line);

    if(line!="")s+=line+'\n';

    } while(line!="");

    return s;

    }

    void enter()

    {

    s=read_paragraph(cin);

    }

  • • Bài 4. Sửa lỗi dấu cách tổng quát

    Sửa lỗi dấu cách tổng quát trong văn bản

    NCT.FIT.HNUE 32

    string fix( string s )

    {

    while(s.size()>0 && s[0]==' ') s.erase(0, 1);

    while(s.size()>0 && s[(int)s.size()-1]==' ' ||

    s[(int)s.size()-1]=='\n') s.erase((int)s.size()-1, 1);

    string res="";

    for(int i=0; i

  • • Bài 4. Sửa lỗi dấu cách tổng quát

    Sửa lỗi dấu cách tổng quát trong văn bản

    NCT.FIT.HNUE 33

    bool dau(char c)

    {

    return c=='.' || c==',' || c==':' || c=='!';

    }

    string fixDau(string s)

    {

    for(int i=0; i

  • • Bài 4. Sửa lỗi dấu cách tổng quát

    Sửa lỗi dấu cách tổng quát trong văn bản

    NCT.FIT.HNUE 34

    void solve()

    {

    s=fix(s);

    s=fixDau(s);

    cout

  • • Bài 5. Một văn bản bị lỗi về viết hoa là văn bản có ít nhất một

    trong các lỗi sau:

    – Từ đầu câu không viết hoa

    – Viết hoa trong câu (giả sử không xét các trường hợp đặc biệt)

    • Hãy lập chương trình tạo và sử dụng một hàm sửa lỗi về viết hoa

    trong văn bản.

    • INPUT: S: Một đoạn văn bản có lỗi về viết hoa

    • OUTPUT: S: Đoạn văn bản không có lỗi về viết hoa

    Sửa lỗi viết hoa trong văn bản

    NCT.FIT.HNUE 35

  • • Bài 5. Sửa lỗi không viết hoa đầu câu

    Sửa lỗi viết hoa trong văn bản

    NCT.FIT.HNUE 36

    #include

    using namespace std;

    string c; string s;

    string read_paragraph( istream &is )

    {

    string line, s="";

    do

    {

    getline(is, line);

    if(line!="")s+=line+'\n';

    } while(line!="");

    return s;

    }

    void enter()

    {

    s=read_paragraph(cin);

    }

  • • Bài 5. Sửa lỗi không viết hoa đầu câu

    Sửa lỗi viết hoa trong văn bản

    NCT.FIT.HNUE 37

    string fix( string s )

    {

    while(s.size()>0 && s[0]==' ') s.erase(0, 1);

    while(s.size()>0 && s[(int)s.size()-1]==' ' ||

    s[(int)s.size()-1]=='\n') s.erase((int)s.size()-1, 1);

    string res="";

    for(int i=0; i

  • • Bài 5. Sửa lỗi không viết hoa đầu câu

    Sửa lỗi viết hoa trong văn bản

    NCT.FIT.HNUE 38

    bool dau(char c)

    {

    return c=='.' || c==',' || c==':' || c=='!';

    }

    string fixDau(string s)

    {

    for(int i=0; i

  • • Bài 5. Sửa lỗi không viết hoa đầu câu

    Sửa lỗi viết hoa trong văn bản

    NCT.FIT.HNUE 39

    bool thuong(char c)

    {

    return 'a'

  • • Bài 5. Sửa lỗi không viết hoa đầu câu

    Sửa lỗi viết hoa trong văn bản

    NCT.FIT.HNUE 40

    string fixHoa(string s)

    {

    if(thuong(s[0]))upcase(s[0]); //cout

  • • Bài 5. Sửa lỗi không viết hoa đầu câu

    Sửa lỗi viết hoa trong văn bản

    NCT.FIT.HNUE 41

    void solve()

    {

    s=fix(s);

    s=fixDau(s);

    s=fixHoa(s);

    cout

  • • Bài 6. Một văn bản bị lỗi văn phạm là văn bản có ít nhất một trong

    các lỗi sau:

    – Lỗi thừa dấu cách

    – Lỗi về dấu ngăn cách

    – Lỗi về viết hoa

    • Hãy lập chương trình tạo và sử dụng một hoặc một số hàm sửa lỗi

    văn phạm.

    • INPUT: S: Một đoạn văn bản có lỗi về văn phạm

    • OUTPUT: S: Đoạn văn bản không có lỗi về văn phạm

    Sửa lỗi văn phạm trong văn bản

    NCT.FIT.HNUE 42

    • SV TỰ LÀM

  • • Cách khai báo, cách nhập

    • Nguyên tắc xử lí từng phần tử của mảng (từng xâu)

    4. Mảng các phần tử là xâu lí tự

  • • Hãy so sánh hai chương trình sau

    Phân biệt mảng kí tự và mảng xâu kí tự

    NCT.FIT.HNUE 44

    Mảng kiểu kí tự Mảng của mảng kiểu kí tự

    #include

    #include

    void main(){

    char s[30];

    cout

  • • Các thao tác cơ bản

    Mảng các phần tử là “xâu kí tự”

    NCT.FIT.HNUE 45

    Khai báo

    #include

    #include

    const int maxn = 100;

    const int maxlen = 50;

    char *s[maxn];

    int n;

    char tg[maxlen];

    Nhập

    coutn;

    for(i=0;i

  • • Các thao tác cơ bản

    Mảng các phần tử là “xâu kí tự”

    NCT.FIT.HNUE 46

    Xử lí (ví dụ)

    - Đảo ngược danh sách, sử

    dụng các phép gán

    for(i=0,j=n-1; i

  • • Ví dụ 1: Nhập tên n sinh viên; Sắp xếp danh sách và in kết quả.

    Mảng các phần tử là “xâu kí tự”

    NCT.FIT.HNUE 47

    #include

    #include

    #include

    #include

    #define maxn 100

    #define maxlen 50

    void main()

    { char *s[maxn];

    char tg[maxlen];

    int n;

    int i,j;

    coutn;

    cin.ignore(1);

    cout

  • • Ví dụ 2: Nhập họ tên n sinh viên; Chuyển chữ cái đầu của họ và

    tên thành chữ in hoa;In kết quả.

    Mảng các phần tử là “xâu kí tự”

    NCT.FIT.HNUE 48

    #include

    #include

    #include

    #include

    #define maxn 100

    #define maxlen 50

    void main()

    { char *s[maxn];

    char tg[maxlen];

    int n; int i,j;

    coutn;

    cin.clear();

    cout

  • • Cách khai báo, định nghĩa hàm và gọi hàm

    • Ví dụ minh họa

    5. Truyền xâu kí tự vào hàm

  • • Các thao tác cơ bản

    Truyền mảng “xâu kí tự” vào hàm

    NCT.FIT.HNUE 50

    Khai báo

    const int maxn = 100;

    const maxlen = 50;

    char *s[maxn];

    int n;

    Viết hàm

    kiểu_hàm tên_hàm (char *ps[ ], int &n) {

    // Thân hàm:

    // Phần tử thứ i của mảng là ps[i]

    // ps[i] là một xâu ký tự }

    Gọi hàm

    nhap_ds(s, &n); in_ds(s, n);

    dao_ds(s, n); in_ds(s, n);

  • • Ví dụ 1

    Truyền mảng “xâu kí tự” vào hàm

    NCT.FIT.HNUE 51

    Viết chương trình minh họa sử dụng các hàm sau đây:

    - Nhập một danh sách tên các mặt hàng

    - In danh sách các tên mặt hàng.

    - Tìm kiếm một mặt hàng biết tên mặt hàng nhập từ bàn

    phím

  • • Ví dụ 1: Nhập tên n mặt hàng; In danh sách; Tìm kiếm

    Truyền mảng “xâu kí tự” vào hàm

    NCT.FIT.HNUE 52

    #include

    const int maxn= 100;

    const int maxlen = 50;

    void nhap_ds(char *ps[],int *n)

    { int i; char tg[maxlen];

    cout*n;

    cin.clear();

    cout

  • • Ví dụ 1: Nhập tên n mặt hàng; In danh sách; Tìm kiếm (tiếp)

    Truyền mảng “xâu kí tự” vào hàm

    NCT.FIT.HNUE 53

    int main()

    { char *s[maxn];

    int n;

    char tenh[maxlen];

    nhap_ds(s,&n);

    in_ds(s,n);

    cout

  • • Ví dụ 2

    Truyền mảng “xâu kí tự” vào hàm

    NCT.FIT.HNUE 54

    Xây dựng các hàm sau và minh họa việc sử dụng chúng

    trong main()

    - Nhập từ bàn phím tên của n SV

    - Sắp xếp danh sách tên các SV theo thứ tự giảm dần

    - In danh sách SV lên màn hình

  • • Ví dụ 2: Nhập danh sách tên SV, sắp xếp, in danh sách

    Truyền mảng “xâu kí tự” vào hàm

    NCT.FIT.HNUE 55

    #include

  • • Ví dụ 2: Nhập danh sách tên SV, sắp xếp, in danh sách

    Truyền mảng “xâu kí tự” vào hàm

    NCT.FIT.HNUE 56

    void main()

    { char *s[maxn];

    int n;

    nhap_ds(s,&n);

    sapxep(s,n);

    in_ds(s,n);

    getch();

    }

  • • Sử dụng file văn bản + Không dùng hàm

    • Sử dụng file văn bản + Có dùng hàm

    6. Truyền xâu kí tự vào hàm, sử dụng file

    văn bản để vào ra dữ liệu kiểu xâu kí tự

  • Nguyên tắc chung

    Dùng file đọc/ghi xâu, Không truyền xâu vào hàm

    NCT.FIT.HNUE 58

    Các lệnh đọc/ghi dữ liệu xâu, mỗi xâu một dòng

    freopen(“Input_file_name.txt","r",stdin);

    freopen(“Output_file_name.txt","w",stdout);

    string s[100];

    int n;

    cin >> n; cin.ignore(1);

    for(int i=1; i

  • Ví dụ: Nhập danh sách tên SV; Tìm một tên SV trong danh sách

    Dùng file đọc/ghi xâu; Không truyền xâu vào hàm

    NCT.FIT.HNUE 59

    #include

    #define size 100

    using namespace std;

    const int maxn= 100;

    const int maxlen = 50;

    int timthay(char *s,char *ps[],int n)

    { int i,j=0;

    for(i=0;i> n; cin.ignore(1);

    for(int i=1; i

  • Nguyên tắc chung

    Dùng file đọc/ghi xâu; Có truyền xâu vào hàm

    NCT.FIT.HNUE 60

    Các lệnh đọc/ghi dữ liệu xâu, mỗi xâu một dòng

    FILE *fi, *fo;

    fi = fopen("file_name_Input.txt","r");

    fo = fopen("file_name_Output.txt","w");

    char s[maxlen];

    fgets(s,maxlen,fi); fputs(s,fo);

    Thư viện

    #include

    #include

    #include

    #include

    #include

  • Ví dụ: Nhập danh sách tên SV; Tìm một tên SV trong danh sách

    Dùng file đọc/ghi xâu; Có truyền xâu vào hàm

    NCT.FIT.HNUE 61

    #include

    #define size 100

    using namespace std;

    const int maxn= 100;

    const int maxlen = 50;

    //========

    void nhapds(FILE *fi,char *ps[],int &n)

    { int i; char tg[maxlen];

    fgets(tg,maxlen,fi);n=atoi(tg);

    for(i=0;i

  • Ví dụ: Nhập danh sách tên SV; Tìm một tên SV trong danh sách

    Dùng file đọc/ghi xâu; Có truyền xâu vào hàm

    NCT.FIT.HNUE 62

    int main()

    { char *ds[maxn]; int n;

    char tensv[maxlen];

    FILE *finp, *fout;

    //Nhap du lieu

    finp = fopen("ds_sv.inp","r");

    fout = fopen("ds_sv.out","w");

    nhapds(finp,ds,n); inds(fout,ds,n);

    //Tim kiem

    strcpy(tensv,ds[n+1]);

    fputs(".",fout);

    if (timthay(tensv,ds,n))

    fputs("\n co ten SV nay trong ds",fout);

    else

    fputs("\n khong co ten SV nay trong ds",fout);

    return 0; }

    ds_sv.inp

    4

    Tran Thanh Binh

    Nguyen Thu Thao

    Dang Thi Ha

    Vu Ngoc Quang

    .

    Nguyen Thu Thao

  • Bài tập chương 3

  • • Bài 1

    Truyền xâu vào hàm thông qua con trỏ;

    Đọc/ghi dữ liệu với file văn bản

    NCT.FIT.HNUE 64

    Lập chương trình thực hiện các công việc sau:

    - Nhập một danh sách tên các mặt hàng

    - In danh sách các tên mặt hàng.

    - Tìm kiếm một mặt hàng biết tên mặt hàng nhập từ bàn

    phím

    YÊU CẦU

    1) Chương trình 1: Dùng hàm để truyền xâu kí tự vào

    hàm; Nhập/xuất dữ liệu với bàn phím và màn hình

    2) Chương trình 2: Dùng hàm để truyền xâu kí tự vào

    hàm; Nhập/xuất dữ liệu với file văn bản

  • • Bài 2

    Truyền xâu vào hàm thông qua con trỏ;

    Đọc/ghi dữ liệu với file văn bản

    NCT.FIT.HNUE 65

    Lập chương trình thực hiện các công việc sau:

    - Nhập từ bàn phím tên của n SV

    - Sắp xếp danh sách tên các SV theo thứ tự giảm dần

    - In danh sách SV lên màn hình

    YÊU CẦU

    1) Chương trình 1: Dùng hàm để truyền xâu kí tự vào

    hàm; Nhập/xuất dữ liệu với bàn phím và màn hình

    2) Chương trình 2: Dùng hàm để truyền xâu kí tự vào

    hàm; Nhập/xuất dữ liệu với file văn bản

  • • Bài 3

    Xử lí văn bản

    NCT.FIT.HNUE 66

    Hãy lập trình giải quyết bài toán sau đây:

    Hai từ được gọi là angram với nhau nếu mỗi kí tự của từ này

    cũng có mặt trong từ kia và hơn nữa số lượng từng loại kí tự

    xuất hiện trong hai từ là bằng nhau. Ví dụ các từ trong từng

    dòng dưới đây là những từ anagram của nhau:

    • read, dear, dare

    • tea, eat, ate

    • bad, dab

    • bale, able

    Trên mỗi dòng sau, các từ không là anagram của nhau:

    • feel, fell

    • kitchen, chicken

    Hãy kiểm tra và cho biết hai từ x và y nào đó được nhập từ

    bàn phím có phải là anagram của nhau hay không?

  • • Bài 4

    Xử lí văn bản

    NCT.FIT.HNUE 67

    Hãy lập trình giải quyết các bài toán sau đây:

    Cho một dãy ngoặc đơn của một biểu thức nào đó được

    nhập từ bàn phím. Hãy kiểm tra tính đúng đắn của biểu thức

    chỉ xét về ngoặc đơn. Kết quả kiểm tra được thông báo lên

    màn hình là một trong các từ sau đây:

    • “Thiếu ngoặc trái”, ví dụ ( ) ( ( ) )) là một biểu thức thiếu

    ngoặc trái

    • “Thiếu ngoặc phải”, ví dụ (( ) ( ( ) ) là một biểu thức thiếu

    ngoặc phải

    • “Thiếu ngoặc trái và thiếu ngoặc phải”, ví dụ ( ) )( là một

    biểu thức thiếu cả hai ngoặc trái và phải.

  • End of chapter 3

    NCT.FIT.HNUE