728x90

1.ex01)

package days08;

import java.util.Scanner;

/**
 * @author kim
 * @date 2023. 2. 6.-오전 11:39:11
 * @subject 
 * @content 1.다시 게임 할껀지?(y/n)
 * 				ㄴ반복처리해야할 부분이 어디인지 찾아야 함
 * 			2.입력값에 대한 유효성 검사
 *
 */
public class Ex01 {

	//[시험 1] 5분
	public static void main(String[] args) {				//days07-Ex06.java
		Scanner scanner = new Scanner(System.in);
		char con;
		int com, user;
		
		do {
			com = (int)((Math.random())*3+1);
			
			String regex="[1-3]";
			String sUser;
			
			boolean flag=false;
			do {
				System.out.print(">user 가위(1), 바위(2), 보(3) 선택??"); //a
				sUser=scanner.next();
				flag=sUser.matches(regex);				
			} while (!flag);	//flag==false
						
			user=Integer.parseInt(sUser);
			System.out.printf("com=%d, user=%d\n",com, user);
			switch (user-com) {
			case 0:
				System.out.println("무승부");
				break;
			case 1: case -2:
				System.out.println("사용자 승리");
				break;
			case -1: case 2:
				System.out.println("컴퓨터 승리");
				break;
			}//switch
		
			
			//다시 게임할꺼니? y/n			y를 입력했을 때 다시 게임 처리...반복 for/while/[do while]
			//무조건 게임을 한번은 해야 하니까 do while문을 사용
			System.out.print("\n\t다시 게임 할꺼니?");
			con=scanner.next().charAt(0); //"y"->'y'
			
			//con cannot be resolved to a variable
		} while (con=='y' || con=='Y');
		

		
		System.out.println("게임종료!!");

	}//main

}//class

 

2.ex01_02)

package days08;

import java.util.Scanner;

public class Ex01_02 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.print(">user 가위(1), 바위(2), 보(3) 선택??");
		
		//scanner.nextInt() <- "a" 오류발생
		//scanner.nextInt() <- 	4 오류는 나지 x, 결과 컴퓨터 승리
		String input=scanner.next();
		//입력받은 문자열 속에 숫자가 아닌 문자가 있는지 체크...
		//input.length()==1 문자열 길이가 1이상이면 안됨!왜냐면 1~3까지 1자리수니까
		boolean flag=false;
		if(input.length()==1) {
			char ch = input.charAt(0);
			if('0'<=ch && ch<='3') {
				flag=true;
			}
		}//길이if
		if (flag) {
			System.out.println("유효한 입력값 O");
		} else {
			System.out.println("유효한 입력값 X");
		}
	}//main

}//class

 

3.ex01_03)

package days08;
import java.util.Scanner;

/**
 * @author kim
 * @date 2023. 2. 6.-오후 12:18:24
 * @subject	정규표현식(Regular Expression) 사용
 * @content					regex
 */
public class Ex01_03 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.print(">user 가위(1), 바위(2), 보(3) 선택??");// 1~3 정수
		String input=scanner.next();
		
		//String클래스 안에 matches(regex) 함수
		//1.					일치하니 물어보는 함수
		//2.					regex		1~3 정수인지 체크하는 정규표현식
		//3.					boolean
		
		//String regex="[abc]"; //a||b||c문자가 들어오면, input.matches(regex);참이 된다.
		//String regex="[^abc]"; //a,b,를 제어한 모든 문자가 참 [^]는 아니다라는 기호임
		//String regex="[123]";	//1, 2, 3만 참 12, 13, 123은 거짓!무조건 하나씩만 계산
		String regex="[1-3]";	//[xx-xx] -부터 까지의 의미 [0123456789]==[0-9]
		
		boolean flag = input.matches(regex);
		System.out.println(flag);
		
		
		
	}//main

}//class

 

4.ex02)

package days08;

import java.util.Scanner;

public class Ex02 {

	public static void main(String[] args) {
		//[문제]정규표현식(String.matches() 사용)
		//등급을 나타내는 한 문자를 입력받아서 수, 우, 미, 양, 가일 경우에는
		//올바른 입력, 잘못된 입력일 경우 do~while문을 사용해서 다시 등급을 입력받도록...
		Scanner scanner = new Scanner(System.in);
		System.out.print(">(수,우,미,양,가)등급은??"); 
		String grade = scanner.next();
		
		//if(grade.equals("수")||grade.equals("우")||grade.equals("미")||grade.equals("양")||grade.equals("가")
		//char grade = scanner.next().charAt();
		//if(grade=='수'||grade=='우'||grade=='미'||grade=='양'||grade=='가'
		
		
		String regex="[수우미양가]";
		System.out.println(grade.matches(regex) );

		


	} //main

}//class

 

5.ex02_02)

package days08;

/**
 * @author kim
 * @date 2023. 2. 6.-오후 12:52:26
 * @subject 정규표현식 예제
 * @content 
 *
 */
public class Ex02_02 {

	public static void main(String[] args) {
		// 주민등록번호를 입력
		//000000-0000000 총 14자리
		//String rrn = "123456-1234567";
		
		// \\d=[0-9]
		//String regex="[0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]";
		//Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ )
		//String regex="\\d\\d\\d\\d\\d\\d-\\d\\d\\d\\d\\d\\d\\d";

		//X? 0,1
		//X* 0~여러번
		//X+ 1~여러번
		//X{n} 정확히 n번
		//X{n,} 적어도 n번
		//X{n,m} n~m번
		
		//String regex = "\\d{6}-\\d{7}"
		//System.out.println(rrn.matches(regex) );
		
		//[문제] 우편번호Zip-code 000-000 || 00000
		//String regex = "\\d{3}-\\d{3}|\\d{5}"; //x|y regex에서 또는으로 쓰임
		//System.out.println("123-123".matches(regex) );	//true
		//System.out.println("12345".matches(regex) );	//true
		//System.out.println("12a45".matches(regex) );	//false
		//System.out.println("123-a45".matches(regex) );	//false
		//System.out.println("123-3455".matches(regex) );	//false
		
		//[문제]국어 점수(0<= <=100)의 유효성 검사를 정규표현식을 사용해서 처리
		//String regex="\\d{1,3}";//숫자 1자리에서 3자리 까지는 참이다.	//1~999
		//String regex="\\d{1,2}|100"; ->01도 true로 나옴
		String regex="[1-9]?\\d|100";	//첫번째는 1-9까지 무조건 와야 되고, \\d에는 0-9, 100은 100만
		System.out.println("100".matches(regex) );
		System.out.println("01".matches(regex) );
		System.out.println("99".matches(regex) );
		System.out.println("1a".matches(regex) );
		System.out.println("101".matches(regex) );
		System.out.println("-10".matches(regex) );
		
		//[과제] 팀장 제출바람
		//회원가입
		//아이디:[     ][아이디 중복체크 버튼]
		//비밀번호:[			]	5~15, 대문자 1개 이상, 소문자 1개 이상, 숫자 1개 이상, 특수문자(#!@&)1개 이상
		
		

	}//main

}//class

 

6.ex03)

package days08;
/**
 * @author kim
 * @date 2023. 2. 6.-오후 2:36:32
 * @subject	메서드(함수) 설명
 * @content
 *
 */
public class Ex03 {

	public static void main(String[] args) {
		/*	
		 1.메서드(함수) 정의? 프로그래밍에서 [반복되는 명령어들]을 찾아서 별도로 묶어서
		 					  필요할 때 마다 불러서 사용할 수 있도록 한 것.
		 2.프로그램의 구조화(간단해진다)->유지보수가 편리
		 3.반복되는 코딩 -> 구조화(재사용) 코딩
		 4.함수가 기본이 되는 프로그래밍 방식:구조적 프로그래밍 언어->C언어
		 5.객체가 기본이 되는 프로그래밍 방식:객체 지향적 프로그래밍 언어->Java, 대부분의 언어
		 									  oop
		 6.함수의 선언 형식
		 	   수정자(modifier)
		   [접근제어자][기타제어자] 리턴자료형 함수명([매개변수...]) --->함수원형==함수 프로토타입
		   {					--->{}부분을 함수 몸체{} 구현부
		   			[return 리턴값;]
		   }
		 7.함수 3가지 이해
		   1)기능
		   2)매개변수
		   3)리턴값(리턴자료형)
		   
		 8.ex) Ex03_02.java
		   
		 */

	}//main

}//class

 

7.ex03_02)

package days08;

public class Ex03_02 {

	public static void main(String[] args) {
		//함수를 선언하면 호출하는 부분이 무조건 있어야 한다.
		drawLine(); //함수 호출부
		System.out.println("부서명 : 사원명 ");
		drawLine(30);
		System.out.println("영업부:이태규");
		System.out.println("총무부:신희민");
		System.out.println("생산부:박현주");
		System.out.println("기획부:김예지");
		System.out.println("기획부:하동호");
		drawLine(15, '$');


	}//main

	//반드시 함수(메서드) 선언할 때는 클래스 안에 다른 함수 밖에...코딩해야함!!
	//함수를 만들어 보기 함수의 이름을 drawLine으로 지정, 매개변수와 리턴값은 없다로 하겠음
	//1)기능:라인(선)을 긋는 함수	drawLine
	//2)매개변수:x
	//3)리턴값:x리턴자료형  --->리턴자료형 void
	public static void drawLine() 
	{					
		System.out.println("---------------");//line 선 긋는 코딩(50줄 코딩)
	}

	//1)기능:라인(선)을 긋는 함수	drawLine
	//2)매개변수:x
	//3)리턴값:x리턴자료형  --->리턴자료형 void
	
	//매개변수의 타입 또는 갯수가 다른 동일한 함수를 중복선언할 수 있다.
	//중복함수(Overloading) 오버로딩
	//function Overloading
	//Duplicate method drawLine() in type Ex03_02(함수명을 중복사용했습니다.)
	public static void drawLine(int n) //함수 선언부
	{					
		for(int i=1; i<=n; i++){	//line 선 긋는 코딩(50줄 코딩)
			System.out.print("-");
		}
		System.out.println();
	}
	
	//내가 원하는 스타일로 원하는 길이 만큼 선을 그을 수 있는 함수
	public static void drawLine(int n, char style) //함수 선언부
	{					
		for(int i=1; i<=n; i++){	
			System.out.print(style);
		}
		System.out.println();
	}

}//class

 

8.ex03_03)

package days08;

import java.util.Scanner;

public class Ex03_03 {

	public static void main(String[] args) {
		int x, y;
		Scanner scanner=new Scanner(System.in);
		
		System.out.print(">두 정수 x, y 입력?");
		
		x=scanner.nextInt();
		y=scanner.nextInt();
		
		//두 정수의 합을 처리해서 출력...
		//int z=x+y;
		int z=sum(x, y);
		
		System.out.printf("%d +%d = %d\n", x, y, z);

	}//main
	//함수 선언
	//1.기능:두 정수의 합을 구해서 반환하는 함수
	//2.매개변수:두 정수 	  int, int
	//3.리턴값:합, 리턴자료형 int
	public static int sum(int x, int y) {
		//int result = x+y;
		//return result;
		
		return x+y; //리턴문 수식을 사용할 수 있다.
	}
}//class

 

9.ex03_04)

package days08;

import java.util.Scanner;

public class Ex03_04 {

	public static void main(String[] args) {
		//국어, 영어, 수학	->총점, 평균	->출력
		//각각의 점수를 입력받아서 유효성 검사(0~100)을 마친 후->
		// 반환하는 getScore()함수 선언->호출
		
		int kor, eng, math;
		
		kor=getScore("국어");	//String 과목명을 집어넣으면
		eng=getScore("영어");
		math=getScore("수학");
		
		int tot=kor+eng+math;
		double avg=(double)tot/3;
		
		//출력함수
		printScore(kor,eng,math,tot,avg);

	}//main

	private static void printScore(int kor, int eng, int math, int tot, double avg) {
		System.out.printf("kor=%d, eng=%d, math=%d, tot=%d, avg=%.2f\n", 
				kor, eng, math, tot, avg);
		
	}

	private static int getScore(String subject) {	//매개변수 String값이 필요하다
		Scanner scanner = new Scanner(System.in);

		String score;
		String scoreRegex="[1-9]?\\d|100";
		
		do {
			System.out.print(subject+"점수를 입력하세요:");
			score = scanner.next();
		} while (!score.matches(scoreRegex));
		
		return Integer.parseInt(score);
	}

}//class

 

10.ex04)

package days08;

import java.util.Scanner;

/**
 * @author kimjieun
 * @date 2023. 2. 6.-오후 3:51:11
 * @subject	함수 선언 연습 -> 함수 호출 사용
 * @content
 *
 */
public class Ex04 {

	public static void main(String[] args) {
		// 연도를 입력받아서 윤년/평년을 체크해서 출력
		/*
		 1.년도를 입력받아서 반환하는 함수 만들기
		 2.윤년? 오차를 보정하기 위해 삽입하는 날이나 주, 달이 들어가는 해
		 		 ㄴ삽입하는 달을 정하는 방법을 치윤법
		 		 why? 오차가 생기고->생기는 오차에 따라서 치윤법(오차보정)을 하는가?
		 		 윤년:한국법=그레고리력?현 인류사회에서 가장 널리 쓰이기에
		 		 (윤년=2월 29일)이 있는 해
		 		 2월 28X->29일까지 있는 해를 윤년.
		 		 
		 		 [그레고리력]-오차보정 2월 29일 이해
		   평년?
		   
		   지구 자전주기와 공전주기 맞지 않다(자연현상)
		   공전주기(1년) 365.2422일	0.25
		   공전주기(1년) 365.2422일	0.25
		   공전주기(1년) 365.2422일	0.25
		   공전주기(1년) 365.2422일	4년 마다 1루의 오차가 발생 + 4년 마다 2월 29일로 처리하는 달력(율리우스력)
		   
		   1년 365.2425일 [오차 0.003일] 보정
		   설명) 400년 97번의 윤년이 발생한다. 				2월 29일
		   400년 동안 4의 배수년도 		100=>윤년			+3년
		   			  100의 배수년도	4번=>평년			 1년
		   			  400의 배수년도	1번=>윤년			 
		   [치운법]			  
		   1.서력 기원 연수가 4로 나누어 떨어지는 해는 우선 윤년이라고 하고,
		   2.그 중에서 100으로 나누어 떨어지는 해는 평년으로 하며,
		   3.다만 400으로 나누어 떨어지는 해는 다시 윤년으로 정하였다.
		   년도를 매개변수 윤녕/평년을 반환하는 함수
		 3.출력
		 */
		int year=getYear();
		//함수
		//1.기능:윤년, 평년인지 체크해주는 함수 isLeapYear()
		//2.매개변수: 체크할 년도 int year;
		//3.리턴값: 윤년(true), 평년(False) 리턴 자료형 boolean
		boolean cheak=isLeapYear(year);
		if (cheak) {
			System.out.println("윤년(leap year)");
		}else {
			System.out.println("평년(common year)");
		}
		/*
		if (isLeapYear(year)) {
			System.out.println("윤년(leap year)");
		}else {
			System.out.println("평년(common year)");
		}
		*/

	}//main

	public static boolean isLeapYear(int year) {
		/*
		 * [치운법]			  
		   1.서력 기원 연수가 4로 나누어 떨어지는 해는 우선 윤년이라고 하고,year%4==0
		   2.그 중에서 100으로 나누어 떨어지는 해는 평년으로 하며,			year%100==0
		   3.다만 400으로 나누어 떨어지는 해는 다시 윤년으로 정하였다.		year%400==0
		   return year%4==0; 율리우스 역
		   &&>||
		 */
		return year%4==0&&year%100!=0||year%400==0;	//그레고리오력
	}

	private static int getYear() {
		Scanner scanner = new Scanner(System.in);

		String year;
		String yearRegex="\\d+";	//	\\d정수를 나타냄, \\d+ 정수가 1자리 이상
		
		do {
			System.out.print("연도를 입력하세요:");
			year = scanner.next();
		} while (!year.matches(yearRegex));
		
		return Integer.parseInt(year);
	}

}//class

 

11.ex04_02)

package days08;

public class Ex04_02 {

	public static void main(String[] args) {
		
		//윤년을 출력하고 싶다.
		for(int i=1500; i<=2023; i++) {
			//재사용
			if(Ex04.isLeapYear(i) ) System.out.print("윤년 - ");
			System.out.println(i);
		}

	}//main

}//class

 

12.ex05)

package days08;
/**
 * @author kimjieun
 * @date 2023. 2. 6.-오후 4:53:14
 * @subject	재귀 호출 함수(recursive call)
 * @content 
 *
 */
public class Ex05 {

	public static void main(String[] args) {
		//재귀[호출]함수? 함수 안에서 자기 자신을 다시 호출하는 함수를 "재귀 [호출] 함수"
		disp(); //함수호출부분
		
		//재귀 함수를 사용하는 이유? -내일부터...

	}//main
	
	//예외처리 설명할 때 예외(exception), error(에러) 차이점
	//~			  [Exception]
	//StackOverflowError
	//스택
	//1.기능 2.매개변수 3.리턴값
	public static void disp() {	//함수 선언 부분
		System.out.println("disp()메서드 호출됨...");
		
		disp(); //함수 호출 부분
	}

}//class

 

13.test01)

package days08;

public class Test01 {

	public static void main(String[] args) {
		for (int i = 1; i<=3; i++) {
			for (int j = 1; j <=3-i; j++) {
				System.out.print("_");
			}
			for (int j = 1; j <= 2*i-1; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}

}

 

14.test02)

package days08;

import java.io.IOException;

/**
 * @author kim
 * @date 2023. 2. 6.-오전 10:09:48
 * @subject
 * @content 5라인을 출력한 후 엔터를 치면 다음 5라인 출력
 * 			1)5라인이 출력되었는지 체크 할 수 있다. -lineNumber
 * 			2)for문이 더 이상 반복되지 않고 멈춰야 한다.-방법?
 * 			System.in.read(), scanner.next(), br readLine()
 *
 */
public class Test02 {

	public static void main(String[] args) throws IOException {
		int lineNumber=1;
		for(int i=0; i<256; i++) {
			if(i%15==0) {
				System.out.printf("%d :", lineNumber++); //라인번호 1증가
			}System.out.printf("[%c]", (char)i);
			if(i%15==14) {
				System.out.println(); //개행
				//5라인 출력-일시정지
				//if(i%75==74) {
				if(lineNumber%5==1) { //첫번째만 1~4까지만 출력됨? WHY?~~디버깅 해서 확인ㄱㄱ
					System.out.print("\t 계속하려면 엔터 치세요");
					System.in.read();
					System.in.skip(System.in.available());
				}
			}
		}

	}//main

}//class
/*
 * int lineNumber=1;
		for(int i=0; i<256; i++) {
			if(i%15==0) {
				System.out.printf("%d :", lineNumber); //라인번호 1증가
			}System.out.printf("[%c]", (char)i);
			if(i%15==14) {
				System.out.println(); //개행
				//5라인 출력-일시정지
				//if(i%75==74) {
				if(lineNumber%5==1) { //첫번째만 1~4까지만 출력됨? WHY?~~디버깅 해서 확인ㄱㄱ
					System.out.print("\t 계속하려면 엔터 치세요");
					System.in.read();
					System.in.skip(System.in.available());
				}
				lineNumber++;
			}
		}
*/

 

15.test03)

package days08;

import java.util.Arrays;

public class Test03 {

	public static void main(String[] args) {
		int[] m=new int[20];
		for (int i = 0; i < m.length; i++) {
			m[i]=(int)((Math.random()*146)+5);
		}
		System.out.println(Arrays.toString(m));
		int max, min;
		max=min=m[0];
		
		for(int i=1;i<m.length;i++) {
			if(max<m[i]) max=m[i];
			else if(min>m[i]) min = m[i];
		}
		System.out.printf("max=%d, min=%d\n", max, min);
	}//main

}//class

 

16.test04)

package days08;

public class Test04 {

	public static void main(String[] args) {
		int sum=0; int i=1;
		boolean sw=false;//스위치 변수
		while (i<=10) {
			if(i%2==0) {
				System.out.printf("%d+", i);
				sum-=i;
			} else {
				System.out.printf("%d-", i);
				sum+=i;
			}
			
			i++;
		}//while
		System.out.printf("=%d", sum);
		
	}//main

}//class
/*
int sum=0; int i=1;
boolean sw=false;//스위치 변수
while (i<=10) {
	if(sw) {
		System.out.printf("%d+", i);
		sum-=i;
		sw=false;
	} else {	//sw=false; else문 먼저 수행, 끝나면 sw=true니까 i++해서 if문으로 감
		System.out.printf("%d-", i);
		sum+=i;
		sw=true;
	}
	//sum+=sw?-i:i;
	// sw=!sw;
	i++;
}//while
System.out.printf("=%d", sum); //System.out.printf("\b=%d\n", sum);
*/

 

17.test05)

package days08;

import java.util.Scanner;

public class Test05 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//[과제] 팀장 제출바람
		//회원가입
		//아이디:[     ][아이디 중복체크 버튼] //정규표현식
		//비밀번호:[			]	5~15, 대문자 1개 이상, 소문자 1개 이상, 숫자 1개 이상, 특수문자(#!@&)1개 이상
		//^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{5,15}
		System.out.println("회원가입");
		System.out.println("---------------");
		Scanner scanner = new Scanner(System.in);
		System.out.print(">로그인(아이디):");
		String id=scanner.next();
		System.out.println(id);
		System.out.print(">비밀번호는:");
		String password = scanner.next();
		
		
		String regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{5,15}";
		System.out.println(password.matches(regex) );
	}

}
728x90