Tạo một mảng gồm n số tự nhiên khác nhau từ 0 đến n-1 (random - ngẫu nhiên):

Gửi các bạn thuật toán tạo mảng số tự nhiêu khác nhau, chi tiết xem bên dưới:

1/ Yêu cầu: Tạo 1 mảng A[n] gồm các số nguyên ngẫu nhiên từ 0 --> n - 1 khác nhau.
     Ví dụ:   n = 10: tạo ra mảng A[] gồm 10 số tự nhiên khác nhau như sau A[ ] = { 9, 3, 8, 5, 4, 6, 7, 2, 0, 1};

2/ Thuật toán:

Bước 1:

          - n
          - Khởi tạo mảng A[i] = i; i : 0--> n-1

Bước 2:
          - Lặp cho tới khi n > 0:
                  . Chọn 1 số id ngẫu nhiên (random) trong khoảng từ 0 --> n -1
                  . Hoán đổi số A[id] (vừa chọn ngẫu nhiên) và A[n-1] ( tức là số vừa chọn xong lần lượt cất vào cuối mảng )
                  . Giảm n = n -1

3/ Code sample:

//  1. khai bao mang A[] va doi tuong s_math_random

//khai bao bien
static java.util.Random s_math_random = new java.util.Random();
int Max = 10;// kich thuoc mang A
int A[] = new int[Max];

// 2. gan gia tri ban dau cho mang A[]

        for ( int i = 0; i < Max; i++ )//  khoi tao mang A[]
        {
            A[i] = i;
        }

// 3. sinh mang A[] cac so int ngau nhien tu 0 --> Max -1

        int n = Max, temp = 0, id_Random = 0;
        while ( n > 0 )
        {
            id_Random = s_math_random.nextInt(n);// hàm random()
            temp = A[n-1];
            A[n-1] = A[id_Random];
            A[id_Random] = temp;
            n--;
        }

        // in mang A[]
        for (int i = 0; i < Max; i++)
        {
            System.out.print(A[i] + ", ");
        }
        System.out.println();

Pointer To Function

Cách khai báo con trỏ hàm: Giống prototype của hàm cần trỏ tới và thêm dấu * vào đầu tên hàm và thêm dấu ngoặc bao quanh với danh sách tham số giống hàm cần trỏ tới.

Ví dụ có hàm int Sub(int a, int b);   --> int (*PFunc)(int , int);//khai bao con tro ham

Ví dụ:

#include <iostream>
using namespace std;

int Add(int a, int b);
int Sub(int a, int b);
int (*PFunc)(int , int);//khai bao con tro ham
int CallFuction(int a, int b, int (*pFunc)(int, int));//truyen tham so bang con tro ham
                            
void main()
{
     int a  = 10, b = 20;
    
     PFunc = Add;
     cout << PFunc(a, b) << endl;

     PFunc = Sub;
     cout << PFunc(a, b) << endl;
    
     cout << CallFuction(a, b, Add) << endl;
     cout << CallFuction(a, b, Sub) << endl;
     system("pause");
}

int Add(int a, int b)
{
     return (a + b);
}

int Sub(int a, int b)
{
     return (a - b);
}

int CallFuction(int a, int b, int (*pFunc)(int, int))
{
     return (*pFunc)(a, b);
}


Ví dụ: con trỏ hàm trong sắp xếp mảng


/*
Nhap n so phan tu cua mang kieu int.
Viet ham random gia tri < n cho mang tren.
Viet 2 ham sap xep mang tang dan và giam dan.
Viet ham với tham so truyen vao la kiểu con trỏ hàm để gọi
1 trong 2 hàm sắp xếp trên.
*/
#include <iostream>

using namespace std;

int *NhapMang(int n);             //prototype
void InMang(int *parr, int n);    //prototype
void SapXepTangDan(int *a, int n);    //prototype
void SapXepGiamDan(int *a, int n);    //prototype
void HoanDoi(int &x, int &y);
void CallFunction(int *arr, int n, void(*Func)(int *, int));

void main()
{
     int n;//Nhap so phan tu mang
     cout << "Nhap n = ";
     cin >> n;
     int *A;
     A = NhapMang(n);
     InMang(A, n);
    
     CallFunction(A, n, SapXepTangDan);//SapXepTangDan(A, n);
     cout << "Sau khi sap xep tang dan:" << endl;
     InMang(A, n);

     CallFunction(A, n, SapXepGiamDan);//SapXepGiamDan(A, n);
     cout << "Sau khi sap xep giam dan:" << endl;
     InMang(A, n);
    

     system("pause");
}

int *NhapMang(int n)
{
     int *pArr = 0;
     pArr = new int[n];
     for (int i = 0; i < n; i++)
     {
          pArr[i] = rand() % n;
     }
     return pArr;
}

void InMang(int *parr, int n)
{
     for(int i = 0; i < n; i++)
     {
          cout << parr[i] << ", ";
     }
     cout << endl;
}

void SapXepTangDan(int *a, int n)
{
     for(int i = 0; i < n - 1; i++)
     {
          for(int j = i + 1; j < n; j++)
          {
              if(a[i] > a[j])
              {
                   HoanDoi(a[i], a[j]);
              }
          }
     }
}


void SapXepGiamDan(int *a, int n)
{
     for(int i = 0; i < n - 1; i++)
     {
          for(int j = i + 1; j < n; j++)
          {
              if(a[i] < a[j])
              {
                   HoanDoi(a[i], a[j]);
              }
          }
     }
}

void HoanDoi(int &x, int &y)
{
     x = x ^ y;
     y = x ^ y;
     x = x ^ y;
}

void CallFunction(int *arr, int n, void(*Func)(int *, int))
{
     (*Func)(arr, n);
}
-          Tạo, đóng, mở tệp tin văn bản và tệp tin nhị phân
-          Giới thiệu một số hàm về xử lý tệp tin
-          Các hàm nhập xuất theo kiểu văn bản
-          Các hàm nhâp xuât theo kiểu nhị phân

-          Nhập xuất ngẫu nhiên

1/ Tạo mảng hai chiều lưu xuống tệp tin:
Viết chương trình nhập ma trận số nguyên a[n][m] với chỉ số hàng(n) và chỉ số cột(m) chưa biết trước được nhập từ bàn phím. Giá trị mảng a[n][m] được sinh ngẫu nhiên. Sau đó lưu mảng a[n][m] vào tệp tin myfile.txt như sau:
dòng 0: ghi chỉ số hàng và chỉ số cột
n dòng tiếp theo ghi n dòng của ma trận a[n][m]. Xem hình bên dưới:
Gợi ý: Dùng con trỏ trỏ tới mảng a[][], int *pa = new int[n*m];
                                ---------------------------------------------------------

Mã chương trình:

#include <stdio.h>

void main()
{
      FILE *pFile = NULL;
      int n, m;
      int *pa = NULL;
      printf("\nnhap hang, cot cua ma tran:");
      scanf("%d %d", &n, &m);

      pa = new int[n*m];
      //Nhập giá trị cho mảng
      for (int i = 0; i < n; i++)
      {
            for (int j = 0; j < m; j++)
            {
                  pa[i*m + j] = i*m + j;
            }
      }
     
      //in mảng ra màn console
      for (int i = 0; i < n; i++)
      {
            for (int j = 0; j < m; j++)
            {
                  //printf("%d, ", *(pa +i*m + j));
                  printf("%d, ", pa[i*m + j]);
            }
            printf("\n");
      }
     
      //Mở file
      pFile = fopen("myfile.txt", "w");
      if( pFile != NULL)
      {
            //ghi chỉ số hàng và cột vào dòng đầu của ma trận
            fprintf(pFile, "%d %d\n", n, m);
            for(int i = 0; i < n; i++)
            {
                  for(int j = 0; j < m; j++)
                  {
                        fprintf(pFile, "%d ", pa[i*m + j]);
                  }
                  fprintf(pFile, "\n");
            }
           
            fclose(pFile);
      }

      getchar();
}

2/ Đọc mảng hai chiều lưu trong tệp tin ra:
    Cho tệp tin "MyFile.txt" có định dạng như sau:
    - Dòng 1 ghi 2 số n và m lần lượt là số hàng và số cột của mảng hai chiều
    - n dòng tiếp theo, mỗi dòng ghi m số nguyên cách nhau bởi 1 khoảng trắng (space)
    Xem ví dụ hình sau:


Hãy đọc tệp tin "MyFile.txt" ra mảng hai chiều.
Gợi ýDùng con trỏ trỏ tới mảng a[][], int *pa = new int[n*m];

Mã chương trình:
//Đọc tệp tin có định dạng cho trước và lưu vào mảng
#include <iostream>

void main()
{
     int n = 0, m = 0, *pArr = NULL;
     FILE *pFile;

     pFile = fopen("MyFile.txt", "r+");

     if(pFile != NULL)
     {
          fscanf(pFile, "%d %d\n", &n, &m);

          pArr = new int[n * m];
          //int x;
          for(int i = 0; i < n; i++)
          {
              for(int j = 0; j < m; j++)
              {
                   fscanf(pFile, "%d ", &pArr[i*m + j]);
                   //fscanf(pFile, "%d ", &x]);
                   //pArr[i*m + j] = x;
              }
              fscanf(pFile, "\n");
          }
          fclose(pFile);
     }

     //print to screen
     printf("%d %d\n", n, m);
     for(int i = 0; i < n; i++)
     {
          for(int j = 0; j < m; j++)
          {
              printf("%3d", pArr[i*m + j]);
          }
          printf("\n");
     }
     delete[] pArr;
     pArr = NULL;
     system("pause");
}

Kết quả:






1/ Hướng dẫn tạo USB Boot có sẵn Hiren't BootCD: download full phần mềm và hướng dẫn link:
https://drive.google.com/file/d/0B8tAQ0_sJKCSS0h5MzdPbE9icUU/view?usp=sharing
    Cần phần mềm:
       (1) usb_format.exe: để format usb
       (2) grub4dos.zip : 
       (3) HBCD 

    Các bước thực hiện: xem hướng dẫn ở tệp tin bootcd-on-usb-disk_huongdanTaoUSB_Boot.html trong thư mục .zip
   

2/ Hướng dẫn tạo menu boot cho nhiều hệ điều hành:
Dùng phần mềm EasyBCD 2.2 download https://drive.google.com/file/d/0B8tAQ0_sJKCSN0JDWWZ4eHBOa0k/view?usp=sharing

Bài 2: Mini Boot USB - Công cụng cứu hộ nhỏ gọn, đa năng
 http://hoangkhienblog.blogspot.com/2013/04/mini-boot-usb-cong-cung-cuu-ho-nang.html#.VEB-M8KSyE5

3/ Hướng dẫn phân chia ổ cứng bằng phần mềm Acronic Disk Director:
    - Download phần mềm ở đây link: https://drive.google.com/file/d/0B8tAQ0_sJKCSeVJYQlFaamdtR0E/view?usp=sharing
Xem hướng dẫn sử dụng Acronic Disk Director ở đây link: http://www.vn-zoom.com/f94/chia-o-dia-bang-acronis-disk-director-suite-231089.html
1. So sánh hệ thống Big Endian và Litle Edian 
    - Big Endian: Byte cao nhất sẽ được sắp đầu tiên tức (nếu hàng ngang thì) xếp phía bên trái ngoài cùng. Liên hệ slide 45
    - Litle Edian: Byte thấp nhất sẽ đc sắp đầu tiên tức (nếu hàng ngang thì) xếp phía bên trái ngoài cùng.

   - Các hệ thống dùng vi xử của intel thì dùng nền tảng little endian,và đa số đều vậy
   -
Các hệ thống dùng chip của solaris, motorola thì dùng big endian
  Ví dụ:
                                    --Byte cao nhất--  ------------   ------------   --byte thấp nhất--
                       số 123456  =   00000000 00000001 11100010 01000000
Số 123456 lần lượt được lưu trong hệ thống Big Endian và Little Endian dưới đây:
             ______________________________________________________
             Trong Big Endian : 00000000 00000001 11100010 01000000
              Little Endian :       01000000 11100010 00000001 00000000

2. Để xác định hệ thống dùng cách lưu gì ta dùng đoạn mã sau để xác định:
#include <iostream>

using namespace std;

void main()
{
      int i = 0x12345678;
      char *p;
      p = (char*) &i;

      if (*p == 0x78){
            printf("Little endian\n");
      } else {
            printf("Big endian\n");
      }
      system("pause");
}

3. Ví dụ:

4. Một số câu hỏi: 
    Viết hàm Swap Endian của số int x đưa vào. Ví dụ: int x = 0xA0B0C0D0 
       --> Kết quả:  Endian_Swap(int x) = 0xD0C0B0A0


#include <iostream>
using namespace std;

int Endian_Swap(int x);//4byte

void main()
{
      int x = 0xA0B0C0D0;
      printf("Endian_Swap 0x%X\n", Endian_Swap(x));
      //output: 0xDOC0B0A0
      system("pause");
}

int Endian_Swap(int x)
{
     return (
              ((x >> 24) & 0x000000FF) |
              ((x >> 8)  & 0x0000FF00) |
              ((x << 8)  & 0x00FF0000) |
              ((x << 24) & 0xFF000000)
              );
}