This repository has been archived on 2024-10-30. You can view files and clone it, but cannot push or open issues or pull requests.
swb6-it-sec/Lab04/code/part01/main.go
2022-05-30 11:02:34 +02:00

86 lines
1.8 KiB
Go

package main
import (
"fmt"
"github.com/dariubs/percent"
"io/ioutil"
"sort"
"strings"
)
type letter struct {
upperCase string
lowerCase string
count int
frequency float64
}
type letterList []letter
func (l letterList) Len() int {
return len(l)
}
func (l letterList) Less(i, j int) bool {
return l[i].frequency > l[j].frequency
}
func (l letterList) Swap(i, j int) {
l[i], l[j] = l[j], l[i]
}
var alphabet = []rune{
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
}
var letters = make([]letter, len(alphabet))
func initLetterStruct() {
for index := range alphabet {
letters[index].upperCase = string(alphabet[index])
letters[index].lowerCase = string(alphabet[index] + 32)
}
}
func readFile(relativePath string) string {
content, err := ioutil.ReadFile(relativePath)
if err != nil {
fmt.Println(err)
}
return string(content)
}
func countLetters(inputText string) int {
totalCount := 0
for index := range alphabet {
letters[index].count +=
strings.Count(inputText, letters[index].lowerCase) +
strings.Count(inputText, letters[index].upperCase)
totalCount += letters[index].count
}
return totalCount
}
func calculateFrequency(totalCount int) {
for index := range alphabet {
letters[index].frequency = percent.PercentOf(letters[index].count, totalCount)
}
}
func printResult() {
for index := range alphabet {
l := letters[index]
fmt.Printf(
"The letter %s (%s) occurs %d times in the text and the frequencyArray in percent is %0.2f\n",
l.upperCase, l.lowerCase, l.count, l.frequency,
)
}
}
func main() {
initLetterStruct()
totalCount := countLetters(readFile("plaintext.txt"))
calculateFrequency(totalCount)
sort.Sort(letterList(letters))
printResult()
}