Ruby 프로그래밍 3 Array와 Hash 이용

Slides:



Advertisements
Similar presentations
Ⅰ. 연산자 Ⅱ. 제어 구조. 연산자 : 할당 연산자 - 사용자가 정의한 변수에 임의의 값을 저장하는 기능 strvar = strVar1+ “ Hello ”
Advertisements

제철고 프로그래밍언어 2015 가을학기 강의 #2 Python 변수, 입출력, 배열 박성우 POSTECH 컴퓨터공학과 2015 년 9 월 30 일.
Python Ch.06 RaspberryPi Sejin Oh. Raspberry Pi Python  IDLE(Integrated Development Environment)  라즈베리 파이 배포본들은 일반적으로 파이썬과 파이썬 3 의 IDLE 파 이썬 개발 도구를.
Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
4장 배열과 함수 한빛미디어(주).
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
Ruby Programming Date, scan, 웹 처리 한국어 정보의 전산 처리
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
Ruby 프로그래밍 1 문자열 입출력 제어구조 looping 함수 정의
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Lesson 5. 레퍼런스 데이터형.
테이블 : 데이터베이스를 구성하는 요소로 같은 성격에 정보의 집합체. 레코드 : 하나의 정보를 가지고 있는 컬럼의 집합체
5장. 참조 타입.
Ruby 프로그래밍 한글 로마자화 한국어 정보의 전산 처리
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
Homework #5 (1/3) 다음을 수행한 후, 결과 파일들을 출력하여 제출한다.
2007 1학기 11 프로젝트 기초 실습.
Tail-recursive Function, High-order Function
프로그래밍 랩 – 7주 리스트.
컴퓨터 프로그래밍 실습 #6 제 4 장 클래스 작성.
11장. 1차원 배열.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
Method & library.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
C 언어 교육 02 주차 – scanf & 반복문과 조건문 교육부장 조하정.
프로그래밍 개요
어서와 C언어는 처음이지 제14장.
인터넷응용프로그래밍 JavaScript(Intro).
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
Lesson 4. 수식과 연산자.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
연산자 (Operator).
프로그래밍 원리 Chapter 05 자바스크립트 기초 신한대학교 IT융합공학부 박 호 균.
에어 조건문.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
자바 가상 머신 프로그래밍 Chap 10. 자바 컴파일링의 안쪽 ② Pslab 오민경.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
CHAP 21. 전화, SMS, 주소록.
객체기반 SW설계 팀활동지 4.
^^ Computer Programming 2 dmpr.cnu.ac.kr/~daygax.
[ 단원 04 ] 반복과 배열.
PHP 웹 프로그래밍 (PHP Web Programming) 미리 정의된 함수 문양세 강원대학교 IT대학 컴퓨터과학전공.
제 15 강 문자와 코드 shcho.pe.kr.
에어 PHP 입문.
Ruby 프로그래밍 4 자료구조 응용 한국어 정보의 전산 처리
2장 PHP 기초 PHP의 시작과 끝을 이해한다. 주석문에 대하여 이해한다. echo 문을 이용하여 화면에 출력하
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
Flow Diagram IV While.
Chapter 10 데이터 검색1.
함수, 모듈.
11장 배열 1. 배열이란? 1.1 배열의 개요 1.2 배열의 선언과 사용.
TVM ver 최종보고서
Ruby 프로그래밍 2 loop, 수열 함수 정의 및 호출 반복과 재귀
16장. 변수, 연산자, 사용자 정의 함수 변수 배열과 객체 연산자 함수.
8장 선택 논리 II 1. 논리연산자 1.1 논리연산자 : AND (&&) 1.2 논리연산자 : OR (||)
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
어서와 C언어는 처음이지 제21장.
Report #2 (기한: 3/16) 데이터 구조 과목의 수강생이 50명이라고 가정한다. 이 학생(학번은 2016????으로 표현됨)들의 중간 시험(0~100), 기말 시험(0~100) 성적을 성적 파일에 작성하라(프로그램을 통해서 또는 수작업으로). 성적 파일을 읽어들여서.
6 객체.
Presentation transcript:

Ruby 프로그래밍 3 Array와 Hash 이용 한국어 정보의 전산 처리 2017. 5. 1.

Array 기초 1: 문자열 소팅 사용자가 command-line에 입력한 문자열들을 소팅하여 출력 if ARGV.length < 1 print “입력한 문자열들을 소팅해 드립니다.” exit end ARGV.sort.each do |s| puts s

Array 기초 2: 정수 소팅 사용자가 command-line에 입력한 정수들을 소팅하여 출력 if ARGV.length < 1 print “입력한 정수들을 소팅해 드립니다.” exit end ARGV.map{ |s| s.to_i }.sort.each do |i| puts i # map 메소드: Array의 각 요소에 대해 블록 안에서 규정한 조 작에 따라 변형하여 그 결과 값으로 이루어진 새로운 Array를 만들어 return함.

Array 기초 3: 문자열 역순 소팅 역순 소팅: 문자열의 뒤에서부터 비교 if ARGV.length < 1 내림차순 소팅과 다름. if ARGV.length < 1 print "입력한 문자열들을 역순 소팅해 드립니다." exit end ARGV.map{ |s| s.reverse }.sort.each do |s| #Array 안의 요소들을 뒤집어서 소팅한 뒤 puts s.reverse #Array 안의 요소들을 다시 뒤집어(즉 본래대로 하여) 출력

String 메소드 reverse 활용: palindrome 검사 사용자가 command line에 입력한 문자열이 palindrome인지 판정 if ARGV[0] == ARGV[0].reverse print "palindrome입니다." else print "palindrome 아닙니다." end #방법 1 print ( ARGV[0] == ARGV[0].reverse ) ? “Yes” : “No” # 방법 2 ~ ? A : B ~가 참이면 A로, ~가 거짓이면 B로 evaluate되는 expression

Array 메소드 include? (합격자) 명단에 이름이 들어 있는지 검사 list = ["강감찬","공형진","김갑순","김구라", …… ,"홍길동"] if ARGV.length < 1 print "이름이 명단에 있는지 검사합니다. 이름을 입력하세요." end print ( list.include? ARGV[0] ) ? “Yes” : “No“ 어떤 값이 어떤 범위에 드는지 알아볼 때도 include? 메소드가 유용 하한선 <= 값 and 값 <= 상한선 (하한선..상한선).include? 값 전자보다 후자가 더 간결함.

Array 메소드 each Enumerable에 대해 가장 많이 사용되는 메소드는 each임. 사용자가 입력한 정수들을 각각 제곱하여 출력 ARGV.each do |s| #사용자가 command line에 입력한 각 문자열에 대해 puts s.to_i**2 #문자열 s를 정수로 변환하여, 제곱하여, 출력 end #방법 1 ARGV.map{ |s| s.to_i**2 }.each do |i| # map 메소드로 정수 변환과 제곱을 수행하고 puts i # each 메소드 블록 안에서는 출력만 수행 end #방법 2

파일 입출력: nl 흉내내기 File 클래스의 open 또는 new 메소드로 파일 object 생성 이 메소드의 첫째 인자: 파일 이름 둘째 인자: “r:UTF-8” (읽기 모드), “w:UTF-8” (쓰기 모드) File object에 대해 each 메소드 호출: 한 라인씩 읽음. n=1 File.open(ARGV[0], “r:UTF-8”).each do |line| #사용자가 제공한 이름의 파일을 열어서, 각 라인에 대해 print n, ARGV[1], line #n, 구분자, line 출력 n+=1 # n을 1 증가시킴 end

redirection redirection을 사용하여 입력 파일이 마치 표준입력으로부터 오는 것처 럼 처리할 수도 있음. while line = STDIN.gets do #표준입력으로부터 읽어들여 line에 저장 #읽어들일 문자열이 있으면, 즉 읽기가 성공하면 #위의 assignment statement는 true를 반환 #읽어들일 문자열이 있는 동안 블록이 반복 실행됨. line.chomp! #line 맨 끝의 줄바꿈 문자을 떼어냄. mutating 메소드 print n, ARGV[0], line, "\n" #n, 구분자, line 출력 n+=1 # n을 1 증가시킴 end

합격자 명단 파일 읽어 이름 검사 if ARGV.length < 2 print "이름이 명단에 있는지 검사. 명단파일, 이름을 입력" exit end names = [] File.open(ARGV[0], "r:UTF-8").each do |line| names << line.chomp #line에서 줄바꿈 문자 떼어낸 뒤, #names Array에 추가. print ( names.include? ARGV[1] ) ? "Yes" : "No"

Hash 기초 학생 이름을 입력하면 점수를 알려주기 data = {} #비어 있는 Hash를 만듦. data = Hash.new와 동일. File.open(ARGV[0], "r:UTF-8").each do |line| name, score = line.chomp.split(",") #line을 쉼표로 구분 data[name] = score #data에 name-score라는 key-value 쌍을 추가 # data[name]은 data Hash에 들어 있는 key name과 연결된 # value를 반환함. end print (data.has_key? ARGV[1] ) ? data[ ARGV[1] ] : "이름이 없습니다."

테이블 구조 문서 처리: 키, 체중의 합, 평균 내기 hsum = 0.0 # 키 합을 저장할 변수를 실수로 초기화 wsum = 0.0 # 체중 합을 저장할 변수를 실수로 초기화 count = 0 # 학생 수를 저장할 변수를 정수로 초기화 File.open(ARGV[0], "r:UTF-8").each do |line| name, height, weight = line.chomp.split(",") #쉼표로 분리 height = height.to_f #문자열을 실수로 변환 weight = weight.to_f #문자열을 실수로 변환 hsum += height # 키 합에 더함 wsum += weight #체중 합에 더함 count += 1 # 학생 수 1 증가시킴 end print "키 합: ", hsum, "\n" print "키 평균: ", hsum/count , "\n" print "체중 합: ", wsum, "\n" print "체중 평균: ", wsum/count , "\n"

테이블 구조 문서 처리: 성적 처리 국,영,수,물,화 5과목 총점, 평균 추가. 총점순 소팅 data = [] #학생들을 요소로 하는 Array File.open(ARGV[0], "r:UTF-8").each do |line| name, kor, eng, math, phy, che, job = line.chomp.split(",") sum = kor.to_i + eng.to_i + math.to_i + phy.to_i + che.to_i avg = sum.to_f / 5 student = [name, kor, eng, math, phy, che, sum, avg, job] #입력의 필드 7개와 추가된 필드 2개를 원하는 순서대로 배열하여 학생 1인을 나타내는 Array를 만듦 data << student #이 학생 object를 data Array에 추가 end data.sort{ |x,y| y[6]<=>x[6] }.each do |stu| #data의 각 요소의 7번째 필드(총점)를 기준으로 내림차순 소팅 stu.each do |x| #학생 object를 구성하는 각 필드에 대해 print x, "," #그 필드와 쉼표를 출력 print "\n" # 학생 1인에 대한 정보 출력이 끝나면 줄바꿈문자 출력

다중 기준 소팅: 단어 등급 자료 words.csv: 빈도, 단어, 품사, 의미, 등급 제1 소팅 기준: 등급, 2: 빈도, 3: 품사, 4: 단어, 5: 의미 dic = [] #단어 object들을 저장할 Array를 만듦 File.open(ARGV[0], "r:UTF-8").each do |line| freq, form, pos, meaning, grade = line.chomp.split(",") #쉼표로 구분 freq = freq.to_i #빈도는 정수로 변환 word = [grade, -freq, pos, form, meaning] #소팅 기준 순서대로 배열하여 하나의 word object를 나타내는 Array 만듦. #빈도는 내림차순 소팅을 위해 - 추가. dic << word #이 word object를 dic에 추가 end dic.sort.each do |grade, freq, pos, form, meaning| #dic을 소팅한 뒤 #각 word를 구성하는 필드를 변수로 지칭 가능 print -freq, ",", form, ",", pos, ",", meaning, ",", grade, "\n" #출력은 원 순서대로

텍스트 빈도 통계 <input tr “ “ “\n” | sort | uniq –c | sort –gr 을 ruby로 구현 data = Hash.new # data = {} 와 동일 File.open(ARGV[0], "r:UTF-8").each do |line| line.chomp.split(" ").each do |word| #공백으로 구분된 단어들 각각에 대해 if data.has_key? word # data에 word라는 key가 있으면 data[word] += 1 #그 word와 연결된 수를 1 증가시킴 else #없으면. 즉 이 단어를 처음 만났으면 data[word] = 1 #그 word와 연결된 수를 1로 설정 end data.sort{ |x,y| y[1]<=>x[1] }.each do |word, freq| #빈도 내림차순으로 소팅 print word, ",", freq, "\n"

텍스트 빈도 통계 2 data = Hash.new(0) #key의 default value를 0으로 설정 File.open(ARGV[0], "r:UTF-8").each do |line| line.chomp.split(" ").each do |word| data[word] += 1 #data를 만들 때 default value를 0으로 설정했으므로 #word를 처음 만나는 경우에도 #이와 연결된 value가 자동으로 0으로 설정됨. #word를 처음 만나든 아니든 연결된 value를 1 증가시키면 됨 end programming idiom: 문법에 맞고 의미(기능)도 동일한 여러 표현 중에서 사용자(프로그래머)들이 관습적으로 흔히 사용하는 표현 예: Hash의 default value를 설정함으로써 key 포함 검사를 생략할 수 있게 하는 것

텍스트 빈도 통계 3 공백을 구분자로 하여 split을 하면, “Alice”, “Alice,”, “Alice.”, “Alice?” 등이 모두 별개의 단어로 간주됨. 정규표현 /\b/를 구분자로 하면, 일반 문자와 문장부호 사이에 단 어 경계가 있으므로 “Alice? The”가 “Alice”, “? “, “The”로 구분됨. File.open(ARGV[0], "r:UTF-8").each do |line| line.chomp.split(/\b/).each do |word| #정규표현 /\b/로 구분된 단어들 각각에 대해 data[word] += 1 end

파일들 join하기 joined = Hash.new #join한 결과는 { key => [각 파일의 나머지 필드들을 요소로 갖는 Array] } ARGV.each do |fn| #사용자가 제공한 파일이름들에 대해 File.open(fn, "r:UTF-8").each do |line| #파일을 열어 각 라인에 대해 key, residue = line.chomp.split(",", 2) #쉼표를 구분자로 split하되, 2개로만 구분 joined[key] ||= Array.new #short-circuiting을 이용한 ||= idiom joined[key] << residue #key와 연결된 Array에 residue를 추가함. end joined.sort.each do |key, residues| #joined를 key로 소팅 #residues: 각 파일의 residue들로 이루어진 Array임 print key #key 출력 residues.each do |residue| #residues Array의 각 요소 residue에 대해 print ",", residue #쉼표와 residue 출력 print "\n" #하나의 key에 대한 value의 출력이 끝나면 줄바꿈문자 출력

short-circuited evaluation (P and Q), (P && Q)의 값을 알아내려 할 때, P가 true이면 Q의 값을 evaluate해야 하나 P가 false이면 Q의 값을 evaluate할 필요가 없음. (P or Q), (P || Q)의 값을 알아내려 할 때, P가 false이면 Q의 값을 evaluate해야 하나 P가 true이면 Q는 evaluate할 필요가 없음. 연산자에 의해 결합된 두 표현의 값을 다 evaluate하지 않고 앞 의 것만 evaluate하여 전체 표현을 evaluate하는 것을 short-circuited evaluation이라 함. boolean이 기대되는 자리에서 nil은 false로, nil 이외의 값은 true로 간주됨. C 언어에서는 0도 false로 간주됨.

||= idiom 어떤 변수의 값이 nil인지 검사하여, nil이 아니면 그냥 내버려두고 nil 이면 어떤 값을 할당하는 일이 흔히 있음. 이 logic을 곧이곧대로 표현하면 x = a if x == nil || 연산자의 short-circuited evaluation 성질을 이용하면 이것을 다음과 같이 표현할 수 있음: x ||= a 이것을 ||= idiom이라 함. x||=a는 x = (x||a)와 같은 의미임. cf. x+=1은 x=x+1과 같은 의미 x가 non-nil이면 a는 evaluate 안 함. x=x이므로 아무 일도 안 하는 셈 x가 nil이면 a가 evaluate되고 x=a가 됨. joined[key] ||= Array.new joined Hash에 key가 있었으면(joined[key]가 nil이 아님) 아무 일도 안 함. key가 없었으면, 즉 joined[key]가 nil이면, 빈 Array를 만들어 이 key의 value로 삼음.

Array의 join 메소드 Array의 join 메소드를 이용하면 아래 코드를 더 단순화할 수 있음. residues.each do |residue| print ",", residue end join 메소드는, Array의 각 요소(문자열)들을 이어붙여 하나의 문자열로 통합하되, 각 요소 사이에 구분자를 넣음. [“ab”, ”cd”, ”ef”].join(“:”) # “ab:cd:ef” 구분자를 null string으로 할 수도 있음. [“ab”, ”cd”, ”ef”].join(“”) # “abcdef” 위의 3줄의 코드는 print “,”, residues.join(“,”)와 동일 학생 성적 처리할 때의 아래 코드도 마찬가지로 간략화 가능 stu.each do |x| print x, "," # print stu.join(“,”)