C언어 기초 (6-1) : 포인터 연습문제 풀이

STUDY_J·2024년 7월 7일
  • 포인터와 배열 부분에 대한 이해 부족으로 chatgpt에서 제공하는 문제들을 풀이해 보았다.

문제 1

  • 프로젝트: 학생 성적 관리 프로그램
    이 프로젝트에서는 학생들의 성적을 관리하는 간단한 프로그램을 작성합니다. 이 프로그램은 다음과 같은 기능을 포함합니다:

  • 학생 성적 입력
    학생 성적 출력
    성적의 평균 계산
    최고 성적과 최저 성적 찾기

  • 요구사항
    학생 수는 최대 5명으로 제한합니다.
    각 학생의 성적은 0점에서 100점 사이의 정수입니다.
    포인터를 사용하여 배열을 처리합니다.

#include <stdio.h>


int sumArray(int *arr, int length);
float averArray(int *arr, int length);
int maxArray(int *arr, int length);
int minArray(int *arr, int length);

int main(void)
{
	// 사용자로부터 5개의 정수 입력받아 배열에 저장
	// 배열의 요소들을 순서대로 출력
	// 배열의 모든 요소들의 합을 계산하여 출력
	// 배열의 모든 요소들의 평균을 계산하여 출력
	// 배열의 요소들 중 최대값과 최소값을 찾아 출력
	
	int num;
	int num_arr[5];
	int length = sizeof(num_arr)/sizeof(num_arr[0]);
	//printf("%d", length);
	
	for(int i = 0; i < length; i++)
	{
		printf("원하는 숫자를 입력하세요. %d 번에 저장됩니다.", i+1);
		scanf("%d", &num);
		
		num_arr[i] = num;
	}
	
	for(int j = 0; j < length; j++)
	{
		printf("arr[%d] : %d\n", j, num_arr[j]);
	}
	
	int sum = sumArray(num_arr, length);
	printf("배열의 모든 요소들의 합 : %d\n", sum);
	
	float aver = averArray(num_arr, length);
	printf("배열의 모든 요소들의 평균 : %.2f\n", aver);
	
	int max = maxArray(num_arr, length);
	printf("배열의 요소들 중 최대 값 : %d\n", max);
	
	int min = minArray(num_arr, length);
	printf("배열의 요소들 중 최소 값 : %d\n", min);
	
	return 0;
}

int sumArray(int *arr, int length)
{
	int sum = 0;
	for(int i = 0; i < length; i++)
	{
		sum += arr[i];
	}
	
	return sum;
}

float averArray(int *arr, int length)
{
	float sum = sumArray(arr,length);
	float aver = sum / length;
	
	return aver;
}

int maxArray(int *arr, int length)
{
	int max = arr[0];
	for(int i = 1; i < length; i++)
	{
		if(max < arr[i])
		{
			max = arr[i];
		}
				
	}
	return max;
}

int minArray(int *arr, int length)
{
	int min = arr[0];
	for(int i = 1; i < length; i++)
	{
		if(arr[i] < min)
		{
			min = arr[i];
		}
				
	}
	return min;
}
  • 시간 순서에 따른 문제풀이
    1) 우선 숫자를 입력받아 배열의 요소에 저장해준다
    2) 제대로 저장되었는지 for문을 통해 배열을 출력해본다
    3) 합, 평균, 최소, 최대값을 출력해주는 함수를 만들어 각 해답을 출력한다.
    !! 배열을 사용한 함수를 만들때는 pointer를 잘 활용해야한다.

  • 출력

    원하는 숫자를 입력하세요. 1 번에 저장됩니다.10
    원하는 숫자를 입력하세요. 2 번에 저장됩니다.836
    원하는 숫자를 입력하세요. 3 번에 저장됩니다.72654
    원하는 숫자를 입력하세요. 4 번에 저장됩니다.22
    원하는 숫자를 입력하세요. 5 번에 저장됩니다.5
    arr[0] : 10
    arr[1] : 836
    arr[2] : 72654
    arr[3] : 22
    arr[4] : 5
    배열의 모든 요소들의 합 : 73527
    배열의 모든 요소들의 평균 : 14705.40
    배열의 요소들 중 최대 값 : 72654
    배열의 요소들 중 최소 값 : 5

문제 2

  • 문제: 배열 정렬 프로그램
    사용자로부터 여러 개의 정수를 입력받아 배열에 저장한 후, 배열의 요소들을 오름차순으로 정렬하여 출력하는 프로그램을 작성하세요.

  • 요구사항
    사용자로부터 최대 10개의 정수를 입력받아 배열에 저장합니다.
    배열의 요소들을 오름차순으로 정렬합니다.
    정렬된 배열의 요소들을 출력합니다.
    함수와 포인터를 사용하여 문제를 해결하세요.

  • 세부 요구사항
    입력된 정수의 개수가 10개 미만일 수 있습니다. 이 경우 입력이 완료된 후 -1을 입력하여 더 이상 입력하지 않음을 표시합니다.
    배열의 요소들을 오름차순으로 정렬하기 위해 정렬 알고리즘을 직접 구현합니다(버블 정렬, 선택 정렬, 삽입 정렬 중 하나를 선택).
    정렬 및 출력 기능을 함수로 분리하여 구현합니다.

#include <stdio.h>

void EArray(int *arr1, int SIZE);

/*
사용자로부터 여러 개의 정수를 입력받아 배열에 저장한 후, 배열의 요소들을 오름차순으로 정렬하여 출력하는 프로그램을 작성하세요.

- 요구사항
사용자로부터 최대 10개의 정수를 입력받아 배열에 저장합니다.
배열의 요소들을 오름차순으로 정렬합니다.
정렬된 배열의 요소들을 출력합니다.
함수와 포인터를 사용하여 문제를 해결하세요.

- 세부 요구사항
입력된 정수의 개수가 10개 미만일 수 있습니다. 이 경우 입력이 완료된 후 -1을 입력하여 더 이상 입력하지 않음을 표시합니다.
배열의 요소들을 오름차순으로 정렬하기 위해 정렬 알고리즘을 직접 구현합니다(버블 정렬, 선택 정렬, 삽입 정렬 중 하나를 선택).
정렬 및 출력 기능을 함수로 분리하여 구현합니다.
*/

int main(void)
{
	int SIZE;
	int num;
	int arr[10];
	
   	while (1)
   	{
        	printf("입력할 정수의 개수를 입력해주세요 (1~10): ");
        	scanf("%d", &SIZE);
        
        	if (SIZE < 1 || SIZE > 10) 
        	{
            	printf("1~10 사이의 숫자만 입력해주세요\n");
            	continue; // 조건이 맞지 않으면 다시 입력 받음
        	}
        	break; // 조건이 맞으면 루프 탈출
   	}
	
	
	for(int i = 0; i < SIZE; i++)
	{
		printf("배열의 요소를 입력해주세요\n");
		scanf("%d", &num);
		
		arr[i] = num;
	}
	
	for(int j = 0; j < SIZE; j++)
	{
		printf("배열 요소[%d] : %d\n", j, arr[j]);
	}
	printf("\n\n");
	
	// 배열 요소들의 크기를 비교하여 순서를 바꿔주기
	EArray(arr, SIZE);
	
	for(int k = 0; k < SIZE; k++)
	{
		printf("배열 요소[%d] : %d\n", k, arr[k]);
	}
	printf("\n\n");
	
	return 0;
}

void EArray(int *arr1, int SIZE)
{
	for(int i = 0; i < SIZE; i++)
	{
		for(int j = i+1; j < SIZE; j++)
		{
			if(arr1[i] > arr1[j])
			{
				int temp = arr1[i];
				arr1[i] = arr1[j];
				arr1[j] = temp;
			}
		}
	}
}
  • 시간 순서에 따른 문제풀이
    1) 문제 1과 마찬가지로 입력받은 정수를 기반으로 배열을 만들어준다.
    2) 이 문제에서는 1~10개 사이의 정수를 입력받아 배열에 저장해야하므로 if문을 통해 조건을 걸어 해당 범위에 포함되지 않으면 다시 실행되도록 while문을 활용한다.
    3) 입력한 정수의 개수대로 배열의 요소를 입력하고, 각 요소가 제대로 저장되었는지 확인한다.
    4) 배열 요소들의 크기를 비교하여 순서를 바꿔주는 함수를 생성한다.
    !! " 버블 정렬 알고리즘" 이라는 것을 활용하여 각 배열 요소를 바꿔주는 함수를 만들어준다.

  • 해당 코드의 출력 내용

    입력할 정수의 개수를 입력해주세요 (1~10): 5
    배열의 요소를 입력해주세요
    625
    배열의 요소를 입력해주세요
    2293
    배열의 요소를 입력해주세요
    6
    배열의 요소를 입력해주세요
    63
    배열의 요소를 입력해주세요
    924
    배열 요소[0] : 625
    배열 요소[1] : 2293
    배열 요소[2] : 6
    배열 요소[3] : 63
    배열 요소[4] : 924
    ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
    배열 요소[0] : 6
    배열 요소[1] : 63
    배열 요소[2] : 625
    배열 요소[3] : 924
    배열 요소[4] : 2293

0개의 댓글