[C Question] 포인터 배열 연습문제
카테고리: c-question-lv1
1. 주관식 연습문제
1-1. 아래 함수의 매개변수 선언에서 매개변수 arr을 대상으로 const선언을 한 이유는?
void showAllData(const int* arr, int len)
{
int i;
for(i=0; i <len;i++)
printf("%d ", arr[i]);
}
정답
답변: 다른 사람이 함수를 쓰거나 본인이 함수를 사용하면서
혹시라도 포인터 변수의 참조 값을 이용하여,
배열 arr의 값을 변경하지 못 하도록 const로 참조 값을 금지시키는 의도를 보였습니다.
모범 정답: 문제에서 정의한 함수의 기능은 모든 data를 보여주는 함수로써,
인자로 전달된 배열의 전체 요소를 출력해주는 기능을 가집니다.
따라서, 프로그래머가 실수로라도 배열의 값을 바꿔서는 안됩니다.
그래서, 매개변수 arr에 const를 추가하여,
배열의 값을 바꾸려는 경우 컴파일 에러가 발생하게 됩니다.
1-2. 다음 코드에서 지적할 만한 사항은 ?
void ShowData(const int* ptr)
{
int* rptr = ptr;
printf("%d \n", *rptr);
*rptr = 20;
}
int main(void)
{
int num = 10;
int* ptr = #
ShowData(ptr);
}
정답
답변: ShowData 함수의 기능은 매개변수의 주소값을 사용하여 포인터 변수의 값을 출력해주는 기능을 가지고 있습니다.
그래서 값을 보여주되, 값을 변경하지는 못하도록 매개변수 ptr에 const를 사용하였지만,
함수 안에서 정의된 포인터 변수 rptr이 매개변수 ptr을 대입했으므로,
포인터 변수 rptr을 참조값으로 변경했을 때, num의 값이 변경이 돼서
함수에 const를 쓴 의도를 무시해버렸습니다.
( 예시를 드는 건 위험 ! )
2. 코딩 연습문제
2-1. 배열의 값을 5로 나눈 만큼 별 찍기
int main()
{
// 선언
int arr[5] = { 72, 88, 95, 64, 100 };
int i, len;
len = sizeof(arr) / sizeof(int);
// 호출
printf_graph(arr, len);
return 0;
}
- 결과
정답
2-2. Call By Value와 Call By Reference
int main()
{
int num1 = 10;
printf("Value : %d \n", SqaureByValue(num1));
SqaureByReference(&num1);
printf("Reference : %d \n", num1);
return 0;
}
조건 : 각 함수 1줄씩만하되, CBR는 return을 쓰면 안된다.
정답
2-3. 로또 번호 비교
int main()
{
int lottoArr[] = { 4, 10, 25, 30, 41, 45 };
int myArr[] = { 1, 4, 7, 22, 41, 43 };
int len;
len = sizeof(lottoArr) / sizeof(int);
printf("일치하는 번호의 개수 : %d \n", check_same(lottoArr, myArr, len));
return 0;
}
정답
2-4. 배열 중복 검사
void input_nums(int* arr, int len); // arr를 이용한 함수 정의할 것
void input_nums_dup(int* arr, int len); // dup = 1, = 0 과 같은 flag 방법 이용할 것
void input_nums_var(int* arr, int len); // 새로운 변수를 선언하여 변수 이용할 것
void print_nums(int* arr, int len);
int main()
{
int arr[6];
int len;
len = sizeof(arr) / sizeof(int);
// input_nums_var(arr, len);
// input_nums(arr, len);
input_nums_dup(arr, len);
print_nums(arr, len);
return 0;
}
정답
2-5. 배열의 홀수 짝수
int main()
{
int arr[10];
int i, len;
len = sizeof(arr) / sizeof(int);
printf("총 10개의 숫자 입력\n");
for (i = 0; i < len; i++)
{
printf("%d번째 입력: ", i + 1);
scanf_s("%d", &arr[i]);
}
getOddNum(arr, len);
getEvenNum(arr, len);
return 0;
}
정답
2-6. 10진수를 2진수로
int main()
{
// 선언
int arr[100];
int i, num;
printf("10진수 정수 입력 : ");
scanf_s("%d", &num);
// 처리
// 출력
return 0;
}
정답
2-7. 홀수는 뒤로, 짝수는 앞으로
int main()
{
int arr[10];
int i, temp, len, backCnt = 0, frontCnt = 0;
len = sizeof(arr) / sizeof(int);
// 입력 & 처리
printf("총 10개의 숫자 입력 \n");
for (i = 0; i < len; i++)
{
}
// 출력
printf("배열 요소의 출력 : ");
for (i = 0; i < len; i++)
printf("%d ", arr[i]);
return 0;
}
정답
2-8. Palindrome
int main()
{
char string[100];
printf("문자열 입력 : ");
scanf_s("%s", &string, (unsigned char)sizeof(string));
// 4줄, 결과 main에서
if (isPalindrome(string) == 1) printf("회문입니다. \n");
else printf("회문이 아니에요 ! \n");
return 0;
}
댓글 남기기