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를 저장해보자.
그리고 아래와 같이 코드를 작성해보자.
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를 통해 파일을 닫아줘야 한다.(마치 우리가 코드를 작성하고 저장 후 비주얼을 끄듯이)
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 |
'Tutoring > C' 카테고리의 다른 글
형 변환, typedef, 헤더파일 소개 (0) | 2018.02.26 |
---|---|
동적 메모리 할당, 비트연산, 메모리 구조 (0) | 2018.02.26 |
구조체, 함수, 포인터 (0) | 2018.02.26 |
연산자, 조건문, 반복문, 배열 (0) | 2018.02.22 |
변수 선언, 입/출력, 연산, 주석 (0) | 2018.02.22 |