×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,877,113명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형

1. 매크로 함수


다양한 매크로 함수가 있지만 여기서는 간단한 내용만 보고 가도록 한다.


#define에 대해 알아보자.


#define PI 3.14

위의 내용이 무얼 의미하는지 파악해보자.

코딩 중 PI라는 토큰이 나오면 바로 3.14로 바꾸어 컴파일한다. 

단순한 문자 교환이 이루어 지는 것이다. 

장점 ::  특정 숫자의 의미가 정확히 와닿지 않는 것을 방지할 수 있다.


그럼 다양한 define을 만들어보자.


이전에 swap에 대해 배웠음을 알 수 있다.

#define SWAP(a,b){int t = a; a = b; b = t;}로 SWAP을 만들 수 있다.


max라는 값에 대해서도 생각해보자.


문제 1. 

우선 max라는 함수를 만들어보자.

배열에 특정 값이 들어왔을 때 배열의 값 중 최댓값을 출력하시오.


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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <stdlib.h> // srand, rand 함수를 위한 헤더
#include <time.h> // time 함수를 위한 헤더
#include <malloc.h>


int arr[100];
 
/*
    clear부분과 makeRand 부분을 건들지 말 것
    clear :: bool 형식의 visit배열을 false(0)으로 초기화 해준다.
    makeRand :: arr 배열의 0부터 n-1에 중복되지 않는 랜덤한 값들을 넣어준다.
*/
void clear(int n, bool *visit)
{
    for (int i = 0; i <= n; i++)
        visit[i] = false;
}
void makeRand(int n) 
{
    bool *visit = (bool *)malloc(sizeof(bool* (n + 1));
    clear(n, visit);
 
    srand((unsigned)time(NULL));
 
    for (int i = 0; i < n; )
    {
        int randVal = (rand() % 100+ 1;
        if (!visit[randVal])
        {
            visit[randVal] = true;
            arr[i++= randVal;
        }
    }
    free(visit);
}
 
 
int getMax(int n)
{
    int maxVal = -1;
    for (int i = 0; i < n; i++)
    {
        // 작성
    }
    return maxVal;
}
int main()
{
    printf("1~100사이 값을 입력하세요 :: ");
    int n;
    scanf("%d"&n);
 
    makeRand(n);
 
    int ret = getMax(n);
 
    printf("기존 arr 값\n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
 
    printf("\n찾아낸 max 값 :: %d\n", ret);
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus



위의 부분에서 다른 부분은 건들지 말고 // 작성 부분에 max 값을 얻어내는 코드를 작성해보자.




위의 정답을 보고 이제 #define max를 한번 만들어보자.


#define max(a,b)(a > b ? a : b)라고 정의해보자.


이 의미는 max(값1,값2)가 들어왔을 때 a > b가 true이면 a를, false이면 b를 리턴해주는 방식이다.


결국 max(1,2)가 들어오면 1 > 2 는 false이니 2를 리턴해줄것이고 max(100, 23)이 들어오면 100 > 23이니 100을 리턴해줄 것이다.


문제 2.

위의 내용 중 어디 부분을 바꾸면 min값을 구할 수 있을까?


문제 3.

그럼 이제 위의 매크로를 이용하여 최댓값과 최솟값을 구하는 코딩을 다시 해보자.





2. 파일 입출력


이번에는 파일 입출력에 대해 알아보자.


scanf로 입력하는 것이 아닌 메모장같은 파일에 있는 내용을 가져오는 방법이다.

input.txt

위의 파일을 다음과 같은 경로에 저장해보자.


파일 탐색기에서 폴더 열기를 누르고 해당하는 경로에 input.txt를 저장해보자.


그리고 아래와 같이 코드를 작성해보자.


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
49
50
51
52
53
54
#include <stdio.h>
#include <stdlib.h> // srand, rand 함수를 위한 헤더
#include <time.h> // time 함수를 위한 헤더
#include <malloc.h>
 
#define max(a,b)(a > b ? a : b)
#define min(a,b)(a < b ? a : b)
 
int arr[100];
 
int maxVal = -1;
int minVal = 987564321;
 
 
void getMinmax(int n)
{
    for (int i = 0; i < n; i++)
    {
        minVal = min(minVal, arr[i]);
        maxVal = max(maxVal, arr[i]);
    }
}
int main()
{
    int n;
 
    FILE *fp;
    fp = fopen("input.txt""r");
    printf("1~100사이 값을 입력하세요 :: ");
    fscanf(fp, "%d"&n);
 
    printf("%d\n", n);
 
    for (int i = 0; i < n; i++)
        fscanf(fp, "%d"&arr[i]);
 
    getMinmax(n);
 
    printf("기존 arr 값\n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
 
    printf("\n찾아낸 min 값 :: %d max 값 :: %d\n", minVal, maxVal);
 

fclose(fp);

    return 0;
}


 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


위의 코드에서 fp, fopen, fscanf, fclose가 새로 생겼다.


우선 fp부터 보자.


FILE *fp는 내가 보고자하는 파일의 포인터를 생성한다는 의미이다.



fopen()은 어떤 파일을 열지 결정하는 행동이다.


이때 "r"은 읽기 전용, "w"는 쓰기 전용, "rw"는 읽고쓰기가 모두 가능하다.



fscanf()는 해당하는 파일에서 값을 읽어오겠다는 의미이다.


fscanf(파일포인터, 형식, 값을 받을 변수 혹은 배열)



fclose()는 malloc을 한 후 free를 하듯이 fclose를 통해 파일을 닫아줘야 한다.(마치 우리가 코드를 작성하고 저장 후 비주얼을 끄듯이)


fclose(파일포인터)


위와 같이 하면 파일을 읽을 수 있게 된다.


문제 1.

아래 파일을 다운받고 이 파일에 나온 알파벳 개수를 카운트해보자.(대소문자 무시)
각 줄당 문자열은 크기 500을 넘지 않는다.
출력은 다음과 같이 한다.
a :: ~개
b :: ~개
...
z :: ~개




그렇다면 파일은 어떻게 쓸까?

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
#include <stdio.h>
#include <string.h>
 
int main()
{
    int n;
    printf("입력할 문장의 개수(1~10) :: ");
    scanf("%d"&n);
 
    FILE *fp;
    fp = fopen("output.txt""w");
    for (int i = 0; i < n; i++)
    {
        char str[500];
        scanf("%s", str);
 
        fprintf(fp, "%s\n", str);
    }
 
    fclose(fp);
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


코드를 보면 추가된 내용이 있다.

fopen()에서 "w"를 이용하여 쓰기 전용으로 변환시켰고

fprintf를 이용하여 파일에 입력시켜준다.

fprintf(파일 포인터, 형식, 값을 넣을 변수 혹은 배열)



문제 1.


그렇다면 방금전의 input 파일을 이용하여 파일을 한번 output.txt 파일에 복사해보자.






반응형