Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 17 kết quả

Đề tài: Tách họ tên trong lập trình C | Tách chuỗi trong C?

  1. #1
    No Avatar
    Mr.Kjng Khách

    Mặc định Tách họ tên trong lập trình C | Tách chuỗi trong C?

    Em có một bài toán thế này.Nhập vào họ tên của một người.Sau đó xuất ra màn hình tên trước sau đó mới đến họ.Bài này trên pascal thì em làm được còn trên C thì câu lệnh strcpy nó khác làm em không làm đựoc.Ai biết chỉ giúp em với.Thank
    VD:hoten=pham hieu;
    =>ten=hieu pham;

  2. #2
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Hơi có hiểu một chút, nhưng code rất C đấy.

    C Code:
    1. #include <stdio.h>
    2. #include <string.h>
    3.  
    4. void Process(char *fullname, char **name)
    5. {
    6.     int n=strlen(fullname), i=n-1;
    7.     while (fullname[i]==' ') i--;
    8.     while (fullname[i]!=' ') i--;
    9.     *name = &fullname[i+1];
    10.     fullname[i] = '\0';
    11. }
    12.  
    13. int main()
    14. {
    15.     char *fullname, *name;
    16.     strcpy(fullname,"Quang Hoang");
    17.     Process(fullname,&name);
    18.     printf (" First name is %s, last name is %s \n",name, fullname);
    19.     return 0;
    20. }

  3. #3
    Ngày gia nhập
    11 2008
    Bài viết
    21

    Mặc định Tách chuỗi sử dụng hàm strtok

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<string.h>
    4. void main()
    5. {
    6.     char name[]="Ho Van Ten",
    7.         buff[30];
    8.     strcpy( buff, strrev( name ) );
    9.     char *token = strtok( buff, " " );
    10.     while ( token != NULL )
    11.     {
    12.         printf ( "%s", strrev( token ) );
    13.         token = strtok( NULL, " " );//lay token tiep theo
    14.     } // end while
    15.     getch();
    16. }

  4. #4
    No Avatar
    Mr.Kjng Khách

    -Cảm ơn các anh.Các anh test hộ em bài tập của em vửa làm luôn nhá.
    -Đề:nhập vào danh sách sinh viên bao gồm họ tên, diểm trung bình.Sau đó sắp xếp danh sách sao cho tăng dần về tên.Nếu trùng tên thì sắp xếp theo chiều giảm dần của điểm trung bình.
    -Sau đây là code của em.Các anh test hộ em nhá
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <string.h>
    4.  
    5. struct sinhvien
    6. {
    7.     char hoten[30],ten[30];
    8.     float diemtb;
    9. };
    10. sinhvien sv[30];
    11.  
    12.  
    13. void nhap(sinhvien sv[],int &n)
    14. {
    15.     int i;
    16.     float diem;
    17.     printf(" Nhap so sinh vien:");
    18.     scanf("%d",&n);
    19.     for (i=0;i<n;i++)
    20.     {
    21.         fflush(stdin);
    22.         printf("\n Ho ten:");
    23.         gets(sv[i].hoten);
    24.         diem=sv[i].diemtb;
    25.         printf(" Diem trung binh:");
    26.         scanf("%f",&diem);
    27.         sv[i].diemtb=diem;
    28.     }
    29. }
    30.  
    31. void diemgiam(sinhvien sv[],int n)
    32. {
    33.     int i,j;
    34.         sinhvien tg;
    35.     for (i=0;i<n-1;i++)
    36.         for (j=i+1;j<n;j++)
    37.             if (sv[i].diemtb<sv[j].diemtb)
    38.             {
    39.                 tg=sv[i];
    40.                 sv[i]=sv[j];
    41.                 sv[j]=tg;
    42.             }
    43. }
    44.  
    45. void tach(sinhvien sv[],int n)
    46. {
    47.     int i,d,j,k,m;
    48.     m=0;
    49.     for (i=0;i<n;i++)
    50.     {
    51.         d=0;k=strlen(sv[i].hoten);
    52.         for (j=0;j<k;j++)
    53.             if (sv[i].hoten[j]==' ' && sv[i].hoten[j+1] !=' ') d=j;
    54.  
    55.         for (j=d+1;j<=k;j++)
    56.         {
    57.             sv[i].ten[m]=sv[i].hoten[j];
    58.             m++;
    59.         }
    60.         for (j=0;j<=d-1;j++)
    61.         {
    62.             sv[i].ten[m]=sv[i].hoten[j];
    63.             m++;
    64.         }
    65.  
    66.     }
    67. }
    68.  
    69. void tang(sinhvien sv[],int n)
    70. {
    71.     int i,j;
    72.     char tg[30];
    73.     for (i=0;i<n-1;i++)
    74.         for (j=i+1;j<n;j++)
    75.             if (strcmp(sv[i].ten,sv[j].ten)>0)
    76.             {
    77.                 tg=sv[i].ten;
    78.                 sv[i].ten=sv[j].ten;
    79.                 sv[j].ten=tg;
    80.                 tg=sv[i].hoten;
    81.                 sv[i].hoten=sv[j].hoten;
    82.                 sv[j].hoten=tg;
    83.             }
    84. }
    85.  
    86. void hienthi(sinhvien sv[],int n)
    87. {
    88.     int i;
    89.     printf("\n                                         Danh sach vua nhap la");
    90.     for (i=0;i<n;i++)
    91.     {
    92.         printf("\n Ho ten:%s",sv[i].hoten);
    93.         printf("\n Diem trung binh:%f\n",sv[i].diemtb);
    94.     }
    95. }
    96.  
    97. void main()
    98. {
    99.     clrscr();
    100.     int n;
    101.     nhap(sv,n);
    102.     diemgiam(sv,n);
    103.     tach(sv,n);
    104.         tang(sv,n);
    105.     hienthi(sv,n);
    106.     getch();
    107. }

  5. #5
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    C Code:
    1.         for (j=0;j<k;j++)
    2.             if (sv[i].hoten[j]==' ' && sv[i].hoten[j+1] !=' ') d=j;
    3.  
    4.         for (j=d+1;j<=k;j++)
    5.         {
    6.             sv[i].ten[m]=sv[i].hoten[j];
    7.             m++;
    8.         }
    9.         for (j=0;j<=d-1;j++)
    10.         {
    11.             sv[i].ten[m]=sv[i].hoten[j];
    12.             m++;
    13.         }
    for thế này thì m tác dụng gì???
    Đưa m vào for i đi bạn.
    Đã được chỉnh sửa lần cuối bởi trungkien45 : 04-05-2009 lúc 11:50 PM.

  6. #6
    No Avatar
    Mr.Kjng Khách

    Mặc định Tách họ tên trong lập trình C | Tách chuỗi trong C?

    Có mà.Vẫn chạy bình thường

  7. #7
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Mình hỏi Kjng chút.
    Hình như hàm tach() của bạn muốn đảo ngược tên thì phải?
    VD: "Trung Kien 45"==>"45 Trung Kien" thì phải??
    Theo những gì trên code thì như vậy!

  8. #8
    No Avatar
    Mr.Kjng Khách

    uh.Bạn nói đúng đó.Vấn đề chính là sắp xếp tên theo vần ABC mà.Nhưng mà không hỉu sao đoạn sắp xếp lại sai.Ai sửa hộ mình cái

  9. #9
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    ok, rùi.
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <string.h>
    4.  
    5. struct sinhvien
    6. {
    7.     char hoten[30],ten[30];
    8.     float diemtb;
    9. };
    10. sinhvien sv[30];
    11.  
    12.  
    13.  
    14. void nhap(sinhvien sv[],int &n)
    15. {
    16.     int i;
    17.     float diem;
    18.     printf(" Nhap so sinh vien:");
    19.     scanf("%d",&n);
    20.     for (i=0;i<n;i++)
    21.     {
    22.         printf("\n Ho ten:");
    23.         fflush(stdin);
    24.         gets(sv[i].hoten);
    25.         printf(" Diem trung binh:");
    26.         scanf("%f",&diem);
    27.         sv[i].diemtb=diem;
    28.     }
    29. }
    30.  
    31. void diemgiam(sinhvien sv[],int n)
    32. {
    33.     int i,j;
    34.     sinhvien tg;
    35.     for (i=0;i<n-1;i++)
    36.         for (j=i+1;j<n;j++)
    37.             if (sv[i].diemtb<sv[j].diemtb)
    38.             {
    39.                 tg=sv[i];
    40.                 sv[i]=sv[j];
    41.                 sv[j]=tg;
    42.             }
    43. }
    44.  
    45. void tach(sinhvien sv[],int n)
    46. {
    47.     int i,d,j,k,m;
    48.  
    49.     for (i=0;i<n;i++)
    50.     {
    51.         d=0;k=strlen(sv[i].hoten);
    52.         for (j=0;j<k;j++)
    53.             if (sv[i].hoten[j]==' ' && sv[i].hoten[j+1] !=' ') d=j;
    54.         m=0;
    55.         for (j=d+1;j<k;j++,m++)
    56.         {
    57.             sv[i].ten[m]=sv[i].hoten[j];
    58.         }
    59.         sv[i].ten[m]='\0';
    60.     }
    61. }
    62.  
    63. void tang(sinhvien sv[],int n)
    64. {
    65.     int i,j;
    66.     sinhvien tg;
    67.     for (i=0;i<n-1;i++)
    68.         for (j=i+1;j<n;j++)
    69.             if (strcmp(sv[i].ten,sv[j].ten)>0)
    70.             {
    71.                 tg=sv[i];
    72.                 sv[i]=sv[j];
    73.                 sv[j]=tg;
    74.             }
    75. }
    76.  
    77. void hienthi(sinhvien sv[],int n)
    78. {
    79.     int i;
    80.     printf("\n                                         Danh sach vua nhap la");
    81.     for (i=0;i<n;i++)
    82.     {
    83.         printf("\n Ho ten:%s",sv[i].hoten);
    84.         printf("\n Diem trung binh:%f\n",sv[i].diemtb);
    85.     }
    86. }
    87.  
    88. int main()
    89. {
    90.     //clrscr();
    91.     int n;
    92.     nhap(sv,n);
    93.     diemgiam(sv,n);
    94.     hienthi(sv,n);
    95.     tach(sv,n);
    96.     tang(sv,n);
    97.     hienthi(sv,n);
    98.     getch();
    99. }

  10. #10
    Ngày gia nhập
    11 2008
    Bài viết
    21

    Một khi bạn đã tạo được tên dạng đảo ngược thì cứ tương hàm so sánh có sẵn trong string.h thôi: strcmp() và strcmpi()
    Ở đây tách riêng tên là thừa và không tổng quát vì giả sử so sánh tên có tên, họ và đệm thì sao.
    Mình sửa lại theo ý kiến cá nhân, bạn xem thế nào ...
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <stdlib.h>
    4. #include <string.h>
    5.  
    6. struct sinhvien
    7. {
    8.     char hoten[30];
    9.     float diemtb;
    10. };
    11. sinhvien sv[30];
    12.  
    13. void nhap(sinhvien sv[],int &n)
    14. {
    15.     int i;
    16.     float diem;
    17.     printf(" Nhap so sinh vien:");
    18.     scanf("%d",&n);
    19.     for (i=0;i<n;i++)
    20.     {
    21.         fflush(stdin);
    22.         printf("\n Ho ten:");
    23.         gets(sv[i].hoten);
    24.         diem=sv[i].diemtb;
    25.         printf(" Diem trung binh:");
    26.         scanf("%f",&diem);
    27.         sv[i].diemtb=diem;
    28.     }
    29. }
    30.  
    31. char*ToWestern(const char*s)
    32. {
    33.     char*ptok,name[30];
    34.     strcpy(name,s);
    35.     char*tmp=(char*)malloc(30);
    36.     tmp[0]='\0';
    37.  
    38.     ptok=strtok( name, " " );
    39.     while ( ptok != NULL )
    40.     {
    41.         strcat( tmp, " ");
    42.         strcat( tmp, strrev( ptok ) );
    43.         ptok=strtok( NULL, " " );
    44.     }
    45.     strrev( tmp );
    46.     return tmp;
    47. }
    48.  
    49. int NameCmp(char*s1,char*s2 )
    50. {
    51.     return strcmpi(ToWestern( s1 ), ToWestern( s2 ));
    52. }
    53.  
    54. void Swap(sinhvien *a, sinhvien *b)
    55. {
    56.     sinhvien tmp=*a;
    57.     *a=*b;
    58.     *b=tmp;
    59. }
    60.  
    61. void BubbleSort(sinhvien a[],int n)
    62. {
    63.     for (int i = 0; i < n; ++i)
    64.     for (int j = i + 1; j < n; ++j)
    65.     if (NameCmp( a[j].hoten, a[i].hoten ) < 0)
    66.     Swap(a+i,a+j);
    67.     //else if (NameCmp( a[j].hoten, a[i].hoten ) == 0)
    68.     //hoan vi theo diem
    69. }
    70.  
    71. void hienthi(sinhvien sv[],int n)
    72. {
    73.     int i;
    74.     printf("\n                                         Danh sach vua nhap la");
    75.     for (i=0;i<n;i++)
    76.     {
    77.         printf("\n Ho ten:%s",sv[i].hoten);
    78.         printf("\n Diem trung binh:%f\n",sv[i].diemtb);
    79.     }
    80. }
    81.  
    82. void main()
    83. {
    84.     int n;
    85.     nhap(sv,n);
    86.     BubbleSort(sv,n);
    87.     hienthi(sv,n);
    88.     getch();
    89. }
    Đã được chỉnh sửa lần cuối bởi regist : 05-05-2009 lúc 12:53 AM.

Các đề tài tương tự

  1. tìm tên Font trong chuỗi ký?
    Gửi bởi r3z0lee trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 09-12-2013, 01:59 AM
  2. Lập trình C [Help] Giải bài Tách tên ra khỏi họ tên và sắp xếp theo từ điển của n người chuổi Ký tự
    Gửi bởi ngoctu_93 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 28-02-2013, 04:29 PM
  3. Bài tập C++ cách tìm tên trong họ tên dùng hàm strstr được không?
    Gửi bởi muadaumua000 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 14-12-2012, 08:43 PM
  4. Database Cách nối tên bảng với tên biến trên procedure trong SQL
    Gửi bởi haucanpop6590 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 13-12-2012, 11:32 AM
  5. Tách họ,tên trong chuỗi
    Gửi bởi yuka89 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 08-06-2008, 08:25 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn