Thứ Năm, 27 tháng 2, 2014

[C++] Hướng dẫn cài đặt cygwin lên windows

Nếu như các bạn lập trình C/C++ không muốn dùng IDE mà dùng luôn notepad để viết code, sau đó dùng cygwin để biên dịch code, chúng ta làm như sau:
Đầu tiên các bạn tải gói cygwin tại đây
Sau đó giải nén file Cygwin_download.zip sẽ được các file như hình:
Tiến hành cài đặt:



Chọn đúng thư mục http%3a%2f%2fmirrors.163.com%2fcygwin%2f:


Chọn OK:
Chọn các gói sau để tải về:

Chọn vào biểu tượng và mở chương trình lên:

Để biên dịch 1 file nguồn có tên là main.cpp, ta copy file này vào thư mục C:\cygwin\home
Sau đó gõ lệnh như hình:


Vậy là các bạn đã có thể biên dịch file nguồn trên cygwin :D
Chúc các bạn thành công!

Thứ Tư, 26 tháng 2, 2014

[C&asm] - Cách chèn code asm trong C

Bài này giới thiệu cách chạy 1 đoạn code asm trong visual C.
asm là viết tắt của ngôn ngữ bậc thấp assembly, một ngôn ngữ mạnh mẽ nhất trong các ngôn ngữ lập trình, nó chỉ yếu hơn mã nhị phân 1 tẹo :))
Để hiểu thêm về ngôn ngữ này, các bạn vào đây hay vào đây để học nhé :)
Bây giờ chúng ta cùng "nhúng" ngôn ngữ asm vào C, kiểu như nhúng thịt bò vào lẩu ấy, xem nó có ngon hơn không nhé.
Thôi không chém gió nữa, bắt đầu "nhúng thịt bò" nào :D
Yêu cầu:
- Trình biên dịch: visual 2010
Các bước thực hiện:
Bước 1: Mở visual 2010, tạo 1 project C++ mới, tích vào ô empty project. Cái này chắc mọi người biết :)

Bước 2:
Vào như hình vẽ, add 1 file C++ và đặt tên là main.cpp
Bước 3:
Bây giờ mình giới thiệu cú pháp "nhúng" mã asm trong C như sau:
__asm
{
      mã asm chèn ở đây
}
Mã asm là gì? cái này các bạn phải đọc thêm nhiều bài viết về nó. Ở bài này mình giới thiệu 1 số mã cơ bản như sau:
mov adress1, adress2: Viết tắt tiếng Anh của nó là movie, nghĩa là di chuyển. Di chuyển địa chỉ ô nhớ máy tính từ địa chỉ 2 về địa chỉ 1. adress2 -> adress1. tùy trình biên dịch, dùng mov hoặc lea(tiếng Anh là leave)
push adress:  như nghĩa từ push luôn, đẩy địa chỉ adress vào ngăn xếp
pop adress: Đẩy các giá trị của địa chỉ ra từ ngăn xếp
call: gọi các hàm cần dùng, xem ở đây
OK, bây giờ các bạn vào file main.cpp vừa tạo chèn code này vào:
#include<stdio.h>
#include<conio.h>
int main()
{
char hi[] = "Xin chao";
char earth[] = "The gioi";
char text[] = "%s %s";
__asm
{
lea eax,earth // eax = address of earth
push eax   // put eax at the top of the stack
lea eax,hi  // eax = address of hi
push eax
lea eax,text
push eax
call DWORD ptr printf
// or the indierct call
// mov eax, printf
// call eax
pop ebx // clean up the stack
pop ebx
pop ebx
}
getch();
return 0;
}

Bây giờ chúng ta F5 để chạy chương trình. Kết quả như sau:


Các tut sau mình sẽ giới thiệu cách code các bài đơn giản bằng asm :)
Hi vọng  mọi người quan tâm!


Thứ Sáu, 21 tháng 2, 2014

[C/C++] Tổng hợp các IDE cho lập trình C++

Thỉnh thoảng vẫn có nhiều bạn phải tải các công cụ phần mềm phục vụ cho lập trình C/C++ và không biết cái nào tốt hơn. Hôm nay mình viết tut này, theo quan điểm cá nhân mình thôi nhá, mình sẽ ưu tiên cái nào tốt hơn cái nào theo ví trí xếp từ trên xuống. Nào bắt đầu nhé :D
1. visual studio
Đây là IDE mạnh mẽ nhất phục vụ cho việc lập trình C++ và bạn phải trả phí cho nó.
Bản dùng thử có thể tải về tại đây:
http://www.visualstudio.com/downloads/download-visual-studio-vs
Còn muốn tải bản full thì làm như sau:
Bước 1: Tải phần mềm download torrent tại đây
Bước 2: Cài đặt phần mềm. Cứ next tứ tung nhé, cái này tự cài mình không hướng dẫn
Bước 3: Vào trang này và kick chuột vào biểu tượng nam châm như hình vẽ, sau đó chọn thư mục đặt file tải về và chọn OK cho nó chạy:
Đa số phim HD mình cũng hay tải về kiểu này. Ưu điểm của torrent là khi bạn tắt máy tính đi nó vẫn không ngừng tải khi bật máy lần tiếp theo. Và hơn nữa nó tải càng khỏe khi có nhiều người cùng tải nó :D

2. codeblocks-13.12-setup
IDE này cũng khá hay vì nó miễn phí, hỗ trợ nhắc code rất tiện. Mình cũng khá thích nó, chỉ có cái lệnh atoi không có là bực mình tý :(
Các bạn vào trang chủ tải tại đây hoặc tải tại đây do mình up lên :)
3. Dev-C 
Phần mềm này chạy trên window và cả linux.
Nếu bạn dùng winxp hay win 7 thì có thể tải tại đây hoặc lên trang chủ tải tại đây
Bạn nào dùng win8 thì tải tại đây hoặc tải tại đây có cả thư viện graphis.h và cách hướng dẫn cài đặt

4. C-free
Nghe tên ai cũng nghĩ nó miễn phí nhưng nó chỉ cho thử 30 ngày thôi. Cái này cũng có nhắc lệnh nhưng chạy chưa ổn định lắm trên win7 về sau.
Các bạn tải bản dùng thử 30 ngày tại đây hoặc nếu dùng hơn 30 ngày thì điền cái key này nếu nó hỏi:
name:minhhung1122
email:u0t2@yahoo.com.vn
key:3JzB6enV1LPGw5u4xsGbrcfB3LXBxMC1zp2E6Zus
Nhớ tắt mạng cho chắc ăn nhé :)
5. Borland C 5.02
Cái này lâu lắm rồi, nhiều trường đại học vẫn dùng cái này vì có thư viện graphics.h, cũng khá hay :)
Tải tại đây nhé!

6. Nếu bạn không thích dùng IDE mà dùng notepad để viết code, sau đó dùng gcc để build thì làm thế này. (Cái này cho các bạn đã hiểu kỹ về mấy món build nhé)
Bước 1: Dùng notepad của window hoặc  tải  notepad++ tại đây
Bước 2: Tải MinGW sau đó copy vào ổ cài win tại đây
Bước 3: Khi tải xong, các bạn tiến hành cài đặt và trên biểu tượng màn hình nó xuất hiện MinGW Installer
Các bạn mở nó lên và tiến hành tải các gói về, như hình sau:
Khi tải các đầy đủ, các bạn thiết lập biết môi trường để cho window hiểu, làm như sau:
B1: chọn chuột phải vào mycomputer ở màn hình, chọn properties
B2: chọn system protection -> Advanced -> Environment Variables... -> Kéo chọn path và chọn edit:
thêm C:\MinGW\bin vào vì mình để thư mục MinGW ở ổ C mà :)
Chọn OK. Tiến hành khởi động lại máy
Bước 4:
 Các bạn tiến hành build như sau. Ví dụ chương trình đơn giản nhất và lưu vào ổ C như hình(chú ý phần đuôi file là cpp hoặc c nhé):
Sau đó các bạn vào cmd và gõ lênh như sau:
cd C:\   (cái này là để di chuyển vào ổ C, vì tớ đặt  file hello.c ở đây)
gcc hello.c -o hello

OK vậy là đã xong phần IDE rồi nhé.
Mọi người có ý kiến thắc mắc gì để lại coment ở dưới bài viết này :)
Thank you :D



Chủ Nhật, 16 tháng 2, 2014

[WINAPI] Code điều chỉnh button bằng 4 nút di chuyển

chúng ta tạo 1 button và điều chỉnh button đó bằng 4 nút.
source code như sau:
#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif

#include <tchar.h>
#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
HWND textfield, button;
int x=100,y=100;
void reset_key()
{
    if(x<0)
    {
        x=0;
    }
     if(y<0)
    {
        y=0;
    }
     if(x>450)
    {
        x=450;
    }
     if(y>470)
    {
        y=470;
    }
}
/*  Make the class name into a global variable  */
TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           _T("Quynh - application 1"),       /* Title Text */
           WS_MINIMIZEBOX|WS_SYSMENU, /* not change window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           500,                 /* The programs width */
           500,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    switch (message)                  /* handle the messages */
    {

        case WM_CREATE:

        button = CreateWindow("BUTTON","0",
                              WS_VISIBLE|WS_CHILD|WS_BORDER,
                              y,x,25,25,
                              hwnd,NULL,NULL,NULL);
        break;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;

        case WM_KEYDOWN:
            //Hide button
           // EnableWindow( button,  false);
           ShowWindow(button,SW_HIDE);
            //Press key up key: moview button
            if (GetAsyncKeyState(VK_UP)){
               x = x-25;
                reset_key();
            ShowWindow(button,SW_HIDE);
            button =CreateWindow("BUTTON","0",
                              WS_VISIBLE|WS_CHILD|WS_BORDER,
                              y,x,25,25,
                              hwnd,NULL,NULL,NULL);
            }
                //Press Key down
              if (GetAsyncKeyState(VK_DOWN)){
               x = x+25;
               reset_key(); ShowWindow(button,SW_HIDE);
            button =CreateWindow("BUTTON","0",
                              WS_VISIBLE|WS_CHILD|WS_BORDER,
                              y,x,25,25,
                              hwnd,NULL,NULL,NULL);
            }

            //Key left
             if (GetAsyncKeyState(VK_LEFT)){
               y= y-25;
               reset_key(); ShowWindow(button,SW_HIDE);
            button =CreateWindow("BUTTON","0",
                              WS_VISIBLE|WS_CHILD|WS_BORDER,
                              y,x,25,25,
                              hwnd,NULL,NULL,NULL);
            }
            //Key right
            if (GetAsyncKeyState(VK_RIGHT)){
               y= y+25;
               reset_key(); ShowWindow(button,SW_HIDE);
            button =CreateWindow("BUTTON","0",
                              WS_VISIBLE|WS_CHILD|WS_BORDER,
                              y,x,25,25,
                              hwnd,NULL,NULL,NULL);
            }
        break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}


[WINAPI] Tạo button và text field trong C++

Chúng ta tạo 1 giao diện như sau:


Đợt này mình ngại viết tut quá, nên đăng code sau đó anh em xem qua rồi có gì không hiểu thì coment ở dưới nhé. Mình sẽ trả lời khi có thời gian :)
Đây là code:
#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif

#include <tchar.h>
#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
HWND textfield, button;

/*  Make the class name into a global variable  */
TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           _T("Quynh - application 1"),       /* Title Text */
           WS_MINIMIZEBOX|WS_SYSMENU, /* not change window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           500,                 /* The programs width */
           500,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {

        case WM_CREATE:
        textfield = CreateWindow("STATIC","Hello World!",WS_VISIBLE|WS_CHILD,
                                 20,20,100,25,
                                 hwnd,NULL,NULL,NULL);
        button = CreateWindow("BUTTON","ACCESS",
                              WS_VISIBLE|WS_CHILD|WS_BORDER,
                              20,50,100,25,
                              hwnd,(HMENU) 1,NULL,NULL);
         CreateWindow("BUTTON","CLOSE",
                              WS_VISIBLE|WS_CHILD|WS_BORDER,
                              150,50,100,25,
                              hwnd,(HMENU) 2,NULL,NULL);
        break;
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
            case 1:
                ::MessageBeep(MB_ICONERROR);
                ::MessageBox(hwnd,"Button was clicked!","Message",MB_OK);
                break;
            case 2:
                PostQuitMessage (0);
                break;
            }
            break;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}


[HACKING] - Tải cuốn Gray_Hat_Hacking_Third_Edition

Các bạn vào đây để tải nhé:

Thứ Bảy, 8 tháng 2, 2014

[Tài liệu] _ Cuốn code complete

Các bạn yêu code complete và muốn đọc nó thì vào đây  để tải về nhé :)

[THẢO LUẬN] - Chém gió về C++

Đợt này mình hay vào nhóm học C/C++ rồi ngồi viết 1 số code đơn giản mà lâu rồi mới đụng lại. Cũng rất vui vì lâu lắm mới thấy mình thích học đến thế.
Lại nhớ câu học cơ bản mới trở thành tài lớn. Đúng là vậy, ở đây luôn nảy sinh những vấn đề cơ bản tưởng như ai cũng biết, nhưng nếu đụng vào thì 1 đống vấn đề nảy sinh.
vd: Có bạn đặt câu hỏi giải bài toán nhập 1 số n, tìm tất cả các số nguyên tố nhỏ hơn n.
Code bạn ý chưa tốt, chạy bị lỗi và mọi người nhảy vào giúp rất nhiệt tình. Mình cũng khí thế viết code C++ như sau:
#include<iostream>
#include<math.h>
int main()
{
 int n;
 int flag=0;//co xac dinh co so hay k
 int la_snt;
 std::cout<<"Nhap n:"<<std::endl;
 std::cin>>n;
 std::cout<<"Ket qua"<<std::endl;
 for(int k=2;k<=n;k++)
 {
  la_snt=1;
  for (int i=2;i<=sqrt(k);i++)
  {
 
   if(k%i==0)
   {
    la_snt=0;
    i=sqrt(k);
   }
  }
   if(la_snt==1)
   {
    std::cout<<k<<"; ";
    flag=1;
   }
 
 }
 if(flag==0)
 {
  std::cout<<"Khong co so nao ca!"<<std::endl;
 }
 return 0;
}
Câu chuyện là tự nhiên qua cái code vừa viết, mình nảy sinh làm 1 đống video để nói luôn chứ không phải viết thế này, cho các bạn mới bắt đầu hiểu. Đây là cách tự làm thêm cho mình với giá 0 đồng, có thông minh không?
Tự nhiên nhớ cái ý nghĩa của namespace, các bạn mới code hỏi mình:"Vì sao anh không dung câu lệnh using namespace std luôn mà cứ phải std::cout hay std::endl, trông nó rất rối" hay là vì sao dùng std::endl thay cho mã ASCII '\n' để xuống dòng. Nhiều vấn đề trăn trở lắm. Vậy nên các bạn có câu hỏi hay gửi về cho mình nhé. Nhân tiện có 1 câu nói mà mình rất thích:
"Chúng ta không quyết định nơi mà chúng ta sinh ra, nhưng chúng ta quyết định được chúng ta sống thế nào"