Hi there! The task of today will be coding a phone book. The program reads an
integer $N$ that represents the number of people in the phone book. After
that, it reads the $N$ entries from standard output and generates the
dictionary/map. For newbies: dictionaries are the same as maps. Java usually
calls the structure with (key, value) pairs as a map, while Python calls it a
dictionary. After having the phone book generated, the program will read an
unknown number of names. The fact that we can query as many names as we want
means that the program needs to check for an end of file before leaving, which
is basically trying to read until the user cancels the program. Well, other
options would be typing a special quit
command, but that’s not the case for
this problem.
To solve this problem, I read about maps in Go by Example: Maps and I wrote the following code:
package main
import "fmt"
// ignore err that fmt.Scanf gives
// I don't care about it here,
// but this is not actually good
// practise. Best would be to treat
// the error somehow
func scanf(name *string) bool {
readItems, _ := fmt.Scanf("%s", name)
return readItems > 0
}
func main() {
// define a map
nameToNumber := make(map[string]uint)
// reader number of entries
var N uint
fmt.Scanln(&N)
//read all entries
var name string
var phone uint
for N > 0 {
fmt.Scanf("%s %d", &name, &phone)
nameToNumber[name] = phone
N--
}
//read queries
var queryName string
// read until you don't find anything else
for scanf(&queryName) {
phone, found := nameToNumber[queryName]
if found {
fmt.Printf("%s=%d\n", queryName, phone)
} else {
fmt.Printf("Not found\n")
}
}
}
This program gave me more work than the one from yesterday. One the biggest
problems I had was correctly using fmt.Scanf
actually. The fact that it
returns two values (the number of items read and an error indicator) has
hindered me of just doing fmt.Scanf("%s", &queryName) != 0
like in C
. Surely
it is good to know that I can treat this error and it is returned, but I will
not pay attention to it today. I just created a new function that wraps
fmt.Scanf
and ignores the error, so my loop looks neat. Below is an example
with input and output:
#input (key, value)
3
ataias 1234
amanda 1235
juarez 9999
# input (query)
oi
# output
Not Found
# input
juarez
# output
juarez=9999
# input
amanda
# output
amanda=1235
# input
ataias
# output
ataias=1234
# input
juarez
# output
juarez=9999
That’s all for today! Thanks for reading!