혜랑's STORY

[C_멘토링] 4주차 과제 본문

2020 SISS 21기 활동/1학기 C언어

[C_멘토링] 4주차 과제

hyerang0125 2020. 5. 22. 12:37

1. SWEA 2072번(배열 사용)

<코드>

#include <stdio.h>

int arraySum(int x) { //배열의 합을 구하는 함수

	for (int i = 0; i < 10; i++) {
		int num; //입력받을 숫자 변수
		scanf("%d", &num); 
		
		if (num % 2 == 1) { //홀수를 더하기 위해 나누머지가 1인 수만 더하는 조건문
			x += num;
		}
	}

	return x;
}

int main() {
	int tcase; //케이스 수를 입력받을 변수
	int sum = 0; //숫자를 더해둘 변수

	scanf("%d",&tcase);

	int* result = (int*)malloc((tcase)*sizeof(int)); //'malloc'을 사용하여 케이스 만큼의 배열을 만든다

	for (int i = 0; i < tcase; i++) {
		result[i] = arraySum(sum);	//result에 arraySum에서 return된 합을 저장한다
	}

	for (int i = 1; i < (tcase+1); i++) {
		printf("#%d %d\n", i, result[i - 1]);
	}

	return 0;
}

<실행 결과>

SWEA 2072번 실행 결과

<설명>

타입* 변수이름 = (형변환)malloc(malloc 함수의 매개변수) : 동적 메모리 할당(배열의 크기를 고정해두지 않는 것

ex) int* result = (int*)malloc(sizeof(int)*tcase) : result라는 포인터 변수에 자료형의 크기가 int(4)인 tcase만큼의 메모리를 할당함.

2. SWEA 2068번(배열 사용)

<코드>

#include <stdio.h>

int arrayMax(x) { //배열에서 가장 큰 값을 반환하는 함수

	for (int i = 0; i < 10; i++) {
		int num; //입력받을 수

		scanf("%d", &num);

		if (num > x) { //만약 입력된 값이 max에 저장된 값보다 크다면 max에 num대입한다
			x = num;
		}
	}

	return x;
}

int main() {
	int tcase;
	int max = 0;

	scanf("%d",&tcase);

	int* result = (int*)malloc((tcase)*sizeof(int)); //'malloc'을 사용하여 tcase만큼의 배열 만든다

	for (int i = 0; i < tcase; i++) {
		result[i] = arrayMax(max);
	}

	for (int i = 1; i < (tcase+1); i++) {
		printf("#%d %d\n", i, result[i - 1]);
	}

	return 0;
}

<실행 결과>

SWEA 2068번 실행 결과

 

3. 포인터 실습 : 가장 큰 값과 가장 작은 값 출력하기

<코드>

#include <stdio.h>

void max_min(int a[], int n, int* max, int* min);

int main() {
	int n, max, min;

	printf("Enter arrange size : ");
	scanf("%d", &n);

	int* numList = (int*)malloc(sizeof(int) * n);

	printf("Enter %d numbers : ", n);
	for (int i = 0; i < n; i++) {
		scanf("%d", numList + i);
	}

	max_min(numList, n, &max, &min);

	printf("Largest : %d\n",max);
	printf("Smallest : %d",min);
    
    return 0;
}

void max_min(int a[], int n, int* max, int* min) {
	*max = a[0];
	*min = a[0];
	for (int i = 0; i < n; i++) {
		if (a[i] >* max) {
			*max = a[i];
		}
		else if (a[i] < *min) {
			*min = a[i];
		}
	}
}

<실행 결과>

포인터 실습 실행 결과

 

#함수에서 포인터 매개변수를 사용하는 이유

- 함수의 매개변수를 포인터로 지정하면, 변수의 메모리 주소를 함수로 전달하게 된다. 함수 안에서는 변수의 메모리 주소에 접근하게 되고, 그 메모리 주소에 대입을 하게 된다. 그렇기 때문에 함수가 종료되더라도 변수 안의 값이 바뀌게 된다.

-예시

void swap(int* a, int*b){
	int temp; //임시 보관소
    
    temp = *a;
    *a = *b;
    *b = temp;
}

 위 코드에 (a = 10, b =20)를 대입하여 실행, 출력한다면, (a = 20, b =10)으로 바뀌어 출력되는 것을 확인 할 수 있다. 

- 주의할 점 : 함수에 매개변수를 전달할 때, 변수의 주소값을 보내주어야함으로 주소연산자 '&'를 사용하여 메모리 주소를 전달해야한다. 

'2020 SISS 21기 활동 > 1학기 C언어' 카테고리의 다른 글

[C_멘토링] 6주차 과제  (0) 2020.06.07
[C_멘토링] 5주차 과제  (0) 2020.05.31
[C_멘토링]3주차 과제  (0) 2020.05.17
[C_멘토링] 2주차 과제  (0) 2020.04.14
[C_멘토링] 1주차 과제  (0) 2020.04.08