과제를 하다 보니 거의 밤을 새가는 듯 하다.

오늘 밤 11시까지 과제 마감인데 그때 까지 과제를 다 할지도 의문시 되고 등등. 다 할수 있을거라 믿고 있다만 정말 두렵다.

이번에 과제하는데 예전 과제들 보다 너무나 힘들다는 것을 느끼게 되었다. 저번 과제들을 보면 이번 과제보다 난이도가 너무 쉬었다. 과제 내기 몇일 전에 submit하고 그랬는데 말이지.
(내가 예전 과제가 쉽다고 말 안했다. 지금 포기하신 분이 넘쳐난다. -_-;;)

이번 과제는 PIPE까지만 쓰면 저번 과제의 난이도와 비슷하게 같다 그런데 shall를 구현하는 프로그램을 짜지 않나?, System Call을 써서 파일 만드는 것까지는 괜찮다. 그런데... 입출력을 무조건 read()함수와 write()함수로만 한다고 해서 아주 짜증이 넘침.

거기에 Shall을 구현하는데 교재에 있는 예제는 정말 마음이 안들어서 내가 shall 구현을 직접해버렸다. 그래서 시간 조낸 걸리고 -_ㅠ
과제하는데 왜이리 빡센 경우가 자료구조 보다 더 빡센 것 같다.

Shall을 구현하는데 프로그램 작성시 없는 메모리를 접근하여 아주 당황스럽게 Segmentation Fault세그먼테이션 오류을 내는 일도 비일비재 하고 ㅠㅠ

정말 이번 과제는 System Call만 조낸 만지작 하다가 끝날듯 하다. 과제가 생각보다 어렵다. 다음 과제는 어떻게 될지가 ㄷㄷㄷ
이제서야 shall 구현이 제대로 되었다. X같은 Segmentation Fault을 해결하니 정말 깨운하다.

저건 구현의 일부분일 뿐입니다. 쉘같이 완벽하게 구현할려고 발악을 했던지 ㅡ,.ㅡ.
아직도 과제구현 못한 것이 있어서 짜증이 난다만 다행이도 거의 끝내가서 다행. 과제를 오늘까지 내야해서 정말 정신이 오락가락 혼미해지고 있습니다.

이제 밤을 하얗게 불태우고 자야할듯 합니다. 일어나서 또 과제해야할듯 ㅠㅠ


다음학기인 3학년 2학기가 두려워지고 있습니다. 1학기 과목들은 재미라도 있으니까 다행인데 전공필수인 OS는 -_-;;

'컴퓨터' 카테고리의 다른 글

Google神은 언제 어디서나 있다.  (5) 2007.07.31
Visual Studio 2005 설치  (4) 2007.07.29
Prolog과제 기록  (2) 2007.05.19
이것이 프로그래밍언어를 배워야 하는 이유군요. -_-;;  (12) 2007.05.16
Prolog 설치 및 평  (4) 2007.05.15
Buy me a coffeeBuy me a coffee
관련 포스팅
1. Perl과제 기록
2. Pascal과제 기록
3. Prolog과제 기록


프로그래밍언어 시간에 과제로 부여한 Prolog이란 언어로 여러가지 자료구조들을 이용한 프로그램을 구현을 했습니다.
  1. 임의의 숫자 12개를 입력 받은 이진 트리를 출력하시오.
  2. F0 = 0, F1 = 1 그리고 Fn = Fn-1 + Fn-2 (n≥2)일 때, 임의의 숫자를 입력받아서 그 수보다 작은 수(혹은 같은수)까지의 피보나치 수열을 출력하시오.
  3. 임의의 숫자 12개를 입력 받아 퀵정렬 알고리즘을 사용하여 정렬하시오.
  4. 다음 그래프에서 1번 노드에서 시작해서 10번 노드로 가는 최단거리를 Dijkstra 알고리즘을 이용해서 구하시오.
  5. 하노이 탑 알고리즘 구현하시오. 세 개의 막대가 있고 원판의 개수는 임의로 입력 받는다.

프로그래밍 언어 3월달 과제는 Perl이라는 언어로 위의 자료구조들을 구현하는 것이였는데 4월달 과제는 Pascal이라는 언어로 위의 자료구조들을 구현하는 것이었습니다. 이번 5월달 과제는 Prolog란 언어로 위의 자료구조들을 구현하시요
조교님께서 가르쳐주신다고 했으나 20분만에 상황 종료. 이렇게 깔고 프로그램은 이렇게 돌아가요. =_=;;

Prolog는 논리형 프로그래밍 언어입니다.
PROgramming inLOGic 의 준말로서 논리식을 토대로 오브젝트와 오브젝트 간의 관계에 관한 문제를 해결하기 위해 사용합니다.
이 언어는 인공지능, 계산 언어학, 자연언어 처리 분야에서 많이 사용된다고 하네요.

그런데 이 언어는 기존에 알고 있던 C,C++,JAVA,Pascal, Perl, Python과는 다르게 구성되어 있더군요
일반적인 언어라면 컴파일러가 알이 먹을수 있는 언어를 말하는데 이 언어는 논리적인 구성으로 된 언어라고 할까나?

Prolog에는 기본요소가 3가지있습니다.
  • 사실(facts)
  • 질문(questions)
  • 규칙(rules)
사실(facts)
관계와 객체의 이름은 소문자로 시작됩니다.
관계의 이름을 먼저 쓰고, 객체들은 괄호 안에 쉼표로 구분합니다.
사실은 항상 ‘.’으로 끝납니다.
예제)
John likes Mary -> likes(john,mary).

아래 표는 사실과 규칙의 표현입니다.
 
PROLOG
논리식
,
and()
;
or()
:-
only if(ß)
not
not()

likes(kim,X),likes(lee,X).
likes(kim,pinky) :- likes(lee,X).
likes(kim,pinky) :- not(likes(lee,pinky)).

질문(questions)
사실들을 저장한 후에는 그에 관한 질문 제기를 합니다.
질문은 사실과 유사하나 그 앞에 특수 기호 있습니다.
예제)
Does mary own the book -> ?- owns(mary,book).

규칙(rules)
규칙은 다른 사실로부터 하나의 또 다른 사실을 추론 가능하게 합니다.

Prolog 인터프리터를 아래 링크에서 구했습니다.
http://www.freeprogrammingresources.com/

전 SWI-Prolog를 설치해서 Prolog 언어를 써보았습니다.
아래 화면은 SWI-Prolog 홈페이지 화면입니다. SWI-Prolog는 무료로 다운로드를 받을 수 있습니다:D
http://www.swi-prolog.org

SWI-Prolog를 설치했을때의 화면입니다.

아래 화면처럼 Prolog 언어로 만든 코드를 가지고 함수를 불러서 제대로 Prolog 언어를 구현했는지 알아 봅니다.


이번과제는 아주 난해했습니다. 일반적으로 쓰던 언어들의 구조에서 완전히 벗어난 비 절차적인 언어인 Prolog를 공부하다 보니 너무 어렵더군요 ㅋ

일반적으로 C,C++,JAVA Basic, Perl에 익숙한 저에게 이런 언어는 아주 어렵게 느껴졌습니다. 논리형 언어라는것이 언어를 영어같은 서구 언어로 만들어져서 서구 언어같이 만들어진 것 같습니다.
서구 언어 같이 논리적이지 못한 한국어로 Prolog를 이해하려니 너무나 어려웠군요. 그리고 Prolog같은 언어는 한국어로 된 책도 별로 없는데다 한국어로 된 책으로 공부하면 더더욱 이해가 안갑니다. 그래서 원서를 빌려 공부했습니다.

아래 사진은 Prolog를 공부한 원서


Prolog를 배우니까 재미있긴 한데 제 머릿속에 난해한 언어는 이게 처음인듯 합니다. Pascal이나 Perl같은 경우는 C언어를 알면 금방 배우게 된다면 Prolog같은 언어는 함수를 만드는게 너무나 힘들었다는 ㅠㅠ

아래는 제가 Test해서 된 결과입니다.
실행결과
Welcome to SWI-Prolog (Multi-threaded, Version 5.6.34)
Copyright (c) 1990-2007 University of Amsterdam.
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

1 ?- tree([95,218,124,84,90,94,79,73,68,65,70,88], Tree).
==========================================================
Binary Tree Programming
3 A511151
==========================================================

Tree = bt(bt(bt(bt(bt(bt(nil, 65, nil), 68, bt(nil, 70, nil)), 73, nil), 79, nil),
84, bt(bt(nil, 88, nil), 90, bt(nil, 94, nil))), 95, bt(bt(nil, 124, nil), 218, nil))

Yes
2 ?- fibonacci(5).
=======================================================
Fibonacci Sequence Algorithm
3 A511151
=======================================================
Input the number : 5
0 1 1 2 3 5

Yes
3 ?- quicksort([0,56,19,80,58,47,35,89,82,74,17,85],SortedLst).
==========================================================
Quick Sort Algorithm
3 A511151
==========================================================
Sorted List :

SortedLst = [0, 17, 19, 35, 47, 56, 58, 74, 80|...] [write]

SortedLst = [0, 17, 19, 35, 47, 56, 58, 74, 80, 82, 85, 89]

Yes
4 ?- path(1,10,Path,Cost).
=======================================================
Dijkstra`s Algorithm - (Shortest Paths)
3 A511151
=======================================================

Path = [1, 2, 6, 9, 7, 10],
Cost = 9

Yes
5 ?- hanoi(3).
=======================================================
The tower of Hanoi Algorithm
3 A511151
=======================================================
Input board number : 3
board 1[1->3]
board 2[1->2]
board 1[3->2]
board 3[1->3]
board 1[2->1]
board 2[2->3]
board 1[1->3]

Yes
6 ?-

'컴퓨터' 카테고리의 다른 글

Visual Studio 2005 설치  (4) 2007.07.29
Segmentation Falut와의 전쟁  (5) 2007.05.26
이것이 프로그래밍언어를 배워야 하는 이유군요. -_-;;  (12) 2007.05.16
Prolog 설치 및 평  (4) 2007.05.15
Pascal과제 기록  (3) 2007.04.14
Buy me a coffeeBuy me a coffee

홍익대학교 전자계산학과(現 컴퓨터공학과) XX학번 졸업하신 선배님과의 대화
만들어진지 10년이 넘지 않은 컴파일러는 "안정성이 확보되지 않았다"고 안쓸지도
10년도 넘지 않은 컴파일러가 안정성이 확보 안되었다고 하는 압뷁 ㄷㄷㄷ


그래서 아직도 COBOL같은 언어를 쓰는 곳들이 많군요. 그래서 프로그래밍언어 책을 배워야 하는 이유? -_-;;
프로그래밍언어 시간에 나오는 Pascal, Fortran, ALGOL, COBOL, Ada 같은 언어들 나오면 정말 왜 이딴 것 배우냐고 했다만 -_-;;
이제야 공감이 갑니다. 회사에선 아직도 쓴다 -_-;;;

'컴퓨터' 카테고리의 다른 글

Segmentation Falut와의 전쟁  (5) 2007.05.26
Prolog과제 기록  (2) 2007.05.19
Prolog 설치 및 평  (4) 2007.05.15
Pascal과제 기록  (3) 2007.04.14
JAVA의 문법이 이상한가?  (5) 2007.04.02
Buy me a coffeeBuy me a coffee
관련 포스팅
1. Perl과제 기록
2. Pascal과제 기록
3. Prolog 설치 기록
4. Prolog과제 기록



Prolog는 Programming in Logic의 준말로서 기호 논리연산을 위해서 쓰는 프로그래밍언어이다.
1970년대 초반에 Aix-Marseille대학의 인공지능 그룹에 속한 Alain Colmerauer와 Phillippe Rousel은 Edinburgh대학의 인공지능 학과의 Robert Kowalski와 함께 Prolog에 대한 기본적인 설계를 개발하였다.
Prolog는 1981년 일본 정부가 5세대 컴퓨팅 시스템(Fifth Generation Computing Systems:FGCS)이라는 대형 연구 프로젝트에서 각광을 받게 되었다.

1. Prolog 책을 도서관에서 빌려봄.
책 찾는게 너무나 힘들었다.
국내에 나온 Prolog 책들을 찾기는 매우 미지수 ㅡ,.ㅡ 학교 도서관에 찾아보아도 웬만한것들은 80년대후반 서적들 밖에 없었다. 그런데다가 Prolog란 언어는 논리형 프로그래밍 언어(Logic Programming Language)라서 한글로 공부하기엔 와닿지가 않았다.
그래서 책을 원서로 빌려보게 되었다.
난 이런 원서책을 빌리게 되었다.
Logic Programming with Prolog
Techniques of Prolog Programming

인터넷에서 원서로 된 Prolog를 찾게 되었는데 외국에서도 마찬가지로 최신 책이 없었다.
다행이도 최신으로 나온 책이 있었는데 학교 도서관에도 있었다.
Logic Programming with Prolog (Paperback) by Max Bramer

이 책은 얇으면서도 사용자들에게 알려줄 것들을 다 알려주는 아주 착한책이라고 할까? 거기에 학교 도서관에서 입고된 Prolog책중에서 아주 최신이면서 가벼운 책이다. 예제가 조금 부족하다는 것이 흠이랄까? 그래도 책의 내용이 너무 좋다. 간단한 이론들에 쓸데없는 예제만 넣어서 책의 양만 늘려 파는 책보단 말이다.
혹시나 모르기 때문에 Prolog예제들이 많이 있는 책도 빌려보게 되었다. 그런데 1993년도에 발간되어서 1994년 4월 27일날 입고된 책이다 정말 오래되었도다.

아래는 빌린 Prolog책들을 찍은 것이다.



2. Prolog를 해석할 Compiler를 구함
http://www.freeprogrammingresources.com/

위의 사이트는 대부분의 사람들이 쓰는 언어들에 대한 무료 컴파일러를 제공하는 사이트이다.


윗 사이트에서 Prolog Programming을 찾아서 클릭
Prolog Compilers를 클릭하면 Free로 된 Prolog Compiler의 목록들이 나온다.

여러가지 목록에서 2가지 컴파일러를 쓰기로 결정하였다.

SWI Prolog
SWI Prolog is a Prolog compiler, targeting primarily at research and education.

The GNU Prolog web site
GNU Prolog accepts Prolog+constraint programs and produces native binaries (like gcc does from a C source)

SWI Prolog는 Windows에 설치하기로 하고 GNU Prolog는 SPMachine(Fedora Core 6)에 설치하기로 함.

3. 각각의 OS에 Prolog를 설치한다.
근데 설치했긴 한데 스샷 귀찮아서 패스 ㅡ,.ㅡ


Prolog는 기호 논리의 형식을 이용한 언어이라서 일반적으로 쓰는 C, C++, JAVA, PHP, Perl, Python, Pascal과 구문이 아예 다르다.
Logic Programming with Prolog 에 있는 예제들을 보면
dog(fido).
dog(rover).
dog(henry).
cat(felix).
cat(michael).
cat(jame).
animal(X) :- dog(X).

?- dog(fido).
yes

?- dog(jane).
no

?- animal(felix).
no


맨 처음에 소스들을 보면 이해가 안간다. 왜 저렇게 써야하는지 C랑 달라서 헤메었다.
저정도는 약과이고 이거보다 어려운 자료구조들을 구현하려 하니까 정신이 어질어질 하다.
(Binary Tree, Fibonacci Sequence, Quick Sort, Dijkstra Algorithm, hanoi tower)

이번 Prolog과제를 하는데 개념들이 너무나 생소해서 매우 공부하기가 어려울 듯 하다 ㅡ,.ㅡ
이번 프로그래밍언어는 Prolog과제를 했나 안했나에 A가 왔다갔다하는 소문도 =_=;;

'컴퓨터' 카테고리의 다른 글

Prolog과제 기록  (2) 2007.05.19
이것이 프로그래밍언어를 배워야 하는 이유군요. -_-;;  (12) 2007.05.16
Pascal과제 기록  (3) 2007.04.14
JAVA의 문법이 이상한가?  (5) 2007.04.02
[site] ANSI C Yacc grammar  (1) 2007.03.27
Buy me a coffeeBuy me a coffee
관련 포스팅
1. Perl과제 기록
2. Pascal과제 기록
3. Prolog과제 기록


프로그래밍언어 시간에 과제로 부여한 Pascal이란 언어로 여러가지 자료구조들을 이용한 프로그램을 구현을 했습니다.
  1. 임의의 숫자 12개를 입력 받은 이진 트리를 출력하시오.
  2. F0 = 0, F1 = 1 그리고 Fn = Fn-1 + Fn-2 (n≥2)일 때, 임의의 숫자를 입력받아서 그 수보다 작은 수(혹은 같은수)까지의 피보나치 수열을 출력하시오.
  3. 임의의 숫자 12개를 입력 받아 퀵정렬 알고리즘을 사용하여 정렬하시오.
  4. 다음 그래프에서 1번 노드에서 시작해서 10번 노드로 가는 최단거리를 Dijkstra 알고리즘을 이용해서 구하시오.
  5. 하노이 탑 알고리즘 구현하시오. 세 개의 막대가 있고 원판의 개수는 임의로 입력 받는다.

프로그래밍 언어 3월달 과제는 Perl이라는 언어로 위의 자료구조들을 구현하는 것이였는데 4월달 과제는 Pascal이라는 언어로 위의 자료구조들을 구현하는 것이었습니다.
조교님께서 가르쳐주신다고 했으나 20분만에 상황 종료. 이렇게 깔고 프로그램은 이렇게 돌아가요. =_=;;
그런데 조교님이 태클을 건 것인 Turbo Pascal version 5.5을 기준으로 채점을 한다고 하였다.
여태까지 Pascal을 GNU에서 나온 GNU Pascal Compiler로 계속 컴파일 해서 과제를 했었는데 Turbo Pascal에서 컴파일 하라고 해서 당황했습니다.
Turbo Pascal 5.5 Version은 1989년도 볼랜드에서 나온 컴파일러로서 윈도우즈 XP에서도 돌아간다는 것이 신기할 정도였습니다.

아래 그림은 1989년에 만들어진 Turbo Pascal Version 5.5 화면입니다.

윗 프로그램이 1989년도에 만들어진 것이라서 한글을 쓰는 코드페이지에서는 와장창 깨집니다. 그리고 거기에 예전에 만들어진 것이라서 한글의 입력이 거의 불가능합니다. ;ㅁ;

그래서 Linux에서 우선 코드 적고 한글 주석 달고 GNU Pascal Compiler로 컴파일 한 다음 Turbo Pascal v5.5로 컴파일을 했습니다.
두벌일을 해버렸군요 시간은 금인데 효율적이지 않은 프로그래밍을 했다고 할까요?ㅠㅠ

위의 Turbo Pascal v5.5는 아래 링크에서 구했습니다.
http://www.freeprogrammingresources.com/

Borland사의 Turbo Pascal를 직접 얻을려면 이 사이트에서 구하면 됩니다.

Antique Software: Turbo Pascal v5.5

(무려 Antique 입니까? ;ㅁ;)

윗 사이트에서 1989년 당시의 Turbo Pascal 광고도 볼수가 있습니다. 저 광고를 보면서 Pascal이란 자를 저주하고픈 충동이 생겼습니다. =_=

인터넷을 뒤져보다가 이런 희귀한 Pascal 자료들을 발굴하게 되었더군요 =_=;;
첫 원서 (그리고 관련없는 생각)
아래 그림은 윗 링크에 나온 파스칼 설치 패키지입니다. 제가 이 것 보다도 더 오래된 Pascal Compiler를 쓴다는 것이 경악이었습니다 ㅠㅠ


Pascal을 처음 공부했을때에는 C와는 다른 예약어들과 C랑 다른 기호들 때문에 좀 헷갈리는 감이 있었는데 지금은 과제를 거뜬히 할수 있을 정도로 단련이 된듯 합니다. Pascal이 C랑 비슷한 구조가 있다는 것이 +_+
그런데 3월달에 Perl과제 처럼 4. Dijkstra Algorithm(Shortest Path)는 좀 압박이 좀 있었죠. 자료구조 책에서 이런 이론이 있다는 정도로 나가서 이해가 잘안되었던 기억이 ^^

Pascal을 배우면 배워볼수록, 책에 나온 PsudoCode들이 다 Pascal로 보입니다. 미묘님이 말씀한 것처럼 Pascal배우니까 PsudoCode들이 다 Pascal로 바꾸고 싶은 욕망들이 솟구쳤습니다 +_+

이번 과제는 제일 먼저 Linux에서 GNU에서 무료로 제공한 GNU Pascal Compiler로 Pascal을 컴파일 하였고, 그 다음 Turbo Pascal v5.5로 컴파일을 하였습니다. 둘다 돌아가게 만들었습니다.
아래는 과제 실행화면 결과입니다. 앞의 Perl 포스팅과 같은 값을 집어 넣었습니다.

=================================================
Binary Tree Programming
홍익대학교 컴퓨터공학과 3학년 A511151 ***
=======================================================
12개의 숫자를 입력하십시요.
49 36 64 40 50 55 24 20 68 85 12 39
................85
............68
........64
................55
............50
....49
............40
................39
........36
............24
................20
....................12
=============================================================
Fibonacci Sequence Programming
홍익대학교 컴퓨터공학과 3학년 A511151 ***
=============================================================
Input the number : 5
0 1 1 2 3 5
========================================================
QuickSort Algorithm
홍익대학교 컴퓨터공학과 3학년 A511151 ***
========================================================
임의의 숫자 12개를 입력 하세요 :D
0 56 19 80 58 47 35 89 82 74 17 85
정렬이 되었습니다 :D
0 17 19 35 47 56 58 74 80 82 85 89
==============================================================
Dijkstra Algorithm (Shortest Paths)
홍익대학교 컴퓨터공학과 3학년 A511151 ***
==============================================================
1번 노드로 부터 10번 노드까지 가는 최단 거리 Dijkstra Algorithm
1 -> 2 -> ... -> 10
=========================================================
Hanoi tower Algorithm
홍익대학교 컴퓨터공학과 A511151 ***
=========================================================
input board number : 3
board 1 [1->3]
board 2 [1->2]
board 1 [3->2]
board 3 [1->3]
board 1 [2->1]
board 2 [2->3]
board 1 [1->3]
[sungdh86@localhost hw]$

'컴퓨터' 카테고리의 다른 글

이것이 프로그래밍언어를 배워야 하는 이유군요. -_-;;  (12) 2007.05.16
Prolog 설치 및 평  (4) 2007.05.15
JAVA의 문법이 이상한가?  (5) 2007.04.02
[site] ANSI C Yacc grammar  (1) 2007.03.27
Perl  (2) 2007.03.17
Buy me a coffeeBuy me a coffee
이번에 책에 있는 Algorithm Psudocode를 C/C++/JAVA/Perl로 구현하는 재미있는 일을 했습니다.

그런데 JAVA에서 예상치도 못한 일들이 일어났다지요 -_-;;
JAVA에서 무슨 일이 났는지 컴파일을 하면 계속 에러를 냅니다 -_-;;
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at ex2.bin2(ex2.java:54)
at ex2.main(ex2.java:20)


이 에러는 배열의 Index에 -1을 참조했기 때문에 에러를 내면서 종료한다는 에러입니다.

C, C++, Perl에서도 비슷한 알고리즘을 썼는데 JAVA와 비교를 했죠.
C/C++의 경우

 41 int bin2(int n, int m)
42 {
43 int i, j;
44 int Bin2[n+1][m+1];
45 for(i = 0; i<= n; i++)
46 for(j = 0; j<= min(j, m);j++)
47 if(j == 0 || j == i)
48 Bin2[i][j] = 1;
49 else
50 Bin2[i][j] = (Bin2[i-1][j-1] + (2 * Bin2[i-1][j]));
51 return Bin2[n][m];
52 }


Perl의 경우

 24 sub bin2
25 {
26 my ($n, $m) = @_;
27 # Use array
28 my @B;
29 for(my $i = 0; $i <= $n; $i++)
30 {
31 for(my $j = 0; $j <= min($j, $m); $j++)
32 {
33 if($j == 0 || $j == $i)
34 {
35 $B[$i]->[$j] = 1;
36 }
37 else
38 {
39 $B[$i]->[$j] = $B[$i-1]->[$j-1] + (2 * $B[$i-1]->[$j]);
40 }
41 }
42 }
43 return $B[$n]->[$m];
44 }

JAVA의 경우

36     public static int bin2(int n, int m)
37 {
38 int [][]Bin2 = new int[n+1][m+1];
39 for(int i = 0; i<= n; i++)
40 for(int j = 0; j<= min(j, m);j++)
41 if(j == 0 || j == i)
42 Bin2[i][j] = 1;
43 else
44 Bin2[i][j] = (Bin2[i-1][j-1] + (2 * Bin2[i-1][j]));
45 return Bin2[n][m];
45 }


같은 알고리즘을 써서 컴파일을 했는데 C/C++/Perl에선 정상 값이 나오고 JAVA에서는 예외처리를 하니 참 어이가 없었죠.,
제 생각에 JAVA가 엄격한지 소스를 꼼꼼히 보았습니다.

i = 0일때 만약 j = 0이면 if(j == || j == i)라면 빠져나가야 합니다. 여기서는 문제 없는 듯 합니다.
i = 0일때 만약 j = 1이면 else구문을 실행하여 Bin2[0][1] = Bin2[-1][0] + (2 * Bin2[-1][0])을 실행해야 합니다.
그런데 min함수를 써서 return값이 작으면 for문이 j값을 증가시키지 않고 빠져나가게 합니다.

C/C++/Perl에서는 책에 있는 알고리즘을 그대로 써도 min값이 return되어서 상관 없는데 JAVA는 책에 있는 알고리즘이 잘못된 배열 참조한다는 것을 알아내서 예외처리를 하는 것을 보니 JAVA에서 for문 안에서 min함수 return값을 못알아 먹는 것 같아서 짜증이 나군요.

JAVA에서 이 알고리즘이 제대로 작동되지 않은 것 같아서 이런 꼼수를 썼습니다.

 36     public static int bin2(int n, int m)
37 {
38 int [][]Bin2 = new int[n+1][m+1];
39 for(int i = 0; i<= n; i++)
40 for(int j = 0; j<= min(j, m);j++)
41 if(j == 0 || j == i)
42 Bin2[i][j] = 1;
43 else if (i == 0)
44 break;
45 else
46 Bin2[i][j] = (Bin2[i-1][j-1] + (2 * Bin2[i-1][j]));
47 return Bin2[n][m];
48 }

i = 0일때 안의 for문을 무조건 빼지게 하였더니 C/C++/Perl과 같은 값이 나왔습니다.
이거 C/C++/Perl에서는 JAVA와 다르게 오류없이 돌아가는 것을 보니 왜그런 것일지 궁금하군요.

JAVA가 for문 안에서는 함수를 콜해서 return 값을 받아들이지 못하는 것 같아서 짜증이 나군요. C/C++/Perl에서는 아무런 문제가 없는데 말이죠.

컴퓨터프로그래밍 언어를 배우면 배울수록 궁금한것 투성인것 같네요,

'컴퓨터' 카테고리의 다른 글

Prolog 설치 및 평  (4) 2007.05.15
Pascal과제 기록  (3) 2007.04.14
[site] ANSI C Yacc grammar  (1) 2007.03.27
Perl  (2) 2007.03.17
이런 언어들을 익숙하게 쓸 수 있을까?  (6) 2007.03.10
Buy me a coffeeBuy me a coffee
프로그래밍 언어시간에 Parsing 구문 배우다가 여기까지 손을 뻗치게 되었다.
ANSI C Yacc grammar

어셈블리 언어를 배우면서 C언어가 매우 편한 언어라는 것을 알게 되었고 프로그래밍언어 시간에 구문 Parsing하는 것을 배우니까 C언어 만드느라 고생하신 분들께 감사의 말씀을 전한다.

'컴퓨터' 카테고리의 다른 글

Pascal과제 기록  (3) 2007.04.14
JAVA의 문법이 이상한가?  (5) 2007.04.02
Perl  (2) 2007.03.17
이런 언어들을 익숙하게 쓸 수 있을까?  (6) 2007.03.10
VirtualPC 2007 BETA로 Linux설치하기(1) - 프로그램 설치  (4) 2007.02.09
Buy me a coffeeBuy me a coffee

Perl이란


Perl은 1986년경 (내가 태어난 연도-_-;;) Larry Wall이란 사람에 의해 개발되었음
원래는 UNIX상에서 이용하는 프로그래밍언어로 개발되었지만 현재는 대부분의 OS에서 이용할 수 있으며 「Practical Extraction and Report Language」(실용적 데이터 추출과 리포트 작성을 위한 언어)의 약자이다.

Perl은 인터프리터 방식의 언어로서, 프로그램을 기술한 후 바로 실행할 수 있습니다. C언어나 C++, JAVAㅗ아 같이 컴파일(기계어로 변환하는 작업)을 할 필요가 엇는 것입니다. 따라서 컴파일이 필요없는 프로그래밍 언어를 스크립트언어라고 하기 때문에, Perl로 기술된 프로그램을 「Perl Script」라고도 합니다.

Perl의 특징

인터프리터 방식의 언어
컴파일러 방식의 언어는 소스 프로그램을 기계어로 일괄적으로 변환(컴파일)한 다음에 실행할 수 있습니다. 하지만 인터프리터 방식의 언어는 컴파일 하는 과정을 거치지 않고 기계어로 변환하면서 실행할 수 있습니다. 실행 속도는 컴파일러 바익이 빠르지만, 인터프리터 방식은 컴파일 과정이 줄어 번거롭지 않다는 장점이 있습니다.

강력한 텍스트 처리 기능
문자열을 변환하고 추출하는 텍스트 처리 기능이 충실합니다. 정규 표현에 의한 검색·치환도 수행할 수 있어, 더욱 복잡한 텍스트 처리가 가능합니다.

기술하기가 용이
기술 방식이 C언어와 비슷하여 기호적입니다. 따라서 처음 접하는 사람들은 조금 어려울 수도 있지만, 한번 알아두면 간결하며 기술하기 쉽다는 것을 알 수 있습니다. 그리고 C언어와 비교해 볼 때 좀더 유연성이 많은 것도 특징입니다.


Perl은 비교적 기술하기 쉬운 언어이며, CGI에서 많이 쓰고 있습니다..

이번에 프로그래밍언어 시간에 Perl로 과제를 부여했는데 Perl이란 언어는 PHP와 C, 쉘 스크립트를 조금 알면 금방 배울듯한 언어 같다.
C언어보다 생산성이 빠른 것 같으며 PHP와 같이 배우면 금방 써먹을 수 있는 것이 매력이다. 작업의 효율을 높일수 있는 스크립트 언어라고 할까요?
(다른 분들께서는 Perl에 헤멘다는데 -_-;;)

근데 Perl을 언어라 보기는 좀 그런 감도 있다만 (Compile언어가 아니라서), 그래도 C언어로 짜기엔 시간이 아까운 프로그램 짤때는 쓸만할 것 같다. :D
Buy me a coffeeBuy me a coffee
이번에 쓰는 Linux 중에서 Fedora Core 6에서는 vi환경설정이 안된 까닭에 ㅠㅠ
C언어 코딩하다가 정말 짜증 이빠이였다.
자동으로 들여쓰기도 안되고 문법강조하는데 색깔도 넣어지지도 않고 등등 아주 불편하였다.
인터넷에 찾아보고 삽질을 하였다.
역시나 Linux는 삽질인가??

레드햇 계열에서는 vi의 설정 파일은 /etc/vimrc 파일과 홈 디렉토리의 .vimrc 파일이군요.
UBUNTU랑 달라서 또 난감하네요. 한 곳에만 익숙해지니 영

아래는 /etc/vimrc나 .vimrc 파일에 추가할 내용입니다 :D
set autoindent " 자동으로 들여쓰기를 한다.
set cindent " C 프로그래밍을 할때 자동으로 들여쓰기를 한다.
set smartindent " 좀더 똑똑한 들여쓰기를 위한 옵션이다.
set textwidth=79 " 만약 79번째 글자를 넘어가면
set wrap " 자동으로 를 삽입하여 다음 줄로 넘어간다.
set nowrapscan " 검색할 때 문서의 끝에서 다시 처음으로 돌아가지 않는다.
set nobackup " 백업 파일을 만들지 않는다.
set visualbell " 키를 잘못눌렀을 때 삑 소리를 내는 대신 번쩍이게 한다.
set ruler " 화면 우측 하단에 현재 커서의 위치(줄,칸)를 보여준다.
set tabstop=4 " Tab을 눌렀을 때 8칸 대신 4칸 이동하도록 한다.
set shiftwidth=4 " 자동 들여쓰기를 할때 4칸 들여쓰도록 한다.

아래는 한글을 제대로 처리하기 위해 필요하다.
if $LANG[0] == `k' && $LANG[1] == `o'
set fileencoding=korea
endif

터미널이 xterm-debian 혹은 xterm-xfree86일 경우 컬러를 사용한다.
if &term =~ "xterm-debian" || &term =~ "xterm-xfree86"
set t_Co=16
set t_Sf=^[[3%dm
set t_Sb=^[[4%dm
set t_kb=^H
fixdel
endif

"문법 강조 기능을 사용한다.
if has("syntax")
syntax on " Default to no syntax highlightning
endif

'컴퓨터 > Linux' 카테고리의 다른 글

Debian 설치 삽질을 했다.  (2) 2007.07.16
Ubuntu에서 Kernel분석할때 까는 프로그램들  (2) 2007.07.13
SPmachine 엄청 무겁군요.  (3) 2007.03.08
Cygwin 설치 중  (4) 2007.01.29
솔라리스 서버의 반란?  (4) 2006.11.25
Buy me a coffeeBuy me a coffee
세상에 있는 모든 컴퓨터언어를 배울수 있을까?
이번에 3학년 전공필수인 프로그래밍언어과목에서 S모 교수님께서 여러가지 언어를 과제로 부여한다고 하셨습니다.
(S모 교수님은 모 과목에서 F를 78%씩이나 부여하신 유명하신분 -_-;;, 맡는 과목마다 말이 안좋기로 유명합니다.)

S모 교수님 수업 기피할려다가 전공 필수라 어쩔수 듣기는 하였는데 의외로 재미있더군요. -_-;;
과제의 압박은 어쩔수 없을듯
교수님이 3가지 언어를 가지고 과제 부여한다던데 아는 언어 있으면 손들라고 했다.
1. Perl (알아서 손 들었음. 약간 만지작 하는 정도?)
2. Pascal (이런 이름만 들어본 고전 언어를 -_-;;)
3. Prolog (이건 어디에 쓰는 언어지고?)

그리고 수업시간 도중 LISP를 과제로 낸다고 한다. (LISP 설명서는 집에 있다 히히)

프로그래밍언어 시간에 배우는 언어들을 보면 다들 고전언어이다. 그러나 이런 언어들은 C/C++, JAVA랑 비슷하여 금방 습득을 할수있을 듯 하다.
생전 처음듣어본 Prolog나 LISP정도는 어떻게 숙제해야할지 난감하고 Perl이나 Pascal 정도는 금방 해낼 듯 하다.

이런 언어들은 난생 쓰는 것이라서 어떻게 숙제할지도 막막하고, 내가 익숙하게 쓴 언어랑 유사한 점이있어서 할수 있을듯 하고 등등

익숙하게 쓴다고 하면 익숙하게 쓸 것 같은데 언제 빨리 익숙해지냐가 관건이다. 1학기만에 Perl, Pascal, Prolog, LISP, Ada등등의 컴퓨터 언어들에 익숙해질지 궁금하다.
(예전에는 Ada같은 엄청난 고전언어를 숙제로 내서 GG치신 분들이 한두명이 아니라는 ㅠㅠ)

이렇게 배우다간 모든 컴퓨터 언어들을 다 배우게 생겼다 ;ㅁ;

'컴퓨터' 카테고리의 다른 글

[site] ANSI C Yacc grammar  (1) 2007.03.27
Perl  (2) 2007.03.17
VirtualPC 2007 BETA로 Linux설치하기(1) - 프로그램 설치  (4) 2007.02.09
LAN 선 조립 방법  (4) 2007.02.03
마비노기 CM으로 보는 컴공과의 생각  (4) 2007.01.31
Buy me a coffeeBuy me a coffee

+ Recent posts