Lære et nytt språk

Skip to content

Del 1 - Velge et programmeringsspråk

Det første dere skal gjøre er å velge et nytt programmeringsspråk dere vil lære. Jeg vil aller helst at dere velger noe annet enn Python og JavaScript, siden det er de vi har sett mest på så langt. Det betyr at dere kan velge C# som språket, men dere er frie til å velge hva dere vil.

Her kan dere se noen fordeler å ulemper med språkene dere kan fra før:

Fordeler

  • Lett syntax, bra for nybegynnere.
  • Brukt i web-utvikling, data science, maskinlæring, automatisering, og mye mer.
  • Ekstremt mange libraries, både innebygd og eksterne for alle-slags bruksområder.
  • Veldig mye brukt, så det er ekstremt mye hjelp å finne fra folk på nettet.

Ulemper

  • Veldig tregt i forhold til kompilerte språk.
  • Dynamiske typer som kan føre til bugs som er vanskelige å finne
  • Brukes ikke mye for mobil-apper

Fordeler

  • Brukes nesten eksklusivt for front-end på nettsider, alle nettlesere har support for JavaScript.
  • Veldig bra for interaktive programmer.
  • Kan også brukes til back-end ved hjelp av f.ex. Node.js. I tillegg finnes det mange rammeverk.
  • Også veldig mye brukt, mye hjelp å finne online.

Ulemper

  • Svakt typet språk kan føre til veldig rare resultater.
  • Små forskjeller mellom nettlesere kan føre til rare resultater.

Nye språk:

Fordeler

  • Tydelig og klart språk.
  • Kan brukes til alt fra spill, nettsider, applikasjoner også videre.
  • Sterkt typet: gir forutsigbare resultater og feilmeldinger som er lette å finne.
  • Gode utviklerverktøy, som for eksempel Visual Studio.
  • Er kjapt, siden det er kompilert (er kompilert til det som kalles et CIL).

Ulemper

  • Originalt bare til Windows, men har i nyere tider blitt bredere takket være .NET Core.
  • Ganske komplekst språk, mye mer å tenke på i forhold til Python.
  • Selv om det kan brukes til web, så er det lite brukt for web.

Fordeler

  • Veldig raskt språk. Gir deg full kontroll av system-resources.
  • Kan brukes til alt.
  • Har mange avanserte egenskaper.

Ulemper

  • Komplekst, veldig vanskelig å lære.
  • Krever mye manuelt minne-bruk, kan føre til problemer dersom det ikke blir gjort korrekt.
  • Kan bruke lenge på å kompilere, som kan føre til at det tar lang tid å utvikle ting, men resultatet er et veldig raskt program.

Fordeler

  • Kan brukes på alle maskiner som har en Java Virtual Machine.
  • Objekt-orientert: gjør det lett å lage modulær kode som er skalerbar.
  • Mange bra innebygde biblioteker.
  • Brukt mye i store applikasjoner og Android utvikling.

Ulemper

  • Krever mye kode, for å få til det samme som språk som Python.
  • Bruker en stund på å starte programmer, men er programmene kjører ikke tregt i praksis.
  • Bruker ganske mye minne.

Fordeler

  • Mange bugs som skjer i andre kode-språk blir fikset når det blir kompilert.
  • Er omtrent like raskt som C++.
  • Har veldig sikker multi-threading mulighet.

Ulemper

  • Veldig vanskelig å lære på grunn av avanserte konsepter.
  • Kan bruke lang tid på kompilere.
  • Ganske få biblioteker og verktøy.

Fordeler

  • Relativt enkelt å lære
  • Gode innebygde funksjoner og egenskaper for å skrive multi-threaded kode.
  • Kjapt språk siden det er kompilert.

Ulemper

  • Veldig nytt språk, få biblioteker eksisterer.
  • Mangler en del funksjonalitet mange andre språk har.
  • Å passe på at feil ikke skjer kan være ganske repetetivt.

Fordeler

  • Veldig enkelt å lære, enkel syntaks.
  • Ruby on Rails for enkel web-utvikling.
  • Enkle utviklingsvalg.

Ulemper

  • Generelt veldig tregt i forhold til nesten alle andre språk.
  • Brukes nesten bare til web-utvikling.
  • Få ressurser i forhold til Python og JavaScript.

Andre språk?

Du kan selvfølgelig utforske andre språk enn disse. Noen forslag kan være: Swift, PHP, TypeScript, Kotlin, R, Perl, Haskell, Visual Basic, Scala, eller andre!

Esoteriske språk?

Vær så snill å ikke utforsk et type “Esoterisk” språk. Dere kommer ikke til å få mye nytte ut av det. I tillegg er det ikke noe vi kan mye om eller andre kan mye om, så du får nok ikke mye hjelp her!

Del 2 - Lære seg språket

Hvordan skal jeg finne ut hva jeg skal gjøre?

Det er et godt spørsmål! Alle programmeringsspråk som er ganske populære bør ha en “Get Started”, side. Anbefaler å søke på *programming language here* get started på nettet.

Her er noen gode ressurser for en del språk, det finnes mange YouTube tutorials også, bare å lete!

Det finnes tilsvarende ressurser for andre språk. Du kan blant annet endre på taggen på Stack Overflow til å søke kun på det språket du har valgt.

Easy Oppgave 2.1 - Hello World

Det første som vanligvis blir gjort i noe programmeringsspråk er å skrive et "Hello, World!" program. Dette er greit for å verifisere at du har installert alt du trenger for programmeringsspråket, og at koden kjører i det hele tatt.

Husk å kjøre koden for å teste om det fungerer!

Løsning
using System; 

class Program
{
    static void Main()
    {
        Console.WriteLine("Hello, World!");
    }
}
#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
fn main() {
    println!("Hello, World!");
}
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

Easy Oppgave 2.2 - Opprette variabler og typer

Opprett minst 4 variabler i et program og skriv dem ut. Prøv å lage variabler i minst fire forskjellige typer. Eksempler kan være: integer, float, string, boolean.

Løsning

Her opprettes en integer med int, float med double (64-bit desimaltall), string med string og boolean med bool.

using System;

class Program
{
    static void Main()
    {
        int number = 42;
        double pi = 3.14159;
        string hello = "HELLO THERE!";
        bool isFriday = false;

        Console.WriteLine($"Number: {number}");
        Console.WriteLine($"Pi: {pi}");
        Console.WriteLine($"Greeting: {hello}");
        Console.WriteLine($"Is it friday?: {isFriday}");
    }
}
#include <iostream>
#include <string>

int main() {
    int number = 42;
    double pi = 3.14159;
    string hello = "HELLO THERE!";
    bool isFriday = false;

    std::cout << "Number: " << number << std::endl;
    std::cout << "Pi: " << pi << std::endl;
    std::cout << "Greeting: " << hello << std::endl;
    std::cout << "Is it friday?: " << boolalpha << isFriday << std::endl;
    return 0;
}
public class Main {
    public static void main(String[] args) {
        int number = 42;
        double pi = 3.14159;
        String hello = "HELLO THERE!";
        boolean isFriday = false;

        System.out.println("Number: " + number);
        System.out.println("Pi: " + pi);
        System.out.println("Greeting: " + hello);
        System.out.println("Is it friday?: " + isFriday);
    }
}
fn main() {
    let number: i32 = 42;
    let pi: f64 = 3.14159;
    let hello: &str = "HELLO THERE!";
    let is_friday: bool = false;

    println!("Number: {}", number);
    println!("Pi: {}", pi);
    println!("Greeting: {}", hello);
    println!("Is it friday?: {}", is_friday);
}
package main

import "fmt"

func main() {
    var number int = 42
    var pi float64 = 3.14159
    var hello string = "HELLO THERE!"
    var isFriday bool = false

    fmt.Println("Number:", number)
    fmt.Println("Pi:", pi)
    fmt.Println("Greeting:", hello)
    fmt.Println("Is it friday?:", isFriday)
}
Hva er typer? Med Python Eksempel

Dersom du bare har jobbet med Python fram til nå så er kanskje typer noe du ikke har trengt å tenkt så mye på, men Python har typer også!

Du husker kanskje hvis du prøver hente inn et tall fra en bruker på denne måten:

number = input("Skriv inn et tall: ")
print(number + 10)

Hva skjer? Programmet krasjer! Hvorfor? Jo, det er fordi at selv om variablen heter number, så er ikke dette et tall! Det vi måtte gjøre for at dette skulle fungerer er å konvertere typen til variablen til et tall, i dette tilfellet en “integer”, altså, et heltall.

print(int(number) + 10)

I veldig mange programmeringsspråk så er ikke typer implisitte, men eksplisitte, altså, du må si til koden hvilken type en variabel er.

Datatyper i Ruby?

Dersom dere har valgt Ruby, kan denne delen være litt vanskelig. Ruby, som Python har faktisk typer, men du trenger ikke å skrive dem eksplisitt, hvis du lurer på hva dette betyr kan du se på C# eksempelet under.

Medium Oppgave 2.3 - Konvertere mellom typer

Så å si alle programmeringsspråk har måter å konvertere mellom typer på. Prøv, i ditt programmeringsspråk å hente ut to tall fra en bruker, deretter legge dem sammen.

Løsning
class Program
{
    static void Main()
    {
        Console.WriteLine("Skriv et tall: ");
        double num1 = double.Parse(Console.ReadLine());

        Console.WriteLine("Skriv et tall til: ");
        double num2 = double.Parse(Console.ReadLine());

        // Tekst med $ lar deg skrive inn variabler i teksten ved hjelp av { }
        Console.WriteLine($"Summen av tallene er {num1 + num2}");
    }
}
#include <iostream>

int main() {
    double num1, num2;
    std::cout << "Skriv et tall: ";
    std::cin >> num1;

    std::cout << "Skriv et tall til: ";
    std::cin >> num2;

    std::cout << "Summen av tallene er " << num1 + num2 << std::endl;
    return 0;
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Skriv et tall: ");
        double num1 = Double.parseDouble(scanner.nextLine());

        System.out.print("Skriv et tall til: ");
        double num2 = Double.parseDouble(scanner.nextLine());

        System.out.println("Summen av tallene er " + (num1 + num2));
    }
}
use std::io;

fn main() {
    let mut input1 = String::new();
    println!("Skriv et tall: ");
    io::stdin().read_line(&mut input1).unwrap();
    let num1: f64 = input1.trim().parse().unwrap();

    let mut input2 = String::new();
    println!("Skriv et tall til: ");
    io::stdin().read_line(&mut input2).unwrap();
    let num2: f64 = input2.trim().parse().unwrap();

    println!("Summen av tallene er {}", num1 + num2);
}
package main

import (
    "fmt"
)

func main() {
    var num1, num2 float64

    fmt.Print("Skriv et tall: ")
    fmt.Scanln(&num1)

    fmt.Print("Skriv et tall til: ")
    fmt.Scanln(&num2)

    fmt.Println("Summen av tallene er", num1+num2)
}
Om C# Eksempelet

I C# brukes Parse på noen typer for å konvertere dem til tekst. Dersom du har lyst til å konvertere fra double til int eller lignende må du bruke en “typecast”. Her kan du se et eksempel på dette:

double theNumber = 1.5;
int convertedNumber = (int)theNumber; // tallet er blit til en int

Her vil desimalene bli kappet av, og du blir værende igjen med 1.

Det du må bruke i hvert tilfelle varierer fra type til type. Men som oftest er det .Parse for å gjøre det til string eller en “typecast”.

Easy Oppgave 2.4 - if og else

Lag et enkelt program som henter ut et tall fra brukeren å sjekker om det er positivt, negativt eller 0.

Løsning
Console.WriteLine("Write a number: ");
int number = int.Parse(Console.ReadLine());

if (number < 0)
{
    Console.WriteLine("The number is negative!");
}
else if (number > 0)
{
    Console.WriteLine("The number is positive!");
}
else
{
    Console.WriteLine("The number is zero!");
}
#include <iostream>

int main() {
    int number;
    std::cout << "Write a number: ";
    std::cin >> number;

    if (number < 0) {
        std::cout << "The number is negative!" << std::endl;
    } else if (number > 0) {
        std::cout << "The number is positive!" << std::endl;
    } else {
        std::cout << "The number is zero!" << std::endl;
    }
    return 0;
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Write a number: ");
        int number = Integer.parseInt(scanner.nextLine());

        if (number < 0) {
            System.out.println("The number is negative!");
        } else if (number > 0) {
            System.out.println("The number is positive!");
        } else {
            System.out.println("The number is zero!");
        }
    }
}
use std::io;

fn main() {
    let mut input = String::new();
    println!("Write a number: ");
    io::stdin().read_line(&mut input).unwrap();
    let number: i32 = input.trim().parse().unwrap();

    if number < 0 {
        println!("The number is negative!");
    } else if number > 0 {
        println!("The number is positive!");
    } else {
        println!("The number is zero!");
    }
}
package main

import "fmt"

func main() {
    var number int
    fmt.Print("Write a number: ")
    fmt.Scanln(&number)

    if number < 0 {
        fmt.Println("The number is negative!")
    } else if number > 0 {
        fmt.Println("The number is positive!")
    } else {
        fmt.Println("The number is zero!")
    }
}
Blokker og Scopes

Mange språk bruker “block” og “scope”. Det vil si et område som inneholder kode som er separat fra annen kode. I C# og mange andre språk er det dette krøllparanteser {} brukes til. Men i noen språk må du spesifikt si at blokken skal ende. I Ruby for eksempel må du skrive end etter en if for å si at if-en er over.

Easy Oppgave 2.5 - for-loop

Lag et program som teller opp alle tallene til 100 ved hjelp av en for-loop.

Hvordan fungerer en for-loop?

I C# består for-looper av tre deler:

for (start; slutt; hopp)
  • Først så må vi si hvilket tall loopen begynner på.
  • Så skriver vi når den skal stoppe.
  • Så skriver vi hvor mye telle-variabelen skal øke med hver gang, et “hopp”.
Løsning
using System;

class Program
{
    static void Main()
    {
        for (int i = 1; i <= 100; i++)
        {
            Console.WriteLine(i);
        }
    }
}
#include <iostream>

int main() {
    for (int i = 1; i <= 100; i++) {
        std::cout << i << std::endl;
    }
    return 0;
}
public class Main {
    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            System.out.println(i);
        }
    }
}
fn main() {
    for i in 1..=100 {
        println!("{}", i);
    }
}
package main

import "fmt"

func main() {
    for i := 1; i <= 100; i++ {
        fmt.Println(i)
    }
}
Hva betyr dette? (Forklarer C# løsningen.)
  • I eksempelet over ble start satt som int i = 0, den starter på null.
  • Slutt ble satt til i < 100, den stopper på 100, men tar ikke med 100, det betyr at denne tar faktisk ikke å skriver ut 100. Hva må du skrive for å kunne skrive ut 100 også?
  • Hopp står som i++ som er en snarvei for å øke med 1. Dersom vi skulle telle 0, 2, 4, 6, også videre kunne vi ha skrevet i += 2.

Medium Oppgave 2.6 - Funksjoner

Endre på koden i oppgave 2.3 til å bruke en funksjon til å legge sammen tallene i stedet.

Løsning
using System;

class Program
{
    static double AddNumbers(double num1, double num2)
    {
        return num1 + num2;
    }

    static void Main()
    {
        Console.WriteLine("Skriv et tall: ");
        double num1 = double.Parse(Console.ReadLine());

        Console.WriteLine("Skriv et tall til: ");
        double num2 = double.Parse(Console.ReadLine());

        double result = AddNumbers(num1, num2);
        Console.WriteLine($"Summen av tallene er {result}");
    }
}
#include <iostream>

double AddNumbers(double num1, double num2) {
    return num1 + num2;
}

int main() {
    double num1, num2;
    std::cout << "Skriv et tall: ";
    std::cin >> num1;
    std::cout << "Skriv et tall til: ";
    std::cin >> num2;

    double result = AddNumbers(num1, num2);
    std::cout << "Summen av tallene er " << result << std::endl;
    return 0;
}
import java.util.Scanner;

public class Main {
    static double addNumbers(double num1, double num2) {
        return num1 + num2;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Skriv et tall: ");
        double num1 = Double.parseDouble(scanner.nextLine());

        System.out.print("Skriv et tall til: ");
        double num2 = Double.parseDouble(scanner.nextLine());

        double result = addNumbers(num1, num2);
        System.out.println("Summen av tallene er " + result);
    }
}
use std::io;

fn add_numbers(num1: f64, num2: f64) -> f64 {
    num1 + num2
}

fn main() {
    let mut input1 = String::new();
    println!("Skriv et tall: ");
    io::stdin().read_line(&mut input1).unwrap();
    let num1: f64 = input1.trim().parse().unwrap();

    let mut input2 = String::new();
    println!("Skriv et tall til: ");
    io::stdin().read_line(&mut input2).unwrap();
    let num2: f64 = input2.trim().parse().unwrap();

    let result = add_numbers(num1, num2);
    println!("Summen av tallene er {}", result);
}
package main

import "fmt"

func addNumbers(num1 float64, num2 float64) float64 {
    return num1 + num2
}

func main() {
    var num1, num2 float64

    fmt.Print("Skriv et tall: ")
    fmt.Scanln(&num1)

    fmt.Print("Skriv et tall til: ")
    fmt.Scanln(&num2)

    result := addNumbers(num1, num2)
    fmt.Println("Summen av tallene er", result)
}

Medium Oppgave 2.7 - Lister

Lag et enkelt program som har en liste med ord og skrive ut disse.

Løsning
using System;
using System.Collections.Generic;     

class Program
{
    static void WriteWords(List<string> words)
    {
        for (int i = 0; i < words.Count; i++)
        {
            // du henter ut fra lista med å skrive *indexen*
            Console.WriteLine(words[i]);
        }
    }

    static void Main()
    {
        // dette er en måte å lage en liste på
        List<string> words = { "hello", "there", "this", "is", "a", "list" };

        // bruk funksjonen for å skrive ord
        WriteWords(words);
    }
}
#include <iostream>
#include <vector>
#include <string>

void WriteWords(const vector<string>& words) {
    for (int i = 0; i < words.size(); i++) {
        std::cout << words[i] << std::endl;
    }
}

int main() {
    vector<string> words = {"hello", "there", "this", "is", "a", "list"};
    WriteWords(words);
    return 0;
}
import java.util.ArrayList;
import java.util.List;

public class Main {
    static void writeWords(List<String> words) {
        for (int i = 0; i < words.size(); i++) {
            System.out.println(words.get(i));
        }
    }

    public static void main(String[] args) {
        List<String> words = new ArrayList<>();
        words.add("hello");
        words.add("there");
        words.add("this");
        words.add("is");
        words.add("a");
        words.add("list");

        writeWords(words);
    }
}
fn write_words(words: &Vec<&str>) {
    for i in 0..words.len() {
        println!("{}", words[i]);
    }
}

fn main() {
    let words = vec!["hello", "there", "this", "is", "a", "list"];
    write_words(&words);
}
package main

import "fmt"

func writeWords(words []string) {
    for i := 0; i < len(words); i++ {
        fmt.Println(words[i])
    }
}

func main() {
    words := []string{"hello", "there", "this", "is", "a", "list"}
    writeWords(words)
}
Om C# Løsningen

Du kunne også ha skrevet det som en array (du måtte ha endret på funksjonen til å bruke array i stedet for liste):

string[] words = ["hello", "there", "this", "is", "a", "list"];

Liste vs Array

  • Liste kan du fortsette å fylle opp.
  • Array har kun plass til så mange elementer du sier, den over har 6 elementer, ingen flere.
    • Hvorfor er det nyttig? Det tar litt for lang tid å forklare, men det er på grunn av RAM i datamaskinen.

Hard Oppgave 2.8 - while loop

En annen type “loop” som kan brukes. I motsetning til å kjøre en viss mengde ganger kjører den til en sjekk failer. La oss se på hva dette betyr.

Lag et program som henter ut ord fra brukeren helt til brukeren skriver “stop”. Deretter skriv ut alle ordene som ble skrevet.

Løsning
using System;
using System.Collections.Generic;

class Program
{
    static void WriteWords(List<string> words)
    {
        for (int i = 0; i < words.Count; i++)
        {
            Console.WriteLine(words[i]);
        }
    }

    static void Main()
    {
        List<string> words = new List<string>();
        string input = "";

        Console.WriteLine("Write words (write 'stop' to stop)");

        while (input != "stop")
        {
            input = Console.ReadLine();
            if (input != "stop") // Denne linja trengs for å ikke legge ved "stop"
            {
                words.Add(input);
            }
        }

        Console.WriteLine("You wrote:");
        WriteWords(words);
    }
}
#include <iostream>
#include <vector>
#include <string>

void WriteWords(const vector<string>& words) {
    for (int i = 0; i < (int)words.size(); i++) {
        std::cout << words[i] << std::endl;
    }
}

int main() {
    vector<string> words;
    string input;

    std::cout << "Write words (write 'stop' to stop)\n";
    while (true) {
        std::getline(cin, input);
        if (input == "stop") break;
        words.push_back(input);
    }

    std::cout << "You wrote:\n";
    WriteWords(words);
    return 0;
}
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    static void writeWords(List<String> words) {
        for (int i = 0; i < words.size(); i++) {
            System.out.println(words.get(i));
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<String> words = new ArrayList<>();

        System.out.println("Write words (write 'stop' to stop)");
        while (true) {
            String input = scanner.nextLine();
            if ("stop".equals(input)) break;
            words.add(input);
        }

        System.out.println("You wrote:");
        writeWords(words);
    }
}
use std::io::{self, Write};

fn write_words(words: &Vec<String>) {
    for i in 0..words.len() {
        println!("{}", words[i]);
    }
}

fn main() {
    let mut words: Vec<String> = Vec::new();
    let mut input = String::new();

    println!("Write words (write 'stop' to stop)");
    loop {
        input.clear();
        // Denne brukes for å "flushe" terminalen i noen tilfeller
        print!("");
        io::stdout().flush().ok();

        io::stdin().read_line(&mut input).unwrap();
        let trimmed = input.trim();
        if trimmed == "stop" {
            break;
        }
        words.push(trimmed.to_string());
    }

    println!("You wrote:");
    write_words(&words);
}
package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func writeWords(words []string) {
    for i := 0; i < len(words); i++ {
        fmt.Println(words[i])
    }
}

func main() {
    reader := bufio.NewReader(os.Stdin)
    var words []string

    fmt.Println("Write words (write 'stop' to stop)")
    for {
        input, _ := reader.ReadString('\n')
        input = strings.TrimSpace(input)
        if input == "stop" {
            break
        }
        words = append(words, input)
    }

    fmt.Println("You wrote:")
    writeWords(words)
}

Uendelig loop?

Hvis du vil ha en uendelig loop kan du bruke en boolean til dette.

while (true)
{
    // dette vil kjøre for alltid
}

Andre konsepter dere kan og bør se på:

  • class
    • en beholder for data
    • brukes som oftest for å representere ting, objekter
      • Eksempel: Person
        • firstname, lastname, age, job også videre
  • Dictionary
    • Er som en liste, men kan inneholde mer kompliserte strukturer
  • Events
  • Generics