2010. 7. 10. 02:05
제 17장 포인터의 이해 - 예제

포인터에 대한 이해가 단번에 되기란 쉽지가 않습니다.
그렇기 때문에 예제를 몇개 올려서 여러분께서 직접 실행을 해보면서
이해를 하시기 바랍니다.


에제 1)

#include <stdio.h>

int main()
{
char c = 'B'; // 변수선언
int i = 19;
float f = 4.5f;

// & 연산자를 앞에 붙여줌으로써 주소값을 반환하게 한다.
// 주소를 printf함수로 십진수형태로 출력을 한다.

printf("c의 주소 = %d \n", &c);
printf("i의 주소 = %d \n", &i);
printf("f의 주소 = %d \n", &f);

return 0;
}


에제 2)

#include <stdio.h>

int main()
{
 
// 포인터 변수를 선언 방법 
// int a;
// int *p = &a; // ( int a; int *p; p = &a); 와 같은 표현이다.
// p를 포인터 선언하자 마자, a를 가리키게 한다.

// int type
int i = 300; // 선언한 변수와
int *pi = &i; // 포인터 변수를 선언시 둘의 타입이 같아야한다.
// pi는 i의 메모리주소를 값으로 가지고 있다.
// pi 는 i를 가리킨다로 표현한다.
//char type
char c = 'C';
char *pc = &c;

// short int type
short s = 32;
short *ps = &s;

printf("i = %d \n", i);
printf("*pi = %d \n\n", *pi);
// *pi : pi가 가르키는 변수의 값을 나타냄, 즉, i의 값 300 을 나타냄
printf("c = %c \n", c);
printf("*pc = %c \n\n", *pc);

printf("s = %d \n", s);
printf("*ps = %d \n\n", *ps);

return 0;

}



에제 3)

#include <stdio.h>

int main()
{
int a = 123;
int* p = &a; // int *p;
// p = &a;

printf(" a = %d \n", a);
printf("*p = %d \n", *p);

*p = 456; // p가 가리키는 변수의 값을 456으로 하겠다

printf("*p = 456; \/\/ 실행후 \n");
printf(" a = %d \n", a);
printf("*p = %d \n", *p);

return 0;
}


에제 4)

#include <stdio.h>

int main()
{
int i = 0x12345678; // 16진수형태
char *pc = (char*) &i;
// char형의 포인터 변수가 int형의 변수를 가리킨다
// 포인터와 변수 형을 맞추기 위해서 캐스팅연산을 해준다.

printf("i = %d \n", i);
// 10진수형태로 i의값을 출력

printf("*pc = %d \n", *pc);
// 값을 출력하면 120이 나오는데
// 120이 나온이유는 0x78 의 값이 10진수형태로 나오게 된것이다.
// 보통은 메모리값을 읽을때 뒤에서 부터 읽기때문에
// char 포인터 pc의 첫번째 주소는 0x78을 가리킨다.
// 자세한 사항은 댓글을 적어주시는분께 설명 드리겠음
return 0;
}


에제 5)

#include <stdio.h>

int main()
{
int a  = 100;

int* p = &a;

int* pp = &p; // 포인터를 가리키는 포인터
printf("   a = %d \n", a); // a값 출력 : 100
printf("  *p = %d \n", *p); // p가 그리키는 a의 값 출력 : 100
printf("  &a = %d \n", &a); // a의 메모리주소값 출력
printf("  &p = %d \n", &p); // p의 주소값이 출력
printf(" *pp = %d \n", *pp); // pp가 가리키는 변수의 값 출력

return 0;


}

에제 6)

#include <stdio.h>

int main()
{
int a = 200;
int *p = NULL; // NULL : 0값을 가진 변수
// 현재 p가 가리키는 값은 없다
if(NULL!=p) // 만약 p의 값이 0이 아니라면
*p = 30;


p = &a; // p는 a의 주소를 가진다(p는 a를 가리킨다)

if(!p) // if(NULL!=p) 같은 의미다
*p = 30;

printf("*p = %d \n", *p);

return 0;
}


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

제 19장 포인터의 이해 - 예제분석  (0) 2010.07.10
제 18장 포인터의 이해 - 2  (0) 2010.07.10
제 16장 포인터의 이해 - 1  (0) 2010.07.10
제 15장 1차원 배열 - 2  (0) 2010.07.10
제 14장 1차원 배열 - 1  (0) 2010.07.10
Posted by 토실토실천재
2010. 7. 10. 02:04


제 16장 포인터의 이해 - 1

※ 프로그램은 눈과 손이 아닌....그림과 말로 이해하는 습관으로!


포인터와 포인터 변수

 - 포인터는 변수이다(포인터 변수) : 상수가 될수 있긴함

 - 메모리의 주소값을 저장하기 위한 변수 ==> 포인터를 한다

 - 주소값과 포인터는 다른 의미임

 - 메모리구조를 항상 생각하면서 프로그램 하는 습관을 기르자!


   메모리구조(포인터)


#include <stdio.h>
{
char c = 'a';
int n = 7;
double d = 3.14;
....


↓↓↓


변수 c의 주소는 뭘까요? => 0x1000
변수 n의 주소는 뭘까요? => 0x1001
변수 d의 주소는 뭘까요? => 0x1005

 ☞ 변수의 주소는 주소의 시작번지로 표현된다.

참고 > 당신의 컴퓨터는 몇 bit 시스템인가요?
 -> bit수가 클수록 시스템의 성능은 좋아진다.
 -> 결정적인 bit가 정해지는 이유?? 

@ 즉, 8bit 시스템은 메모리의 주소값이 8자리로 표현된다.
  ex) 0001 0001, 0010 0001

  32비트면 32자리로 표현된다.(2의 32승, 즉 4G 까지 메모리 사용가능)
  그러므로 주소번지개수를 많이 만들수 있다

  8 비트 시스템은 포인터의 크기는 1바이트
  16비트 시스템은 포인터의 크기는 2바이트
  32비트, 64비트 시스템은 포인터가 최하 4바이트가 된다.(32bit = 4byte)

  pn이라는 n의 값을 가르킨다.

  
 


 포인터의 타입과 선언

 - * : 포인터 선언시사용되는 연산자

 - P형 포인터(P*) : P형(data type) 변수의 주소값을 지정
  > int 형 포인터 : int * p ;              // int형 변수를 가리키는 포인터
  > double 형 포인터 : double * lp; // double형 변수를 가리키는 포인터
  > char 형 포인터 : char * ch;      // char형 변수를 가리키는 포인터 

  ex) int* a;
      int * a;
      int *a;   // 이 3가지 다 똑같다.
  

 
주소관련 연산자

 - & 연산자 : 변수의 주소 값 반환(번지 연산자 / 주소연산자)

 - * 연산자 : 포인터가 가리키는 메모리 참조
예제)=============================================================   

#include <stdio.h>

int main()
{
int a = 200;
int *pA = &a;  // &a : a라는 변수의 주소값을 반환하라
// a의 주소값을 pA에 저장하라
// pA의 포인터는 a를 가리킨다
printf("%d \n", a);  // 직접접근
printf("%d \n", *pA);  // 간접접근

// pA자체만 출력한다면, a의 주소값을 출력할거다
// *pA : pA 변수가 가르키는 변수를 뜻함, 즉 a

return 0;
}

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

#include <stdio.h>

int main()
{
int a = 100;
int *pA = &a;

printf("pA : %d \n", pA);
printf("&a : %d \n", &a);

(*pA)++; // pA가 가리키는 변수 a의 값을 1 증가시킨다.

printf("a   : %d \n", a);
printf("*pA : %d \n", *pA);

return 0;
}

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

※(참고) * 용도 

1. 곱셈용도   
2. 포인터 선언   (int *p : p라는 int형 포인터 선언)
3. 포인터를 접근 (*p : p라는 포인터가 가르키는 변수의 값)
 

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

제 18장 포인터의 이해 - 2  (0) 2010.07.10
제 17장 포인터의 이해 - 예제  (0) 2010.07.10
제 15장 1차원 배열 - 2  (0) 2010.07.10
제 14장 1차원 배열 - 1  (0) 2010.07.10
제 13장 C언어의 핵심 함수 - 3  (0) 2010.07.10
Posted by 토실토실천재
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 토실토실천재