Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Trang 2 trên tổng số 4 Đầu tiênĐầu tiên 1234 Cuối cùngCuối cùng
Từ 11 tới 20 trên tổng số 35 kết quả

Đề tài: Lập trình C | Những chương trình C Cơ bản

  1. #11
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    Mặc định Lập trình C | Những chương trình C Cơ bản

    Trích dẫn Nguyên bản được gửi bởi TQN
    Ở dưới là đoạn code mà tui thường dùng để đổi một số int sang chuổi hex, được viết thành 1 hàm và đã được optimize. Hàm này chạy rất nhanh, hơn các cách khác như dùng sprintf, std::string....Build và run với VC++ xx.
    Code:
    /**********************************************************************
    * Function:     Num2HexStr
    * Description:  Convert a number to a hex string
    * Parameters:   pBuf: Pointer to buffer to store the result hex string.
    *               The caller must ensure buffer have enough space to store
    *               len of hex characters and a NULL character.
    *               len: number of hex character required. The buffer will be
    *               add 0 to the left to ensure have len hex characters
    *               num: number will be converted
    * Returns:      The pointer pBuf
    **********************************************************************/
    static inline char* Num2HexStr(char *pBuf, uint len, uint num)
    {
        static const char HEXSTR[] = "0123456789ABCDEF";
    
        _ASSERTE(len > 0);
        _ASSERTE(pBuf != NULL);
        _ASSERTE(FALSE == IsBadWritePtr(pBuf, UINT_MAX));
        if ((NULL == pBuf) || (0 == len))
        {
            TRACE("IDB2SIG - %s(%d) : Invalid function input arguments.\n",
                      __FILE__, __LINE__);
            return pBuf;
        }
    
        char *p = pBuf + len;
        *p-- = '\0';
        while (p >= pBuf)
        {
            int digit = num & 0x0F;
            num >>= 4;
            *p-- = HEXSTR[digit];
        }
    
        return pBuf;
    }
    Điểm mạnh của hàm này là tốc độ và padding 0 vào đầu chuỗi trả về.
    VD: NumToHexStr(pBuf, 4, 3) => 0003
    Đoạn mã trên của bác không chạy được nếu không có MFC mặc dù bản thân của hàm không thực sự cần MFC plattform. Có 1 vấn đều đau đầu là không có MFC ta không sử dụng được các Macro như TRACE, ASSERT, VERIFY ...
    Bác biết cách nào dùng không chỉ em với?

    Hàm trên của bác chưa thực sự tối ưu, cụ thể là việc khai báo digit trong vòng lặp. Như thế mỗi lần vào vòng lặp mới sẽ phải cấp biến mới, và rõ ràng như vậy không tối ưu so với việc khai báo digit bên ngoài vòng lặp.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã được chỉnh sửa lần cuối bởi Tarzan : 03-11-2006 lúc 11:31 PM.

  2. #12
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Hì hì, thì bỏ TRACE đi, dùng OutputDebugString API hay cái gì đó tự viết.
    Code này tui viết chỉ dùng C RTL của VC 6 thôi, không dùng MFC, msg là macro thay cho TRACE, nhưng khi post code lên sữa lại thành TRACE chứ không bà con thắc mắc. _ASSERTE là macro có sẵn của C RTL của VC++. Cậu search lại sẽ thấy.
    Còn cái int digit thì compiler nó không ngu như cậu tưởng đâu, nó là local var nên được cấp phát một lần duy nhất trên stack thôi. Cậu chỉnh option export ra ASM listing thì sẽ thấy.
    Đối với dữ liệu cơ bản: số, chuỗi, con trỏ... khai báo trong vòng lặp hay ngoài vòng lặp đều như nhau về vấn đề mã compiler sinh ra, các trình compiler mới đều rất, rất thông minh. Nhưng tuyệt đối hạn chế khai báo các biến class, struct có contructor, cấp phát memory liên tục trong vòng for.
    VD: tuyệt đối tối kỵ:
    for (x....)
    {
    CString str;
    // làm gì đó với str
    }
    Mỗi khi thực hiện một lần lặp, constructor và destructor của CString cho str sẽ được gọi. Trong trường hợp này đưa khai báo CString str ra ngoài.

  3. #13
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    Cảm ơn bác nhiều. Em biết thêm được nhiều thứ. Đúng là nó cấp phát 1 lần duy nhất thật.

    Cái _ASSERTE em xem lại rồi, đúng là nó của C RTL thật. Nhưng còn VERIFY macro, bác biết cái nào tương đương trong C RTL không? Nhiều khi chỉ muốn kiểm tra giá trị trả về của 1 hàm mà dùng _ASSERTE thì lúc build RELEASE cái hàm đó toi mất.
    Đã được chỉnh sửa lần cuối bởi Tarzan : 04-11-2006 lúc 08:51 AM.

  4. #14
    Ngày gia nhập
    09 2006
    Bài viết
    711

    thì viết đơn giản thôi:
    #ifdef _DEBUG
    #define _VERIFY(x) _ASSERTE(x)
    #else
    #define _VERIFY(x) (x)
    #endif

  5. #15
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Vẽ ma phương cấp n với n lẻ và nhỏ hơn 20 ... Bạn có thể sửa lên lớn hơn 20 cũng được nhưng mà nhìn chẳng ra cái gì ^-^

    Code:
    #include <stdio.h>
    #include <conio.h>
    
    // func declaration
    void matrix( int n );
    
    // main()
    int main(void)
    {
        int n;
        
        // input until it's valid.
        do 
        {
        printf("\n Plz input size of matrix [ odd size & n < 20 ]: n = ");
        scanf("%d",&n);
        if ( n % 2 == 0 ) printf("\n Invalid input value .. Plz re-input ... \n");
        } 
        while ( n % 2 == 0 );
        
        if ( n > 20 ) { n = 19 ; // in case of n is greater than 20
        printf("\n %d is greater than 20 & set to be default as 19 .",n ); } // end if
        
        // call matrix()
        matrix(n);
        // stop to watch
        getch();
        return 0;
    }
    
    // function matrix(int n)
    void matrix( int n )
    {
         int a[20][20];
         int i, j, row, col, count = 1;
         int old_row, old_col, sum = 0;
         
         // set starting value of array
         for ( i = 0 ; i < n ; i++ )
         for ( j = 0 ; j < n ; j++ )
             a[i][j] = 0;
         
         // set the 1st value to start
         row = 0; col = (n-1) / 2;
         
         while ( count < n*n + 1 )
         {
               a[row][col] = count++ ; // set value for elements
               old_row = row ; old_col = col; // save the last addresses
               // define whether going out of array
               row -= 1; if ( row == -1 ) row = n - 1; 
               col += 1; if ( col == n ) col = 0;
               // in case of already having number
               if ( a[row][col] != 0 ) 
               {
                    row = old_row + 1;
                    col = old_col;
               } // end if
         } // end while
         // print result
         printf("\n");
         for ( i = 0 ; i < n ; i++ )
         {
         for ( j = 0 ; j < n ; j++ )
             printf("%4d",a[i][j]);
         printf("\n");
         } // end for
         
         // calculate sum
         for ( j = 0 ; j < n ; j++ )
             sum += a[0][j];
         printf("\n Sum of each row - column - diagonal line is : %d " , sum);
         
         return;
    }
    Ai giỏi C viết giùm ma phương với n chẵn ^o^
    None!

  6. #16
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mặc định Lập trình C | Những chương trình C Cơ bản

    Chùm bài tập cơ bản linh tinh cho beginner :

    1. Xóa 1 File dùng Remove
    Code:
    #include <stdio.h>
    
    int main()
    {
    remove("d:/urls1.dat");
    
    return 0;
    }
    2. Xóa 1 File dùng Unlink
    Code:
    #include <stdio.h>
    
    int main()
    {
    remove("C:/pete.txt");
    
    return 0;
    }
    3. Cho biết thông tin FAT
    Code:
    #include <stdio.h>
    #include <dos.h>
    
    void main(void)
    {
    struct fatinfo fat;
    
    getfatd(&fat);
    
    printf("Sectors per cluster %d\n", fat.fi_sclus);
    printf("Clusters per disk %u\n", fat.fi_nclus);
    printf("Bytes per cluster %d\n", fat.fi_bysec);
    printf("Disk type %x\n", fat.fi_fatid & 0xFF);
    }
    4. Đếm tần suất 1 kí tự trong 1 file
    Code:
    # include <stdio.h> 
    # include <string.h>
    main() 
    { 
     FILE *fp; 
     char in[100]; 
     long int freq[257]; 
     int i; 
    
     printf("\nFile frequency table generator\n\n"); 
    
     printf("\nInput file:");
     scanf("%s",in); 
     fp=fopen(in,"rb"); 
     if(fp==NULL) 
     { 
      printf("\nCould not open input file.Aborting\n"); 
      return 1; 
     } 
     for(i=0;i<257;i++) 
      freq[i]=0; 
     while(i=fgetc(fp),i!=EOF) 
     { 
      freq[i]++; 
     } 
     fcloseall(); 
     fp=fopen("count.txt","w"); 
     fprintf(fp,"\nCharacter frequency table of %s\n",in); 
     fprintf(fp,"\nCharacter ASCII frequency\n\n"); 
     for(i=0;i<256;i++) 
     { 
      if(i==26) 
      { 
       fprintf(fp,"\t    26\t  %ld\n",freq[26]); 
      } 
      else if(i==9) 
      { 
       fprintf(fp,"\t    9\t  %ld",freq[9]); 
      } 
      else if(i<10) 
      { 
       fprintf(fp,"%c\t    %d\t  %ld\n",i,i,freq[i]); 
      } 
      else if(i<100) 
      { 
       fprintf(fp,"%c\t    %d\t  %ld\n",i,i,freq[i]); 
      } 
      else 
      { 
       fprintf(fp,"%c\t    %d\t  %ld\n",i,i,freq[i]); 
      } 
     } 
     
     fcloseall(); 
     printf("\nFrequency table copied to count.txt\n"); 
    }
    5. Đọc nội dung 1 file
    Code:
    #include <stdio.h>
    
    void main(void)
    {
    FILE *fp;
    char ch;
    
    fp = fopen("websites.txt","r");
    ch = getc(fp);
    while(ch!=EOF)
    {
    putchar(ch);
    ch = getc(fp);
    }
    printf("\n\n");
    }
    6. Chọn ổ đĩa trong DOS
    Code:
    #include <stdio.h>
    #include <dir.h>
    
    void main(void)
    {
    int drives;
    
    drives = setdisk(3);
    printf("The number of available drives is %d\n", drives);
    }
    7. Chọn ổ đĩa trong WINS
    Code:
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void main(void)
     {
        char szBuffer[MAX_PATH+100];
        UINT nDrive, AvailDrive = 0;
        int dwLogicalDrives = GetLogicalDrives();
        DWORD Success;
    
        printf("Number of logical drives: %d\n", dwLogicalDrives);
        	for (nDrive = 0; nDrive < 32; nDrive++)
           {
           	if (dwLogicalDrives & (1 << nDrive))
              { // Is drive available?
                AvailDrive++;
                // Get disk information.
                wsprintf(szBuffer, "%c:\\", nDrive+'A', '\0');
                // Print out information.
     	         if(SetCurrentDirectory(szBuffer))
                  printf("%s Is Now Current\n", szBuffer);
    	         else
                  printf("Could not set %s as the current drive\n", szBuffer);
              }
           }
          printf("Number of drives available: %d\n", AvailDrive);
    
     }
    8. Cho biết kích thước 1 file
    Code:
    #include <stdio.h>
    #include <io.h>
    #include <fcntl.h>
    #include <sys\stat.h>
    
    int main()
    {
    int fp;
    
    long file_size;
    
    if ((fp = open("f:/cprojects/urls.txt", O_RDONLY)) == -1)
    printf("Error opening the file \n");
    else
    {
    file_size = filelength(file_handle);
    printf("The file size in bytes is %ld\n", file_size);
    close(fp);
    }
    return 0;
    }
    Tất cả test trong Dev-C++ .
    Bài nào sai nhờ các bạn sửa ^o^!
    None!

  7. #17
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    @yphanh2002 : không hiểu ý bạn là gì
    1. Có phải bạn muốn tách các chữ số của một số bất kì ra để tính tổng và tích hay không ?
    2. Số 6 chỉ là một trường hợp đặc biệt giống sô 4
    3. Hay là bạn muốn đề cập đến số Hoàn Mỹ ( Perfect Number )
    là số có tích các ước số của nó trừ nó = chính số đó

    ?o?
    None!

  8. #18
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Bài toán số Hoàn Mỹ nhé : In danh sách các số hoàn hảo nhỏ hơn số N nhập từ user

    Code:
    #include <stdio.h>
    
    int main(void)
    {
       int  i , j , n , tong ;
    
       printf("\n Nhập vào N = "); scanf("%d",&n);
       
       for ( i = 2 ; i <=n ; i++ )
       {
          tong = 1 ; 
          for ( j = 2; j <= i / 2 ; j++ )
          if ( i % j == 0 )   tong += j;
          if ( tong == i ) printf(" %10d ", i );
       }
       getch();
       return 0;
    }
    None!

  9. #19
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Cái số của bạn mình không biết tên nên tạm gọi là số đẹp nha
    Nếu thỏa mãn cái tính chất của bạn thì báo nó đẹp nếu không thì báo không đẹp

    Code:
    #include <stdio.h>
    #include <conio.h>
    
    int main(void)
    {
        int n ,i,j ;
        int tong = 0, tich = 1;   
        printf("\n nhap vao 1 so : ");scanf("%d",&n);
        
        for ( i = 1 ; i < n  ; i++ )
        {
        if ( n % i == 0 ) { tong += i ; tich *= i ;}
        }
        
        if ( tong == tich && tich == n ) printf("\n So dep ");
        else printf("\n So nay ko dep roi .");
        
        getch();
        return 0;
    }
    None!

  10. #20
    No Avatar
    buianhtuanhn Khách

    #include "stdio.h"
    #include "conio.h"

    void main ()
    {
    int i,f,j,iNum,iRun,iTong=0,iTich=1;
    printf ("Kiem tra so co dang x = a+b+c = a*b*c");
    printf ("Nhap so can kiem tra:");
    scanf ("%d",&iNum);
    for (i=0;i<iNum;i++)
    for (j=0;j<i;j++)
    for (f=0;f<j;f++)
    {
    iTich = i*j*f;
    iTong = i+j+f;
    if (iNum == iTong && iTong == iTich)
    printf ("so nay thoa man dieu kien");
    }

    getch();
    }

    Mình viết rồi đây nhưng chẳng biết còn số nào đúng ngoài số 6 nữa ko
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

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