Håkan Brorson
Visual Studio
Innan vi kan komma igång med programmeringen, måste vi först installera Visual Studio.
Du kommer att installera det program som du kommer att skriva kod i när du programmerar och sedan lära dig att skapa ditt första program.
Tanken är att ni ska lära er grunderna genom att göra textbaserade program, d.v.s. program utan grafik, för att sedan kanske prova att skapa ett 2-dimensionella spel med MonoGame.
C# (uttalas C sharp) är ett programmeringsspråk som har funnits sedan år 2000 och som utvecklas av Microsoft.
Det har historiskt främst använts för att skapa program som kan köras på datorer som använder Windows men kan sedan några år tillbaka också användas för att skapa program som körs på telefoner, surfplattor, Mac och Linux.
Namnet C# kommer från att C# liknar programmeringsspråken C och C++, #-tecknet kommer från musikens ♯ som innebär att en ton ska höjas.
Tanken med namnet är att man ska tänka att C# är en nyare, bättre variant av de andra C-språken.
När man programmerar i C# så gör man det genom att skriva kod i vanliga textfiler som man ger filändelsen .cs.
Man kan använda vilken texteditor som hels, men en stor fördel är att använda en IDE
( Integrated Development Environment)
IDE är gjort för att man ska programmera med, de har en texteditor och så brukar en IDE innehålla ett enkelt sätt att konvertera kod som man har skrivit till ett körbart program.
En IDE har ofta många andra smarta funktioner som gör det lättare och snabbare att programmera.
Det finns en mängd IDE att välja på men när vi programmera i C# så är den vanligaste Visual Studio.
På webbsidan www.visualstudio.com
Den vi ska ladda ner är:
"Visual Studio Community"
När du kör installationsprogrammet möts du av ett fönster som liknar detta.
När man installerar Visual Studio får man välja vilken typ av program som man vill kunna skapa och vilka programmeringsspråk man vill kunna använda.
Ju fler programtyper som man vill kunna skapa, desto mer plats kommer installationen ta på din hårddisk.
Vi kommer att skapa program i C# för Windows och behöver då bara välja alternativet:
".NET desktop development"
1. Create a new project
2. Skriv "console app (.NET Framework)" och dubble klicka.
3. Skriv in ett namn på vad projektet ska heta.
Och tryck på kappen "
Next"
4. Tryck på "Creat"
för att skapa projektet
Det är tradition att skriva "Hello World"
Detta är ett program som skriver ut texten ”Hello world” på skärmen.
Tanken är att man på detta sätt får se den minsta möjliga kod som krävs för att få ett fungerande program.
När man skapar ett nytt program så skapas filen Program.cs där vi skriver koden som bestämmer vad programmet ska göra.
Nästa slide finns koden för hur vi man skriver ut Hello World
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace Hello_World
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Press Enter Key to Exit..");
Console.ReadKey();
}
}
}
Raden Console.WriteLine("Hello, World!"); gör så att programmet kommer skriva ut texten Hello world när det körs, den finns alltså med från början i varje program man skapar.
För att testa ditt program så behöver du bara trycka på knappen med en grön "play-pil" i verktygsfältet (eller genom menyn Debug -> Start Debugging eller genom att trycka på F5).
När du kör programmet så öppnas ett konsolfönster.
Texten Hello world har skrivits ut.
Press any key to close this window...
Microscope and calculator, 1952
Commodore 64
Console.WriteLine("Här är lite text.");
// Efter två snedstreck så kan man skriva vad man vill
// Detta är en kommentar
Console.WriteLine("Denna text kommer på en ny rad.");Notera också att man kan införa hur många tomma rader man vill på vilka ställen man vill i koden, detta påverkar inte programmet men kan göra det lättare att se vilka delar av programmet som hör ihop.
Console.WriteLine("Denna text kommer på en ny rad.");
/*
Man kan skriva kommentarer på flera
rader på detta sätt.
*/
Console.WriteLine("Den här texten kommer också på en ny rad.");
// Console.WriteLine("Denna text skrivs inte ut");
// Man kan göra nya rader i koden före och efter plustecknen
Console.WriteLine("Denna texten kommer " +
"på samma rad när programmet " +
"körs.");
Kommentarerna i ett program brukar som sagt användas för att förklara delar av koden som kan vara lite svår att förstå vid en första anblick men de kommer i denna bok dessutom användas för att förklara nya programmeringskoncept.
Ställ dig själv frågan "Kommer jag kunna förstå all kod i mitt program om ifall jag stänger ner det nu och öppnar det igen om två månader?" Om svaret är ja behöver du inte skriva någon kommentar, annars bör du göra det.
Hur man formaterar koden man skriver har egentligen ingen större betydelse för koden.
Precis som i fallet med kommentarer kan vettig formatering hjälpa dig själv och andra att lättare läsa och förstå din kod.
De flesta moderna utvecklingsverktyg hjälper dig med att formatera din kod.
Det viktigaste man ska göra är att indentera sin kod. Indentera är svengelska för att göra indrag i marginalen, d.v.s. att börja skriva en bit in på raden.
Man formaterar sin kod med hjälp av tabbar.
Främst gäller detta när man skapar kodblock med hjälp av "{" och"}". Ett exempel på det kan vi se i följande kodsnutt:
namespace Hello_World
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Vad heter Sveriges största sjö?");
string rättSvar = "vänern";
string användarensSvar = Console.ReadLine();
string användarensSvarSmå = användarensSvar.ToLower();
// Gör jämförelserna utan hänsyn till stora/små bokstäver
if (användarensSvarSmå == rättSvar)
{
Console.WriteLine("Du svarade rätt.");
}
if (användarensSvarSmå != rättSvar)
{
Console.WriteLine("Du svarade fel.");
}
}
}
}
Console.Write
Console.WriteLine
För att skriva ut en textsträng i konsolfönstret använder man metoden Console.WriteLine()
Vill vi till exempel skriva ut texten Hello World!
Man kan även skriva ut uträkningar och felmeddelande
Det är viktigt att skriv exakt, stor bokstav, parantes, citationstecken och avsluta med semikolon.
Console.WriteLine("Hello World");System betyder att du använder system-biblioteket i ditt projekt.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Hello_World
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World");
Console.ReadKey();
}
}
}
Namn på klassen och även projektet
I Main så startar alltid programmet.
Koden ska skrivas mellan
"måsvingarna" { }
Console.ReadKey(); gör så att programmet pausas, innan det stäng av
Console.Write
Gör ingen radbrytning
Console.Write("Hello World");Console.WriteLine
Gör en radbrytning
Gör så att texten som kommer efter, kommer på raden under
Console.WriteLine("Hello World");
Console.WriteLine("Hello World");Det går att skriva ut text på en eller flera rader.
Glöm inte " (dubbelfnutt)
när du skriver text
Console.WriteLine("Dagens datum är: " + "2019-03-18");Skriva ut flera textstränger med hjälp av "+"
Glöm inte att använda citationsteckena!
Observera skillnaden mellan dessa två operationer:
Console.WriteLine("1 + 1");
Console.WriteLine(1 + 1);| int |
Sparar heltalsvärden (int står för integer som är engelska för heltal). Kan ha heltalsvärden mellan -2 147 483 648 och 2 147 483 647. |
|---|---|
| double | Sparar decimaltal. Kan innehålla väldigt små och stora tal, upp till 15 siffrors noggrannhet. |
| string | Largar text (behandlar siffror som text) |
| char | Lagrar tecken, exempelvis "C" |
|
boolean |
Kan enbart lagra true (sant) eller false (falskt) |
| Datatyp | Bitstorlek | Min-värde | Max-värde |
|---|---|---|---|
| byte | 8 | -128 | 128 |
| short | 16 | -32 768 | 32 768 |
| int | 32 | -2147 483 648 | 2147 483 648 |
| long | 64 | ≈ −9 × 10^18 | ≈ 9 × 10^18 |
| Datatyp | Bitstorlek | Min-värde | Max-värde |
|---|---|---|---|
| float | 32 | ≈ −3.4 × 10^38 | ≈ 3.4 × 10^38 |
| double | 64 | ≈ −1.7 × 10^308 | ≈ 1.7 × 10^308 |
boolean user = true;
boolean password = false;int
double
string
char
// Deklarera tre variabler och ge dem värden
string meddelande = "Hej!";
string namn = "John Johnsson";
string yrke = "Programmerare";
// Skriv ut text till användaren
Console.WriteLine(meddelande);
Console.WriteLine("Jag heter " + namn + ", mitt yrke är " + yrke);
// Ändra värdet på variabeln meddelande
meddelande = "Hej då!";
Console.WriteLine(meddelande);
Vilken sorts variabel
Ett namn på variablen
Texten som ska sparas
Ligga mellan dubbelfunttarna
= tilldela innehållet
Variablerna har fått namn som meddelande, namn och yrke istället för message, name och occupation.
Man kan även använda de svenska bokstäverna å, ä och ö i sina variabelnamn om man vill.
Det är vanligt att använda enbart engelska namn när man programmerar eftersom detta är en förutsättning om man t.ex. vill be om hjälp på internet av andra programmerare som inte kan svenska.
Det går inte att deklarera (skapa) två variabler med samma namn.
Ett variable namn är case sensitivity
int tal och int Tal inte är samma varibel
int first_number;
first_number = 10;
Console.WriteLine( "First number = " + first_number );int first_number, second_number, answer;
first_number = 10;
second_number = 20;
answer = first_number + second_number;
Console.WriteLine("Addition Total = " + answer );Exempel olika sätt att tilldela
char varCharacter = 'e';
String varWord = "Hello";
Console.WriteLine( varCharacter + varWord );När man deklarera variabler av tecken eller texter så kan man använda både ' (enkla citattecken) och " (dubble citattecken)
plus, minus, delat, gånger
i++;
int a = 7;
int b = 4;
// c får värdet 11
int c = a + b;
// d får värdet 3
int d = a - b;
// e får värdet 28
int e = a * b;
// f får värdet 1.
// Egentligen är 7 / 4 = 1,75 men alla
// decimaler "huggs bort" vid heltalsberäkningar
int f = a / b;
Om du utför en beräkning, t.ex. en division, med enbart heltal så kommer svaret att vara ett heltal även om det egentligen borde vara ett decimaltal.
// a får värdet 1
double a = 7 / 4;
// b får värdet 1.75;
double b = 7.0 / 4;
// c får värdet 1.75
double c = (double)7 / 4;Notera vad som händer vid division av två heltal: svaret blir också ett heltal oavsett om det egentligen borde vara ett decimaltal. Vid divisionen ovan så är 7/4 = 1,75 men decimalerna ”huggs av” och resultatet av divisionen blir 1.
Om något av talen vid division är en double så kommer resultatet att bli en double också och inga decimaler försvinner.
int tal1 = 10;
int tal2 = 7;
// Alternativ 1
int svar = tal1 - tal2;
Console.WriteLine("Svaret är " + svar);
// Alternativ 2
Console.WriteLine("Svaret är " + (tal1 - tal2));Du måste inte spara resultat av varje beräkning du gör i en variabel om du bara vill skriva ut svaret till användaren.
Det går bra att skriva beräkningar i Console.WriteLine, det är oftast lättare att se vilken beräkning som görs ifall man sätter den inuti en parentes.
// a får värdet 1
int a = 1;
int a = a + 1;
a++;
// Nu är a = 2
a--;
// Nu är a = 1 igen
Något som också är väldigt vanligt är att öka eller minska värdet av en variabel med 1.
Man kan då använda ++ eller -- och skriva det direkt efter namnet på variabeln som ska ändras, t.ex.
Console.ReadLine();
Konvertering
int.Parse
double.Parse
Med hjälp av kommandot Console.ReadLine() så kan du som användare skriva in text och tal i Console-fönstret.
När programmet kommer till raden med Console.ReadLine() så kommer det att stanna där och vänta på att användaren skriver in någonting och sedan trycker på enter.
Console.WriteLine("Skriv ditt namn");
// Läs in användarens namn
string namn = Console.ReadLine();
Console.WriteLine("Hej " + namn);Pausar till användaren skriver något
Spara i variablen
namn
När man ett tal från användare via Console.ReadLine() så är den en string och för att kunna göra en uträkning så måste man konvertera över den till heltal eller decimal.
Det finns inga inbyggda sätt i C# att läsa in tal från användaren.
Det man istället får göra är att läsa in text från användaren och sedan konvertera texten till ett tal.
Console.WriteLine("Hej! Hur gammal är du?");
// Läs in åldern och konvertera till int
string ålderText = Console.ReadLine();
int ålder = int.Parse(ålderText);int.Parse och double.Parse och texten som ska konverteras skrivs i parentesen.
Notera att decimaltal i C#-kod skrivs med punkt och inte kommatecken vilket är fallet i engelsktalande länder, men när du skriver in decimaltal som användare av programmet så använder du kommatecken om din dators språkinställning är svenska.
Console.WriteLine("Hej! Hur gammal är du?");
// Läs in åldern och konvertera till int
string ålderText = Console.ReadLine();
int ålder = int.Parse(ålderText);
// Beräkna hur gammal personen är om 5 år
int ålderOmFemÅr = ålder + 5;
Console.WriteLine("Om 5 år är du " + ålderOmFemÅr + " år gammal");
// Läs in användarens längd i meter
Console.WriteLine("Hur lång är du? Svar i meter.");
string längdText = Console.ReadLine();
double längd = double.Parse(längdText);
// Beräkna hur lång personen vore om hen var 10 cm längre
double ökadLängd = längd + 0.1;
Console.WriteLine("Om du var 10 cm längre skulle du vara " + ökadLängd + " m.");
Konvertera heltal till decimaltal (d.v.s. spara värdet av en int-variabel i en double-variabel) så behöver man inte skriva någonting särskilt,
men däremot behöver man göra det för att omvandla ett decimaltal till heltal.
int a = 4;
int b = 7;
double c = 5.61;
// Konvertering från double till int
a = (int)c;
// Konvertering från int till double sker automatiskt
c = a;if
else if
else
switch
Sant
Falskt
En if-sats är består av ett booleskt uttryck (uttalas boolskt), ett uttryck som är antingen sant eller falskt, följt av ett kodblock som bara kommer att köras om det booleska uttrycket är sant.
| Logiska villkor | Notation |
|---|---|
| Lika med | == |
| Inte lika med | != |
| Mindre än | < |
| Minde än och lika med | <= |
| Större än | > |
| Större än och lika med | >= |
| Logiskt AND(och) | && |
| Logiskt OR(eller) | || |
if (logiskt uttryck) {
Operation/Operationer …
}Exempel på nästa slide
Exemple - If-sats
Console.WriteLine("Hur gammal är du? Svara i hela antal år.");
int ålder = int.Parse(Console.ReadLine());
if (ålder >= 18)
{
Console.WriteLine("Du är minst 18 år gammal, du får ta körkort.");
}
if (ålder >= 15)
{
Console.WriteLine("Du är minst 15 år gammal, du får köra moped.");
}
if (ålder < 15)
{
Console.WriteLine("Du är för ung för att köra moped.");
}
Det går också att använda if-satser för att undersöka värden för strängar.
Kom ihåg att alltid använda == när du undersöker ett värde i en
if-sats, d.v.s. två ==
Ett = använder man när man ska tilldela en variabel ett värde
Console.WriteLine("Vem var statsminister i Sverige år 1970?");
string användarensSvar = Console.ReadLine();
if (användarensSvar == "Olof Palme")
{
Console.WriteLine("Du svarade rätt!");
}C# är case sensitive vilket innebär att versaler och gemener åtskiljs.
En jämförelse som är skiftlägeskänslig skulle leda till att strängarna "ord" och "ord" är lika, men inte strängarna "ord" och "Ord".
En dator använder en teckenkod som heter ASCII
Datorn ser istället siffror.
Till exempel:
Stora A är 41
Lilla a är 61
Kod-exempel på nästa slide
Console.WriteLine("Vad heter Sveriges största sjö?");
string rättSvar = "vänern";
string användarensSvar = Console.ReadLine();
string användarensSvarSmå = användarensSvar.ToLower();
// Gör jämförelserna utan hänsyn till stora/små bokstäver
if (användarensSvarSmå == rättSvar)
{
Console.WriteLine("Du svarade rätt.");
}
if (användarensSvarSmå != rättSvar)
{
Console.WriteLine("Du svarade fel.");
}string användarensSvar = Console.ReadLine().ToLower();Detta går bra för att konvertera till små bokstäver direkt
if (användarensSvar.ToLower() == rättSvar)
{
Console.WriteLine("Du svarade rätt.");
}Går bra att sätta ToLower när vi gör jämförelsen
Med hjälp av booleriska uttrycken && och || så kan vi kontrollera flera uttryck är sanna i en if-sats.
int num = 150;
if(num > 100 && num < 200){
Console.WriteLine("Number: " + num);
}int num = 50;
if(num < 100 || num > 200){
Console.WriteLine("Number: " + num);
}Funkar för tal mellan 100 och 200
Använder och &&
Funkar för tal som är mindre än 100 och större än 200
Använder eller ||
if (logiskt uttryck) {
Operation/Operationer …
} else {
Operation/operationer …
}Sant
Falskt
Exempel - else-satsen
int number = 5;
if (number > 6) {
Console.WriteLine("Det här är IF-satsen")
} else {
Console.WriteLine("Det här är ELSE-satsen")
}Exempel - else-satsen
Kod på nästa slide
I detta exemplet så ska tända eller släcka en lampa.
Om lampan är tänd "1" så när vi trycker på knappen så ska den ändras till av "0"
isLampOn = 1 //så är lampan tänd
isLampOn = 0 //så är den släkt
int isLampOn = 1; // Lampan är tänd
if (isLampOn == 1)
{
isLampOn = 0; // isLampOn till 0, lampan släcks.
}
else
{
isLampOn = 1; // isLampOn till 1, lampan tänds.
}
Console.WriteLine("Status på lampan: "+isLampOn);Falskt
Sant
Falskt
Sant
Falskt
Sant
Falskt
Sant
if (logiskt uttryck) {
Operation/Operationer …
} else if (logiskt uttryck) {
Operation/Operationer …
} else {
Operation/Operationer …
}Kod
nästa
slide
int totalkonstnad = 400;
if (totalkonstnad >= 2000) // större eller lika med 2000
{
Console.WriteLine("Rabatten är 20%");
}
else if (totalkonstnad >= 1500) // större eller lika med 1500
{
Console.WriteLine("Rabatten är 15%");
}
else if (totalkonstnad >= 1000) // större eller lika med 1000
{
Console.WriteLine("Rabatten är 10%");
}
else if (totalkonstnad >= 500) // större eller lika med 500
{
Console.WriteLine("Rabatten är 5%");
}
else // Om ingen av ovanstående if-satser är uppfyllda
{
Console.WriteLine("Rabatten är 0%");
}switch – Bra om man jämför samma variabel om och om igen
Switch-satsen används istället för if-satsen när man har en flervalssituation.
Switch är en kompakt version av if och är effektiv när man ska välja mellan ett specifikt antal operationer.
Switch kan innehålla en variable eller ett uttryck, heltal, char eller String
Console.WriteLine("Detta program kan berätta vilka de 5 bästa filmerna genom tiderna är. Vilken position vill du veta om?");
string val= Console.ReadLine();
switch (val)
{
case "1":
Console.WriteLine("Star Wars");
break;
case "2":
Console.WriteLine("Gudfadern");
break;
case "3":
Console.WriteLine("Gudfadern del 2");
break;
case "4":
Console.WriteLine("The Dark Knight");
break;
default:
Console.WriteLine("Schindler's List");
break;
}Console.WriteLine("Detta program kan berätta vilka de 5 bästa filmerna genom tiderna är. Vilken position vill du veta om?");
string val= Console.ReadLine();
if (val == "1")
{
Console.WriteLine("Star Wars");
}
else if (val == "2")
{
Console.WriteLine("Gudfadern");
}
else if (val == "3")
{
Console.WriteLine("Gudfadern del 2");
}
else if (val == "4")
{
Console.WriteLine("The Dark Knight");
}
else if (val == "5")
{
Console.WriteLine("Schindler's List");
}
else
{
Console.WriteLine("Du valde inte rätt tal.");
}
String typeOfDay = "Monday";
switch (typeOfDay)
{
case "Monday":
Console.WriteLine("Start of work week");
break;
case "Tuesday":
case "Wednesday":
case "Thursday":
Console.WriteLine("Midweek");
break;
case "Friday":
Console.WriteLine("End of work week");
break;
case "Saturday":
case "Sunday":
Console.WriteLine("Weekend");
break;
default:
Console.WriteLine("Invalid day of the week: " + typeOfDay);
break;
}Vi är två personer som ska dela på äpplen, får bara ta hela äpplen
= 0
rest (det som blir över)
= 1
= 0
= 1
if(2 % 2 == 0)
Sant
Falskt
Sant
Falskt
Skriver i C# och får ut om det är true eller false
if(3 % 2 == 0)
if(4% 2 == 0)
if(5 % 2 == 0)
Hur blir det om man kolla mot 3 istället?
Nästa slide
Nu kolla vi mot 3 istället
= 0 if(3 % 3 == 0) True
= 1 if(4 % 3 == 0) False
= 2 if(5 % 3 == 0) False
= 0 if(6 % 3 == 0) True
= 1 if(7 % 3 == 0) False
= 2 if(8 % 3 == 0) False
Modulus är en rest-operator, dvs. den beräknar resten (istället för kvoten) vid division.
Tecknet för modulus är % (procenttecknet)
Modulus blir t.ex. väldigt användbart när vi ska undersöka delbarhet.
Om a är delbart med b så ger a % b resultaten 0 (ingen rest).
Console.WriteLine(5 % 2);
// 1
Console.WriteLine(7 % 8);
// 7
Console.WriteLine(26 % 13);
// 0Console.WriteLine("Skriv ett tal: ");
int i = int.Parse(Console.ReadLine());
if ( i % 2 == 0 )
{
Console.WriteLine("Jämnt tal: " + i);
}
else {
Console.WriteLine("Udda tal: " + i);
}| Tal | Rest |
|---|---|
| 1%2 | 1 |
| 2%2 | 0 |
| 3%2 | 1 |
| 4%2 | 0 |
| 5%2 | 1 |
Modulus är en matematisk term där vi räknar ute resten det som blir över.
int x = 7;
int y = 2;
int mod = x % y;
// mod blir då resten när vi delar 7 med 2 --> mod = 1
int x = 8;
int Y = 4;
int mod = x % y;
// Här blir mod = 0, för att vi får ingen rest när vi delar 8 med 4
int x = 9;
int y = 5;
int mod = x % y;
// Resten blir --> mod = 4Vi ska bearbeta strängar och se är hur tecknen i en sträng numreras.
Platsen som ett tecken har i en sträng kallas för tecknets index och är helt enkelt tecknets plats i nummerordning där det första tecknet har index 0.
| Tecken | P | r | o | g | r | a | m | m | e | r | i | n | g |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
Med hjälp av vad som kallas för en range på engelska, ungefär intervall eller område på svenska, så kan man klippa ut en del av en sträng.
string text = "Programmering";
// Klipp ut en ny text från index 2 och 3
string delAvText = text[2..4]; // og
Console.WriteLine(delAvText);
// Skriv ut variabeln text från index 5 till slutet
Console.WriteLine(text[5..]); // ammering
// Skriv ut variabeln text från index 0 till 6, alltså de första 7 tecknen
Console.WriteLine(text[..7]); // Program
Börjar på bokstaven nr 2
(bokstaven finns kvar)
Slutar på bokstaven 4
(bokstaven försvinner)
Utveckla vidare så kan man leta efter tecken i en sträng.
För att åstadkomma detta använder programmet också en metod som kan användas med strängar som heter IndexOf och letar reda på den första förekomsten av ett tecken eller sträng inuti en annan sträng.
Console.WriteLine("Vänligen skriv in ditt förnamn och efternamn");
string helaNamnet = Console.ReadLine();
// Hitta mellanslaget i namnet
int mellanslagsIndex = helaNamnet.IndexOf(" ");
// Ta reda på förnamn och efternamn
string förnamn = helaNamnet[..mellanslagsIndex];
string efternamn = helaNamnet[(mellanslagsIndex + 1)..];
Console.WriteLine("Ditt förnamn är " + förnamn + ".");
Console.WriteLine("Ditt efternamn är " + efternamn + ".");index+1 så att du får index som är efter mellanslag
while
for
do while
Vilken loop ska man använda?
En loop kan illustrera med hjälp av flödesschemat
Sant
Falskt
while (villkor) {
operationer
}int i = 0; // Deklarerar variabelen i, tilldelas 0.
while (i < 5) // Så länge i är mindre än 5, ska loppen köras.
{
Console.WriteLine("Hello, World!"); // Skriver ut "Hello, World!".
i++; // i = i + 1
}i++; ökar i med ett varje gång den körs
Så i++; funkar på samma sätt som i=i+1;
i++;i=i+1;int i = 0;
while (i < 5)
{
Console.WriteLine("Hello, World!");
i++;
}Skapar variablen i och innehåller siffran 0
Kollar om i är större än 5
"slutar på när i är 4"
Ökar i med 1
i=i+1;
Sant
Falskt
for (startvärde; villkor; förändring){
operation / operationer
}// for-loopen upprepar operationen så länge som i är mindre än 5
for (int i = 0; i < 5; i++)
{
// Skriver ut textsträngen "Räknare: " samt värdet på variabeln i.
Console.WriteLine("Räknare: " + i);
}Skapar variablen i och innehåller siffran 0
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Räknare: " + i);
}Kollar om i är större än 5
"slutar på när i är 4"
Ökar i med 1
i=i+1;
Sant
Falskt
do
{
operationer
} while (villkor);int i = 0;
// Start på Do-loopen
do
{
// skriver ut text och variablen
Console.WriteLine("i har värdet: " + i);
i++; // ökar i med 1
} while (i < 3); // Kontrollerar om värdet på i är mindre än 3
int i = 0;
do{
System.out.println("i har värdet: " + i);
i++;
}while (i < 3);
Skapar variablen i och innehåller siffran 0
Kollar om i är större än 5
"slutar på när i är 4"
Ökar i med 1
i=i+1;
Console.WriteLine("Skriv ett tal: ");
int j = int.Parse(Console.ReadLine());
do
{
Console.WriteLine("i: " + j);
j++;
} while (j < 10);
Console.WriteLine("Värde efter loopen: " + j);Console.WriteLine("Skriv ett tal: ");
int i = int.Parse(Console.ReadLine());
while (i < 10)
{
Console.WriteLine("i: " + i);
i++;
}
Console.WriteLine("Värde efter loopen: " + i);while-loop
do while-loop
| Typ av loop | Används när man... |
|---|---|
| while | ... inte vet hur många gånger loopen behöver köras. |
| for | ... vet hur många gånger loopen behöver köras. |
| do while | ... inte vet hur många gånger loopen behöver köras men man vill vara säker på att den körs minst en gång. |
In- och output anges med denna symbol
Programet
startar eller slutar
Pilar sammanbindningen flödesdiagrammen och ger en bättre överblick över programmet än vad pseudokod gör.
Något utförs.
Kallas process och rymmer beräkningar och händelser som inte omfattas av de andra symbolerna, d.v.s ej val eller in- och utput.
Ett val mellan två alternativ.
Denna symbol betyder val eller beslut.
(if och switch) men även utgöra en del av en loop (for, while och do..while).
if (tal < 10)
{
tal = 10;
}if (tal < 10)
{
tal = 1;
}
else
{
tal = tal / 10;
}
do{
System.out.print(tal);
tal++;
}while(tal<10);while(tal<10){
System.out.print(tal);
tal++;
}Ladda ner projektet figurUppgifterna_C.zip
Zippa upp mappen och lägg i mappen repos
C:\Users\hakan.brorson_ksgyf\source\repos
Öppnare i Visual Studio välj "Open a local folder"
Viktigt att tänka på!
Alla koordinater anges från fönstrets övre vänstra hörn till figurens övre vänstra hörn.
x ökar åt höger.
y ökar nedåt. (tvärtemot matematikens värld)
Så längst upp till vänster ligger koordinaten (0,0)
X
Y
| SetColor(Color.blue) | Från och med nu ritas allt med blått. |
|---|---|
| DrawRect(x, y, bredd, höjd) | Icke ifylld rektangel, värden sätts med (int). |
| DrawOval(x, y, bredd, höjd) | x,y anges även här till ett tänkt “hörn”. |
| FillRect() och FillOval() | För att rita “tårtbitar” eller “glada munnar”. |
| DrawLine(x1,y1, x2,y2) | En linje från punkt ett till punkt två. |
| SetColor(255,255,0); | Ange RGB med int 0-255 |
|---|---|
| SetColor(1f, 0.5f, 0); | Ange RGB med float 0-1 |
| SetColor(myColor); | Notera att Color inte behövs framför myColor |
if (figurNr == 1)
{
// Ritar en svart kvadrat.
// Hur gör du fler utan att skriva DrawRect fler gånger?
SetColor(Color.Black);
DrawRect(250, 200, 40, 40);
}När programmet körs första gången så syns ett fönster med en scrollist längst ner som står på noll. Fyrkanten som ritas inuti if-sats noll syns i fönstret.
Genom att dra i scrollisten så ser man det som ritas i de andra if-satserna. Alltså elevens lösningar på de andra uppgifterna.
Eleven ska rita upp figurerna som hittas i “prisskåpet”.
Den enda grundregeln som finns är att ett ritkommando (t.ex. drawRect eller fillOval) bara får användas EN gång per uppgift.
DrawRect och DrawOval får såklart användas en gång vardera men inte mer.
Uppgifterna måste lösas genom att loopa och använda if-satser och variabler.
Eleven får göra hur som helst så länge hen håller sig inom if-satsen för den uppgiften.
För en större utmaning finns avancerade regler på de flesta uppgifter.
För det mesta spelar inte storlek eller färg så stor roll på uppgifterna, men en del uppgifter är det viktigare på. En del uppgifter blir märkbart lättare om
Använda ritkommando EN gång.
if (figurNr == 1)
{
// Ritar en svart kvadrat.
SetColor(Color.Black);
DrawRect(220, 200, 40, 40);
}Fortsätt med Uppgift 1 på nästa slide
Du får inte använda något ritkommando mer än EN gång.
Avancerat: Du får bara använda EN variabel: loopvariabeln.
if (figurNr == 1)
{
// Ritar en svart kvadrat.
// Hur gör du fler utan att skriva DrawRect fler gånger?
SetColor(Color.Black);
for (int i = 220; i < 571; i += 70)
{
DrawRect(i, 200, 40, 40);
}
}Vi har tidigare spara värden i variabler, exempelvis:
int tal = 10; Variabeln tal, av typen int (heltal), tilldelas värdet 10.
Men tänk om vi har hundra värden som vi vill spara samtidigt? Tusen värden? En miljon värden?
För att kunna hantera en väldigt stor mängd av data samtidigt, använder vi oss av arrayer
(även kallat fält eller listor).
Nu kan vi börja spara flera värden i en och samma variabel.
int[] arr = {22, 8, 97, 3};Om man tänker en variabel som ett objekt/låda som innehåller ett värde.
Array istället har flera lådor "Byrå".
För att komma åt en låda,
så har varje låda ett index.
Index börja alltid på 0
1
0
1
2
3
4
5
6
7
8
9
10
11
Efter vald datatyp så behöver vi skriva två hakparenteser [ ] så kompilatorn vet att det är ett fält vi vill initiera.
Indexering börjar alltid på 0, det vill säga första värdet får index 0. Andra värdet får index 1 och så vidare.
Alla värden i en array måste vara av samma datatyp. Exempelvis kan du inte spara en double i ett fält med datatypen int.
Det går inte ändra antal element i en array efter att den har skapats.
En array är uppbyggd:
datatyp[] namn = new datatyp[ antal element ];int[] field = new int[4];Vi har nu skapat ett fält av datatypen int med namnet field, fältet innehåller fyra element och under varje element står index för respektive element.
Eftersom vi inte initierade något startvärde för elementen i fältet så har de alla automatiskt tilldelats värdet 0.
int[] field = new int[4];field[1]
field[0]
field[2]
field[3]
0
0
0
0
field
Nu kan vi börja att spara ned värden i fältet
Varje element nås med hjälp av dess index.
field[0] = 22;
field[1] = 8;
field[2] = 97;
field[3] = 3;field[1]
field[0]
field[2]
field[3]
22
8
97
3
field
Det går att skapa en array och tilldela på samma gång.
Datatyp[] namn = { värde, värde, värde, värde, … } ;field[1]
field[0]
field[2]
field[3]
22
8
97
3
field
int[] field = {22, 8, 97, 3};Ifall arrayen inte har initierade värden eller många element som inte har initierade värden så är metod 1 att föredra.
int[] field = new int[4];int[] field = {22, 8, 97, 3};field[0] = 22;
field[1] = 8;
field[2] = 97;
field[3] = 3;Hitta position
Söka position
Hitta jämna tal - Modulus
Nu ska vi testa att summera alla heltal i en array.
Vi en variabel med namn total och en array med namn field som innehåller fyra heltal:
int total = 0;
int[] field = {20, 33, 40, 55};for (int i = 0; i < field.Length; i++)
{
total = total + field[i];
}
Console.WriteLine("Total: " + total);Utskrift:
"Total: 148Får automatisk längden på loopen
Exempel på nästa slide
int[] field = { 5, 6, 33, 54, 77, 87, 32, 78, 98 }; // Array vi ska söka igenom
int searched = 78; // Det eftersökta värdet
int pos = 0; // För att kunna spara ned positionen (index)
Boolean found = false;
while (pos < field.Length && !found)
{
if (field[pos] == searched)
{
found = true; // Vi har hittat värdet
}
else
{
pos++; // Öka positionsvariabeln
}
}
// Om vi sedan vill skriva ut positionen
if (found == true)
{
Console.WriteLine("Värdet hittades på index: " + pos);
}
// Eller om vi inte hittade värdet
else
{
Console.WriteLine("Värdet kunde ej hittas i den genomsökta array");
}Ett vanligt misstaget är när man försöka komma åt ett element som inte existerar.
Om vi tar ett enkelt exempel så kommer det vara enklare att sedan när vi går in på vanliga algoritmer.
Vi skapar ett fält och tänker sedan spara ned ett värde i fältet.
int[] field = new int[10];
int[10] = 5;Detta ger en error för field har 10 element, med index räckvidd från 0 till 9.
0,1,2,3,4,5,6,7,8,9
Vi ska skriv ett programsegment som skriver ut antalet element som är udda tal.
int[] field = {2, 20, 3, 13, 15, 3, 9, 10, 1, 5, 8};int count = 0;Vi skapa en räknare som vi kan uppdatera för varje udda tal som vi hittar.
Vi kommer använda oss av en for-loop för att gå igenom Arrayen.
for (int i = 0; i < field.Length; i++)
{
// Om element ej är jämnt delbart med 2 (dvs ojämnt), öka Count med 1.
if (field[i] % 2 == 0)
{
count++;
}
}
Console.WriteLine(count);Inne i for-loopen använder vi en if-sats med villkoret att ifall talet är ej jämnt delbart med 2, det vill säga ett ojämnt tal, så kommer vi öka räknaren count med ett.
Förklaring på modulus på nästa sida
Vi är två personer som ska dela på äpplen, får bara ta hela äpplen
= 0
rest (det som blir över)
= 1
= 0
= 1
if(2 % 2 == 0)
Sant
Falskt
Sant
Falskt
Skriver i C# och får ut om det är true eller false
if(3 % 2 == 0)
if(4% 2 == 0)
if(5 % 2 == 0)
Hur blir det om man kolla mot 3 istället?
Nästa slide
Nu kolla vi mot 3 istället
= 0 if(3 % 3 == 0) True
= 1 if(4 % 3 == 0) False
= 2 if(5 % 3 == 0) False
= 0 if(6 % 3 == 0) True
= 1 if(7 % 3 == 0) False
= 2 if(8 % 3 == 0) False
En illustrera på det här exemplet med en figur kan vi tänka oss det som följande.
Notera hur counter (räknaren) ökar med +1 för varje udda tal.
Skapa en array och fyll med namnen nedan:
Givet array names i koden nedan, som innehåller namn.
{"Erik", "Stina", "Tom", "Gustav", "Amanda", "Elin", "Rebecca", "Hampus"};Hampus
Rebecca
Elin osv …
Lösning på nästa slide
String[] names = {"Erik", "Stina", "Tom", "Gustav", "Amanda",
"Elin", "Rebecca", "Hampus"};
for (int i = 0; i < names.Length; i++)
{
Console.WriteLine(i + 1 + ". " + names[names.Length - 1 - i]);
}Lösning:
Skriv ett program som gör så att de element med jämna index (0, 2, 4 … ) tilldelas deras respektive indexvärde samt att de element med ojämna index får värdet ett.
Med andra ord:
int[] field = new int[25];Index 0: 0
Index 1: 1
Index 2: 2
Index 3: 1
Index 4: 4
Index 5: 1
Index 6: 6 osv..
int[] field = new int[25];
// Gå igenom array
for (int i = 0; i < field.Length; i++)
{
// Kolla ifall index är jämnt
if (i % 2 == 0)
{
field[i] = i;
}
// Om inte jämnt ge det värdet 1
else
{
field[i] = 1;
}
// Skriva ut index med respektive värde
Console.WriteLine("Index " + i + ": " + field[i]);
}
Lösning:
Vi betraktade en Endimensionella Array som listor med värden.
På samma sätt kan vi se en Flerdimensionell Array i två dimensioner som ett rutnät
(matriser med rader och kolumner).
Det medför då att vi får fler index och det brukar beskrivas som fält av fält vilket medför att raderna kan ha olika längd.
Tvådimensionella arrayer är lämpliga att använda om man har information som är tvådimensionell, t.ex. hur en karta ser hur.
Flerdimensionella arrayer används ofta tillsammans med nästlade loopar.
// Skapa en "karta" med 6 tal
int[,] talkarta = new int[2, 3];
talkarta[0, 0] = 1;
talkarta[0, 1] = 2;
talkarta[0, 2] = 3;
talkarta[1, 0] = 4;
talkarta[1, 1] = 5;
talkarta[1, 2] = 6;
// Talet 5 kommer att skrivas ut
Console.WriteLine(talkarta[1, 1]);// Skapa en karta med strängar
string[,] karta = new string[3, 3];
karta[0, 0] = "A";
karta[1, 0] = "B";
karta[2, 0] = "C";
karta[0, 1] = "D";
karta[1, 1] = "E";
karta[2, 1] = "F";
karta[0, 2] = "G";
karta[1, 2] = "H";
karta[2, 2] = "I";
// Skriv ut innehållet i kartan med strängar
for (int y = 0; y < 3; y++)
{
for (int x = 0; x < 3; x++)
{
Console.Write(karta[x, y]);
}
Console.WriteLine();
}| y / x | 0 | 1 | 2 |
|---|---|---|---|
| 0 | A | B | C |
| 1 | D | E | F |
| 2 | G | H | I |
Vi skapar en tvådimensionell array (en tom array) som har 4 rader och 3 kolumner.x
int[,] twoField = new int [4,3];Vill vi sedan redigera eller använda ett element i matrisen så gör vi det enkelt på samma sätt som för endimensionella fallet.
// Sätter in två värden i matrisen
twoField[0,2] = 15;
twoField[2,1] = 7;
// Här lägger vi ihop två celler
int sum = twoField[0,2] + twoField[2,1];
// sum = 15 + 7 = 22
int multi = twoField[0,2] * twoField[2,1];
// multi = 15 * 7 = 105int[,] twoField2 = { {2, 3},
{34, 56},
{44, 654, 43},
{2, 3, 23, 44}};twoField2[1][2] = 15;ArrayList är en inbyggd standardklass i Java som gör det enkelt och smidigt att arbeta med data som kan komma att förändras i antal under arbetets gång.
Om vi behöver förändra hur många lagringsplatser vi har.
Så vet vi från början att vi kan komma att behöva ändra storleken på antalet lagringsplatser så är en ArrayList att föredra över en array.
Vi kan illustrera en ArrayList på liknande sätt som en Array och tänka oss att vi har flera lagringsplatser som bara forsätter
Det är några saker som skiljer sig från när vi deklarerar en ArrayList gentemot en Array.
Istället för [ ], som vi använde för en Array ska vi nu använda, < > istället.
Då vi endast kan spara objekt i en ArrayList så behöver vi ange omslagsklassen vid deklarationen, det vill säga att vi inte kan spara primitiva datatyper i en ArrayList.
Notera parenteserna på slutet av deklarationen också
ArrayList<Integer> numbers = new ArrayList<Integer>();
ArrayList<Character> initials = new ArrayList<Character>();Java har ett par inbyggda kommandon i (containerklassen)
Dessa används bland annat för att ta bort, lägga till, modifiera eller läsa av värden i en lista
Det är samma kommandon för ArrayList som för List, förutom namnet på paketet vi importerar
Om vi väljer att arbeta med ArrayList så behöver vi först importera paketet java.util.ArrayList
Vi kan sedan skapa en lista med Integers som inte kommer att innehålla några element till en början.
// Importera längst upp på sidan
import java.util.ArrayList;
ArrayList <Integer> listEx = new ArrayList<Integer>();För att lägga till ett element, "X", längst bak i listan använder vi den inbyggda metoden
Vi får då resultatet ( sista platsen i listan med index: n)
listEx.add(X);listEx.add(Z,X);listEx.remove(Z);Läsa av och modifiera element
listEx.get(Z);
// Resultatet blir elementet på plats nr Z i listan
listEx.set(Z,X);
// Ersätter elementet på plats Z i listan med XFler användbara egenskaper för arraylist
listEx.size();
// Ger antalet element i listan
listEx.indexOf(X);
// Returnerar index av första förekomsten av elementet X,
// ifall X inte finns i listan så returneras -1Om vi vill gå igenom en lista från början till slut för att t.ex. summera ihop elementen i listan eller kanske för att skriva ut elementen så gör vi det på samma sätt som för ett fält, vi kan använda en for-loop.
int total = 0; // För att kunna summera ihop värdena
for (int i = 0; i < listEx.size(); i++) {
total = total + listEx.get(i); // Räkna ihop totalen
System.out.println(listEx.get(i)); // Skriva ut varje element
}Metod kan vi börja att se som återvinning av kod.
Istället för att skriva liknande kod på flera ställen så kan vi istället göra en metod.
Metoden kan vi anropa istället för att skriva koden om och om igen.
Om vi vill skriva ut veckodagarna två gånger men inte direkt efter varandra.
Console.WriteLine("Måndag");
Console.WriteLine("Tisdag");
Console.WriteLine("Onsdag");
Console.WriteLine("Torsdag");
Console.WriteLine("Fredag");
Console.WriteLine("Lördag");
Console.WriteLine("Söndag");
//Här görs något annat, t.ex inmatning eller beräkningar
//för exemplet är det inte instressant.
Console.WriteLine("Måndag");
Console.WriteLine("Tisdag");
Console.WriteLine("Onsdag");
Console.WriteLine("Torsdag");
Console.WriteLine("Fredag");
Console.WriteLine("Lördag");
Console.WriteLine("Söndag");Istället för att skriva ut samma kod två gånger så kan vi istället
"kapsla in" koden i en metod och anropa metoden.
Utanför Main, inuti class
Main
Skapa metoden
SkrivUtVeckodagar();
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Exmpel1
{
class Program
{
static void SkrivUtVeckodagar()
{
Console.WriteLine("Måndag");
Console.WriteLine("Tisdag");
Console.WriteLine("Onsdag");
Console.WriteLine("Torsdag");
Console.WriteLine("Fredag");
Console.WriteLine("Lördag");
Console.WriteLine("Söndag");
}
static void Main(string[] args)
{
SkrivUtVeckodagar();
//Här körs annan kod
SkrivUtVeckodagar();
}
}
}Vi vill skriva ut texten
"Hello" tio gånger,
texten "world" nio gånger texten "!" åtta gånger.
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Hello");
}
for (int i = 0; i < 9; i++)
{
Console.WriteLine("World");
}
for (int i = 0; i < 8; i++)
{
Console.WriteLine("!");
}Vi vill skriva ut texten
"Hello" tio gånger,
texten "world" nio gånger texten "!" åtta gånger.
static void UpprepaText(string text, int antal)
{
for (int i = 0; i < antal; i++)
{
Console.WriteLine(text);
}
}
static void Main(string[] args)
{
UpprepaText("Hello", 10);
UpprepaText("World", 9);
UpprepaText("!", 8);
}
Metoden använder två inparametrar.
En string för det som ska skrivas ut och en int för antalet gånger.
Vi vill räkna ord i en text. Vi kommer att använda metoden Split
Delar på mellanslag och vi får ut en array av strings med antal ord.
Void inget värde i retur
int returnera ett värde.
static int AntalOrd(string text)
{
string[] delar = text.Split(' ');
return delar.Length;
}
static void Main(string[] args)
{
Console.Write("Mata in en text: ");
string text = Console.ReadLine();
Console.WriteLine("Du matade in " + AntalOrd(text) + " ord!");
}Vanligaste anledningen till att man vill ha en returparameter är om metoden skall skapa något nytt, t.ex. ett resultat av en beräkning som i exempel 3.
Om man inte ska returnera något så deklarera metodens med void.
Metoder som returnera något måste avslutas med return följt av en variabel.
Det finns ingen begränsning på inparametrar.
Men man måste anropa metoden med lika många och av samma datatyp.
Överlagrade metoder bär samma namn som en tidigare metod.
Man kan deklarera två exakt likadana metoder, det som ska skiljas är antalet inparametrar och vilken datatyp
Skillnaden mellan 5 och 5.0 är att 5.0 är ett decimaltal (double), 5 int
static void Main(string[] args)
{
DoSomething();
DoSomething(5);
DoSomething(5.0);
DoSomething(3, "hej");
}
static void DoSomething()
{
//Ingen inparameter alls
}
static void DoSomething(int i)
{
//Inparameter av typen int
}
static void DoSomething(double i)
{
//Inparameter av typen double
}
static void DoSomething(int i, string s)
{
//Två inparametrar
}Vi kommer att göra en enkel miniräknare
Klicka på Create
Nu har vi skapa en Form
Till vänster har vi Toolbox, där har vi knappar och textboxar m.m.
Klicka på häftstiftet för att låsa fliken
label1 - Text: First Number
label2 - Text: Second Number
label3 - Text: Result
label4 - Text: Name: lblResult
button1 - Text: Sum - Name: btnSum
textBox1 - Name: txtNumber1
textBox2 - Name: txtNumber2
Dubbel klicka på button "sum" vilket gör så att du kan skriva kod.
Skriv in följande kod:
private void btnSum_Click(object sender, EventArgs e)
{
int num1, num2, sum;
num1=Convert.ToInt32(txtNumber1.Text);
num2 = Convert.ToInt32(txtNumber2.Text);
sum = num1 + num2;
lblResult.Text = sum.ToString();
}
MessageBox är en klass i C# som visar ett meddelande i ett eget liten fönster.
MessageBox används för att bekräftelser på en uppgift eller för att ge varningar innan en uppgift görs eller är klar.
Skapa ett nytt form.
Lägg till en button.
Dubbel klicka på button och lägg till koden:
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Hello World");
}MessageBox med Title
private void button1_Click(object sender, EventArgs e)
{
string message = "Simple MessageBox";
string title = "Title";
MessageBox.Show(message, title);
}I en MessageBox så kan man även ha Yes och Cancel knappar
private void button1_Click(object sender, EventArgs e)
{
string message = "Do you want to close this window?";
string title = "Close Window";
MessageBoxButtons buttons = MessageBoxButtons.YesNo;
DialogResult result = MessageBox.Show(message, title, buttons);
if (result == DialogResult.Yes) {
this.Close();
} else {
// Do something
}
}Det finns några metoder på en MessageBox
Det går även att lägga till iconer i en MessageBox
string message = "Do you want to abort this operation?";
string title = "Close Window";
MessageBoxButtons buttons = MessageBoxButtons.AbortRetryIgnore;
DialogResult result = MessageBox.Show(message, title, buttons, MessageBoxIcon.Warning);
if (result == DialogResult.Abort) {
this.Close();
}
elseif(result == DialogResult.Retry) {
// Do nothing
}
else {
// Do something
}
Det finns några ikoner på en MessageBox