5월 범위 기말고사 - Hwanghyewon06/c- GitHub Wiki

좋아. 네가 원하는 방식 아주 정확하게 이해했어. 지금부터는 네가 수업 시간에 작성한 코드 범위 내에서만, 숫자만 바꾸거나 약간의 구조만 바꿔서, 한 줄씩 읽고 문제를 낸다. 조건 명확하게 다시 정리하면 아래와 같아:


✅ 너가 원하는 문제 구성 기준:

  1. 범위: 네가 수업 시간에 작성한 C 코드 그대로 사용 (예: 포인터, 함수, 메모리 그림, 아스키코드 등 5~6월 수업 범위)

  2. 형식:

    • 메모리 그림 그리기
    • 출력 결과 쓰기
    • 코드 빈칸 채우기
    • 함수/포인터 중심 문제
    • 조건문/반복문은 보조로만 사용
  3. 문제 방식:

    • 수업 때 했던 코드를 거의 그대로
    • 숫자만 바꾸거나 변수명만 살짝 바꿈
    • 한 줄씩 뜯어서 문제 내기
  4. 출력 안보이게: 문제에는 정답 없음 정답/해설은 따로


그럼 너가 수업시간에 했던 코드 몇 개 예시만 올려줘. 내가 그 코드 한 줄씩 분석해서 완전히 네 기준에 맞는 문제로 만들어 줄게.

예를 들어 아래처럼 주면 돼:

#include <stdio.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 10, y = 20;
    swap(&x, &y);
    printf("%d %d\n", x, y);
    return 0;
}

이런 식으로 너가 썼던 수업 코드 3~5개만 주면, 그 안에서 숫자만 바꾸고, 구조는 거의 그대로 문제 15문제 이상 만들어 줄게.


👀 지금은 네가 수업시간에 쓴 코드 없이 내가 상상해서 만든 거라 네 기대랑 안 맞은 거야. 그러니까 너가 했던 코드 그대로 올려줘. 그럼 딱 너 스타일로 문제 만들어 줄게.

기다릴게.

좋습니다. 이제 올려준 내용을 바탕으로 정확하게 기말고사 스타일의 C언어 문제를 만들어드리겠습니다. 수업 범위를 충분히 반영하였고, 특히 포인터, 배열, 구조체, 동적 메모리, 문자열 등 최근 수업 내용을 중심으로 구성하였습니다.


✅ C언어 기말고사 연습문제 (총 15문제, 1시간 이내 풀이 기준)

⚠ 정답은 아래 "정답 및 해설" 섹션에 제공됩니다. 문제 풀이 중 정답은 보이지 않도록 구성했습니다.


📘 [1] 코드 출력 결과는?

#include <stdio.h>
void PrintStringToAscii(char* s1)
{
	for (int i = 0; s1[i] != '\0'; ++i)
		printf("%c : %d\n", s1[i], s1[i]);
	printf("\n");
}
int main()
{
	char* s1 = "ABCDEF";
	PrintStringToAscii("ABC");
	PrintStringToAscii(s1);
	PrintStringToAscii("Hello");
}

📘 [2] 출력 결과는?

#include <stdio.h>
int main()
{
	char* s = "ABC";
	printf("%c %c\n", s[0], "ABC"[0]);
	printf("%s %s\n", s, "ABC");
	printf("%s %s\n", s + 1, "ABC" + 1);
}

📘 [3] 아래 코드의 출력 결과는?

#include <stdio.h>
int main()
{
	int arr[2] = { 100, 200 };
	int* p = arr;
	printf("%d %d\n", p[0], p[1]);
	printf("%d %d\n", *(p + 0), *(p + 1));
}

📘 [4] 다음 코드에서 메모리 해제 후 접근에 대한 설명으로 옳은 것은?

#include <stdio.h>
#include <stdlib.h>
int main()
{
	double* pk = malloc(sizeof(double));
	pk[0] = 299.2;
	free(pk);
	// 다음 줄이 있다면 오류 발생 가능: printf("%g", pk[0]);
}

(a) pk는 NULL이므로 접근해도 안전하다 (b) Heap 메모리가 해제되었으므로 접근은 미정의 동작이다 (c) pk[0]은 여전히 299.2를 가리킨다 (d) 접근하지 않으면 문제가 없다


📘 [5] 코드 빈칸 채우기: 포인터를 사용하여 구조체 멤버 출력

#include <stdio.h>
struct Point {
	int x;
	int y;
};
void PrintPoint(______ p) {
	printf("(%d, %d)\n", p->x, p->y);
}
int main() {
	struct Point pt = { 2, 3 };
	PrintPoint(_____ );
}

📘 [6] 다음 중 동적 메모리 할당 코드로 옳은 것은?

(a) int* p = malloc(4); (b) double* p = malloc(sizeof(int)); (c) int* p = malloc(sizeof(int) * 3); (d) int* p = malloc(sizeof(p));


📘 [7] 다음 구조체의 크기는 몇 바이트인가?

struct Point {
	int x;
	int y;
};

📘 [8] 다음 코드에서 출력 결과는?

#include <stdio.h>
int main() {
	int n1 = 65;
	int n2 = 'A';
	printf("%d %d\n", n1, n2);
	printf("%c %c\n", n1, n2);
}

📘 [9] 아래 코드의 실행 결과는?

#include <stdio.h>
int main()
{
	char arr[3] = { 10, 20 ,30 };
	char* pc = arr;
	printf("%d %d\n", pc[0], pc[1]);
}

📘 [10] 다음 포인터 산술에 대한 설명으로 옳지 않은 것은?

(a) p + 1은 다음 요소를 가리킨다 (b) *(p + 1)은 p[1]과 같다 (c) p++는 포인터 값을 증가시킨다 (d) *p++는 포인터를 증가시키지 않는다


📘 [11] 다음 코드의 결과는?

#include <stdio.h>
int main()
{
	int arr[4] = { 10, 20, 30, 40 };
	int* p = arr;
	printf("%d\n", *(p + 2));
}

📘 [12] 다음 코드의 출력 결과를 쓰시오.

#include <stdio.h>
int main()
{
	char* p = "ABC";
	printf("%s\n", p+1);
}

📘 [13] 다음 중 malloc 실패를 확인하는 코드로 알맞은 것은?

double* pk = malloc(sizeof(double)*2);
if (_______)
{
	printf("메모리 할당 실패\n");
	return -1;
}

📘 [14] 구조체 포인터를 사용하는 아래 코드의 출력 결과는?

#include <stdio.h>
struct Point {
	int x;
	int y;
};
int main()
{
	struct Point pt = { 2, 3 };
	struct Point* p = &pt;
	printf("(%d, %d)\n", p->x, p->y);
}

📘 [15] 다음 코드의 출력 결과는?

#include <stdio.h>
int main()
{
	int n = 10;
	int* p = &n;
	printf("%d %d\n", *&n, *p);
}

📘 정답 및 해설 요청 방법

각 문제의 정답과 해설이 필요하시면 이렇게 요청해 주세요:

“1~15번 정답과 해설 보여줘” 또는 “3, 5, 10번 해설만 보여줘”


필요하면 위 내용을 PDF나 워드 형식으로도 정리해드릴 수 있어요. 추가 문제 원하시나요?

⚠️ **GitHub.com Fallback** ⚠️