Խնդիրը
Տրված է որևէ գեղարվեստական ստեղծագործության տեքստ։ Կազմել տեքստում հանդիպող բառերի հաճախության բառարան, որտեղ ամեն մի բառին համապատասխանեցված է տեքստում նրա հանդիպելու քանակը։ Հաշվել տեքստի առանձին բառերի քանակի հարաբերությունը բոլոր բառերի քանակին։ Արտածել տաս ամենաշատ օգտագործված բառերի խմբերը։ Արտածել տաս ամենաերկար բառերը և նրանց հանդիպելու քանակը։ Արտածել միայն մեկ անգամ հանդիպող բառերի ցուցակը։
Լուծումը
Դատարկ բառարանը ստեղծվում է
dict
հրամանի
create
ենթահրամանով:
set
հրամանը տրված փոփխականին (օբյեկտին, տեղին) վերագրում է տրված արժեքը։ Ստեղծենք
words
բառարանը, որն արտապատկերում է տեքստի բառերը տեքստում նրանց հանդիպելու քանակին.
set words [dict create]
Տող առ տող կարդանք տեքստային ֆայլը և նրա բառերն ավելացնենք հաճախությունների բառարանում։
open
հրամանը տրված ֆայլը բացում է տրված ռեժիմով (գրել, կարդալ և այլն) և վերադարձնում է ֆայլի դեսկրիպտոր։
gets
հրամանը ֆայլից կարդում և վերադարձնում է մեկ տող։ Եթե նրան տրված է երկրորդ արգումենտը, ապա կարդացած տողը վերագրվում է այդ արգումենտին, իսկ ֆունկցիան վերադարձնում է կարդացած նիշերի քանակը։
regsub
հրամանը տողում փոփոխություններ է կատարում ըստ տրված
կանոնավոր արտահայտության։
string
հրամանի
tolower
ենթահրամանը տրված տողի բոլոր մեծատառերը դարձնում է փոքրատառ։
foreach
հրամանը իտերացիա (ցիկլ) է կատարում տրված ցուցակով։
split
հրամանը տողը կտրտում է՝ օգտագործելով տրված բաժանիչները։
string
հրամանի
length
ենթահրամանը վերադարձնում է տողի երկարությունը։
if
հրամանը կատարում է
մարմնում տրված հրամանները, եթե
պայմանը ճշմարիտ է։
dict
հրամանի
exists
ենթահրամանը ստուգում է արդյո՞ք տրված բառարանում առկա է տրված բանալին, իսկ
set
ենթահրամանը բառարանում ավելացնում է տրված
բանալի-արժեք զույգը։
dict
հրամանի մեկ այլ,
incr
ենթահրամանը տրված արժեքն ավելացնում է բառարանի տրված բանալիին համապատասխան արժեքին։
close
հրամանը փակում է բացած ֆայլը։
# բացել տեքստային ֆայլը կարդալու համար
set fin [open {martin-eden-jack-london.txt} r]
while {[gets $fin line] >= 0} {
# հեռացնել բոլոր տառ չհանդիսացող սիմվոլները
set line [regsub -all -- {\W+} $line { }]
# տողի բոլոր սիմվոլները դարձնել փոքրատառ
set line [string tolower $line]
# կտրտել տողը և անցնել բառերով
foreach wd [split $line { }] {
# դիտարկել միայն մեկից մեծ երկարությամբ բառերը
if {[string length $wd] > 1} then {
# եթե բառարանում չկա տվյալ բառին համապատասխան գրառում
if {![dict exists $words $wd]} then {
# ավելացնել այն՝ զրո արժեքով
dict set words $wd 0
}
# մեկով ավելացնել դիտարկվող բառի ցուցիչը
dict incr words $wd
}
}
}
# փակել տեքստային ֆայլը
close $fin
dict
հրամանի
size
ենթահրամանը վերադարձնում է բառարանի տարրերի քանակը, իսկ
for
ենթահրամանը իտերացիա է կազմակերպում բառարանի բանալի-արժեք զույգերով։
incr
հրամանը տրված փոփոխականին գումարում է տրված արժեքը։
# ունիկալ (առանձին) բառերի քանակը
set uniwords [dict size $words]
# բոլոր բառերի քանակի հաշվարկը
set allwords 0
# անցում բառարանի բանալի-արժեք զույգերով
dict for {k v} $words {
incr allwords $v
}
# առանձին բառերի քանակի հարաբերությունը բոլոր բառերի քանակի
puts "$uniwords / $allwords = [expr 1.0 * $uniwords / $allwords]"
Նախապատրաստենք մի նոր բառարան, որն արտապատկերում է քանակը բառերի ցուցակին։
Այն օգտագործվելու է տրված քանակով բառերի ցուցակի ստացման համար։
dict
հրամանի
lappend
ենթահրամանը տրված արժեքը կցում է բառարանի տրված բանալուն համապատասխանեցված ցուցակին։
set counts [dict create]
# անցում բառարանի բանալի-արժեք զույգերով
dict for {k v} $words {
# եթե բառարանում հերթական քանակին համապատասխան բառերի ցուցակը դատարկ է
if {![dict exists $counts $v]} then {
# ապա ստեղծել նոր արտապատկերում դատարկ ցուցակով
dict set counts $v [list]
}
# դիտարկվող բառն ավելացնել համապատասխան թվի ցուցակում
dict lappend counts $v $k
}
lrange
հրամանը վերադարձնում է տրված ցուցակի մի հատվածը՝ նորից ցուցակի տեսքով։
lsort
հրամանը կարգավորում է ցուցակի տարրերը տրված պայմանով։
dict
հրամանի
keys
ենթահրամանը վերադարձնում է բառարանի բանալիների ցուցակը։
puts
հրամանը ստանդարտ արտածման հոսքին է արտածում տրված արժեքը։
# տաս ամենահաճախ օգտագործված բառերը
foreach num [lrange [lsort -decreasing -integer [dict keys $counts]] 0 10] {
puts "[dict get $counts $num] : $num"
}
proc
հրամանով սահմանվում են նոր պրոցեդուրաներ (կամ ֆունկցիաներ)։
expr
հրամանը հաշվարկում և վերադարձնում է իր արգումենտում տրված արտահայտության արժեքը։
return
հրամանը նախատեսված է ֆունկցիայից արժեքի վերադարձի համար։
# մի ֆունկցիա, որը տողերի կարգի հարաբերություն է սահմանում ըստ երկարության
proc cmplen {a b} {
return [expr [string length $a] < [string length $b]]
}
lsort
հրամանը կարող է
-command
պարամետրով ստանալ կարգի հարաբերությունը։
# տաս ամենաերկար բառերը և նրանց հաճախությունները
foreach wd [lrange [lsort -command cmplen [dict keys $words]] 0 10] {
puts "$wd : [dict get $words $wd]"
}
dict
հրամանի
get
ենթահրամանը վերադարձնում է բառարանի տրված բանալուն համապատասխանեցված արժեքը։
# միայն մեկ անգամ օգտագործված բառերը
puts [dict get $counts 1]
exit
հրամանով ավարտվում են Tcl ծրագրերը։
exit 0
No comments:
Post a Comment