티스토리 뷰
C언어를 주제로 한 세 번째 포스팅은 배열과 반복문 그중 for문에 대하여 다루어보겠습니다.
수많은 프로그래밍 언어들이 각자의 방식으로 배열을 선언하고 사용합니다. 배열은 그만큼 유용성이 좋습니다.
배열이란 동일한 타입의 변수를 연속된 주소값으로 나열한 변수들의 그룹정도로 생각하시면 됩니다.
반복문이란 특정조건이 만족할때까지 동일한 코드를 반복시켜주는 코드입니다.
그중 for문은 사용방법이 간단하고 유용하여 많이 사용하기때문에 이번 포스팅에서 다루겠습니다.
예제 문제들을 해결하며 배열과 for루프를 활용하여보겠습니다.
<C 예제문제 3번 - 0에서 9까지의 정수 20개를 입력받아 가장많이 입력된 수와 그 빈도수를 출력>
해결 과정)
횟수를 알아낸는 방법으로 각각의 숫자가 불러진 횟수를 저장할 정수형 배열인 num[10]과 입력받은 정수를 저장할 임시 변수인 정수형 tmp라는 변수를 사용 하였습니다.
int num[10] = { 0, }; //정수가 불려진 횟수를 저장할 배열
int tmp; // 입력받은 정수를 저장할 임시 변수
그리고 scanf함수를 사용하여 tmp변수의 값을 입력받는 동시에 그값을 index로 사용하여 횟수를 저장할 배열에도 초기화를 해주었습니다. 이렇게 하면 정수를 입력 받을 때 입력받은숫자번째의 방의 배열은 값이 올라갑니다.
Ex) tmp에 1이 입력될 때 Num[1]의 값이 1증가 합니다. 즉 입력 받을 때 마다 횟수가 증가합니다.
scanf("%d", &tmp); //tmp에 정수 초기화
num[tmp]++; //tmp에 초기화된 정수번째 num배열방의 값을 1 올려줌
그다음 횟수를 저장한 배열들을 비교연산하여 가장큰 값을 찾아낸다면
가장많이 입력받은 숫자를 구할수 있습니다. 코드를 통해 예시들겠습니다.
for (int i = 0; i < sizeof(num)/sizeof(num[0]); i++) {
if (max < num[i]) { //가장 많이 입력된 정수를 찾는 과정
maxIndex = i;
max = num[maxIndex];
}
}
가장 크게 고민한 부분은 만약 가장많이 입력된 정수가 여러 개일때는 어떻게 해야할것인지였습니다.
만약 10개의 정수를 받을 때 1,1,1,1,2,2,2,2,3,3 이 입력될경우에는 1과2둘다 가장많이 입력된 정수입니다
그래서 두개를 다 출력하는 방안으로 채택하여 반복루프를 하나 추가하였습니다.
코드를 통해 예시 들겠습니다.
printf("가장 많이 입력받은 정수: ");
for (int i = 0; i < sizeof(num) / sizeof(num[0]); i++) {
if (num[maxIndex] == num[i]) { //가장 많이 입력받은 정수가 한개가 아닌 경우를 해결
printf("%d ", i);
}
}
루프를 돌리며 만약 맥스값과 같은값을 가지고 있는 배열이 있다면 그 배열의 인덱스를 출력할수 있도록 하였습니다.
전체 코드)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int num[10] = { 0, }; //정수가 불려진 횟수를 저장할 배열
int tmp; //입력받은 정수를 저장할 임시 변수
int maxIndex = 0; //가장 많이 입력된 정수
int max = 0; //가장 많이 입력은 횟수의 최댓값
for (int i = 0; i < 20; i++) {
printf("%d번째 정수를 입력: ", i + 1);
scanf("%d", &tmp);
num[tmp]++; //tmp가 입력되었다는 뜻임으로 입력된 횟수를 뜻하는 num배열의 인덱스가 tmp인 원소를 1 증가
}
for (int i = 0; i < sizeof(num)/sizeof(num[0]); i++) {
if (max < num[i]) { //가장 많이 입력된 정수를 찾는 과정
maxIndex = i;
max = num[maxIndex];
}
}
printf("가장 많이 입력받은 정수: ");
for (int i = 0; i < sizeof(num) / sizeof(num[0]); i++) {
if (num[maxIndex] == num[i]) { //가장 많이 입력받은 정수가 한개가 아닌 경우를 해결하기 위함.
printf("%d ", i);
}
}
puts("");
printf("가장 많이 입력받은 정수의 횟수: %d\n", num[maxIndex]);
return 0;
}
결과 콘솔)
<C 예제문제 4번 - 열두달의 말일을 배열에 저장하고 년과 달을 표준입력으로 받아 해당 년월의 말일 출력>
해결 과정)
달의 말일을 배열 MONTH에 저장하고 년과 달을 표준입력으로 받아 그해 의 말일을 출력하는 프로그램을 작성
일단 1월부터 12월까지의 말일을 배열의 값으로 초기화 해야하기 때문에 int month[12]라는 정수형 배열로 선언하였습니다.
이 배열 안에 각달의 말일값을 초기화하여주었습니다
int month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
그리고 값년 과 월의 값을 받아줄 변수 m과 y를 선언하고 scanf함수를 통해 각값을 초기화해주었습니다.
int y, m;
printf("년도를 입력해 주세요 : ");
scanf("%d", &y);
printf("월(1~12)을 입력해 주세요 : ");
scanf("%d", &m);
마지막으로 조건문을 통해 윤년을 고려할수 있게 하였고,
화면에 출력할수 있도록 pritnf함수를 사용하였습니다
if (y % 4 == 0 && m==2) //윤년계산은 4의 배수의 해로 하였습니다.
printf("\n %d년 %d월의 말일은 29일 입니다.", y, m); //윤년일경우
else printf("\n %d년 %d월의 말일은 %d일 입니다.", y, m, month[m - 1]); //평년일경우
만약 년도를 입력받은 변수 y의 값을 4로 나눈 나머지가 0인해, 즉 윤년이며
월을 입력받은 변수 m의 값이 2라면, 즉 윤년의 윤달인 2월이라면
출력문을 해당년도의 2월의 말일은 29일이라 출력하였고.
이가 아닌 경우, 윤년의 다른 월들과, 평년의 월들의 말일값은 앞서 선언해 두었던 배열 month에 저장되어있는 값을 출력하는 형식으로 코딩을 마무리 하였습니다.
전체 코드)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
int y, m;
printf("년도를 입력해 주세요 : ");
scanf("%d", &y);
printf("월(1~12)을 입력해 주세요 : ");
scanf("%d", &m);
if (y % 4 == 0 && m==2) //윤년계산은 4의 배수의 해로 하였습니다.
printf("\n %d년 %d월의 말일은 29일 입니다.", y, m); //윤년일경우
else printf("\n %d년 %d월의 말일은 %d일 입니다.", y, m, month[m - 1]); //평년일경우
return 0;
}
결과 콘솔)
'Language > C' 카테고리의 다른 글
C - 전위 연산 & 후위 연산 (0) | 2021.01.27 |
---|---|
C - Pointer & Array, 포인터와 배열 (0) | 2021.01.27 |
C - Exchange of integer variable, 변수의 교환 (0) | 2021.01.27 |
C - Basic(scanf, printf, if, else if), 기본함수 (0) | 2021.01.27 |
C - intro (0) | 2021.01.27 |