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

0.Hướng dẫn cơ bản lập trình 3 lớp, sử dụng cấu trúc class, bài toán quản lý hóa đơn bản sách



Hướng dẫn cơ bản lập trình 3 lớp, sử dụng cấu trúc class

(Phần Coding đã cung cấp trong tài nguyên học tập)
Đặt bài toán:
Xây dựng một ứng dụng đơn giản cho một cửa hàng bán sách. Bao gồm 2 chức năng cơ bản: thông tin sách và hóa đơn bán hàng.
- Nhập thông tin về sách: mã sách, tên sách, tác giả, số lượng nhập (số lượng có trong cửa hàng), giá sách.
+ Hiện thông tin về sách đã có trong cửa hàng theo thứ tự mã số trong bảng
+ Cho phép người dùng gõ mã sách, hoặc tên sách để hiển thị sách trong bảng theo giá trị xấp xỉ.
+ Cho phép mở form nhập sách mới.
+ Cho phép sửa thông tin về sách
+ Cho phép xóa sách
- Bán sách: chọn sách, điền số lượng bán, điền thông tin khách hàng, ngày hóa đơn, tính giá trị thành tiền cho hóa đơn.
+ Chọn sách: cho phép chọn bằng mã số sách, chọn tên gần đúng của sách.
+ Điền số lượng bán: Điền trực tiếp
+ Điền thông tin khách hàng: Điền trực tiếp
+ Ngày hóa đơn: Lấy tự động từ hệ thống.
+ Thành tiền = soluong[i]* Dongia[i]   (với i=1,n số danh mục trong một hóa đơn).

+ Trên giao diện hiện tất cả các thông tin: thông tin sách, thông tin từng dòng hóa đơn, thông tin các hóa đơn theo ngày.

Yêu cầu: Xây dựng CSDL trên SQL SERVER
Phần mềm ứng dụng thiết kế theo 3 lớp: Lớp kết nối dữ liệu và SQL cơ bản. Lớp truy cập dữ liệu, lớp thao tác dữ liệu. 

Contents


Thứ Ba, 18 tháng 2, 2014

Coding trong form frmStudent đã có comment hướng dẫn hiểu chi tiết

Thiết kế form có hình dạng. Chú ý từ các đoạn code dưới, suy ra cách đặt tên:

Nội dung thiết kế bảng

Nội dung coding

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BusinessLogic; //Sử dụng các giá trị thiết lập ở lớp 2 đã tạo

namespace _3Layer
{
    public partial class frmStudent : Form
    {
        public frmStudent()
        {
            InitializeComponent();
        }

        Student StudentItem = new Student(); //biến toàn cụ StudentItem được khởi tạo
        string id1;        //biến toàn cục id1 được tạo để thực hiện truy vấn cập nhật và xóa
        Lop loph = new Lop(); //Định nghĩa một loph để thao tác trực tiếp trên Layer3
        int soluong;//Biến chứa giá trị số dòng dữ liệu có trong datagridview
        int dong; //Biến chứa giá trị index trong datagridview
       
        //Thực hiện các công việc khi form được mở ra
        private void frmStudent_Load(object sender, EventArgs e)
        {
            //Ô chứa dữ liệu tìm kiếm nếu có chứa chữ All thì hiện tất cả các thông tin có trong bảng
            //dữ liệu ra lưới. Nếu không thì hiện dữ liệu tìm kiếm có tên lớp chứa trong ô tìm kiếm
            DataTable dt = new DataTable();
            if (this.txtTK.Text == "All")
                dt = StudentItem.ShowStudent();
            else
                dt = StudentItem.lookStudent1(this.txtTK.Text);

            dt = StudentItem.ShowStudent(); //gọi hàm hiển thị sinh viên vào lưới đã viết trong lớp 2
            dtgStudent.DataSource = dt; //nguồn của lưới là bảng dữ liệu đã lấy ở trên
            this.label3.Text = "Có tổng số " + dtgStudent.RowCount + " Sinh viên";

            //Lấy dữ liệu cho điều khiển combobox
            //Biến bảng dữ liệu dt1 chứa dữ liệu mã lớp lấy trong bảng dữ liệu tblClass
            //dữ liệu dt1 sau đó được gán nguồn cho nút combo
            //Trên form có điều khiển lấy ngày tháng, cần định dạng lại ngày tháng cho phù hợp với
            //thói quen dùng ngày tháng của Việt nam
            DataTable dt1 = new DataTable();
            dt1 = loph.GetClassID();
            cbofldClassID.DataSource = dt1;
            cbofldClassID.DisplayMember = "fldID";
            txtfldCreateDate.Format = DateTimePickerFormat.Custom;
            txtfldCreateDate.CustomFormat = "dd/MM/yyyy";
        }

        //Hàm làm số thứ tự cho gridview
        //Trong lưới tạo thêm ô đầu tiên là ô chứa stt bản ghi.
        //Dùng vòng for để khởi tạo giá trị cho các ô này
        private void dtgStudent_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
        {
            for (int i = 0; i < dtgStudent.RowCount; i++)
                dtgStudent.Rows[i].Cells[0].Value = i + 1;
        }

        //Hàm cho nút reset, nút này xóa tất cả các ô textbox và thiết lập các giá trị mặc định
        //cho các textbox này để nhập dữ liệu được nhanh chóng.
        //Chú ý mã sinh viên được khởi tạo tự động bằng cách
        //ghép mã lớp chứa trong ô tìm kiếm và số thứ tự bản ghi trong lưới +1
        //vì muốn thể hiện số thứ tự theo dạng xxx nên nếu stt có 2 chữ số thì sẽ tự động thêm
        //số 0 vào trước số thứ tự
        private void btnReset_Click(object sender, EventArgs e)
        {
            DateTime tg = new DateTime();//Định nghĩa đối tượng tg để lấy giá trị ngày tháng
                                          //tháng mặc định của hệ thống
            soluong++;
            if (soluong.ToString().Length<3 p="">                this.txtfldID.Text = this.txtTK.Text + "0" + soluong.ToString();
            else
                this.txtfldID.Text = this.txtTK.Text + soluong.ToString();
            this.txtfldFirstName.Clear();
            this.txtfldLastName.Clear();
            this.txtfldAge.Clear();
            this.txtfldSex.Value = 0;
            this.txtfldCreateDate.Text = tg.Date.Day.ToString() + "/" + tg.Date.Month.ToString() + "/" + tg.Date.Year.ToString();
            this.txtfldID.Focus();
        }
           
        private void btnThoat_Click(object sender, EventArgs e)
        {
            Close();
        }

        //Buộc dữ liệu từ DataGridView ra ô textBox
        private void dtgStudent_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            dong = e.RowIndex;//Lấy chỉ số dòng của DataGridView
            //Các Cell của dòng đánh số từ 0 đến hết. Chú ý khi thiết kế DGV số cột
            id1 = dtgStudent.Rows[dong].Cells[0].Value.ToString();
            this.txtfldID.Text = dtgStudent.Rows[dong].Cells[0].Value.ToString().Trim(); ;
            this.txtfldFirstName.Text = dtgStudent.Rows[dong].Cells[1].Value.ToString().Trim();
            this.txtfldLastName.Text = dtgStudent.Rows[dong].Cells[2].Value.ToString().Trim();
            this.txtfldAge.Text = dtgStudent.Rows[dong].Cells[3].Value.ToString();
            this.txtfldSex.Text = dtgStudent.Rows[dong].Cells[4].Value.ToString().Trim();
            this.txtfldCreateDate.Text = dtgStudent.Rows[dong].Cells[5].Value.ToString().Trim();
            this.cbofldClassID.Text = dtgStudent.Rows[dong].Cells[6].Value.ToString().Trim();
        }

        //Nút thêm dữ liệu sinh viên, ghi vào CSDL
        private void btnThem_Click(object sender, EventArgs e)
        {
            this.txtfldID.Text = this.txtfldID.Text.Trim();
            if (this.txtfldID.TextLength == 0)
                MessageBox.Show("Mã SV không được để trống");
            else
                if (this.txtfldID.TextLength > 10)
                    MessageBox.Show("Mã SV không được vượt quá 10 ký tự");
                else
                    if (this.txtfldFirstName.TextLength == 0)
                        MessageBox.Show("Tên SV không được để trống");
                    else
                    {  //Hàm try để thực hiện một công việc
                        try
                        {
                            StudentItem.InsertStudent(this.txtfldID.Text, this.txtfldFirstName.Text, this.txtfldLastName.Text, this.txtfldAge.Text, this.txtfldSex.Text, this.txtfldCreateDate.Text, this.cbofldClassID.Text);
                            DataTable dt = new DataTable();
                            dt = StudentItem.lookStudent1(this.txtTK.Text);
                            dtgStudent.DataSource = dt;
                            soluong = dtgStudent.RowCount;
                            this.label3.Text = "Có tổng số " + soluong.ToString() + " sinh viên";
                        }
                        catch //Hàm catch để hiển thị khi thực hiện công việc gây lỗi
                        {
                            MessageBox.Show("Mã SV " + this.txtfldID.Text + " đã tồn tại");
                        }
                    }
        }

        //Nút sửa dữ liệu, sửa xong ghi vào CSDL
        private void btnSua_Click(object sender, EventArgs e)
        {
            this.txtfldID.Text = this.txtfldID.Text.Trim();
            if (this.txtfldID.TextLength == 0)
                MessageBox.Show("Bạn cần phải chọn Mã để sửa");
            else
                if (this.txtfldID.TextLength > 10)
                    MessageBox.Show("Mã không được vượt quá 10 ký tự");
                else
                    if (this.txtfldFirstName.TextLength == 0)
                        MessageBox.Show("Tên không được để trống");
                    else
                    {
                        StudentItem.UpdateStudent(id1, this.txtfldID.Text, this.txtfldFirstName.Text, this.txtfldLastName.Text, this.txtfldAge.Text, this.txtfldSex.Text, this.txtfldCreateDate.Text, this.cbofldClassID.Text);
                        DataTable dt = new DataTable();
                        dt = StudentItem.lookStudent1(this.txtTK.Text);
                        dtgStudent.DataSource = dt;
                        soluong = dtgStudent.RowCount;
                        this.label3.Text = "Có tổng số " + soluong.ToString() + " sinh viên";

                    }
        }

        //Nút xóa dữ liệu sinh viên
        private void btnXoa_Click(object sender, EventArgs e)
        {
            if (this.txtfldID.TextLength == 0)
                MessageBox.Show("Bạn cần chọn lớp để xóa");
            else
            {
                if (DialogResult.Yes == MessageBox.Show("Bạn có chắc chắn xóa không", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                {
                    StudentItem.DeleteStudent(id1);
                    MessageBox.Show("Đã xóa thành công");
                    DataTable dt = new DataTable();
                    dt = StudentItem.lookStudent1(this.txtTK.Text);
                    dtgStudent.DataSource = dt;
                    soluong = dtgStudent.RowCount;
                    this.label3.Text = "Có tổng số " + soluong + " sinh viên";
                }
            }
        }

        //Nút tìm kiếm theo tên, họ đệm của sinh viên
        private void btnTK_Click(object sender, EventArgs e)
        {
            if (this.txtTK.MaxLength == 0)
                MessageBox.Show("Bạn chưa nhập từ khóa tìm kiếm");
            else
            {
                DataTable dt = new DataTable();
                dt = StudentItem.lookStudent(this.txtTK.Text);
                dtgStudent.DataSource = dt;
                soluong = dtgStudent.RowCount;
                this.label3.Text = "Có tổng số " + soluong.ToString() + " sinh viên";
                if (dt.Rows.Count == 0)
                {
                    this.lblStatus.ForeColor = Color.Red;
                    this.lblStatus.Text = "Không tìm thấy dữ liệu";
                }
                else
                    this.lblStatus.ResetText();
            }
        }

        //Nút hủy kết quả tìm kiếm
        private void btnTroVe_Click(object sender, EventArgs e)
        {
            frmStudent_Load(sender, e);
            this.lblStatus.ResetText();
        }

        //Nút tìm kiếm theo lớp
        private void btnTimLop_Click(object sender, EventArgs e)
        {

            if (this.txtTK.MaxLength == 0)
                MessageBox.Show("Bạn chưa nhập từ khóa tìm kiếm");
            else
            {
                DataTable dt = new DataTable();
                if (this.txtTK.Text=="All")
                    dt = StudentItem.ShowStudent();
                else
                    dt = StudentItem.lookStudent1(this.txtTK.Text);
                dtgStudent.DataSource = dt;
                soluong = dtgStudent.RowCount;
                this.label3.Text = "Có tổng số " + soluong.ToString() + " sinh viên";
                if (dt.Rows.Count == 0)
                {
                    this.lblStatus.ForeColor = Color.Red;
                    this.lblStatus.Text = "Không tìm thấy dữ liệu";
                }
                else
                    this.lblStatus.ResetText();
            }

        }

        //Nút dịch chuyển sang phải
        private void button3_Click(object sender, EventArgs e)
        {
            dong++;
            soluong = dtgStudent.RowCount;
            if (dong>=soluong)
            {
                dong = 0;
            }
            hiendulieu();
        }

        public void hiendulieu()
        {
            this.txtfldID.Text = dtgStudent.Rows[dong].Cells[0].Value.ToString().Trim(); ;
            this.txtfldFirstName.Text = dtgStudent.Rows[dong].Cells[1].Value.ToString().Trim();
            this.txtfldLastName.Text = dtgStudent.Rows[dong].Cells[2].Value.ToString().Trim();
            this.txtfldAge.Text = dtgStudent.Rows[dong].Cells[3].Value.ToString();
            this.txtfldSex.Text = dtgStudent.Rows[dong].Cells[4].Value.ToString().Trim();
            this.txtfldCreateDate.Text = dtgStudent.Rows[dong].Cells[5].Value.ToString().Trim();
            this.cbofldClassID.Text = dtgStudent.Rows[dong].Cells[6].Value.ToString().Trim();
        }

        //Nút dịch chuyển sang trái
        private void button2_Click(object sender, EventArgs e)
        {
            dong= dong-1;
            soluong = dtgStudent.RowCount;
            if (dong <= 0)
            {
                dong = soluong-1;
            }
            hiendulieu();
        }

        //Nút về đầu danh sách
        private void button1_Click(object sender, EventArgs e)
        {
            dong = 0;
            soluong = dtgStudent.RowCount;
            hiendulieu();
        }

        //Nút về cuối danh sách
        private void button4_Click(object sender, EventArgs e)
        {
            dong = soluong - 1;
            soluong = dtgStudent.RowCount;
            hiendulieu();
        }
    }
}


Xây dựng ứng dụng quản lý Sinh viên && đề tài bằng C# vs SQL Server theo mô hình 3 lớp.(2)

Tóm tắt lý thuyết

          Khi mới tiếp xúc với Windows Form và ADO.NET, việc lập trình bắt đầu trở lên phức tạp khi dự án lớn dần. Bởi vậy để dễ quản lý các thành phần của hệ thống, cũng như không bị ảnh hưởng bởi các thay đổi, người ta hay nhóm các thành phần có cùng chức năng lại với nhau và phân chia trách nhiệm cho từng nhóm để công việc không bị chồng chéo và ảnh hưởng lẫn nhau. Một trong những mô hình lập trình như vậy đó là Mô hình 3 lớp (Three Layers).
          Mô hình 3 lớp được cấu thành từ: Presentation Layers (hay GUI User) , Business Layers, và Data Layers. Các lớp này sẽ giao tiếp với nhau thông qua các dịch vụ (services) mà mỗi lớp cung cấp để tạo nên ứng dụng, lớp này cũng không cần biết bên trong lớp kia làm gì mà chỉ cần biết lớp kia cung cấp dịch vụ gì cho mình và sử dụng nó mà thôi.

Kiến trúc mô hình 3 lớp

1.    Presentation Layers
          Lớp này làm nhiệm vụ giao tiếp với người dùng cuối để thu thập dữ liệu và hiển thị kết quả/dữ liệu thông qua các thành phần trong giao diện người sử dụng. Lớp này sẽ sử dụng các dịch vụ do lớp Business Logic cung cấp. Trong .NET thì bạn có thể dùng Windows Forms, ASP.NET hay Mobile Forms để hiện thực lớp này.
          Trong lớp này có 2 thành phần chính là User Interface Components và User Interface Process Components. (mục khoanh tròn 1 và 2).
            UI Components: là những phần tử chịu trách nhiệm thu thập và hiển thị thông tin cho người dùng cuối. Trong Microsoft.NET thì những thành phần này có thể là các TextBox, các Button, DataGrid…
            UI Process Components: là thành phần chịu trách nhiệm quản lý các qui trình chuyển đổi giữa các UI Components. Ví dụ chịu trách nhiệm quản lý các màn hình nhập dữ liệu trong một loạt các thao tác định trước như các bước trong một Wizard…
Lưu ý : Lớp này không nên sử dụng trực tiếp các dịch vụ của lớp Data Access mà nên sử dụng thông qua các dịch vụ của lớp Business Logic vì khi bạn sử dụng trực tiếp như vậy, bạn có thể bỏ qua các ràng buộc, các logic nghiệp vụ mà ứng dụng cần phải có. Và hơn nữa nếu sử dụng như vậy thì đâu cần đến 3 lớp phải không bạn?
2.    Business Logic Layer
          Lớp này thực hiện các nghiệp vụ chính của hệ thống, sử dụng các dịch vụ do lớp Data Access cung cấp, và cung cấp các dịch vụ cho lớp Presentation. Lớp này cũng có thể sử dụng các dịch vụ của các nhà cung cấp thứ 3 để thực hiện công việc của mình.
          Trong lớp này có các thành phần chính là Business Components, Business Entities và Service Interface. (3,4,8,6)
            Service Interface: là giao diện lập trình mà lớp này cung cấp cho lớpPresentation sử dụng. Lớp Presentation chỉ cần biết các dịch vụ thông qua giao diện này mà không cần phải quan tâm đến bên trong lớp này được hiện thực như thế nào.
            Business Entities: là những thực thể mô tả những đối tượng thông tin mà hệ thống xử lý. Các Business Entities này cũng được dùng để trao đổi thông tin giữa lớp Presentation và lớp Data Layers.
            Business Components: là những thành phần chính thực hiện các dịch vụ mà Service Interface cung cấp, chịu trách nhiệm kiểm tra các ràng buộc logic (constraints), các qui tắc nghiệp vụ (Business Rules), sử dụng các dịch vụ bên ngoài khác để thực hiện các yêu cầu của ứng dụng.
3.    Data Layers
          Lớp này thực hiện các nghiệp vụ liên quan đến lưu trữ và truy xuất dữ liệu của ứng dụng. Thường lớp này sẽ sử dụng các dịch vụ của các hệ quản trị cơ sở dữ liệu như SQL Server, Oracle,… để thực hiện nhiệm vụ của mình. Trong lớp này có các thành phần chính là Data Access Logic, Data Sources, Servive Agents).
            Data Access Logic Components (DAL) là thành phần chính chịu trách nhiệm lưu trữ vào và truy xuất dữ liệu từ các nguồn dữ liệu – Data Sources như RDMBS, XML, File systems…. Trong .NET Các DAL này thường được hiện thực bằng cách sử dụng thư viện ADO.NET để giao tiếp với các hệ cơ sở dữ liệu hoặc sử dụng các O/R Mapping Frameworks để thực hiện việc ánh xạ các đối tượng trong bộ nhớ thành dữ liệu lưu trữ trong CSDL. Chúng ta sẽ tìm hiểu các thư viện O/R Mapping này trong một bài viết khác.
            Service Agents: là những thành phần trợ giúp việc truy xuất các dịch vụ bên ngoài một cách dễ dàng và đơn giản như truy xuất các dịch vụ nội tại.

Các bạn đã tìm hiểu qua các đặc điểm của từng lớp trong mô hình 3 lớp.  
Các bước tiếp theo sẽ hướng dẫn từ thiết lập CSDL cho đến coding.
Nhưng trước tiên đọc các đoạn code ở bài tiếp theo để hiểu lệnh (chưa làm được vì sẽ phải hướng dẫn từ từ).

Xây dựng ứng dụng quản lý Sinh viên && đề tài bằng C# vs SQL Server theo mô hình 3 lớp.

Hướng dẫn tạo form thêm/sửa/xóa/tìm kiếm theo mô hình 3 lớp (3 layer)
Microsoft Visual Studio C# 2010 & SQL Server 2008
-------------------------------------

Các nội dung sẽ lần lượt trình bày:


Mục tiêu:

Xây dựng một ứng dụng đơn giản để quản lý danh sách lớp học. Bao gồm các thao tác xem, thêm, sửa, xóa, tìm kiếm.

Yêu cầu:

- Thao tác tạo CSDL trên môi trường SQL Server 2008, nhập dữ liệu mẫu.
- Kết nối CSDL SQL đã thiết kế vào dự án phần mềm làm việc trên môi trường C#
- Thiết kế 3 lớp. Bao gồm:
+ Lớp 1: DataAccess Layer: Kết nối với CSDL và thực thi lệnh SQL.
+ Lớp 2: BusinessLogic Layer: Xử lý lệnh sql và gọi lớp 1 thực thi
+ Lớp 3: GUI: Giao diện người dùng thao tác gọi hàm lớp 2 xử lý

Tạo các giao diện:

Giao diện chương trình chính:

Giao diện form nhập /sửa /xóa/tìm kiếm thông tin sinh viên



Thứ Bảy, 7 tháng 9, 2013

19 điều chú ý khi viết essay

1. Không sử dụng tiếng lóng hay các từ ngữ thông tục (không trang trọng) vì sẽ gây cho người đọc ấn tượng xấu
One social problem of towns in the sticks is guys burning up and down the main drag on Saturday nights.
==> One social problem in country towns is young people drive too fast on main street on Saturday nights.

2. Không nên viết tắt, đặc biệt là những từ mang nghĩa phủ định, như "don't", "haven't" và "Can't" mà phải thay bằng "do not" , "have not" và "cannot".

3. Không nên sử dụng "e.g" và "etc" khi đưa ví dụ.

4. Không nên sử dụng những từ ngữ mang tính phân biệt, kỳ thị đối với giới tính, chủng tộc, văn hóa, tuổi, khuyết tật hoặc quốc gia
When a manager arrives home he is usually too tired to help his wife do any housework.
==> Managers arrive home, they are usually too tired to help their partners do any housework.

5. Nên sử dụng cách hành văn sự thật (thực tế), biểu cảm không quan trọng
Global warming is the most serious problem the world  has ever faced and it will cause billions of unfortunate people horrible deaths in the next 30 years.
==> Global warming is a very serious problem and it might cause a large number of deaths over the next 30 years.

6. Nên dùng những câu nhận định, không nên sử dụng câu hỏi
What can be done about traffic fatalities? How can this slaughter on the road be stopped?
==> Traffic fatalities have become a very serious problem and new laws must be implemented to prevent them.

7. Academic writing quan tâm tới những gì đang xảy ra với toàn xã hội hơn là cá nhân. Vì vậy cần tránh sử dụng "I", "me", "my", "we", "you" hay"our".

8. Bạn phải chắc chắn những điều bạn viết ra là chính xác. Bài viết sẽ không đáng tín cậy nếu những câu nhận định của bạn đưa thông tin sai lệch
In this essay I will write about the best way for my country to spend its tax money.
==> This essay will outline the most advantageous method for Australia to make use of its tax revenue.

9. Các bài luận phải được trình bày ở font chữ 12, không sử dụng in hoa, in đâm, in nghiêng, gạch dưới, dấu chấm hoặc số

10. Tránh lặp lại từ hoặc cấu trúc khiến người đọc thấy nhàm chán, bạn nên cố gắng sử dụng nhiều cách diễn đạt khác nhau. 
People in developing countries should be assited because people in developing countries need help. Therefore the Australia government should increase aid to people in developing countries.
==> As developing countries require assistance, the Australian government should supply them with increased aid.

11. Academic writing rất rõ ràng, cụ thể. Những nhận định chung chung, mập mờ không nên sử dụng (vd: một số trường học, một việc gì đó…)
There are many problems in some schools so the government should do something to help them.
==> There are problems such as drugs and violence in public high schools so the government should supply more training for teachers.

12. Academic writing quan tâm tới xu hướng xã hội hơn là của cá nhân. Nên sử dụng những xu hướng và thống kê để hỗ trợ cho bài viết của bạn
People on low incomes are having a great difficult time. My grandmother is on a pension but she doesn't get enough money to buy an air conditioner. She is really cold in winter and hot in summer.
==> Low income earners such as old-age pensioners are experiencing financial difficulties and cannot purchase air conditioners and other neccessary consumer durables. This results in physical discomfort in the summer and winter.

13. Bạn nên quan tâm tới việc miêu tả quá trình diễn ra hơn là người làm hành động đó. Cần tránh những chủ từ như "Some people" và "Humans". Nên sử dụng PASSIVE VOICE thay thế
Due to falling prices people are buying more electrical goods like flat screen TVs etc. So, more humans are becoming addicted to technology.
==> Due to falling prices, purchases of flat screen TV and other electrical goods are increasing. This has, however resulted in increases addiction to technology.
14. Câu càng dài thì lại càng dễ mắc lỗi. Tốt nhất là bạn nên viết câu không quá 3 dòng
The recent problems in Japan such as the Fukushima nuclear power disaster have shown that nuclear power is dangerous and should no longer be used to generate electricity and that other sources of power such as wind or solar power should be used because they are not only safer but much more enviromentally friendly as well as can therefore help to reduce global warming as well which is a big advantage.
==> The recent problems in Japan such as the Fukushima nuclear power disaster has shown that nuclear power is dangerous and should no longer be used to generate electricity. As a result, other sources of power such as wind or solar power should be used because they are not only safer but much more enviromentally friendly. Therefore, they can help to reduce global warming which is also a big advantage.

15. Bạn nên sử dụng những từ dài mang nhiều nghĩa bởi nó có tính học thuật hơn 
When people go to other places they buy a lot of stuff for their kids and things for their mates.
==> When tourists travel abroad, they tend to purchase a large number of souvernirs for their family and friends.

16. Những gì bạn nghĩ là kiến thức thông thường có thể là điều mới với nhiều người khác 
As everyone knows, diets are a waster of time. It is evident that exercise is the best cure for obesity
==> Diets are often ineffective and in many cases exercise is a much better treatment for obesity.

17. Không nên sử dụng "too" ở cuối câu mà hãy thay bằng một phương pháp khác (ví dụ "also" chẳng hạn)
18. Nên sử dụng danh từ số nhiều - tránh dùng "he/she" Ví dụ:
A scientist has a very important job. He/she can make discoveries that can change the history of our planet.
==> The work that scientists do is extremly important. It can result in discoveries that may change the history of the planet.

19. Những từ "so", "and", "but" và "because" dùng để nối câu chứ không phải để bắt đầu câu mới. Thay vào đóm bạn có thể sử dụng những từ như "In additon", "therefore", "however" và "as a result" để bắt đầu câu.
There is a long waiting list for medical treatment in Queensland. But the government is not taking any action to shorten it. So patients have to wait years for treatment. Because there are not enough doctors.

==> There is a long waiting list for medical treatment in Queensland. However, the government is not taking any action to shorten it. As a result, patients have to wait years for treatment because there are not enough doctors.

Cách viết ESSAY

I. Đoạn văn: 

1. Thesis statement: ( 1 câu) Câu luận đề - tạm hiểu là mở đoạn tóm tắt ý chính của toàn đoạn--> Thường bắt đầu với những cụm từ sau:
- Firstly, Secondly, Finally...
- First, the reason when I said that is...
- Another reason is...
- In addition...

2. Support sentences: ( 2-3 câu là ổn)
Câu triển khai ý --> cái này thì vô biên lắm. Tùy thuộc vào ý chính của đoạn mà mọi người viết để giải thích thêm cho ý kiến mình đưa ra. ( Sẽ ví dụ rõ ở dưới phần essay)

3. Conclusion: (1 câu) Câu kết - Tóm lại ý mình vừa trình bày ~ thường là đưa ra khẳng định một lần nữa với lựa chọn hoặc ý kiến mình tán đồng! 
" With all these reasons, I always think that ....is the best choice for me/ I agree with...."

II. Essay

Sườn để viết essay hoàn toàn không mấy khác biệt với cách viết đoạn. Có 2 kiểu viết essay mà cô dạy là 3-7-7-3 và 3-5-5-5-3!
Tuy nhiên theo ý mình thì mọi người nên chọn kiểu 3-5-5-5-3 vì kiểu 3-7-7-3 khó để phát triển 1 ý ra tới 1 đoạn dài 7 câu được. Mình chọn những thứ đơn giản nhất để viết vào thôi!

Kiểu viết 3-5-5-5-3 là bài essay sẽ bao gồm có 5 đoạn văn nhỏ.
Trong đó:

1. Introduction paragraph ( 3 câu):

- Thesis statement: Câu luận đề ( 1 câu)
- Background information: Thông tin bổ sung ( khoảng 2 câu là okay)

+ Thực tế thì câu luận đề đòi hỏi là câu tóm gọn ý chính cả essay --> nghĩa là nhắc lại đề bài là cách dễ làm nhất ~ !!! Tuy nhiên sau khi nhắc lại đề theo kiểu dưới đây...
VD: When travelling medium distances, some people prefer to fly, others prefer to take express trains. Which do you prefer? Explain why?
--> When travelling medium distances, I prefer to take express trains. 
...thì mọi người bị bí và ko biết phải làm sao viết tiếp nữa. Vì sau đó background info đòi hỏi đưa ra thêm lý do, nhận xét --> ko biết làm sao để tóm gọn lại những lý do mình muốn trình bày!

+Vì thế mà tớ nghĩ mn có thể viết theo kiểu như sau ~ đưa ra 1 nhận xét tổng quát về vấn đề mình cần giải quyết! 
Sau đó mới viết ra lựa chọn ý mà mình đồng ý ( aka nhắc lại đề bài). 
Chốt lại bằng 1 câu theo kiểu: Tôi chọn như vậy/ Tôi nghĩ như vậy vì 3 lý do sau ( I said that bcuz of these 3 reasons )

VD: When travelling medium distances, some people prefer to fly, others prefer to take express trains. Which do you prefer? Explain why?
--> Travelling medium distances is one of my most favourite activities on holiday. In such ocassion like that, I would prefer to take express trains. I said that bcuz of these 3 reasons.

Với tất cả những bài essay khác mn cũng nên chọn kiểu viết introduction như vậy >"< ~! Ko biết thầy Thân khó tính ra sao nhưng cô Sương thì chấp nhận kiểu này! Tóm lại là cứ dẫn dắt từ xa đến gần!

2. Supporting Paragraphs ( gồm 3 đoạn, mỗi đoạn 5 câu --> làm theo kiểu viết đoạn đã nhắc ở trên)

Tớ đọc qua tất cả tài liệu về essay mà lớp mình photo. Về ngữ pháp và diễn đạt của họ thì rất xịn, nhiều từ mới nữa...nhưng đấy lại chính là vấn đề khiến cho nó khó học thuộc theo =)) !! 
Tốt nhất là mọi người nên tự viết lại bài essay theo ý của mình để có thể nhớ được và trình bày dưới những mẫu câu đơn giản nhất!

Với 3 đoạn thì nhớ những từ nối thường dùng như sau: ( tùy ý chọn để xài cho câu mở đầu đoạn)

VD:
+ Firstly, travelling by train show you how beautiful the scenery is! 
+ Secondly, I always feel comfortable on train 
+ Finally, with medium distances, buying a train ticket is cheaper than an air-ticket!

Sau khi viết ra dc 3 ý này ở nháp thì tiếp tục dựng ý cho mỗi đoạn. Cái này thì...tùy thuộc trí tưởng tượng của mọi người.
Nghĩ bằng tiếng Việt trước rồi dịch sang tiếng Anh cho nên hãy cố nghĩ ra câu gì thật đơn giản thôi. Ko quên so sánh với việc đi bằng máy bay để tăng tính thuyết phục ^^ ~

VD:
+ Firstly, travelling by train show you how beautiful the scenery is! When you're on plain, you just can see the sky. But looking over the train window, you can see the whole new world. It's really an amazing experience.

Kiểu như vậy >"< !!! Và làm tới vs 3 đoạn khác, vì mọi người đều có tài liệu rồi nên khi viết essay của mình có thể nhặt ý và biến đổi câu sao cho đơn giản dễ hiểu hơn! 
Và mn chỉ nên nhớ ý thôi, đừng cố học thuộc lòng làm gì...vì học thuộc lòng xong ngộ nhỡ đứt mạch 1 phát...thì mớ sau cũng quên tịt luôn!
Bh cũng nhớ 3 câu mở đầu trước vì nó qan trọng, ý phát triển thì gạch đầu dòng thôi!

3. Summary Paragraph ( 3 câu là okay)

Lý thuyết thì phải nhấn mạnh lại ý lớn nhất của cả essay, đưa ra ý kiến hoặc giải pháp gì đó. Nhưng mà lằng nhằng lắm =-=!
Cho nên cách tốt nhất là cứ viết 3 câu.

+ Conclusion - Tóm gọn lại ý của cả essay! ( gần như chép lại cái câu mở đầu ý)
Thường xài những từ như: Overall, all in all, In conclusion, to summarize...( và 1 cơ số nữa cô Sương cho chép nhưng t đánh mất rồi, ko nhớ hết dc ;___;)

+ Personal idea: Có thể đưa ra ý kiến trái ngược rồi sau đó khẳng định lại dù sao lựa chọn cũng ko thay đổi >"<

VD: Overall, travelling by train is really interesting and economical! However, I can deny that taking a fly is faster than going by train. But if I have to choose, I still think that travelling by train is my best choice.