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

Đề tài: Làm cách nào để nhập chuỗi bằng cấp phát động?

  1. #1
    Ngày gia nhập
    10 2011
    Bài viết
    8

    Mặc định Làm cách nào để nhập chuỗi bằng cấp phát động?

    Làm cách nào để nhập chuỗi bằng cấp phát động? Anh (chị) nào biết, chỉ em với, em xin cảm ơn.

    Và em có một số bài tập về Con Trỏ và Chuỗi Ký Tự, Anh (chị) gợi ý và cho em vài cái code tham khảo luôn ạ.


    Bài 1: Viết chương trình thay thế tất cả sự xuất hiện của chuỗi b trong chuỗi a thành chuỗi c, chuỗi b,c có kích thước bất kì.

    Bài 2: Viết chương trình chuyển tất cả các từ trong một chuỗi vào một mảng chuỗi. Yêu cầu mảng chuỗi phải được cấp phát động. (Đọc đề mà không hiểu, chuỗi và mảng chuỗi khác nhau chỗ nào?)

    Bài 3: Lập trình nhập vào từ bàn phím danh sách học sinh một lớp, sắp xếp lại danh sách theo thứ tự abc của Tên, nếu trùng Tên thì sắp xếp theo thứ tự abc của Họ. (Em không tìm ra giải thuật cho bài này).
    Không Có Gì Hạnh Phúc Hơn Lập Trinh.

  2. #2
    Ngày gia nhập
    10 2011
    Bài viết
    552

    1) Tìm vị trí chuỗi b trong chuỗi a . -> đặt là vị trí k
    Xóa b : Chạy từ k -> k+ length(b) , xóa
    Chèn c vào vị trí k .
    Đấy là cách làm thủ công .

    Cách làm hay hơn là thế này.
    Trong trường hợp tổng quát thì khi b nằm trong a thì sẽ chia a thành 3 phần : Trước + b + sau .
    Vậy bây h ta cần tách Trước và Sau ra . Tách dễ thôi, dùng con trỏ trỏ vào vị trí phát sau đó cắt rồi strcpy phát là nó ra.
    Xong lắp vào theo thứ tự Trước + c + sau là xong
    2) Khai báo nó 2 chiều. Chiều 1 là số lượng các từ, chiều 2 là các từ .
    Bài này yêu cầu bạn dùng 1 mảng, mà mảng này chứa các con trỏ . Mỗi phần tử của mảng là 1 con trỏ (chuỗi)
    Bạn hình dung 1 sợi dây phơi áo quần là 1 cái mảng . Bạn móc áo quần lên đấy, thì mỗi chiếc áo quần là 1 phần tử (1 từ)
    Ở bài này cũng vậy, Tạo ra 1 mảng các con trỏ(chuỗi) rồi bạn "móc" các chuỗi vào đấy
    Cấp phát động của bài này :
    char *mang[số lượng từ]; // Mảng tĩnh nhưng phần tử của chúng là các con trỏ động.
    char **mang; // Mảng động và mỗi phần tử của chúng là con trỏ động .
    Cả 2 cách đều xài dc cho bài này
    3) Bạn biết giải thuật sắp xếp các số nguyên chứ ?
    Bây giờ cải tiến cho chuỗi như này :
    Bởi vì chuỗi thì ta ko thể dùng toán tử > < == để so sánh chư số đc cho nên phải :
    strcmp(const char *st1,const char *st2) // Hàm này có sẵn trong string.h
    cái này trả về 0 khi 2 chuỗi = nhau , <0 khi st1< st2 và >0 khi ngược lại .
    Đấy, giờ cứ theo thuật toán sắp xếp đã học mà xúc thôi

  3. #3
    Ngày gia nhập
    10 2011
    Nơi ở
    Đà Nẵng
    Bài viết
    2

    Thế có cách nào cộng 3 chuỗi lại 1 lần không hả anh???

  4. #4
    Ngày gia nhập
    10 2011
    Bài viết
    8

    Trích dẫn Nguyên bản được gửi bởi clchicken Xem bài viết
    1) Tìm vị trí chuỗi b trong chuỗi a . -> đặt là vị trí k
    Xóa b : Chạy từ k -> k+ length(b) , xóa
    Chèn c vào vị trí k .
    Đấy là cách làm thủ công .

    Cách làm hay hơn là thế này.
    Trong trường hợp tổng quát thì khi b nằm trong a thì sẽ chia a thành 3 phần : Trước + b + sau .
    Vậy bây h ta cần tách Trước và Sau ra . Tách dễ thôi, dùng con trỏ trỏ vào vị trí phát sau đó cắt rồi strcpy phát là nó ra.
    Xong lắp vào theo thứ tự Trước + c + sau là xong
    2) Khai báo nó 2 chiều. Chiều 1 là số lượng các từ, chiều 2 là các từ .
    Bài này yêu cầu bạn dùng 1 mảng, mà mảng này chứa các con trỏ . Mỗi phần tử của mảng là 1 con trỏ (chuỗi)
    Bạn hình dung 1 sợi dây phơi áo quần là 1 cái mảng . Bạn móc áo quần lên đấy, thì mỗi chiếc áo quần là 1 phần tử (1 từ)
    Ở bài này cũng vậy, Tạo ra 1 mảng các con trỏ(chuỗi) rồi bạn "móc" các chuỗi vào đấy
    Cấp phát động của bài này :
    char *mang[số lượng từ]; // Mảng tĩnh nhưng phần tử của chúng là các con trỏ động.
    char **mang; // Mảng động và mỗi phần tử của chúng là con trỏ động .
    Cả 2 cách đều xài dc cho bài này
    3) Bạn biết giải thuật sắp xếp các số nguyên chứ ?
    Bây giờ cải tiến cho chuỗi như này :
    Bởi vì chuỗi thì ta ko thể dùng toán tử > < == để so sánh chư số đc cho nên phải :
    strcmp(const char *st1,const char *st2) // Hàm này có sẵn trong string.h
    cái này trả về 0 khi 2 chuỗi = nhau , <0 khi st1< st2 và >0 khi ngược lại .
    Đấy, giờ cứ theo thuật toán sắp xếp đã học mà xúc thôi

    Em chưa hiểu rõ câu 2 lắm, anh có thể giải thích rõ hơn không, em thắc mắc là chuỗimảng chuỗi khác nhau chỗ nào? Anh nói rõ hơn giúp em.
    Không Có Gì Hạnh Phúc Hơn Lập Trinh.

  5. #5
    Ngày gia nhập
    10 2010
    Nơi ở
    Đại học Bách Khoa Hà Nội
    Bài viết
    45

    một ví dụ về sử dụng cấp phát động

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. int main()
    4. {
    5.     int *pa; // khai bao con tro mang
    6.     int n, i;
    7.     printf("Nhap so phan tu cua mang: ");
    8.     scanf("%d", &n);
    9.     pa = (int*)malloc(n*sizeof(int)); // cap phat mang co n phan tu
    10.     for (i=0; i<n; i++)
    11.     {
    12.         printf("a[%d] = ", i);
    13.         scanf("%d", &pa[i]);
    14.     }
    15.     getch();
    16.     return 0;
    17. }
    Chẳng biết mình muốn cái gì nữa :v

  6. #6
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Mặc định Làm cách nào để nhập chuỗi bằng cấp phát động?

    Trích dẫn Nguyên bản được gửi bởi HacAmThienThan Xem bài viết
    Em chưa hiểu rõ câu 2 lắm, anh có thể giải thích rõ hơn không, em thắc mắc là chuỗimảng chuỗi khác nhau chỗ nào? Anh nói rõ hơn giúp em.
    Bạn thấy mỗi cái áo quần được móc trên 1 cái móc ko ? . Tưởng tượng đấy là 1 chuỗi.
    Giờ ta phơi mấy cái áo quần đó = việc móc lên 1 sợi dây thì ta có một "mảng các thứ áo quần " mà mỗi cái áo , quần đấy là 1 chuỗi thế thôi .
    KDL Biến[kich thước] -> Mảng có phần tử là thuộc KDL
    char a; // 1 kí tự a kiểu char
    char *c; // Một con trỏ kiểu char , hay được hiểu nó là 1 chuỗi cho thân thiện (tuy nhien để có thể hiểu là 1 chuỗi thì con trỏ này phải trỏ đến cái "chuỗi" đâu đấy an vị trên ram cái đã, còn ko thì nó chỉ là một con trỏ )
    Do đó char * được hiểu là 1 KDL .
    => có khai báo như sau:
    char *Biến[kích thước] ; // -> Đây là 1 mảng với các phần tử co kiểu Char *


    Ví dụ :
    int a[100]; // Mảng a gồm các phần tử kiểu int , ta gọi là mảng int hay mảng nguyên, Okey

    char b[100]; // Mảng b gồm các phần tử kiểu char, ta gọi mảng char (hay chuỗi)

    char *c[100]; // Mảng c gồm các phần tử là một con trỏ kiểu char(hay gọi mỗi phần tử là một chuỗi cho nó thân thiện), ta gọi là mảng các con trỏ char (mảng chuỗi) .
    Để dễ hình dung hơn thì viết kiểu này nhìn cho dễ nè
    char* c[100] // Mảng c 100 phần tử, mỗi phần tử kiểu char* . Cơ mà cái này viết nhìn cho vui thế thôi chứ ko khuyên cáo viết thế này kẻo sau này nhầm lẫn thì vỡ mồm đấy

    .
    Đấy, đấy là cấp phát tĩnh .
    Còn cấp phát động thì nó thế này. Ta thay cái [100] ở sau tên biến-mảng thành một dấu * ở trước, thế thôi. Rồi dùng các hàm malloc, calloc hay new gì đó tùy .
    VD : char ten[30] ; -> char *ten; ten=(char *)malloc(sizeof(char)*30);

    Nói đến đây thì bạn sẽ phải có phát sinh nhu cầu hiểu biết về con trỏ. Đọc sách 1 tí rồi lên hỏi tiếp nhé
    ĐỌc xong bạn sẽ biết dc rằng . Mảng , chuỗi, con trỏ are the same
    Đã được chỉnh sửa lần cuối bởi clchicken : 10-11-2011 lúc 07:26 PM.

  7. #7
    Ngày gia nhập
    10 2011
    Bài viết
    8

    Code cho Bài 3:


    Code:
    #include<iostream.h>
    #include<conio.h>
    #include<string.h>
    #include<windows.h>
    
    struct Lop
    {
    	char ten[31];
    };
    
    void chuanhoa(char *A)
    {
    	int n=strlen(A);
    	int i,k=0;
    	bool flag=0;
    	char *B=new char[n];
    	for(i=0;i<n;i++)
    	{
    		if(A[i]==' ' && flag==0);
    		else if(A[i]!=' ' && flag==0)
    		{
    			flag=1;
    			B[k++]=toupper(A[i]);
    		}
    		else if(A[i]==' ' && flag==1)
    		{
    			flag=0;
    			B[k++]=A[i];
    		}
    		else
    			B[k++]=tolower(A[i]);
    	}
    	if(B[k-1]==' ' )
    		B[k-1]='\0';
    	else if(B[k-1]!=' ')
    		B[k]='\0';
    	strcpy(A,B);
    }
    
    void nhap(Lop *A, int n)
    {
    	int i;
    	cin.ignore();
    	for(i=0;i<n;i++)
    	{
    		cout<<"\nNhap ten Sinh Vien Thu "<<i+1<<": ";
    		cin.getline((*(A+i)).ten,31);
    		chuanhoa((*(A+i)).ten);
    	}
    }
    
    char *ten(char *A)
    {
    	int i;
    	char *k;
    	int n=strlen(A);
    	for(i=n-1;*(A+i)!=' ';i--);
    	k=new char[n-i+1];
    	k=&A[i+1];
    	return k;
    }
    
    char *ho(char *A)
    {
    	int i;
    	char *k;
    	int n=strlen(A);
    	k=new char[n];
    	for(i=0;*(A+i)!=' ';i++)
    	{
    		*(k+i)=*(A+i);
    	}
    	*(k+i)='\0';
    	return k;
    }
    
    void xuat(Lop *A, int n)
    {
    	int i;
    	for(i=0;i<n;i++)
    		cout<<"\nSinh Vien "<<i+1<<": "<<(*(A+i)).ten;
    }
    
    
    int ss(char a, char b)
    {
    	return a-b;
    }
    
    void Swap(Lop &A, Lop &B)
    {
    	Lop temp;
    	temp=A;
    	A=B;
    	B=temp;
    }
    
    
    int ssten(Lop a, Lop b)
    {
    	int n=strlen(ten(a.ten));
    	for(int i=0;i<n;i++)
    	{
    		if(ss(ten(a.ten)[i],ten(b.ten)[i])>0)
    			return 1;
    		else if(ss(ten(a.ten)[i],ten(b.ten)[i])<0)
    			return 0;
    	}
    	return -1;
    }
    
    int ssho(Lop a, Lop b)
    {
    	int n=strlen(ho(a.ten));
    	for(int i=0;i<n;i++)
    	{
    		if(ss(ho(a.ten)[i],ho(b.ten)[i])>0)
    			return 1;
    		else if(ss(ho(a.ten)[i],ho(b.ten)[i])<0)
    			return 0;
    	}
    	return 0;
    }
    
    
    void SelectionSort(Lop *A, int n)
    {
    	int i,j,min;
    	for(i=0;i<n-1;i++)
    	{
    		min=i;
    		for(j=i+1;j<n;j++)
    		{
    			if(ssten((*(A+min)),(*(A+j)))==1)
    				min=j;
    			else if(ssten((*(A+min)),(*(A+j)))==-1 && ssho((*(A+min)),(*(A+j)))==1)
    				min=j;
    				
    		}
    		if(min!=i)
    			Swap((*(A+min)),(*(A+i)));
    	}
    }
    
    void main()
    {
    	Lop *A;
    	int n;
    	cout<<"\n\nNhap So Hoc Sinh Can Nhap: "; cin>>n;
    	A=new Lop[n];
    	nhap(A,n);
    	system("cls");
    	cout<<"SINH VIEN MOT LOP:\n\n";
    	xuat(A,n);
    	SelectionSort(A,n);
    	cout<<"\n\n\nSINH VIEN MOT LOP SAU KHI SAP XEP:\n\n";
    	xuat(A,n);
    	cout<<endl;
    	getch();
    }

    Có Cách nào viết ngắn hơn không Anh (chị), giúp em rút ngắn lại chương trình này.
    Không Có Gì Hạnh Phúc Hơn Lập Trinh.

  8. #8
    Ngày gia nhập
    10 2011
    Bài viết
    552

    So sánh 2 chuỗi có cái strcmp ở string.h rồi mà , xài cái đó là rút ngắn dc nhiều lắm đấy .
    Và nữa : Sao ko viết 1 hàm so sánh tổng quát để sử dụng so sánh cả tên và họ đều được luôn mà phải viết cả 2 hàm thế @@ . Giờ thích so sánh Đệm nữa thì phải viết thêm 1 cái nữa hả ?? @@ :(
    Còn nữa
    C++ Code:
    1. char *ten(char *A)
    2. {
    3.     int i;
    4.     char *k;
    5.     int n=strlen(A);
    6.     for(i=n-1;*(A+i)!=' ';i--);
    7.     k=new char[n-i+1]; // Chỗ này bị thừa nè, chả để làm gì mà lại khiến bị Mem leak nữa
    8.     // Tương tự ở hàm họ
    9.     k=&A[i+1];
    10.     return k;
    11. }
    Có cái đoạn này nhìn ko được "vui mắt" cho lắm nè
    C++ Code:
    1. for(i=0;i<n;i++)
    2.     {
    3.         /*if(A[i]==' ' && flag==0); If mà ko làm gì thì đừng viết vào làm gì, bởi vì thừa quá :D .
    4.                
    5.             else */ if(A[i]!=' ' && flag==0)
    6.         {
    7.             flag=1;
    8.             B[k++]=toupper(A[i]);
    9.         }
    10.         else if(A[i]==' ' && flag==1)
    11.         {
    12.             flag=0;
    13.             B[k++]=A[i];
    14.         }
    15.         else
    16.             B[k++]=tolower(A[i]);
    17.     }
    Hàm chuẩn hóa ko cần phải sử dụng 1 con trỏ B rồi cấp vùng nhớ làm gì, mà cấp xong đến lúc ko dùng nữa thì phải giải phóng chứ, để đấy gì cho tốn bộ nhớ @@ .
    Mà nói chung chả cần phải dùng thêm 1 vùng nhwo khác làm gì, ta làm ngay trên argument char * A luôn nhé
    Làm thế này cho nó gọn và mạch lạc nè.
    C++ Code:
    1. void chuanhoa(char *A)
    2. {
    3.     Lower toàn bộ A;
    4.     Bỏ kí tự trắng thừa và Upper đầu mỗi từ;
    5. }
    Đã được chỉnh sửa lần cuối bởi clchicken : 11-11-2011 lúc 10:19 AM.

  9. #9
    Ngày gia nhập
    11 2017
    Bài viết
    0

    Ạnh chị có thể hoàn thành một bài hoàn chỉnh của câu 3 trên được không ạ ??

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

    Được. Xem bài #7.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

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

  1. Lập trình C++ Lệnh cin.getline() không thể nhập chuỗi kế tiếp khi trước đó đã nhập 1 chuỗi vượt quá số kí tự tối đa khi khai báo
    Gửi bởi alonesnail025 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 23-06-2013, 11:34 AM
  2. Bài tập C++ Cách để so sánh 2 chuỗi kí tự giữa chuỗi nhập từ phím và chuỗi từ file xem có giống nhau không?
    Gửi bởi davilson18 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 09-06-2012, 09:47 AM
  3. Trả lời: 0
    Bài viết cuối: 13-05-2012, 10:51 AM
  4. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM
  5. Kỹ thuật C++ Các quy tắc nhập chuỗi trong C++, làm thế nào để nhập chuỗi có khoảng trắng?
    Gửi bởi quyen1991 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 20-11-2010, 03:36 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