728x90

 

t3.c

2014. 03. 26 수업 및 과제 


1 포인터 배열

1.1 예제

#include <stdio.h>
unsigned int Mystrlenth_max(char *);

int main()
{
  char * cpStr = "1234A";
  unsigned int uiNum;
  uiNum = Mystrlenth_max(cpStr);
  printf("%d \n",uiNum);
  return 0;
}

unsigned int Mystrlenth_max(char *cpStr)
{
  unsigned int uiCnt=0;
  
  while(0= *cpStr)
  {
    ++cpStr;
    
  }uiCnt = *cpStr;
  
  return uiCnt;  
}
  

'…™업무일지。' 카테고리의 다른 글

[smart]이재우-20140328  (0) 2014.03.28
[smart]이재우-20140327  (0) 2014.03.27
[smart]이재우-20140325  (0) 2014.03.25
[smart]이재우-20140324  (1) 2014.03.24
[smart]이재우-20140321  (0) 2014.03.21
728x90

 

2014.03.25 수업 ver1_0a.docx

2014. 03. 26 수업 및 과제 


1 배열

1.1 배열 프로그램 시 주의 할 점

    [예제]

#include <stdio.h>
int main()
{
  int arr1[3]; //
배열은 3 선언 
  arr[0]=1, arr[1]=2, arr[2]=3, arr[3]=4; //
실제 값은 4개가 입력
  return 0;
}

배열 프로그램 시 주의 사항)

컴파일 시 경고나 오류 메시지가 없음

실제 값은 4개가 입력되어 다른 메모리 영역을 침범 -> 치명적 오류 문제 발생

 

1.2 배열의 선언 및 초기화

[예제]

#include <stdio.h>

int main()
{
  int arr1[5]={1,2,3,4,5};
  int arr2[ ]={1,2,3,4,5,6,7};
  int arr3[5]={1,2};
  int ar1Len;
  int ar2Len;
  int ar3Len;
  int iCnt;

  printf("배열 arr1 크기:%d \n"sizeof(arr1)); //int 4byte x 5 =20 
  printf("
배열 arr2 크기:%d \n"sizeof(arr2)); //int 4byte x 7 =28
  printf("
배열 arr3 크기:%d \n"sizeof(arr3)); //int 4byte x 5 =20

  ar1Len = sizeof(arr1) / sizeof(int); //
배열 arr1 길이 계산
  ar2Len = sizeof(arr2) / sizeof(int); //
배열 arr2 길이 계산
  ar3Len = sizeof(arr3) / sizeof(int); //
배열 arr3 길이 계산
  
  for(iCnt=0; ar1Len>iCnt; ++iCnt)
    printf("%d ", arr1[iCnt]);
  printf("\n");

  for(iCnt=0; ar2Len>iCnt; ++iCnt)
    printf("%d ", arr2[iCnt]);
  printf("\n");  
  
  for(iCnt=0; ar3Len>iCnt; ++iCnt)
    printf("%d ", arr3[iCnt]);
  printf("\n");

  return 0;
}

[결과]  

  1.3 문자배열의 초기화

- printf(“%c \n”, str);

- “ABCD” 문자열을 초기화 하면 맨 끝에 null 값을 넣는다.

- %c 한 문자만 출력

- str &(주소)를 의미 한다.

 

[예제]

#include <stdio.h>

int
 main()
{
  
char
 str[]="Good morning!";
  printf(
"배열 str의 크기: %d \n"sizeof
(str) );
  printf(
"널 문자 문자형 출력: %c \n", str[13
] );
  printf(
"널 문자 정수형 출력: %d \n", str[13
] );

  str[
12]='?'// 배열 str에 저장된 문자열 데이터는 변경 가능!

  str[4]=0// 0 null이 들어 간다 
  
  printf(
"문자열 출력: %s \n", str); //null(0) 이 나올때 까지 출력

  printf("문자열 출력: %s \n", str); 
  printf(
"문자열 출력: %s \n"&str[5]); //&[5]번째 부터 null이 올때까지 출력 

  printf("문자열 출력2: %c \n", str[5]); //[5]번째 속한 %c한문자 출력 
  printf("%08X \n"&str);
  printf(
"%08X \n"&str[0
]); 
  
return
 0;
}

  [결과] 

 

1.4 배열을 이용한 문자열 변수의 표현

str.

0

1

2

3

4

5

6

7

8

9

10

11

12

13

G

o

o

d

 

m

o

r

n

i

n

g

!

null

 

 

type

Name

address

char

char *

char *

str

cp1

cp2

12FFAA

12FFBB

12FFCC

 

 

 

  

Ø  c언어: “문자열끝에 null값이 들어감

Ø  어셈블리: “문자열끝에 null값이 들어가지 않음

Ø  문자열: null 포함된 문자배열.

Ø  배열을 포인터처럼 있다.[예제2]

Ø  포인터를 배열처럼 있다. [예제2]

 

Ø  str 포인터로 있다.(값이 변하는 포인터)

Ø  cost 포인터와  같다.

Ø  )char * const cp3=str;  

      

 

[예제1]

#include <stdio.h>

int main()
{
  char str[]="Good morning!";
  char *cp1;
  char *cp2;
  cp1=str; //cp1: str
 주소상수를 담는 포인터(주소변수 

  printf("%c \n", *cp1);   //cp1
 가리키는 주소의  문자 출력 
  printf("%s \n", cp1);   //
포인터 변수
  printf("%s \n", str);   //
주소 상수
/*
  ++cp1;          
  printf("%s \n", cp1);   //
변수 
  printf("%s \n", str);   //
배열 str 자체가 주소 상수
*/

  printf("----------------\n"); 
  cp1=cp1+5;
  printf("%s \n", cp1);    
  printf("%s \n", str+5); 
  
  printf("----------------\n"); 
  cp2=str;
  printf("%c \n", str[0]);    
  printf("%c \n", cp2);    
  
  printf("----------------\n"); 
  printf("%c \n", *(str+1));    
  printf("%c \n", *(cp2+1));    
  printf("%c \n", cp2[1]);    
  printf("%c \n", str[1]);    

  return 0;
}
  

 

[예제2]

#include <stdio.h>

int main()
{
  char str[]="%d %d\n";
  char * cp1=str; 
  printf("%d %d\n"100,50);   //1 printf(   , ...);” ”
주소 상수
  printf(cp1, 100,50);         //2 printf(cp, ...);cp
주소 상수
  printf(str, 100,50);        //3 printf(str, ...);str
주소 상수
  return 0;                     //1,2,3
모두 같은 결과값 출력
}

 

 

 

- ABCD” 문자열을 초기화 하면 맨 끝에 null 값을 넣는다.

- %c 한 문자만 출력

- str &(주소)를 의미 한다.

 

.

'…™업무일지。' 카테고리의 다른 글

[smart]이재우-20140327  (0) 2014.03.27
[smart]이재우-20140326  (0) 2014.03.26
[smart]이재우-20140324  (1) 2014.03.24
[smart]이재우-20140321  (0) 2014.03.21
[smart]이재우-20140320  (0) 2014.03.20
728x90

 

2014.03.24 수업 ver1_0a.docx

 

2014. 03. 24 수업 및 과제 


1 메모리 영역의 이해

  -메모리의 영역 5종류

 

 메모리 영역

 행위 영역

 기억 영역

 code 영역

 =Ro 영역

 =text 영역

 Data(전역변수)

 BSS(전역변수)

 Heap(동적할당)

 Stack(지역변수)

   

 

-메모리 영역의 설명

 메모리의 영역 5종류

 메모리 Name   메모리 생성  메모리 저장 형태

 Code(함수)

 =Ro 영역(Read only)

 =text 영역

 1.Compile Time(컴파일시 만들어지며 

   실행파일(*.exe)의 용량에 포함)

 1.상수값

 2.printf" "

 

 Data(전역변수)

 1.Compile Time(컴파일시 만들어지며 

   실행파일(*.exe)의 용량에 포함)

 2.프로 그램이 종료 할때 까지 남아 있음

 3.전역변수가 많으면 실행파일( *.exe) 용량이 늘어남 

 4.자주쓰는 메모리는 전역 변수를 쓰는 것이 유리

 1.전역변수 중 초기값

    입력 메모리

 BSS(전역변수)

 =Block startde  by Symbol

 =Zi영역

 

 1.자동 초기화 메모리 영역 

 2.Block startde by Symbol

 3.initialize(초기화)

 4.Zi(Zero initialize)영역

   (0값으로 초기화 된 영역)

 Heap(동적할당)

   

 Stack(지역변수)

 1.Rum Time 시 생성

 2.자주쓰는 메모리를 Stack(지역변수)로

정의시 생성과 삭제를 반복하는 시간이

늘어 나므로 속도가 느려 짐 

 1.지역변수

 2.point 주소 저장

 3.배열의 상수 값 

 

 

 [예제]

#include <stdio.h>
void Add(int iVal); // iVal 지역 변수임
int iNum;  // 전역변수는 기본 0으로 초기화됨
int iNum1=10// 초기화 값을 준 것은 메모리 Data 
int iNum2;
int iNum3=30;
int iNum4;
int iNum5=50;
int iNum6;
int iNum7=70;

int main()
{
  printf("iNum:%d \n", iNum); // 전역변수 0으로 초기화
  Add(3);            //
  printf("iNum:%d \n", iNum);
  iNum++;
  printf("iNum:%d \n", iNum);
  printf("&iNum       :%08X \n"&iNum);
  printf("초기화&iNum1:%08X \n"&iNum1);
  printf("&iNum2      :%08X \n"&iNum2);
  printf("초기화&iNum3:%08X \n"&iNum3);
  printf("&iNum4      :%08X \n"&iNum4);
  printf("초기화&iNum5:%08X \n"&iNum5);
  printf("&iNum6      :%08X \n"&iNum6);
  printf("초기화&iNum7:%08X \n"&iNum7);
  printf("---------------\n");
  printf("&main :%08X \n"&main);
  printf("&Add  :%08X \n"&Add);
  printf("&printf:%08X \n"&printf);
  printf("문자 주소 :%08X \n""Hello");
  return 0;
}
void Add(int iVal)
{
  iNum=iNum+iVal;  
  printf("&iVal:%08X \n"&iVal);

[결과]

 


 

2 Static 변수 

-전역변수의 성격을 지니는 변수 

-(지역변수 특성)선언된 함수 내에서만 접근이 가능.

-(전역변수 특성)딱 1회 초기화되고 프로그램 종료 시까지 메모리 공간에 존재

   

3 register 변수 

-CPU 내에 존재하는 메모리

-연산속도가 빠르다.

-전역변수에는 register 변수를 선언 할 수 없다.

-선언을 힌트를 주는 것임:컴파일러가 합당하지 않다고 판단하면 레지스터에 할당 하지 않음

 

4 재귀 함수 

-CPU 내에 존재하는 메모리

-연산속도가 빠르다.

-전역변수에는 register 변수를 선언 할 수 없다.

-선언을 힌트를 주는 것임:컴파일러가 합당하지 않다고 판단하면 레지스터에 할당 하지 않음

 

 

5 배열 

 

[예제]

#include <stdio.h>
int main()
{
/*

  int iNum1
=1;
  int iNum2
=2;
  int iNum3
=3;
  int iNum4
=4;
  int iNum5
=5;
  int iNum6
=6;
  int iNum7
=7;
  int iNum8
=8;
  int iNum9
=9;
  printf("%d\n", iNum1);
  printf("%d\n", iNum2);
  printf("%d\n", iNum3);
  printf("%d\n", iNum4);
  printf("%d\n", iNum5);
  printf("%d\n", iNum6);
  printf("%d\n", iNum7);
  printf("%d\n", iNum8);
  printf("%d\n", iNum9);
*/

  int iNum[9];     //
배열 선언으로 간단히 코딩
  int iCnt;
  for(iCnt=09>iCnt ; ++iCnt)
    iNum[iCnt]=iCnt;
  
  for(iCnt=09>iCnt ; ++iCnt)
    printf("%d\n", iNum[iCnt]);
  return 0;
}

 

 

 

 

 

'…™업무일지。' 카테고리의 다른 글

[smart]이재우-20140326  (0) 2014.03.26
[smart]이재우-20140325  (0) 2014.03.25
[smart]이재우-20140321  (0) 2014.03.21
[smart]이재우-20140320  (0) 2014.03.20
[smart]이재우-20140319  (0) 2014.03.19
728x90

 

2014.03.21 수업 ver1_0a.docx

2014. 03. 21 수업 및 과제 


1 함수를 정의하고 선언하기

-함수의 원형 -> int 함수이름();  *세미콜론(;) 있을 때 원형 (호출 당하는 함수)

*함수의 원형이 모여 있는 곳이 <stdio.h> 즉 header 이다.

-함수의 선언 -> int 함수이름()   *세미콜론(;) 없을 때에 선언

-함수의 호출시 호출 당한 함수의 메모리가 생성되고, 값을 반환한 이후 메모리는 사라짐.

-함수의 원형[int 함수이름();]는 main() 함수 이전에 위치 해야 하며

  함수 선언은 어디에 있어도 관계가 없다.(컴파일 시 함수의 원형 존재 유무 파악이 필요)

 

 

 

A. 반환형: return 하는 값의 Type을 기술

 

 

 

 

 

 

 

 

1.1 함수의 유형

- 유형1: 전달인자(O)  반환 값(O)

- 유형2: 전달인자(O)  반환 값(X)

- 유형3: 전달인자(X)  반환 값(O)

- 유형4: 전달인자(X)  반환 값(X)

[예제]

#include <stdio.h>
int Add(int iNum1, int iNum2)    //전달인자(O)  반환 값(O)
{
  return iNum1+iNum2;
}
void ShowAddResult(int iNum)  //전달인자(O)  반환 값(X)
{
  printf("덧셈결과 출력:%d \n", iNum);
}
int ReadNum(void)    //전달인자(X)  반환 값(O)
{
  int iNum;
  scanf("%d"&iNum);
  return iNum;
}
void HowToUseThisProg(void)  //전달인자(X)  반환 값(X)
{
  printf("두 개의 정수를 입력하시면 덧셈결과 출력");
  printf("자! 그럼 두개의 정수를 입력하세요.\n");
}
int main()
{
  int iResult, iNum1, iNum2;
  HowToUseThisProg();
  iNum1=ReadNum();
  iNum2=ReadNum();
  iResult = Add(iNum1, iNum2);
  ShowAddResult(iResult);
  return 0;
}

[결과]

 

2 .h <stdio.h>

컴파일 시 전처리 에 포함

함수의 원형 -> int 함수이름(); 포함

3 .lib <*.lib>

컴파일 시 Linker에 포함

함수의 모음

4 컴파일 순서

        *.c (전처리Perprocessor)-> *.i (Compiler)-> *.asm (as어셈블리)-> *.obj (Linker)-> *.exe

5 return이 지니는 두가지 의미

  - 함수를 빠져나간다!

  - 값을 반환한다.

  - 반환형이 void로 선언된 함수에서도 다음의 형태로 return 문을 사용할 수 있음

 [예]

void HowToUseThisProg(int iNum)  
{
    if(iNum<0)

return;     // 값을 반환하지 않는 return문!

    . . . .  

}

 

6 지역 변수 선언

  - {} 중 괄호 안에 지역 변수을 선언 할 수 있다.

  - {} 중 괄호 안에서 만 메모리에 존재 하며, 실행이 끝나면 메모리에서 사라짐

  - 지역변수는 선언된 지역 내에서만 유효

  - 선언된 지역이 다르면 변수 이름이 같아도 문제되지 않음

 

 

'…™업무일지。' 카테고리의 다른 글

[smart]이재우-20140325  (0) 2014.03.25
[smart]이재우-20140324  (1) 2014.03.24
[smart]이재우-20140320  (0) 2014.03.20
[smart]이재우-20140319  (0) 2014.03.19
[smart]이재우-20140318  (0) 2014.03.18
728x90

2014.03.20 수업 ver1_0a.docx

 

2014. 03. 20 수업 및 과제 


1 Hexa View 

  - 주소/문자/A   - 주소(address)범위: 4 byte, 32bit, 16진수 FFFF FFFF, 10진수(4,294,967,295)

  - CPU BUS 라인에 따라 메모리 처리 용량이 결정

 

 2 IEEE 754 - floating point (부동소수점)

IEEE 754는 컴퓨터에서 소숫점을 표현하기 위한 방법이다.


single precision은 32비트 즉 1워드에 저장하고


double precision은 64비트 즉 2워드에 저장한다.


이 비트를 3부분으로 나누어 부호, 소수부분, 지수부분으로 인식한다.

 

 (-1)^s * (1 + F) * 2^E

 

F : fraction

앞쪽 비트부터 2^-1, 2^-2... 를 의미한다.


E : exponent

지수부분 기본적으로 unsigned 이며 single precision에선 127, double에선 1023을 뺀다


S : sign

부호 0이면 양수, 1이면 음수


single [sign : 1bit][exponent : 8bit][fraction : 23bit]

double [sign : 1bit][exponent : 11bit][fraction : 52bit]

 

이 수를 single precision으로 보고 해석하면

 1 0111 1110 1000 0000 0000 0000 0000 000

 부호비트

 

 

 1

 0111 1110

 1000 0000 0000 0000 0000 000

이 수를 single precision으로 보고 해석하면


1 : 음수

64+32+16+8+4+2=126

0111 1110 = 126

E = 126 - 127 = -1


1000 0000 0000 0000 0000 000 = 2^(-1) = 0.5 => 1.5


답은 -1 * 1.5 * 2^(-1) = -0.75 가 된다.

 

[예제]

실수 : 3.25의 값 계산 

 

 메모리 실제

 저장 값

 00 00 50 40  (Little Addian 방식으로 저장 Intel PC)

 숫자 정리

 40 50 00 00

 2진수 변환 

 4     0      5     0     0     0     0      0

 0100 0000 0101 0000 0000 0000 0000 0000  => 4byte

 bit 별 기능

 부호비트 1bit

 지수부(2^E) => 8bit

 가수부(1 + F) => 23bit

 0 

  1000 0000

 1010 0000 0000 0000 0000 000 

 +

 128 64 32 16 8 4 2 1

 승수 128-127= 1 =>2^1승

 .1010 0000 0000 0000 0000 000

 => 1.1010 0000 0000 0000 0000 000 

 십진수로

 변환

 부호^s * (1 + F) * 2^E = 2^1 승 * 1.1010 0000 0000 0000 0000 000 = 11.010

                               = 1*(2^1)+1*(2^0).1*(2^-2) = 2+1.(1/4) = 3.25 

 

 

3 함수

[Code(함수), Data(전역변수), BSS(전역변수), Heap(동적할당), Stack(지역변수)]

메모리의 영역 5종류

 Code(함수)

 Data(전역변수)

 BSS(전역변수)

 Heap(동적할당)

 Stack(지역변수)

 남이 만든 함수를 가져오는 것(링크한다.)

 C에서 만든 함수는 어셈블리로 가면 _언더바가 붙는다(규칙).

 따라서 _언더바 없이 해석한다.

 함수도 심볼 테이블(형식 Type, 변수 Name, 주소 Address)에 들어 간다.

 변수 및 함수들의 주소는 한 곳에 몰려 있다.

 

3.1 Simbol Table(심볼 테이블)      

 Type 형식

 Name 변수, 함수 이름

 Address 주소

컴파일 처리 순서

*.c > *.i >*.asm >*.obj >*.exe

 *.c > *.i > 심볼 테이블에 해당

 

3.2 리눅스에서 함수의 형식을 알수 있는 방법

 

 

리눅스에서 함수의 형식을 알수 있는 방법

 명령어

 설명

 man 숫자 함수명

 메뉴얼 보기 *manual 약어 / 숫자:몇장(chpter) / 함수이름

 예) man 3 printf   ->printf(3) 장을 열다.  

 q

 메뉴얼 끝내기

 /abc

 단어 찾기

 

3.3 int printf(cons char *format, ....);

화면에 출력한 갯수를 반환한다.

int main(void);

int: 반환값의 Type

main: 이름

():인수/인자

 



 

'…™업무일지。' 카테고리의 다른 글

[smart]이재우-20140324  (1) 2014.03.24
[smart]이재우-20140321  (0) 2014.03.21
[smart]이재우-20140319  (0) 2014.03.19
[smart]이재우-20140318  (0) 2014.03.18
[smart]이재우-20140317  (0) 2014.03.17
728x90

 

2014.03.19 수업 ver1_0a.docx

2014. 03. 19 수업 및 과제 


1 포인터(Pointer)의 이해 

  - 주소를 저장하기 위한 변수

  - 주소(address)범위: 4 byte, 32bit, 16진수 FFFF FFFF, 10진수(4,294,967,295)

  - CPU BUS 라인에 따라 메모리 처리 용량이 결정

 

 

2 메모리 저장방식의 이해

  - Intel 컴퓨터 -> Little Eddian 방식

메모리 값:12345678

저장 메모리순서: 78563412

저장 메모리 순서가 틀린 이유: 계산을 주로 하는 컴퓨터 이기 때문에 속도를 위해 작은 숫자부터 저장. 

 

  - Super 컴퓨터 -> Big Eddian 방식

메모리 값:12345678

저장 메모리순서: 123456

저장 메모리 순서가 같은 이유: 대소 비교가 빠르다.(큰 값을 먼저 비교) 

 

 

3 메모리 저장방식의 이해

  - Intel 컴퓨터 -> Little Eddian 방식

 

[예제1]

#include <stdio.h>
int
 main()
{
  
int   iNum=0x12345678
;
  
char *  p=(char*)&
iNum;

/* char 형 값의 표현 범위 -128 ~ +127 */

/* char 형 값의 표현 범위 -128 ~ +127 */

/*  char *  p=(char*)&iNum;  AA(1010 1010)=10진수 170(-40)
가 음수정수로 저장 되기 때문에 FFFFFFAA  가 저장됨*/

  *p=0x
AA;
  printf(
"%08X \n"
, iNum);
  printf(
"%02X \n"
, *p);
  printf(
"%02X \n", *p
);
  printf(
"%02X \n", *p
);
  printf(
"%02X \n", *p
);
  
return 0
;
}

[결과]

 

 

[예제2]

#include <stdio.h>
int
 main()
{
  
int   iNum=0x12345678
;
  
unsigned char *  p=(unsigned char*)&
iNum;

/* char 형 값의 표현 범위 -128 ~ +127 */

/* unsigned char 형 값의 표현 범위 0 ~ +255 */

/*  unsigned char *  p=(unsigned char*)&iNum;  AA(1010 1010)=10진수 +170
가 양의정수로 입력 되기 때문에 FFFFFFAA 가 000000AA로 저장됨 /

  *p=0x
AA;
  printf(
"%08X \n"
, iNum);
  printf(
"%02X \n"
, *p);
  printf(
"%02X \n", *p
);
  printf(
"%02X \n", *p
);
  printf(
"%02X \n", *p
);
  
return 0
;
}

[결과]   

 

 

[예제3]

#include <stdio.h>
int
 main()
{
  
int   iNum=0x12345678
;
  
unsigned char *  p=(unsigned char*)&
iNum;
  *p=0xAA;
  printf(
"%08X \n"
, iNum);
  printf(
"%02X \n"
, *p);
  printf(
"%02X \n", *(p+1
));
  printf(
"%02X \n", *(p+2
));
  printf(
"%02X \n", *(p+3
));
  
return 0
;
}

[결과]   

 

 

4 포인터의 연산 및 자료형에 따른 출력 변화

   - 포인터에 주소값을 가지므로 + - ++ --연산자를 쓸 수 있다. (기타 다른 연산자(* / .. 는 쓸 수 없다.)       [예제]

[예제1]

#include <stdio.h>
int main()
{
  int   iNum=0x12345678; /* int 4byte */
  unsigned char *  p=(unsigned char*)&iNum; /* unsigned char 1byte */
  unsigned short * sp=(unsigned short*)&iNum;  /* unsigned short 2byte */

  *p=0xAA;    /* 실제 메모리 Little Eddian 저장방식 AA563412 */

  printf("%08X \n", iNum); /* 123456AA 화면에 출력시 순서대로 출력 */
  printf("%02X \n", *p);  /* AA 실제 메모리 Little Eddian 저장방식 */
  printf("%02X \n", *(p+1)); /* 56 실제 메모리 Little Eddian 저장방식 */
  printf("%02X \n", *(p+2)); /* 34 실제 메모리 Little Eddian 저장방식 */
  printf("%02X \n\n", *(p+3)); /* 12 실제 메모리 Little Eddian 저장방식 */

  printf("%08X \n", p);  /* p주소: 0012FF6C 출력 */
  printf("%08X \n", (p+1)); /* p+1주소: 0012FF6D 출력 */
  printf("%08X \n", (p+2)); /* p+2주소: 0012FF6E 출력 */
  printf("%08X \n\n", (p+3)); /* p+3주소: 0012FF6F 출력 */

  printf("%04X \n", *sp); /* sp가 가리키는 값(iNum): 56AA 출력 */
        /* AA56이 아닌 이유: sp가 short형 이므로 2byte씩 출력 */
  return 0;
}

[결과]         

      

 

 [예제2]

#include <stdio.h>
int main()
{
  int iNum=0xABCDEF98;    /* 실제 메모리 저장: 98EFCDAB */
  unsigned char * uCPDATA = (unsigned char *)&iNum;
  
  printf("%02X \n", *uCPDATA);  /* 98  1 byte 출력*/
  ++uCPDATA;      /* 1 uCPDATA 주소 1byte 증가*/
  printf("%02X \n", *uCPDATA);  /* EF 다음(98) 1 byte 출력*/
  ++uCPDATA;      /* 1 uCPDATA 주소 1byte 증가*/
  printf("%02X \n", *uCPDATA);  /* CD 다음(EF) 1 byte 출력*/
  ++uCPDATA;      /* 1 uCPDATA 주소 1byte 증가*/
  printf("%02X \n", *uCPDATA);  /* AB 다음(CD) 1 byte 출력*/
  return 0;
}

[결과] 

[예제3]   예제2의 for문으로 출력 

#include <stdio.h>
int main()
{
  int iCnt;
  int iNum=0xABCDEF98;    /* 실제 메모리 저장: 98EFCDAB */
  unsigned char * uCPDATA = (unsigned char *)&iNum;
  
  for(iCnt=0;4>iCnt;++iCnt)
  {
    printf("%02X ", *uCPDATA);  /* 98 앞쪽 1 byte 출력*/
    ++uCPDATA;      /* 1 uCPDATA 주소 1byte 증가*/
  }
  return 0;
}

[결과]

더블클릭을 하시면 이미지를 수정할 수 있습니다

 

'…™업무일지。' 카테고리의 다른 글

[smart]이재우-20140321  (0) 2014.03.21
[smart]이재우-20140320  (0) 2014.03.20
[smart]이재우-20140318  (0) 2014.03.18
[smart]이재우-20140317  (0) 2014.03.17
[smart]이재우-20140314  (0) 2014.03.14
728x90

 

2014.03.18 수업 ver1_0a.docx

2014. 03. 18 수업 및 과제 


1 포인터(Pointer)의 이해 

  1.1 메모리 구조

- 일반적[1 byte(8 bit) 단위 마다 주소(address)를 지정]

- &변수명 :address 지정

[예제]

#include <stdio.h>
int main()
{
  int iNum=0;
  printf("%d \n", iNum);            /* 0 */
  printf("%d \n"&iNum);          /* 1245044 */
  printf("%X \n"&iNum);          /* 12FF74 */
  printf("%08X \n"&iNum);     
/* 0012FF74   08X: 8자리 빈자리에 0입력 16진수 출력*

  printf("%p \n", &iNum);          /* 0012FF74 
%p: 포인터의 16진수 주소값 출력*/

  
return 0;
}

 

  1.2 포인터(Pointer)설명

* : 주소(단항 /캐스팅) = 캐스팅 연산자 역할 (일시적인 형변환)

* : 값(단항)

 [예제]

#include <stdio.h>
int main()
{
  int iNum = 0;
//  &iNum = 100;                       컴파일 waring C4047  &iNum   같지않다 int형 (100)  

 iNum 의 주소상수(&) 를 의미함

 

//  (int*)0x12FF74 = 100;       컴파일 waring C4047  (int *)0x12FF74 같지않다 int(100)   

                                               iNum 의 주소상수(&) 를 의미함

  *(int*)0x12FF74 = 100;       *(int*)0x12FF74 좌변은 iNum 의 변수 를 의미    
  printf("%08X \n"&iNum);

 

  printf("%d \n", iNum);

 

  *(&iNum) = 1000;                (int *)0x12FF74 = &iNum 이랑 같다.  
                                        *& 가 만나면 서로 상쇄된다.  
  printf("%08X \n"&iNum);
  printf("%d \n", iNum);
  return 0;
}

 

1.3 캐스팅 연산자

* : 곱셈(2항 )

[예제]

#include <stdio.h>
int main()
{
  int iNum=0;
  int iAddr=0;  
  int *iP;

  iAddr=(int)(&iNum);          warning error       

iAddr=&iNum;   -> 좌변은 int(정수형) 우변은 int * (정수형 주소상수) 


  printf("%08X \n", iAddr);     // 0012FF6C   &iNum 주소값

  *( (int*)iAddr )=1000;    // 1000을 iAddr 주소 포인터에 넣어라. 
  printf("%d \n", iNum);        // 1000         1000출력

  iP=&iNum;
  *iP=999;

  printf("%d \n", iNum);        // 999       

  return 0;
}

 [결과]  

 

 

1.4 point 연산자 활용

[예제]

#include <stdio.h>
int main()
{
  int   iNum=0;
  int *   iP=&iNum;
  
  printf("%d \n", iNum);       // 0             iNum 변수값
  printf("%08X \n"&iNum);   // 12FF70    iNum 자신의 주소값
  printf("%08X \n", iP);    // 12FF70       iP 변수(&iNum주소)값
  printf("%08X \n"&iP);    // 12FF74    *iP 자신의 주소값    
  printf("%d \n", *iP);    // 0              &iP 주소가 가리키는 변수(iNum)의 값

  return 0;
}

[결과]

 

 

'…™업무일지。' 카테고리의 다른 글

[smart]이재우-20140320  (0) 2014.03.20
[smart]이재우-20140319  (0) 2014.03.19
[smart]이재우-20140317  (0) 2014.03.17
[smart]이재우-20140314  (0) 2014.03.14
[smart]이재우-20140313  (0) 2014.03.13
728x90

2014.03.17 수업 ver1_0a.docx

 

20140317_수업예제.docx

2014. 03. 17 수업 및 과제 


1 continue & break 

  1.1 break

-Switch, 반복문(if else, for, while) 에 쓰임

-break를 만나면, 프로그램을 빠져나감 

  1.2 continue

-for문에서 continue를 만나면 증감수행으로 돌아감

-while(조건)문에서  continue를 만나면 조건으로 돌아감

 

[예제1]구구단을 출력하되 짝수 단(2단, 4단, 6단, 8단)만 출력되도록 하자, 또한 2단은 2 x 2까지, 4단은 4 x 4까지,

6단은 6 x 6까지, 8단은 8 x 8까지, 출력되도록 프로그램 구현

#include <stdio.h>
int main()
{
  int iNum, iDan;
  
  for(iDan=1 ; iDan<10 ; iDan++)
  {
    if(iDan%2!=0)
    continue;
  
    for(iNum=1 ; iNum<10 ; iNum++)
    {
      if(iDan<iNum)
        break;
      printf("%d * %d = %d \n", iDan, iNum, iNum*iDan);
    }
    printf("\n");

  }
  printf("\n");
  return 0;
}

[실행]  

 

[예제2] 다음 식을 만족하는 모든 A와 Z를 구하는 프로그램 작성 

 

#include <stdio.h>
int main()
{
  int iA, iZ;
  int iResult;
  for(iA=0;10>iA;iA++)
  {
    for(iZ=0;10>iZ;iZ++)
    {
/*      if(iA==iZ)
        continue;
*/
      iResult=(iA*10+iZ)+(iZ*10+iA);
      if(iResult==99)  
        printf("%d%d+%d%d=%d \n", iA, iZ, iZ, iA, iResult);
    }

  }

  return 0;
}

[결과] 

2 switch & case

구간, 범위를 설정 할 때는 if문이 유리

특정 조건이 정해진 때는 switch case문이 유리

  2.1 switch(정수형 변수)

   조건: 정수형 변수만 올 수 있음

  2.2 case(상수형 정수)

   조건: 상수형 정수만 올 수 있음

   [예제]

#include <stdio.h>
int
 main()
{
  
int
 iNum;
  printf(
"숫자을 입력:"
);
   scanf(
"%d"&
iNum);

  
switch
(iNum)
  {
  
case
 1:
    printf(
"1를 입력하였습니다.\n"
);
    
break
;
  
case
 2:
    printf(
"2를 입력하였습니다.\n"
);
    
break
;
  
case
 3:
    printf(
"3를 입력하였습니다.\n"
);
    
break
;
  
case
 4:
    printf(
"4를 입력하였습니다.\n"
);
    
break
;
  
case
 5:
    printf(
"5를 입력하였습니다.\n"
);
    
break
;
  
default
:
    printf(
"잘 못 입력 하였습니다!\n"
);
    
break
;                                                 /* 생략되어도 되나 일반적으로 다 적어 줌 */
  }
  
return
 0;
}

[결과] 

3 goto문

프로그램 시 사용하지 않는 것이 좋다.

  2.1 goto문 무한루프

:AAA
printf("무한루프\n");
goto AAA;


 

'…™업무일지。' 카테고리의 다른 글

[smart]이재우-20140319  (0) 2014.03.19
[smart]이재우-20140318  (0) 2014.03.18
[smart]이재우-20140314  (0) 2014.03.14
[smart]이재우-20140313  (0) 2014.03.13
[smart]이재우-20140312  (0) 2014.03.12
728x90

 

2014.03.14 수업 ver1_0a.docx

2014. 03. 14 수업 및 과제 


1. for문의 구조와 이해

 

 

for문 예시 .아래 문장들은 5번,6번 문장을 제외 한 모두 같은 결과 

#include <stdio.h>
int main()
{
  int iNum1;
  int iNum2;
/*1-----------------------------------------------------------------  
  for(iNum1=1,iNum2=0 ; iNum1<5 ; iNum1=iNum1+1,iNum2=iNum2+2)
  {
    printf("iNum1=%d, iNum2=%d\n", iNum1, iNum2);
  }
초기식 , 증감식은 콤마(,)구분으로 여려 문장을 쓸 수 있음*/

/*2-----------------------------------------------------------------
  iNum2=0;

  for(iNum1=1; iNum1<5 ; iNum1=iNum1+1)
  {
    printf("iNum1=%d, iNum2=%d\n", iNum1, iNum2);
    iNum2=iNum2+2;
  }
*/

/*3-----------------------------------------------------------------
  iNum1=1;
  iNum2=0;

  for( ; iNum1<5 ; )
  {
    printf("iNum1=%d, iNum2=%d\n", iNum1, iNum2);
    iNum2=iNum2+2;
    iNum1=iNum1+1;
  }
*/

/*4-----------------------------------------------------------------
  iNum1=1;
  iNum2=0;

  while(iNum1<5)
  {
    printf("iNum1=%d, iNum2=%d\n", iNum1, iNum2);
    iNum2=iNum2+2;
    iNum1=iNum1+1;
  }
*/

/*5-----------------------------------------------------------------
  for(iNum1=1,iNum2=0 ; iNum1<5 ; iNum1=iNum1+1,iNum2=iNum2+2)
    printf("iNum1=%d, iNum2=%d\n", iNum1, iNum2);
처리 문장이 한줄 일때는 중괄호 생략 가능*/

/*6-----------------------------------------------------------------
  iNum2=0;

  for(iNum1=1; iNum1<5 ; iNum1=iNum1+1)
    printf("iNum1=%d, iNum2=%d\n", iNum1, iNum2);
    iNum2=iNum2+2;
처리 문장이 두줄 일때는 두번째 문장 한번만 실행*/


  return 0;
}

     [결과]

 

2. 무한 루프 예

[예제]

#include <stdio.h>
int main()
{
  unsigned int uiCnt=0;
      for(;;) /* 무한루프 조건식 공백 같은 결과 while(1) */
  {
    printf("%u \n", uiCnt);
    ++uiCnt;
  }
  
return 0;
}

[결과]

0에서 1증가 하면서 무한 반복 

 

3. 조건적 실행과 흐름의 분기

  3.1 if문

 참이면 실행 거짓이면 건너뜀

[예제1]

 #include <stdio.h>
int main()
{
  int iNum;
  scanf("%d"&iNum);
  printf("입력하신 숫자는 %d입니다.\n", iNum);

  if(100<iNum) /* 조건이 참이면 실행/ 아니면 분기(건너뜀)*/
  {
    printf("입력하신 숫자는 100보다 커다\n");    
  }
  return 0;
}
 
 

[결과] 

 

[예제2]

#include <stdio.h>
int main()
{
  int iNum;
  
  for(iNum=1; iNum<100; ++iNum)
  {
    if(   (0==(iNum%3) ) || (0==(iNum%4) )   )    연산우선 순위 비교를 괄호를 필히 해준다.

{                                                   문장의 명확을 위해 중괄호를 해주는 것이 좋다.*/
        printf("3 or 4 배수 %d \n",iNum);
}

  }  return 0;
}

[결과]

 

3.2 if~else

 if절의 조건이 참이면 if블록 거짓이면 else블록 실행

 else은 if가 반듯이 있어야 가능한 문장

[예제]

#include <stdio.h>
int main()
{
  int iNum;
  printf("정수 입력:");
  scanf("%d"&iNum);

  if(iNum>0)
  {
    printf("%d이 0보다 큰 수\n", iNum);
  } 
  
else
  {
    printf("%d이 0보다 작은 수\n", iNum);
  }
  
return 0;
}

[결과]

 

3.3 if else if문

셋 이상의 블록 중 하나를 선택해서 실행

 

 

3.4 삼항 연산자

조건 ? data1 : data2

조건이 참이면 data1반환 거짓이면 data2 반환

 

int iNum3= (iNum1>iNum2) ? (iNum1) : (iNum2);

 

[예제]

#include <stdio.h>
int main()
{
  int iNum1, iNum2;
  int iResult;

  printf("두 개의 정수 입력: ");
  scanf("%d %d"&iNum1, &iNum2);

  iResult= (iNum1>iNum2) ? iNum1-iNum2:iNum2-iNum1;
  printf("뺄셈의 결과: %d \n",iResult);

  return 0;
}

[결과]

 

'…™업무일지。' 카테고리의 다른 글

[smart]이재우-20140318  (0) 2014.03.18
[smart]이재우-20140317  (0) 2014.03.17
[smart]이재우-20140313  (0) 2014.03.13
[smart]이재우-20140312  (0) 2014.03.12
[smart]이재우-20140311  (0) 2014.03.11
728x90

 

2014. 03. 13 수업 및 과제 


 

07. 반복실행을 명령하는 반복문

      

 7.1 while

[예제]

#include <stdio.h>
int main()
{
  int iCnt;
  iCnt=0;  

  while(3>iCnt)        /* 조건: (논리연산자)참/거짓으로 판단 */
  {
    printf("test\n");
    ++iCnt;  
  }
  return 0;
}

[결과]

 

 

7.1.1 while 무한루프의 구성

while(1)

{

printf("무한 루프\n");

}

 

 7.2 for문

     [예문]

#include <stdio.h>
int main()
{
  int iCnt;
  for(iCnt=0;3>iCnt;++iCnt) /* for(초기식;조건식;증감식) */
  {
    printf("test\n"); /* 반복의 문장 */
  }
  return 0;
}

[결과]

'…™업무일지。' 카테고리의 다른 글

[smart]이재우-20140317  (0) 2014.03.17
[smart]이재우-20140314  (0) 2014.03.14
[smart]이재우-20140312  (0) 2014.03.12
[smart]이재우-20140311  (0) 2014.03.11
[smart]이재우-20140310  (0) 2014.03.10