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

Đề tài: thắc mắc về thuật toán chuẩn hóa chuỗi

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

    Mặc định thắc mắc về thuật toán chuẩn hóa chuỗi

    Code:
    #include <conio.h>
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #include<malloc.h>
    int main ()
    {
    	char *a;int i;
    	a=(char*)calloc(40,sizeof(char));
        printf("\nNhap vao chuoi : ");gets(a);
    	for(i=0;i<strlen(a);i++)
    	{
    		if(a[0]==' ')
    		{
    		for(int j=0;j<strlen(a);j++)
    			a[j]=a[j+1];
    		i--;
    		}
    		if(a[i]==' '&&a[i+1]==' ')
    		{
    			for(int j=i;j<strlen(a);j++)
    				a[j]=a[j+1];
    			i--;		}
    	}
    	for(i=0;i<strlen(a);i++)
    	{
    		if(i==0) a[0]=toupper(a[0]);
    		if(a[i]==' ') a[i+1]=(a[i+1]);
    	}
    	printf("Chuoi moi la : ");puts(a);
    	getch();
    }
    mấy anh có thể giải thích cho em tại sao là i-- ko ạ,thank nhiều

  2. #2
    Ngày gia nhập
    09 2008
    Bài viết
    41

    Bài của bạn là xóa các khoảng trắng thừa trong chuỗi?

    Theo mình hiểu code trên thì:Giả sử có 2 dấu cách liền nhau,chả hạn là a[2]=' ' và a[3]=' ',nếu bạn không có lệnh i--; thì khi duyệt vòng lặp,gặp a[2] nó sẽ xóa a[2] và dồn chuỗi.Khi đó a[3] trở thành a[2] và do lệnh for có toán tử i++,nó sẽ nhảy đến vị trí tiếp theo là a[3] (sau khi xóa) mà bỏ qua vị trí a[2] hiện tại (là ký tự ' ').Do đó bỏ xót 1 vị trí cần xóa

  3. #3
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    //start

    t = strlen(s);
    for(int t = -1; ++t < length;for (int i = -1 ; ++i < length; if(s[i] == s[i+1] && s[i] == 32) for(int j = i; ++j < length ; s[j] = s[j+1]) ));

    //done

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

    Mình có thuật toán thế này, bạn xem thử.

    Mình tạo 1 chuỗi mới (kết quả), duyệt từ đầu đến cuối chuỗi gốc, lấy những ký tự hợp lệ và cho vào chuỗi mới. (Các ký tự đầu từ thì in hoa, còn lại thì in thường, chỉ lấy 1 khoảng trắng giữa 2 từ)


    C++ Code:
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. char* chuanhoa (char *s)
    6. {
    7.     bool flag=0;
    8.     int i,len=strlen(s), index=0;
    9.  
    10.     char *ketqua=new char[len];            // tạo chuỗi mới, chứa len ký tự
    11.  
    12.     for (i=0;i<len;i++)
    13.     {
    14.         if (s[i]==' ' && flag==0) continue;           // Nếu gặp dấu cách đầu tiên thì bỏ qua
    15.         else if (s[i]!=' ' && flag==0);            // Gặp ký tự khác dấu cách đầu tiên...
    16.         {
    17.             flag=1;           // Biến flag=1 xác định bắt đầu đi vào khu vực các ký tự khác dấu cách
    18.             ketqua[index++]=toupper (s[i]);       // ....thì lấy vào dưới dạng in hoa
    19.         }
    20.         else if (s[i]!=' ' && flag==1) ketqua[index++]=tolower(s[i]);     // Gặp ký tự khác dấu cách, mà nó không phải ký tự khác dấu cách đầu tien, thì lấy vào dạng in thường
    21.         else if (s[i]==' ' && flag==1)  // gặp dấu cách, mà flag=1 nghĩa là trước đó là 1 từ...
    22.         {
    23.             flag=0;  // tắt flag đi
    24.             ketqua[index++]=s[i];    // ... cho nên lấy 1 dấu cách để ngăn cách 2 từ
    25.         }
    26.     }
    27.    
    28.  if (ketqua[index-1]==' ') ketqua[--index]=0;    // Trường hợp chuỗi chuỗi gốc là những dấu cách, thì chuỗi ketqua sẽ bị lấy dư 1 dấu cách ở cuối
    29.     else ketqua[index]=0;
    30.    
    31.     return ketqua;
    32. }
    33.  
    34. void main()
    35. {
    36.     cout <<chuanhoa ("       mAi   vAN  mANH        ");  // kết quả là: "Mai Van Manh"
    37.  
    38.    
    39.     cout <<"\n\n";
    40.     system("pause");
    41. }
    Đã được chỉnh sửa lần cuối bởi mvmanh : 11-11-2011 lúc 02:30 PM.

  5. #5
    Ngày gia nhập
    11 2010
    Nơi ở
    hell
    Bài viết
    165

    else if (s[i]!=' ' && flag==0);
    sau if là ;
    HT117-5277

  6. #6
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Mặc định thắc mắc về thuật toán chuẩn hóa chuỗi

    Trích dẫn Nguyên bản được gửi bởi pkthanh92 Xem bài viết
    //start

    t = strlen(s);
    for(int t = -1; ++t < length;for (int i = -1 ; ++i < length; if(s[i] == s[i+1] && s[i] == 32) for(int j = i; ++j < length ; s[j] = s[j+1]) ));

    //done
    Trích dẫn Nguyên bản được gửi bởi mvmanh Xem bài viết
    Mình có thuật toán thế này, bạn xem thử.

    Mình tạo 1 chuỗi mới (kết quả), duyệt từ đầu đến cuối chuỗi gốc, lấy những ký tự hợp lệ và cho vào chuỗi mới. (Các ký tự đầu từ thì in hoa, còn lại thì in thường, chỉ lấy 1 khoảng trắng giữa 2 từ)
    ...
    Người ta hỏi ý nghĩa và nhiệm vụ của phần i--, tự dưng đưa một đống code vào.

    Code lấy bớt khoảng trắng ra có nhiều rồi. Mà cũng rất giản dị, chỉ cần 1 vòng lặp thôi không cần phải 2 mảng hay mấy vòng lặp.

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

  1. Bài tập về chuẩn hóa chuỗi
    Gửi bởi thongnlkh_aptech trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 22
    Bài viết cuối: 29-04-2014, 12:11 AM
  2. Chuẩn hóa chuỗi!!! Help
    Gửi bởi pato24193 trong diễn đàn Nhập môn lập trình Java
    Trả lời: 1
    Bài viết cuối: 02-01-2013, 09:32 PM
  3. Lập trình C Không hiểu ý nghĩa thuật toán nối liền 2 dấu cách liền nhau trong chuẩn hóa chuỗi
    Gửi bởi giang92 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 8
    Bài viết cuối: 06-12-2011, 11:42 PM
  4. Bài tập C Tách và chuẩn hóa họ tên từ chuỗi
    Gửi bởi bachdev trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 02-11-2011, 08:16 AM
  5. Chuẩn hóa căn thức - thảo luận thuật toán
    Gửi bởi mp121209 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: 11-09-2010, 10:37 AM

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