본문 바로가기

공부/자바 OOP

5월20일 - 반복문 For + 연습문제

*이클립스 - class생성 시 package도 동시생성 가능 (class에 package 이름 같이 넣어주면 됨 )

반복문

 

명령어 : for, while, do~while

문법 형식 : for ( 시작값 ; 종료값 ; 증감 ) { 조건 }

                      -----------횟수---------  -반복-        

Scope      : 유효범위 / class를 어디까지 쓰겠느냐에 따른 범위설정은 아주 중요함, 데이터간의 교류 설정 정도범위 중요

무한LOOP : 반복이 무한으로 감

break       : 반복문을 빠져나옴

continue   : 반복문을 계속 수행

 

예제 ) for 구문 - 증가에 따른 반복

for ( int a=1; a<=3; a=a+1 ){
	System.out.println(a+"JAVA");
}//for end

-for ()안의 int a설정해준 변수값은 for구문안에서만 사용가능(이것이 scope)

- ->for end 빠져나온 후 System.out.println(a); 실행할 경우 에러남 

-분석 : for ()안의 시작값은 시작할 시에만 보고 종료값의 범위와 증감을 반복하여 종료값 범위에 다달했을 때 탈출

 

변수의 유효범위 (협소한 범위가 우선순위)

- public 역시 유효범위

- local variable   : 지역변수

- global variable : 전역변수

 

예제 ) for 구문 - 감소에 따른 반복

for (int b=3;b>=1; b=b-1){
	System.out.println(b+"SEOUL");
}//for end

 

for 구문안에 if 구문, if 구문안에 for 구문, for 안에 for 충분히 가능함

 

예제 ) for 구문 - 구구단 4단출력

for(int a=1; a<=9; a=a+1){ 
	System.out.println(4+"*"+a+"="+(a*4);
}//for end

요렇게 나옴 ! 귀욤지다 !

 

*a=a+1 의 다른 표현; a++(후계산) ,++a(전계산), a+=1

 

예제 ) for 구문 - 알파벳 출력

for (char ch='A'; ch<='Z'; ch++){
	System.out.println(ch);
}//for end

예제 ) for 구문 - 1~10중에서 3의 배수만 출력

for(int a=1; a<=10;a++){
	if(a%3==0){
		System.out.println(a);
	}//if end
}//for end

for구문안에 if문 사용 가능!

{ } 짝꿍 조심 또 조심하기 , 적을때마다 end 표시해서 헷갈리지 않게 하기!

 

예제 ) for 구문 - 서기1년-서기2019년중에서 윤년만 출력하기

for(int y=1;y<=2019;y++){
	if(y%4==0 && y%100!=0 || y%400==0){
		System.out.println(y);
	}//if end
}//for end

한번 적었던 공식은 웬만하면 다시 쓰지않고 복사해서 쓰기 

 

갯수 - count 변수

누적 - hap 변수

 

예제 ) for 구문 - 1~10 사이 중에서 3의 배수의 갯수를 구하시오

int count = 0;
for(int a=1; a<=10;a++){
	if(a%3==0){
		count=count+1;
	}//if end
}//for end
		
System.out.println(count+"개");

이건 맞는 것, 도출결과 -> 3개

int count = 0;
for(int a=1; a<=10;a++){
	if(a%3==0){
		count=count+1;
		System.out.println(count+"개");
	}//if end
}//for end

만약 System.out.println(count+"개"); 를 if문 밑에 적을 경우, for구문에 걸려 반복되어 나오기 때문에 for구문을 

빠져나온 후 print 해줘야한다.

이럴 경우 도출결과 -> 1개, 2개, 3개

 

예제 ) for 구문 - 1~10 사이 중에서 3의 배수의 합을 구하시오

int hap = 0;
for(int a=1; a<=10;a++){
	if(a%3==0){
		hap=hap+a;
	}//if end
}//for end		

System.out.println(hap);

도출 결과->18

이것 역시, for구문에 걸려 반복되어 나오기 때문에 for구문을 빠져나온 후 print 해줘야한다.

 


 

<연습문제> 

 

문제 1) 서기 1년~서기 2019년 중에서 윤년의 갯수를 구하시오

int leap=0;
for(int y=1;y<=2019;y++){
	if(y%4==0 && y%100!=0 || y%400==0){
		leap=leap+1;			
	}//if end
}//for end
		
System.out.println("윤년의 갯수 : "+leap);

윤년의 공식 다시 적지말고 복붙해서 쓰기 

 

도출 결과-> 윤년의 갯수 : 489

 

 

문제 2) 4팩토리얼값을 구하시오

//내 풀이
int hap=1;
	for(int a=1; a<=4;a++){
		hap=hap*a;
	}//for end		

System.out.println("4!의 값 : "+hap);
		
//선생님 풀이 
long gop=1;
	for (int a=4;a>=1; a--){
		gop=gop*a;
	}//for end
		
System.out.println("4팩토리얼 : "+gop);

도출결과  내풀이      -> 4!의 값 : 24

             선생님풀이 -> 4팩토리얼 : 24

 

도출된 결과의 값은 같지만, 팩토리얼의 의미는 4*3*2*1 임 .

그러므로 a++가 아닌 a--로 해야 맞는 것 조심해야함

팩토리얼 a--

 

반복문 연습문제 

 

문제 1) 1~100중에서 2의 배수이면서 3의 배수의 갯수를 구하시오

int count=0;
for (int a=1;a<=100;a++){
	if(a%6==0){
		++count;
	}//if end
}//for end
		
System.out.println("문제 1) 2의 배수이면서 3의 배수의 갯수 : "+count);

출력결과 :
문제 1) 2의 배수이면서 3의 배수의 갯수 : 16

-> a%2==0 && a%3==0 해도 됨

 

문제 2) 소문자 중에서 모음의 갯수를 구하시오
->모음 a , e , i , o , u

//for구문
int mo=0;
for(char ch='a'; ch<='z';ch++){
	if(ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u'){
		mo++;
	}//if end
}//for end

System.out.println(mo);
	
//switch구문
int mo1=0;
for(char ch='a'; ch<='z';ch++){
    switch(ch){
	  case 'a' :
	  case 'e' :
	  case 'i' :
	  case 'o' :
	  case 'u' : mo1++;
	 }//switch end
}//for end

System.out.println(mo1);

처음엔 문제를 보고 아스키코드 숫자를 연산시켰다. 아주 허무한 생각 ㅋ ㅋ  ㅠ

a 97 e 101 i 105 o 111 u 117 이것의 정렬기준이 무엇인지,, 

이젠 너무 어렵게만 접근말고 단순하게 접근해야겠다

 

선생님의 풀이방식은 매우 간단하고 직접적, for구문으로 직접 모음을 선언하여 갯수를 출력하였고, 

switch구문으로 각 case설정을 해주어 모음 갯수를 출력했다. 눈물남 

 

출력결과 -> 5

 


문제 3) 알파벳을 한줄에 5개씩 출력하시오 

ABCDE

FGHIJ

KLNMO

PQRST

UVWXY

Z

->count변수 5로 나눠,,, 5의 배수인지 count의 응용 5번의 한번씩

->syso(); 아무것도 안쓰면 줄바꾸기

 

내가 푼거 ->개망함

//내가 한거 개망함
int al=0;
		
for(char a='A'; a<='Z';a++ ) {
	if(a%5==0){		
		System.out.println(a);
	}//if end			
	System.out.println();
}//for end

system.out.print 로 선언 후 일렬로 정렬, 5의 배수에서 줄바꿈

int upper=0;
for(char ch='A'; ch<='Z';ch++ ) {
	upper++;
	//System.out.print(upper);
	System.out.print(ch);
	if(upper%5==0){
		System.out.println();
	}//if end
}//for end

분석과정

1) syso(upper)에 주석안달고, if절에 주석달았을 때, 한줄로 출력됨 . 

   이때 우리는 알파벳을 한줄에 5개씩 출력해야하므로 5,10,15에서 끊어야한다. 

   따라서 5의 배수일때, 나눠주면 되는것

2) if절에 주석을 안달았을 때 , upper의 숫자와 5개씩 나눠진 기준으로 보인다.

   5개씩 나눠져 엔터가 쳐진건 syso() 때문, 이것은 엔터를 의미함.

3) syso(upper)에 주석을 달았을때, 결과가 출력되었다. 쁴읭 어렵다

*문제 4, 5 관련성이 있음

문제 4) 1~100중에서 짝수의 합, 홀수의 합을 각각 구하시오

int even=0; //짝수의 합
int odd = 0;  //홀수의 합
		
for(int a=1;a<=100;a++){
	if(a%2==0){
		even=even+a;
	}//if end
	if(a%2==1){
		odd=odd+a;
	}//if end
}//for end
		
System.out.println("문제 4) 짝수의 합 : "+even);
System.out.println("           홀수의 합 : "+odd);

a의 순서대로 출력 시 , 격자로 짝수 홀수로 번갈아가면서 실행

 

 

내가 한 방법은 짝수 홀수 각각 조건식을 적어 주었지만 틀림 else가 없움

쌤이 한건 else를 적으면서 조건하나를 덜 적고 자동으로 짝수가 아닌 수로 나간담

int even=0; //짝수의 합
int odd = 0;  //홀수의 합
		
int a;
for(a=1;a<=100; a++){
	if(a%2==0){
		even=even+a;
	}else{
		odd=odd+a;
	}//if end
}//for end

System.out.println("짝수의 합 : "+even);
System.out.println("홀수의 합 : "+odd);

 

 


문제 5) 다음식의 결과를 구하시오       

           1-2+3-4.....+99-100=?

	int res1=0; //홀수의 합
		int res2=0; //짝수의 합
			
		for(int a=1;a<=100;a=a++){		
			if(a%2==1){
				res1=res1+a;		
			}//if end
		for(int b=-2;b>=-100; b=b--){			
			if(a%2==1){
				res2=res2+b;							
			}//if end
		}//for end				
		}//for end
		
		System.out.println("문제 5) "+ res1);

		

-switch 이론 : 한번씩 번갈아 가면서 수행

boolean형과 비슷 / 짝홀수도 가능 

 

더하기와 빼기를 번갈아가면서 해야하므로 불린형의 true false를 응용해서 사용

a=1 if(false) else{flag=true}

a=2 if(true) else{flag=false}

a=3 if(false) else{flag=true}

...... 격자로 수행 

->그럼 이 문제에 응용했을 땐 if문에 +를, else문에 -를

boolean flag=false;
int hap=0;

for(int a=1; a<=100; a++){
	if(flag){
		hap=hap-a;
		flag=false;
	}else{
		hap=hap+a;
		flag=true;
	}//if end
}//for end
		
System.out.println(hap);

출력 결과-> -50

 

 

 

문제 6) 두 수 사이의 합을 구하시오 

	int start=2, end=5;
		int hap=0;
		
		for(int a=2;a<=5;a++){
			hap=hap+a;
		}//for end
		
		System.out.println("문제 6) 2에서 5사이의 합 : "+hap);

 a=2 b=5, 

변수끼리 맞교환할때 tmp변수(제3변수)꼭 필요 !

swap : 변수값을 서로 교환

//swap 방식
int start=5, end=2;
int sum=0;
		
if(start>end){ //swap
	int tmp=start;
	start=end;
	end=tmp;
}//if end
		
System.out.println(sum);

//for 구문
int start=5, end=2;
int sum=0;

for(int a=start; a<=end; a++){
	sum=sum+a;
}//for end
		
System.out.println(sum);

문제 7) 다음식의 결과를 구하시오

 


break     : 반복문을 빠져나옴

continue : 반복문을 계속 실행

 

예제) break, continue 

for(int a=1; a<10; a++){
	if(a==5){
		break;
	}//if end
	System.out.print(a+" ");
}//for end
		
System.out.println();
		
for(int a=1; a<10; a++){
	if(a==5){
		continue;
	}//if end
	System.out.print(a+" ");
}//for end

출력결과
1 2 3 4 
1 2 3 4 6 7 8 9 

break     - 회전수가 남아있어도 break가 걸리면 나감 ㅋ 

continue - 반복문을 계속 실행 ㅠ continue를 만나면 다시 올라감 , 5일때 continue를 만났으니 밑으로 출력이 안되고 

위에 반복문으로 올라가서 6부터 출력된거임 .