Programming/C,C++2011.10.31 17:28
C++ 과 C 등 언어를 혼용해 사용할 경우 이부분은 C로 컴파일하라고 지정해 주는 키워드.

extern "C" int sum(int a, int b){
    return a+b;
}

신고
Posted by 초프(초보 프로그래머)
TAG C, CPP, extern
Linux Server2010.04.03 19:28
리눅스 콘솔에서 컴파일할때 pthread를 사용하였을때 이런 오류가 뜬다.

undefined reference to `pthread_create'
undefined reference to `pthread_join'


해결 방법은 옵션 2가지를 넣어주면 됩니다.

-D_REENTRANT -lpthread

ex) gcc test.c -o test -D_REENTRANT -lpthread
신고
Posted by 초프(초보 프로그래머)
Programming/C,C++2009.08.04 21:41

random값을 가져오는 함수는 stdlib.h 안에 있는 rand() 함수이다.

0부터 RAND_MAX 까지의 값중에 하나를 return 한다고 한다.

이 함수만으로 프로그램을 만들게 되면 항상 같은 random값이 나오게 된다.

random 값이 저장되어있는 곳에서 하나씩 차례대로 가져오는 함수가 rand() 함수이다.

srand() 함수는 seed라는 값으로 random값이 저장되어있는 곳의 시작위치를 지정할수 있다.

srand() 함수를 사용해도 seed값이 항상 같으면 같은 random값이 나오게 된다.

srand((unsigned int)time(NULL));

이렇게 사용하므로써 실행되는 시간에 따라 seed값을 바꿔주면 항상 다른 random 값이 나오게 된다.

srand() 를 사용하려면... stdlib.h 와 time.h 가 필요하다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main(){
	srand((unsigned) time(NULL));
	printf("%d\n",rand());
}


여러번 실행해보면 실행할때 마다 다른 값이 나오는 것을 알수 있다.

검색을 하다보면 srand 대신 randomize() 를 사용하라는 말이 있다.

이것은 다음과 같다.

#define randomize() srand((unsigned) time(NULL));

그런데 VS2005, VS2008 을 사용할때 해보니 없다고 나온다. 그래서 결국 srand를 사용하였다....;

다음은 쓸려고 만들어 놓은 간단한 랜덤 함수;;

/*
 * 초기 랜덤값 위치 설정
 */
void randomize(){
	srand((unsigned int)time(NULL));
}
/*
 * 랜덤값 가져오기
 *
 * @param	int	최소값
 * @param	int	최대값
 * @return	int	랜덤값
 */
int random(int min, int max){
	return (rand() % (max - min + 1)) + min;
}

신고
Posted by 초프(초보 프로그래머)
중대 컴공2009.03.22 17:07



학번 두개를 가지고 다항식을 하나만든다. 이렇게 만든 두개의 다항식으로 곱셈을 한다.

과제가 다항식의 곱셈이었지만 어느새 다른부분이 더욱 집중이 되어버린;;

그 다른부분중 하나가 addTerm(zeroP(),3,2) 이런 부분이다.

zeroP() : 빈 다항식 배열을 만들어서 주소를 리턴
addTerm() : 다항식 배열에 계수와 차수를 저장한다.

다항식을 만들때 이렇게 함수를 사용하여 만들었음
출력은 다항식이 만들어지는 과정과 곱한 결과가 나오게 하였음.


학번 두개로 다항식을 만든 규칙은 첫번째 학번을 정렬을 하여 20075278 을 87752200 으로 만든다.
그리고 두번째 학번에서 0을 제외한 숫자들을 계수로 한다. 20075277을 275277을 계수로 한다.
그래서 다항식 2X^8 + 7X^7 + 5X^7 + 2X^5 + 7X^2 + 7X^2 을 만든다.
차수가 같은것은 더해주므로 2X^8 + 12X^7 + 2X^5 + 14X^2 이 된다. 이렇게 두개를 만드는 것이다.

 // 빈 다항식
 poly = zeroP();

 // 계수와 차수를 이용해서 다항식을 만든다.
 for(i=0; i<MAX_SIZE; i++)
 {
     if(!rank[i]) break;
     poly = addTerm(poly,rank[i],degree[i]);
 }


이 부분이 다항식을 만들어 주는 과정이다. 위에 규칙으로 만들어진 차수와 계수는 degree, rank배열에 저장된다.
두 배열을 가지고 다항식을 만들어주는 것이다.

정렬은 총 3번이 들어갔다. 당항식을 만들때 각각 한번씨 쓰고 마지막으로 곱셈결과를 정렬할때 한번 쓰인다.
정렬 알고리즘은 알고리즘 시간에 배웠던 삽입정렬을 사용하였음.

곱셈 알고리즘은 일반 손으로 계산할때 하는 방식으로 하였습니다;; 비효율적일수도 있지만;

신고
Posted by 초프(초보 프로그래머)
Programming2009.03.19 18:42

QuickSort 의 시작은 임의의 수를 pivot 이라고 정하면서 시작된다.

int data[] = {6, 9, 14, 4, 7, 3, 1, 10};

이런 값들의 List 가 있을경우 6을 pivot을 정한다고 가정하면 j가 [1]~[7] 으로 움직인다고 하자

그리고 i=0 으로 초기화 되어있다. 그럼 j는 1부터 커지면서 pivot 인  6보다 작은 수가 있는지 찾는다.

만약 작은 수가 있는 j를 발견하면 ++i 와 j를 바꾼다. data[++i] 와 data[j] 를 바꾸는 것이다.

그럼 처음으로 바뀌는 번호가 4와 9가 된다. j는 3 이고 i는 ++i가 되어서 1인 경우이다.

이렇게 반복해서 [7]까지 가면 pivot, pivot >  x, pivot < x 이와 같은 순서로 놓이게 된다.

그럼 pivot 위치를 중간에 높이게 하면된다. 이때 쉽게 바꾸는 방법은 위에서 사용한 i를 쓰면 마지막으로

작은 수를 옮긴 위치를 알수 있기때문에 한번에 바꿀수가 있다

QuickSort를 c언어로 작성하여 첨부파일에 포함하였다.
신고
Posted by 초프(초보 프로그래머)
Programming/JAVA2009.03.18 20:47

 이건 자바에만 해당되는 개념이 아니다. 거의 모든 객체지향 언어에서 사용되는 개념일 것이다.

오버로딩(overloading) - 메소드 이름이 같고 매개변수의 수나 타입이 틀린것이다.
     int sum(int a, int b);
     int sum(float a, float b);

     이런것이다. 컴파일시 매개변수의 갯수와 데이터타입에 따라서 함수명을 바꿔준다고 한다. 자바에만 해당되지는 않을 것이다.

오버라이딩(overriding) - 상속에서 부모클래스의 메소드를 하위메소드에서 재정의 하는것이다.

class Father
{
     void sayName()
     {
          System.out.print("My name is brown");
     }
}
class Son extend father
{
     void sayName()
     {
          System.out.print("My name is mike");
     }
}


상위 클래스인 Father에 있는 sayName() 메소드를 하위 클래스인 Son에서 재정의 하는것입니다.
만약 다음과 같이 실행하게 되면 "My name is mike" 가 출력될것이다.

class test
{
     public void static main(String args[])
     {
          Son son = new Son();
          son.sayName();
     }
}


이와 같이 하위클래스에서 상위클래스의 메소드를 재정의하는 것을 오버라이딩이라고 한다.

신고
Posted by 초프(초보 프로그래머)
Programming/C,C++2009.03.18 01:00
 배열을 사용하다가 함수에 넣을때가 있다. 이부분에서 부터 문제가 생긴다. 도대체 어쩌란 말인가~~~

int ABC = {1,2,3};
printf("sum : %d\n",sum(ABC));


이게 원하는 코드이다.
함수부분을 보면 다음과 같이 사용하면 된다.

int sum(int data[]) 또는 int sum(int *data) 이렇게 하면 된다.

물론 차이는 있다. data[] 이렇게 쓰면 값복사를 하는것이다. 함수안에서 data라는 배열이 새로 생기는 것이다.
*data 포인터로 사용하면 배열의 주소만 넘겨 받는다. 그러므로 함수안에서 배열의 값을 변경할수 있다.

여기까지는 간단하게 1차원 배열을 넘기는 방법을 설명한거고
2차원 배열을 넘기는 방법은 조금더 복잡하다.

int sum(int dataA[][])

이렇게 하면 오류난다.;;

int sum(int data[][2]) 또는 int sum(int (*data)[2]) 이렇게 두가지 방법이 존재하는것 같다.

이것도 마찬가지로 앞에 부분은 값복사이고 두번째것은 포인터로 넘긴것이다.
그리고 또 하나 생각해볼수 있는것이 있는데.. 그건 이중포인터이다.

int sum(int **data)

이와 같은 방법으로 하면 오류난다... -_-;
이게 아직 정확히 이해하지 못한 부분이네요;;

malloc를 이용하여 2중포인터 배열을 만들경우 저런 식으로 사용이 가능하다.
하지만 일반 배열을 **data로 넘기는 것은 불가능하다.

이건 좀더 알아봐야 할것 같다.
신고
Posted by 초프(초보 프로그래머)
Programming/C,C++2009.03.16 21:07

 기본 사용법은  C++ 사용법과 같다. 틀린점이라면 소스파일의 확장자를 cpp가 아닌 c로 하는것이다.
혹시나 해서 확장자를 cpp, c 두가지를 같은 소스로 테스트해보았습니다.

[테스트 소스]
#include<stdio.h>

struct Person{
 int height;
 int weight;
};

int main(){
 Person a;

 return 1;
}


[확장자 cpp의 빌드 결과]


[확장자 c의 빌드 결과]

오류의 원인은 C에서는 구조체를 사용할때 struct Person a; 라는 방법으로 사용해야하며 cpp 는 Person a; 라고 사용한다.

[수정후 확장자 c의 빌드 결과]

결론은 확장자에 따라서 C로 컴파일되고 C++로 컴파일된다는 것이다.
신고
Posted by 초프(초보 프로그래머)
Programming/C,C++2009.03.13 01:20

비주얼스튜디오6 에서는 실행하고 나서 끝날때 잠시 멈추는거 같았는데...

비주얼스튜디오2005 에서는 그런게 없어진거 같다; 그냥 바로 창이 닫혀버린다;;

그래서 찾아본 결과 이런 방법이 있었다;

#include<stdlib.h> 이건 필히 추가해놓아야 한다

system("pause"); 이부분이 잠시 멈추는 부분이다;

위에 나온걸 이용하게 되면 다음과 같은 글이 나오면서 잠시 멈추게 된다

"계속하려면 아무키나 누르세요...."

신고
Posted by 초프(초보 프로그래머)
Programming/C,C++2009.03.06 22:52
비주얼 스튜디오 2005 이상을 사용할때

scanf 같은 함수를 사용할때 지정된 범위의 메모리 영역을 오버해서 위험하다 어쩌다 뭐 그런 내용이라는...

무시하고 그냥 scanf를 써도 되고

아니면 scanf_s 함수를 사용해도 된다고 한다.

[MSDN]
int scanf_s(const char *format [,argument]...);

[Example]
scanf_s("%d %d", &kor, &eng);


신고
Posted by 초프(초보 프로그래머)