Lập trình C - Bài 8: Xâu ký tự | vietsource.net

Đăng nhập diễn đàn

Trang 1 của 5 123 ... CuốiCuối
Kết quả 1 đến 10 của 50
  1. #1
    Ngày tham gia
    Mar 2012
    Bài viết
    1,166
    Thanks
    387
    Thanked: 699 in 401 posts

    Lập trình C - Bài 8: Xâu ký tự | vietsource.net

    lớp học vừa tan nên giờ mới up. a em vào xem và làm bài tập nhé


    file text
    Code:
    http://vietsource.net/data/files3/VietSource.Net---bai 8 con tro va xau ky tu.docx
    Bài 8 : Con trỏ và xâu ký tự
    1. Ký tự.
    a. Khái niệm.
    Kí tự trong C được bao quanh bởi một cặp dấu nháy đơn ‘ ‘

    Ví dụ: ‘a’ ‘d’ ‘1’ là một ký tự.
    ‘abc’, ‘ab’, ‘fgd’ không là một ký tự.

    b. Nhập xuất có định dạng.
    Char c;
    Scanf(“%c”,&c); // nhập một ký tự từ bàn phím
    Printf(“%c”,c); // in một ký tự lên màn hình

    c. Vùng đệm nhập xuất ký tự.
    · Dùng để đọc và ghi các ký tự ở bảng mã ASCII
    · Một vùng đệm (buffer) là một khoảng không gian lưu trữ tạm thời trong bộ nhớ hoặc trên thẻ điều khiển thiết bị.
    · Bộ đệm nhập xuất có thể chia làm :
    o Console I/O
    o Buffered file I/O
    a) getchar() : nhập vào một ký tự từ bàn phím và đợi ấn enter
    b) getch() : nhập vào một ký tự từ bàn phím hay bộ đệm. Và không hiển thị ký tự lên màn hình. Không cần phải ấn enter.
    c) getche() : nhập vào một ký tự từ bàn phím và hiển thị ký tự len màn hình (không đợi ấn enter).

    Ví dụ:
    Char ch;
    Ch=getch(); // đọc từ bàn phím hay bộ đệm 1 ký tự rồi gán cho ch
    Ch=getche();// đọc từ bàn phím 1 ký tự rồi gán cho ch
    Ch=getchar();// đọc từ bàn phím 1 ký tự rồi gán cho ch

    Putchar(<tên biến kí tự>); // in một ký tự lên màn hình
    Putchar(ch); // in ký tự lên màn hình

    d. Các hàm kiểm tra ký tự.
    Khai báo thư viện “ctype.h”
    Cách hoạt động một số hàm dưới đây: Nếu thuộc thì hàm cho giá trị khác 0. Nếu không thuộc thì hàm cho giá trị bằng 0.

    Int isalpha(int c) : kiểm tra ký tự có là chữ cái không.
    Int isdigit(int c) : kiểm tra xem ký tự có là chữ số không.
    Int islower(int c): kiểm tra ký tự có là chữ thường không.
    Int isupper(int c): kiểm tra ký tự có là chữ hoa không.
    Int isspace(int c): kiểm tra ký tự có là trống không (\n, dấu cách, \t).

    Ví dụ :
    Char ch; int kt;
    Kt= isalpha(ch);
    If (kt!=0) printf(“ky tu vua nhap la chu cai”);
    Else pritnf(“ky tu vua nhap khong la chu cai”);

    · Một số ký tự đặc biệt.
    cách in các ký tự đặt biệt
    %% : in ra màn hình ký tự ‘%’
    \\ : in ra màn hình ký tự ‘\’
    \” : in ra màn hình ký tự ‘ “ ‘


    2. Mảng và xâu ký tự.
    Xâu ký tự được bao quanh bởi một cặp dấu nháy kép “ ”
    Ví dụ: “vietsource.net ” , “a”, “1”,.... : là một xâu ký tự.
    Kí tự ‘\0’ là ký tự cuối cùng của xâu.

    Char s[50];
    Vì tên xâu (s) là địa chỉ của phần từ đầu tiên &s[0] hay s vì vậy không thể gán xâu cho một hằng ký tự.
    S=”vietsource”; cách này sai .

    Để gán giá trị cho một xâu ta sử dụng một số cách dưới đây:
    Strcpy(s,“vietsource”);
    S[0]=’v’; s[1]=’i’; s[2]=’e’; ....
    Char s[50]=”vietsource.net”;
    Char s[]=”vietsource.net”;

    Để truy xuất tới một phần tử của mảng ký tự. Hay truy xuất tới một ký tự trong một xâu. Ta truy xuất bình thường như truy xuất tới phần tử của một mảng.
    Ví dụ :
    S[i]; truy xuất tới ký tự thứ i của xâu s.
    s[i]=’v’; gán giá trị cho ký tự thứ i của xâu s.

    3. Con trỏ và xâu ký tự.

    Char *s; // khai báo một con trỏ kiểu char (xâu ký tự)
    *(s+i)=’y’; // truy xuất và gán giá trị cho ô nhớ s+i

    4. Các hàm sử lý xâu ký tự.
    gets(char *s); //Hàm dùng để nhập một xâu từ bàn phím.
    printf(“%s”,s); //xuất một xâu lên màn hình.
    puts(char *s);// hàm xuất một xâu ra màn hình


    Khai báo thư viện “string.h” để sử dụng một số hàm dưới
    · Int strlen(char *s) trả về độ dài của xâu s;
    · Char *strupr(char *s) đổi chữ thường trong xâu s sang chữ hoa.
    · Char *strlwr(char *s) đổi chữ hoa sang chữ thường.
    · Char *strcat(char *s1, char *s2) nối xâu s2 vào xâu s1;
    · Int strcmp(char *s1, char *s2) hàm này cho giá trị âm nếu xâu s1 nhở hơn xâu s2. Và cho giá tị dương nếu xâu s1 lớn hơn xâu s2. Trả về giá trị bằng 0 nếu xâu s1 bằng xâu s2.
    · Int strcmpi(char *s1, char *s2) hàm này dùng để so sánh 2 xâu nhưng không phân biệt chữ thường và chữ hoa.
    · Char *strcpy(char *s1, char *s2) dung đẻ copy xâu s2 vào xâu s1.
    · Char *strncpy(char *s1, char *s2, int n) sao chép n ký tự đầu của xâu s2 sang xâu s1
    · Char *strnset(char *s ,int c, int n) dùng để sao chép n lần ký tự c vào xâu s.
    · Char *strstr(char *s1, char *s2) tìm sự xuất hiện của xâu s2 trong xâu s1. Nếu tìm thấy hàm cho địa chỉ của xâu con trong xâu s1. Trái lại cho NULL.
    · Char *strrev(char *s) dùng đảo ngược xâu s.Nếu thành công hàm cho địa chỉ xâu đã đảo.

    Chú ý: cách xoá một ký tự trong xâu.
    Ở trên lớp cũng như các trung tâm giảng dạy mình không thấy đề cập đến cách xoá một ký tự. Vậy mình xin hướng dẫn để xoá một ký tự ta làm như sau.

    Vi dụ: ta có xâu s=”viet source.net”;
    Để xoá dấu cách giữa chữ “viet” và chữ “source.net”. ta phải tìm xem dấu cách đó ở vị trí thứ mấy trong xâu.
    Ở đây dấu cách nằm ở vị trí thứ 4. Do
    ‘V’ : vị trí 0
    ‘i’ : vị trí 1
    ....

    Để xoá dấu cách ta sử dụng xoá địa chỉ ô nhớ bằng cách copy đè ô nhớ sau lên ô nhớ hiện tại(ô chứa dấu cách)
    Strcpy(&s[4],&s[5]); // xoá ký tự s[4] (tức là kí tự dấu cách).
    Sau khi xoá ta được một xâu mới:
    S==”vietsource.net”;

    Bài tập bắt buộc
    Bài 1: Vào từ bàn phím một câu từ bàn phím, kết thúc bằng dấu chấm ‘.’ In ra mỗi từ một dòng. Và câu đó có bao nhiêu từ.

    Bài 2: Nhập từ bàn phím họ tên một người. In ra màn hình tên người đó
    Ví dụ: s=”Nguyen Ba Cuong” in ra man hinh “Cuong”. Cho chương trình chạy lặp vô hạn. Hỏi ấn (“y/n ?”) Nếu ấn phím ‘y’ thì chạy lại. Nếu ấn ‘n’ thì dừng. Nếu ấn các phím khác kể cả enter thì không làm gì và hỏi lại ấn (“y/n ?”).


    Bài tập bổ xung
    Bài 3: Nhập vào một xâu ký tự từ bàn phím gồm các từ.
    Ví dụ: s=” bac ninh que toi”. Lập chương trình bỏ bớt các dấu trống (dấu cách) thừa.(chuẩn hoá xâu).
    Sau khi chuẩn hoá ta được : s=”bac ninh que toi”.

    Bài 4: nhập một số thập phân, in ra dạng chữ số. Ví dụ: 6513.24, in ra “sau ngan nam tram muoi ba phay hai muoi bon”.

    Bài 5: nhập vào từ bàn phím một danh sách quản lý sinh viên gồm: họ tên, mã sinh viên, điểm toán, tin. In ra màn hình tất cả thông tin trên và điểm trung bình của mỗi thí sinh ở dạng bảng gồm 5 cột ứng với 5 mục trên (họ tên, mã sinh vien,..diểm tb).

    Xem các chủ đề khác cùng chuyên mục VSNet:

    Lần sửa cuối bởi bacuongcomputer, ngày 08-06-2012 lúc 09:46 AM.

  2. Có 7 thành viên cảm ơn bacuongcomputer trong bài viết này:

    dtafe (03-01-2013),hungdtvt (07-31-2012),nguyenvanquan7826 (07-31-2012),SolitaryWolf (10-19-2012),StarrySky (07-31-2012),Vũ Công Tịnh (07-31-2012),weeds (07-31-2012)

  3. #2
    Ngày tham gia
    Jul 2012
    Bài viết
    240
    Thanks
    185
    Thanked: 26 in 20 posts
    Em nộp 2 bài đầu nè :
    Bài 1 :
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    void main() {
    clrscr();
    char *s;
    int i=0,d=0;
    s=(char*)malloc(100*sizeof(char));
    gets(s);
    while (i<=strlen(s) && s[i]!='.')
    {
     if (isspace(s[i])==0)
     {
     printf("%c",s[i]);
     if (isalpha(s[i])!=0) d++;
     }
     else if (isspace(s[i])!=0 && isspace(s[i+1])==0) printf("\n");
    i++;
    }
    printf("Cau ban nhap co %d chu ",d);
    getch();
    }
    Bài 2 :
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    void main() {
    clrscr();
    char *s,a;
    int i,k;
    s=(char*)malloc(100*sizeof(char));
    nhan: {
    printf("\n Nhap ten ban : ");
    gets(s);
    for (i=strlen(s);i>0;i--)
    if (isalpha(s[i])!=0 && isalpha(s[i-1])==0)
    {
     k=i;
     break;
    }
    printf("\n Ten cua ban la : \n");
    for (i=k;i<=strlen(s);i++)
    printf("%c",s[i]);
    }
    
    nhan2:
    {
    printf("\n Continue ? Y or N ? :\n ");
    a=getche();
    }
    if (a=='y') goto nhan;
    else
    if (a!='n') goto nhan2;
    }

  4. #3
    Ngày tham gia
    Mar 2012
    Bài viết
    1,166
    Thanks
    387
    Thanked: 699 in 401 posts
    Trích dẫn Gửi bởi StarrySky Xem bài viết
    Em nộp 2 bài đầu nè :
    Bài 1 :
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    void main() {
    clrscr();
    char *s;
    int i=0,d=0;
    s=(char*)malloc(100*sizeof(char));
    gets(s);
    while (i<=strlen(s) && s[i]!='.')
    {
     if (isspace(s[i])==0)
     {
     printf("%c",s[i]);
     if (isalpha(s[i])!=0) d++;
     }
     else if (isspace(s[i])!=0 && isspace(s[i+1])==0) printf("\n");
    i++;
    }
    printf("Cau ban nhap co %d chu ",d);
    getch();
    }
    Bài 2 :
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    void main() {
    clrscr();
    char *s,a;
    int i,k;
    s=(char*)malloc(100*sizeof(char));
    nhan: {
    printf("\n Nhap ten ban : ");
    gets(s);
    for (i=strlen(s);i>0;i--)
    if (isalpha(s[i])!=0 && isalpha(s[i-1])==0)
    {
     k=i;
     break;
    }
    printf("\n Ten cua ban la : \n");
    for (i=k;i<=strlen(s);i++)
    printf("%c",s[i]);
    }
    
    nhan2:
    {
    printf("\n Continue ? Y or N ? :\n ");
    a=getche();
    }
    if (a=='y') goto nhan;
    else
    if (a!='n') goto nhan2;
    }
    bạn không nên lặp i<=strlen(s) không cần = mà nhỏ hơn thôi vì một xâu có độ dài là 5 nhưng ký tự cuối cùng là s[4] do ký tự đầu tiên là s[0].
    và bài 1 của mình là đếm số từ trong một câu. nhập từ bàn phím có thể có nhiều câu, mỗi câu được đánh dấu bởi dấu chấm '.' khi kết thúc câu

  5. Những thành viên đã cảm ơn bacuongcomputer trong bài viết này:

    StarrySky (07-31-2012)

  6. #4
    Ngày tham gia
    Jul 2012
    Bài viết
    240
    Thanks
    185
    Thanked: 26 in 20 posts
    Edit lại bài 1. Em nhầm là đếm chữ :
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    void main() {
    clrscr();
    char *s;
    int i=0,d=0;
    s=(char*)malloc(100*sizeof(char));
    gets(s);
    while (i<strlen(s) && s[i]!='.')
    {
     if (isspace(s[i])==0)
     printf("%c",s[i]);
    // if (isalpha(s[i])!=0) d++;    //
     else if (isspace(s[i])!=0 && isspace(s[i+1])==0)
     {
     printf("\n");
     d++;
     }
    
    i++;
    }
    printf("Cau ban nhap co %d tu ",d);
    getch();
    }
    Lần sửa cuối bởi StarrySky, ngày 07-31-2012 lúc 11:37 AM.

  7. #5
    Ngày tham gia
    Mar 2012
    Bài viết
    1,166
    Thanks
    387
    Thanked: 699 in 401 posts
    bài 2 thì ổn rồi. nhưng mà cũng lỗi như bài 1 không nên lặp tới i<=strlen(s) vì ký tự cuối cùng là strlen(s)-1
    nên i chỉ chạy khi i<strlen.
    và bạn không nên dùng goto nhé. vì C là ngôn ngữ lập trình có cấu trúc và lệnh goto là lệnh nhảy vô điều kiện làm phá vỡ mất tính chất cấu trúc này. vậy bạn nên dùng do while thay cho goto nhé

    ---------- Post added at 10:27 AM ---------- Previous post was at 10:26 AM ----------

    khi sử dụng nhập xâu là gets() thì bạn nên cho xoá bộ đệm trước khi nhập nhé. fflush(stdin)

  8. Những thành viên đã cảm ơn bacuongcomputer trong bài viết này:

    StarrySky (07-31-2012)

  9. #6
    Ngày tham gia
    Jul 2012
    Bài viết
    240
    Thanks
    185
    Thanked: 26 in 20 posts
    Edit bai 2 :
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    void main() {
    clrscr();
    char *s,a;
    int i,k;
    s=(char*)malloc(100*sizeof(char));
    do {
    
    printf("\n Nhap ten ban : ");
    gets(s);
    for (i=strlen(s)-1;i>0;i--)
    if (isalpha(s[i])!=0 && isalpha(s[i-1])==0)
    {
     k=i;
     break;
    }
    printf("\n Ten cua ban la : \n");
    for (i=k;i<strlen(s);i++)
    printf("%c",s[i]);
    do {
    printf("\n Continue ? Y or N ? :\n ");
    a=getche();
    }
    while (a!='n'&& a!='y');
    }
    while (a=='y');
    }

  10. #7
    Ngày tham gia
    Apr 2012
    Bài viết
    1,358
    Thanks
    357
    Thanked: 713 in 426 posts
    Trích dẫn Gửi bởi bacuongcomputer Xem bài viết

    Bài tập bắt buộc
    Bài 1: Vào từ bàn phím một câu từ bàn phím, kết thúc bằng dấu chấm ‘.’ In ra mỗi chữ một dòng. Và câu đó có bao nhiêu từ.
    Bài 1 nên nói rõ là in ra mỗi từ một dòng hay mỗi ký tự một dòng. "mỗi chữ một dòng" mềnh phân vân là in từ hay in ký tự.
    Theo mềnh nên in mỗi từ một dòng...

  11. #8
    Ngày tham gia
    Mar 2012
    Bài viết
    1,166
    Thanks
    387
    Thanked: 699 in 401 posts
    Trích dẫn Gửi bởi nguyenvanquan7826 Xem bài viết
    Bài 1 nên nói rõ là in ra mỗi từ một dòng hay mỗi ký tự một dòng. "mỗi chữ một dòng" mềnh phân vân là in từ hay in ký tự.
    Theo mềnh nên in mỗi từ một dòng...
    ờ in ra mỗi từ một dòng. viết nhầm

  12. #9
    Ngày tham gia
    Jul 2012
    Bài viết
    240
    Thanks
    185
    Thanked: 26 in 20 posts
    Bài 3 :
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    void main() {
    clrscr();
    char *s;
    int i=1,t,d,c;
    s=(char*)malloc(100*sizeof(char));
    gets(s);
    printf("\n Xau vua nhap la : \"%s\"\n ",s);
    t=strlen(s);
    // Lay ki tu dau xau //
    for (i=0;i<t;i++)
     if (isspace(s[i])==0)
      {
       d=i;
       break;
      }
    // Lay ki tu cuoi xau //
    for (i=t-1;i>=d;i--)
     if (isspace(s[i])==0)
      {
       c=i;
       break;
      }
    // Xoa dau cach giua cac tu neu khoang cach nhiu hon 1 dau//
    for (i=d;i<=c;i++)
     if (isspace(s[i])!=0 && isspace(s[i+1])!=0)
      {
       strcpy(&s[i],&s[i+1]);
       c--;
       i--;
      }
    // Ket thuc //
     printf("Xau sau khi da chuan hoa la : ");
     printf("\"");
     for (i=d;i<=c;i++)
      printf("%c",s[i]);
     printf("\"");
    getch();
    }
    Bài 5 thì dùng con trỏ của con trỏ phải ko anh Cường. Khi dùng em cấp phát như bình thường, cấp phát cho t rồi t[i] nhưng khi dùng lệnh gets(t[i]) thì máy không thực hiện. Cái lệnh này em để trong vòng lặp for
    Lần sửa cuối bởi StarrySky, ngày 07-31-2012 lúc 09:06 PM.

  13. #10
    Ngày tham gia
    Apr 2012
    Bài viết
    1,358
    Thanks
    357
    Thanked: 713 in 426 posts
    Trích dẫn Gửi bởi StarrySky Xem bài viết
    Bài 3 :
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    void main() {
    clrscr();
    char *s;
    int i=1,t,d,c;
    s=(char*)malloc(100*sizeof(char));
    gets(s);
    printf("\n Xau vua nhap la : \"%s\"\n ",s);
    t=strlen(s);
    // Lay ki tu dau xau //
    for (i=0;i<t;i++)
     if (isspace(s[i])==0)
      {
       d=i;
       break;
      }
    // Lay ki tu cuoi xau //
    for (i=t-1;i>=d;i--)
     if (isspace(s[i])==0)
      {
       c=i;
       break;
      }
    // Xoa dau cach giua cac ki tu //
    for (i=d;i<=c;i++)
     if (isspace(s[i])!=0 && isspace(s[i+1])!=0)
      {
       strcpy(&s[i],&s[i+1]);
       c--;
       i--;
      }
    // Ket thuc //
     printf("Xau sau khi da chuan hoa la : ");
     printf("\"");
     for (i=d;i<=c;i++)
      printf("%c",s[i]);
     printf("\"");
    getch();
    }
    Bạn đã mất công kiểm tra các dấu cách ở đầu và cuối xâu rồi tìm kí tự đầu tiên và cuối cùng thì sao không xóa nó đi khi nó là dấu cách..???

    Nếu xóa đi thì cuối cùng khi xuất xâu ra ta không cần in từng ký tự mà in luôn ra xâu... .

    ---------- Post added at 07:59 PM ---------- Previous post was at 07:56 PM ----------

    Trích dẫn Gửi bởi StarrySky Xem bài viết

    Bài 5 thì dùng con trỏ của con trỏ phải ko anh Cường. Khi dùng em cấp phát như bình thường, cấp phát cho t rồi t[i] nhưng khi dùng lệnh gets(t[i]) thì máy không thực hiện. Cái lệnh này em để trong vòng lặp for
    Bạn nói rõ hơn được không. có thể thì post code lên xem cho tiện.
    Về phần này đúng là phải dùng con trỏ...

  14. Những thành viên đã cảm ơn nguyenvanquan7826 trong bài viết này:

    StarrySky (07-31-2012)

Trang 1 của 5 123 ... CuốiCuối

Tag của Chủ đề này

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •  

Textlink: thiet ke webxe chevrolet cruze, dao tao seo,

dịch vụ seo xu hướng seo 2014 Bảng tuần hoàn seo seo on page da là gì- domain authority công cụ kiểm tra backlink thuật toán google panda, thiết kế web chuẩn seo, công ty thiết kế website, tên miền, Hosting viet nam, chú ý khi làm web, dich vu seo, thiết kế web,