C/C++ 프로그레스바 (ProgressBar)
C/C++의 콘솔 환경에서 프로그레스바 (진행바) 구현 소스입니다.
아래와 같이 심플하게 개수, 프로그레스바, 진행률 이 출력됩니다.
10/10 [==================================================] 100%
#include <stdio.h> #include <stdlib.h> #include <windows.h> // Sleep 함수 int main() { const char bar = '='; // 프로그레스바 문자 const char blank = ' '; // 비어있는 프로그레스바 문자 const int LEN = 20; // 프로그레스바 길이 const int MAX = 1000; // 진행작업 최대값 const int SPEED = 50; // 카운트 증가 대기시간 int count = 0; // 현재 진행된 작업 int i; // 반복문 전용 변수 float tick = (float)100/LEN; // 몇 %마다 프로그레스바 추가할지 계산 printf("%0.2f%% 마다 bar 1개 출력\n\n", tick); int bar_count; // 프로그레스바 갯수 저장 변수 float percent; // 퍼센트 저장 변수 while(count <= MAX) { printf("\r%d/%d [", count, MAX); // 진행 상태 출력 percent = (float)count/MAX*100; // 퍼센트 계산 bar_count = percent/tick; // 프로그레스바 갯수 계산 for(i=0; i<LEN; i++) { // LEN길이의 프로그레스바 출력 if(bar_count > i) { // 프로그레스바 길이보다 i가 작으면 printf("%c", bar); } else { // i가 더 커지면 printf("%c", blank); } } printf("] %0.2f%%", percent); // 퍼센트 출력 count++; // 카운트 1증가 Sleep(SPEED); // SPEEDms 대기 } printf(" done!\n\n"); system("pause"); // 프로그램 종료 전 일시정지 return 0; } |
1000개의 전체 작업량 중 1개가 완료되었다면 진행률은 0.1%가 됩니다.
현재 진행량/전체 진행량 * 100 = 진행률(%)
100분율 계산법입니다.
해당 연산은 코드의 19행에서 진행하고 있습니다.
현재 진행량은 코드상에서 count 변수
전체 진행향은 코드상에서 MAX 변수입니다.
진행률을 계산했으면 해당 진행률을 기준으로 프로그레스바(진행바)를 출력해야합니다.
100(%)/프로그레스바 길이 = 몇 %마다 프로그레스바 1개 출력
만약 프로그레스바의 길이가 20이라고 하면
100/20 = 5
[====================] 100%
위의 모습일겁니다.
길이는 고정되어있음으로 진행률 퍼센트에 따라 = 문자를 출력해줘야 하죠
코드의 13행에서 해당 계산을 진행하고 있습니다.
계산 후 tick 이라는 변수에 저장해두었습니다.
20길이의 프로그레스바는 5% 마다 = 한개를 출력합니다.
10%라고 하면 == 를 출력하겠죠?
17~31행의 while 문은 0~전체 진행량까지 반복하는 반복문입니다.
19행에서 매번 반복마다 진행률(%)을 계산하여
20행에서 프로그레스바 = 문자를 몇개 출력할지 계산한 후
그 아래 21행 for문에서 출력을 합니다.
for문은 0~LEN 까지 반복을 하는데 LEN은 프로그레스바의 길이가 저장되있는 변수이름입니다.
20이라고 가정하면 0~20까지 반복하계되죠
bar_count는 20행에서 현재 %는 몇개의 =문자를 출력할지 저장되어있습니다.
만약 프로그레스바 길이가 20이고 진행률이 7%라고 가정합시다.
1 - 13행처럼 먼저 몇 %마다 =문자를 출력할지 계산
100/20 = 5(%)
tick = 5
2 - bar_count에 현재 퍼센트는 몇개의 =를 출력할지 계산
percent/tick = 갯수
7/5 = 1(나머지 버림)
bar_count = 1
3 - for문에서 출력
LEN이 20이므로 i = 0~20
if(bar_count > i)
0~20까지 i가 증가하면서 bar_count와 비교하여 출력
bar_count는 현재 1이 저장되어있으므로 i가 0일때만 참
20번 반복하면서 =하나를 출력하게 되고
거짓인 경우에는 else 로 가서 공백을 출력합니다.
4 - for문으로 출력 후 퍼센트 출력 및 count 증가
count(현재 진행량)를 1 증가
위의 과정을 현재 진행량~전체 진행량까지 반복하여 100%가 되면 종료합니다.
출력하는데 왜 이어서 출력이 되지않고 원래 위치 그대로에서 출력될까요?
그 문제는 18행에 있습니다.
printf("\r")
\r 이스케이프 시퀀스는 해당 라인의 첫 번째 위치로 이동합니다.
첫 번째로 이동한 후 다시 출력을 하게되어 위치가 바뀌지않고 진행되는이유입니다.
'프로그래밍 > C, C++' 카테고리의 다른 글
[C] 자신과 동일한 프로세스 이름이 가동중인지 확인하는 코드 (중복 실행 차단) (0) | 2024.08.27 |
---|---|
[C++] 파일쓰기 예제 (0) | 2023.12.11 |
[C/C++] int 를 char 또는 const char* 로 변환하기 (0) | 2022.06.30 |
C++ 프로그램 중복 실행 방지 (윈도우 기반) (0) | 2021.05.18 |
C++ 에서 구동 파일의 절대 경로 확인하기 (windows) (0) | 2021.05.17 |