Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"run_control": {
"frozen": true
}
},
"source": [
"<nav class=\"navbar navbar-default\">\n",
" <div class=\"container-fluid\">\n",
" <div class=\"navbar-header\">\n",
" <a class=\"navbar-brand\" href=\"_Oving3.ipynb\">Øving 3</a>\n",
" </div>\n",
" <ul class=\"nav navbar-nav\">\n",
" <li ><a href=\"Intro%20til%20lokker.ipynb\">Intro til løkker</a></li>\n",
" <li ><a href=\"Mer%20om%20lokker.ipynb\">Mer om løkker</a></li>\n",
" <li class=\"active\"><a href=\"Nostede%20lokker.ipynb\">Intro til nøstede løkker</a></li>\n",
" <li><a href=\"Kodeforstaelse.ipynb\">Kodeforståelse</a></li>\n",
" <li ><a href=\"Gjett%20tallet.ipynb\">Gjett tallet</a></li>\n",
" <li ><a href=\"Tekstbasert%20spill%202.ipynb\">Tekstbasert spill 2</a></li>\n",
" <li ><a href=\"Geometrisk%20rekke.ipynb\">Geometrisk rekke</a></li>\n",
" <li ><a href=\"Fibonacci.ipynb\">Fibonacci</a></li>\n",
" <li><a href=\"Alternerende%20sum.ipynb\">Alternerende sum</a></li>\n",
" <li ><a href=\"Hangman.ipynb\">Hangman</a></li>\n",
" <li ><a href=\"Derivasjon.ipynb\">Derivasjon</a></li>\n",
" <li ><a href=\"Doble%20lokker.ipynb\">Doble løkker</a></li>\n",
" </ul>\n",
" </div>\n",
"</nav>\n",
"\n",
"# Intro til nøstede løkker\n",
"\n",
"**Læringsmål:**\n",
"\n",
"* Nøstede løkker\n",
"\n",
"I denne oppgaven skal du lære hvordan vi kan benytte oss av en løkke inne i en annen løkke. "
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true,
"run_control": {
"frozen": true
}
},
"source": [
"### Intro til nøstede løkker\n",
"Nøstede løkker vil si løkker som er inni andre løkker. Et eksempel på en nøstet løkke er en dobbel løkke, som vil si at det er en løkke inni en annen løkke. Doble løkker brukes mye i programmering, typisk når man skal løse problemer som på en eller annen måte er todimensjonale, f.eks. knyttet til matriser eller todimensjonale tabeller med tall. Todimensjonal her kan bety rent visuelt (f.eks. at man skal tegne noe på en skjerm og må oppdatere fargen i hvert punkt i et rutenett av piksler), men behøver ikke å ha noen visuell betydning. Det kan være snakk om dimensjoner av informasjon på en mer abstrakt måte. F.eks. kan de to dimensjonene være tall og verdier i kortstokken, vi kan da generere en hel kortstokk ved en dobbel løkke som følger:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2019-07-02T13:13:16.212772Z",
"start_time": "2019-07-02T13:13:16.199788Z"
},
"hidden": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"♠A ♠2 ♠3 ♠4 ♠5 ♠6 ♠7 ♠8 ♠9 ♠10 ♠J ♠Q ♠K \n",
"♣A ♣2 ♣3 ♣4 ♣5 ♣6 ♣7 ♣8 ♣9 ♣10 ♣J ♣Q ♣K \n",
"♥A ♥2 ♥3 ♥4 ♥5 ♥6 ♥7 ♥8 ♥9 ♥10 ♥J ♥Q ♥K \n",
"♦A ♦2 ♦3 ♦4 ♦5 ♦6 ♦7 ♦8 ♦9 ♦10 ♦J ♦Q ♦K \n",
"\n"
]
}
],
"source": [
"\n",
"def format_card_deck():\n",
" \n",
" farger = ['♠', '♣', '♥', '♦']\n",
" verdier = ['A', '2', '3', '4', '5', '6', '7', '8',\n",
" '9', '10', 'J', 'Q', 'K']\n",
" outer_string = \"\"\n",
" \n",
" for farge in farger: # Traverse the farger-array\n",
" inner_string = \"\"\n",
" for verdi in verdier: # Traverse the verdier-array\n",
" inner_string += farge + verdi + \" \" # Add the current farge and verdi, in addition to spacing\n",
" outer_string += inner_string + \"\\n\" # add all the values of one farge to the result, and start at a new line\n",
" \n",
" return outer_string\n",
"\n",
"print(format_card_deck())\n",
"\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"hidden": true,
"run_control": {
"frozen": true
}
},
"source": [
"Den innerste løkka går 13 runder hver gang den kjører fordi det er 13 elementer i sekvensen som gis til for-løkka (verdier). Den legger til hver av kortene i en farge til en indre streng. Denne strengen legges til en ytre streng når den indre forløkken er ferdig. Dermed får vi alle kortene av en sort hver gang den indre forløkken er ferdig å kjøre. Merk \"\\n\" i den ytre strengen. Dette gjør at vi skifter linje mellom hver gang den fullførte indre strengen legges til den ytre strengen. Den ytre løkka går 4 ganger, en for hver farge i kortstokken"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## a)"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"run_control": {
"frozen": true
}
},
"source": [
"**Eksempel på nøstet løkke med print**"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n"
]
}
],
"source": [
"for x in range(5):\n",
" for y in range(3):\n",
" print(\"Jeg elsker ITGK! \", end=\" \")\n",
" print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Under følger en funksjon og bygging av tekststreng som gir samme output som løkkene over:**"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"\n"
]
}
],
"source": [
"def nested_loop_example():\n",
" \n",
" result_string = \"\"\n",
" \n",
" for x in range(5):\n",
" inner_string = \"\"\n",
" \n",
" for y in range(3):\n",
" inner_string += \"Jeg elsker ITGK! \"\n",
" \n",
" result_string += inner_string + \"\\n\"\n",
" return result_string\n",
"\n",
"print(nested_loop_example())"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"run_control": {
"frozen": true
}
},
"source": [
"Denne utskriften trenger man strengt tatt ikke dobbel løkke for å få til; selve utskriften gir riktig nok et todimensjonalt inntrykk, men siden den underliggende informasjonen ikke er todimensjonal men derimot konstant (samme utskrift \"Jeg elsker ITGK!\" i alle tilfeller), er det også greit mulig å klare dette med enkel løkke, eller helt uten løkker, som følger:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2019-07-02T13:15:07.223226Z",
"start_time": "2019-07-02T13:15:07.215744Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK!\n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK!\n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK!\n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK!\n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK!\n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
"\n"
]
}
],
"source": [
"# Løsning med enkel løkke:\n",
"for x in range(5):\n",
" print(\"Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK!\")\n",
"\n",
"# Løsning uten løkker; \"\\n\" er tegnet for linjeskift (newline på engelsk)\n",
"print(((\"Jeg elsker ITGK! \" * 3) + \"\\n\") * 5)"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"run_control": {
"frozen": true
}
},
"source": [
"Koden over vil skrive ut “Jeg elsker ITGK!” tre ganger ved siden av hverandre fem ganger nedover. Dette skjer på to ulike måter, derav 10 linjer i outputen. \n",
"\n",
"Hvis vi nå endrer litt på kravene til programmet, så det skal handle om flere studenter enn \"Jeg\" og flere emner enn \"ITGK\", vil vi ha et genuint todimensjonalt problem (én dimensjon er studenter, en annen emner) hvor dobbel løkke vil være klart enkleste løsning. **Din oppgave: kopier funksjonen nested_loop_example(), endre programmet så det gir utskrift som vist nedenfor**. Fra forrige oppgave skal altså Jeg byttes ut med Stud <nummer>, og ITGK skal byttes ut med Emne <nummer>. Brukeren skal angi ønsket antall for både studenter og emner, 4 og 3 er bare eksempler.\n",
"\n",
"```\n",
"print(nested_loop_example())\n",
"Hvor mange studenter? 4\n",
"Hvor mange emner? 3\n",
"Stud 1 elsker Emne 1 ; Stud 1 elsker Emne 2 ; Stud 1 elsker Emne 3 ;\n",
"Stud 2 elsker Emne 1 ; Stud 2 elsker Emne 2 ; Stud 2 elsker Emne 3 ;\n",
"Stud 3 elsker Emne 1 ; Stud 3 elsker Emne 2 ; Stud 3 elsker Emne 3 ;\n",
"Stud 4 elsker Emne 1 ; Stud 4 elsker Emne 2 ; Stud 4 elsker Emne 3 ;\n",
"```\n",
"\n",
"**EKSTRA UTFORDRING** (ikke nødvendig for å få godkjent (a)): For å gjøre programmet litt mindre tørt og abstrakt, kan du prøve å endre så det skriver fornavn på personer i stedet for \"Stud x\", og navn på faktiske emner i stedet for Emne y - jfr eksempel med kortstokk i teksten \"Intro til nøstede løkker\" øverst i denne oppgaven. For å gjøre det mindre forutsigbart, kan du dessuten bruke funksjonen random() for å generere tilfeldige tall for hver runde av løkka, og ha en if-setning for å velge verb basert på verdien av dette. F.eks. \"elsker\" bare hvis tallet ble > 0.9, og gradvis litt mer beskjedne verb til lavere tallverdien var."
]
},
{
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"editable": false,
"run_control": {
"frozen": true
}
},
"source": [
"## b)"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"run_control": {
"frozen": true
}
},
"source": [
"Lag en funksjon som returnerer en tekststreng med alle klokkeslett i løpet av et døgn på en fin måte. Du trenger kun å tenke på timer og minutter. Klokkeslettene skal gå fra 0:0 til 23:59 som vist nedenfor.\n",
"\n",
"Eksempel på kjøring av kode:\n",
"\n",
"```python\n",
"print(klokkeslett())\n",
"\n",
"0:0\n",
"0:1\n",
"0:2\n",
".\n",
". # Alle klokkeslett i mellom her skal skrives ut\n",
".\n",
"23:58\n",
"\n",
"***Skriv koden din her:***"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2019-07-02T13:21:25.863928Z",
"start_time": "2019-07-02T13:21:25.855403Z"
}
},
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"editable": false,
"run_control": {
"frozen": true
}
},
"source": [
"## c)"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"run_control": {
"frozen": true
}
},
"source": [
"Bruk doble løkker til å lage en funksjon som returnerer alle tallene i den lille gangetabellen, dvs. lag to for-løkker opp til 11 og multipliser variabelen x fra den ene løkken med variabelen y fra den andre løkken og bygg det på en indre streng i den innerste løkken. Du trenger ikke å tenke på formatet til utskriften.\n",
"\n",
"Eksempel på kjøring:\n",
"\n",
"```python\n",
"print(gangetabellen())\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
".\n",
".\n",
".\n",
"60\n",
"70\n",
"80\n",
"90\n",
"100\n",
"```\n",
"***Skriv koden din her:***"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2019-07-02T13:22:00.046861Z",
"start_time": "2019-07-02T13:22:00.042947Z"
}
},
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"run_control": {
"frozen": true
}
},
"source": [
"**Bonus**: Forsøk å legg inn \"\\n\" etter den innerste løkken i c) har kjørt (dvs. på samme innrykk som innerste for, men nedenfor linjen hvor inner_string blir utvidet med tall. Legg også til et mellomrom etter str(i*j)' ' på slutten av print-funksjonen som printer ut tallene. Ser du nå at det ligner mer på en gangetabell?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"celltoolbar": "Edit Metadata",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": false,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}