기초 다지기 135 : 반복제어문2 - 형성평가6
*완전!!!! 기초부터 혼자 공부하면서 기록하기 위해 쓰는 글입니다. 부족한 부분이 많습니다. 혹시 가르쳐주실 부분이 있으시면 댓글 언제든지 환영합니다 :D
참고로, 이클립스를 사용했습니다!
문제:
두 개의 정수를 입력받아 두 정수 사이(두 정수를 포함)에 3의 배수이거나 5의 배수인 수들의 합과 평균을 출력하는 프로그램을 작성하시오.
(평균은 반올림하여 소수 첫째자리까지 출력한다.)
일단 데이터값을 입력받기 위해서는
import java.util.Scanner; ☞ Scanner를 import해주고,
Scanner sc=new Scanner(System.in); ☞ Scanner 객체를 생성해줘야 합니다.
int a=sc.nextInt();
int b=sc.nextInt();
☞그 다음엔 두 개의 정수를 입력받을 수 있도록 int형 변수 a와 b를 설정해둡니다.
int sum=0;
int cnt=0;
float avg=0;
☞ 필요한 변수들을 생성한 후 초기화시켜줍니다.
sum 변수는 합계를 저장해줄겁니다. 계속 입력받은 변수를 더해서 저장해놔야겠죠?
일단 cnt는 현재 입력된 변수가 몇개인지 세는 역할을 할 겁니다. 그래야 합계를 총 개수로 나눌 수 있으니까요!
avg 변수는 누가 봐도 평균함수일 겁니다 ㅎ.ㅎ... 소수까지 저장시켜줘야 하므로 float형 실수형 변수로 만들어줬습니다.
즉, avg 변수에는 sum/cnt를 한 값이 들어가겠죵?
cnt변수와 sum변수에는 정수가 들어갈 것이기 때문에 int형 변수로 지정해줬답니다
int min=(a<b)?a:b;
int max=(a<b)?b:a;
☞ int형 변수인 min과 max를 만들어줘서 그 안에 최소값과 최대값을 넣어주는 작업을 할 건데요
이런 작업을 하는 이유는 우리가 입력하는 두 정수 중 앞에 있는 값이 더 클지 뒤에 있는 값이 더 클지 모르기 때문에 최소값과 최대값을 딱 정해주고 for 문을 돌리기 위한거죠!
이렇게 생긴 걸 삼항연산자라고 하는데요, 괄호 안에 있는 조건이 참이라면 앞에 있는 값을 min에 집어넣고, 거짓이라면 뒤에 있는 값을 min에 집어넣는 겁니다.
첫 문장을 if문으로 표현하면 아마
if(a<b){
int min=a;
}else{
int min=b; }
이런 코드가 되었을 거에요... 그것을 한문장으로 간단하게 표현하는 magic!
코드는 간결하고 이해하기 쉬울수록 좋으니까요!
만약 a가 더 작다면 min=a가 되고, b가 더 작다면 min은 b가 되겠죠?
max도 마찬가지로 a가 더 크다면 max=a, b가 더 크다면 max=b가 됩니다.
for(int i=min;i<=max;i++){
☞ for문은 while문과 같은 반복제어문 중 하나로 기본 구조는 for(초기값; 조건식; 증감식) 입니다
초기값 부분에는 for문을 입력값 중 작은 수부터 시작해야 하므로 int형 변수 i를 만들어주고 min으로 설정해줍니다.
두번째 부분인 조건식에는 반복문이 실행될 조건을 넣어줍니다. 이 조건식이 참일때만 반복문이 실행됩니다.
저는 min에서 max까지 반복문을 실행시킬 것이기 때문에 i가 max 이하라는 조건식을 넣어줍니다.
마지막 증감식 부분에는 반복문이 계속 돌아가는 무한루프를 벗어나기 위해 i의 값을 변경시켜주는 증감식을 넣어줍니다.
i++는 i=i+1과 같은 의미입니다.
if(i%3==0||i%5==0){
☞ 이처럼 ()안의 조건을 만족할 때 {} 안의 문장을 실행하는 if문을 조건문이라고 합니다.
% 연산자는 a를 b로 나눴을 때 몫을 제외한 나머지 값만 돌려줍니다.
예를 들어 5%3을 출력해보시면 나머지값인 2가 출력됩니다.
i를 3으로 나눴을 때 나머지가 0인건 i가 3의 배수, 5로 나눴을 때 나머지가 0인건 i가 5의 배수라는 걸 뜻합니다.
둘 중 하나를 만족한다면 합과 평균을 출력해줘야 하기 때문에 ||연산자를 사용해줍니다.
|| 연산자는 둘 중 하나만 참이어도 조건이 만족됩니다. | 를 쓸때는 Shift+\ 표시를 누르시면 된답니다!
sum+=i;
☞ sum은 합계를 구하는 함수이기 때문에 입력받은 i변수를 계속 더해줍니다.
sum+=i 는 sum=sum+i 와 같은 문장입니다.
cnt++;
☞ cnt 변수의 개수도 조건을 만족할때마다 1씩 늘려줍니다.
그래야 cnt에 조건을 만족하는 수의 총개수가 저장되어서 sum을 나눠줄수 있겠죠?
avg=(float)sum/(float)cnt;
☞ avg 함수에 평균을 구해서 저장해야 하므로 sum/cnt를 한 값을 저장해줍니다.
여기서 주의해야 할 점은 현재 sum 변수와 cnt 변수는 int형으로 지정이 되어있기 때문에 그냥 sum/cnt로 계산을 하면 계산결과도 int형으로 나옵니다.
우리는 소수점 첫째 자리까지 출력해야 하므로 sum값고 cnt값도 모두 실수형인 float형으로 바꿔줍니다.
저렇게 앞에 (float)를 붙여서 다른 형으로 형변환을 하는 것을 casting(캐스팅)이라고 합니다.
System.out.println("sum : "+sum);
☞ for문 밖에 println 출력문을 써서 sum 변수를 출력해줍니다.
println 출력문은 그냥 print문과는 달리 출력 후 자동으로 한줄을 바꿔줍니다. 그래서 line의 뜻인 ln이 뒤에 붙는거죠
System.out.printf("%.1f",avg);
☞ 그 밑엔 printf 출력문을 써서 avg 변수를 출력해줍니다.
printf 출력문은 %d, %f, %s 와 같은 서식을 써서 변수를 넣기 용이하게 만들어져 있는 출력문입니다.
소수 첫째자리까지 출력하고 싶을 때는 "%.1f"를 쓰고 , 뒤에 넣고 싶은 변수명을 써주시면 됩니다.
avg를 소수첫째자리까지 반올림하고 싶으므로 ("%.1f",avg)를 넣어줬습니다.
어디 한번 실행을 해보겠습니다.
☞ 10 15 라는 두개의 정수를 입력해봤습니다.
그러면 for문이 min값인 10부터 max값인 15까지 실행이 될겁니다
10부터 15까지 돌아가면서 3의 배수인 12, 15와 5의 배수인 10, 15가 조건을 만족합니다.
즉 10, 12, 15 세 숫자를 가지고 합과 평균을 구하겠네요
cnt에는 3이 저장되어 있을거고 sum은 10+12+15=37입니다.
그 후엔 37/3을 계산한 후 소수 첫째자리까지 반올림한 12.3이 avg 값이 되어 저장이 됩니다.
이렇게 이번 문제도 무난하게 클리어했답니다 후후