2010년 10월 31일 일요일

pep/8에 대한 고찰

수업시간에 조는건 정말로 멍청한 일이란걸 깨달았다. 특히나 6단원을 배울때 그런건 더 심했다는 생각이 든다. 과제하는데 정말 오랜시간이 흘렀다. 내가 일을 천천히 느리게 한 이유도 있지만 아무래도 학교에서 제대로 듣지를 않으니 더 걸린게 아닐까? 결론은 반성하자는거다.

거두절미하고 이번 과제를 파악하기 위해 생소한 assembly코드보다는 C로 구현화한다음에 다시 assembly코드로 구현화 하겠다.

C
#include<stdio.h>

void main(){
int a, b, c;
scanf("%d", &a);
scanf("%d", &b);
scanf("%d", &c);

if(a-b > 0 && a-c >0){
   if(b-c > 0)
        printf("a>b>c");
   else
        printf("a>c>b");}

else if(b-c > 0 && b-a>0){
   if(a-c > 0)
        printf("b>a>c");
   else
        printf("b>c>a");}

else if(c-a>0 && c-b>0){
   if(a-b>0)
        printf("c>a>b");
   else
        printf("c>b>a");}
}

이것을 이제 assembly코드로 옮겨야하는데 그러기 위해서 C의 함수들을 하나하나 assembly코드로 옮겨보겠다

우선

printf = CHARO
scanf = DECI
int = .BLOCK
if & else if = BR & BRLT

이제 앞의 C코드를 assembly코드로 바꿔보자

BR main

save : .WORD 0
a: .BLOCK 2
b: .BLOCK 2
c: .BLOCK 2

main : DECI a,d
DECI b,d
DECI c,d
BR caseab
caseab: LDA save,d; a>b면 a>c를 조사하고 b>a면 b>c를 조사한다
ADDA a,d
SUBA b,d
BRLT caseba
BR caseac
caseba: LDA save,d; b>a이므로 b>c와 a>c를 조사한다.
ADDA b,d
SUBA c,d
BRLT printcba
BR casebca
printcba : DECO c,d;cba인쇄
DECO b,d
DECO a,d
BR finish
casebca LDA save,d;b>a, b>c이므로 a>c를 조사한다.
ADDA a,d
SUBA c,d
BRLT printbca
BR printbac
printbca : DECO b,d;bca인쇄
DECO c,d
DECO a,d
BR finish
printbac : DECO b,d;bac인쇄
DECO a,d
DECO c,d
BR finish
caseac : LDA save,d;a>b이므로 a>c이면 b>c, c>a면 프린트한다.
ADDA a,d
SUBA c,d
BRLT printcab
BR caseacb
printcab : DECO c,d;cab인쇄
DECO a,d
DECO b,d
BR finish
caseacb : LDA save,d;a>b, a>c이므로 b>c를 알아본후 결과를 출력한다.
ADDA b,d
SUBA c,d
BRLT printacb
BR printabc
printacb : DECO a,d;acb인쇄
DECO c,d
DECO b,d
BR finish
printabc : DECO a,d;abc인쇄
DECO b,d
DECO c,d
BR finish
finish : .END

이정도로 짤 수 있겠다

이제 결과물을 보도록 하자 고고싕


..........................뭐지 저 오류는?.........













뭔가 했더니 띄어쓰기 오류였다

case~
print~

옆에 콜론(:) 이 한칸 떨어져서 씌여있었기 때문에 오류가 떳던 것이다... 수정을 해본 결과 두둥!















우와 성공!

뭐 자바처럼 대소문자 구분을 안한다는건 마음에 들지만 C처럼 아예 공백(enter제외)와 대소문자 둘다 구분 안한다면 편할거같긴 하지만... 그래도 나름 한가지의 컴퓨터 언어를 더 배웠다는게 즐거운 과제였다 ㅎㅎ

ps.

만약에 4개 이상의 수들을 내림차순으로 정렬하려면 어떻게 해야할까? 3개였을 경우에는

3!(factorial) = 3 *2 * 1 = 6

6개의 경우가 생겻으니까 n개의 수들을 나열하려면

n!(factorial) = n * (n-1) * (n-2) * ... * 1

의 경우의 수만큼을 분기해서 print구문을 써줘야 할것이다.

상상만해도 끔찍하다 이를 위해서 생각해본것이 C와 자바에서는 recursion과 loop를 사용하는건데 이번과제의 툴인 pep/8에서는 이러한 기능들이 없기 때문에 일일히 분기점을 써야만한다고 생각된다.

댓글 없음:

댓글 쓰기