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ố 12 kết quả

Đề tài: Bài tập về chuỗi

  1. #1
    No Avatar
    chobeo79 Khách

    Mặc định Bài tập về chuỗi

    Nhờ các bạn chỉ giùm mình thuật toán của bài này:

    cho 1 chuỗi gồm số 0 và 1, con verert to Hexa

    Ex: 010101101000 is 568
    11010110110 is D6C

    Cám ơn nhiều

  2. #2
    Ngày gia nhập
    11 2007
    Bài viết
    47

    Trích dẫn Nguyên bản được gửi bởi chobeo79 Xem bài viết
    Nhờ các bạn chỉ giùm mình thuật toán của bài này:

    cho 1 chuỗi gồm số 0 và 1, con verert to Hexa

    Ex: 010101101000 is 568
    11010110110 is D6C

    Cám ơn nhiều
    Cái số cuối của bạn phải là 110101101100 chứ nhỉ ( thiếu 1 số 0)
    Cách làm:
    Bạn tách chuỗi trên thành từng nhóm, mỗi nhóm 4 kí tự( tính từ cuối chuỗi nhé). Nếu nhóm đầu tiên mà thiếu bạn bổ sung thêm số 0 vào bên trái.

    Với mỗi chuỗi con 4 kí tự, nó có dạng "abcd".
    Bạn tính a*8+b*4+c*2+d được kq trong khoảng [0,15]
    Nếu kq = 10 -> A
    kq = 11-> B
    kq = 12-> C
    kq = 13 14 15 -> D E F
    Giờ bạn ghép các chuỗi con này theo thứ tự ban đầu, bạn sẽ được số hexa
    Minh họa với 2 ví dụ của bạn nhé:

    vd1:010101101000-> chia 3 nhóm 0101, 0110, 1000
    0101 :1*4+1 = 5 -> 5
    0110 :1*4+1*2 = 6->6
    1000: 1*8=8 -> 8
    KQ: 568

    vd2:110101101100-> chia 3 nhóm 1101, 0110,1100
    1101:1*8+1*4+1 = 13 -> D
    0110:1*4+1*2 = 6 -> 6
    1100:1*8+1*4 = 12->C
    KQ6C

  3. #3
    No Avatar
    chobeo79 Khách

    Cảm ơn nhiều về thuật toán. Mình bị stuck khi cắt chuỗi thành từng group co 4 số. Can you help me with this? Thanks

  4. #4
    Ngày gia nhập
    11 2007
    Bài viết
    153

    Theo mình bạn nên dùng 1 biến con trỏ lưu địa chỉ đầu của mảng rồi dùng vòng for đếm ngược lên và thêm 1 biến đếm nếu biến đếm = 4 thì dùng lệnh gán để gán con trỏ lên vị trí tiếp theo sau 4 số đó ví dụ:
    Code:
    int *pt;
    int mang[50];
    int dem=0,i,j;
    pt=mang;
    for(i=0;i<n;i++)
    {
       
       if(dem==4)
       { 
          pt=&mang[i]);
       }
    dem++;
    }
    tiếp theo là việc truyền 4 số đó vào 1 mảng có 4 phần tử rồi so sánh như metal_sheld đã hướng dẫn ý ,đây chỉ là 1 ví dụ có thể không chuẩn lắm nhưng bạn có thể dựa theo cách mình hướng dẫn để làm.Chúc bạn học tốt ^^!!

  5. #5
    No Avatar
    chobeo79 Khách

    Có ai giúp mình code bài này được ko? This is my exam review. Please

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

    Mặc định Bài tập về chuỗi

    Bạn xem cái này có giúp được không?
    http://www.nowupload.com/:NrD

  7. #7
    Ngày gia nhập
    11 2007
    Bài viết
    47

    Trích dẫn Nguyên bản được gửi bởi chobeo79 Xem bài viết
    Có ai giúp mình code bài này được ko? This is my exam review. Please
    Hướng dẫn cự thế vậy rồi còn ...
    Bạn quá ỉ lại đấy

  8. #8
    Ngày gia nhập
    07 2007
    Nơi ở
    Hồ Chí Minh
    Bài viết
    66

    Bạn có thể làm 1 cái rất trực quan dễ hiểu như thế này.
    Bạn khai báo 1 mảng 2 col, 1 col là chuỗi dạng binary, 1 bên là kí tự Hex tương ứng
    char Table[][] = {"0000","0","0001","1","0010","2"........
    Sẽ có tất cả 16 col.
    Khi 1 chuỗi binary dc đọc, bạn chuyển nó thành các segment 4 kí tự rồi tiến hành replace theo cái table trên
    ví dụ: nhập vào chuỗi "00010000"
    thì => 2 segment , 0001, 0000 , tra trong Table thì =>
    tương ứng 10 trong Hex

  9. #9
    No Avatar
    chobeo79 Khách

    Các bạn coi dùm mình sai chỗ nào mà run ko được. Thanks
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <ctype.h>
    
    void selectSumMenu();
    void newstring();
    void displayString(char*);
    void encodeToHexa(char*);
    int teststring(char*);
    
    
    int main()
    {
        selectSumMenu();
    	
    	return 0;
    }
    
          
    int teststring(char* input)
    {
    	int iNumofOne;
    	int j;
        int i = strlen(input) ;
        iNumofOne = 0;
    	
    		for (j=0; j<i; j++)
    		{
    			if ((input[j]!='0') && (input[j]!='1'))
    			{
    				   if (input[j]=='1')
    				   {
    				    iNumofOne++;
    					if (iNumofOne > 4)
                        return 0;                               
    				   }
    			   
    			       else iNumofOne = 0;                            
    			}		
    		}
                    return 1;
    		 
    }
    
    
    void encodeToHexa(char *input)
    {
        
    	int iSize2;
    	char* cPtr;
        int j,k=0;
        int i = strlen(input);
        int a,b,c,d;
    	
        iSize2 = i/4;
        //cPtr = (char*)malloc((i/4)*sizeof(char));
    
    	cPtr = ( char* ) malloc( iSize2 * sizeof( char ) );
    	
    
    		for (j=0; j<i; j=j+4,k++)
    		{   
    			a=b=c=d=0;
    			if(input[j] == '1')
    		        a = 1 * 8;
    			if(input[j+1] == '1')
                    b = 1 * 4;
    			if(input[j+2] == '1')
    			    c = 1 * 2;
    			if(input[j+3] == '1')
    			    d = 1;
    			cPtr[k] = a+b+c+d ;  	
    		}
    
            for (k=0; k<iSize2; k++)
            {
    			if (cPtr[k] == 0)
    				cPtr[k] = '0';
    
                if (cPtr[k] == 1)
    				cPtr[k] = '1';
    
                if (cPtr[k] == 2)
    				cPtr[k] = '2';
    
                if (cPtr[k] == 3)
    				cPtr[k] = '3';
    
                if (cPtr[k] == 4)
    				cPtr[k] = '4';
    
                if (cPtr[k] == 5)
    				cPtr[k] = '5';
    
                if (cPtr[k] == 6)
    				cPtr[k] = '6';
    
                if (cPtr[k] == 7)
    				cPtr[k] = '7';
    
                if (cPtr[k] == 8)
    				cPtr[k] = '8';
    
                if (cPtr[k] == 9)
    				cPtr[k] = '9';
    
    			if (cPtr[k] == 10)
    				cPtr[k] = 'A';
    
    			if (cPtr[k] == 11)
    				cPtr[k] = 'B';
    
    			if (cPtr[k] == 12)
    				cPtr[k] = 'C';
    
    			if (cPtr[k] == 13)
    				cPtr[k] = 'D';
    
    			if (cPtr[k] == 14)
    				cPtr[k] = 'E';
    
    			if (cPtr[k] == 15)
    				cPtr[k] = 'F';
    		}
        printf("Hexa value : ");
        for (j=0; j<iSize2; j++)
    	{
    		printf("%c", cPtr[j]);
    	}
        return;	
    }
    
    void selectSumMenu()
    {
    	char *inputchar;
    	int i;
    	
    	
    	do
    	{
    		printf("\n\t**************************************");
    		printf("\n\t*              MENU                  *");
    		printf("\n\t*                                    *");
    		printf("\n\t*  1. Display existing string        *");
    		printf("\n\t*  2. Ask for new string             *");
    		printf("\n\t*  3. Convert string to Hexa form    *");
    		printf("\n\t*  4. Quit                           *");
    		printf("\n\t**************************************");
    
    		printf( "\n\tEnter  an option (1, 2, 3, or 4): " );
    		scanf( "%d", &i );
    
    		//inputchar = "Testing";
    
    	switch ( i )
        {
          case 1: displayString(inputchar);
    		      break;
          case 2: newstring();
                  break;
          case 3: encodeToHexa(inputchar);
    		      break;
          
          case 4: printf( "\n\tThank you for trying!\n" );
                  break;
          default: printf( "\n\tWRONG OPTION!\n" );
        }
      }
    	while ( i != 4 );
    
      return;
    }
    
    void newstring()
    {
    	char* inputchar;
    	int iLengthmax;
        int iTest;
        int i = strlen(inputchar) ;
    	printf("\n\tDe-allocate existing dynamic memory: ");
                
    	if (i != 0)
    		printf("Not required");
    	else printf("Required");
    
        printf("\n\tWhat is the estimate length of string? ");
        scanf("%d",&iLengthmax);
    	inputchar = (char*)malloc(iLengthmax*sizeof(char));
    
        printf("\n\tDynamic allocation for array of %d characters", iLengthmax +1);
    	printf("\n\tEnter your string");
        scanf("%s", inputchar);
    	iTest = teststring(inputchar);
        if (iTest == 0)
    	{ 
    		printf("\n\tThe string is not convertible!");
    		printf("\n\tDe-allocate dynamic memory");
    		free(inputchar);
    		printf("\n\tAssign 0 to the pointer");
            inputchar = 0;
    	}
        else printf("\n\tThe string is convertible!");
    	return;
    }
    void displayString( char* inputchar )
    {   
    	int iLen;
    
    	int i;
    
    	iLen = strlen( inputchar );
    
    	if ( iLen != 0 )
    	{
    	
    		printf( "\nThere is a string!\n" );
    
    	    for ( i = 0; i < iLen; i++ )
    		{ 
    		    printf( "\n%c", *( inputchar + i ) ); //input[ i ]
    		}
    	}
    	else
    	{
    		printf( "\nThere is no string!\n" );
    	}
    
    	return;
    }

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

    Bài của bạn hàm dislay chạy bình thường, nhưng trước đó bạn phải gán giá trị cho cái inputchar chứ. Bạn không khởi tạo thì sẽ treo máy đấy.

    Hàm newstring(); của bạn mình cũng đọc qua, nhưng không có tham số truyền vào. Mục đích của hàm này là gì bạn. Bạn xem lại xem

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

  1. 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
  2. Lập trình C Thay thế chuỗi s1 trong chuỗi s bằng chuỗi s
    Gửi bởi duytue trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 23-09-2011, 04:16 PM
  3. thay thế chuỗi con thứ i trong chuỗi mẹ bằng 1 chuỗi khác
    Gửi bởi nhat1811 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: 06-08-2011, 08:25 AM
  4. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM
  5. xem một từ trong chuỗi là một chuỗi con, sắp xếp các chuỗi con theo thứ tự tăng dần
    Gửi bởi qpkdct1101 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 20-01-2011, 08:22 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