15/12/15

Bài tập cơ bản về vòng lặp (Phần 1)

Với các bạn đang học Nhập môn lập trình thì bài tập vòng lặp ngoài giúp làm quen với cách dùng vòng lặp còn giúp phát triển tư duy lập trình, giải thuật. Mình sẽ giới thiệu một số dạng bài tập vòng lặp cơ bản, một số ví dụ cùng với hướng giải quyết. Tất cả code tham khảo đều được viết dưới dạng hàm trong ngôn ngữ C/C++.


Ở Phần 1 mình sẽ hướng dẫn cách làm dạng bài vẽ hình. Các dạng bài khác sẽ được trình bày ở các phần tiếp theo.

Dạng 1: Vẽ hình

Cách giải quyết chung nhất của dạng này là duyệt hình theo ma trận và xác định vị trí đang xét có thuộc hình hay không.
Bài 1: Vẽ hình chữ nhật đặc có chiều dài n và chiều rộng m. Ví dụ: m = 4, n = 5
* * * * *
* * * * *
* * * * *
* * * * *
Hướng làm: Cứ duyệt hết ma trận và in ra dấu * thôi.
void ChuNhatDac(int m, int n)
{
   for (int i = 1; i <= m; ++i)
   {
      for (int j = 1; j <= n; ++j)
         printf("* ");
      printf("\n");
   }
}

Bài 2: Vẽ hình chữ nhật rỗng chiều dài n và chiều rộng m. Ví dụ: m = 4, n = 5
* * * * *
*       *
*       *
* * * * *
Hướng làm: Ta phải xác định được vị trí nào in dấu * và vị trí in dấu cách. Gọi biến i là biến duyệt dòng, biến j là biết duyệt cột thì ta nhận thấy những dòng in dấu * là i = 1, i = m, j = 1, j = n.
void ChuNhatRong(int m, int n)
{
   for (int i = 1; i <= m; i++)
   {
      for (int j = 1; j <= n; j++)
         if (i == 1 || j == 1 || i == m || j == n)
            printf("* ");
         else
            printf("  ");
      printf("\n");
   }
}
Bài 3: Vẽ tam giác vuông cân đặc có chiều cao h. Ví dụ: h = 4
*
* *
* * *
* * * *
Hướng làm: Gọi i là biến duyệt dòng, j là biến duyệt cột thì ta thấy số dấu * mỗi dòng tăng đều theo i. Vậy sẽ in dấu * ở những vị trí j <= i.
void TamGiacVuongCanDac(int h)
{
   for (int i = 1; i <= h; i++)
   {
      for (int j = 1; j <= i; j++)
         printf("* ");
      printf("\n");
   }
}
Bài 4: Vẽ tam giác vuông cân rỗng có chiều cao h. Ví dụ: h = 5
*
* *
*   *
*     *
* * * * *
Hướng làm: Cách làm tương tự bài 3 nhưng ta phải xác định đoạn in dấu * và vị trí in dấu cách. Nhìn ví dụ ta nhận thấy các đoạn in dấu * là i = h, j = 1 và j = i.
void TamGiacVuongCanRong(int h)
{
   for (int i = 1; i <= h; i++)
   {
      for (int j = 1; j <= i; j++)
      {
         if (j == 1 || j == i || i == h)
            printf("* ");
         else
            printf("  ");
      }
      printf("\n");
   }
}
Bài 5: Vẽ tam giác cân đặc có chiều cao h. Ví dụ: h = 5
        *
      * * *
    * * * * *
  * * * * * * *
* * * * * * * * *
Hướng làm: Nhìn ví dụ ta nhận thấy tam giác cân này có chiều cao h thì có đáy là 2h-1. Vì vậy ta dùng 2 biến m và n để xác định khoảng sẽ in dấu *. m và n ban đầu sẽ bằng h, sau đó m sẽ giảm và n sẽ tăng để mở rộng khoảng in dấu * ra đến đáy.
void TamGiacCanDac(int h)
{
   int m = h, n = h;
   for (int i = 1; i <= h; i++)
   {
      for (int j = 1; j <= 2 * h - 1; j++)
      {
         if (j >= m && j <= n)
            printf("*");
         else
            printf(" ");
      }
      m--;
      n++;
      printf("\n");
   }
}
Bài 6: Vẽ tam giác cân rỗng có chiều cao h. Ví dụ: h = 5
        *
      *   *
    *       *
  *           *
* * * * * * * * *
Hướng làm: Tương tự cách làm của bài 5 nhưng ta chỉ cần xác định đoạn in dấu *. Các đoạn in dấu * là i = h, j = m và j = n.
void TamGiacCanRong(int h)
{
   int m = h, n = h;
   for (int i = 1; i <= h; i++)
   {
      for (int j = 1; j <= 2 * h - 1; j++)
      {
         if (j == m || j == n || i== h)
            printf("*");
         else
            printf(" ");
      }
      m--;
      n++;
      printf("\n");
   }
}

Mời các bạn xem tiếp phần 2

13 nhận xét:

  1. Nhận xét này đã bị tác giả xóa.

    Trả lờiXóa
  2. em chỉ biêt dùng các hàm void main , int main thôi ạ!vây làm sao để dùng được các ham void như của anh ạ?

    Trả lờiXóa
  3. in tam giác vuông rỗng bị sai kết quả

    Trả lờiXóa
    Trả lời
    1. Đúng rồi, mình không tìm được lỗi ở đâu

      Xóa
  4. Nặc danh09:16 22/9/18

    như con cặc

    Trả lờiXóa
  5. hình tròn thì làm sao hả ad?

    Trả lờiXóa
  6. for (int i = 1; i <= n; i++)
    {
    int j, k;
    for (j = 1; j <=n- i; j++)
    {
    cout << " ";
    }
    for ( k = 1; k <= 2 * i - 1; k++)
    {
    cout << "*";
    }

    cout << "\n";
    }
    tạo tam giác cân kiểu này thì làm rỗng nó sao ad;

    Trả lờiXóa
  7. Cho em hỏi vẽ cây thông có đáy là hình vuông 3 tầng thì làm sao ạ

    Trả lờiXóa
  8. Nhận xét này đã bị tác giả xóa.

    Trả lờiXóa
  9. anh co the giai giup e sang ngon ngu pascal duoc k a....
    help me!!!!!

    Trả lờiXóa
  10. Nhận xét này đã bị tác giả xóa.

    Trả lờiXóa
  11. giống code mẫu quá mấy ông toàn cover code của nhanh lại chẳng thấy gì mới mẻ cả

    Trả lờiXóa