Viết chương trình in lá cờ nước Mỹ

Chào mọi người , hiện tại mình đang học C tới phần vòng lặp. Thì gặp ngay bài tập này, mình không biết bài này làm như thế nào và có thuật toán ra sao.
Mình có Google thử thì kiếm được source code nhưng mình không hiểu nó lắm không biết nó thuộc ngôn ngữ nào .Rất mong các bạn giúp mình thuật toán của bài bài này với ạ . :neutral_face::disappointed:

#include <windows.h>
#include <GL/gl.h>
#include <GL/glaux.h>
#include <GL/glut.h>
#include <cmath>
#pragma comment(lib,"glaux.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"opengl32.lib")
void DrawStripes()// ve tat ca cac soc
{
    float fStartX;// diem tren cung phia ben trai cua 1 gach soc
    float fStartY; // diem tren cung phia ben phai
    float fEndX;//
    float fEndY;
    for(int i=0;i <13; ++i)
    {
        if(i % 2 ==0){
            glColor3f(204.0/255.0,0.0,0.0);
        }
        else{
            glColor3f(1.0,1.0,1.0);
        }
        fStartX = 0.0;
        fEndX = 1.0;
        fStartY = i *(1.0/13.0);
        fEndY = (i + 1)*(1.0/13.0);
        if(i > 5){
            fStartX = 0.76/1.9;
        }
        glBegin(GL_QUADS);
        glVertex3f(fStartX,fStartY,0.0);
        glVertex3f(fEndX,fStartY,0.0);
        glVertex3f(fEndX,fEndY,0.0);
        glVertex3f(fStartX,fEndY ,0.0);
        glEnd();
    }
}
void Draw1Star(float fX,float fY)//ve 1 ngoi sao khi biet toa do cua no
{
    const float kfPi = 3.1415926535897932384626433832795;
    const float kfRadius = 0.0616/2.0;
    const float kfInnerRadius = kfRadius *(1.0/(sin((2.0*kfPi)/5.0)*2.0*cos(kfPi/10.0)+sin((3.0*kfPi)/10.0)));
    glColor3f(1.0,1.0,1.0);//InnerRadius:duong tron trong,Radius:duong tron ngoai
    glBegin(GL_TRIANGLE_FAN);
    glVertex3f(fX,fY,0.0);
    for(int iVertIndex =0;iVertIndex <10 ;iVertIndex++ ){
        float fAngleStart = kfPi/2.0 +(iVertIndex *2.0*kfPi)/10.0;
        float fAngleEnd = fAngleStart + kfPi/5.0;
        if(iVertIndex % 2 == 0){
            glVertex3f(fX + kfRadius * cos(fAngleStart)/1.9,fY + kfRadius * sin(fAngleStart),0.0 );
            glVertex3f(fX + kfInnerRadius * cos(fAngleEnd)/1.9,fY +  kfInnerRadius * sin(fAngleEnd),0.0 );
        }
        else
        {
            glVertex3f(fX + kfInnerRadius * cos(fAngleStart)/1.9,fY + kfInnerRadius * sin(fAngleStart),0.0 );
            glVertex3f(fX + kfRadius* cos(fAngleEnd)/1.9,fY + kfRadius * sin(fAngleEnd),0.0 );

        }
    }
    glEnd();
}
void DrawAllStars()//ve 50 ngoi sao
{
    for(int iStarRow = 0;iStarRow <9 ;++ iStarRow  )
    {
        float fY = 6.0/13.0+(iStarRow + 1)*((7.0/13.0)/10);
        if(iStarRow % 2 == 0)
        {
            for(int iStarCol = 0;iStarCol < 6;++iStarCol)
            {
                Draw1Star((iStarCol)*((0.76/1.9)/6.0)+ (0.76/1.9)/12.0,fY);
            }
        }
        else
        {
            for(int iStarCol = 0;iStarCol < 5;++iStarCol)
            {
                Draw1Star((iStarCol +1)*((0.76/1.9)/6.0),fY);
            }
        }
    }
}
void Draw()
{
    glClear(GL_COLOR_BUFFER_BIT);
    DrawStripes();//ve cac soc cua la co
    DrawAllStars();//ve tat ca cac ngoi sao
    glFlush();//hien thi ket qua neu chuong trinh dot ngot dung lai

}
void Initialize()//khoi tao khung nhin va phep chieu
{
    glClearColor(0.0,0.0,102.0/255.0,0.0);//xoa mau
    glMatrixMode(GL_PROJECTION);//phep chieu 
    glLoadIdentity();
    glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0);//chieu truc giao
}
int main(int iArgc,char** cppArgv)
{
    glutInit(&iArgc,cppArgv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(950,500);
    glutInitWindowPosition(200,200);
    glutCreateWindow("xõa.net");
    Initialize();
    glutDisplayFunc(Draw);//goi ham ve chinh
    glutMainLoop();//vong lap hien ket qua
    return 0;
}  

cái này là dùng đồ họa trong C/C++ bạn ạ
Mình cũng thử vẽ một lá cờ bằng console như thế này :smile:

 //Chuong trinh in ra la co nuoc My

    #include<stdio.h>
    #include<conio.h>

    int main(void)
    {
    	int i, j, m, n;
    	
    	printf("\n Nhap vao chieu ngang cua la co:");
    	scanf("%d", &m);
    	printf("\n Nhap vao chieu doc cua la co:");
    	scanf("%d", &n);
    	
    	for(i=1; i<=n; i++)
    	{
    		for(j=1; j<=m; j++)
    		{
    			if(i==1 || i==n || j==1 || j==m)
    				printf(" + ");
    			else if(i<=(n/2)+1 && j<=(m/2)+1)
    				printf(" * ");
    			else
    				printf("   ");
    		}
    		printf("\n");
    	}
    }
2 Likes

bạn có thể giải thích cho mình thuật toán được không. mình mới học nên còn nhiều chỗ không biết .

ý tưởng là chúng ta có 2 vòng for lồng nhau, 1 vòng chạy tăng hàng ( chạy theo hàng dọc) ở bên ngoài, và một vòng chạy tăng cột (chạy theo hàng ngang lồng ở bên trong) tại các vị trí tai các vị trí mà i ==1 , i==n, j==1, j==m, thì chúng ta sẽ in ra dấu +, tiếp ở các vị trí i<=(n/2) + 1 và j<=(m/2) + 1 thì in dấu *, còn lại thì in ra khoảng trắng . Vẽ xong một hàng thì xuống hàng, rồi cứ như thế vòng for bên ngoài sẽ lặp vòng for bên trong số lần lặp = với chiều dọc của lá cờ HCN .
Bạn cứ vẽ lại hình chữ nhật rỗng bằng các dấu + và dấu * ra giấy và tham chiếu lại là thấy ngay thôi mà :slight_smile:

thuật toán của bác Huy Tran giống của em đấy

cảm ơn bạn :smiley: mình hiểu rồi

(post withdrawn by author, will be automatically deleted in 24 hours unless flagged)

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?