반응형

전체 글 209

공업수학 요점정리 #18 - 선형대수학(Linear Algebra) - 행렬식(Determinant)

Permutation. 순열 모든 순서의 경우의 수를 따져서 한수의 뒤의 수가 더 작은 수인 회수들을 합한 함수 이게 뭔소리냐??? 12345를 25143으로 뒀을 때, permutation $p$의 값은? 2의 오른쪽에서 2보다 작은 수 1개 5의 오른쪽에서 5보다 작은 수 3개 1의 오른쪽에서 1보다 작은 수 0개 4의 오른쪽에서 4보다 작은 수 1개 따라서 $p = 5$이고, 홀수이기에 이를 odd permutation이라고한다. 이 때 $\sigma (p)$가 even permutation이면 1이고, odd permutation이면 -1이다. Determinant의 Definition (별로 안중요하다.) $det(A) = |A| = \Sigma_{p} \sigma (p)a_{1p(1)}a_{2..

[C Language] The C Programming Language - Increment, Decrement, Bitwise Operator(증감연산자, 비트연산자)

2.8 Increment and Decrement Operators ++n은 해당 라인이 동작하기 전에, n++는 해당 라인이 동작한 후에 작동한다. (i + j)++과 같은 코드는 illegal하다. 오직 하나의 variable에 대해서만 성립하는 연산자이다. 증감연산자를 통해 코드를 간결하게 만들 수 있다. 아래는 string에서 문자하나를 모두 없애는 함수이다. void squeeze(char s[], int c){ int i,m j; for(i = j = 0; s[i] != '\0'; i++) if(s[i] != c) s[j++] = s[i]; // j++; 안해도 된다. s[j] = '\0'; }strcat()이라는 두 string을 연결하는 함수를 예로 들면 아래와..

[C Language] The C Programming Language - Type Conversion, Type Casting(타입 컨버전, 타입 캐스팅, 자료형 변환)

Chap.2 : Types, Operators, and Expressions 2.7 Type Conversion(자료형 변환) 연산에 의한 자료형 변환 operator의 두 operands가 타입이 다르면 보통 narrow한 type이 wider한 type으로 변환된다. float형 변수를 subscription으로 쓰는 등의 말도안되는 conversion은 에러를 일으킨다. long -> short, float -> integer type으로의 변환 등 정보가 삭제되는, truncation이 일어나는 자료형은 컴파일러에서 warning을 내보내지만 error가 되지는 않는다. 주의 해야할 것 중 하나는 int s = '0'은 에러가 아니라는 것이다. string은 character과 다르..

행렬 계산기 개발하며 배운 것 - Call by value, Call by Reference, 등가포인터, 다차원배열 등...

구조체 선언 시에는 초기화가 불가능하다. visual studio에서는 가능했었던 것으로 기억하는데, GCC를 이용해서 컴파일 할 때에는 이게 안된다. 참고할 만한 링크 https://www.linuxquestions.org/questions/programming-9/gcc-error-%91foo%92-has-no-member-named-%91bar%92-877951/ 함수(기능)별로 구분하고 그에 해당하는 기능들을 하나씩 추가해서 테스트 우선해보는 방식으로 작성하는 것이 좋다. Call by value, Call by reference를 구분해야만한다. C언어는 공식적으로 Call by value만을 지원한다. 그리고 Call by reference를 pointer를 통해서 흉내낸다. 다른 언어보다 C..

행렬 계산기 개발 일지 - 8

남은 자료형에 의한 에러, indices의 쓰레기값 미관리에 의한 에러, call by pointer 문제까지 모두 해결하였다. 텍스트를 행렬로 바꾸는기능은 어떻게 완성을 했다. 겨우 이 정도 사이즈의 프로그램이긴 하지만, 디버거를 제대로 써본적도 처음이라 뭐가 뭔지도 제대로 모르고 우왕좌왕하고 너무 정신없었다. 그리고 무엇보다 아직 언어의 이해도가 충분하지 않다는 것을 알게 되었다. call by value와 call by reference(C언어의 경우에는 pointer로 이를 대체한다.)를 구분을 못했다는 게 좀 컸던 거 같다. 그리고 다차원배열을 등가 포인터로 변환하는 것도 제대로 몰랐었고. 일단은 계산기 개발은 여기서 멈추고, C언어 자체에 대한 공부를 더 깊이있게하고, 컴퓨터구조와 운영체제 공..

행렬 계산기 개발 일지 - 7

문제가 있는 함수 를 아예 따로 때와서 디버깅을 했다. 하면서 느낀건... 함수 내부를 복잡하게 하느니, 차라리 하나의 기능에 대해서 하나의 함수를 반드시 만들자. 자료형 오류는 항상 쉽게 발생한다. 동적타이핑이 되는 언어가 아니라면 반드시 자료형에 대한 설계도 프로그래밍 전에 하자. 코드에 손대기 전에 프로그램 설계를 반드시 하자....라고 할 때 하자...라고 할 때 하자...라고 할 때 하자... 아예 test.c로 이름 붙이고 새로 작성한 함수. 아래는 디버깅 결과다. 다행히도 에러도 경고도 안뜬다. 기쁘다. #include #include #include #define TEXT_LENGTH 512 #define MATMAXNUMBER 10 #define ERRORTEST printf("no er..

어셈블리어 정리노트 4 - 조건 분기 명령어

조건분기 JZ jmp [주소] 이명령어는 무조건분기다. jz [주소]의 경우, 이전 명령이 결과가 0이면 작동한다. 예를들면 mov eax, 1 inc eax // 2 jz 401005 // 작동ㄴ dec eax // 1 dec eax // 0 jz 401009 // 작동 ㅇ 상태 레지스터 ZF(Z FLAG) 더 정확히 표현하기 위해 상태레지스터를 소개한다. CPAZSTDO 등의 1비트 상태레지스터(플래그)를 이용해 조건을 이용하는 명령어들의 동작 여부를 결정한다. JZ의 경우, Z 플래그가 1이어야 작동한다. Z플래그는 연산의 결과가 0이 되었을 때 1이 된다. 인텔 CPU 기준으로 JE는 JZ와 같은 기계어를 공유한다. 따라서 둘다 Z플래그가 1일 때 동작한다. 모든 명령어가 플래그를 바꾸는 것은 아..

어셈블리어 정리노트 3 - 주소 참조 연산자 [], 오프셋, 인덱스 (dereference, offset, index)

주소 참조 연산자 [] 주소 참조 연산자 []는 레지스터에 주소값을 넣고, 그 레지스터에 []를 써서 해당 메모리에 접근하게 한다. C언어에서 dereference 연산자 *라고 생각하면 된다. mov eax, 00402000 // mov eax, offset 00402000으로 변환된다. mov dword ptr [eax], 10 // mov dword ptr ds:[eax], 10 // output // 00402000 메모리에 10이 들어간다.mov dword ptr ds:[eax], 10에서 ds는 data segment라는 의미이다. 데이터 세그먼트에 관한 어셈블리어 지시어 다른 참고할 만한 자료 이중 괄호([[]])는 안된다. 그래서 메모리에 다른 메모리의 주소를 담아 접근하려면 이렇게 범용레..

행렬 계산기 개발 일지 - 6

컴파일 에러가 너무 심각해서 기능 구현보다 에러를 먼저 손보기로 했다. 어떻게 아직까지도 세그먼트 에러를 내는지... #include #define TEXT_LENGTH 512 #define MATMAXNUMBER 10 //matData은 행렬의 주소, *matData은 행렬의 하나의 행을 지정, **matData은 행렬의 하나의 원소(열)를 지정한다. typedef struct Matrix{ int n; int m; //행렬의 행과 열의 크기 char ** matData; //행렬의 data char * textMat; } Matrix; void initializeMatrix(Matrix matStruct); void getMatrix(Matrix matStruct); void showMatrix(Ma..

반응형