Game!

전체 글 (93)

  1. 2015.05.29 단어를 입력받고, 사전 순서대로 출력하기

    사용자로부터 10개 이하의 숫자를 입력받고, 사전 순서대로 출력하여 보자. 1. int n 으로 입력할 단어의 개수를 받는다. 2. 단어를 n 수 만큼 입력받는다. 3. Sort 함수를 만들어 정렬을 한 다음, 출력한다. 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 #include void main() { int n; // /* 왜 2차원 배열인지는 아래에 */ char str[10][20]; printf("입력할 단어 개수?(최대10개) : "); scanf_s("%d", n); for(int i=0; i s..

  2. 2015.05.29 다양한 종류의 포인터 정리

    포인터 : 주소값을 가리키는 변수 보통 4바이트, 주소값 1개를 가리킬 수 있다. 같은 자료형의 주소값을 가질 수 있다 cf. 배열은 포인터다. ex : int a = 5; int* ptr = &a; => int* ptr == int 형 주소값을 가리킬 수 있는 포인터 *ptr 더블 포인터 : 포인터를 가리키는 포인터 ex : int a = 5; int* ptr = &a; int** pptr = &ptr; => int** pptr == int* 형 주소값을 가리킬 수 있는 이중포인터 **ptr 포인터 배열 : 자료형이 포인터인 배열 ex : int* ptr[10]; => 10개의 방이 있는데, 이 각 원소들은 포인터형이므로 주소값을 가질 수 있다 배열 포인터 : 2차원 배열일때 쓰이는 경우가 많으며 1개..

  3. 2015.04.24 2차원 배열 동적할당 & 해제

    보호되어 있는 글입니다.

  4. 2015.04.24 [C++] 강제 형변환 & 자동 형변환

    강제 형변환과 자동 형변환에 대해 이해해보자! 강제 형변환 강제 형변환이란 ? 명시적으로 자료형을 직접 변경해주는 것을 의미합니다. 변수 앞에 소괄호를 통해서 변경할 수 있습니다. 간단한 예제 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include #include #include using namespace std; void main() { int a = 5; double c = 4.3; double result; result = c * a; cout

  5. 2015.04.20 [C 기초] 자리맞춰서 출력하기 2

    printf 를 사용하였을 때, %d 등 출력방식에 대하여 자릿수를 맞춰서 출력하여봅시다 1 2 3 4 5 6 7 8 9 10 11 12 13 #include void main() { int num = 5; printf("%d \n", num); printf("%2d \n", num); printf("%02d \n", num); return; } cs 출력화면 : 5 5 05 정수형을 기본으로 하였습니다 가장 많이쓰는 %d 는 num에 저장된 숫자 그대로 출력하는 것! %2d 에 있는 2 의 의미는 빈칸 2개를 의미! %02d 에 있는 02 는, %2d 에서 앞에 0이 추가된 것으로 빈칸을 2개로 하되, 그 빈칸에는 0을 넣겠다는 의미! 추가로, %.2f : 소수점 이하 2자리 까지 출력하겠다는 의미!

 

 

 

사용자로부터 10개 이하의 숫자를 입력받고,

사전 순서대로 출력하여 보자.

 

 

1. int n 으로 입력할 단어의 개수를 받는다.

2. 단어를 n 수 만큼 입력받는다.

3. Sort 함수를 만들어 정렬을 한 다음, 출력한다.

 

 

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
 
void main()
{
    int n; //
 
    /* 왜 2차원 배열인지는 아래에 */
    char str[10][20];
    
    
    printf("입력할 단어 개수?(최대10개) : ");
    scanf_s("%d", n);
 
    for(int i=0; i<n; i++)
    {
        printf("단어 입력 : ");
        scanf_s("%s", str[i]);
    }
 
    Sort(str, n);
 
    for (int i = 0; i < n; i++)    
        printf("%s\n", str[i]);
    
}
 
void Sort(char (*str)[10], int n)
{
    int min;
    char temp[20];
 
    for(int i=0; i<n-1; i++)
    {
        min = i;
        for(int k= i+1; k<n; k++)
        {
            /* cmp에 대한 조건식 아래에 */
            if(strcmp(str[min], str[k]) > 0)
            {
                min = k;
            }
        }
        strcpy(temp, str[i]);
        strcpy(str[i], str[min]);
        strcpy(str[min], temp);
    }
}
 

 

 

정렬하는 이유는

for (int i = 0; i < n; i++)    

 

        printf("%s\n", str[i]);

이 부분에서 순서대로 출력하기 위해서 입니다.

 

 

 

char str[10][20] => 2차원 배열로 만든 이유

 

[10]부분이 단어의 개수를 입력받습니다

 

배열은 포인터다! 라는것을 기억한다면,

10개의 방은 포인터 형이고 이 포인터는 다시 [20] 의 배열을 각각 가리킵니다.

 

그래서 단어를 입력받을 때 str[i] 가 [20] 개의 각각의 방에 문자열을 저장합니다.

 

 

strcmp(str[min], str[k]) > 0 => strcmp의 조건식을 > 0 으로 한 이유

 

strcmp의 기본형 : 

char * strcmp( const char *s1, const char *s2);

 

strcmp == 0 결과 값이면 s1 = s2
strcmp > 0 결과 값이면 s1 > s2
strcmp < 0 결과 값이면 s1 < s2

 

 

 

 

 

 

 

 

포인터 :

주소값을 가리키는 변수

보통 4바이트, 주소값 1개를 가리킬 수 있다.

같은 자료형의 주소값을 가질 수 있다

cf. 배열은 포인터다.

 

ex :

int a = 5;

int* ptr = &a;

=> int* ptr == int 형 주소값을 가리킬 수 있는 포인터 *ptr

 

 

 

더블 포인터 :

포인터를 가리키는 포인터

 

ex :

int a = 5;

int* ptr = &a;

int** pptr = &ptr;

=> int** pptr == int* 형 주소값을 가리킬 수 있는 이중포인터 **ptr

 

 

 

포인터 배열

자료형이 포인터인 배열

 

ex : 

int* ptr[10];

=> 10개의 방이 있는데, 이 각 원소들은 포인터형이므로 주소값을 가질 수 있다

 

 

 

 

배열 포인터 :

2차원 배열일때 쓰이는 경우가 많으며

1개의 배열이 다른 배열을 가리킨다.

 

ex : 

int (*ptr) [10];

=> *ptr (포인터가) , int 형 방 10개의 배열을 가리킨다.

 

 

 

 

함수 포인터

포인터가 함수의 주소값을 가진다.

즉, 함수를 가리키는 포인터

 

ex:

int (*fptr) (int, int);

fptr은 포인터이며, int func(int, int) 이렇게 생긴 함수를 가리킬 수 있다.

즉, fptr 포인터는 반환형이 int 이고 매개변수가 (int,int)인 (이것과일치하는) 함수의 주소값을 가질 수 있다

 

 

 

 

 

const 포인터 :

const의 위치에 따라 의미가 달라진다.

 

ex 1 : 

const int* ptr;

=> 포인터 ptr이 가리키는 내용을 변경하지 않겠다. (대상변경 o , 값 변경 x)

ptr 이 a (int a = 5;)의 주소값을 가지고 있다고 가정할때, 맨 앞에 const를 붙이면 a의 값을 변경시킬 수 없다.

 

ex 2 :

char* const ptr;

=> 포인터가 가리키고 있는 주소값을 변경하지 않겠다. (대상변경 x, 값 변경 o)

ptr 이 a (int a = 5;)의 주소값을 가지고 있다고 가정할때, ptr이 다른 int형 변수 b를 가리키도록 할 수 없다.

 

 

 

 

 

void 포인터

동적할당 기본 반환형이며,

포인터 형이 정해지지 않은 포인터를 의미

순수하게 메모리 주소값만 가진다. 포인터형은 나중에 직접 결정하겠다는 의미

그래서 사용시에는 꼭 명시적으로 반환형을 적어야한다.

 

ex :

void* ptr;

 

 

2차원 배열 동적할당 & 해제2015. 4. 24. 15:19

강제 형변환과 자동 형변환에 대해 이해해보자!

 

 

강제 형변환

 

강제 형변환이란 ?

명시적으로 자료형을 직접 변경해주는 것을 의미합니다.

 

변수 앞에 소괄호를 통해서 변경할 수 있습니다.

 

 

간단한 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
 
void main()
{
    int a = 5;
    double c = 4.3;
    double result;
    
    result = c * a;
 
    cout << result << endl;
    /*강제형변환*/
    cout << (int)result << endl;
}
cs

 

출력결과

21.5

21

 

위에는 실수로 계산된 값을 그대로 실수형에 저장해줘서 소수점이하 자리까지 출력되는 것이고,

아래에서는 int로 강제 형변환을 시켜주기 때문에 소수점을 제외한 정수형으로 출력됩니다.

 

예제에서는 result 라는 실수형 변수 앞에 강제적으로 (int)라고 적어주었습니다.

 

 

 

 

 

 

자동 형변환

 

자동 형변환이란?

컴파일러가 자동적으로 형변환을 시키는 것을 의미합니다.

 

주로, 대입연산자에서 발생합니다.

 

대입 연산자에서 자동 형변환이 일어날 때,

대입 연산자의 왼쪽을 기준으로 형변환이 일어납니다.

 

 

 

간단한 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
 
void main()
{
    int a = 3.14;    
    char b = 97;
 
    cout << a << endl;
    cout << b << endl;
}
cs

 

출력결과

3

a

 

 

int형 변수에 실수 3.14로 초기화 하고 있습니다.

 

즉, 실수 3.14를 초기화 하고 있지만

대입 연산자의 왼쪽에 있는 자료형이 int 형이므로,

정수형태로 저장되어서 3 이 출력되는 것입니다.

 

char형 변수에 숫자 97을 저장하고 있습니다.

 

즉, 정수 97을 초기화 하고 있지만

대입 연산자의 왼쪽에 있는 자료형이 char 형이므로,

문자형태로 저장되어서 a가 출력되는 것입니다.

 

참고)

1바이트인 char 형은 문자를 표현합니다.

또한 문자는 1개만 저장할 수 있습니다.

 

만약 문자 그대로를 저장하기 위해서는

char b = 'a'; 라고 적으시면 됩니다.

 

97을 저장했는데 a가 나오는 이유는 아스키코드표를 참조하시길 바랍니다^^

 

 

간단한 문제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
 
void main()
{
    int a = 2;
    int b;
    double c = 4.3;
 
    b = (double)a * c;
 
    cout << a2 << endl;
}
cs

 

 

12번째 줄에서 보면

 

현재 int형 변수인 a를 double로 강제 형변환을 한 다음 실수형 변수 c를 곱한 후,

int형 변수 b에 저장하고 있습니다.

 

그러면 b는 무엇이 출력될까요??

 

 

출력은 8 이 됩니다.

 

a를 double로 형변환을 한다고 하더라도 a 는 그대로 2 이고, 4.3 을 곱하면 8.6 이 됩니다.

 

그러나 실수 값 8.6 을 저장하는 대입연산자 왼쪽의 자료형이 int 형 이므로

소수점이 날라가여 8 이 저장되기 때문

8이 출력되는 것입니다!^^

 

 

 

 

printf 를 사용하였을 때,

%d 등 출력방식에 대하여 자릿수를 맞춰서 출력하여봅시다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio>
 
void main()
{
    int num = 5;
    
    printf("%d \n", num);
    printf("%2d \n", num);
    printf("%02d \n", num);
 
    return;
}
 




cs

 

 

출력화면 :

5

 5

05

 

정수형을 기본으로 하였습니다

 

가장 많이쓰는 %d 는 num에 저장된 숫자 그대로 출력하는 것!

 

%2d 에 있는 2 의 의미는 빈칸 2개를 의미!

 

%02d 에 있는 02 는, %2d 에서 앞에 0이 추가된 것으로

빈칸을 2개로 하되, 그 빈칸에는 0을 넣겠다는 의미!

 

 

 

추가로,

 

%.2f : 소수점 이하 2자리 까지 출력하겠다는 의미!

 

 

'Language > C++' 카테고리의 다른 글

2차원 배열 동적할당 & 해제  (0) 2015.04.24
[C++] 강제 형변환 & 자동 형변환  (0) 2015.04.24
중위 표기법 / 후위 표기법 이해  (0) 2015.04.16
[C++] 파일입출력) EOF에 대한 이해  (0) 2015.04.15
정수 출력  (0) 2015.04.14