-          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)
              );
}


static_cast: chuyển kiểu dữ liệu bình thường như int -> char,...
dynamic_cast: chuyển đổi kiểu con trỏ (hoặc kiểu tham chiếu) giữa các lớp đa hình trong đa kế thừa.
reinterpret_cast: chuyển đổi giữa 2 kiểu dữ liệu ko có mối liên hệ, vd như là int -> pointer,...
const_cast: bỏ const ra khỏi dữ liệu được chuyển đổi.
1. Khái niệm:
    - Xét hàm Max(x, y) để tính max của 2 đối số x, y. Nếu không sử dụng khuôn hình hàm thì với mỗi kiểu dữ liệu của x, y (int, float, long, ...) thì ta phải xây dựng một hàm Max riêng.
   -  Dùng khuôn hình hàm, ta có thể định nghĩa một mẫu cho một họ các hàm tương ứng, bằng cách thay kểu dữ liệu như một tham số.

2. Ví dụ khuôn hình hàm:
    Tìm max của hai số:
#include <iostream>

using namespace std;
template <class T> T GetMax(T a, T b)
{
      return (a > b ? a : b);
}

void main()
{
      int n = 10, m = 20;
      cout << "Max = " << GetMax<int>(n, m) << endl;
      float x = 1.5f, y = 2.5f;
      cout << "Max = " << GetMax<float>(x, y) << endl;
      getchar();
}



#include <iostream>

using namespace std;

template <class U, class V> U GetMax(U a, V b)
{
      return (a > b ? a : b);
}

void main()
{
      float n = 10.5f; int m = 12;
      cout << "Max = " << GetMax<float, int>(n, m) << endl;
      cout << "Max = " << GetMax<float>(10.5, 12.5) << endl;
      getchar();
}

  Ví dụ hàm tính tổng hai số:
#include <iostream>

using namespace std;

template <class T> T Add(T a, T b)
{
      return a + b;
}

void main()
{
      int n = 10, m = 20;
      cout << "Add = " << Add<int>(n, m) << endl;
      getchar();
}

3. Ví dụ khuôn hình lớp:
#include <iostream>

using namespace std;

template <class T>
class MyPair
{
private:
      T a, b;//Tạo class MyPair có các biến thành phần kiểu T
public:
      MyPair(T first, T second)
      {
            a = first;
            b = second;
      }
      //Hàm Print() in giá trị của các biến a và b
      void Print()
      {
            cout << "First = " << a << ", Second = "<< b << endl;
      }
      T GetMax();
};

template <class T> T MyPair<T>::GetMax()//Cài đặt hàm GetMax
{
      return a > b ? a : b;
}
void main()
{
      MyPair<int> pair1(100, 200);
      pair1.Print();
      cout << "Max: " << pair1.GetMax() << endl;
     
      MyPair<char> pair2('A', 'B');
      pair2.Print();
      cout << "Max: " << pair2.GetMax() << endl;

      getchar();
}


 Ví dụ khuôn hình lớp:


. Vdfafsfsa
Ví dụ 1: Đối với các phép toán phân số: cộng, trừ, nhân, chia hai phân số
               PS pstong = Cong(p, q);//Dùng hàm làm tính toán không được tự nhiên và dài dòng
               --> Ở ví dụ 2 dùng chồng toán tử nên cách viết đơn giản hơn:
       PS pstong = p + q;//Cách ghi đơn giản hoa



#include <iostream>
using namespace std;

struct PS
{
      int a, b;
};

void NhapPhanSo(PS *p);
void InPhanSo(PS p);
int USCLN(int x, int y);
PS RutGon(PS p);
PS Cong(PS p1, PS p2);
PS Nhan(PS p1, PS p2);
PS Chia(PS p1, PS p2);

void NhapPhanSo(PS *p)
{
      int t, m;
      printf("\nTu va mau:");
      scanf_s("%d%d", &t, &m);
      p->a = t;
      p->b = m;
}

void InPhanSo(PS p)
{
      printf("\n%d/%d",p.a, p.b);
}
int USCLN(int x, int y){
      x = abs(x);
      y = abs(y);
      //if( x * y == 0) return 1;
      while( x != y)
      {
            if( x > y) {
                  x -= y;
            }
            else {
                  y -= x;
            }
      }
      return x;
}

PS RutGon(PS p)
{
      PS q;
      int x = USCLN(p.a, p.b);
      q.a = p.a/x;
      q.b = p.b/x;
      return q;
}
PS Cong(PS p1, PS p2)
{
      PS q;
      q.a = p1.a * p2.b + p1.b * p2.a;
      q.b = p1.b * p2.b;
      return RutGon(q);
}
PS Nhan(PS p1, PS p2)
{
      PS q;
      q.a = p1.a * p2.a;
      q.b = p1.b * p2.b;
      return RutGon(q);
}
PS Chia(PS p1, PS p2)
{
      PS q;
      q.a = p1.a * p2.b;
      q.b = p1.b * p2.a;
      return RutGon(q);
}

void main()
{
      PS p, q, pstong;
      printf("\nNhap phan so p:");
      NhapPhanSo(&p);
      printf("\nNhap phan so q:");
      NhapPhanSo(&q);
      pstong = Cong(p, q);// Dùng hàm làm tính toán không được tự nhiên và dài dòng
                          // Ta sẽ dùng Operator để cài đặt lại các phép toán
      InPhanSo(pstong);
      getchar();
      getchar();
}



Ví dụ 2: Sử dụng chồng toán tử đối với các phép toán trên phân số:
#include <iostream>
using namespace std;

struct PS
{
      int a, b;
};

void NhapPhanSo(PS *p);
void InPhanSo(PS p);
int USCLN(int x, int y);
PS RutGon(PS p);
PS operator+(PS p1, PS p2);//p1 + p2
PS operator-(PS p1, PS p2);//p1 - p2
PS operator*(PS p1, PS p2);//p1 * p2
PS operator/(PS p1, PS p2);//p1 / p2

void NhapPhanSo(PS *p)
{
      int t, m;
      printf("\nTu va mau:");
      scanf_s("%d%d", &t, &m);
      p->a = t;
      p->b = m;
}

void InPhanSo(PS p)
{
      printf("\n%d/%d",p.a, p.b);
}
int USCLN(int x, int y){
      x = abs(x);
      y = abs(y);
      //if( x * y == 0) return 1;
      while( x != y)
      {
            if( x > y) {
                  x -= y;
            }
            else {
                  y -= x;
            }
      }
      return x;
}

PS RutGon(PS p)
{
      PS q;
      int x = USCLN(p.a, p.b);
      q.a = p.a/x;
      q.b = p.b/x;
      return q;
}
PS operator+(PS p1, PS p2)//p1 + p2
{
      PS q;
      q.a = p1.a * p2.b + p1.b * p2.a;
      q.b = p1.b * p2.b;
      return RutGon(q);
}
PS operator-(PS p1, PS p2)//p1 - p2
{
      PS q;
      q.a = p1.a * p2.b - p1.b * p2.a;
      q.b = p1.b * p2.b;
      return RutGon(q);
}
PS operator*(PS p1, PS p2)//p1 * p2
{
      PS q;
      q.a = p1.a * p2.a;
      q.b = p1.b * p2.b;
      return RutGon(q);
}
PS operator/(PS p1, PS p2)//p1 / p2
{
      PS q;
      q.a = p1.a * p2.b;
      q.b = p1.b * p2.a;
      return RutGon(q);
}

void main()
{
      PS p, q, psTong, psTich;
      printf("\nNhap phan so p:");
      NhapPhanSo(&p);
      printf("\nNhap phan so q:");
      NhapPhanSo(&q);
      psTong = p + q;//Dùng Operator để cài đặt lại các phép toán
      InPhanSo(psTong);
      psTich = p * q;
      InPhanSo(psTich);
      getchar();
      getchar();
}

Xem them vi du o day: http://www.cplusplus.com/doc/tutorial/templates/
Ví dụ 3: nhân hai ma trận
Két luận: