01/10/2018, 09:06

Xin thuật toán của bài tập viết chương trình vẽ một tam giác cân bằng dấu *

 #include <stdio.h>
 #include <stdlib.h>

int main()
{
   int n;
   printf("nhap chieu cao tam giac
");
   scanf("%d", &n);
   for(int i=0;i<=n;i++)
   {
       for(int j=0;j<n-i;j++)
        printf(" ");
       {
           for(int k=1;k<=2*i+1;k++)
            printf("*");
            printf("
");
       }
   }
   return 0;
}

Help, Mọi người có thể giải thích cho em thuật toán của bài này được không ạ ?, code thì chương trình chạy đúng, nhưng em không hiểu thuật toán của nó ạ, mong mọi người giúp đỡ

Đăng Trần viết 11:20 ngày 01/10/2018

Cái chảo - cái xoong - cái lẩu gì vậy trời…? Bài toán không khó mà xem code thì hại não quá… không thể tin nổi. Ai giải cho bạn thế này?

Đăng Trần viết 11:19 ngày 01/10/2018

Tối nay lại phải lên máy tính, code thớt này ám ảnh kinh hồn. .

NG viết 11:12 ngày 01/10/2018

Chảo nồi xoong thiệt, đoạn for k mới ảo, k = 1 chi rồi k <= i2 +1.
k = 0, k<= i
2 dc rồi,
ỷ CPU mạnh muốn viết gì viết í.

NG viết 11:11 ngày 01/10/2018

Đây là hậu quả của việc viết code không theo chuẩn. Mỗi ngôn ngữ sẽ có một guide (không phải là rules nhé) yêu cầu phải theo 1 chuẩn nhất định, quy định từ cách đặt tên, dấu khoảng trắng, dòng trống, ký tự tab cho tới style của code.
Điều này giúp đọc code dễ dàng hơn. Java có chuẩn J2EE, Python có chuẩn PEP8, PEP20.

Đoạn code này không có gì khó hiểu nếu viết lại :

 #include <stdio.h>
 #include <stdlib.h>

int main()
{
   int n;
   printf("nhap chieu cao tam giac\n");
   scanf("%d", &n);
   for(int i=0;i<=n;i++)
   {
       for(int j=0;j<n-i;j++)
           printf(" ");
       
       for(int k=1;k<=2*i+1;k++)
           printf("*");

       printf("\n");
       
   }
   return 0;
}
NG viết 11:12 ngày 01/10/2018

Đoan code vẽ 1 tam giac cân chiều cao là n trong khoảng diện tích n X 2n-1

dòng đầu tiên là đỉnh của tam giác, khi i = 0 thì sẽ in ra 1 ký tự * (chỗ for k = 1).
Do chiều dài là 2n-1, nên ký tự này sẽ nằm ở vị trí thứ n . do đó, trước khi in ra ký tự *, vòng lặp (for j) đưa ký tự * tới vi trí thứ n bằng ký tư khoảng trắng.
sau khi in hết vòng i =0, xuống hàng.

qua vòng i =1, lần này vòng k nhận gía trị i = 1, nên chạy từ 1 tới 3, in ra 3 ký tự *. kí tự * thứ nhất sẽ phải đặt ở vị trí n-1, cũng chính là n - i. Thế nên vòng này, chỉ cần n-i khoảng trắng. và vòng (for j) sẽ lo điều đó.
tiếp tục cho tới i = n

tóm lại trong khoảng n2-1 ký tự, sẽ có
(n-i) khoảng trắng + (2
i + 1) ký tự * + (n-i) khoảng trắng. Nếu khai triển ra bạn sẽ có 1 số ko phụ thuộc i : (2*n-1) cũng chính là chiều dài cạnh đáy của tam giác.

Nguyen Gia Huy viết 11:15 ngày 01/10/2018

VD nhập n=3 ta sẽ được
##–*
##-***
##*****

Ta sẽ phân tích như sau.

  • Dòng thứ 1 in 2 khoảng trống và 1 dấu *
  • Dòng thứ 2 in 1 khoảng trống và 3 dấu *
  • Dòng thứ 3 in 0 khoảng trống và 5 dấu *
  • Sau mỗi dòng ta cần xuống dòng

Thiết kế thuật toán in theo dòng ta cần in n dòng --> vòng lặp đầu tiên for (int i=1; i<=n; i++)
+Ở mỗi dòng cần in (n-i) khoảng trống --> for (j=1; j<=n-i; j++)
+Tiếp tục các khoảng trống ta cần in ra (2i-1) dấu ** --> for (int k=1; k<=2i-1; k++)
+Cuối cùng là xuống dòng để in dòng kế tiếp printf("\n");

Mình đã sửa lại thuật toán của bạn ở vòng lặp for đầu tiên ta chỉ cho i chạy từ 1 đến n tức là in n dòng, bạn cho i chạy từ 0 đến n thi khi chạy sẽ in ra n+1 dòng và vòng lặp for thứ 3 sẽ phải in (2*i+1) dấu *

NG viết 11:18 ngày 01/10/2018

Chỉ cần bỏ dấu = phía trên là đc, không cần sửa hết đâu bạn
chỗ này
for(i = 0; i <n, i++)
bên dưới nếu muốn đẹp hơn, không thì khỏi
for(k = 0; k <=2*i; k++)

Nhưng mình vẫn muốn các bạn chú ý :
for(k = 1; k <=2*i + 1; k++), có nghĩa là bạn tốn thêm 1 phép tính mỗi vòng.
nếu n rất lớn thì nó sẽ tốn 1 đống thời gian.
Tập thói quen từ điều nhỏ nhặt sẽ giúp code bạn chuẩn hơn, nhanh hơn

Hoài Nam Trương viết 11:22 ngày 01/10/2018

nh

mình tìm trên http://diendan.congdongcviet.com/forum.php ấy bạn

Đăng Trần viết 11:09 ngày 01/10/2018

Tại sao phải vậy:
-____*
-*********
cũng cân nhé, với 1 cái n nhập có cả tỷ kết quả rồi. Tui muốn làm gì tui làm vì có ai bắt bớ gì đâu. Cái bài toán ảo quá trời.
Thêm nữa trên ma trận vuông mà 3 vòng lặp là thiếu trách nhiệm.
For (i=n; i>0; --i)
In ra khoảng trắng.
For (j= 0; j<=2(n-i);j++)
in * in thêm /n nếu j= 2 (n-i).
Anh em nào fix lại gắp dùm mình cái này đang cho con bú không mở máy được!
Tui tức quá mà…

NG viết 11:21 ngày 01/10/2018

3 vòng đâu, đối với mình là 2 bạn à
như mình phân tích ở trên, vòng lặp trên ma trận n*(2n-1), 2 vong for j k, tính là 1 vong trên (2n-1)
3 vòng có nghĩa là 3 vòng lồng lên nhau,
ijk
chưa nói đến chạy j: 0 ->2*n nó tốn vòng lặp hơn 25% cách này bạn à

Đăng Trần viết 11:18 ngày 01/10/2018

Ừ đáp án mình cũng sai bét phải set lại i mỗi lần j kết thúc. Nói túm lại là đang hứng và rảnh rồi thử cái khác đã. Tìm nhiều cách làm đã coi tối ưu nhất là gì. Đặt trường họp hứng lên nhập n=1b thì sao.

Hidan viết 11:10 ngày 01/10/2018

Java có chuẩn J2EE, Python có chuẩn PEP8, PEP20.

có nhầm lẫn gì ko đây ?

NG viết 11:20 ngày 01/10/2018

Sao vậy bạn, lúc mình học J2EE thì mình đã phải ôm cái docs mấy trăm trang về cái quy định style rồi, mà nói thật mình cũng ko nhớ, vì bây giờ mấy cái edit code có hỗ trợ, như eclipse.

PEP8 với PEP20 là của Python quy định các style pythonic.

Đăng Trần viết 11:18 ngày 01/10/2018

nguy hiểm xông vô. mấy anh có ngon ra đề khó cho tui trả lời trớt quớt coi chơi nào. Hơn thua làm gì ở đây. mà cái tam giác
*
**
***-
****-
Cân hong ta tính * đơn vị mà, cái đề hóc quá mình phải chơi lầy chút! Nhìn thì có vẻ vuông nhưng nó là tam giác đều.

Bài liên quan
0