2015년 6월 29일 월요일

20150629 ★변수의 존재기간과 접근범위 지역변수(예제-윤년계산)

모든 변수, 함수선언에는 auto를 써야하나 생략해도 자동으로 적용된다.

전역변수는 프로그램종료전까지 죽지않는다. 아무함수나 다 사용가능
별도의값으로 초기화를 하지 않으면 메모리자체에 비트단위로 0이들어간다.

★컴파일시(컴파일type) 만들어진다.
                           Momery영역
                     (text)code 함수+상수
       (초기화한변수?)data ┐전역변수(int형 변수 1000개는 4000byte)
(초기화하지않은변수)bss  ┘(4000byte를 사용하지 않고 사용할자리를 만들라 명령)
                           heap 동적할당
                           Stack 지역변수(유동성메모리)

★지역변수는 실행시(run type) 만들어진다.

exe파일은 code,data,bss만 실행파일포함 heap,Stack는 실행시 생성

bus가 메모리용량을 결정(메모리의 최종크기는 버스와 관련있다)
32비트체제 4byte(버스가32개)

printf("%x\n", &iNum); // iNum의 메모리주소출력
printf("%08X\n", &iNum); // iNum의 메모리주소출력 8칸을비우고 왼쪽부터채운다.
printf("%p\n", &iNum); // iNum의 메모리주소출력

★cl *.* /link /DYNAMICBASE:NO // 컴파일후 실행시 메모리주소를 고정

#include <stdio.h>
void Add(int val);
int num; // 전역변수는 기본 0으로 초기화됨

int main(void)
{
printf("num : %d\n", num);
Add(3);
printf("num : %d\n", num);
num++; // 전역변수 num의 값 1 증가
printf("num : %d\n", num);
return 0;
}

void Add(int val) // num이 전역변수이므로 반환값 x
{
num += val; // 전역변수 num의 값 val만큼 증가
}


그레고리력은 윤년(2월 윤달)이 있는 해를 다음과 같은 규칙으로 정했습니다.

1) 4년으로 나누어지는 해는 윤달(2월은 29일)이 있다.
2) 그러나 100년으로 나누어지는 해는 윤달이 없다.
3) 그러나 400년으로 나누어지는 해는 윤달이 있다.

이 규칙을 만족해야만 그 해가 윤년(2월은 29일)이고
아닌 경우에는 평년(2월은 28일)입니다.

예제-윤년
#include <stdio.h>

int main(void)
{
int x=0; // 지역변수 Stack부분에 저장되어있음

while(x!=1)
{
  printf("입력(종료=1) : ");
scanf("%d", &x);

/* if(((x%4==0) && !(x%100==0)) || ((x%100==0) && (x%400==0)))
{
printf("윤년\n");
}
else
{
printf("평년\n");
}*/

if(x%400==0)
{
printf("윤년\n");
}
else if(x%100==0)
{
printf("평년\n");
}
else if(x%4==0)
{
printf("윤년\n");
}
else
{
printf("평년\n");
}
}
}

2015026 C언어의 핵심! 함수! C언어에서만 main함수가 가장먼저 시작(먼저시작하는 함수=Entry Point)

메모리에 저장된곳을 CPU가 기억하는 방식?

Symbol Talbe
Type Name Address(메모리 주소)
int    A       1000
int    B       1004

return이 지닌 2가지 의미
1. 함수를 빠져나간다!
2. 값을 반환한다.

반환형태 함수이름 입력형태
int         main      (void) // 소괄호 필수 인자 인수 소괄호안의 void 생략가능
인자가 없다는의미로 사용=void(회피하다)
{
// 함수의 몸체
return 0; // 0은 정수형 0?(return)이없으면 반환값이 없음
}

int Add(int num1, int num2) // 함수의 선언
{ // 함수의정의
// int num1; (매개변수를 생략해도됨)
// int num2; (매개변수를 생략해도됨)
return num1+num2;
}

int Add(int, int) // 매개변수의 이름을 생략한 표현

예제
#include <stdio.h>

int Add(int num1, int num2) // 인자전달 (O), 반환 값 (O)
{
return num1+num2;
}

void ShowAddResult(int num) // 인자전달 (O), 반환 값 (X)
{
printf("덧셈결과 출력 : %d\n", num);
}

int ReadNum(void) // 인자전달 (X), 반환 값 (O)
{
int num;
scanf("%d", &num);
return num;
}

void HowToUseThisProg(void) // 인자전달 (X), 반환 값 (X)
{
printf("두 개의 정수를 입력하시면 덧셈결과가 출력됩니다.\n");
printf("자! 그럼 두 개의 정수를 입력하세요.\n");
}

int main(void)
{
int result, num1, num2;
HowToUseThisProg();
num1=ReadNum();
num2=ReadNum();
result=Add(num1, num2);
ShowAddResult(result);
return 0;
}









#include <stdio.h>

int bNum1;
int bNum2;
int bNum3;

int dNum1=100;
int dNum2=100;
int dNum3=100;

int main(void)
{
int sNum1;
int sNum2;
int sNum3;

printf("%08X\n", &bNum1);
printf("%08X\n", &bNum2);
printf("%08X\n", &bNum3);
printf("\n");
printf("%08X\n", &dNum1);
printf("%08X\n", &dNum2);
printf("%08X\n", &dNum3);
printf("\n");
printf("%08X\n", &sNum1);
printf("%08X\n", &sNum2);
printf("%08X\n", &sNum3);
printf("\n");
printf("%08X\n", printf);
printf("%08X\n", scanf);
printf("%08X\n", main);

return 0;
}
memory
상수, 함수Code
변수DatadNum1
변수BSSbNum1
변수Heap
변수StacksNum1

2015년 6월 25일 목요일

20150625 if 조건적 실행과 흐름의 분기, 반복문의 생략과 탈출

if~else문을 일부 대체할 수 있는 조건 연산사
조건 연산자 = 피 연산자가 세 개인 '삼 항 연산자'
abs=(조건) ? (data1) : (data2); // 소괄호 생략가능 조건이 참이면 연산결과로 data1반환,
                                           거짓이면 연산결과로 data2가 반환
예제
int num, abs;
printf("정수 입력 : ");
scanf("%d", &num);

abs=num>0?num:num*(-1);
printf("절댓값 : %d\n", abs);

실행결과
정수 입력 : -79
절댓값 : 79

if(조건)
{

}
else
{
거짓
}

컨트롤+c/컨트롤+Pause Break = 도스창에서 무한루프중지

break; // 가장 가까운 반복문 하나를 빠져 나옴
continue; // 반복문의 나머지를 생략하고 반복문의 조건검사위치로 이동

switch(num)
case1: // num  = 1 일때 실행
case2: // num  = 2 일때 실행
default: // num  = 1 or 2 가 아닐때 실행

2015년 6월 23일 화요일

20150624 반복문 ★제어문★순서도

순서도(flow chart)=시간의 흐름을 중심으로 프로그램의 구성을 디자인할 때 사용하는
약속된 기호이다.

i = 1; // 초기식
while(조건) // 조건문
{
내용
i++ // 기본 반복 구문
}

do
{
내용
}while(조건); // 무조건 1번 실행후 조건을 검사후 실행여부 판단 while과는 다르게 끝에 ;

for(i=1; i<10; i++) // 초기식, 조건문, 기본 반복 구문 한줄에 모여있다!
{
내용
}

2015년 6월 22일 월요일

20150623 printf 예제(%* <- 형식지정자), scanf

앰퍼샌드(ampersand&, 앤드 기호)는 ‘~와(과)’를 의미하는 기호

printf("===%d===\n", 100); // ""사이에 %가 들어가면 형식지정자가 된다.

8진수를 8진수답게, 16진수를 16진수 답게 출력하고 싶다면, 서식문자 %o
그리고 서식문자 %x의 사이에 문자 #을 넣어서 %#o와 %#x를 이용해서 출력하면된다.

int num1 = 7, num2 = 13;
printf("%o %#o\n", num1, num1);
printf("%x %#x\n", num2, num2);

실행결과
7 07
d 0xd

예제
printf("1234567890\n");
위와 아래의 결과 값은 같다.
printf("12345"
"67890\n");
예제1
printf("===%d===\n", 100);
printf("===%10d===\n", 100); // 10칸의 공간이 생기고 왼쪽부터 출력
printf("===%-10d===\n", 100); // 10칸의 공간이 생기고 오른쪽부터 출력
printf("===%2d===\n", 100); // 자릿수가 모자라면 자동으로 공간할당
printf("===%x===\n", 100); // 16진수로 변환해서 출력
printf("===%010x===\n", 100); // 빈자리를 0으로 채워서 출력
printf("===%08x===\n", 100);
printf("===%x===\n", 15); // a~f  소문자로 출력
printf("===%X===\n", 15); // A~F 대문자로 출력
printf("===%08X===\n", 15);
printf("===%p===\n", 15); // 현재 포인터의 주소 값을 출력(현재는 바로                                                              윗줄의 결과와 같다.)
실행결과

20150622 ★★★★★include(포함하다) #으로 시작하는 전처리 언어는 끝에 ;가 붙지 않는다★★★★★

include(포함하다) #으로 시작하는 전처리 언어는 끝에 ;가 붙지 않는다!!!

목적(Object) 파일 생성 [ -c 옵션 ]


목적파일은 컴퓨터가 이해할 수 있도록 구성되어 있는 기계어로 저장된 파일이다. 
C컴파일러는 정확하게 말해서 그 자체가 컴파일러라기보다는 소스파일을 읽어 실행파일을 만드는데 필요한 각 단계별 명령어를 호출하는 연결자라고 할 수 있다. 
즉, gcc 와 같은 C 컴파일러는 입력받은 소스파일을 기반으로 cpp, cc1, as, ld 명령어를 
순차적으로 호출하여 실행파일을 만든다. 

실행파일이 만들어지기까지 소스파일이 거치는 단계별 과정은 다음과 같다.

0. main.c - >main.i -> main.asm -> main.obj -> main.exe

1. 전처리 단계 - 전처리기 (cpp) *.i <- c언어가 아닌것을 c로 변환 (cl /P main.c)
(전처리 언어는 끝에 ;가 붙지 않는다 "*" <-현재디렉토리 <*> <-찾아서불러오기)
pre(~앞에 pre-[동사・명사・형용사에서] <‘… 전의', ‘미리'의 뜻을 나타냄>)proccess(처리)
: #include, #define 등 #으로 시작하는 문법 사항이 적절히 전처리된 
C 언어 소스파일 생성

2. 컴파일 단계 - 컴파일러 (cc1) *.asm <- cl /Fa main.c(*.obj파일을 같이 생성)
2단계까지 Text파일로 볼수있음(3단계부터 )
: C 언어 소스파일은 컴파일 과정을 거쳐 어셈블리 소스 파일이 됨

3. 어셈블 단계 - 어셈블러 (as) *.obj <- cl /c main.c(80x86계열 기계어) 실행X
(확장자를 bin으로 교체시 비주얼스튜디오에서 헥사뷰로 볼수있음)
:어셈블리 소스 파일은 어셈블 과정을 거쳐 목적 파일이 됨

4. 링크 단계 - 링커 (ld) *.exe <- cl /O main.c(*.obj파일을 같이 생성) = cl main.c(1~4)
: 목적 코드는 라이브러리와 링크되어 실행 가능한 파일이 됨

20150622 자료형(실수 자료형)

이름을 지니는 상수(Symbolic) = const 상수

const in max=100; // max는 상수! 따라서 값의 변경 불가!

실수 자료형        소수점 이하 정밀도          바이트 수
float                  6자리                           4
double               15자리                         8
long double        18자리                         12

데이터의 표현범위가 보다 넓은 자료형으로의 형 변환은, 그 과정에서 데이터의 손실이
발생하지 않지만, 데이터의 표현범위가 좁은 자료형으로의 형 변환은, 그 과정에서
데이터의 손실이 발생할 수 있다!!!

묵시적 형 변환 = 자동 형 변환

int iNum;
char cNum = 50;
float fNum;

iNum = cNum;
4바이트 <- 1바이트
            ↑
     cl(컴파일러/묵인) 묵시적 형(type)변환(50)

iNum = 256;
cNum = iNum;
1바이트 <- 4바이트
            ↑
     cl(컴파일러/묵인) 묵시적 형(type)변환(0)

fNum = 3.99f;
iNum = fNum;
1바이트 <- 4바이트
            ↑
     cl(컴파일러/묵인) 묵시적 형(type)변환(3)

명시적 형 변환 = 강제 형 변환 ★소괄호() = 형 변환 연산자(type casting operator)★

int num1 = 3, num2 = 4;
double divResult;
divResult = (double)num1 / num2;
printf("나눈셋 결과 : %f\n", divResult);
return 0;

2015년 6월 18일 목요일

20150619 scanf / 상수와 기본 자료형 - ASCII(아스키코드)

리터럴(literal) 상수 or 리터럴

도스상에서 컴파일시 경고문구표기방법(cl -Wall main.c)

scanf(스캔에프라고 읽는다)는 사용자로부터 정보를 입력받는 기본 함수이다. 
printf의 반대 함수이며 동일한 서식을 사용한다. 즉 정수를 입력받고 싶으면 %d 서식을 사용하고 
문자열을 입력받고 싶으면 %s 서식을 사용하면 된다.
단 실수 서식인 %f가 printf는 float, double에 모두 대응되는데 비해 scanf는 float와만 대응된다는 점만 다르다. scanf로 double값을 입력받으려면 %lf 서식을 사용해야 한다.

나머지 연산은 실수형에서는 동작하지 않는다!

아스키코드=모니터상에 출력하기위한 번호(폰트 형식으로 표현)
도스상에서 alt+(키패드숫자)=아스키코드값입력

아스키코드 값 0~31=제어문(가급적 초반에는 피한다)
0 = 백스페이스(←)
10 = 엔터(줄바꿈 ^J,라인피드?)
32 = SP(스페이스바)

127을 넘어가는 코드=확장 아스키코드(처음만들때 7bit로 만들었음)8bit
나라별로 확장아스키코드값이 다름!(도스상에서 chcp 3자리숫자 한국은949 미국은 437)
http://pcycom.com.ne.kr/hanmir/dos/dos/chcp.htm
현재 한글은 조합형(ㄱ~ㅎ+ㅏ~ㅣ)/완성형(꽉 chcp 949)


2015년 6월 17일 수요일

20150618 컴퓨터가 데이터를 표현하는 방식(정수)








char = 1byte = -128~127
unsigned char = 1byte = 0~255

모든 컴퓨터의 정수체계 = 정수를 2의보수방식으로 저장(정수만 적용)
컴퓨터는 -연산을 안함

초등1의 수학에서 보수는 10 이되는 두 수를 의미합니다.

8bit정수 1byte (-128)~(+127)
2진수 1 1 1 1 1 1 1 1 = -127
        ↑
        (+),(-)표시부호(0=(+)/1=(-))이방식은 덧셈 불가능으로 사용하지 않음
그러나 실제 저장방식이 아래와 같으므로 음수값을 찾을때 첫자리가 1이면 음수!

128~255를 0뒤로 이동시켜 저장 실제 저장은 128~255이나 -1부터 표시 회로를 만듬!
-128     -255     0     127     128     255
   |          |       |        |         |         |
-128     -1                          |
  ^                                    |
 └------------------------------┘

10진수 123의 10의 보수 / 9의 보수
  123      123
+877    +876
---------------
1000      999
10의 보수를 빠르게계산하기위해 9의보수를 구하여 1더함

1의보수 = 위아래를 change
  1       0
+0     +1
-----------
  1       1

2의 보수 = 1의보수를 구하여 1더함
  1101       1101
+0011     +0010
-------------------
10000       1111

  00000011(3)
+11111110(-2)
-----------------
  00000001(1)

보수=

최상위 자릿수를 제외한 자릿수를 0으로 만드는 수라고 하면 이해가 쉬우실까요?

예를 들어 3300의 보수는 6700 이 됩니다.. 이 두수의 합은 10000이고 원래 두수의 자릿수가 4자리수 이므로 4자릿수까지 0으로 만들게 되기에 보수가 됩니다. 또한 96700도 보수가 됩니다.. 기준이 어디냐에 따라서 보수의 선택을 하셔야 됩니다.

컴퓨터에선 덧셈밖에 안되죠.. 뺄셈은 2의 보수를 사용한 덧셈을 응용한 방식을 사용하구요. 곱셈과 나눗셈 역시 덧셈을 이용해 처리하죠..

뺄셈을 예로 들어 설명해드릴께요
컴퓨터는 2진수를 씁니다.

10진수 10을 2진수로 표현하면 1010 이 됩니다. A
10진수 2를 2진수로 표현하면 0010 이 됩니다.. B

A-B를 계산한다면 B에다가 2의 보수를 취해서(항상 뒷수에 취합니다.)
1010+1110이 되죠.(1110+0010=10000 보수 맞죠?)
계산해보면 11000이 됩니다. 뺄셈은 자릿수가 증가하는 일이 없겠죠?
증가된 자릿수를 제외하면 1000이 됩니다. 이는 10진수 8이므로 계산이 맞죠?

이젠 반대로 해보겠습니다. B-A 이면 A에다가 2의 보수를 취해서..
0010+0110이 됩니다. 
계산해보면 1000이 됩니다. 하지만 B와 A에 크기비교시 A가 더 큰수이므로
-를 취하고 다시 2의 보수를 취해줍니다. 
-(1000의 2의 보수) = -(1000) 이 되네요.. -8 맞죠?

http://kin.naver.com/browse/db_detail.php?dir_id=101&docid=70626

0.0=를 2진수로 계산할때
점을 기준으로2의0승부터++/2의-1승~부터--
0.1과 짝수인 소수점은 무한루프연산이라 표현불가!

20150618 printf형식 ★16진수표시 앞에는 (0x)를 8진수는 (0)


printf의 f의 formatted(서식이 지정된)을 의미한다. 따라서 printf라는 함수의 이름에는
'서식이 지정된 형태의 출력'이라는 뜻이 담겨있다.
서식문자의 종류와 의미

서식문자         출력 대상(자료형)        출력형태
%d                char, short, int            부호있는 10진 정수
%ld                long                        부호있는 10진 정수
%lld               long, long                 부호있는 10진 정수
%u                unsigned int              부호없는 10진 정수
%o                unsigned int              부호없는 8진 정수
%x, %X           unsigned int              부호없는 16진 정수
%f                 float, double              10진수 방식의 부동소수점 실수
%Lf                 long double              10진수 방식의 부동소수점 실수
%e, %E           float, double              e 또는 E 방식의 부동소수점 실수
%g, %G          float, double              값에 따라 %f와 %e 사이에서 선택
%c                char, short, int            값에 대응하는 문자
%s                char *                       문자열
%p                void *                      포인터의 주소 값



















특수문자 = 의미하는바
\a           경고음
\b           백스페이스(backspace)
\f           폼 피드(form feed)
\n           개 행(new line)
\r           캐리지 리턴(carriage return)
\t           수평 탭
\v           수직 탭
\'           작은 따옴표 출력
\"           큰 따옴표 출력
\?           물음표 출력
\\           역슬래쉬 출력

20150617 연산자 예제

C언어에서 참=1 거짓=0으로 인식한다!




#include <stdio.h>

int main()
{
int a=1, b=2;

printf("a < b = %d\n",a<b);
printf("a > b = %d\n",a>b);
return 0;
}

비트연산자가 <</>>일때 대입값은 대입값 2의 대입값승
  9 << 2 = 36
10 << 1 = 20

나머지 연산은 실수형에서는 동작하지 않는다!

2015년 6월 15일 월요일

20150616 연산자 종류







인텔cpu          O/S 오퍼레이팅 시스템
80계열
x86계열
80x86계열

20150615 기본 설정 http://recipes.egloos.com/ <-임베디드시스템강좌

윈도우키+Pause Break=제어판\모든 제어판 항목\시스템
윈도우키+D=바탕화면보기 one more=복귀
윈도우키+E=탐색창
Alt+PrintScreen=선택한창만스샷
Ctrl+PrintScreen=전체화면스샷

cmd => notepad => cmd실행한 디렉토리에 메모장 만든다.
cmd => notepad main.c => cmd실행한 디렉토리에 main.c 파일 만든다.

 cl.exe VS 컴파일러 cmd에서 실행하기

window키+Pause Break=고급시스템설정=>환경변수=>path=>변수값수정
C:\Program Files\Microsoft Visual Studio 12.0\VC\bin;
C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE

변수이름:LIB 변수값=
C:\Program Files\Microsoft Visual Studio 12.0\VC\lib;
C:\Program Files\Microsoft SDKs\Windows\v7.1A\Lib

변수이름:INCLUDE 변수값=
C:\Program Files\Microsoft Visual Studio 12.0\VC\include;
참고 : it에 대한 사용자 변수 vs 시스템 변수 : ????

cl *.*(컴파일)
파일이름(실행)
type *.*

10진수 Decimal=%d
8진수%o
16진수%x

CPU3대 요소 reg(레지스터), cu(컨트롤 유닛), ALU(산술논리연산)