P1 – Kapitel 7

Algoritmer

Strukturerat arbetssätt för problemlösning och programmering.

– ur centralt innehåll i Programmering 1

Kommer du ihåg när du lärde dig multiplikationstabellen? Att lära sig den kräver att du lär dig saker utantill. Men har du tänkt på att ungefär hälften av multiplikationstabellen behövde du inte lära dig utantill? 2 x 5 är samma sak som 5 x 2. Genom att anta “om tal A x tal B = produkten C så gäller B x A = C”. Ett annat sätt att underlätta är man man lär sig nians tabell är: “Summan av de två siffrorna som man multiplicerar i nians tabell blir alltid 9”. Ta 2 x 9. Addera siffrorna 2 + 9 = 11. Detta är ett enkelt exempel på logaritmiskt tänkande.

När du lärde dig ställa upp större tal som skulle adderas, subtraheras, multipliceras och divideras lärde du dig andra algoritmer. Även om du skulle kunna använda en del av dessa algoritmer på mycket större tal skulle det ta tid, vara ganska tråkigt och risken för att det blir fel ökar. Om man istället designar algoritmer och kör dem i en dator går det snabbare.

Att designa algoritmer som ska köras på en dator en intressant och viktig del av programmering

multiplikationstabell
multiplikationstabell

Hur skulle man göra en multiplikationstabell i Python som skriver ut alla kombinationer av 1 x 1 till 10 x 10 ()? Hur ändrar man så att man kan skriva ut vilken form på tabellen man vill? Exempelvis upp till 12 x 12 eller 6 x 3.

 

Tänk på vad du lärt dig från de tidigare delarna. Försök skriva uppgiften med ord. Börja med multiplikationstabellen 10 x 10. Två tal miltipliceras (talA och talB). Hur många gånger ska de multipliceras? 100 gånger. Hur får man Python att multiplicera 100 tal med några få rader kod? Om du gissar loop eller iteration är det ett bra svar. Vad kan du välja på för loopar? while och for. For används när man vet hur många gånger en loop ska köras och det är det vi känner till. 100 gånger.

Men vi vill inte behöva skriva 100 olika multiplikationer. Tänk på att det är 1-10 och ska multipliceras med 1-10. Om man kunde ha två for-satser där den ena for-satsen skapade varje rad i tabellen och den andra for-satsen skapade varje produkt i varje rad. Det kan man göra med nästlade for-satser. Skapa multiTab01.py enligt nedan. Kör programmet.

#multiTab01.py
for talA in range(1, 10):
        for talB in range(1, 10):
            print(talA * talB)

Övningar

Övning 7.1
Blev resultatet vad du väntade dig? Vad blev fel? Vad blev rätt? Fundera om du kan lösa något av problemmen

Det stora problemet är att print() inte vet när man vill fortsätta skriva på samma rad. Den första for-satsen skapar raderna medan den andra for-satsen skapar produkten av de två talen på varje rad. En bra redskap för att de hur ett Python program stegar sig fram hittar du på pythontutor. Pröva att på engelska söka i Google. Jag sökte på “python no new line”. Du kommer ofta komma till forumet stackoverflow. Användarna brukar ofta ha en lösning på problemet. Dock kan man behöva pröva sig fram. Ett tips är att ta till sig ord och begrepp och se vilken lösning som har högst ranking. I den första sökträffen jag fick kom jag till denna sidan på stackoverflow. En användare skrev att i Python 3 används print(‘.’, end=”). Jag rekomenderar att du söker i Pythons dokumentation efter en lösning också. I den finns detta om vad som är nytt i Python 3.

Ett annat problem är att for-satsen inte skriver ut 1-10 utan 1-9. Detta är enkelt eftersom range() anger slutvärde ett mindre, så ändra till range(1,11).

#multiTab02.py
for talA in range(1, 11):
        for talB in range(1, 11):
            print(talA * talB, end=' ')

Exempel på utskrift

1234567891024681012141618203691215182124273048121620242832364051015202530354045506121824303642485460714212835424956637081624324048566472809182736455463728190102030405060708090100

Utskriften ser först värre ut än innan. Det beror på att vi har inga mellanrum mellan talen och inget radbryt. Lägg till ett \t mellan i end=’\t ‘. Detta gör att talen inte sitter ihop och att de får ett tabuleringsavstånd till nästa tal på samma rad. Lägg till print(‘\n’) som i koden nedan. Tänk på att indraget har betydelse.

#multiTab03.py
for talA in range(1, 11):
        for talB in range(1, 11):
            print(talA * talB, end='\t')
        print('\n')
Exempel på utskrift

Multiplikationstabell utskrift

Nu har vi fått till utseendet. Men för att det ska anses vara en algoritm ska vi kunna skapa multiplikationstabell där användaren kan mata in två olika värden. Tex 5, 7 och få ut en multiplikationstabell med fem kolumner och sju rader.

Först skapar fi en funktion(se kap 4.2) som vi kallar för multi(). I multiTab03.py ovan blev tabellen alltid 10×10, så vi får får skapa två parametrar rad och kolumn så här multi(rad, kolumn). Vi testa att kalla på funktionen multi() med olika argument.

#multiTab04.py
def multi(rad, kolumn):
    for talA in range(1, rad+1):
        for talB in range(1, kolumn+1):
            print(talA*talB, end='\t')
        print('\n')

multi(3,5)
print('\n')
multi(7,2)
Exempel på utskrift

två olika muliplikationstabeller

Avslutningsvis vill vi att användaren själv ska skapa olika tabeller bara genom att ange kolumner och rader

#multiTab05.py
def multi(x, y):
    for kolumn in range(1, x+1):
        for rad in range(1, y+1):
            print(rad*kolumn, end='\t')
        print('\n')


kolumn = int(input("Hur många kolumner "))
rad = int(input("Hur många rader "))

multi(rad,kolumn)
Exempel på utskrift

Hur många kolumner 2
Hur många rader 3
1 2

2 4

3 6

Det jag visat har varit ett exempel på problemlösning med programmering och algoritmiskt tänkande.