Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion modules/containers/Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
SUBDIR+= slides
SUBDIR+= slides-lists
SUBDIR+= slides-tuples
SUBDIR+= slides-example-guess
SUBDIR+= slides-sets-stacks-queues
SUBDIR+= slides-dicts
SUBDIR+= slides-example-align-phonebook
SUBDIR_GOALS= all clean distclean

HTML_FILES= lecture.html exercise.html
Expand Down
96 changes: 96 additions & 0 deletions modules/containers/slides-dicts/contents.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
\mode*

\section{Uppslagslistor}

\begin{frame}
\includegraphics[width=\columnwidth]{figs/docs-dicts.png}
\end{frame}

\begin{frame}[fragile]
\begin{example}[phone-small.py]
\inputminted{python}{examples/phone-small.py}
\end{example}
\end{frame}

\subsection{Sökning}

\begin{frame}[fragile]
\mintinline[fontsize=\huge]{python}|item in dict|
\end{frame}

\begin{frame}[fragile]
\begin{example}[isin.py]
\inputminted{python}{examples/isin.py}
\end{example}
\end{frame}

\begin{frame}[fragile]
\begin{example}[isin-alt.py]
\inputminted{python}{examples/isin-alt.py}
\end{example}
\end{frame}

\begin{frame}[fragile]
\begin{exercise}[search.py]
\begin{itemize}
\item Skriv ett program som låter oss mata in ett antal namn med
tillhörande telefonnummer.
\item Därefter får vi söka bland namnen.
\end{itemize}
\end{exercise}
\end{frame}


\section{Iterationer med for-slingor}

\subsection{For-slingan}

\begin{frame}[fragile]
\begin{minted}[fontsize=\huge,numbers=none]{python}
for item in container:
print(item)
\end{minted}
\end{frame}

\begin{frame}[fragile]
\begin{example}
\begin{minted}{python}
for i in range(10):
print(i)
\end{minted}
\end{example}

\begin{example}
\begin{minted}{python}
for person in ["adam", "bertil", "cesar"]:
print(person)
\end{minted}
\end{example}

\begin{example}
\begin{minted}{python}
phone = {"adam": "070123456", "bertil": "072123456"}
for person in phone:
print(person)
\end{minted}
\end{example}
\end{frame}

\begin{frame}[fragile]
\begin{example}
\begin{minted}{python}
phone = {"adam": "070123456", "bertil": "072123456"}
for person in phone:
print(person)
\end{minted}
\end{example}

\begin{example}
\begin{minted}[highlightlines=2]{python}
phone = {"adam": "070123456", "bertil": "072123456"}
for person, number in phone.items():
print(f"{person} har telefonnummer {number}")
\end{minted}
\end{example}
\end{frame}

7 changes: 7 additions & 0 deletions modules/containers/slides-dicts/examples/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
- [YouTube: Behållare: Uppslagslistor][yt]
- [FeedbackFruits: Behållare: Uppslagslistor][fbf]
- [diff -u search.py search-contact.py][diff]

[yt]:
[fbf]:
[diff]: https://gist.github.com/dbosk/6244091578301a8926d4c29031ada284
8 changes: 8 additions & 0 deletions modules/containers/slides-dicts/examples/isin-alt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
phone = {"adam": "0701234567", "bertil": "0721234567"}

name = input("Who's phone number?")

try:
print(f"{name} has phone number {phone[name]}.")
except KeyError:
print(f"Sorry, {name} is not in the phonebook.")
8 changes: 8 additions & 0 deletions modules/containers/slides-dicts/examples/isin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
phone = {"adam": "0701234567", "bertil": "0721234567"}

name = input("Who's phone number?")

if name in phone:
print(f"{name} has phone number {phone[name]}.")
else:
print(f"Sorry, {name} is not in the phonebook.")
133 changes: 133 additions & 0 deletions modules/containers/slides-dicts/examples/search-contacts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
"""Program om sökning i lista"""

def input_name(prompt="Ange namn: "):
"""Läser in ett namn från användaren och returnerar det i sökbar form."""
return input(prompt).casefold()

def is_phonenum(phonenum):
"""Returnerar True on phonenum ser ut som telefonnummer"""
clean_phonenum = phonenum.replace("-", "").replace(" ", "")
return clean_phonenum.isdigit()

def input_phonenum(prompt="Ange telefonnummer: ",
fail_prompt="Det ser inte ut some ett telefonnummer."):
"""
Läser in en telefonnummer från användaren, ber användaren om
nytt försök om det inte ser ut som ett telefonnummer.
"""
phonenum = input(prompt)

while not is_phonenum(phonenum):
print(fail_prompt)
phonenum = input(prompt)

return phonenum

def input_full_name(prompt="Ange fullständigt namn."):
"""Ber användaren mata in namn, returnerar (förnamn, efternamn)."""
print(prompt)

firstname = input("Ange förnamn: ")
while not firstname:
firstname = input("Ange förnamn: ")

lastname = input(f"Ange efternamn för {firstname}: ")

capitalize = input("Stavar personen med inledande stor bokstav? [ja/nej] ")
if capitalize.casefold() == "ja":
firstname = firstname.capitalize()
lastname = lastname.capitalize()

return firstname, lastname

def input_contact(prompt=""):
"""
Låter användaren mata in kontaktinfo om en kontakt,
returnerar en dictionary med nycklarna:
- first_name
- last_name
- nickname
- phone_number
- email
"""
contact_info = {}

first, last = input_full_name()
contact_info["first_name"] = first
contact_info["last_name"] = last

nickname = input(f"Smeknamn för {first}: ")
contact_info["nickname"] = nickname

if nickname:
phonenum = input_phonenum(f"Ange telefonnummer för {nickname}: ")
else:
phonenum = input_phonenum(f"Ange telefonnummer för {first}: ")

contact_info["phone_number"] = phonenum

return contact_info

def print_contact_info(contact_info):
"""
Tar en dictionary med kontaktinfo och skriver ut på skärmen,
har nycklarna:
- first_name
- last_name
- nickname
- phone_number
- email
"""
print(f"{contact_info['nickname']} "
f"({contact_info['first_name']} {contact_info['last_name']}):")
print(f"Phone: {contact_info['phone_number']}")
print(f"Email: {contact_info['email']}")

def fill_phonbook():
"""
Ber användaren att fylla telefonboken.
Returnerar en uppslagslista som innehåller telefonboken.
"""
phonebook = {}

name = input_name("Ange namn för en ny kontakt: ")
while name:
phonebook[name] = input_contact(
f"Ange kontaktinformation för {name.capitalize()}: ")

print()
name = input_name("Ange namn för en ny kontakt: ")

return phonebook

def search_phonebook(phonebook):
"""Låter användaren söka i phonebook"""
name = input_name()
while name:
try:
print_contact_info(phonebook[name])
except KeyError:
print(f"Hittade INTE {name.capitalize()} i telefonboken.")

print()
name = input_name()


def main():
"""Huvudprogrammet"""
print("Nu bygger vi upp telefonboken. Ange namn och nummer. "
"Ange tom sträng för att gå vidare.")
print()

phonebook = fill_phonbook()

print()
print("Nu ska vi söka bland namnen. Skriv namn för att söka. "
"Skriv blankrad för att avsluta.")
print()

search_phonebook(phonebook)


if __name__ == "__main__":
main()
74 changes: 74 additions & 0 deletions modules/containers/slides-dicts/examples/search.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
"""Program om sökning i lista"""

def input_name(prompt="Ange namn: "):
"""Läser in ett namn från användaren och returnerar det i sökbar form."""
return input(prompt).casefold()

def is_phonenum(phonenum):
"""Returnerar True on phonenum ser ut som telefonnummer"""
clean_phonenum = phonenum.replace("-", "").replace(" ", "")
return clean_phonenum.isdigit()

def input_phonenum(prompt="Ange telefonnummer: ",
fail_prompt="Det ser inte ut some ett telefonnummer."):
"""
Läser in en telefonnummer från användaren, ber användaren om
nytt försök om det inte ser ut som ett telefonnummer.
"""
phonenum = input(prompt)

while not is_phonenum(phonenum):
print(fail_prompt)
phonenum = input(prompt)

return phonenum

def fill_phonbook():
"""
Ber användaren att fylla telefonboken.
Returnerar en uppslagslista som innehåller telefonboken.
"""
phonebook = {}

name = input_name("Ange namn för en ny kontakt: ")
while name:
number = input_phonenum(
f"Ange telefonnummer för {name.capitalize()}: ")
phonebook[name] = number

print()
name = input_name("Ange namn för en ny kontakt: ")

return phonebook

def search_phonebook(phonebook):
"""Låter användaren söka i phonebook"""
name = input_name()
while name:
try:
print(f"{name.capitalize()} har telefonnummer {phonebook[name]}.")
except KeyError:
print(f"Hittade INTE {name.capitalize()} i telefonboken.")

print()
name = input_name()


def main():
"""Huvudprogrammet"""
print("Nu bygger vi upp telefonboken. Ange namn och nummer. "
"Ange tom sträng för att gå vidare.")
print()

phonebook = fill_phonbook()

print()
print("Nu ska vi söka bland namnen. Skriv namn för att söka. "
"Skriv blankrad för att avsluta.")
print()

search_phonebook(phonebook)


if __name__ == "__main__":
main()
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

\begin{document}
\title{%
Listor, for-slingor och uppslagslistor
Behållare: Uppslagslistor
}
\author{Daniel Bosk}
\institute{%
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[british]{babel}
\usepackage[swedish]{babel}
\usepackage{booktabs}

\usepackage[natbib,style=alphabetic,maxbibnames=99]{biblatex}
\addbibresource{slides.bib}

\usepackage[all]{foreign}
\renewcommand{\foreignfullfont}{}
\renewcommand{\foreignabbrfont}{}
Expand All @@ -13,9 +16,6 @@
\usepackage[strict]{csquotes}
\usepackage[single]{acro}

\usepackage[natbib,style=alphabetic,maxbibnames=99]{biblatex}
\addbibresource{slides.bib}

\usepackage{subcaption}

\usepackage[noend]{algpseudocode}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@

\begin{document}
\title{%
Listor, for-slingor och uppslagslistor
Behållare: Uppslagslistor
}
\author{Daniel Bosk}
\institute{%
Expand All @@ -112,7 +112,7 @@
\input{contents.tex}
\mode*

\begin{frame}[allowframebreaks]
\printbibliography
\end{frame}
%\begin{frame}[allowframebreaks]
% \printbibliography
%\end{frame}
\end{document}
3 changes: 3 additions & 0 deletions modules/containers/slides-example-align-phonebook/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
notes.pdf
slides.pdf

Loading