#include<stdio.h>
#define ST1 \"* * *\\n\"
#define ST2 \" *\\n\"
#define ST3 \" ********\\n\"
#define ST4 \"*****\"
#define ST5 \" ***\\n\"
#define ST6 \"%s%s%s%s%s\"
main()
{
printf(ST6, ST1, ST1, ST4, ST5, ST1);
printf(ST6, \"* *\", ST5, ST4, \" *\\n\", ST2);
printf(ST6, ST3, ST2, ST3, \" *\\n\", ST3);
}
---------------------------------------------------
#include<stdio.h>
main(int i, int j)
{
if(i > 7) return;
for(j=-1;++j<7;putchar(i<5?j+i<4?\' \':2-j+i<0?\' \':\'*\':i-j<5?j+i<11?\'*\':\' \':\' \'));
puts(\"\");
main(++i, j);
}
#define ST1 \"* * *\\n\"
#define ST2 \" *\\n\"
#define ST3 \" ********\\n\"
#define ST4 \"*****\"
#define ST5 \" ***\\n\"
#define ST6 \"%s%s%s%s%s\"
main()
{
printf(ST6, ST1, ST1, ST4, ST5, ST1);
printf(ST6, \"* *\", ST5, ST4, \" *\\n\", ST2);
printf(ST6, ST3, ST2, ST3, \" *\\n\", ST3);
}
출력문 내부 내용을 define으로 때웠다는걸 알 수 있을거다. 멍청이가 아니라면 \\n이 줄바꿈인건 알지?
첫번째 출력문의 내용을 고대로 바꾸면
printf(\"%s%s%s%s%s\", \"* * *\\n\", \"* * *\\n\", \"*****\", \" ***\\n\", \"* * *\\n\");//맨 앞의 ST6는 string 5개 출력이라는 의미고 뒤의 패러미터들은 각 위치에 들어갈 string임
고대로 찍어보면
* * *
* * *
********
* * *
요런거임. 실제 출력은 안해봐서 콘솔엔 어찌 나올지 모르겄다.
여튼 이걸 존나 반복해서 별모양 만드는거임
---------------------------------------------------
#include<stdio.h>
main(int i, int j)
{
if(i > 7) return;
for(j=-1;++j<7;putchar(i<5?j+i<4?\' \':2-j+i<0?\' \':\'*\':i-j<5?j+i<11?\'*\':\' \':\' \'));
puts(\"\");
main(++i, j);
}
만약 프로그래밍 전뉴비면 모를수도 있는 문제인데 이런형식을 재귀호출이라고함. 좀더 깊게 들어가면 활성 메모리부분도 알아두면 좋겠지만 지금 그딴게 필요한건 아님. 다만 저기에서 if(i>7) return;이 없으면 스택 오버플로우난다는건 알아뒀으면 좋겠음
재귀호출을 간단하게 설명하자면 자기가 자기 자신을 호출하는거임. 즉 함수 A를 정의했다고 했을때 A내부에서 A를 호출하는 부분이 있을경우 재귀호출이 됨. 다만 명확한 종료조건이 있어야할거임. 근데 내가보기엔 딱히 J는 넘겨줄 이유가 없어보이는데 왜넘기는질 모르겠음.
for문의 구조는
for(A;B;C)인데
A는 초기화 부분이고 초기실행 한번만 실행됨, B는 조건체크부분이고 C는 매회 수행 반복해서 수행되는데 이 미친 코드는 for내부에 들어갈 내용을 여기다 쑤셔밖은거임
i<5?j+i<4?\' \':2-j+i<0?\' \':\'*\':i-j<5?j+i<11?\'*\':\' \':\' \'
이런코드는 다른사람이랑 작업할때 이따구로 작성하면 레알 쌍욕처먹으니 이딴식으로 짜지말길 바람. 여튼 해석하면
i<5 조건으로 true이면 j+i<4를 체크하고 false이면 :i-j<5를 체크함
다시 j+i<4가 true이면 \' \'를 찍고 false이면 2-j+i<0을 체크함
i-j<5 가 true이면 j+i<11을 체크하고 false 이면 \' \'을 찍음
다시 2-j+i<0이 true이면 \' \'을찍고 false이면 \'*\'을찍음
그리고 j+i<11 true이면 \'*\'을찍고 false이면 \' \'을찍음
봐도 엄청 병_신같지 않음? 괄호로 묶으면 아래처럼묶임
i<5?(j+i<4?\' \':(2-j+i<0?\' \':\'*\')):(i-j<5?(j+i<11?\'*\':\' \'):\' \')
인거임. 괄호로 묶어놔도 병_신같네.
여튼 이 의미는 for문의 조건제어를 통해 i만큼 돌아서 한줄찍고 puts(\"\")로 줄바꾼다음 i++해서 재귀호출하는 형태임. 총 7줄을찍는다는걸 알 수 있음. 캐릭터 7개를찍으니까 7x7짤 마름모겠네.
코드가 거지같아서 해석해도 엿같은듯. 여튼 사장님한테 욕먹으면서 썼으니 설명이 좀 엿같아도 감안해주길 바람.
아 오타났다 i만큼돌아 한줄이 아니라 j만큼 돌아 1줄이네. 그리고 -1부터 시작하니까 한줄 8개인가. 갑자기 헷갈리네
좋은 조공, 좋은 답변 헤헤
어떤 미친넘이 저런식으로 프로그램짜문 이빨부터 날리고 보겠네....
내생각에는, 너가 분위기 파악 못한거 같다 ㅎㅎㅎ
정성이 하늘에 다았당께 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
존나 열심히 써놓으니까 질문한 새_끼가 안본다. 다음부턴 정성이고 나발이고 걍 무시할까.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 질문한새퀴 레알 안봤나보다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
스승님의 친절을 무시하냄
laoshanlong// 질문에 초점이 아니라 짤에 초점을 맞ㄷ추라고