배열 1
아래 모든 문제에 적용되는 지시 사항
- 클래스 선언문 바로 위에 그 클래스에 대한 설명을 주석으로 넣으시오.
- main 함수 외의 함수에도 주석을 넣으시오.
- 주석의 첫 부분은 /** 로 시작하고 끝 부분은 */로 마칩니다.
- 주석을 적어 넣지 않거나 들여쓰기를 하지 않으면 감점합니다.
P1
키보드로부터 10개의 정수를 차례로 읽어 배열에 저장한 후 나중 것부터 처음 것까지 차례로 출력하는 프로그램을 작성하시오. 클래스 이름은 Reverse로 지으시오.
실행 예는 아래와 같습니다.
P2
키보드로부터 정수들을 차례로 읽어 배열에 저장한 후 이들을 순서를 바꾸어 차례로 출력하고, 그 정수들의 평균값을 출력하는 프로그램을 작성하시오. 사용자가 q, 혹은 Q를 입력하면 입력을 끝내고 출력이 나타나게 하시오. 클래스 이름은 ReverseQ로 지으시오. 입력 가능한 정수 갯수는 100개로 하시오. (배열의 크기를 100으로 하라는 말입니다.)
실행 예는 아래와 같습니다.
[힌트]
- 입력으로 정수가 들어오기도 하고 “q” 혹은 “Q”와 같은 문자열이 들어오기도 하므로, Scanner를 이용하여 키보드 입력을 읽을 때 정수와 문자열 두 가지를 모두 읽을 수 있는 메소드를 사용해야 한다. Scanner의 nextInt() 메소드는 정수만 읽을 수 있다. nextInt() 메소드가 대기 중일 때 키보드로 정수가 아닌 문자열을 입력하면 실행 중 에러가 발생한다. Scanner의 next() 메소드가 대기 중일 때 키보드로 정수를 입력하면 정수가 문자열로 읽힌다(가령 “56”). 키보드로 문자열을 입력하면 물론 그 문자열이 제대로 읽힌다.
- 강의자료 47~49쪽을 참고한다.
- 배열은 int 타입으로 만든다.
- 아래 블록을 반복한다.
{
키보드로부터 단어를 하나 입력 받아 String 타입 변수에 일단 저장한다. 단어를 하나 입력받으려면 Scanner 객체에게 next() 메소드를 호출한다.
입력된 단어가 “q”나 “Q”이면
입력을 마친다.
그렇지 않으면
입력된 단어를 int 타입으로 바꾸어 배열의 적당한 방에 저장하고 누적합을 계산한다.
}
위 과정이 끝나고 나면 배열에 있는 수들을 역순으로 출력하고, 평균값을 계산하여 출력한다.
P3 (데이터 파일로부터의 입력)
위 P1번 문제는 키보드로부터 10개의 정수를 차례로 읽어 배열에 저장한 후 이들을 순서를 바꾸어 차례로 출력하는 프로그램이었습니다. 이 문제에서는 정수를 키보드로부터 읽는 대신 데이터파일로부터 읽도록 합니다. 데이터파일의 이름은 integers.txt로 짓고, 클래스 이름은 FileInput으로 지으시오.
데이터 파일인 integers.txt에 들어 있는 내용
프로그램 실행 결과
프로그램 뼈대
(아래 그림에서 프로젝트 이름, 클래스 이름, 패키지 이름, 경로명 등은 이 문제와 다를 수 있습니다.)
파일에서 데이터를 읽어 들이므로 사용자에게 입력을 시작하도록 안내하는 프롬프트(prompt)를 출력할 필요가 없습니다.
eclipse에서 데이터 파일 만드는 절차
프로젝트 디렉토리가 작업 디렉토리(working directory)이다. 애플리케이션 프로그램이 실행될 때 프로젝트 디렉토리에서 실행된다는 말이다. 프로그램이 어떤 데이터 파일을 찾을 때 일단 프로그램이 돌고 있는 작업 디렉토리에서 그 데이터 파일을 찾는다. 이곳에 데이터 파일을 만들어 놓으면, 디렉토리 지정 없이 파일 이름(integers.txt)만으로 간단히 파일을 읽을 수 있다.
프로젝트 이름을 오른쪽 버튼으로 클릭
New - File
파일 이름 입력 - Finish
파일 편집 (데이터 입력)
입력이 끝나면 control-s 를 눌러 저장.
프로젝트 이름을 한 번 클릭하여 선택한 후 새로고침(F5)하면 프로젝트 디렉토리에 새로 만든 파일이 보인다.
윈도탐색기에서도 새로 만들어진 파일을 확인할 수 있다.
완료!
아래와 같이 임의의 위치에 있는 파일을 읽을 수도 있다. 파일의 위치를 포함한 긴 파일 이름을 경로명(pathname)이라고 한다.
윈도에서는 경로명을 표현할 때 디렉토리 이름 사이 사이에 백슬래쉬() 문자를 사용한다. 백슬래쉬 문자는 한글 자판에서는 ‘\’ 문자가 인쇄된 키를 눌러 입력한다.
자바 프로그램에서는 디렉토리 이름 사이에 슬래쉬(/)를 사용해도 된다. 그러면 컴파일러가 알아서 컴퓨터 운영체제에서 사용하는 문자()로 변환해준다.
아래 그림의 빨간 네모 부분과 같이 윈도 경로명 표기법을 그대로 써도 된다. 단, ‘\’ 기호를 두 개 써야 한다.
자바 프로그램 내에서 ‘\’ 한 개는 escape 문자로서 특수 문자를 표현하는 데 사용되기 때문이다. (‘\t’는 tab으로, ‘\n’ 은 new line 문자로 인식된다.) ‘\’ 라고 적어야 백슬래쉬() 문자 하나로 인식된다.
P4 (데이터 파일로의 출력)
위 p3번 문제는 정수들의 순서를 바꾸어 화면에 출력하였습니다. 이 문제에서는 정수들을 파일에 출력하도록 합니다. 파일에 데이터를 쓰는 방법은 강의자료 30쪽에 설명되어 있습니다. 클래스 이름은 FileInFileOut으로 짓고, 입력 데이터 파일은 integers.txt를 그대로 사용하고, 출력 데이터 파일의 이름은 reversedIntegers.txt로 지으시오.
이 프로그램을 실행하면 콘솔 화면에 아무 것도 보이지 않습니다. 프로그램은 조용히 파일로부터 데이터를 읽어 들이고 다른 파일에 데이터를 쓰기 때문입니다.
프로그램 실행 결과로 reversedIntegers.txt 파일이 프로젝트 디렉토리에 만들어집니다. 그러나 이 파일이 저절로 화면에 보이지는 않습니다. eclipse 왼쪽 화면의 패키지 익스플로러(package explorer)의 프로젝트 이름을 클릭하여 선택한 후 F5키를 눌러 “새로고침”을 해야 보이게 됩니다.
파일로 데이터를 모두 내보내고 나서는 파일을 닫아주어야 합니다. 즉, output.close() 문장을 실행해 주어야 합니다. 파일로 어떤 데이터를 print하면 그 데이터가 바로 파일에 기록되는 것이 아닙니다. 컴퓨터 운영체제는 효율을 위해 파일에 기록할 데이터를 일단 출력 버퍼(일종을 임시 메모리)에 저장해 둡니다. 이 데이터가 어느 정도 쌓이면 이들을 한꺼번에 물리적인 매체(가령 하드디스크)의 파일에 내보냅니다. output.close()를 호출하면 그때까지 버퍼에 모아두었던 데이터를 파일로 내보낸 후 파일을 닫습니다. output.close()를 생략하고 그냥 main 메소드를 끝내면 버퍼에 모아두었던 데이터를 미처 물리적인 파일로 내보내지 못하고 프로그램이 종료되는 수가 있습니다.
P5
integers.txt 파일로부터 정수 10개를 읽어 배열에 채운 후 아래와 같은 순서로 배열의 앞에 있는 원소들의 합을 차례로 구해 화면에 출력하는 프로그램을 작성하시오. 클래스 이름은 ListSum으로 지으시오.
a[0]
a[0] + a[1]
a[0] + a[1] + a[2]
a[0] + a[1] + a[2] + a[3]
...
a[0] + a[1] + a[2] + a[3] + ... + a[9]
프로그램 실행 결과
P6
크기가 20인 int 타입 배열을 0 이상 10 미만 정수 난수로 채운 후 배열의 각 원소를 차례로 출력하는 프로그램을 작성하시오. 클래스 이름은 RandomNumbers로 지으시오.
실행 결과
P7
아래와 같이 작동하는 프로그램을 작성하시오. 클래스 이름은 RandomNumbers2로 지으시오.
-
크기가 10인 int 타입 배열에 0 이상 100 미만 정수 난수를 채워 넣는다.
-
배열의 각 원소를 차례로 출력한다.
-
배열의 원소들 중 가장 큰 원소, 가장 작은 원소를 찾아 출력한다.
-
배열의 원소들의 평균을 구해 출력한다.
실행 결과 예시
프로그램 뼈대
[힌트]
최대값을 구하려면 우선 max에 가장 작은 수인 0을 넣는다.
만약, 첫 수가 max보다 크다면 max에 첫 수를 넣는다.
만약, 둘째 수가 max보다 크다면 max에 둘째 수를 넣는다.
. . .
끝 수까지 위 과정을 수행하면 최종적으로 가장 큰 수가 max에 들어 있게 된다.
P8 (참조변수를 파라미터로 갖는 메소드)
아래와 같이 작동하는 프로그램을 작성하시오. 클래스 이름은 ArrayAdd로 지으시오.
- 크기가 10인 int 타입 배열을 세 개 만든다.
- 두 배열에 0 이상 10 미만 정수 난수를 채운다.
- 두 배열을 합하여 그 결과를 세 번째 배열에 저장한다. (두 배열의 0번 방의 숫자를 더하여 세 번째 배열의 0번 방에 넣고, 두 배열의 1번 방의 숫자를 더하여 세 번째 배열의 1번 방에 넣는 등의 조작을 한다는 의미입니다.)
- 세 배열을 출력한다.
배열을 출력하는 메소드를 작성하고 배열을 출력할 때 이 메소드를 이용하도록 하시오.
실행화면 예
P9 (StringBuilder)
강의지료 끝 부분에 StringBuilder를 사용하는 예가 있습니다. 이 예를 참고하여 아래와 같이 작동하는 프로그램을 작성하시오.
-
“여름” 문자열을 10,000개 이어 붙여 길다란 문자열을 만든다.
-
한 번은 String을 더하는 방식으로 만들고, 또 한 번은 StringBuilder를 사용하여 만든다.
-
각 방식으로 긴 문자열을 만드는 데 걸리는 시간을 각각 측정하고 측정된 시간 두 개를 출력한다.
클래스 이름은 StringBuilderTest로 지으시오.
출력 예는 아래와 같습니다.
끝.