C언어

[C언어] 동적할당 사용 예제

yujin0517 2021. 9. 7. 17:28

코드 설명

 

<main함수>

  1. 입력받을 정수의 개수 정하기(입력받기) (scanf_s)
  2. 개수만큼 정수 입력하기 (scanf_s)
  3. 문자 배열을 선언하여 정렬 중 로딩 화면 출력하기 (char* dot [], char* loading [])
  4. 사용자가 종료할 때까지 반복하기 위해 while문 사용
  5. goto문을 사용하여 선택지에 없는 번호를 입력했을 경우 다시 정렬 선택 코드로 올라가기 
  6. Windows 헤더 파일을 include 하여 "system(cls);"를 사용 -> 화면 클리어
  7. 마지막으로 free함수로 메모리 해제

<sortAsc(오름차순), sortDsc(내림차순)>

  1. 정렬 방법 선택하기(오름차순, 내림차순 -> 따로 void함수 만들기)
  2. 이중 for문 사용 
  3. 값을 임시 저장할 변수 temp를 선언하여 값 비교 후 저장

 

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

void sortAsc(int* arrNum, int size) {
	for (int i = 0; i < size - 1; i++) {
		for (int j = i+1; j < size; j++) {
			if (*(arrNum + i) > *(arrNum + j)) {
				int temp = *(arrNum + i);
				*(arrNum + i) = *(arrNum + j);
				*(arrNum + j) = temp;
			}
		}
	}
}

void sortDsc(int* arrNum, int size) {
	for (int i = 0; i < size - 1; i++) {
		for (int j = i + 1; j < size; j++) {
			if (*(arrNum + i) < *(arrNum + j)) {
				int temp = *(arrNum + i);
				*(arrNum + i) = *(arrNum + j);
				*(arrNum + j) = temp;
			}
		}
	}
}


void main() {

	int* arrNum = 0;
	int size = 0;
	int choice = 0; 
	const char* dot[] = { ".", "..", "...", "...."};
	const char* loading[] = {"□□□□□□□□□", "■■■□□□□□□", "■■■■■■□□□", "■■■■■■■■■"};

	while (1) {
		printf("입력하실 정수의 개수를 입력하세요(나가기 : -99)\n");
		scanf_s("%d", &size);
		if (size == -99) break;

		arrNum = (int*)calloc(size, sizeof(int));  //동적할당 초기화
		printf("입력하신 개수만큼 정수를 입력하세요\n");

		for (int i = 0; i < size; i++) {
			scanf_s("%d", arrNum + i);  //주소를 알려줘야해서 *() 사용하지 않음
		}
		
		system("cls");  //화면 클리어

		for (int i = 0; i < size; i++) {
			printf("%d ", *(arrNum + i));  //값을 읽어와야 하기에 *를 사용하여 배열에 접근
		}
		printf("\n");

	again:;
		printf("정렬 방법 선택하기(종료 : -99)\n");
		printf("1. 오름차순\n2. 내림차순\n3. 종료\n=>");
		scanf_s("%d", &choice);

		if (choice == 3) 
        	break;
		else if (choice == 1) {
			sortAsc(arrNum, size);
		}
		else if (choice == 2) {
			sortDsc(arrNum, size);
		}
		else {
			printf("잘못 입력하셨습니다.\n");
			goto again;  //선택지를 잘못 입력한 경우 again으로 돌아가 다시 선택
		}
		system("cls");  //화면 클리어

		//정렬중 로딩 화면 출력 
        for (int i = 0; i < 4; i++) {
			printf("%s\n", loading[i]);  
			//%s : 직접 한 번 참조해서 배열에 들어있는 값을 뽑아냄
			printf("     정렬중%s", dot[i]);
			Sleep(1000);  //1초 간격으로 출력
			system("cls");  //화면 클리어
		}
		for (int i = 0; i < size; i++) {
			printf("%d ", *(arrNum + i));
			Sleep(500);  //0.5초 간격으로 출력
		}
		printf("\n");
	}
	free(arrNum);  //메모리 날리기(중요!)
}

 

만약 입력한 정수의 개수가 4개라면 가장 밖의 반복문이 돌아가는 범위(i의 범위)는 인데스 0, 1, 2까지로 정합니다. 

그러고 안에 있는 반복문이 돌아가는 범위(j의 범위)는 인덱스 i 보다 한 칸 뒤에 있는 인덱스(i + 1)부터 시작해서 인덱스 4까지로 정합니다. 

범위 설명

 

<콘솔창>

 

정렬하기

 

 

감사합니다!

 

2021.09.07