Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Một bài tập về con trỏ và xâu kí tự

  1. #1
    No Avatar
    vuong_quoc_viet_PTCNN Khách

    Smile Một bài tập về con trỏ và xâu kí tự

    Đây là nội dung của bài tập:
    Hãy định nghĩa một hàm để vào một danh sách tên và lưu trữ chúng vào vùng nhớ cấp phát động dưới dạng mảng các xâu kí tự, và một hàm để đưa chúng ra màn hình:
    Code:
        void readnames(char *names[], const int size);
                  void writenames(char *names[], const int size);
    và viết một hàm nữa để sắp xếp danh sách trên bằng phương pháp nổi bọt:
    Code:
        void bubblesort(char *names[], const int size);
    Dưới đây là code của tôi, nó sai nhiều, mong các bạn sửa giùm.
    Code:
    #include <iostream.h>
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    
    void input(char *names[], int size)
    {
    int i;
    char *p=new char[20][20];
    char s[20];
    for (i=0; i<size; i++)
    	{
       printf("\nEnter the name %i:", (i+1)); scanf("%s", s);
       strcpy((p+i), s);
       names[i]=(p+i);
       }
    }
    
    void bubblesort(char *names[], int size)
    {
    int i,j;
    char temp[20];
    for(i=0; i<(size-1); i++)
       {
       for(j=(i+1); j<size; j++)
       	if (strcmp(names[i], names[j])>0)
          	{
                 strcpy(temp, names[i]);
                 strcpy(names[i], names[j]);
                 strcpy(names[j], temp);
                 }
       }
    }
    
    void output(char *names[], int size)
    {
    int i;
    cout<<"\n";
    for (i=0; i<size; i++) printf("\n %s", names[i]);
    }
    
    
    
    
    void main(void)
    {
    int n;
    char *thenames[20];
    cout<<"Please enter the number of the students:"; cin>>n; cout<<"\n";
    input(thenames, n);
    bubblesort(thenames, n);
    output(thenames, n);
    getch();
    }
    Mong các bạn cũng chỉ rõ ra rằng làm cách nào tôi có thể khởi tạo một mảng của xâu kí tự (mảng 2 chiều kiểu char) trong vùng nhớ cấp phát động và gán địa chỉ của vùng nhớ đó cho con trỏ p kiểu char, và hơn thế nữa là cách sử dụng mảng 2 chiều đó thông qua con trỏ p.
    Xin cảm ơn.
    Đã được chỉnh sửa lần cuối bởi vuong_quoc_viet_PTCNN : 17-04-2008 lúc 12:50 PM.

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Strongly recommend : không bao h mix giữa scanf printf và cin, cout. Mix giữa C và C++ là poor coding style.
    Đáng lý viết C++ nên dùng C++ string, nhưng tui hiểu mấy thầy cô muốn làm sv làm quen với cấp phát động nên mới ra đề kiểu quái đản thế này. Đây là cách cấp phát động cho mãng 2 chiều, và cậu quên 1 điều là phải giải phóng vùng nhớ, dùng new bao h cũng phải có delete.
    Cậu pass const int size = vô nghĩa, int size là pass tham trị để const vào làm gì ?
    - 1 là int size ( 4 byte không đáng kể )
    - 2 là dùng const int& size
    Còn phần cấp phát cậu viết thì tui hiểu là cậu chưa hiểu và chưa biết, đọc đoạn này còn thắc mắc gì thì hỏi tui sẽ giải thích. Phần sort tui dành cho cậu
    C++ Code:
    1. #include <iostream>
    2. #include <cstring>
    3.  
    4. char** read_name(int students)
    5. {
    6.   int         index = 0;
    7.   //Cấp phát cho con trỏ đến con trỏ kiểu char với size là students
    8.   char**      ptr = new char*[ students ];
    9.   char        s_name[ 80 ];
    10.   for( index  = 0; index < students; ++index)
    11.   {
    12.     std::cout << "\n\nName : ";
    13.     std::cin.getline( s_name, 80 );
    14.     //Cho mỗi con trỏ, tui cấp phát tiếp vùng nhớ bên trong nó + 1 cho thằng '\0'
    15.     ptr[ index ] = new char[ strlen( s_name ) + 1 ];
    16.     strcpy( ptr[ index ], s_name );
    17.   }
    18.  
    19.   return ptr; //trả về mãng con trỏ 2 chiều là đây.
    20. }
    21.  
    22. void get_back_memory( char** ptr , int p_size )
    23. {
    24.   std::cout << "\n\n..I'm releasing my memory !";
    25.   int index;
    26.   for( index = 0; index <  p_size; ++index )
    27.   {
    28.     delete[ ] ptr[ index ];
    29.   }
    30.  
    31.   delete[ ] ptr;
    32. }
    33.  
    34. void print_name( char** student_name, const int& nums )
    35. {
    36.   int index;
    37.   for( index = 0; index < nums; ++index )
    38.   {
    39.     std::cout << student_name[ index ] << "\n";
    40.   }
    41. }
    42.  
    43. int main( )
    44. {
    45.   int numbers_of_students;
    46.   std::cout << "-> Enter the number of students : ";
    47.   std::cin >> numbers_of_students;
    48.   std::cin.ignore( 80, '\n' );
    49.  
    50.   char** student_name = read_name( numbers_of_students );
    51.  
    52.   print_name( student_name, numbers_of_students );
    53.  
    54.   get_back_memory( student_name, numbers_of_students );
    55.  
    56.  
    57.   return 0;
    58. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 17-04-2008 lúc 10:56 PM.

  3. #3
    No Avatar
    vuong_quoc_viet_PTCNN Khách

    Cảm ơn bạn rox_rook rất nhiều về đoạn code rất độc đáo, rất hay mà tôi phải mất hàng tiếng đồng hồ mới có thể hiểu được. Tôi cũng muốn dùng thống nhất hàm ra/vào dữ liệu lắm chứ nhưng khổ nỗi là có một số chức năng mà printf dùng thì dễ hơn, cho nên tôi trộn cả hai thứ vào. . Đoạn code do tôi viết (mà tôi đã dẫn ở bài viết trước) tôi đã có một số chỉnh sửa qua tham khảo và đã chạy thử. Tôi xin viết ra đây để bạn xem và cho ý kiến:
    C++ Code:
    1. #include <iostream.h>
    2. #include <stdio.h>
    3. #include <conio.h>
    4. #include <string.h>
    5.  
    6. char *p=new char [20*20];
    7.  
    8. void input(char *names[], int size)
    9. {
    10. int i;
    11. char s[20];
    12. for (i=0; i<size; i++)
    13.    {
    14.    printf("\nEnter the name %i:", (i+1)); gets(s);
    15.    strcpy((p+i*20), s);
    16.    names[i]=(p+i*20);
    17.    }
    18. }
    19.  
    20. void bubblesort(char *names[], int size)
    21. {
    22. int i,j;
    23. char temp[20];
    24. for(i=0; i<(size-1); i++)
    25.     {
    26.    for(j=(i+1); j<size; j++)
    27.     if (strcmp(names[i], names[j])>0)
    28.         {
    29.          strcpy(temp, names[i]);
    30.          strcpy(names[i], names[j]);
    31.          strcpy(names[j], temp);
    32.          }
    33.    }
    34. }
    35.  
    36. void output(char *names[], int size)
    37. {
    38. int i;
    39. cout<<"\n";
    40. for (i=0; i<size; i++) printf("\n %s", names[i]);
    41. }
    42.  
    43.  
    44.  
    45.  
    46. void main(void)
    47. {
    48. int n;
    49. char *thenames[20];
    50. cout<<"Please enter the number of the students:"; cin>>n; cout<<"\n";
    51. input(thenames, n);
    52. bubblesort(thenames, n);
    53. output(thenames, n);
    54. delete []p;
    55. getch();
    56. }
    Công nhận là tôi cũng hơi sơ suất là thiếu câu lệnh delete. Nhưng tôi chạy vẫn thấy bình thường. Không biết quên lệnh delete có tác hại gì không nhỉ?
    Tôi cũng có một thắc mắc là tại sao mỗi lần bạn dùng lệnh vào/ra dữ liệu bạn lại phải đặt trước chữ cout, cin là std::?
    Đã được chỉnh sửa lần cuối bởi vuong_quoc_viet_PTCNN : 18-04-2008 lúc 04:32 PM.

  4. #4
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    531

    Không delete thì bộ nhớ sẽ không được giải phóng cho đến khi chương trình kết thúc (đến lúc này bộ nhớ cấp cho chương trình mới được giải phóng bởi hệ điều hành). Đối với chương trình đơn giản này thì không sao, nhưng đối với chương trình nói chung bạn sẽ sớm bị cạn bộ nhớ và gặp lỗi. Bởi thế, như rox_rook đã nói: luôn delete ngay đối tượng khi bạn không cần đến nó nữa.

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

    em cũng muốn hỏi 1 câu về con trỏ, em muốn khai báo mảng kí tự char từ A->Z hoặc từ 1-100, làm cách nào để khai báo 1 cách nhanh nhất hoặc tự động ?

  6. #6
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Mặc định Một bài tập về con trỏ và xâu kí tự

    là sao nhỉ ?

    #define max ???
    char *s=new char[max];

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    em cũng muốn hỏi 1 câu về con trỏ, em muốn khai báo mảng kí tự char từ A->Z hoặc từ 1-100, làm cách nào để khai báo 1 cách nhanh nhất hoặc tự động ?
    Example
    C++ Code:
    1. #include <iostream>
    2. #include <cstdlib>
    3.  
    4. char randchar(){
    5.   return "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[std::rand()%52];
    6. }
    7. int main(){
    8.   char* g = new char[10];
    9.   for(int x = 0; ++x < 10; g[x] = randchar())
    10.   delete[] g;
    11. }

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