Conway's Game of Life라는 글에 올린 코드를 실행시켜보면 파일 경로를 입력하라는 창이 뜬다. 물론 파일 경로에 빈칸(space)이 들어가도 되도록 만들었다.[각주:1] scanf로는(%s를 이용한 경우) 빈칸이 포함된 string을 읽지 못하기 때문에 다른 함수를 이용해야 한다. 링크된 글의 코드에서 빈칸이 포함된 string을 읽는 함수만 가져왔다.

int locate(char loc[])
{
    int i;
    printf("File location(length at most %d):\n", maxpath);
    while(1)//loop until input is proper
    {
        for(i=0;i<=maxpath;i++) loc[i]=0;//initialize string
        gets(loc);
        if(loc[0]) break;
    }
    if(loc[maxpath]!=0) {printf("Path is too long.\n"); return 0;}
    return 1;
}

main함수에서 이 함수에 집어넣을 array의 크기를 char location[maxpath+1]으로 선언했기 때문에 에러가 나지는 않는다. 다음은 main함수의 첫 부분.

int main()//main function
{
    int i,time;
    char a[scale*scale]={},loc[maxpath+1]={}, cell[2];

...


조금 생소한(?) gets라는 함수가 하나 보이는데 이 녀석은 return(new line)이 나타날 때까지 글자를 전부 읽고 string에 저장하는 역할을 한다. 문제는 gets가 쓰이기 전에 scanf가 쓰였을 경우이다. scanf는 new line이 있으면 그 전까지만 읽기 때문이다. 아직 new line이 메모리에 남아있기 때문에 gets 함수는 newline을 읽는다. 의도치 않게 자동으로(?) 입력되어 버리는 것이다. 그걸 막기 위해서 loop를 이용했다.

이렇게 input이 꼬인다는 것도 문제이기는 하지만, 사실 가장 큰 문제는 구해 놓은 메모리보다 더 큰 정보를 저장할 때 생긴다. gets 함수를 쓰면 프로그램이 지정해놓은 공간 '밖에도' 저장이 되기 때문에 엉뚱한 정보가 날아갈 위험이 있는 것이다. 때문에 보통은 fgets 함수를 쓰는 것이 더 안전하다고 한다. 알아서 응용해 보시길 ㅇ-ㅇ
  1. "C:\my documents and settings\my documents\abc.txt" 와 같은 string을 사용자가 입력하도록 만들었다. [본문으로]

'Programme' 카테고리의 다른 글

Reversible Computation  (0) 2013.10.29
[C] Conway's Game of Life  (4) 2010.06.25
[C] Pseudorandom number generator  (0) 2010.06.14
C언어 달팽이(나선)배열  (7) 2010.04.26
Posted by 덱스터
c언어로 세포가 점차 퍼저나가는 것을 시뮬레이션하는 프로그램 짜는게 과제이다. 전체 공간의 크기는 50x50개.

세포 주변의 4칸 이상이 다른 세포로 차 있으면 그 세포는 과잉밀집으로 사망.
세포 주변의 1칸 이하만 세포가 있으면 그 세포는 고립으로 사망.
세포 주변의 2~3칸에 이웃하는 세포가 있으면 그 세포는 그대로 살아간다.
세포 주변의 3칸에 이웃하는 세포가 있으면 그 지점에 세포가 자라난다.

ex>
▒▒▒▒▒
▒▦▦▒
▒▦▦▒
▒▒▒▒▒
 
상태에서

▒▒▦▒▒
▒▦▒▦▒
▒▦▒▦▒
▒▒▦▒▒

빨간 애들은 인구밀도가 높아서 사망. 아래 녀석은 주변에 무언가 닿지 않는 한 그대로 무한정 살아간다.[각주:1]

뭐 이런 프로그램을 짜란다. 인터넷 뒤져보니 Conway's Game of Life라는 시뮬레이션인듯. 이런 종류를 가리켜 Cellular Automaton이라고 부르는 듯 하다. 흥미가 생겨서 이것 저것 찾아보았는데, 70년대부터 여러가지 이유로 유명했던 시뮬레이션인 모양이다.

단, 이렇게 세포가 배치된 모양은 세개의 외부파일로부터 불러들여오거나 무작위로 생성하도록 하는 것이 조건.

외부파일 세개를 지정하는게 귀찮아서 어떤 파일이든 주소를 입력만 하면 불러올 수 있도록 만들었다. <space>가 포함된 string을 받아오게 하는게 좀 힘들긴 했지만 어쨌든 성공... 무작위생성은 인터넷에서 난수생성 알고리즘을 참고해가며 만들었다.

마지막 상태를 파일로 출력하는 기능도 추가했는데, 돌리면서 장난치다 보니까 자기가 출력한 파일을 제대로 못 읽는 상황이 발생해서 부랴부랴 디버깅을 했다. 문제는 그랬더니 입력을 조금 이상하게 받더라는 것(...) 이번에는 문제없을거다. 한줄이 50글자가 넘어가지 않는 한...

다 제작한 뒤에 한 나흘정도 잡고 장난치고 놀면서 최대한 메모리를 적게 잡아먹고 계산이 빠르도록개선한 결과물이다. 그리고 잘못 알고 있었던 진화조건(?)때문에 부랴부랴 알고리즘을 바꾼 것도 있고.(그래도 비슷한 알고리즘들 중에서는 계산이 빠른 편일듯)




전 적절한 카피레프트를 지지합니다.

완벽하게 최적화되었다고는 못 하니까 알아서 고쳐 쓰세요 -.-;;
  1. 전에 썼던 글에서 조건을 잘못 달았다 OTL. 어쩐지 예시와는 전혀 다른 방향으로 진화하더라... [본문으로]

'Programme' 카테고리의 다른 글

Reversible Computation  (0) 2013.10.29
[C] Entering strings including <space>  (0) 2010.09.11
[C] Pseudorandom number generator  (0) 2010.06.14
C언어 달팽이(나선)배열  (7) 2010.04.26
Posted by 덱스터
대충 인터넷 뒤져가면서 만든 녀석. 그럭저럭 잘 작동하는듯...

#include "time.h"

unsigned long random(unsigned long i)//do not use 0 as seed
{
if(i && time(0)%2)
return (unsigned long)(i>>1)|(((i^(i>>10)^(i>>30)^(i>>31))&1)<<31);
else return (unsigned long)(i*1103515245+12345)%0x100000000;
}

주의할 점은 첫 seed value로 0을 넣지는 말라는 것. 위쪽 알고리즘(LCG)은 문제없이 작동하더라도 아래쪽 알고리즘(LFSR)은 0이 들어가면 0만 나온다. -_-;;

seed value로 0이 들어가도 되도록 수정. 대신에 순서가 바뀌었네...

Mersenne  twister는 써보려고 했는데 너무 길어서 포기 -_-;;;

'Programme' 카테고리의 다른 글

Reversible Computation  (0) 2013.10.29
[C] Entering strings including <space>  (0) 2010.09.11
[C] Conway's Game of Life  (4) 2010.06.25
C언어 달팽이(나선)배열  (7) 2010.04.26
Posted by 덱스터
왜인지 몰라도 하지 말라는 짓은 다 하고 있는 것 같다 -_-;;

쓰지 말라는 goto문을 활용하려는 중이고(쓰지 않아도 되지만 20byte도 안될 용량을 줄인다고...-_-;;)

절대로 쓰지 말라는 gets 함수를 string 입력에 사용하고 있고(그런데 이거 아니면 <space>가 포함된 string을 받을 방법이 없다. 확실히 불안정한 함수이긴 한데 입력문제는 루프로 해결했음.).



그것보다 좀 좋은 난수생성기 만드는 방법이 없을까?
500개 정도의 난수를 만들어서 50x50 grid에 찍어봤더니 무늬가 보인다. 점 분포가 균일하기는 한데 무늬가 보이면 난수생성기로는 낙제까지는 아니더라도 안 좋은 것 아닌가...-.-;;

int random(int i)//somehow successful, but seems to have patterns
{
srand(time(0));
if(i%2)i=(i*1103515245+12345);
else i=(i*1103515245+rand());
return (unsigned int)(i/65536)%32768;
}

지금 쓰는 난수생성기인데(인터넷에서 찾은 난수생성함수에 추가적인 난수가 들어가도록 살짝 손봤다.) 이 녀석만으로는 무늬가 너무 잘 나와서 경우를 나누어 난수생성기에 난수생성기를 두번 쓰거나 그대로 쓰거나 소수를 좀 더 더해서 쓰는 방식을 택하고 있다. 그래도 무늬가 보이는게 문제.

다음주 금요일까지 프로젝트 기간이니까 중간결과를 공개하기는 그렇고(어차피 오픈소스로 돌릴거지만 흔히 말하는 뉴스 엠바고라고 생각해 주시길..)[각주:1] 문제는 공개한다.



c언어로 세포가 점차 퍼저나가는 것을 시뮬레이션하는 프로그램 짜라. 전체 공간의 크기는 50x50개.

세포 주변의 4칸 이상이 다른 세포로 차 있으면 그 세포는 과잉밀집으로 사망.
세포 주변의 1칸 이하만 세포가 있으면 그 세포는 고립으로 사망.
세포 주변의 2~3칸에 이웃하는 세포가 있으면 그 지점에 세포가 자라난다.(살아있던 세포는 생존)

ex>

   ***
   ***

 
상태에서

   ***
  ** **
  ** **
   ***

빨간 애들은 인구밀도가 높아져서 사망. 다음에 죽을 애들을 빨간색으로 표시했다.(이웃이 넷 이상인 녀석들)

단, 이렇게 세포가 배치된 모양은 세개의 외부파일로부터 불러들여오거나 무작위로 생성하도록.
  1. 이미 프로그램의 틀은 다 짜였고 디버깅과 계산 알고리즘 개선, 용량 줄이는 작업을 수행중이다. 사실 140kb밖에 안 되는 용량이라 줄일 것도 없긴 하지만... [본문으로]

'Daily lives' 카테고리의 다른 글

뻥튀기  (0) 2010.06.16
짜증  (0) 2010.06.16
과학자가 보는 세상  (4) 2010.06.12
그러고보니 오늘(어제?) 나로호를 쏘았죠  (4) 2010.06.11
꿈꾸는 공대생  (0) 2010.06.08
Posted by 덱스터
컴퓨터 수업 과제. 과제 제출기한 종료에 맞추어 공개.

#include <stdio.h>

int main()
{
int i,j=1,k=1,l=1,n,a[19][19];
printf("n<19\?");scanf("%d", &n);
for(i=0;i<n*n;i++)
{
a[j-1][k-1]=i+1;
if(j==l&&k!=n-l+1)k++;
else if(j!=n-l+1&&k==n-l+1)j++;
else if(j==n-l+1&&k!=l)k--;
else j--;
if(j==k&&k==l){l++;j++;k++;};
}
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
{
printf("%4d", a[j][k]);
}
printf("\n");
}
return 0;
}

출력 결과

미니멀리즘은 진리. 그런데 해 놓은 것을 살펴보니까 좀 더 줄일 수 있을 것 같다. 구문 자체는 변하지 않겠지만.

'Programme' 카테고리의 다른 글

Reversible Computation  (0) 2013.10.29
[C] Entering strings including <space>  (0) 2010.09.11
[C] Conway's Game of Life  (4) 2010.06.25
[C] Pseudorandom number generator  (0) 2010.06.14
Posted by 덱스터
이전버튼 1 이전버튼

블로그 이미지
A theorist takes on the world
덱스터
Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함