▩ 포인터(Pointer)


   - Pointer는 지시자의 뜻

   - 기억장치의 주소를 변수의 값으로 사용 하는것이 목적

   - 포인터 변수의 선언: 데이터 타입 *포인터변수명
     . int* pk; int * pk; int *pk;

   - & 연산자: 변수의 메모리상에 데이터가있는 주소를 알려줌
     . int k=10; 이라고 선언했다면 &k라고하는 것은 k라는 변수의 값 10이 있는 메모리의 주소를 가

       져옵니다.
     . k변수의 주소입니다.

   - 출력은 주소는 양수만 있음으로 %u로 출력함

   - * 표시는 포인터 변수 선언문이 아닌 곳 즉 수식문에서는 그 포인터 변수가 가지고 있는 주소의

       값을 가지고 옴

   - 포인터 변수는 Borland C에서는 2바이트, Visual C++에서는 4바이트임

   - 포인터를 사용하면 함수로 인자의 주소를 전달할 수 있어 매우 편리하다.
     scanf("%d", &kuk);의 경우를 이해할 것. 


#include <stdio.h>

void main( void )
{
   int   i, result;
   float fp;
   char  c, s[81], d;


   //printf("%d", d);
   //exit(0);
  
   printf( "\n\n정수, 실수, 문자, 문자열을 입력하세요.\n");

   result = scanf( "%d %f %c %s %d", &i, &fp, &c, s, d);
   printf( "\n입력받은 데이터의 수 %d\n", result );
   printf( "The contents are: %d %f %c %s %c\n", i, fp, c, s, d);

}


   - 포인터 변수는 더하거나 빼는 연산을 할 수 있다.
    . 포인터 변수 + 1: 포인터 변수가 가리키는 곳의 주소가 포인터 변수의 데이터형 만큼 증가한다.
    . *포인터 변수 + 1: 포인터 변수가 값으로 가지고있는 주소가 가르키는 값을 1 증가 시킨다.
    . *(포인터 변수 + 1): 포인터 변수가 가리키는 곳의 주소를 포인터 변수의 데이터형 만큼 증가시

      킨 후 그 값을 1 증가시킨다.



1. 포인터 변수의 선언
     int k=10;
     int *kp = &k;
     printf("%d\n", *kp);  라고 선언하면
     . int *kp는 포인터 변수를 의미한다.
     . &k는 k변수의 주소를 의미한다.
     . 포인터 변수 kp는 k의 주소를 저장한다.
     . kp는 int형 포인터 변수임으로 int형 변수의 주소만 저장할 수 있다.
     . 수식문에서 *kp라고하면 kp가 값으로 가지고있는 주소의 값을 가져온다.



>>>>> 포인터 변수의 선언


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int i;

   printf("i의 값은 %d입니다.\n", i);
   printf("i의 주소는 %X입니다.\n", &i);

   printf("\ni의 값을 입력하세요 : ");
   scanf("%d",&i);
  
   printf("i의 값은 %d입니다.\n", i);
   printf("i의 주소는 %X입니다.\n", &i);
   getch();
 }




>>>>> 정수형 변수의 주소 출력, 주소 할당의 진행 방향의 이해


 #include <conio.h>
 #include <stdio.h>

 void main() {
   int i = 10;
   int j = 20;
   int k = 30;
 
   printf("정수형 변수 i의 값은 %d입니다.\n", i);
   printf("정수형 변수 i의 주소는 %u입니다.\n", &i);

   printf("정수형 변수 j의 값은 %d입니다.\n", j);
   printf("정수형 변수 j의 주소는 %u입니다.\n", &j);

   printf("정수형 변수 k의 값은 %d입니다.\n", k);
   printf("정수형 변수 k의 주소는 %u입니다.\n", &k);
   getch();
 }




>>>>> 다양한 데이터형의 주소 출력


   char c = 'A';
   int i = 10;

 변수의 선언 형태가 위와 같을 경우 Borland C는 int변수는 2바이트를 사용하고 1바이트는 버린다.
   VisualC++은 char는 무조건 4바이트를 사용합니다.


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char c = 'A';
   int i = 10;
   float f = 2.1;
   char c1 = 'A';
   char c2 = 'B';
 
   printf("문자형 변수 c의 값은 %c입니다.\n", c);
   printf("문자형 변수 c의 주소는 %u입니다.\n", &c);

   printf("정수형 변수 i의 값은 %d입니다.\n", i);
   printf("정수형 변수 i의 주소는 %u입니다.\n", &i);

   printf("실수형 변수 f의 값은 %f입니다.\n", f);
   printf("실수형 변수 f의 주소는 %u입니다.\n", &f);

   printf("문자형 변수 c1의 값은 %c입니다.\n", c1);
   printf("문자형 변수 c1의 주소는 %u입니다.\n", &c1);

   printf("문자형 변수 c2의 값은 %c입니다.\n", c2);
   printf("문자형 변수 c2의 주소는 %u입니다.\n", &c2);

   getch();
 }




2. 포인터 변수의 작동

   메모리 할당 모델                               대응하는 소스코드
   =========================================================
       Mapping 변수명    주소    값
   ----------------------------------
              int k             1000    10                int k = 10;      
   ----------------------------------
              int m             996     20                int m = 20;
   ----------------------------------
              int* pk          992     1000              int* pk = &k;
   ----------------------------------
              int* pm          988     996               int* pm = &m;
   ----------------------------------



>>>>> 다양한 데이터형의 포인터 변수의 출력


  #include <stdio.h>
 #include <conio.h>

 void main() {
   char c='A';
   int i=10;
   float f=2.1f;

   char *cp;  //char형 변수의 주소를 저장합니다.
   int *ip;   //int형 변수의 주소를 저장합니다.
   float *fp; //float형 변수의 주소를 저장합니다.

   //각종 타입의 변수의 주소를 포인터 변수에 저장
   cp=&c;
   ip=&i;
   fp=&f;

   printf("문자형 포인터 cp의 값은 %c입니다.\n", *cp);
   printf("정수형 포인터 ip의 값은 %d입니다.\n", *ip);
   printf("실수형 포인터 fp의 값은 %f입니다.\n", *fp);

   printf("char형 변수 c의 주소:%d \n", &c);
  
   getch();
 }



변수   주소   값
-----------------
c      5052   A     <--- c='A'
i      5048   10
f      5044   2.1f
cp     5040   5052  <--- cp = &c;
ip     5036   5048  <--- ip = &i;
fp     5032   5044  <--- fp = &f;

- c: 'A'
- &c: 5052

- cp: 5052
- &cp: 5040
- *cp: 'A'




>>>>> 포인터 변수의 초기화


   char *cp=&c;
   은 char *cp;    cp=&c;로 분리 실행된다.


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char c='A';
   int i=10;
   float f=2.1;

   char *cp=&c;
   int *ip=&i;
   float *fp=&f;

   printf("문자형 포인터 cp의 값은 %c입니다.\n", *cp);
   printf("정수형 포인터 ip의 값은 %d입니다.\n", *ip);
   printf("실수형 포인터 fp의 값은 %f입니다.\n", *fp);
   getch();
 }




UP!!!▷ 'k'라는 변수를 선언해 100을 대입하고, 'kp'라는 포인터 변수를 선언하고,
        'kp'란 포인터 변수를 이용해 'k'의 값을 출력하는 프로그램을 작성하세요.




>>>>> 포인터 변수 자신의 주소 출력하기 1


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int i=10;
   int *ip=&i;  //i 변수의 주소를 ip포인터 변수에 할당합니다.

   printf("==================================================\n");

   printf("i의 값은 %d입니다.\n\n", i);

   printf("i의 자신의 주소는 %u입니다.\n", &i);
   printf("ip의 값은 %u입니다.\n\n", ip);

   printf("ip가 가지고 있는 주소의 값은 %d입니다.\n", *ip);
   printf("ip의 자신의 주소는 %u입니다.\n", &ip);

   printf("==================================================\n");
   getch();
}





3. 아래와 같이 선언된 경우 c 변수는 1바이트를 버린다., Visual C는 무조건 4바이트씩 사용


>>>>> 포인터 변수 자체의 주소 출력


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char c='A';
   int i=10;
   float f=2.1;

   char *cp=&c;
   int *ip=&i;
   float *fp=&f;

   printf("==================================================\n");
   printf("①문자형 변수 c의 값은 %c입니다.\n", c);
   printf("②문자형 변수 c의 주소는 %u입니다.\n", &c);
   printf("③문자형 포인터 cp의 값은 %c입니다.\n", *cp);
   printf("④문자형 포인터 cp의 실제 주소는 %u입니다.\n", &cp);
   printf("⑤문자형 포인터 cp의 참조 주소는 %u입니다.\n", cp);
   printf("==================================================\n");
   printf("⑥정수형 변수 i의 값은 %d입니다.\n", i);
   printf("⑦정수형 변수 i의 주소는 %u입니다.\n", &i);
   printf("⑧정수형 포인터 ip의 값은 %d입니다.\n", *ip);
   printf("⑨정수형 포인터 ip의 실제 주소는 %u입니다.\n", &ip);
   printf("⑩정수형 포인터 ip의 참조 주소는 %u입니다.\n", ip);
   printf("==================================================\n");
   printf("⑪실수형 변수 f의 값은 %f입니다.\n", f);
   printf("⑫실수형 변수 f의 주소는 %u입니다.\n", &f);
   printf("⑬실수형 포인터 fp의 값은 %f입니다.\n", *fp);
   printf("⑭실수형 포인터 fp의 실제 주소는 %u입니다.\n", &fp);
   printf("⑮실수형 포인터 fp의 참조 주소는 %u입니다.\n", fp);
   printf("==================================================\n");
   getch();
}


--출력 결과
==================================================
①문자형 변수 c의 값은 A입니다.
②문자형 변수 c의 주소는 1245052입니다.
③문자형 포인터 cp의 값은 A입니다.
④문자형 포인터 cp의 실제 주소는 1245040입니다.
⑤문자형 포인터 cp의 참조 주소는 1245052입니다.
==================================================
⑥정수형 변수 i의 값은 10입니다.
⑦정수형 변수 i의 주소는 1245048입니다.
⑧정수형 포인터 ip의 값은 10입니다.
⑨정수형 포인터 ip의 실제 주소는 1245036입니다.
⑩정수형 포인터 ip의 참조 주소는 1245048입니다.
==================================================
⑪실수형 변수 f의 값은 2.100000입니다.
⑫실수형 변수 f의 주소는 1245044입니다.
⑬실수형 포인터 fp의 값은 2.100000입니다.
⑭실수형 포인터 fp의 실제 주소는 1245032입니다.
⑮실수형 포인터 fp의 참조 주소는 1245044입니다.
==================================================




4. 포인터 변수의 이용
 #include <stdio.h>
 #include <conio.h>

 void main() {
   int i=20;
   int *ip;
   int *ip2;

   ip = &i;

   printf("ip       : %u\n", ip);  //1245052
   printf("*ip      : %d\n", *ip); //20
   printf("i의 주소 : %u\n\n", &i); //5052


   *ip = 50;

   printf("*ip      : %d\n", *ip);  //50
   printf("i의 주소 : %u\n", &i);    //5052
   printf("ip 포인터 변수 자체의 주소 : %u\n\n", &ip); //5048

   ip2 = &i;  //
   *ip = 100;

   printf("i의 값 : %d\n", i);    //100
   printf("ip2    : %u\n", ip2);  //5052
   printf("*ip    : %d\n", *ip);  //100
   printf("*ip2   : %d\n", *ip2); //100
   printf("ip2 포인터 변수 자체의 주소 : %u\n\n", &ip2); //5044
   getch();

 }

Posted by 나비:D
:

▩ 다차원 배열


   - 1차원배열의 연속적인 형태
   - 논리적으로 테이블의 구조를 가지고 있으나 메모리상으로는 1차원배열의 연속임
   - 배열 처리시 일반적으로 for문이 2개이상 사용되는 경우가 많음
   - 배열명은 배열의 첫 요소의 주소를 가지고 있으나 상수형태임으로 포인터 변수처럼 배열의 주

     소를 증감할 수 없음


1. 2차원 배열
   - 자료형  배열 이름[첨자1, 행][첨자2, 열]
   - 2차원 배열의 선언
     . int arr[3][3];
     . char arr[3][3] =
       {
         {'A', 'B', 'C'},
         {'D', 'E', 'F'},
         {'G', 'H', 'I'},
       };


2. 3차원 배열
   - 자료형  배열 이름[첨자1, 면][첨자2, 행][첨자3, 열]
   - 3차원 배열의 선언
   int arr[2][3][4] =
   {
     {
       {1, 2, 3, 4},
       {5, 6, 7, 8},
       {9, 10, 11, 12}
     },
     {
       {51, 52, 53, 54},
       {55, 56, 57, 58},
       {59, 60, 61, 62}
     }
   };





▩ 다차원 배열 예제



>>>>> 2차원 배열의 사용


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int arr[3][4];
   int k, m;

   for(k=0; k<3; k++) {
      for(m=0; m<4; m++){
        arr[k][m]=k+m;
//        printf("arr[%d][%d]=%d  ", k, m, k+m);
        printf("k=%d m=%d  k+m=%d / ", k, m, k+m);
      }
      printf("\n");
   }

   printf("\n");

   for(k=0; k<3; k++) {
      for(m=0; m<4; m++){
        printf("arr[%d][%d] = %d  ", k, m, arr[k][m]);
      }
      printf("\n");
   }
   getch();
 }


UP!!!▷ 배열에 2의 배수로 입력되어 출력되도록 수정하세요.



>>>>> 2차원 배열에 값을 입력받아 역순으로 출력하는 프로그램


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int arr[2][3];
   int k, m;

   for(k=0; k<2; k++) {
      for(m=0; m<3; m++) {
        printf("arr[%d][%d]의 값을 입력하세요 : ", k, m);
        scanf("%d", &arr[k][m]);
      }
   }

   for(k=1; k>=0; k--) {
      for(m=2; m>=0; m--){
        printf("arr[%d][%d] = %d  ", k, m, arr[k][m]);
      }
      printf("\n");
   }
   printf("\n");
   printf("for문이 끝난 후의 k, m값:k=%d m=%d\n", k, m);
   getch();
 }



>>>>> 2차원 배열의 초기화 1


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char arr[3][3] =
   {
     {'A', 'B', 'C'},
     {'D', 'E', 'F'},
     {'G', 'H', 'I'},
   };
   int k, m;

   for(k=0; k<3; k++) {
      for(m=0; m<3; m++){
         printf("arr[%d][%d] = %c  ", k, m, arr[k][m]);
      }
      printf("\n");
   }
   getch();
 }



>>>>> 2차원 배열의 초기화 2


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char arr[3][3] =
   {
     {'A', 'B', 'C'},
     {'D', 'E', 'F'},
     {'G', 'H', 'I'},
   };
   int k, m;

   printf("* 원래의 값 * ===============================\n");
   for(k=0; k<3; k++) {
      for(m=0; m<3; m++){
         printf("arr[%d][%d] = %c  ", k, m, arr[k][m]);
      }
      printf("\n");
   }

   printf("* 변경된 값 * ===============================\n");
   for(k=0; k<3; k++) {
      for(m=2; m>=0; m--){
         printf("arr[%d][%d] = %c  ", k, m, arr[k][m]);
      }
      printf("\n");
   }
   getch();
 }



>>>>> 3차원 배열의 사용


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int arr[2][3][4] =
   {
     {
       {1, 2, 3, 4},
       {5, 6, 7, 8},
       {9, 10, 11, 12}
     },
     {
       {51, 52, 53, 54},
       {55, 56, 57, 58},
       {59, 60, 61, 62}
     }
   };
   int k, m, n;

   for(k=0; k<2; k++) {
      for(m=0; m<3; m++) {
  for(n=0; n<4; n++){
     printf("arr[%d][%d][%d] = %d  ", k, m, n, arr[k][m][n]);
  }
            printf("\n");
      }
   printf("\n");
   }
   getch();
 }

Posted by 나비:D
:

▩ 배열의 개념과 1차원 배열


   - 같은 데이터형을 가진 데이터들의 집합
   - 데이터의 형태가 집합적인 형태를 가지면서 같은 처리 방식을 가질 경우 사용
   - 배열은 인덱스를 이용하여 각 요소가 구분됨
   - 배열의 인덱스는 0부터 n-1까지 사용함
   - 배열 처리시 일반적으로 for문을 1개 정도 동반함
   - 배열의 선언:
     . int arr[5]; - 5개의 정수를 저장할 수 있는 배열을 선언합니다.
     . int arr[5] = {1,2,3,4,5};
       5개의 정수를 저장할 수 있는 배열을 선언하면서 5개의 정수를 배열에 저장합니다.

1. 배열에 값을 저장한 다음 출력하는 일반적인 프로그램

 #include <stdio.h>
 #include <conio.h>

 void main() {
   int i;
   int arr[10];

   for(i=0; i<10; i++)
      arr[i]=i;

   for(i=0; i<10; i++)
      printf("arr[%d] = %d\n", i, arr[i]);
   getch();
 } 




▩ 1차원 배열, 2차원 배열 예제



>>>>> 1차원 배열의 사용


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int k;
   int arr[10];

   for(k=0; k<10; k++)
      arr[k]=k;

   for(k=0; k<10; k++)
      printf("arr[%d] = %d\n", k, arr[k]);
   getch();
 }


UP!!!▷ 배열에 들어가는 값이 1부터 10이 되도록 수정하세요.


UP!!!▷ tot란 변수에 배열의 모든 값의 합을 구해서 출력해 보세요.


UP!!!▷ 배열에 들어가 있는 값중에 짝수인 수들의 합을 구해서 출력해 보세요.



>>>>> 영어 대문자를 배열에 저장하고, 역순으로 출력하는 프로그램


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int k;
   char alpha[26];

   for(k=65; k<=90; k++){
      alpha[k-65]=k;
   }

   for(k=90; k>=65; k--){
      printf("alpha[%d] = %c\n", k-65, alpha[k-65]);
   }
   getch();
 }


UP!!!▷ 알파벳이 Z부터 역으로 5개씩 출력되는 프로그램으로 수정하세요.


UP!!!▷ 알파벳이 A부터 5개씩 출력되는 프로그램으로 수정하세요.




▩ 최대/최소값 추출의 원리


   - MAX변수에는 최소값을 초기값으로 준다.
   - MIN변수에는 최대값을 초기값으로 준다.
     0 ~ 3000 사이의 데이터를 기준으로 한다면 max=0, min=3000으로 주어야 한다.

   - if문을 이용하여 최대값보다 큰 값이 나타나면 최대값에 새로운 값을 대입한다.
     if (max < readData) max = readData;

   - if문을 이용하여 최소값보다 작은 값이 나타나면 최소값에 새로운 값을 대입한다.
     if (min > readData) min = readData;



>>>>> 배열의 이용(입력 수의 범위:0~3000)


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int i, mx_cn=1, mn_cn=1;
   int max=0, min=3000;
   int jum[5];

   for(i=0; i<5; i++) {
      printf("%d번째 수를 입력하세요 : ", i+1);
      scanf("%d", &jum[i]);
   }

   for(i=0; i<5; i++) {
      if(jum[i]>max) {
  max=jum[i];
  mx_cn=i+1;
      }
      if(jum[i]<min) {
  min=jum[i];
  mn_cn=i+1;
      }
   }
   printf("\n");
   printf("최대값 : %d, 입력번호 : %d\n", max, mx_cn);
   printf("최소값 : %d, 입력번호 : %d\n", min, mn_cn);
   getch();
 }



>>>>> 배열의 크기


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int k;
   int num[] = {25, 36, 45, 45};
   char alpha[] = {'A', 'B', 'E'};

   for(k=0; k<4; k++)
      printf("배열 num[%d]의 크기 : %d\n", k, sizeof num[k]);
      printf("배열 num의 크기 : %d\n", sizeof(num));

   for(k=0;k<3;k++)
      printf("배열 alpha[%d]의 크기 : %d\n", k, sizeof alpha[k]);
      printf("배열 alpha의 크기 : %d\n", sizeof(alpha));
   getch();
 }




>>>>> 문자열의 초기화


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char alpha1[] = {'A', 'B', 'C', 'D', 'E'};
   char alpha2[] = {'A', 'B', 'C', 'D', 'E', '\0'};
   char alpha3[] = "ABCDE";

   printf("배열 alpha1의 내용 : %s\n", alpha1);
   printf("배열 alpha1의 크기 : %d\n", sizeof(alpha1));
   printf("\n");
   printf("배열 alpha2의 내용 : %s\n", alpha2);
   printf("배열 alpha2의 크기 : %d\n", sizeof(alpha2));
   printf("\n");
   printf("배열 alpha3의 내용 : %s\n", alpha3);
   printf("배열 alpha4의 크기 : %d\n", sizeof(alpha3));
   getch();
 }




>>>>>  문자 배열의 이용


 #include <stdio.h>
 #include <conio.h>

 void main() {
   char fm[]= "File MENU";
   char em[]= "Edit MENU";
   char hm[]= "Help MENU";
   char wm[]= "Wrong Input";
   char c;

   printf("메뉴 코드를 입력하세요 : ");
   if((c=getch()) >= 97) c -= 32;

   while(c!='X') {
     switch(c) {
     case 'F' :
  printf("\n%s\n", fm);
  break;
     case 'E' :
  printf("\n%s\n", em);
  break;
     case 'H' :
  printf("\n%s\n", hm);
  break;
     default :
  printf("\n%s\n", wm);
     }
     printf("계속하려면 메뉴 코드를, 종료하려면 X를 누르세요.");
     if((c=getch()) >= 97) c -= 32;
   }
   printf("\n프로그램을 종료합니다.");
   getch();
 }





[참고] 데이터 정렬의 원리
   - swap 알고리즘
     a[0]=100, a[1]=200의 값을 바꾸는 경우, temp는 임시변수

     temp=a[0];
         ↙
     a[0]=a[1];
         ↙
     a[1]=temp;


           temp
       ①↗    ↘ ③
     a[0]   ←   a[1]  
            ② 

       기준수 a[0], 총 비교횟수 4회
       ↓
 비교1 500      400 300 100 200
 비교2 400      500 300 100 200 a[0], a[1] 비교후의 수
 비교3 300      500 400 100 200 a[0], a[2] 비교후의 수
 비교4 100      500 400 300 200 a[0], a[3] 비교후의 수
          100      500 400 300 200 a[0], a[4] 비교후의 수


            기준수 a[1], 총 비교횟수 3회
           ↓
 비교1 100 500      400 300 200
 비교2 100 400      500 300 200 a[1], a[2] 비교후의 수
 비교3 100 300      500 400 200 a[1], a[3] 비교후의 수
          100 200      500 400 300 a[1], a[4] 비교후의 수


                     기준수 a[2], 총 비교횟수 2회
                    ↓
 비교1 100 200      500 400 300
 비교2 100 200      400 500 300 a[2], a[3] 비교후의 수
          100 200      300 500 400 a[2], a[4] 비교후의 수


                        기준수 a[3], 총 비교횟수 1회
                       ↓
 비교1 100 200 300      500 400
          100 200 300      400 500 a[3], a[4] 비교후의 수


for (i=0; i<=3; i++)  <-- 기준수
   for(j=i+1; j<=4; j++)  <-- 대응수



>>>>> 5개의 정수를 입력받아 정렬하는 프로그램


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int i, j, t;
   int jum[5];

   for(i=0; i<5; i++) {
   printf("%d번째 수를 입력하세요 : ", i+1);
   scanf("%d", &jum[i]);
   }
   printf("\n");
   printf("입력된 자료\n");

   for(i=0; i<5; i++) {
   printf("%d ", jum[i]);
   }

   for(i=0; i<=3; i++) {
      for(j=i+1; j<=4; j++) {
         if(jum[i]>jum[j]) {
           t=jum[i];
           jum[i]=jum[i];
           jum[j]=t;
  }
      }
   }
   printf("\n정렬된 자료\n");

   for(i=0; i<5; i++) {
      printf("%d ", jum[i]);
   }
   getch();
 }

Posted by 나비:D
:

▩ Call By Value를 이용한 함수로의 데이터 전달 방법


   - Call By Value로 사용되는 데이터타입은 원시데이터 타입인 char, short int, int, float... 수

     치 형태의 데이터 전부 해당
     ※ 문자열이나 주소 형태의 데이터는 Call By Reference입니다.

1. EXE 프로그램의 Memory 사용영역(System Memory Model)
   - 기본적으로 64Kb의 조각 메모리를 5가지 단계의 방법으로 사용하는 모델을 가지고 있습

     니다.
┌────────────┐CS: Code Segment
│[코드 영역]                   │
│C의 Source가 등록되는  │
│영역, 각종 함수             │
├────────────┤DS: Data Segment
│[Data 영역]                   │
│static변수,                     │
│static 메소드 저장          │
│한번 초기화가 진행되면  │
│재 초기화가 발생안됨     │
├────────────┤SS: Stack Segment
│[Stack 영역]                  │
│함수가 사용하는 영역     │
│함수 안에서 선언되는     │
│지역변수가 선언,           │
│함수 처리가 끝나면        │
│메모리가 자동으로         │
│회수됨, 지역변수 삭제    │
├────────────┤
│[Heap 영역]                  │
│malloc() 함수를 이용해   │
│동적으로 메모리를 할당 │
│하는 영역                      │
│개발자 필이 메모리        │
│해야만 함                      │
└────────────┘

 

2. Call By Value 방식을 이용한 데이터의 전달, 메뉴 코드를 입력받아 메뉴 문자열을 출력하는 프로그램
 #include <stdio.h>
 #include <conio.h>

 void print_menu(char m) {
   switch(m) {
      case 'F' :
        printf("\nFile MENU\n");
        break;
      case 'E' :
        printf("\nEdit MENU\n");
        break;
      case 'H' :
        printf("\nHelp MENU\n");
        break;
      default :
        printf("\n잘못된 입력입니다.\n");
   }
 }

 main() {
   char c;
   printf("메뉴 코드를 입력하세요 : ");
   if((c=getch()) >= 97) c -= 32;

   while(c!='X') {
     print_menu(c);
     printf("메뉴코드를 입력하세요. 종료하려면 X를 누르세요.");
     if((c=getch()) >= 97) c -= 32;
   }
   printf("\n프로그램을 종료합니다.");
   getch();
 }


3. 입력된 값의 제곱값을 구하는 프로그램
 #include <stdio.h>
 #include <conio.h>

 long int sqr(int i) {
   long int res;

   if(i>0) {
     res=(long)i *(long)i;
     return res;
   }
   else if(i==0)
     return 0;
   else
     return -1;
 }

 main() {
   int a;
   char c;

   printf("시작하려면 ENTER를 누르세요.\n");
   c=getch();
   while(c!='X') {
     printf("\n계산하려는 숫자를 입력하세요 : ");
     scanf("%d", &a);
     printf("%d의 제곱은 %ld입니다.\n", a, sqr(a));
     printf("계속하려면 아무키나 누루세요, 종료하려면 X를 누르세요.");
     if((c=getch()) >= 97) c -= 32;
   }
   printf("\n프로그램을 종료합니다.");
   getch();
 }




4. 국어, 영어, 수학 점수를 (1~100점) main()함수에서 입력받아 총점은 tot(kor, eng, mat) 함수에

   서, 평균은 ave(kor, eng,mat) 함수에서 구한후 main()함수에서 출력하는 프로그램을 만들어 보

  시오.

 #include <stdio.h>
 #include <conio.h>

 int tot(int kor, int eng, int mat);
 float ave(int kor, int eng, int mat);

 void main() {
   int kor, eng, mat;
     
   printf("국어 점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어 점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학 점수를 입력하세요 : ");
   scanf("%d", &mat);

   printf("\n국어\t영어\t수학\t총점\t평균\n");
   printf("--------------------------------------\n");
   printf("%d\t%d\t%d\t%d\t%5.1f\n", kor, eng, mat, tot(kor,eng,mat), ave(kor,eng,mat));
   getch();
 }
 
 int tot(int kor, int eng, int mat){
    int tot;
    tot = kor+eng+mat;
    return tot;
 }

float ave(int kor, int eng, int mat){
    float ave;
    ave = (kor+eng+mat)/3.0;
    return ave;
}

/*
소스영역    Stack영역
--------    ---------
main()      int kor   90 -┐
               int eng   90 │
               int mat   90  │
---------   ---------  │
tot()         int kor ←-─┘90 복사    
               int eng
               int mat
               int tot
---------   ---------
ave()       int kor
              int eng
              int mat
              float ave
*/



▷ 아래처럼 학점이 출력되는 프로그램으로 수정하세요. (90~100: A, 80~89: B, 70~79:C, 60~69: D, 59이하:F)

국어 점수를 입력하세요 : 85
영어 점수를 입력하세요 : 90
수학 점수를 입력하세요 : 90

과목: 국어    영어    수학    총점    평균
-------------------------------------------
점수: 85      90      90      265      88.3
학점: B       A       A     



▩ 함수의 설계


1. 지하철 승차권 판매 함수 설계
#include <stdio.h>
#include <conio.h>

//처리 로직 시작 함수 void sale(점검중|판매중)
void sale(int k);

//목적지 입력 함수
int target(); 

//동전 금액 입력 void coin(목적지 금액)
void coin(int kum);

//승차권 인쇄
//void print_ticket(목적지 금액,입력 금액);
void print_ticket(int kum, int tot);

void main(){
    int k;  //1:판매중, 2:점검중 구분

    sale(1);  
    getch();
}

void sale(int k){
    int sw=1;
    if (k == 0){
        printf("판매기 점검중\n");   
        return;
    }

    if (k == 1){
        printf("판매기 작동중\n");
        while(sw){
            sw=target();
        }
    }

}

int target(){
    int kum;  //금액 입력
    int sw=1; //0: 정상 금액, 1: 비정상 금액
   
    printf("                  승차권                      \n");
    printf("----------------------------------------------\n");   
    printf("승차권: 700 750 800 850 900 950 1000 1050 1100\n\n");

    while(sw){
        printf("목적지에 해당하는 금액을 눌러 주세요. ");
        scanf("%d", &kum);

        if (kum==9999) {
            printf("\n점검중입니다.\n");
            return 0;
        }else if (kum < 700){
            printf("700원 이하 승차권은 없습니다.\n");
        }else if (kum > 1100) {
            printf("1100원을 초과하는 승차권은 없습니다.\n");
        }else if (kum % 50) {
            printf("승차권은 50원 단위입니다.\n");
        }else{
            sw=0;
        }
    }
    coin(kum);
    return 1;
}

void coin(int kum){
    int sw=1;  //0: 정상 금액, 1: 비정상 금액
    int tot=0; //입력한 금액의 합계
    int in;    //금액을 입력 받는 변수
   
    printf("\n\n");
    printf("입력 가능 화폐(동전/지폐 가능)\n");
    printf("------------------------------\n");   
    printf("종 류: 10 50 100 500 1000\n\n");

    while(sw){
        printf("금액 투입!!!. ");
        scanf("%d", &in);

        if (in < 10){
            printf("10원 이하 금액은 사용할 수 없습니다.\n");
        }else if (in > 1000) {
            printf("1000원을 초과하는 지폐는 사용할 수 없습니다.\n");
        }else if (in % 10) {
            printf("입력 금액은 10원 단위까지 가능합니다.\n");
        }else{
            tot = tot+in;
            if( tot >= kum) sw=0;
            printf("\n현재 입금한 금액:%5d\n", tot);
        }
    }
    print_ticket(kum, tot);
}

void print_ticket(int kum, int tot){
    printf("\n\n");
    printf("%5d원 금액의 승차권이 발매 되었습니다.\n", kum);
    printf("남은 잔액은 %5d원 입니다.\n", tot-kum);
    printf("지하철을 이용해 주셔서 감사합니다.!!!\n\n");
}

Posted by 나비:D
:

▩ 함수(function)


1. 일반적인 프로그램의 구성
   ┌----- 메인 루틴
   │
   ├----- 프로시저(Procedure) : Return 값이 없음
   │
   └----- 함수(Function) : Return 값이 있음
    


2. C언어의 함수 구성 : main() 함수와 일반 함수로 구성됨
   ┌----- 메인 함수 main()
   │
   │
   └----- 함수(Function) : Return 값이 있음, Return 값이 있음


3. 함수의 기본 구성
   return 형 함수명(인수형과 가인수의 나열...){
       함수내 변수 선언;
       실행문;
   }

☞ 함수의 작성 규칙
   1) main() 함수는 기능을 정의 하는 함수가 아니라 다른 함수를 이용하는 통제소의 역활을 한다.
      따라서 처리 로직을 main()안에 두면 안된다.
   2) 가인수와 실인수의 데이터 타입과 갯수는 반드시 일치 시킨다.
   3) 함수안에 선언되는 변수는 모두 지역변수이다. 따라서 메인에서는 사용할 수 없다.
   4) 함수를 처리한 후 함수의 리턴값의 데이터형은 함수의 원형에 선언된 타입과 일치해야한다.
   5) 변수명과 함수명이 같으면 함수의 인식이 안된다.


4. 프로토타입을 선언하는 이유
   - main() 함수로 하여금 어떤 함수가 이 프로그램에 선언되어 있는 지 알려주는 역활을 함
   - 사용자 정의 함수가 main()앞에 있으면 프로토타입이 필요 없고, main()뒤에 선언되면 반드시 프로토타입을 선언해야 한다.


5. 실인수와 가인수의 의미
   - 실인수 : 실제로 값을 가지고 있는 함수를 호출하는 측의 변수
   - 가인수 : 임시로 함수에서 지역 변수로 사용되는 변수


6. 값의 return 유형
   - 상황에 따라 1개이상의 return문이 올 수 있다.
   - return a;
   - return (a);
   - return 1;
   - return a+b;

☞ return을 사용하는 이유
   1) 함수에서 처리 값을 돌려줄 경우  
   2) 함수의 실행을 종료하는 역활을 한다.


7. void 형 함수 : 값을 return 하지 않는 함수, 주로 출력을 하는데 사용
   - void main(){}


8. void 형 인수 : 인수를 받지 않는 함수
   - void kkk(void){ } == void kkk(){ }




▩ 함수응용 예제


1. 함수 원형(Prototype) 정의의 이해
//함수는 한번 재작하면 반복해서 호출할 수 있습니다.
//따라서 소스를 매우 구조적으로 만들어 줍니다.

 #include <stdio.h>
 #include <conio.h>

//함수 선언, 함수 원형 선언, 함수 프로토 타입
 void print_line();

 void main() {
   int x, y;
   char c;

     //1회는 무조건 실행됨으로 do~while()사용
     do {
       print_line();
       printf("\n 첫번째 수를 입력하세요 : "); scanf("%d", &x);
       print_line();
       printf("\n 두번째 수를 입력하세요 : "); scanf("%d", &y);
       print_line();
       printf("\n %d 곱하기 %d는 %d입니다.\n", x, y, x*y);
       print_line();
       printf("\n 계속=>Enter, 종료=>Q");
       c=(getch());
     } while(c!='Q');
     getch();
 }

 //함수 정의
 void print_line() {
   int i;
   for(i=1; i<=30; i++){
      printf("-");
   }
 }




2. 기본적인 함수의 사용

▷ 국어, 영어, 수학 점수를 (1~100점) main()함수에서 입력받아
   총점은 tot(kor, eng, mat) 함수에서, 평균은 ave(kor, eng,mat) 함수에서 구한후 main()함수에서
   출력하는 프로그램을 만들어 보시오.



>>>>> 처리 형태 1


 #include <stdio.h>
 #include <conio.h>

 //              ┌---- 가인수
 //함수 선언  ↓
 int tot(int kor, int eng, int mat);
 float ave(int kor, int eng, int mat);
 //↑
 //└---- return 되는 데이터의 타입

 void main() {
   int kor, eng, mat;
     
   printf("국어 점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어 점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학 점수를 입력하세요 : ");
   scanf("%d", &mat);

   printf("\n국어\t영어\t수학\t총점\t평균\n");
   printf("--------------------------------------\n");
   printf("%d\t%d\t%d\t%d\t%5.1f\n", kor, eng, mat, tot(kor,eng,mat), ave(kor,eng,mat));
   getch(); //                                                                  │
 }//                                                                               │
 //                                                                                │
 //             ┌-------------------------------------------┘
 //함수정의  ↓실인수, 값 복사가 발생함, 실인수 <=== 가인수
 int tot(int kor, int eng, int mat){
    int tot;
    tot = kor+eng+mat;
    return tot; //정수형 합계 리턴
 }

float ave(int kor, int eng, int mat){
    float ave;
    ave = (kor+eng+mat)/3.0;
    return ave;
}



>>>> 출력결과:


국어 점수를 입력하세요 : 85
영어 점수를 입력하세요 : 90
수학 점수를 입력하세요 : 90

국어    영어    수학    총점    평균
--------------------------------------
85       90       90       265     88.3



>>>>> 처리 형태 2


 #include <stdio.h>
 #include <conio.h>

 int tot(int kor, int eng, int mat);
 float ave(int kor, int eng, int mat);

 void main() {
   int kor, eng, mat, total;
   float average;
     
   printf("국어 점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어 점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학 점수를 입력하세요 : ");
   scanf("%d", &mat);

   total = tot(kor, eng, mat);
   average = ave(kor, eng, mat);

   printf("\n국어\t영어\t수학\t총점\t평균\n");
   printf("--------------------------------------\n");
   printf("%d\t%d\t%d\t%d\t%5.1f\n", kor, eng, mat, total, average);
   getch();
 }
 
 int tot(int kor, int eng, int mat){
    int tot;
    tot = kor+eng+mat;
    return tot;
 }

float ave(int kor, int eng, int mat){
    float ave;
    ave = (kor+eng+mat)/3.0;
    return ave;
}



>>>>> 처리형태 3(권장 아님, 전역변수 사용은 최대한 피해야 합니다.)


 #include <stdio.h>
 #include <conio.h>

 void tot();
 void ave();

 int kor, eng, mat, total;
 float average;

 void main() {
   printf("국어 점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어 점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학 점수를 입력하세요 : ");
   scanf("%d", &mat);

   tot();
   ave();

   printf("\n국어\t영어\t수학\t총점\t평균\n");
   printf("--------------------------------------\n");
   printf("%d\t%d\t%d\t%d\t%5.1f\n", kor, eng, mat, total, average);
   getch();
 }
 
 void tot(){
    total = kor+eng+mat;
 }

 void ave(){
    average = (kor+eng+mat)/3.0;
}



▩ 함수의 반복 호출


#include <stdio.h>
 #include <conio.h>

 void print_long(void) {
   int i;
   for(i=0; i<=30; i++){
      printf("*");
   }
   printf("\n");
 }

 void print_short(void) {
   int i;

   printf("*");
   for(i=0; i<=28; i++){
      printf(" ");
   }
   printf("*");
   printf("\n");
 }

 void main() {
   int x;

   print_long();
   for(x=0; x<=5; x++)
      print_short();
   print_long();
   getch();
 }



▩ 함수의 중첩 예제 : main()함수안에서 호출한 함수안에 함수가 있는 경우


 #include <stdio.h>
 #include <conio.h>

 void print_long(void) {
   int i;
   for(i=0; i<=30; i++)
      printf("*");
 }

 void print_short(void) {
   int i;
   for(i=0; i<10; i++)
      printf(" ");

   for(i=0; i<10; i++)
      printf("*");
 }

 void print_one(void) {
   int j;
   for(j=0; j<=5; j++) {
      print_long();
      printf("\n");
   }
 }

 void print_two(void) {
   int k;
   for(k=0; k<=10; k++) {
      print_short();
      printf("\n");
   }
 }

 void main() {
   print_one();
   print_two();
   print_one();
   getch();
 }


☞ 함수원형을 추가한 후의 소스 (권장 유형)

 #include <stdio.h>
 #include <conio.h>

 void print_one(void);   //print_long() 호출
 void print_two(void);   //print_short() 호출
 void print_long(void);  //특수 문자를 30개 출력
 void print_short(void); //공백을 10개 출력, 특수문자 10개 출력
 

 void main() {
   print_one();
   print_two();
   print_one();
   getch();
 }


 void print_one(void) {
   int j;
   for(j=0; j<=5; j++) {
      print_long();
      printf("\n");
   }
 }

 void print_two(void) {
   int k;
   for(k=0; k<=10; k++) {
      print_short();
      printf("\n");
   }
 }

 void print_long(void) {
   int i;
   for(i=0; i<=30; i++)
      printf("*");
 }

 void print_short(void) {
   int i;
   for(i=0; i<10; i++)
      printf(" ");

   for(i=0; i<10; i++)
      printf("*");
 }

Posted by 나비:D
:

▩ C언어를 이용한 필수 기초 알고리즘 - 제어 반복문의 활용 1


1. 100~999 사이에 7의 배수의 갯수와 합을 구하는 프로그램을 작성하세요. 답 : 128, 70336
 
#include <stdio.h>
#include <conio.h>

void main(){
    long int i,cnt,sum,nmg;

    cnt=sum=0L;

    for(----- ? -----){
        nmg = ----- ? -----;
        if(nmg)
            continue;
  else {
         printf("현재 발견된 7의 배수: %d\n", i);
            sum += i;
            cnt++;
        }
    }
    printf("\n 7의 배수의 갯수: %5ld\n  합 : %5ld\n",cnt,sum);
    getch();


▷ 7의 배수를 한줄에 15개씩 출력하는 프로그램을 작성하세요.


2. 100~999 사이에 7의 배수가 아닌 수들의 갯수와 합을 구하는 프로그램을 작성하세요.

답 : 772, 424214


3. 최대값 , 최소값을 구하는 프로그램을 제작 하세요.

#include <stdio.h>
#include <conio.h>

void main(){
    int  no,data,max,min,cnt;

    printf("입력할 자료의 갯수는 ? ");
    scanf("%d",&no);
    cnt=1;
   
    printf("데이터를 입력해 주세요.\n------------------------\n");

    scanf("%d",&data);

    ----- ? -----

    do {
        cnt++;
        scanf("%d",&data);
        if( max < data ) max = data;
        if( min > data ) min = data ;
    } while( cnt < no );

    printf("\n   최대값 : %5d\n   최소값 : %5d\n", max, min);
    getch();
}


4. 5개의 정수를 입력 받아 수의 범위를 구하는 프로그램을 작성하시오.

#include <stdio.h>
#include <conio.h>

void main(){
    int  tbl[5], i, max, min, range;

    for(i=0;i<5;i++){
     scanf("%d", &tbl[i]);
    }

    printf("입력받은 데이터 : \n");

    for(i=0;i<5;i++){
        printf("%5d",tbl[i]);
    }

    ----- ? -----
 
    for(i=1;i<5;i++){
        if(max<tbl[i]) max=tbl[i];
        if(min>tbl[i]) min=tbl[i];
    }

    ----- ? -----
   
    printf("\n\n   입력받은 수의 범위 : %5d\n",range);
    getch();
}                                                   


5. 하나의 수를 입력받아 양수, 음수 인지 출력하는 프로그램 작성하세요.


6. 하나의 수를 입력받아 부호를 무조건 양수로 바꾸어 출력하는 프로그램을 작성하세요.


7. 세 과목의 점수(0~100)를 입력받아 평균을 구한 후 평균이 90점 이상이면 "A", 80이상이면 "B", 70 이상이면 "C", 60 이상이면 "D", 그렇지 않으면 "F"를 출력하는 프로그램을 작성하세요.

 #include <stdio.h>
 #include <conio.h>

 void main() {
   int kor, eng, mat, ave;
             
   printf("국어 점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어 점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학 점수를 입력하세요 : ");
   scanf("%d", &mat);
   --------?--------;
   printf("점수의 평균은 %d입니다.\n", ave);

   switch(--?--) {
     case 10 :
     case 9 :
 printf("당신의 평가는 A입니다.");
 break;
     case 8 :
 printf("당신의 평가는 B입니다.");
 break;
     case 7 :
 printf("당신의 평가는 C입니다.");
 break;
     case 6 :
 printf("당신의 평가는 D입니다.");
 break;
     default :
 printf("당신의 평가는 F입니다.");
   }
    getch();
 }



▩ 제어 반복문 활용 2


1. 아래 문제의 ---?--- 칸을 채우세요. 대문자로 변경하는 로직이 들어가야 합니다.

 #include <stdio.h>
 #include <conio.h>

 void main() {
   char c;

   do {
     printf("메뉴 코드를 입력하세요.(F, E, H, X, 기타) : ");
     c=getch();
     putchar(c);
     if(c>=97) c -= --?--;

     switch(c) {
       case 'F' :
           printf("\nFile MENU\n");
       break;
       case 'E' :
       printf("\nEdit MENU\n");
       break;
       case 'H' :
       printf("\nHelp MENU\n");
       break;
       case 'X' :
       printf("\n프로그램을 종료합니다.\n");
       break;

       default :
       printf("\n잘못된 입력입니다.\n");
     }
   } while(c!='X');
   getch();
 }


2. 1부터 3까지 a와 b의 값를 출력하는 데, a, b가 같은 경우는 출력되지 않도록 프로그램을 작성해 보세요.

출력 결과:

a=1 b=2
a=1 b=3
-------
a=2 b=1
a=2 b=3
-------
a=3 b=1
a=3 b=2


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int a, b;

   printf("=========\n");
   for(a=1; a<=3; a++) {
      for(b=1; b<=3; b++) {
 if(a--?--b){
    --?--
           }

 printf("A=%d, B=%d\n", a ,b);
      }
   printf("=========\n");
   }
   getch();  
 }


3. 제어문을 이용하여 아래와 같이 출력되는 프로그램을 제작해 보세요.

 1
 2   3
 4   5   6
 7   8   9  10
11  12  13  14  15


4. 제어문을 이용하여 아래와 같이 출력되는 프로그램을 제작해 보세요.

 3
 6   9
12  15  18
21  24  27  30
33  36  39  42  45


5. 제어문을 이용하여 아래와 같이 출력되는 프로그램을 제작해 보세요.

                     1
                2   3
            4   5   6
       7   8   9  10
11  12  13  14  15


#include <stdio.h>
#include <conio.h>

main(){
 int i, j, cnt;
           cnt=0;
 for(----- ? -----){
  for(j=1; j<=5; j++){

   if(i>j){
    printf("     ");
   }else{
                                  cnt=cnt+1;
    printf("%5d", cnt);
                                }
  }
           printf("\n");
 }
    getch();
}


6. 제어문을 이용하여 아래와 같이 출력되는 프로그램을 제작해 보세요.

                 15
            14  13
       12  11  10
     9   8   7   6
5   4   3   2   1



▩ 제어 반복문의 활용 3


▶ 구구단 출력하기

1. 2단만 출력

#include <stdio.h>
#include <conio.h>

void main(){
 int i;

 for(i=1; i<=9; i++){
      printf("2*%d=%d\n", ----- ? -----);
    }
    getch();
}


2. 3단식 출력하기

#include <stdio.h>
#include <conio.h>

void main(){
 int k, i, p;

    for(----- ? -----){
  for(i=1; i<=9; i=i+1){
   printf("\t%d*%d=%d", k, i, k*i);
    printf("\t%d*%d=%d", k+1, i, (k+1)*i);
   printf("\t%d*%d=%d\n", k+2, i, ----- ? -----);
  }
  printf("\n---------------------------------------------------------\n");
                     p=getchar();

 }
    getch();
}


3. 배열을 이용하여 구구단 출력하기

#include <stdio.h>
#include <conio.h>

void main(){
 int k, i, ----- ? -----, p;


 for(k=0; k<=8; k=k+3){
  for(i=0; i<=8; i=i+1){
   a[k][i] = (k+1)*(i+1);
   a[k+1][i] = (k+2)*(i+1);
   a[k+2][i] = ----- ? -----;
  }
 }

    for(----- ? -----){
  for(i=0; i<=8; i=i+1){
   printf("\t%d*%d=%d", k+1, i+1, a[k][i]);
    printf("\t%d*%d=%d", k+2, i+1, a[k+1][i]);
   printf("\t%d*%d=%d\n", k+3, i+1, a[k+2][i]);
  }
  printf("\n---------------------------------------------------------\n");
        p=getchar();
 }
    getch();
}


▷ 1부터 100까지 짝수의 합 구하기 (답 : 2550)


▷ 1부터 100까지 홀수의 합 구하기 (답 : 2500)


4. 아래와 같이 출력되도록 프로그램을 작성하세요.

♡♡♡♡♡
♡♡♡♡
♡♡♡
♡♡


5. 아래와 같이 출력되도록 프로그램을 작성하세요.
   - ♡ 하나는 공백문자 2개에 해당합니다.

            ♡
         ♡♡
      ♡♡♡
   ♡♡♡♡
♡♡♡♡♡

Posted by 나비:D
:

▩ 제어문 - 반복문 while 문


   - 반복 횟수가 지정되어 있지않은 경우
   - 조건식이 참이면 계속 실행한다.


   - 무한 루틴: 무한 루틴인 경우는 대부분 if문과 break문을 동반하는 경우가 많다.
     while(1){
         문장 실행;
     }



>>>>> 1부터 10까지 합을 구하는 while문


 #include <stdio.h>

 void main() {
   int i=1, sum=0;

   while(i<=10) {
     printf("현재 수는 %d입니다.\n", i);
     sum += i;
     i++;
   }
   printf("총합은 %d입니다.\n", sum);
 }




▩ 제어문 - 반복문 do~while 문


   - do-while 문 : 최소한 1회 이상 실행될 필요가 있는 경우



 >>>>> 1부터 10까지 합을 구하는 do~while문


  #include <stdio.h>

 void main() {
   int i=1, sum=0;

   do {
     printf("현재 수는 %d입니다.\n",  i);
     sum += i;
     i++;
   } while(i<=10);
   printf("총합은 %d입니다.\n", sum);
 }




▩ break문을 이용한 루프의 중단


   - 반드시 if문을 동반
   - 반복문 탈출
   - 특정 값에서 반복 처리를 멈추어야 할 경우



>>>>> break문의 이용


 #include <stdio.h>
 #include <conio.h>

 void main() {
   int a, b;

   printf("=========\n");
   for(a=1; a<=5; a++) {
      for(b=1; b<=10; b++) {
      printf("A=%d, B=%d\n", a, b);
      if(a==b) break;
      }
      printf("=========\n");
   }
   getch();
 }




▩ continue문을 통한 반복문 흐름의 제어


   - 루프를 탈출하지 않으면서 특정 조건에만 반복루틴을 처리하지 않음
  


>>>>> continue 문의 이용


 #include <stdio.h>

 void main() {
   int a, b;

   printf("=========\n");
   for(a=1; a<=4; a++) {
      for(b=1; b<=4; b++) {
 if(a==b)
    continue;
 printf("A=%d, B=%d\n", a ,b);
      }
   printf("=========\n");
   }  
 }

Posted by 나비:D
:

▩ 제어문 - 반복문 for 문


   - 반복 횟수가 지정되어 있는 경우
   - for문은 내부에 초기화 코드를 가지고 있다.
   - 조건식이 참이면 계속 실행한다.

   for(초기화;  조건식;  재초기화){
     ⓐ -------> ⓑ <-------- ⓓ
                 │           ↗
                 │         /
                 │       /
                 │     /
              printf("★");
                 │ /
                 ↓/
                  ⓒ
             실행 문장;
   }


1. 최초 처리순서
   ⓐ --> ⓑ --> ⓒ --> ⓓ --> ⓔ --> ⓑ --> ⓒ


2. 반복 처리순서
   ⓑ --> ⓒ --> ⓓ --> ⓔ --> ⓑ --> ⓒ



>>>>> 1부터 10까지 출력하는 프로그램


 #include <stdio.h>

 void main() {
   int k;

   for(k=1 ; k<=10 ; k++)
      printf("%d을(를) 출력합니다.\n", k);
 }



>>>>> 100부터 1까지 짝수만 출력하는 프로그램


 #include <stdio.h>

 void main() {
   int i;

   for(i=100; i>0; i=i-2)
      printf("%d을(를) 출력합니다.\n", i);
 }



>>>>> 1부터 10까지의 합계를 구하는 프로그램


 #include <stdio.h>

 void main() {
   int i, sum=0;

   for(i=1; i<=10; i++) {
      printf("%d\n", i);
      sum += i;
   }
   printf("합계는 %d입니다.\n", sum);
 }



>>>>> 1부터 100까지 중에서 3의 배수의 개수와 합계를 구하는 프로그램
 

#include <stdio.h>

 void main() {
   int i, cnt=0;
   long sum=0;

   for(i=1; i<=100; i += 3) {
      printf("%d\n", i);
      sum += i;
      cnt++;
   }
   printf("합계는 %ld입니다.\n", sum);
   printf("개수는 %d개입니다.\n", cnt);
 }


▷ 위의 프로그램을 for문은 for(i=0; i<=100; i++)로 변경하고 if문을 사용하여 같은 결과가 나오도록 수정하세요.



>>>>>> 구구단을 출력하는 중첩된 for 문


 #include <stdio.h>

 void main() {
   int k, j, cnt=0;
   long sum=0;

   for(k=1 ; k<=9 ; k++) {
      for(j=1; j<=9; j++) {
 if(j!=9)
    printf("%d*%d=%2d, ", k, j, k*j);
        else
    printf("%d*%d=%2d", k, j, k*j);
      }
   printf("\n");
   }
 }


▷ 구구단의 반복 횟수 및 합을 출력하는 프로그램으로 수정하세요.


>>>>> 출력하려는 구구단을 입력받는 프로그램


 #include <stdio.h>

 void main() {
   int s, e, i, j;

   printf("구구단의 시작수를 입력하세요 : ");
   scanf("%d", &s);
   printf("구구단의 끝수를 입력하세요 : ");
   scanf("%d", &e);
   for(i=s; i<=e; i++) {
      for(j=1; j<=9; j++) {
       if(j!=9)
   printf("%d*%d=%2d, ", i, j, i*j);
       else
          printf("%d*%d=%2d", i, j, i*j);
      }
   printf("\n");
   }
 }

Posted by 나비:D
:

▩ 연산자


1. 정수 연산자 원리
   정수/정수 = 정수
   정수/실수 = 실수
   실수/정수 = 실수
   실수/실수 = 실수

   - 작은 데이터 타입과 큰 데이터 타입의 경우 항상 작은 데이터 타입은 큰 데이터 타입으로 흡수

      된다.



>>>>> 기본 연산자


 #include <stdio.h>

 void main() {
   int a=10, b=3;

   printf("%d + %d = %d\n", a, b, a+b);
   printf("%d - %d = %d\n", a, b, a-b);
   printf("%d * %d = %d\n", a, b, a*b);
   printf("%d / %d = %d\n", a, b, a/b);

   //특수문자의 출력은 2번 연속해서 입력합니다.
   printf("%d %% %d = %d\n", a, b, a%b); 
 }




2. 증가/감소 연산자
   - 일반 2항연산자보다 처리속도가 빠릅니다.

   - ++a, a++의 개념
     a = a + 1;


   - --a, a--의 개념
     a = a - 1;


   - a = ++b;
     b = b + 1;
     a = b;


   - a = b--;
     a = b;    
     b = b - 1;



>>>>> 증가 연산자


 #include <stdio.h>

 void main() {
   int a=30, b=30;

   printf("원래 a의 값 : %d\n", a);
   printf("원래 b의 값 : %d\n", b);
   printf("++a의 결과 : %d\n", ++a);
   printf("++연산 후의 값 : %d\n", a);
   printf("b++의 결과 : %d\n", b++);
   printf("++연산 후의 값 : %d\n", b);
 }




>>>>> 감소 연산자


 #include <stdio.h>

 void main() {
   int a=30, b=30;

   printf("원래 a의 값 : %d\n", a);
   printf("원래 b의 값 : %d\n", b);
   printf("--a의 결과 : %d\n", --a);
   printf("--연산 후의 값 : %d\n", a);
   printf("b--의 결과 : %d\n", b--);
   printf("--연산 후의 값 : %d\n", b);
 }




>>>>> 상수에 대한 연산은 에러를 발생시킨다.


#include <stdio.h>
#include <conio.h>

 void main() {
   int a=10;

   printf("++(10)=%d\n", ++(10));
   getch();
 }




>>>>> 권장이 되지 않는 예제


//팀원간 소스분석에 지연 시간이 발생합니다.
//개발후 유지보수에 많은 시간이 소모됩니다.
//소스는 간결하고 분석이 용이해야 합니다.

#include <stdio.h>
#include <conio.h>

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

   printf("(++a - ++a)+(++b)=%d\n", (++a - ++a)+(++b));
   getch();
 }




3. 할당 연산자
   - +=, -=, *=, /=
   - 연산 속도의 증가가 사용 목적
   - a += b;
     a = a + b;
 


>>>>> 할당 연산자


 #include <stdio.h>

 void main() {
   int a=10, b=3;

   printf("원래 a의 값 : %d\n", a);
   printf("%d + %d의 값 : %d\n", a, b, a+=b);
   printf("변경된 a 값 : %d\n",a);
   printf("%d - %d의 값 : %d\n", a, b, a-=b);
   printf("변경된 a 값 : %d\n",a);
   printf("%d * %d의 값 : %d\n", a, b, a*=b);
   printf("변경된 a 값 : %d\n", a);
   printf("%d / %d의 값 : %d\n", a, b, a/=b);
   printf("변경된 a 값 : %d\n", a);
 }




4. 관계 연산자(비교 연산자)
   <, <=, >, >=, ==, !=
   - 관계 연산자는 참인 경우는 0 이외의 값, 기본 값은 1, 거짓인 경우는 0의 값이 리턴된다.
   - bool 타입이 없습니다.
     . 참: 0 이외의 모든 값은 참입니다. 따라서 -100도 참 입니다.
     . 거짓: 0만 거짓입니다.

 #include <stdio.h>

 void main() {
   int a=10, b=15;

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




>>>>> 두개의 수를 입력받아 앞의 수가 크면 1, 그렇지 않으면 0을 출력하는 프로그램


 #include <stdio.h>

 void main() {
   int a, b;

   printf("첫번째 수를 입력하세요. : ");
   scanf("%d", &a);
   printf("두번째 수를 입력하세요. : ");
   scanf("%d", &b);
   printf("%d > %d의 결과는 %d입니다.\n", a, b, a>b);
 }




5. 논리 연산자
   !, &&, ||, &, |

>>>>>>>>>> 비트 and, or 연산자
#include <stdio.h>

main(){
 printf("10 | 3=%d\n", (10 | 3));
 printf("10 & 3=%d\n", (10 & 3));
}

/*
   0000 1010
  +0000 0011
  ----------
   0000 1011 --> 11


   0000 1010
  &0000 0011
  ----------
   0000 0010 --> 2
*/



>>>>>논리 연산자


 #include <stdio.h>

 void main() {
   int a=10, b=15, c=5, d=20;

   printf("%d>%d             => %d\n", a, b, a>b);
   printf("%d<%d             => %d\n", a, b, a<b);
   printf("%d<%d             => %d\n", c, d, c<d);
   printf("!(%d<%d)           => %d\n", c, d, !(c<d));
   printf("(%d>%d) && (%d<%d) => %d\n", a, b, c, d, (a>b)&&(c<d));
   printf("(%d>%d) || (%d<%d) => %d\n", a, b, c, d, (a>b)||(c<d));
   printf("(%d<%d) && (%d<%d) => %d\n", a, b, c, d, (a<b)&&(c<d));
   printf("(%d<%d) || (%d<%d) => %d\n", a, b, c, d, (a<b)||(c<d));
   printf("!(0)=> %d\n", !(0));
   printf("!(1)=> %d\n", !(1));
   printf("!(-100)=> %d\n", !(-100));
 }




 >>>>> 비트 연산자


#include <stdio.h>

 void main() {
   int a=0XD1, b=0XC4;

   printf("%X        => %d\n", a, a);
   printf("~%X       => %X\n", a, ~a);
   printf("%X        => %d\n", b, b);
   printf("~%X       => %X\n", b, ~b);
   printf("%X & %X => %X\n", a, b, a&b);
   printf("%X | %X => %X\n", a, b, a|b);
   printf("%X ^ %X => %X\n", a, b, a^b);
 }
 /*
  11010001
& 11000100
----------
  00010101 ==> 21 ==> 15
               10진수 16진수
 */




 >>>>> 이동연산자


- 왼쪽으로의 이동은 무조건 2배합니다.
- 오른쪽으로의 이동은 무조건 나누기2합니다.
- 2진수는 자리이동에따라 2배가 되던지, 그렇지 않으면 나누기 2배가 됩니다.

  0000 1000 ---> 8
  0001 0000 ---> 16
  0010 0000 ---> 32
 


  #include <stdio.h>

 void main() {
   int a=0XD1, b=0XC4;

   printf("원래의 값 : 10진수(%d), 16진수(%X)\n", a, a);
   printf("1번 왼쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", a << 1, a << 1);
   printf("2번 왼쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", a << 2, a << 2);
   printf("3번 왼쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", a << 3, a << 3);
   printf("4번 왼쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", a << 4, a << 4);
   printf("\n");
   printf("원래의 값 : 10진수(%d), 16진수(%X)\n", b, b);
   printf("1번 오른쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", b >> 1, b >> 1);
   printf("2번 오른쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", b >> 2, b >> 2);
   printf("3번 오른쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", b >> 3, b >> 3);
   printf("4번 오른쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", b >> 4, b >> 4);
 }

 /*
 0  0  0  0  0  0  0  0
 ----------------------
 12864 32 16 8  4  2  1
 */

Posted by 나비:D
:

▩ 변수의 이해 및 작성 규칙


1. 변수의 특징
   - 변수명은 영문자, 숫자, 밑줄(_) 문자만을 사용한다.
   - 변수명의 첫 문자는 반드시 영문자나 밑줄 문자이어야 한다.

      숫자는 변수명의 첫자로 올 수 없다.
   - 첫 문자를 숫자로 시작하면 상수로 인식한다.
   - 용도가 지정되어 있는 예약어는 변수명으로 사용할 수 없다.
   - 변수명은 가급적 의미 있는 이름을 사용한다.
   - C언어는 대소문자를 구별함으로 변수명에 대소문자를 주의한다.
   - 변수나 메소드의 첫자는 소문자, 클래스는 대문자를 주로 사용한다.
   - 변수의 마디는 대문자를 사용하는 경우가 많다.



2. 변수의 작성 규칙
   - 헝가리언 표기법
     . 회사이름: cn, comName, _com_name

   - 스칼라 표기법
     . 첫자를 무조건 대문자로하는 의미있는 변수명을 줍니다.
     . 회사이름: CompanyName, CompanyArea




>>>>> 상수를 이용하여 합, 차, 곱을 계산한 경우


 #include <stdio.h>

 void main() {
   printf("%d와 %d의 합은 %d입니다.\n", 30, 15, 30+15);
   printf("%d와 %d의 차는 %d입니다.\n", 30, 15, 30-15);
   printf("%d와 %d의 곱은 %d입니다.\n", 30, 15, 30*15);
 }




▩ 상수(리터럴)


   - 변수의 값 자체를 말합니다.
   - 숫자 상수: 10
   - 문자 상수: 'a'
   - 문자열 상수: "ABCDE"





>>>>> 간단한 성적처리 프로그램(정확한 소수 출력하도록 수정할 것)


- 변수를 사용하지 않으면 입력을 받을 수 없습니다.
- 정수/정수 = 정수가 됨으로 (float)정수/정수으로 변경하여 처리합니다.
  
 #include <stdio.h>

 void main() {
   char name[30];
   int hak;
   int kor;
   int eng;
   int mat;
   int tot;
   float ave;

   printf("정보를 입력하세요.\n\n");
   printf("이름을 입력하세요 : ");
   scanf("%s", name);
   printf("학번을 입력하세요 : ");
   scanf("%d", &hak);
   printf("국어점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학점수를 입력하세요 : ");
   scanf("%d", &mat);
   tot=kor+eng+mat;
   ave=tot/3;
   printf("이름 : %s\n", name);
   printf("학번 : %d\n", hak);
   printf("국어 : %d\n", kor);
   printf("영어 : %d\n", eng);
   printf("수학 : %d\n", mat);
   printf("합계 : %d\n", tot);
   printf("평균 : %f", ave);
 }




>>>>> 변수의 초기화


- 변수에 미리 값을 할당하는 것을 초기화라고합니다.

 #include <stdio.h>

 void main() {
   char name[30]="Hong";
   int hak=3214;
   int kor=78;
   int eng=96;
   int mat=54;
   int tot=kor+eng+mat;
   float ave=tot/3;

   printf("이름 : %s\n", name);
   printf("학번 : %d\n", hak);
   printf("국어 : %d\n", kor);
   printf("영어 : %d\n", eng);
   printf("수학 : %d\n", mat);
   printf("합계 : %d\n", tot);
   printf("평균 : %f", ave);
 }




>>>>> 서로다른 형의 계산


- 작은 타입은 큰 변수 타입으로 흡수됩니다.
 
 #include <stdio.h>

 void main() {
   char c = 'T';
   int i = 10;
   float f = 20.1;

   printf("%c+%d = %d\n", c, i, c+i);
   printf("%d+%f = %f", i, f, f+i);
 }




>>>>> cast연산의 사용 1


 #include <stdio.h>

 void main() {
   int i = 10, j = 20;
   float f = 30.1;

   printf("%d+%f = %f\n", i, f, f+i);
   printf("%d+%f = %d\n", i, f, (int)f+i);
   printf("%d+%d = %f\n", i, j, (float)i+j);
 }




>>>>> cast 연산의 사용 2


 #include <stdio.h>

 void main() {
   char c = 'A';
   int i = 10;
   float f = 3.2;

   printf("(int)(c+i+f)의 결과 : %d\n", (int)(c+i+f));
   printf("(c+i+f)의 결과 : %f\n", c+i+f);
   printf("(int)f*i-2의 결과 : %d\n", (int)f*i-2);
   printf("f*i-2의 결과 : %f\n", f*i-2);
 }

Posted by 나비:D
:

BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
---------------------------.. (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total :
Today : Yesterday :