독하게 시작하는 C 제10장 함수에 대한 기본 이론 독하게 시작하는 C 강의.

함수 -> 무엇을 함수로 만들지?, 왜? -> 기준 : 설계. 대원칙 : UI와 기능을 분리.

main() -Caller(호출자)
{
puts() - Callee(피호출자)
}

함수 int main(void)
int : 반환형식(정수형으로 반환)
main : 함수의 이름. 본질은 메모리의 주소.
(void) : 매개변수 목록을 채워넣어야 함.(여기서는 void 빈상태)

#include <stdio.h>

int Add(int a, int b){ // 함수 시그니처. 함수 원형.(매개변수는 형식 일치하더라도 (int a,b)이런식으로 못씀.)

int a; // 에러 : 매개변수에 같은이름의 변수 있기 때문에.

}

#include <stdio.h>

int Add(int a, int b){ 
int nResult;
nResult = a+b;
return nResult;
}

int main(void) //무조건 main함수가 프로그램의 시작이다.
{
int nResult = 0;
nResult = Add(3,4);
printf("%d\n",nResult);
return 0;
}

main() -> Add(변수)(main함수에서 Add함수 이용할때)

1. Add 형식인수 자리에 실인수 값으로 기술(형식에 맞게 기술한다.)
2. main함수에서 Add함수를 call 한다.
3. Add함수에서 값을 main함수로 반환.

nResult = Add(3,4)
Add는 피연산자(함수호출연산자의)임. 괄호가 함수호출 연산자. 

반환형 : 연산의 임시결과와 같다.
nResult = Add(3,4)
변수에 저장 안하면 사라짐.

최대, 최소 구하는 함수

#include <stdio.h>

int GetMax(int a,int b,int c){
int max=a;
if(max<b) max=b;
if(max<c) max=c;
return max;
}

******매개변수 유효성(적합한지 검사) ->Callee가 함
비유
제작자(Callee인 함수) -> 제품 -> 사용자.(main함수(caller))
사용자는 공부 많이하는 것을 싫어하고 직관적으로 이해하길 바람.
그러므로 제작자가 그 환경을 조성해 줘야 한다.

키보드 입력 -> S/W P/G -> 출력.

MENU. 제대로 입력할 수 있게 도와줌.

메뉴 이벤트 루프 중요!!
메뉴선택 -> ㅁ -> 처리.

DRY : 같은 일을 수행하는 코드가 중복되지 않도록 하라.

코드 분할 ㅁ->ㅁ 코드끼리 call 하도록 연결하면 되니까 구조가 복잡하면 분할해라.

******함수의 원형 선언

int Add(int, int); // 변수는 안적어도 무방(원형 선언시), 세미콜론 주의!
이렇게 선언하고 맨 마지막에 함수의 구조를 적으면 된다. 이런 함수가 사용된다는 것을 알아보기 쉽게 하기 위한 것

전역변수

#include <stdio.h>

int g_nData=0;

int Add(int, int);

int main(void){
printf("%d\n",g_nData);
Add(0,0);
printf("%d\n",g_nData);
return 0;
}

int Add(int a, int b){
int g_nData=0;
int nResult;
nResult = a+b;
g_nData=100; //함수의 리턴값만 이용하는 게 아니라 안의 구조도 이용가능하다는 것!!
return nResult;
}

출력 값 : 
0
100
출력 값 :
0
0
이유는 Add함수 내에서 선언된 g_nData값이 0에서 100으로 변하고 그 값은 스코프가 닫히면서(함수가 끝나면서) 사라졌기 때문.

coding convention. 코딩하는 규칙 매우 중요. 스스로 정해두고 해야한다!!

독하게 시작하는 C 제9장 - 배열을 활용한 프로그래밍 기법 독하게 시작하는 C 강의.

자리교환 매번 : 버블정렬
index를 지정해두고 자리교환 1번 : 선택정렬 .
버블정렬이나 선택정렬이나 비교횟수가 동일함.(후짐)
헷갈리면 메모리를 그려보면 된다(ㅁㅁㅁㅁㅁㅁㅁㅁㅁ)

Quick sort가 평균 정렬속도가 가장 빠름.

선택정렬 : 
for(i=0;i<4;i++){
nIndexMin=i;
for(j=i+1;j<5;j++){
if(aList[nIndexMin]>aList[j]){
nIndexMin=j;
}
}
if(i!=nIndexMin){
nTmp=aList[i];
aList[i]=aList[nIndexMin];
aList[nIndexMin]=nTmp;
}
}

배열과 교차의 구현. 방향 > < . 기준, 근거에 따라.
기법 3가지 !
1. 순방향, 역방향 채우기.
#include <stdio.h>

int main(void){
int aList[5][5]={0,};
int i=0,j=0,nCounter=0;
for(i=0;i<5;i++){
//짝수 행
if(i%2==0){
for(j=0;j<5;j++){
//순방향
aList[i][j]=++nCounter;
}
}else{
//홀수 행
for(j=0;j<5;j++){
//역방향(마치 보수를 취하듯.)
aList[i][4-j]=++nCounter;
}
}
}
//배열 출력
for(i=0;i<5;i++){
for(j=0;j<5;j++){
printf("%d\t",aList[i][j]);
putchar('\n');
}
}
}
2.1씩 누적하면 1씩 증가(홀수행 초기값 i*5) -1씩 누적하면 1씩 감소.(짝수행 초기값 (i+1)*5+1;)
3.flag이용.
// 이 3가지 책 참고하시오!!!!!! 매우 중요 실제로도 사용됨!

Look up table.(룩업테이블)

경우가 증가하면 배열의 크기 증가(다 나열해야 하므로)
index가 계산으로 선택가능하게 만들면 바로 선택 가능 3개든 30000만개든 선택하는 시간 같다.
따라서 메모리는 많이 차지하더라도 성능 증가.


독하게 시작하는 C 제8장 배열 독하게 시작하는 C 강의.

배열 : 아파트
변수 : 단독주택.

int aList[5]

밑줄 쳐진 것만 자료형 int[5]라고만 써줘도 sizeof에서는 상관없다.
sizeof(int[5])와 sizeof(aList)와 같다.

index는 번호. ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ
첫번째 이 0, 두번째 이 1, 이때 0과 1이 index(인덱스)

변수의 이름 : 식별자.
변수는 메모리로 구현됨.
이름, 메모리(번지), 값.

배열의 이름은 그자체로 주소. 배열의 선두번지를 가리키는 포인터 상수.
기준(배열의 선두번지)에서 상대적으로 얼마나 떨어졌는지로 위치를 표현함.
참고 : &aList +1이라고 쓰면 배열 전체 끝에서 1 더한것. aList +1이라고 해야 aList[1]을 나타내는 것이 된다.

int *pData=aList;
번지는 포인터에 담는다. &aList, aList 어느 것으로 받는지가 중요.(????)
ㅁㅁㅁㅁ(aList의 선두번지)
ㅁ를 나타내는 것이 번지 0x0012FF80이나 aList나 값은 똑같으나 내부 속까지 같은 것은 아니다.
'A'가 65라고 말할 수는 있으나 65가 'A'라고 말할 수 없는 것과 같음.(해석하는 방법에 따라서 'A'일 수도 아닐 수도 있으므로)

char szbuffer[6]="Hello"( NULL('\0')이 있으므로 최소 6으로 받아야 한다.)
배열 크기 정할때 넉넉하게!
문자열 + 가변 길이
'\0'(NULL)은 문자열의 끝을 의미. 채워진 영역과 그렇지 않은 영역의 경계.

다차원 배열 : 배열의 배열.
논리적으로는 2차원이어도 메모리 구조는 같음.
char[3][4]와 char[12]는 메모리 구조 완전 동일.

int main(){
int aList[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int nTotal=0;
int i;
for(i=0;i<12;i++){
nTotal+=aList[0][i];
}
printf("%d\n",nTotal);
}

1 2 3 4 5 6 7 8 9 10 다음