2010. 7. 10. 02:04


제 15장 1차원 배열 - 2



문자열 상수

 - 문자열이면서 상수의 특징을 지닌다.

예) printf("hi, i'm chun jae saim \n");
   // 문자열이 메모리 공간에 먼저 올라간후 printf함수 를 호출한다.
   // 문자열 상수 임; 문자열 데이타는 바꿀수 없다.
   // 이 문자열을 변수로 지정하는 방법? : 배열사용

1. 메모리 공간에 hi, i'm chun jae saim이라는 문자열이 올라간다.
 - 즉 문자열은 상수다.-> " " 안에 문자열은 상수다.

2. 이 메모리값의 주소값이 printf함수로 넘어간다.

3. 실제 주소값을 전달하면서 printf함수가 실행

 ☞ 우리는 이제 문자열을 변수로 선언해보는 작업을 해보자



●  문자열 변수 

 - 문자열이면서 변수의 특징을 지닌다.

 ex) char array[5] = "Good"

//  한 요소에 한 문자를 넣는다
//  근데 문자열의 길이는 4인데 배열요소는 5개이다.
 
 ex) char array_1[] = "Evening";
  
  // 오른쪽에 있는 문자열의 데이타를 참조해서 즉, 7개
  // 하지만 문자열의 길이는 7 + 1로 해준다.

  문자열 배열이라고 한다.(문자열 변수)
  
예제) ======================================================

 #include <stdio.h>

int main()
{
char Array[6] = "Hello";       // 문자열길이 5+1개  
char Array_1[8] = "morning"; // 문자열길이 7+1개

printf("%s \n", Array);  // 문자열형태 %s
printf("%s \n", Array_1);

return 0;
}

// 과연 왜 +1을 해줘서 표현을 하는건지?

=============================================================   

 문자열의 특징

 - 문자열 ; C언어에서는 문자열 조건
  > 반드시 NULL문자를 가진다.
  > NULL을 달아줘야 하는 이유?
   
 - 문자열은 (NULL)문자를 끝에 지닌다.

 - 널(NULL)문자 : '\0'(숫자 0임)
                  (아스키코드 값으로 0); 

 ex) char arr[] = "AB" // []안에는 3이된다.
                                     // 길이가 3인 arr 배열

 



@ 문자뒤 백슬러쉬0(\0) ; 특수문자

 - 문자의 끝을 나타내기 위한 용도
 
 - NULL 문자라고 일단은 이해한다.

 - 아스키코드표를 참조(블로그 - 메모 에 있음)
 
 - 문자 '숫자 ; 0'의 문자의 아스키코드값은 49 다.
   > 혼돈 주의



널문자를 지녀야 하는 이유?

 - 문자열의 끝을 표현하기 위해서
  > 쓰레기 값과 실제 문자열의 경계를 나타내기 위해

 - printf함수는 널 문자를 통해서 출력의 범위를 결정짓는다.


예제 ) ====================================================

#include <stdio.h>

int main()
{
char str[100] = "hello World !!"; // 길이가 100인 char형 배열 생성
// 이 문자열의 길이(인데스)가 많이 남는다.
// 쓰레기값으로 채워진다. 문자열끝에 항상 '\0' 자동으로 들어간다

printf("%s \n", str);

return 0;
}

// 의미없는 쓰레기 값이 들어가게 된다.
// 하지만 cpu는 어디까지가 실질적인 문자열인지 모른다.
// hello World !! \0(널문자)가 포함된다.

===========================================================

printf("hellow \n");
// 이 문자열은 뒤에 안보이지만
// '\0'이 들어가 있다.



문자열과 char형의 배열의 차이점

 - char str1[] = "abc" // 문자열이자 캐릭터형 변수
   // 인덱스는 4다

 - char str2[] = {'a', 'b', 'c'}; // 문자열은 아니다.
   // 인덱스는 3이다.

 - char str[] = {'a', 'b', 'c', \0'}; // 문자열
   // 인덱스는 4이다.


예제) ========================================================

#include <stdio.h>

int main(void)
{
int i;

char ch;
char Array[6] = "hello";

printf("-- 변경 전 문자열 -- \n");
printf("%s \n", Array); // 현재 문자열 출력

for(i=0; i<6; i++) // 5번 반복
printf("%c | ", Array[i]); 
// ch문자변수에 Array의 각 요소를 순서적으로 한개씩 출력한다

for(i=0; i<3; i++)
{
ch = Array[4-i];
Array[4-i] = Array[i];
Array[i] = ch;
}
// for문으로 문자열의 요소를 ch에 저장하여
// 각 요소의 문자의 순서를 바꾼다.
// for문이 돌아가는걸 직접 그려서 분석하는것이 이해하기 쉽다.

printf("\n -- 변경 후 문자열 == \n");
printf("%s \n", Array);

return 0;
}

예제) ========================================================

 #include <stdio.h>

 int main()
 {
char str[30];

printf("문자열 입력 : ");
scanf("%s", str);
// 어랏 ? 이제는 &가 붙지 않는다.
// 문자열을 사용할때는 &는 쓰지 않는다
// 자세한 사항은 포인터에서 다루겠다.

printf("입력된 문자열 : %s \n", str);

return 0;
 }


'프로그래밍 > C' 카테고리의 다른 글

제 17장 포인터의 이해 - 예제  (0) 2010.07.10
제 16장 포인터의 이해 - 1  (0) 2010.07.10
제 14장 1차원 배열 - 1  (0) 2010.07.10
제 13장 C언어의 핵심 함수 - 3  (0) 2010.07.10
제 12장 C언어의 핵심 함수 - 2  (0) 2010.07.10
Posted by 토실토실천재
2010. 7. 10. 02:03

제 14장 1차원 배열 - 1



※ 문법을 100% 이해하려면, 실습을 거쳐야 완벽한 100% 이해완성
   - 최소한의 연습문제등 문제를 풀어봄으로써 응용력을 키운다.


 배열이란 무엇인가?

  - 두개 이상의 변수를 동시에 선언하는 효과를 지닌다

  - 많은 양의 데이타를 일괄적으로 처리할 수 있다.
   > 예를 들자면 
     for(i=0; i<10; i++)
     Array[i] = 1; // 모든 데이타형을 1로 초기화 한다. 

     // 변수 10개를 일일이 만들필요없이 배열로 선언해서 
     // 편리하게 일괄적으로 처리가 가능한다.

  - 지역적 특성, 전역적 특성 둘다 가짐



 배열 선언에 있어서 필요한 3가지

 - 배열길이 : 배열을 구성하는 변수의 개수(반드시 상수사용)
 
 - 배열 요소 자료형 : 배열을 구성하는 변수의 자료형

 - 배열의 이름 : 배열을 접근할 때 사용되는 이름

 ▼ 정 의 
 int Array[10];
 // int형 데이타형 10개를 저장할수 있는 Array라는 이름의 배열

 - int : 배열 요소 자료형
 - [10] : 배열길이
 - Array : 배열이름
 ==> 4byte(int형) 메모리 10개를 가지는 즉, 40바이트가 할당된다.
 ==> 이 메모리공간의 이름은 Array 라고 한다.

 char A[5];
 // char형 테이타형을 5개 저장할수 있는 A라는 이름의 배열
 // 총 메모리 크기 char형[1byte] X 5개 = 5byte

tip >  마찬가지로 배열도 함수가 호출되었을때 함수내에 정의되어 있으면
         변수와 마찬가지로 메모리공간이 생기고, 함수가 종료되면 메모리가 소멸된다.



 1차원 배열의 접근
  - 인덱스 : 배열요소의 위치를 표현
  - 인덱스는 무조건 0부터 시작한다.
 
총 10개의 데이타를 저장할수 있는 메모리공간
저 하나하나의 데이타를 참조할때는, 하나하나 접근해야한다.


@ index[인덱스] : 기준을 대상으로 얼마나 멀리 떨어져있냐[거리]
 - 기준은 0이다.

 ▼ 접근하는 방법 : 

 - Array[5] : Array배열에 있는 5번째 위치에 해당하는 요소에 접근

 - index 값이 첫번째는 0이다.
   ex) int Array[10] : 마지막요소의 인데스값은 9이다.
   ex) int Array[5] : 마지막요소의 3번째 인데스값은 2이다.

 - Array[3] = 10 // Array배열의 3번째 인덱스에 10을 저장한다.
 
 int main()
{
int Array[10];
Array[0] = 1;
Array[1] = 2;
Array[2] = 3;
......
return 0;
}

예제) ========================================================

#include <stdio.h>

int main(void)
{
double sum;
double Array[5]; // double형 데이타타입의 5개의
// 요소를 가진 메모리공간 할당
// 총 8byte X 5개 = 40byte(초기화 안되있음 ; 쓰레기값 포함되있음)

Array[0] = 1.01; // 각 요소마다 double형 값을 저장한다.
Array[1] = 2.34;
Array[2] = 3.34;
Array[3] = 10.3;
Array[4] = 4.5;

// 모든값을 요소마다 더해서 sum값에 대입한다.
sum = Array[0] + Array[1] + Array[2] + Array[3] + Array[4];

printf("Array 전체 요소의 평균값 : %lf \n", sum/5);

return 0;
}

=============================================================

 선언과 동시에 초기화

int array[5] = {1, 2, 3, 4, 5};

// int형 데이타 5개 저장할수 있는 array란 이름의 배열 선언을 하고
// 각각의 인덱스에 맞게 순서적으로, 1, 2, 3, 4, 5를 대입한다.

int array1[] = {1, 2, 3, 4, 5}

// int형 데이타를 저장할수 있는 정보를 이런경우는
// 초기화 리스트의 갯수가 있으니까 1, 2, 3, 4, 5의 갯수가 5개 이므로
// 컴파일러가 알아서 숫자를 인식한다 그러믄로 배열요소는 5개

int array2[5] = {1, 2}; // 초기화 리스트 2개가 있다.

// array[0] = 1;
// array[1] = 2;
// array[2] = 0;
// array[3] = 0;
// array[4] = 0;
// 이렇게 자동으로 0으로 초기화 시켜준다.

@ 조심할점 : int array[] ; // 에러발생

'프로그래밍 > C' 카테고리의 다른 글

제 16장 포인터의 이해 - 1  (0) 2010.07.10
제 15장 1차원 배열 - 2  (0) 2010.07.10
제 13장 C언어의 핵심 함수 - 3  (0) 2010.07.10
제 12장 C언어의 핵심 함수 - 2  (0) 2010.07.10
제 11장 C언어의 핵심 함수 - 1  (0) 2010.07.10
Posted by 토실토실천재
2010. 7. 10. 02:03

제 13장 C언어의 핵심, 함수 - 3

 

 

 


변수의 범위 : 함수와 변수의 관계를 따 져보다.

 

 ▽  변수의 특성에 따른 분류
 
 - 지역변수
: 중괄호{ }  내에 선언된 변수(Local Varial)

 - 전역변수 : 함수내에 선언되지 않는 변수(Gloval Varial)

 - 정적변수 : 함수 내부, 외부 모두 선언가능(Static Varial)

 - 레지스터 변수 : 선언에 제한이 많이 따름(Register Varial)

 

 

 

 static변수


 - 함수내부 및 외부에 선언가능


 - 한번만 초기화 된다 : 전역변수의 특징을 가진다


 - 함수내부에서 선언될 경우 함수내에서만 접근 가능
   > 지역변수의 특징 static int a;

 

예제) ========================================================

 

#include <stdio.h>

 

void Fuc(void)
{                          // 한번만 초기화 되기때문에
 static int num = 0; // 2번째 호출부터 실행되지 않는다.
                          // num값은 0으로 한번만 초기화가 이루어진다.
 num++;   

 printf("%d \n", num);
}                       // 함수를 빠져나와도, num은
                        // 값을 유지하면서 소멸되지 않는다!
int main()
{
 int i;  

 for(i=0; i<5; i++)
  Fuc();

 return 0;
}

=============================================================

 

 

 

register : cpu내의 가장가까운 기억장치(상당히 빠른 메모리)

 

 - 여유가 있는 메모리 공간은 아니다.(잘 사용하지 않는다)

 

 - regiter int b; // regiter 메모리공간에 변수를 선언한다.

 

 - 사용시, 많은 제약이 따른다

 

 


재귀 함수

 

 - 자기자신을 다시 호출하는 형태의 함수

 

 - 프로그램을 이용하기위해선 프로세서를 이해해야 한다.
   -> 컴퓨터 구조(H/W -> 운영체제)

   -> 운영체제 


 - 자기자신을 계속 호출하기때문에, 이해하기보다는

 

 - 코딩시 조금만 신경써서, 분석하며 작성하는게 좋다!

 

 - 하지만 스택오버플로우(메모리과다사용으로 인한 경고)를 조심한다.
 


예제 ) ==========================================================

 

#include <stdio.h>

 

void Print()
{
 printf("재귀함수 호출 \n");
 Print();                         // 자기자신을 다시 호출한다.
}                                  // 무한루프에 빠지게 된다.

int main()
{
 Print();
 return 0;
}


예제 )==========================================================

 

#include <stdio.h>

 

void Repeat(int n) // 함수선언 및 정의
{
 printf("재귀함수 호출\n");
 if(n==1)            // if문은 재귀함수를 빠져나가기 위한 조건
  return ;            // return문 용도 : 함수 빠져나오거나, 값을 반환할때 쓰임
 Repeat(n-1);    // n값은 1씩 감소하면서 호출해 나간다.
}                     // 결국 n값이 1이 되면 빠져나가게 되는 함수

int main()
{
 int a = 4;
 Repeat(a);      // 함수호출

 return 0;
}

// -> 핵심 :  무한 재귀호출을 위해서 탈출조건을 잘 구현해야함


※ 재귀함수의 대표적인 사례는 팩토리알 (factoral)계산
  n! = (n-1) * (n-2)......* 2 * 1
  5! = 5 * 4 * 3 * 2 * 1


예제 )==========================================================

 

#include <stdio.h>

int Fat(int n);


int main()
{
 int input;  

 printf("정수 하나 입력 : ");
 scanf("%d", &input);

 printf("%d! = %d \n", input, Fat(input));
 return 0;
}

int Fat(int n)
{

 if(n==0)                  // n값이 1이면 빠져나가게 한다.
  return 1;

 else
  return n*Fat(n-1); // Fat함수를 호출시 매개변수 값이
                             // 1씩 감소하면서 호출한다
}

Posted by 토실토실천재
2010. 7. 10. 02:02

제 12장 C언어의 핵심, 함수 - 2

 

 


변수의 범위 : 함수와 변수의 관계를 따 져보다.

 

▽  변수의 특성에 따른 분류 


 - 지역변수 : 중괄호{ }  내에 선언된 변수(Local Varial)

 

 - 전역변수 : 함수내에 선언되지 않는 변수(Gloval Varial)

 

 - 정적변수 : 함수 내부, 외부 모두 선언가능(Static Varial)

 

 - 레지스터 변수 : 선언에 제한이 많이 따름(Register Varial)

 

 

 

지역변수 : 선언된 함수내에서만 접근가능
                     - {중괄호} 안에 선언된 변수는 모두 지역변수이다


ex) while(){}, for(;;){}, main(){}등과 같이 {}안에 있는 변수

 

int Fuc()
{
 int k;        // k값이 적용되는 범위는 { } 안에서만 가능
 ...           // 지역변수 k는 이 함수가 끝나면 메모리공간에서 사라진다.
 return 0;  // tip : C메모리구조는 stack 형태로 저장된다.
}

 

int Fuc_1()
{
 int k;  // 이 k값은 위의 Fuc함수의 k값과는 별개다.
 int k1;

 ...
 return 0;
}


예제 =========================================================


#include <stdio.h>

 

int main()
{
 int i;                       // main함수 내에서는 어디에든 접근가능

 for(i=0; i<3; i++)
 {
  int a = 0;               // main함수안의 for문안에 있는 지역변수 a
  a++;
  printf("%d번째 for 루프, 지역변수 a는 %d \n", i, a);
 }                            // 반복을 할때마다 a는 중괄호를 나갔다가 다시 올라간다.
                              // 즉, 지역을 벗어나기 때문에 a는 소멸된다.(생성/소멸반복)
 if(i==3)
 {
  int a = 10;           // main함수안의 if문안에 있는 지역변수 a
  a++;
  printf("if문에 내에 존재하는 지역변수 a는 %d \n", a);
 }
  
 return 0;
}

 

예제 =========================================================

 

#include <stdio.h>

 

int main()
{
 int val = 0;         // main함수를 지역으로 두는 변수

 {                     // main 함수내 줄괄호를 이용해서 또 다른지역을 연다
  int val = 0;        // 만약에 이 수식문이 사라지면
  val = val + 10;   // {} 밖에 있는 val값이 적용된다.
  printf("if의 지역변수 val : %d \n", val);
 }                     // { }의 val 소멸

 printf("main의 지역변수 val : %d \n", val);

 return 0;
}

==============================================================

 

 

지역변수와 매개변수

  - 매개변수도 지역변수의 일종이다.
 
int fuction(int k, int m) // 매개변수(k, m) < 지역변수
{
 k = k+10;
 m = 20;
 
 return k-m;
}

 

 


전역변수

 

 - 프로그램 어디에서도 접근이 가능한 변수

 

 - { } 에 속하지 않는다.

 

 - main함수종료(프로그램 종료)때까지 존재한다.


 - 전역변수는 어디서든 접근가능하다.


 - 그렇지만, 잦은 사용은 좋지 않다.


 - 나중에 프로그램이 커지면, 얽키고 설켜버릴 가능성이 있다.

 

바로 예제 갑니다.

 


예제 =========================================================

 

#include <stdio.h>

int val;  // 전역변수는 자동으로 0으로 초기화 된다.
            //
지역변수는 자동으로 초기화 되지 않음.


void Sum(int k); // 함수선언

 

int main()
{
 printf("val : %d \n", val);

 Sum(4);        
 printf("val : %d \n", val);

 val++;                           // 전역변수


printf("val : %d \n", val); // 전역변수

 return 0;
}

 

void Sum(int n)// 힘수정의
{
 val = val + n; // 프로그램 전체 내에서 val값은 유지된다.
}

 

Posted by 토실토실천재
2010. 7. 10. 02:01

제 11장 C언어의 핵심, 함수 - 1

 

 

 

C언어로 만들어진 프로그램은 ?

    : 함수로 시작해서 함수로 끝나는 프로그래밍 언어

 

 - 중요도는 함수가 포인터가 상대적으로 높다.

 

 - 포인터는 활용하는데 정말 중요

 

 - 함수를 적절히 이용하는건 더 어렵게 걸린다.

 

 - 포인터를 얼마냐 잘 사용되느냐가 아닌

 

 - 함수를 어떻게 정하는건지 실력판단.

 

 - 좋은함수를 만들수 있어야한다.

 

 

 

main()함수 다시보기

 

int main (void)
{

 // 함수몸체

}


1. 함수는 이름이 필요하다

 

(void)  : 입력의 형태

 

 (int)   : 출력의 형태(반환 혹은 리턴형)

 

{    }  : 함수의 몸체(함수의 기능)

 

 

2, 함수를 정의하는 이유

 

  - 모듈화(기능별로 분리)에 의한 프로그램의 질 향상

 

  - 유지 보수, 확장의 용이성
    ex) 프로그램을 바꿀때, 기능별로 순차적으로 수정이 가능

 

 - 문제를 분리하고,전체를 정복하라 (Divide and Conquer)

 

  - 체계적인 프로그래밍 가능

 

  - 코드 읽기의 효율성

 

 

3. 함수의 형태
 
int Sum(int a, int b) // int형을 return 할 Sum 이라는 이름의 함수
{                          // 변수 a, b로 받아준다.
 int sum = a+b;       // 연산값을 sum에 대입

 return sum;         // return : sum을 반환해라, 던져줘라
}

 

예제 ===============================================

 

#include <stdio.h>

 

int Sum(int a, int b) // 여기에 a = 10, b = 20
{
 int result = a+b;

 return result;            // result를 던진다.(뱉어낸다)
}

 

int main()
{
 int val;

 val = Sum(10, 20);// 뱉어낸 값을 받아서 val에 보관
 printf("val = %d \n", val);

 return 0;
}

 

// 함수가 리턴값은 어디로 넘어가는가?

// 리터형 함수는 어떤것들이 있는가?

 

 

4 다양한 형태의 함수

 

int Sum(int val)     // 전달인자, 리턴값 둘다 있다.
void Sum(int val)  // 전달인자는 있지만 리턴값이 없다.
int Sum()              // 전달인자는 없고, 리턴값은 있다.
void Sum(void)    // 전달인자, 리턴값 둘다 없다.

 

 

5. 함수 선언의 필요성

 

 - 컴파일러의 특성상, 함수는 호출되기전에 정의되야 한다.

 

 - 호출할 함수정의는 main함수 이전에 무조건 선언 되야 한다.

 

 - 호출할 함수원형을 선언후, main()함수 밑에 선언도 가능

 

 - 컴파일은 위에서 아래의 순서대로 읽기때문에, 컴파일이 호출할 함수를 읽어야 한다.


예제 ===============================================

 

#include <stdio.h>

 

int Add(int a, int b);        // 더하기 함수선언
int Minus(int a1, int b1); // 빼기 함수선언
int Input();                    // 입력하는 함수선언
void Print(int k, int k1);  // 출력하는 함수선언
void Title();                  // 프로그램제목 함수선언

//-------------------------------------- 까지 함수 선언부분

int main()
{
 int num1, num2;
 int sum1, sum2;

 

 Title();                                // 제목함수호출

 

 num1 = Input();                    // Input함수를 호출하여, 결과값을 num1에 반환
 num2 = Input();                    // Input함수를 호출하여, 결과값을 num2에 반환

 

 sum1 = Add(num1, num2);    // Add(더하기)함수 호출하여 결과값을  sum1에 반환
 sum2 = Minus(num1, num2); // Minus(빼기)함수 호출하여 결과값을 sum2에 반환

 

 Print(sum1, sum2);              // 출력함수 호출

 return 0;                            // 0을 리턴한다.
}

//-------------------------------------- 부터 함수 정의부분

void Title()                         // Title 함수정의부분
{
 printf("  ▲                               ▲\n");
 printf("■ 함수를 이용한 프로그램 예제입니다 ■\n");
 printf("  ●                               ●\n");
}

 

int Add(int a, int b)             // Add 함수정의부분
{
 int result = a + b;
 return result;
}

 

int Minus(int a1, int b1)      // Minus 함수정의부분
{
 int result1 = a1 - b1;
 return result1;
}

 

int Input()                        // Input 함수정의부분
{
 int val;
 printf("값을 입력하세요 : ");
 scanf("%d", &val);

 return val;
}

 

void Print(int k, int k1)     // Print 함수정의부분
{
 printf("더한 결과 : %d \n", k);
 printf("빼기 결과 : %d \n", k1);
}

 

// 위(main함수 위)에는 함수를 선언한부분

// 밑(mani함수 밑)에는 선언한 함수를 정의한 부분이다

 

예제 ===============================================


// 함수 선언의 의미

#include <stdio.h>

 

int Large_Num(int a, int b); // 함수 선언부분

 

int main()
{
 int a = 10;
 int b = 12;

 int c = 3;
 int d = 2;

 

 printf("%d 와 %d중 큰 수는 %d \n", a, b, Large_Num(a, b));
 printf("%d 와 %d중 큰 수는 %d \n", c, d, Large_Num(c, d));

 

// printf의 인자값을 반환값이 존재하는 함수가 올수 있다

 

 return 0;
}

 

int Large_Num(int a, int b)  // 함수정의 부분, main 함수내의  변수 a,b와는 별개인 변수다
{
 if(a > b)
  return a;

 else
  return b;
}

 

// Tip !

// 한 함수내의 { } 안에 선언된 변수의 이름은 그 안에서만 효력이 발생한다.

// 다른 함수에 똑같은 이름의 변수가 있더라도, 영향을 받지 않지만,

// 프로그램의 가독성 및 혼란성을 피하기 위해서, 다른 변수를 넣어주는것이 좋다.

ex)

in Add()

{

int a;

}

 

int Add_1()

{

int a;

}

 

이둘의 a값은 컴파일의 혼란을 야기 시키지 않는다. 이름만 같을뿐, 서로 다른변수다.

 

 

 

Posted by 토실토실천재
2010. 7. 8. 18:42
제 9장 흐름의 분기 - 2




조건 연산자(3(삼)항 연산자)

 - if ~ else 문을 간결히 표현하는데 사용 될 수 있음.
  ※ tip: 간단하고 실용적이라 그냥 외우는 편이 좋습니다.

 (조건) ? A : B
  → 조건이 '참'인 경우 A를 반환
  → 조건이 '거짓'인 경우 B를 반환

ex_1) int a = 3;
       c = (a>0) ? 10 : 20;
    // 만약에 a>0가 참인경우 c = 10 이다
    // 만약에 a>0가 거짓이면 c = 20 이다.
    // 결과적으로 3은 0보다 크므로  참이다,
    // c 에는 10이 반환된다.

ex_2) c = (a>0) ? a*3+1 : a/3;
   해석해보세요

예제)===============================================

#include <stdio.h>

int main()
{
int num;
char ch;

printf("정수 입력 : ");
scanf("%d", &num);

ch = (num < 0) ? '-': '+';   // num 값이 0보다 작으면 ch = '-'가되고
                                       // num 값이 0보다  크면 ch = '+'가 되다.

(ch == '-')? printf("음수 \n"):printf("양수 \n");
// ch 가 '-'면 printf("음수\n")를 실행하고 그게 아니라면 printf("양수\n")가 실행된다.

printf("절대 값 : %d \n", (num<0) ? (-1)*num : num);
// num값이 음수(0보다 작으면)면 num*(-1)을 %d에 대입하고,
// 아니라면 그대로 num값이 %d에 대입된다.

return 0;
}

====================================================

break 문(탈출문안에서 사용된다)
 - 반복문을 나올때 사용(빠져나올때)

while(1)
{
if(num < 0)
break;
}


● continue : 나머지 부분을 건너뛰고 다시 루프반복
           다시 조건검사를 하러 바로 간다.
whie(1)
{
if(x<100)
continue;
}


예제-break문)===============================================

#include <stdio.h>

int main()
{
int sum = 0;
int val = 0;

while(1)             // for(;;)
{
sum = sum + val;// sum+=val;
if(sum>100)        // sum값이 100보다 클때
break;              // while(반복)문을 빠져나오겠다

val++;               // val값이 1씩 증가.
}

printf("sum = %d \n", sum);
printf("val = %d \n", val);

return 0;
}

예제-continuek문)===============================================


#include <stdio.h>

int main(void)
{
int val;

puts("시작 ! ");

for(val=0; val < 10; val++) // val값이 0부터 1씩 증가하면서 9까지..(10번반복)
{ // tip : OR연산자(||) ; 두 조건중 하나만 '참'이어도 실행
if(val%2==0 || val%3 ==0)  // val값이 2로 나누어 떨어지거나, 3으로 나누어떨어지면
continue; // 다시 반복설정 바로 점프한다. 즉, 밑에 printf 함수로 안내려감

printf("%d \n", val);
}
// 즉, 0~9까지 2, 3으로 나눠 떨어지는 수를 제외한 수를 출력한다.
// 2와 3의 배수
printf("끝 !");

return 0;
}


● switch~case문

 - 수식(정수값)과 일치하는case문을 찾아서 실행

 - if문과 달리 실행문이 여러개 있더라도 '{  }'으로 묶지 않음

 - case뒤에는 break를 사용해 탈출조건을 만들어준다

 - 만일 break문이 없으면 다음 case문이 실행된다

 - 반드시, 정수값만 수식으로 입력받아 처리한다..

 - 비교연산을 인자로 받을수가 없다.

 - default : case에 만족된 값이 없을때 실행하는 수식문

 - 우리가 레스토랑에 갔을때, 메뉴판을 보고 골라 선택하여
   주문을 하게 됩니다.(즉, 메뉴번호를 선택하여, 그 메뉴를 정한다)

 - 예제로 바로 들어가서 주석으로 설명 드릴게요

예제- switch-case 문)===============================================

#include <stdio.h>

int main()
{

int grade;

puts("학점판별프로그램입니다");
printf("점수를 입력하세요(0~100): ");
scanf("%d", &grade);

grade /= 10;       // grade = grade % 10;
        // grade 값은 0~10까지의 값이 들어간다.

switch(grade) // 정수 grade을 기준으로
{
case 10 :     // 정수값이 10이면
    // break문이 없으면 다음 case문이 실행된다
case 9 :            // 정수값이 9이면
puts("학점은 A입니다"); // 실행
break;        // break 문으로 switch문 전체를 빠져나온다

case 8 :        // 정수값이 8이면
puts("학점은 B입니다");
break;

case 7 :       //...
puts("학점은 C입니다");
break;

case 6 :
puts("학점은 D입니다");
break;

default :
puts("학점은 F입니다");
break;    // default 에서는 break 생략가능
}

return 0;
}

예제- switch-case 문)===============================================

#include <stdio.h>

int main()
{
char ch;
printf("인사를 해볼까요?  \n");
printf("다음 글자를 입력하세요 \n");
printf("아침(M), 점심(A), 저녁(E), 종료(Q) : ");


scanf("%c", &ch); // %c = 문자 하나를 입력받을때 

switch(ch)
{
case 'M':              // 하나의 문자이기에 ''를 해준다.
case 'm':
printf("Good Mornig~!\n");
break;

case 'A':
case 'a':
printf("Good Afternoon~!\n");
break;

case 'E':
case 'e':
printf("Good Evening~! \n");
break;

case 'Q':
case 'q':
printf("Quit Program! switch_case \n");
break;

default :
printf("input wrong word! \n");

}

return 0;
}

// 다음프로그램은 사용자의 입력방식에 따라서
// 프로그램을 유연성있게 하기위해서 break문의
// 적절한 사용을 예로 나타낸것입니다.
// 대/소문자 구분없이 프로그램이 영향을 받지 않게 만든것

if~else 문은 가독성을 떨어뜨리기때문에
필요에 따라서 적절히 구분해서 쓴다.

사실, 객관적으로도 구분하기가 switch문이 사용이 편하다
if~else문을 써도 상관은 없지만, 객관적인 입장을 추구해서
보기편하게, 즉, 가독성을 위해서 구분해서 쓰도록 한다.





goto 문- 점프문

프로그램의 흐름을 복잡하게 한다.
되도록 사용마세요(스파게티코드가 되기쉽다)

goto AA;(이동할 위치)
...
...
...

AA;(이동할 위치로 돌아가게 한다)

왠만하면사용을 사용을 아예 하지마시요, 

Posted by 토실토실천재
2010. 7. 8. 18:41
9장, 조건에 따른 흐름의 분기


// 강의에 앞서, 이제는 논리가 필요해요, 조건을 유심히 보면서, 참과 거짓을 
// 판별할 수 있는 눈이 필요해요

● 흐름의 분기가 필요한 이유

 - 사용자에 따라서 필요한 연산을 선택실행 할 수 있게 하기 위하여

 - 짜여진 각본이 아닌, 프로그램이 유연성을 갖게 끔 한다.



● if문에 의한 조건적 실행

 - 조건이 만족되는 경우에 한해서 실행

 ex) if(실행의 조건)
     {
        실행하고자 하는 내용
     }  // tip : 한문장이면 { } 를 생략가능

    ; 실행의 조건이 만족이 되면
      실행하고자 하는 내용을 실행한다.


예제) ====================================

// if(조건) : 만약에 (조건)이 이면 실행된다

#include <stdio.h>

int main()
{
int val;
printf("정수를 하나 입력하세요 : ");
scanf("%d", &val);

if(val < 0) // val값이 0보다 작을때 (조건이 참이면 밑을 실행한다.)
printf("입력값은 0보다 작다 \n");

if(val > 0) // val값이 0보다 큰 조건이 참이면
printf("입력값은 0보다 크다 \n");

if(val == 0) // val값이 0과 같으면
printf("입력값은 0이다 \n");

return 0;
}
// 조건검사를 3번한다.

예제) ====================================

#include <stdio.h>

int main()
{
int input;
float num1, num2;
float result;

puts("1. 덧셈  2. 뺄셈  3. 곱셈  4. 나눗셈");
printf("선택하여 입력 : ");   scanf("%d", &input);

printf("두개의 실수 입력 : ");
scanf("%f %f", &num1, &num2); // scanf 입력수를 복수이상 입력 가능
// tip : 정수 입력시, space키나  enter키로  구분하여 입력한다

if(input==1) // 만약 input이 1이면 실행
{
result = num1 + num2;
printf("결과 : %f \n", result);
}

if(input==2) // 만약 input이 2이면 실행
{
result = num1 - num2;
printf("결과 : %f ", result);
}

if(input==3) // 만약 input이 3이면
{
result = num1 * num2;
printf("결과 : %f \n", result);
}

if(input==4) // 만약 input이 4이면
{
result = num1 / num2;
printf("결과 : %f \n", result);
}
return 0;
}

// printf("결과 : %f \n", result); 값이 공통적으로 중복된다.
  ↓↓↓↓
보완한 결과) ====================================
#include <stdio.h>

int main()
{
int input;
float num1, num2;
float result;

puts("1. 덧셈  2. 뺄셈  3. 곱셈  4. 나눗셈 ");
printf("선택하여 입력 : ");
scanf("%d", &input);

printf("두개의 실수 입력 : ");
scanf("%f %f", &num1, &num2);

if(input==1) 
result = num1 + num2;

if(input==2) 
result = num1 - num2;

if(input==3)
result = num1 * num2;

if(input==4)
result = num1 / num2;

printf("결과 : %f \n", result);

return 0;
}
    중복된 코드를 좀더 수정해서 
==> 코드가 좀더 간결해졌다.

응용예제)==========================================

// 반복문(for문) 안에도 if가 올수 있다.

#include <stdio.h>

int main()
{
int loop;
for(loop=1; loop<100; loop++)
     // loop가 1부터 1씩증가해서 99가 될때까지 반복한다.
{
if(loop%3==0 && loop%4==0)
               // tip : (&&) : AND연산자 ( a조건 && b조건) ; 둘다 참이여야 실행
{
              // 만약에 loop 가 3으로 나누어 떨어지고, 4로도 나누어 떨어지면
printf("3의 배수이자 4의 배수");
printf("3, 4로 동시에 나눠어 떨어지는 수 : %d \n", loop);
}// tip : 문장이 한개인경우 '{}' 생략가능

}

return 0;
}

====================================================

※ 근데 여기서 잠깐!!
  >> if문만 쓰게 된다면 일일이 if문이 나올경우
      불필요한 연산을 다 하게 된다.
    
   else문을 더해서 if문의 조건이 맞지 않을경우 실행하게 분기를 둔다.

if(조건)
{
조건이 만족시 실행
}
else
{
if의 조건의 맞지 않을때
이 문장이 실행된다
}

예제)================================================

#include <stdio.h>

int main()
{
int val;

printf("정수를 한개만 입력하세요 : ");
scanf("%d", &val);

if(val < 0) // val 값이 0보다 작으면 밑에 printf문이 실행
printf("입력값은 0보다 작습니다 \n");
else      // if문의 조건이 거짓이면, 무조건 else 문이 실행된다.
printf("입력값은 0이거나 그보다 크다\n");

return 0;
}

=====================================================

else if() : if문의 조건이 아닌경우 다른 조건을 만족시키고 싶을때
설명보다는 예를 들어 설명하는 편이 훨씬 쉬울듯하네요

if(조건 1)
{
조건 1 만족시 실행
}

else if(조건 2)
{
조건 1이 만족되지 않고
조건 2가 만족되면 실행
}

else if(조건 3)
{
조건 1, 2이 만족되지 않고
조건 3이 만족되면 실행
}

else if(조건 4)
{
조건 1, 2, 3이 만족되지 않고
조건 4가 만족되면 실행
}

else
{
모든 조건(1, 2, 3, 4)가 만족되지 않으면
else 가 무조건 실행된다

// 만약에 조건 2을 만족하는 조건이라면
// if(조건1)을 검사한뒤
// else if(조건 2)를 실행하고, else if(조건3) else을 건너뛴 뒤
// 프로그램이 종료된다.

예제)================================================

tip1 : else if는 얼마든지 갯수를 많이해서 사용할수 있다.

tip2 : else if 사용시 무조건 if가 있어야 쓸수있다


#include <stdio.h>

int main()
{
int input;
float num1, num2;
float result;

puts("1. 덧셈  2. 뺄셈  3. 곱셈  4. 나눗셈 ");
printf("선택하여 입력 : ");
scanf("%d", &input);

printf("두개의 실수 입력 : ");
scanf("%f %f", &num1, &num2);

if(input==1) // 만약 input이 1이면 밑에 프로그램이 실행
{
result = num1 + num2;
printf("결과 : %f \n", result);

}

else if(input==2) // input가 1이 아니고 2라면 실행
{
result = num1 - num2;
printf("결과 : %f ", result);
}

else if(input==3) // input값이 1, 2가 아니고, 3일때 실행
{
result = num1 * num2;
printf("결과 : %f \n", result);

}

else if(input==4) // input값이 1, 2, 3이 아니고 4일때 실행
{
result = num1 / num2;
printf("결과 : %f \n", result);
}

else // 모든 경우가 거짓일때 실행한다.
printf("적절한 값의 입력이 아닙니다 \n");

return 0;


===================================================

  @ if ~ else 문은 하나의 문장이다.
  @ if ~ else 문은 중첩사용가능하다.

예제)==============================================

#include <stdio.h>

int main(void)
{
int val;
printf("정수를 하나 입력하세요 : ");
scanf("%d", &val);

if(val < 0) // val 값이 0보다 작다면 
printf("입력한 수는 0보다 작습니다 \n");

else
{              // vall값이 0보다 작지 않다면(0보다 크거나, 0과 같다는 조건이 남게된다)
if(val > 0) // val값이 0보다 크면
printf("입력한 수는 0보다 큽니다 \n");

else // 그게 아니라면 (즉, val값이 0과 같다면이라는 조건이 남게된다)
printf("입력한 수는 0입니다 \n");
}
return 0;
}

Posted by 토실토실천재
2010. 7. 8. 18:40
< 8장, 여러형태의 반복문 >



/* 이번장은 좀 생각을 많이 필요해요, 재밌게 해봅시다.(많이 중요해요) */

반복문이란?

- 반복문의 기능
> 특정 영역을 특정 조건이 만족하는 동안에 반복실행하기 위한 문장


반복문의 세가지 형태?
  (이 중에 한개만 이해하면 나머지는 아무것도 아닙니당)

- while문에 의한 반복 : while()

- do ~ while문에 의한 반복 : do while()

- for문에 의한 반복 for( ; ;)



● while문의 기본 원리와 의미

=============================
- while문의 구성 : 반복조건의 만족되는 동안 반복내용을 반복해서 실행하라

while(반복조건)
{

반복내용
}
==============================
// 예제 참고

문장이 2줄이상이면 { } 를 넣어준다.
하지만 콤마 연산자(,)를 사용해서 한줄로 나타낼수 있다
그렇다면{}를 없애도 된다.(한줄은 문장은 {}를 생략가능하다)

// 구구단 프로그램 연습하기
#include <stdio.h>

int main()
{
int i = 1;

printf("구구단 2단 입니다 ");

while(1)  //무한반복하란의미, 즉 ()안의 조건이 '1', 즉 항상 참이기때문
{
printf(" %d × %d = %d ", 2, i, 2*i); 
i++;              // 반복문이 실행이 될때마다 i값을 1씩 증가
if(i>9) break; // 만약에 i가 9보다 크면 break문을 써서 반복문을 빠져나온다
}
system("PAUSE");
return 0;
}

※ while(1)은 어떻게 될까요?
= > 0이 아닌 모든 숫자는 참이다
= > 항상 참이기때문에 무한반복이된다.
- 일반적으로 1을 쓴다 (프로그래머와의 약속) - 0이 아닌 어떤수를 넣어도 된다
    ex) 컴퓨터를 검색할때 쓰인다.

★ while문의 중괄호
: 반복하고자 하는 영역이 둘 이상의 문장으로 구성되는 경우 필수
 - 여러분이 이것저것 숫자 바꿔보고 연습해야함


● while문의 중첨
 > 여러분에게 있어서 고비 일수도 있습니다.

- while문안에 while문을 포함시킨다는 뜻

- 반복 구조내에서 또 하나의 반복 구조 형성

- 연습장 가지고 나름대로 그림그려가면서 공부하면 더 좋다.

- 백문이 불여일견, 백문이 불여일타

while문 안에 while문을 포함시킨다는 뜻
- 반복구조내에서 또하나의 반복구조 형성

예제=====================================
#include <stdio.h>
#include <windows.h>
using namespace std;

int main(void)
{
 int k, j;
 k = j = 0;
 int num=0;

 while(k < 3)
 {
 printf("**** 현재는 k = %d ", k);
 
   while(j < 3)
   {
    printf("현재 j는 %d ", j);
    num++;
    j++;
   }
   k++;
   j=0;
}
 system("PAUSE");
 return 0;
}
=========================================

오늘것만 이해하신거면 완전 성공한거
알쏭달쏭하다면 반 성공
전혀 모르겠다 => 더 잘됐다 이런분들이 더 빠질수 있다

※ do ~ while문과 while문의 차이점
  - do while문은 일단 한번 실행하고 나서 조건 검사를 진행

do{

반복내용

} while(반복의조건);

자 먼저 do내용을 먼저 한번 실행하고
while 반복조건을 검색한다

- while문은 한번도 실행이 안될수 있다   (조건검사를 먼저 하기때문)
- do ~ while문은 한번은 먼저 실행되고 조건을 검색하고 다시 반복된다.
>> 한번 먼저 실행하고 반복검사를 하면 프로그램을 더 좋을때가 많다.
>> 일반적으로 while문이 많이 쓰인다.


====================================================
/* 구구단출력 프로그램 */
#include <stdio.h>
#include <windows.h>
using namespace std;

int main(void)
{

int i = 2;          // i는 2부터 시작하니,
int j = 0;       

while(i<10)  // i가 10보다 작을때까지, 즉 9까지
{
j = 1;
while(j<10) // j는 10보다 작을때까지, 즉 9까지
{
printf("%d * %d = %d ", i, j , i*j); 
j++;
}
i++;  
}

====================================================
/* 입력한수 계속 더하기 */

#include <stdio.h>

int main()
{
int total = 0;
int val = 0;

do
{
printf("숫자 입력 ( 0 : quit) :");
scanf("%d", &val);
total+=val;
}
while(val!=0);
printf("Total : %d ", total);

system("PAUSE");
return 0;
}
====================================================

/*  원한는 단을 출력하는 구구단프로그램  */

#include <stdio.h>
#include <windows.h>

int main()
{
int val ;
int i = 1;

printf("출력하고자 하는 구구단, 몇 단? :");
scanf("%d", &val);

do
{
printf("%d * %d = %d ", val, i, val*i);
i++;
}
while(i<10);

return 0;
}


● for문의 기본 원리와 의미

 - 초기문 , 조건문, 증감문 모두를 기본적으로 포함
 - 가장 많이 사용되는 반복문

for(초기문; 조건문; 증감문)
{
반복하고자 하는 내용
}

 - 초기문 : 반복을 하고자하는 변수를 초기화 (딱한번만 실행)
 - 조건문 : 반복조건을 확인하는 문장
 - 증감문 : 반복의 조건을 어느시점에서 무너뜨리기 위한 증감

 ※ 대부분 반복문들은 잘 관찰하면 이 세가지가 항상 등장한다.


===========================================================
/* 0부터 입력한수까지의 합 구하는 프로그램 */

#include <stdio.h>
#include <windows.h>

int main(void)
{
int total = 0;
int i, n;

printf("0부터 n까지의 덧셈, n은? ");
scanf("%d", &n);

for(i=0; i<=n; i++) // i는 0부터시작해서 입력한 수 n보다 같거나 작을때까지
{                            // i는 1씩 증가
total += i;
}
printf("0부터 %d까지의 덧셈결과는 : %d", n, total);

system("PAUSE");
return 0;
}
===========================================================

이해하고 익숙해지면 for문이 더 이해하기 쉽다
- 초기문, 조건문, 증감문을 한눈에 볼수 있다

※ while문 do~while, for문으로 서로 막 바꿔가면서 연습을 해보세요

===========================================================
/* 양의정수를 입력을 반복하여 더해 평균을 구하는 프로그램 */
#include <stdio.h>
#include <windows.h>

int main(void)
{
float total = 0.0;
float input = 0.0;
int count = 0;

for(;input >=0.0;) // 이건 초기문, 증감문이 없다.
                       //  단, input값이 0.0보다 클때 라는 조건만 있따.
{
total += input; // 아
printf("양의 실수 입력(minus to quit) :");
scanf("%f", &input);
count++;
}

printf("지금까지의 평균 : %f ", total/count-1); // count는 한번더 +1을 하므로 -1을 해줌
return 0;
}

// for문의 초기문 증감문은 필요에 따라서 다른곳에 적어준다

// for(;;) = while(1) 즉, 무한루프를 의미

===========================================================
/* for문의 중첩반복을 통한 이해를 돕는 */

#include <stdio.h>
#include <windows.h>

int main(void)
{
int i, j;

for(i=0; i<3; i++)
{
printf("현재 i 는 %d *** ", i);

for(j=0; j<2;j++)
{
printf("현재 j는 %d ", j);
}
i++;
}
system("PAUSE");
return 0;
}


숙제 ===========================================================

다음과 같은 프로그램이 동작하도록
코드를 작성하세요


임의적으로 10을 입력


정답은 첨부파일참조

Posted by 토실토실천재
2010. 7. 8. 18:39
7장 비트 단위 연산과 상수, 기본자료형

개발도구 : Dec C++



& : 비트단위 연산 AND
          ex) a & b

 : 오른쪽 왼쪽 둘다 true 일때 1을 반환
   -> 1 & 1 일때만 1을 반환

ex) 0 & 1 ==> 0
     0 & 0 ==> 0
     1 & 1 ==> 1

EX) ========================================

#include <stdio.h>

int main()
{
    int a = 5;   // 0000 0101
    int b = 20;  // 0001 0100

    int c = a & b;

    printf("AND 연산결과 : %d \n", c); // 결과 4
    system("PAUSE");

    return 0;
}

| : 비트단위 연산 OR
   ex) a | b

 : 오른쪽 왼쪽 하나라도 true 일때 1을 반환
   -> 0 & 1 일때만 1을 반환

ex) 0 | 1 ==> 1
     0 | 0 ==> 0
     1 | 1 ==> 1

EX) ========================================

#include <stdio.h>

int main()
{
    int a = 5;   // 0000 0101
    int b = 20;  // 0001 0100

    int c = a | b;

    printf("OR 연산결과 : %d \n", c); // 결과 21
    system("PAUSE");

    return 0;
}


^ : 비트단위 연산 XOR
   ex) a ^ b

 : 두값이 서로 다를때 1을 반환
   -> 0 & 1 일때만 1을 반환

ex) 0 | 1 ==> 1
     0 | 0 ==> 0
     1 | 1 ==> 0

EX) ========================================

#include <stdio.h>

int main()
{
    int a = 5;   // 0000 0101
    int b = 20;  // 0001 0100

    int c = a ^ b ;

    printf("XOR 연산결과 : %d \n", c); // 결과 17
    system("PAUSE");

    return 0;
}

~ : 비트단위 연산 NOT
   ex) ~ a

 : 값을 반대로 나타낸다.
   -> 0은 1로, 1은 0으로 바뀐다.

ex) ~0  ==> 1
     ~1  ==> 0

EX) ========================================

#include <stdio.h>

int main()
{
    int a = 20;  // 0001 0100
   
    int c = ~a ; // 1110 1011

    printf("NOT 연산결과 : %d \n", c); // 결과 -21
    system("PAUSE");

    return 0;
}


<< : 비트단위 연산 왼쪽 쉬프트 연산

   ex)  a << b -> a의 비트들을 b칸씩 왼쪽으로 이동
         8 << 2 -> 8의 비트들을 왼쪽으로 2칸 이동

 : 8의 2인수 형태 : 0000 1000
   -> 1을 왼쪽으로 두칸 이동 : 0010 0000 ; 32

  ※ 부호비트 까지 밀려나기때문에 주의한다!

EX) ========================================


#include <stdio.h>

int main()
{
    int a = 8;


    int c = a << 2; // c = 32

    printf("%d의 << %d 만큼 비트연산한 결과 : %d \n", a, 2, c);
    system("PAUSE");

    return 0;
}

>> : 비트단위 연산 오른쪽 쉬프트 연산

   ex)  a >> b -> a의 비트들을 b칸씩 왼쪽으로 이동
         8 >> 2 -> 8의 비트들을 오른쪽으로 2칸 이동

#include <stdio.h>

int main()
{
    int a = -8;


    int c = a >> 2; // c = -2

    printf("%d의 >> %d 만큼 비트연산한 결과 : %d \n", a, 2, c);
    system("PAUSE");

    return 0;
}



자료형(data type) ; 자료를 나타내는 형(type)

 - 선언할 변수의 특징을 나타내는 문자(키워드)

 - 1. 정수냐? 실수냐?에 대해서 나타냄
   > 미리 선언을 하는것

 - 2. 메모리를 몇 byte 할당받아서 나타낼건지?
   > 저장할 데이타의 메모리공간 할당



기본자료형

 - 기본적으로 제공이 되는 자료형
    ex) int, float, double, long형



사용자 정의 자료형

 - 사용자가 정의하는 자료형

 - ex) 구조체, 공용체, 클래스(C++)



기본자료형의 종류

 char       1 byte   
 short      2 byte
 int        4 byte
 (64비트 운영체제 : 8byte)

 long       4 byte
 float
 double
 long doulbe



ANSI( 표준화된 문법제정) 99년도에 표준된 데이타표현

 - int가 4byte면 long은 4byte 이거나 그 이상이 되어야 함

 - 명확하지 않음 ;long(표준화되지 않았다고..)

 - long은 시스템에 따라 차이가 남(크기 : int <= long)
 
 - long double도 마찬가지로 인식을 한다.(long double >= double)



n비트로 표현할수 있는 데이타 수

 = 2(n승);
  ex) 1byte : 2(8승) = 256가지의 데이타 표현 -> char형



자료형이 다양한 이유? ;

 -=> 데이타 표현방식이 다르기때문
   - 정/실수형 데이타를 표현하는 방식

 -=> 메모리 공간을 적절히 사용하기 위해서



자료형 선택의 기준

 - 정수형 데이터를 처리하는 경우
  --> 컴은 int 형 연산을 가장 빠르게 한다.

ex) 1000의 수를 char 형에 넣지 못한다
     => char 형은 최대 256까지 표현가능
     => int 형이 적절(2의32승)


sizeof 연산자
 - 피연산자 메모리 크기를 반환
 
#include <stdio.h>

int main()
{
    int number = 5;
    printf("int 자료형의 크기 : %d \n", sizeof(number));
    printf("sizeof(int) ; %d \n", sizeof(int));
   
    system("PAUSE");
    return 0;
}

// 자료형 이름 (int) 는 괄호를 꼭 해줘야 한다. sizeof( int )
// 자료형 변수이름은 '()'괄호 생략 가능
// 그냥 괄호사용하는게 헷갈리지 않고 좋다.



자료형 선택

 - 정수형 데이타를 처리하는 경우
 
 - int가 내부적으로 연산을 가장 빠르게 한다.(정수표현)

 - char형 : 문자를 표현하기위한 자료형

 - float 형 : 소수이하 6자리까지 오차없이 처리 가능

 - double 형 : 소수이하 15자리까지 오차없이 처리 가능
   -> 정밀도가 얼마나 유지되나?

 => double에 대한 정밀도를 추구함!!   float은 정밀도 낮음


#include <stdio.h>

int main()
{
    float byun;
    float area;

    printf("정삼각형의 변입력 : ");
    scanf("%f", &byun);

    area = (byun * byun)/2;
    printf("정삼각형 넓이 : %f \n", area);
   
    system("PAUSE");
    return 0;
}
 
★ 메모리나 속도도 중요하지만 코딩시,
   프로그램은 얼마나 읽기 쉽게 작성을 하느냐?
   얼마나 코드를 유연성있게 작성을 하는가?   ★

상수는 일반적으로 대문자로 나타내어준다(관례)
초기화는 선언과 동시에 무조건 해주어야한다.



unsinged 가 붙어서 달라지는 표현

 - 기본자료형앞에 unsinged 를 붙여주면  무조건 데이타가 양수가 된다.
   > 음수의 데이타표현 범위가 양수로 바뀌게 되
   > 양수의 데이타 표현을 기본자료형의 두배로 표현 가능

 - 하지만 데이타 크기 자체는 변함 잆다.
  ex) unsigned char;
      unsigned int ;

 - 단, 실수형 자료에는 적용 되지 않음.



ASCII 코드를 이용한 문자표현
 
 - 컴퓨터는 내부적인 시스템은 2진수만 인식

 - 컴퓨터 자체는 문자, 그림, 소리 자료를 숫자로 변환해서

 - 2진수로 변환시켜서 저장

ex) A : 65, B : 66 C : 67
  => 컴퓨터와 사람과의 약속(컴퓨터는 문자를 이해못함)
  => ASCII 코드(ANSI : 미국표준협회에 의해 정의)
  => 아스키코드표 참고하세요


ASCII코드 범위 : 0~127 이하
                    char 형 변수로 처리 가능!

문자의 표현 : (' ') 를 통해 표현
컴퓨터가 아스키코드값을 확인해서 문자를 숫자로 저장.

ex) char as = 'A';  // A 아스키 코드값 65
      char a = 'a'    // a 아스키 코드값 97 

#include <stdio.h>

int main()
{
    char A = 'A';
    char B = 'B';
    char C = 'C';
    char D = 68;

    printf("%d \n", A);
    printf("%d \n", B);
    printf("%d \n", C);
    printf("%d \n", D);
    printf("%c \n", D);
   
    system("PAUSE");
    return 0;
}             



리터럴(literal) 상수

 - 이름을 지니지 않는 상수
   ex) 일반숫자

int number = 1 + 2;

해석하자면...

 // 1과 2를 메모리상에 올리고
 // cpu가 메모리공간에 올라간, 1, 2를 불러들려 계산하고
 // 메모리공간에 등록한  number 에다가 연산결과를 저장한다.

char c = 'A'        // 문자상수
int  in = 10         // 정수상수
double  dou = 3.14; // 실수상수

float f = 3.14 // float f = 3.14f

3.14는 double 형(8byte)
float(4바이트) <= (8byte) // 메모리 손실 가능성

접미사를 이용한 상수의 표현
unsinged int
long
....



심볼릭(Symblic) 상수 ; 이름을 지니는 상수

const 를 이용한 상수화

ex) cosnt int MIN = 200; // const 키워드 사용
    MIN = 100; // 불가

    const in MAX;  // 변수자체가 쓰레기 값으로 초기화
    MAX = 100; // 불가


Posted by 토실토실천재
2010. 7. 8. 18:38
준비물 : 필기도구, 연습장
 
 
 scanf 함수의 이해 <----> printf함수

 - 데이타를 입력받을때...
 
 - 10진수 정수형태를 입력해서 2번째 인자에 저장한다.
 
 - 배열, 포인터를 알아야 정확히 알수 있음.
 
 - 사용자가 직접 키보드를 이용해서 입력한 값을 변수에 대입을 하는것
 
 - scanf 함수를 이용한 정수의 입력
 
 - 변수의 주소값을 %d로 넘겨라
   > ex) 주소가 10번지면 %d는 10번지의 주소값이 들어간다
 
 
int main()
{
 int num;
 scanf("%d", &num) ;
 .....
 system("PAUSE");
 return 0;
}

                      
scanf("%d", &val);  //10진수 정수형으로 입력 받아서  변수 val에 저장하라
 
 

예제. 1) ======================================================



 
 
예제. 2) ==================================================
#include <stdio.h>
int main(void)
{
 int result;
 int num1, num2;
 printf("숫자 두개를 입력하세요 : ");
 scanf("%d %d", &num1, &num2);
 result = num1+num2;
 printf("%d + %d = %d \n", num1, num2, result);
 return 0;
}
=========================================================
 
scanf("%d %d %d \n", a, b);// 실행은 되지만 에러발생
                                                 // 메모리 참조 오류
 
 

● C언어의 키워드들
 
auto    _Bool   break case
char    int     do double
else    enum    float
while   void    sizeof
return  static  long ...... 등등
 
※ 키워드는 변수이름으로 사용불가하다!(예약된 언어다)
 
 
 

●  데이타 표현 방식의 이해
 
 - 컴퓨타가 데이타를 어떻게 표현을 할까?
 
 - 깊이 공부하기 위한 조건

진법에 대한 이해

 - n진수 표현 방식 : n개의 문자를 이용해서 데이타를 표현
   ex) 2, 8, 10 16진수

 - 컴퓨터는 내부적인 데이타 처리를 2진수로 처리
 
ex) 자리수 증가를 기준
 2 진수 : 0, 1
 8 진수 : 0 ~ 7
 10진수 : 0 ~ 9
 16진수 : 0 ~ 9, A ~ F 이용(a:10, b:11, c:12, ....f:15)
 
 

데이터의 표현 단위
 

1)bit(비트) : 데이타 표현의 최소단위, 2진수 값 하나
                 (0 또는 1)을 저장
 
2)byte(바이트) : 8bit == 1byte
 
이진수 ex)
.....128  64  32  16  8   4   2   1   0
 .....■  ■  ■  ■  ■  ■  ■  ■  ■
 
 

문제 3) ==========================================
 
 
 0 0 0 0 (0)
 0 0 0 1 (1)
 0 0 1 0 (2)
 0 1 0 0 (4)
 1 0 0 0 (8)

 
10진수 9를 2진수로 표현한다면?
 
10진수 43를 2진수로 표현한다면?
 
이진수 00010001 를 10진수 표현하면 얼마인가?

이진수 10011111 를 10진수 표현하면 얼마인가?
 
 
=====================================================
 
프로그램상의 8진수, 16진수 표현
 
 - 8진수 : 0으로 시작

 - 16진수 : 0x로 시작
 
int a = 10; // 10

int b = 0xa; // 16

int c = 012; // 10
 
 
 
예제. 3) ==================================================
 

 
#include <stdio.h>
 
int main()
{
 int a = 0xa7;
 int b = 0x43;
 int c = 032;
 int d = 024;
 printf("16진수 0xa7 : %d \n", a); // 17
 printf("16진수 0x43 : %d \n", b); // 7
 printf("8진수 032 : %d \n", c);  //
 printf("8진수 024 : %d \n", d);
 printf("a-b = %d \n", a-b);
 printf("c+b = %d \n", c+d);
 printf("b*c = %d \n", b*c);
 
 system("PAUSE");
 return 0;
}
// 컴퓨터의 모든 연산은 내부적으로 2진수로 한다.
 
 
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
정수와 실수의 표현 방식
 
  정수의 표현방식

 - MSB : 가장 왼쪽 비트, 부호를 표현

 - MSB를 제외한 나머지 비트 : 데이터의 크기 표현
 
1byte : 8bit
 

   <---데이타크기--->
■  ■  ■  ■  ■  ■  ■  ■

부호
비트
표현(+,-) (양수면 0음수면 1)
 
 
  00000001 (+1)
+ 10000001 (-1)
----------------
  10000010 (-2)     =>>> 이렇게 계산하면 오류이다
 
 
그럼 어떻게 할까?
 
※ 정확한 음의 정수 표현방식
 
1) 1의 보수를 취한다
  > 11111110
 
2) 1을 더한다
  > 11111111   ==>> -1의 2진형태
 
 
  00000001
+ 11111111
===========
 100000000  === 앞에 1은 무시되고 결국 '0'이된다.
 
☞ 2진수를 음수로 바꾸려면
   그 수의 1의 보수로 취해주고, 1을 더한다.
 
EX) 이진수 바꿈형태
    
    13 ÷ 2 ....1
     6  ÷ 2 ....0
     3  ÷ 2 ....1
              ....1
 
거꾸로 읽는다 : 1101 (13)
 
 
연습문제 : 10진수로 얼마 인가?
 
1) 0 1 0 0 1 1 1 1  [   ]
2) 0 1 1 0 0 1 1 1  [   ]
3) 1 1 0 1 0 1 1 0  [   ]
4) 1 1 1 1 0 0 0 0  [   ]
 
 
             
정수와 실수의 표현 방식
 
 - 컴퓨터는 실수보다 정수를 빠르게 처리한다.
 
 - 소수점이하의 작은 수가 생기면 한계를 지님
 
  Ex) -5.4 ?
      -5 + (-0,4) = -5.04
 
      근데 0.0001은 어떻게 나타낼까?
  - 오차가 존재하는 단점을 지님
 
  - ±(1.m)x2(e-127승)  <--- 부도소수점 표현방식

  ■ ■ ■ ■ ■ ■ ■ ■      ■ ■ ■ ■ ■ ■ ■ ■
  ↕  <---- m ------>      <------ e ------->
 부호
 비트
 
 0.0은 어떻게 표현할까?
 ===> 절대로 정확한 0.0에 가까운 값은 나타내지 못한다.
        부동수소점 오차 >> 모든컴퓨터는 이런식으로 표현
     
ex) 예제
 
   오차가 발생했다 -> 이걸 염두를 꼭 하기
     모든 프로그램밍 언어는 오차를 둘수 밖에 없다
   = 컴퓨터가 바보이기때문에

Posted by 토실토실천재