
Grundläggande programmering 2IS048
Detta är en hemsida som är tänkt att nyttjas som en extra resurs när man försöker lära sig grunderna inom programmering. Hemsidan som sådan är strukturad på så vis att varje grundläggande koncept behandlas inom sin egna sektion (vilka du finner i menyn till vänster). För varje sektion så beskrivs konceptet först kortfattat vilket sedan följs av en uppgiftsförteckning med ett antal övningsuppgifter. Tanken är att du först och främst ska försöka lösa dessa uppgifter på egen hand (annars blir det i slutändan inte särskilt givande) och sedan kontrollera om din implementation fungerar. Om du kör fast eller om du vill jämföra din slutgiltiga lösning så kan du även kika på lösningsförslaget för resp. uppgift.
Längst ned på sidan hittar du slutligen 30 st. olika problem i varierande svårighetsgrad vilka du kan försöka dig på när du känner dig bekväm med samtliga koncept. För dessa problem tillhandahålls inget lösningsförslag. Om du har löst problemet enligt beskrivningen så har du klarat uppgiften, om inte så är det bara att fortsätta försöka. Om du kör fast så är tanken här istället att du felsöker din kod och testar olika implementationer, diskuterar med kollegor eller Googlar på ev. tips. kan nyttjas som ett verktyg för att lära sig programmering genom att öva på uppgifter.
Om du behöver hjälp med att komma igång med Visual Studio, hur man fjärransluter till datasalarna i Ekonomikum eller dylikt så kan du läsa mer om det via länken “Visual Studio” i menyn till vänster eller klicka HÄR
Inledning
För att lösa uppgifterna som du ser på denna sida så behöver du först skapa en konsol-applikation i Visual Studio för språket C#. Var uppmärksam när du skapar detta projekt så att du väljer C# och inte Visual Basic (som är ett annat programmeringsspråk). När du gör detta så kommer du att bemötas av koden som du ser nedan:
using System;
namespace PracticeAssignments // Namnet beror på vad du har döpt ditt projekt till.
{
class Program
{
static void Main(string[] args)
{
// Write to console
Console.WriteLine("Hello World!");
Console.WriteLine("Press the Enter key to exit.");
// Keep the terminal open until the user presses Enter.
Console.ReadLine();
}
}
}
Det är inom metoden Main
som du kommer att skriva din kod, till en början. Om vi kör koden från ovan exempel så kommer vi t.ex. att skriva ut “Hello World!” i konsolen. Konsolen kommer därefter att vänta på att du, eller användaren, klickar på Enter-tangenten innan applikationen stängs ned. Vi nyttjar alltså Console.WriteLine()
för att skriva ut information i konsolen och Console.ReadLine()
för att läsa in information från användaren.
För nästan varje uppgift på denna sida så förväntas det att du nyttjar dessa verktyg för att lösa uppgiften så lägg dem på minnet!
Föreslagen struktur
Då det snabbt kan bli omständigt att skapa en ny konsolapplikation för resp. uppgift så rekommenderar vi till en början att du, till en början, enbart arbetar i Main
-metoden och separerar varje uppgift med hjälp av kommentarer. Dvs. exempelvis enligt nedan:
public class Program
{
static void Main(string[] args)
{
// Uppgift 1 - Att deklarera vs. att instansiera
int x;
...
// Uppgift 2 - Hello, Name!
Console.WriteLine("Enter your name: ");
...
}
}
Där “…” representerar den kod du skriver för att lösa uppgiften.
Ett annat alternativ, något du förväntas nyttja senare oavsett fallet, är att strukturera ditt program med hjälp av metoder. Tanken här är att du skapar en ny, egendefinierad metod för resp. uppgift som du sedan anropar från Main
-metoden. Mer information kring just metoder finner du under sektionen “Metoder” (Hoppa hit!). För att nyttja metoder så skriver man först en ny metod utanför Main
-metoden som i nedan exempel:
public class Program
{
static void Main(string[] args)
{
}
// HÄR, efter den avslutande '}'
// "static void" är något du måste lägga till framför metodnamnet, annars kan vi inte anropa metoden från Main
// Hur en s.k. "metodsignatur" ser ut beskrivs ytterligare under sektionen "Metoder".
static void Uppgift1()
{
int x;
...
}
static void Uppgift2()
{
Console.WriteLine("Enter your name: ");
...
}
}
När du sedan är klar med din implementation, eller om du vill testa den, så behöver du anropa den metod som du har skrivit från Main
-metoden. Exempel på hur man gör detta ser vi nedan:
public class Program
{
static void Main(string[] args)
{
// Metodanrop för att köra Uppgift1
Uppgift1();
// Metodanrop för att köra Uppgift2
Uppgift2();
// Osv.
}
static void Uppgift1()
{
int x;
...
}
static void Uppgift2()
{
Console.WriteLine("Enter your name: ");
...
}
}
Datatyper
Gällande grundläggande datatyper så behöver vi först och främst förstå att det finns olika typer av data. Vi har exempelvis datatypen int
som kan nyttjas för att lagra numeriska värden, datatypen string
för att lagra text och char
för att lagra individuella bokstäver och tecken.
I denna sektion så kommer du att arbeta med dessa grundläggande datatyper, hur man interagerar med konsolen (input/output) samt konvertering av datatyper. För att göra detta så behöver man dock ha viss koll på de olika koncepten. Således följer en kortfattad beskrivning av resp. koncept nedan.
Datatyper:
// Grundläggande datatyper
bool b; // Hanterar värden av typen true eller false
int x; // Hanterar numeriska värden, t.ex. 123
char c; // Hanterar tecken, t.ex. '1' eller 'A'
DateTime date; // Hanterar datum och tid, t.ex. DateTime.Today
// Notera att det även finns en annan datatyp - decimal - för decimaltal.
double dd; // Hanterar decimaltal, t.ex. 12.3
string s; // Ord och meningar, t.ex. "Hello world"
Input/output:
// Input
// Läser det som användaren skriver in i konsolen.
// OBS! Alltid av typen string.
string input = Console.ReadLine();
// Output
// Skriver ut det som skrivs inom parenteserna i konsolen.
Console.WriteLine("Hello");
// .Write skriver ut innehållet på samma rad medan WriteLine bryter raden.
Console.Write("Hel");
Console.Write("lo");
Konvertering:
string input = Console.ReadLine();
// Fungerar enbart om input KAN konverteras till ett heltal.
// T.ex. kan "hej" inte konverteras till ett heltal.
int x = Convert.ToInt32(input);
// Fungerar alltid utan felmeddelande.
// Ger en felkod, 0, om konvertering misslyckas.
int y;
int.TryParse(input, out y);
Uppgiftsförteckning
Uppgift 1 | Att deklarera vs. att tilldela |
---|---|
Beskrivning | Deklarera en variabel av resp. datatyp (int , string , char , bool ) och tilldela sedan resp. variabel genom att tilldela dem ett värde. |
Lösningsförslag
// Deklarering av variablerna. Vi skapar dem och ger dem ett namn men inget värde.
int x;
string s;
char c;
bool b;
// Tilldelning av variablerna. Vi ger dem ett värde.
x = 10;
s = "Hello world!";
c = 'H';
b = true;
Uppgift 2 | Hello, Name! |
---|---|
Beskrivning | Skriv ett program som visar ditt namn och en fullständig adress (såsom du skulle se den på ett brev). Programmet ska läsa in input från användaren. |
Lösningsförslag
Console.WriteLine("Enter your name: ");
string name = Console.ReadLine();
Console.WriteLine("Enter your address: ");
string address = Console.ReadLine();
Console.WriteLine("Hello, " + name + "!");
Console.WriteLine("Your full adress is: " + address);
Uppgift 3 | Modifiering av datatyper - Konvertering |
---|---|
Beskrivning | Skriv ett program som läser in en siffra från en användare och sedan konverterar värdet till ett heltal. TIPS! Tänk på att ALLT som läses in med Console.ReadLine() är av datatypen string . För att ändra detta till ett heltal så behöver man konvertera värdet. Detta kan ske på olika sätt, men försök dig på följande: Convert.ToInt32() samt int.TryParse() . Om du är intresserad av att läsa mer kring hur dessa metoder särskiljer sig så kan du kika på följande länk: Parse vs ConvertToInt32 vs TryParse |
Lösningsförslag
string input = Console.ReadLine();
int x = Convert.ToInt32(input); // Detta fungerar enbart om värdet KAN transformeras till ett heltal. Om användaren t.ex. skriver in "Hej" så kommer applikationen att krascha.
Console.WriteLine(x);
int y;
int.TryParse(input, out y); // Metoden kommer att försöka omvandla värdet. Om det inte går så kommer y att innehålla värdet 0.
Console.WriteLine(y);
Uppgift 4 | Konvertering med olika datatyper |
---|---|
Beskrivning | I Uppgift 3 så behandlas hur man konverterar från en string till en int men det finns såklart flera olika metoder beroende på vilka datatyper som nyttjas. Testa på att konvertera enligt nedan: Från int till string Från double till int Från double till string |
Lösningsförslag
// Från int till string
int.TryParse(input, out int y);
string s = y.ToString();
// Från float till int
float x = 10.55f;
int a = Convert.ToInt32(x); // a = 11
// Från double till string
double z = 10.5;
string ss = z.ToString();
// Från float till string
float f = 42.31f;
string sss = f.ToString();
Uppgift 5 | Olika typer av konvertering |
---|---|
Beskrivning | Man kan även konvertera på olika sätt. Det finns exempelvis s.k. explicit konvertering och implicit konvertering samt konvertering utan att anropa Convert-klassen (dvs. exempelvis Convert.ToInt32 ). Explicit konvertering är det har nyttjats i tidigare uppgifter. Dvs. exempelvis genom metoder såsom Convert.ToInt32 eller int.TryParse . Vi säger helt enkelt tydligt att vi vill genomföra konvertering. Implicit konvertering tillåter oss att exempelvis gå från en int till en double utan att ange det då båda datatyper är av numerisk karaktär. Det är även möjligt att genomföra explicit konvertering utan att ange en metod för konverteringen. Detta uppnås genom att placera datatypen som variabeln ska konverteras till - inom parenteser - framför variabeln. Testa på dessa olika typer av konvertering och ifall du är intresserad av att läsa mer om det så kan följande länk nyttjas: Olika typer av konvertering C# |
Lösningsförslag
// Explicit
int.TryParse(input, out int y);
string s = y.ToString();
// Implicit
int a = 15;
int b = 3;
double kvot = a / b;
// Explicit med parenteser. Notera att detta inte fungerar i alla fall, t.ex. är det inte möjligt att byta ut double mot en string.
int x = 10;
double d = (double)x;
Uppgift 6 | Summera två heltal |
---|---|
Beskrivning | Skriv ett program som läser in två heltal från en användare. Programmet ska sedan summera heltalen och skriva ut den resulterande summan. OBS! Programmet ska inte krascha pga. felaktig inmatning (t.ex. om användaren anger en bokstav istället för en ett heltal). |
Lösningsförslag
int.TryParse(Console.ReadLine(), out int first);
int.TryParse(Console.ReadLine(), out int second);
int sum = first + second;
Console.WriteLine(sum);
Uppgift 7 | Division av heltal |
---|---|
Beskrivning | Skriv ett program som läser in två heltal och sedan beräknar samt skriver ut kvoten. Utöka sedan programmet så att det även läser in två decimaltal och sedan beräknar samt skriver ut kvoten för divisionen mellan dessa tal. Notera skillnaden som uppstår mellan de två beräkningarna då det är viktigt att vara medveten om denna diskrepans vid exempelvis beräkningar av procent. |
Lösningsförslag
// Division med int
int.TryParse(input, out int x);
int.TryParse(input, out int y);
Console.WriteLine(x / y); // Ger 3 om x är 10 och y är 3. Ger 2 om x är 8 och y är 3.
// Division med double
double.TryParse(input, out int a);
double.TryParse(input, out int b);
Console.WriteLine(a / b); // Ger t.ex. 3.33 om x är 10 och y är 3. Ger 2.66 om x är 8 och y är 3.
// Division med int som ger en double
double kvot = x / y; // Ger 3 om x är 10 och y är 3
double korrektKvot = (double)x / (double)y; // Ger 3.33 om x är 10 och y är 3. Konvertering måste ske INNAN beräkning.
Uppgift 8 | Grundläggande matematik |
---|---|
Beskrivning | Skriv ett program som läser in två heltal från användaren och som sedan skriver ut differensen mellan talen (subtraktion), produkten mellan talen (multiplikation) och kvoten mellan talen (division). |
Lösningsförslag
int.TryParse(Console.ReadLine(), out int first);
int.TryParse(Console.ReadLine(), out int second);
int sub = first - second;
Console.WriteLine(sub);
int multi = first * second;
Console.WriteLine(multi);
double div = (double)first / (double)second;
Console.WriteLine(div);
Uppgift 9 | Byta plats på värden | ||
---|---|---|---|
Beskrivning |
Skriv ett program som byter värdet hos två variabler av datatypen heltal och skriver ut variablernas nya värden. Exempel på interaktion med programmet:
|
Lösningsförslag
int.TryParse(Console.ReadLine(), out int first);
int.TryParse(Console.ReadLine(), out int second);
int temp = first;
first = second;
second = temp;
Console.WriteLine("First input contains: " + first);
Console.WriteLine("Second input contains: " + second);
Uppgift 10 | Korrekt beräkning | ||
---|---|---|---|
Beskrivning |
Skriv ett program som tar emot tre heltal (x, y & z) och sedan utför beräkningar enligt följande: (x + y) * z resp. x * y + y * z. Programmet ska sedan skriva ut resultatet för resp. beräkning. Exempel på interaktion med programmet:
|
Lösningsförslag
int.TryParse(Console.ReadLine(), out int x);
int.TryParse(Console.ReadLine(), out int y);
int.TryParse(Console.ReadLine(), out int z);
int sum1 = (x+y) * z;
int sum2 = x * y + y * z;
Console.WriteLine("First calculation: " + sum1);
Console.WriteLine("Second calculation: " + sum2);
Uppgift 11 | Beräkna hastighet |
---|---|
Beskrivning | Skriv ett program som läser in avstånd och tid som input och sedan räknar ut hastighet i km/h. TIPS! Använd datatypen float. Formeln som nyttjas för att beräkna hastighet (given tid och avstånd) är v = s / t där s är avstånd och t är antalet timmar. |
Lösningsförslag
float.TryParse(Console.ReadLine(), out float distance);
float.TryParse(Console.ReadLine(), out float time);
float speed = distance / time;
Uppgift 12 | Strängkonkatenering | ||
---|---|---|---|
Beskrivning |
Skriv ett program som läser in ett förnamn och ett efternamn. Konkatenera namnen genom att sätta ihop efternamnet med förnamnet. Tänk på att det utskrivna måste vara läsbart för datoranvändaren. TIPS! För att konkatenera ("sätta ihop") strängar så kan man nyttja operatorn för addition (+) mellan de strängar man vill konkatenera. Exempel på interaktion med programmet:
|
Lösningsförslag
string fName = Console.ReadLine();
string lName = Console.ReadLine();
Console.WriteLine("Name: " + lName + ", " + fName + ".");
Uppgift 13 | Modulus | ||
---|---|---|---|
Beskrivning |
Skriv ett program som läser in ett heltal och dividerar det med 2. Programmet ska sedan skriva ut "resten" (det som blev över efter divisionen). TIPS: Operatorn för Modulus är % . Anledningen till varför vi får 1 i ovan exempel beror på att 2 går i 5 två gånger (2+2=4) vilket lämnar oss med "resten" som är en 1:a. Exempel på interaktion med programmet:
|
Lösningsförslag
Console.Write("Ange ett heltal: ");
int.TryParse(Console.ReadLine(), out int input);
double d = input % 2;
Console.WriteLine("Resten efter division är: " + d);
Metoder
Konceptet “Metod” behandlades kortfattat i inledningen där det beskrivs som ett alternativt sätt att strukturera kod. Varför detta är nödvändigt kan säkerligen ifrågasättas i början när man lär sig att programmera men i samband med att man bygger större och större program så märker man ganska snart att det utan hjälp av metoder snabbt blir överväldigande att dels hålla koll på vart all funktionalitet är placerad men även en påtaglig redundans av kod (dvs. ett identiskt kodstycke som förekommer på flera ställen). Om vi exempelvis föreställer oss att vi, vid olika tillfällen i ett program, vill kunna nyttja en viss funktion såsom t.ex. att lägga till en kontakt i en kontaktlista så känns det rimligt att bryta ut detta som en metod vilken vi sedan kan anropa vid behov. Detta gör det betydligt enklare att överblicka programmet såväl som att felsöka det. Det är således viktigt att man följer vissa riktlinjer när det kommer till metoder och det leder oss in på s.k. metodsignaturer:
Metodsignatur
Så, en metodsignatur. Vad är det egentligen och hur ser en signatur ut?
En metodsignatur består utav namnet på metoden och ev. parametrar som metoden tar emot. En parameter för exempelvis metoden Addition
skulle kunna tänkas vara 2 st. heltal som ska summeras. Dvs. något i stil med:
Addition(int num1, int num2){
// Code goes here.
}
Nämnvärt är att metodens- och parametrarnas namn bör vara beskrivande för vad metoden förväntas utföra. Exempelvis blir det snabbt väldigt svårt att avgöra vad en omfattande metod förväntas genomföra om dess namn är X och tar emot 14 parametrar döpta enligt x1, x2 osv.
Returtyp
Utöver själva metodsignaturen så behöver en metod även en s.k. returtyp. Det är denna som säger åt programmet vad, om något, metoden ska skicka tillbaka. I fallet av metoden Addition
så kan vi exempelvis tänka oss att det är rimligt att metoden skickar tillbaka summan som ett heltal. Dvs. enligt följande:
int Addition(int num1, int num2){
int sum;
sum = num1 + num2;
return sum;
}
När metoden då sedan anropas så vet vi att ett heltal kommer att skickas tillbaka samt att vi måste skicka in 2 st. heltal. Exempelvis enligt:
public class Program
{
static void Main(string[] args)
{
int sum = Addition(10, 15); // sum = 25
sum = Addition(12, -5); // sum = 7
sum = Addition(10); // Error - Metoden förväntar sig 2 heltal
}
static int Addition(int num1, int num2)
{
int sum;
sum = num1 + num2;
return sum;
}
}
OBS! Om metoden har en returtyp så måste metoden också skicka tillbaka något. Om metoden inte ska skicka tillbaka något, t.ex. om den enbart förväntas skriva ut information till konsolen så nyttjas returtypen void
. Detta är lämpligt om resultatet från metoden inte behöver nyttjas senare i programmet, t.ex. om vi vill skriva ut resultatet på en gång.
public class Program
{
static void Main(string[] args)
{
Addition(10, 15); // "Sum: 25" i konsolen
Addition(12, -5); // "Sum: 7" i konsolen
Addition(10); // Error - Metoden förväntar sig 2 heltal
}
static void Addition(int num1, int num2)
{
Console.WriteLine("Sum: " + (num1 + num2));
}
}
När vi arbetar med konsolapplikationer så måste du även lägga till nyckelordet static
framför din returtyp för att Main
-metoden ska kunna “hitta” metoden. Vad static
innefattar behandlas ytterligare under kursen “Objektorienterad programmering I”.
Uppgiftsförteckning
Uppgift 1 | Metodsyntax |
---|---|
Beskrivning | Skriv en lämplig metodsignatur och tillhörande returtyp för metoder som förväntas utföra följande funktion: - Räkna ut något givet 3 st. parametrar. - Avgöra om värdet hos en parameter är korrekt eller ej. - Skickar tillbaka ett datum om input kan konverteras till ett sådant. Annars ska ett felmeddelande skrivas ut. - Skriver ut innehållet i en array. OBS! Ingen kod behöver skrivas för att lösa denna uppgift och du förväntas skriva en metodsignatur - och tillhörande returtyp - för resp. funktion. |
Lösningsförslag
// Det spelar ingen roll om vi nyttjar int eller double här.
static double CalculateSum(int x, double y, int z) { }
bool IsLoggedIn(string usr, string psw) { }
// Givet returtypen så måste vi returnera något, i detta fall blir det en tom DateTime.
// Om konverteringen misslyckas så har vi en else-sats som skriver ut att ett fel har uppstått.
static DateTime ConvertToDate(int date) {
// Code goes here.
else{
Console.WriteLine("Error.");
}
return new DateTime();
}
// void då vi enbart vill skriva ut innehållet i arrayen.
static void PrintArray(int[] arr){ }
Uppgift 2 | KontrolleraRader |
---|---|
Beskrivning | Skriv en metod som jämför om två meningar är identiska. Metoden ska ha namnet: KontrolleraRader . Presentera resultatet på lämpligt sätt och reflektera kring en lämplig returtyp. |
Lösningsförslag
// Notera att metoden inte nödvändigtvis måste returerna något.
// Det kan dock vara aktuellt om vi t.ex. vill nyttja resultatet i en annan metod.
static bool KontrolleraRader(string a, string b){
if(a == b)
{
Console.WriteLine("The strings match!");
return true;
}
else
{
Console.WriteLine("The strings are not identical!");
return false;
}
}
Uppgift 3 | Summering av udda tal |
---|---|
Beskrivning | Skriv en metod som adderar två udda tal. Om talen inte är udda så ska ingen beräkning utföras. Användaren bör dock informeras om att ingen beräkning utförs. Denna metod är tänkt att nyttjas i en annan metod. |
Lösningsförslag
// Notera att metoden inte nödvändigtvis måste returerna något.
// Det kan dock vara aktuellt om vi t.ex. vill nyttja resultatet i en annan metod.
static int SumOddNumbers(int x, int y){
if(x % 2 != 0 && y % 2 != 0)
return x + y;
else
{
Console.WriteLine("At least one of the numbers is even.");
return 0; // Agerar som felkod i den metod som nyttjar denna metod.
}
}
Uppgift 4 | Metoder med samma namn |
---|---|
Beskrivning | Skriv en metod, PrintUserInfo , som tar emot två strängar. Metoden ska sedan skriva ut informationen enligt följande format: Hello, Name! Your number is: Number Där "Name" är det ena argumentet och "Number" är det andra argumentet. Skriv därefter ytterligare en metod med samma namn men som tar emot två strängar och ett heltal där heltalet representerar ett årtal. Denna metod ska skriva ut enligt samma format som den första metoden men även beräkna och skriva ut användarens ålder (dvs. antal år snarare än årtal). OBS! Metoderna har samma namn men inte samma metodsignatur (två argument gentemot tre). Vi kommer att behandla detta koncept (method overloading) ytterligare i senare kurser, men i nuläget så är det tillräckligt att veta om att det existerar. |
Lösningsförslag
static void PrintUserInfo(string name, string number){
Console.WriteLine("Hello, " + name + "!");
Console.WriteLine("Your number is: " + number);
}
static void PrintUserInfo(string name, string number, int year){
Console.WriteLine("Hello, " + name + "!");
Console.WriteLine("Your number is: " + number);
Console.WriteLine("You are " + (2019 - year));
}
Uppgift 5 | En metod i en metod |
---|---|
Beskrivning | Skriv en metod som avgör om ett heltal är udda eller jämnt. Skriv därefter ytterligare en metod - som nyttjar den första metoden - för att antingen dividera heltalet med 2 (om det är ett jämnt tal) eller dividera heltalet med 5 (om det är ett udda tal). Skriv ett metodanrop till båda metoder med korrekta argument (dvs. att argumentet är av typen double . NOTERA att namnet på de parametrar som anges för en metod enbart existerar i det kodblock som metoden avser. Detta innefattar att du inte måste skicka en variabel med samma namn som anges i metodens parametrar. Det enda som spelar någon roll är att datatypen är korrekt. |
Lösningsförslag
// Notera att metoden inte nödvändigtvis måste returerna något.
// Det kan dock vara aktuellt om vi t.ex. vill nyttja resultatet i en annan metod.
static bool IsOdd(double x){
if(x % 2 != 0)
return true;
else
return false;
}
static double DivideOddAndEvenNumbers(double x){
// Notera att "IsOdd(x)" är samma sak som att skriva "IsOdd(x) == true".
// Detta då det är placerat som ett villkor i if-satsen och metoden returnerar en bool.
if(IsOdd(x))
return x / 5;
else
return x / 2;
}
Uppgift 6 | En enkel meny II |
---|---|
Beskrivning | Skriv en metod som presenterar användaren till en enklare meny med 3 alternativ. Dessa alternativ ska vara: - Summera 3 heltal. - Avgör om ett heltal är positivt eller negativt. - Avgör först om två heltal är positiva eller negativa. Om båda heltal är positiva; summera dem. Om båda heltal är negativa; multiplicera dem. Ifall heltalen inte matchar varandra, utför ingen beräkning och returnerna 0. Funktionaliteten ska placeras i lämpliga metoder. |
Lösningsförslag
static void ASimpleMenu(){
Console.WriteLine("Choose one of the following options:");
Console.WriteLine("1. Sum 3 numbers.");
Console.WriteLine("2. Check if a number is positive or negative.");
Console.WriteLine("3. Check if two numbers are both negative, if they are - sum them. If they're not - multiply them.");
int.TryParse(Console.ReadLine(), out int input);
switch(input){
case 1:
Console.Write("Enter the first number: ");
int.TryParse(Console.ReadLine(), out int x);
Console.Write("Enter the second number: ");
int.TryParse(Console.ReadLine(), out int y);
Console.Write("Enter the third number: ");
int.TryParse(Console.ReadLine(), out int z);
Console.WriteLine("The sum is: " + SumNumbers(x, y, z));
break;
case 2:
Console.Write("Enter a number: ");
int.TryParse(Console.ReadLine(), out int num);
Console.WriteLine("The number is positive: " + IsPositive(num));
break;
case 3:
Console.WriteLine("The sum of PosNegSumOrMulti is: " + PosNegSumOrMulti());
break;
default:
Console.WriteLine("Incorrect input.");
break;
}
}
static int SumNumbers(int x, int y, int z){
return x + y + z;
}
static bool IsPositive(int n){
if(n >= 0)
return true;
else
return false;
}
static int PosNegSumOrMulti(){
Console.Write("Enter the first number: ");
int.TryParse(Console.ReadLine(), out int input1);
Console.Write("Enter the second number: ");
int.TryParse(Console.ReadLine(), out int input2);
if (IsPositive(input1) && IsPositive(input2))
return input1 + input2;
else if(!IsPositive(input1) && !IsPositive(input2))
return input1 * input2;
else
return 0;
}
Selektion
I förhållande till konceptet selektion så behöver vi reflektera kring olika “vägar” som ett program kan ta. Ett program behöver nämligen kunna utföra olika saker beroende på vilka beslut en användare tar, precis som i vårt vardagliga liv! Vi kan exempelvis välja att ta bussen till jobbet ELLER ta cykeln. OM vi tar bussen så kostar det en viss summa, men vi anländer ev. snabbare. OM vi istället tar cykeln så kostar det inget, men det kan ev. ta lite längre tid och vara omständigare (t.ex. vid regn). Det finns självfallet även möjligheten att gå till jobbet om exempelvis både bussen är inställd och cykeln har fått punktering. Detta är mao. vad vi blir tvunga att välja OM de andra alternativen inte är tillgängliga.
Föreställ dig exempelvis att du nyttjar en hemsida som kräver inloggning för att lämna kommentarer. För att skapa ett konto så krävs det att man är äldre än 12 år gammal och att man anger ett användarnamn samt lösenord. Ett exempel på en simplistisk lösning för detta problem skulle kunna tänkas vara:
string usr = "";
string pass = "";
int age = 0;
Console.WriteLine("Ange ditt användarnamn: ");
usr = Console.ReadLine();
Console.WriteLine("Ange ditt lösenord: ");
pass = Console.ReadLine();
Console.WriteLine("Ange din ålder: ");
int.TryParse(Console.ReadLine(), out age);
if(age < 12)
Console.WriteLine("Du måste vara minst 12 år för att skapa ett användarkonto!");
else if(age == 0) // Om konverteringen inte lyckades, t.ex. om "Tjugofem" anges istället för "25".
Console.WriteLine("Du måste ange din ålder!");
else if(usr == "" || pass == "") // '||' representerar den logiska operatorn OR
Console.WriteLine("Du måste ange ett användarnamn och ett lösenord!");
else
Console.WriteLine("Ditt konto har skapats!");
Detta representerar alltså ett fall där vi gör en sak OM (if
) ett - eller flera - kriterium är uppfyllt/uppfyllda, I ANNAT FALL (else if
) så kontrollerar vi annat fall. Om vi i slutändan inte kan välja någon av dessa vägar så når vi vårt sista alternativ där vi helt enkelt säger att vi ANNARS eller I ALLA ANDRA FALL (else
) väljer det alternativet. Detta är vad som kallas för selektion.
NOTERA att vi inte måste nyttja if/else parvis. Vi kan mao. ha en if
-sats utan en medföljande else
-sats. Vi säger då att vi utför detta OM kravet är uppfyllt, om det inte är det så gör vi ingenting.
Uppgiftsförteckning
Uppgift 1 | Kontrollera input och grundläggande operatorer |
---|---|
Beskrivning | Skriv ett program (eller en metod) som kontrollerar att: - Input inte är lika med talet 5 och att det är mindre än 10. - Input är lika med en annan variabel, intLika1 . Denna variabel kan du tilldela vilket arbiträrt värde du än vill. - Input innehåller bokstaven ‘h’ eller siffran ‘3’. Annars ska programmet skriva ut “Not true”. TIPS: Operatorn för “lika med” är == . Notera att enbart ett tilldelningstecken (=) indikerar just tilldelning medan två i rad alltså genomför en jämförelse. “inte lika med” kombinerar operatorn för “inte” (!) och “lika med” för att bilda “!=”. För att kontrollera om en sträng innehåller en bokstav så kan metoden Contains nyttjas i uppgiften. För att kontrollera flera uttryck samtidigt så kan operatörerna för AND (&& ) och OR (|| ) nyttjas. |
Lösningsförslag
int.TryParse(Console.ReadLine(), out int input);
if(input != 5 && input < 10) {
// Code goes here.
}
int intLika1 = 112;
if(input == intLika1) {
// Code goes here.
}
string newInput = Console.ReadLine();
if(!newInput.Contains('h') || !newInput.Contains('3')) {
// Code goes here.
}
else {
Console.WriteLine("Not True");
}
Uppgift 2 | Odd numbers? |
---|---|
Beskrivning | Skriv ett program som läser in två heltal och skriver ut huruvida det stämmer om båda är udda eller ej. TIPS: För att kontrollera om en siffra är jämn eller udda så rekommenderar vi att man nyttjar operatorn modulus. Om det inte finns någon rest efter att talet i fråga har dividerats med 2 så vet vi att talet är jämnt och vice versa. |
Lösningsförslag
int.TryParse(Console.ReadLine(), out int input1);
int.TryParse(Console.ReadLine(), out int input2);
if(input1 % 2 != 0 && input2 % 2 != 0){
Console.WriteLine("It's true!");
}
else{
Console.WriteLine("It's not true!");
}
Uppgift 3 | Positivt eller negativt? | ||
---|---|---|---|
Beskrivning |
Skriv ett program som läser in ett heltal och skriver ut huruvida det är ett positivt heltal eller ett negativt heltal. Exempel på interaktion med programmet:
|
Lösningsförslag
int.TryParse(Console.ReadLine(), out int input1);
if(input1 >= 0){
Console.WriteLine(input1 + " är ett positivt tal.");
}
else{
Console.WriteLine(input1 + " är ett negativt tal.");
}
Uppgift 4 | Skottår |
---|---|
Beskrivning | Skriv ett program som läser in ett årtal och sedan skriver ut huruvida det årtalet är ett skottår eller ej. För att avgöra om ett år är ett skottår så ska programmet utgå från följande parametrar: Om ett årtal är jämnt delbart med 4, 100 eller 400 så är det ett skottår. Om årtalet som läses in är negativt så ska programmet skriva ut: “Du måste ange ett årtal efter år 0!”. |
Lösningsförslag
int.TryParse(Console.ReadLine(), out int year);
if(year < 1){
Console.WriteLine("Du måste ange ett årtal efter år 0!");
}
else if(year % 400 == 0 || year % 100 == 0 || year % 4 == 0){
Console.WriteLine(year + " är ett skottår!");
}
else{
Console.WriteLine(year + " är INTE ett skottår!");
}
Uppgift 5 | Om m, skriv n | ||
---|---|---|---|
Beskrivning |
Skriv ett program som läser in ett heltal. Om heltalet är lika med 33 så ska heltalet + 9 skrivas ut, om heltalet är större än, eller lika med, 150 så ska heltalet delat i 2 skrivas ut. I alla andra fall ska heltalet upphöjt i 2 skrivas ut. Exempel på interaktion med programmet:
|
Lösningsförslag
int.TryParse(Console.ReadLine(), out int m);
if(m == 33){
Console.WriteLine(m + 9);
}
else if(m >= 150){
Console.WriteLine(m / 2);
}
else{
Console.WriteLine(m * m);
}
Uppgift 6 | Går det att bada? |
---|---|
Beskrivning | Kajsa gillar att bada, dock tar vattnet ibland slut hemma och dessutom kan värmen variera ganska mycket. Denna metod undersöker om badet är redo. Kraven för att badet ska vara redo är att det måste finnas vatten, och att vattnet måste vara mellan 30 och 42 grader (inklusive). Programmet förväntas därför läsa in en parameter som avgör om badet har vatten eller ej. Detta kan anges i följande format: “true”, “yes” eller “y”. Programmet ska även läsa in en annan parameter som kan representera intervallet 30-48 grader. OBS! Tänk på att om badkaret saknar vatten så kan vi inte kontrollera vattnets temperatur. |
Lösningsförslag
Console.WriteLine("Ange om badkaret har vatten (true, yes eller y):");
string hasWater = Console.ReadLine();
bool b = false;
if(hasWater == "true" || hasWater == "yes" || hasWater == "y"){
b = true;
Console.WriteLine("Ange vattnets temperatur:");
int.TryParse(Console.ReadLine(), out int temp);
if(temp >= 30 && temp <= 42 && b){
Console.WriteLine("Badet är redo.");
}
else{
Console.WriteLine("Badet är INTE redo.");
}
}
else{
Console.WriteLine("Badkaret saknar vatten.");
}
Uppgift 7 | Är personen arbetsför? | ||
---|---|---|---|
Beskrivning |
Skriv ett program som läser in en persons ålder. Programmet ska sedan kategorisera arbetsföra personer efter deras ålderskategori och skriva ut vilken kategori som personen tillhör. Kategorierna är: 16-19: Tonåring 20-29: Ung vuxen 30-39: Vuxen 40-49: Medelålder 50-64: Äldre Om personen är under 16 eller äldre än 64 så ska programmet skriva ut att personen inte tillhör arbetsför kategori. Exempel på interaktion med programmet:
|
Lösningsförslag
Console.Write("Ange personens ålder: ");
int.TryParse(Console.ReadLine(), out int age);
if(age < 16 || age > 64){
Console.WriteLine("Personen tillhör inte arbetsför kategori!");
}
else{
if(age > 15 && age < 20){
Console.WriteLine("Personens kategori är: Tonåring");
else if(age > 19 && age < 30){
Console.WriteLine("Personens kategori är: Ung vuxen");
else if(age > 29 && age < 40){
Console.WriteLine("Personens kategori är: Vuxen");
else if(age > 39 && age < 50){
Console.WriteLine("Personens kategori är: Medelålder");
else{
Console.WriteLine("Personens kategori är: Äldre");
}
}
Uppgift 8 | Vilket betyg får studenten? | ||
---|---|---|---|
Beskrivning |
Skriv ett program som kontrollerar om en student har nått betyget G eller VG på en tentamen. Programmet behöver först läsa in antalet skrivpoäng som studenten har i en variabel och sedan ska programmet jämföra dess värde mot betygsgränserna som anges enligt: U: <60 G: 60-84 VG: 85-100 Om studenten uppfyller kraven, dvs. antingen uppnår betyget G eller VG så ska programmet skriva ut "Studenten har avslutat kursen med betyget X!". Exempel på interaktion med programmet:
OBS! Om något har gått tokigt till i systemet så behöver vi dock kunna avgöra detta. Ifall studentens skrivpoäng därför är negativa eller över 100 så ska programmet skriva ut "Något har gått fel vid inmatning.". Vi behöver även kontrollera om studenten har fått bonuspoäng från andra moment på kursen och, om så är fallet, så behöver detta tas i beaktning vid bedömningen. Om en student exempelvis skriver 57 på tentamen men har sedan tidigare bonuspoäng som omfattar 6 poäng på tentamen så ska studenten ha betyget G. |
Lösningsförslag
Console.WriteLine("Ange studentens skrivpoäng: ");
int.TryParse(Console.ReadLine(), out int points);
Console.WriteLine("Ange studentens bonuspoäng: ");
int.TryParse(Console.ReadLine(), out int bonus);
if(points < 0 || points > 100){
Console.WriteLine("Något har gått fel vid inmatning.");
}
else{
if((points + bonus) < 60){
Console.WriteLine("Studenten har inte nått minst betyget G på kursen");
else if((points + bonus) >= 60 && (points + bonus) < 85){
Console.WriteLine("Studenten har avslutat kursen med betyget G!");
else{
Console.WriteLine("Studenten har avslutat kursen med betyget VG!");
}
}
Uppgift 9 | Introduktion till Switch |
---|---|
Beskrivning | Skriv ett program som tar emot ett heltal och skriver ut den veckodag som matchar det heltalet. Dvs. att om användaren skriver in ‘5’ så ska ‘Fredag’ skrivas ut osv. Om heltalet inte matchar en veckodag så ska istället följande skrivas ut: “Incorrect input”. TIPS! Nyttja en s.k. switch-sats för att lösa uppgiften. För att läsa mer om dessa och se exempel på hur de kan nyttjas så kan du nyttja följande länk: Information om switch-satser |
Lösningsförslag
string input = Console.ReadLine();
switch(input){
case "1":
Console.WriteLine("Måndag");
break;
case "2":
Console.WriteLine("Tisdag");
break;
case "3":
Console.WriteLine("Onsdag");
break;
case "4":
Console.WriteLine("Torsdag");
break;
case "5":
Console.WriteLine("Fredag");
break;
case "6":
Console.WriteLine("Lördag");
break;
case "7":
Console.WriteLine("Söndag");
break;
default:
Console.WriteLine("Incorrect input");
break;
}
Uppgift 10 | Väder för veckan |
---|---|
Beskrivning | Skriv ett program som skriver ut vädret för en angiven dag den nuvarande veckan. Vädret beror så klart på veckodag och gäller måndag till söndag enligt följande: Mån: Soligt och >25C” Tis: “Molnigt och runt 22C” Ons: “Regn och <16C” Tor: “Sol och regn, >20C” Fre: “Orimligt varmt, runt 30C” Lör: “Orimligt varmt, runt 32C” Sön: “Regn och vind, <18C”. Veckodagen skall anges enligt följande format, med måndag som ett exempel: "MONDAY"/"Monday"/"monday"/"mon"/"1" . Om det angivna formatet inte nyttjas så ska “Incorrect input” skrivas ut. |
Lösningsförslag
string day = Console.ReadLine();
switch(day){
case "MONDAY": case "Monday": case "monday": case "mon": case "1":
Console.WriteLine("Soligt och >25C");
break;
case "TUESDAY": case "Tuesday": case "tuesday": case "tue": case "2":
Console.WriteLine("Molnigt och runt 22C");
break;
case "WEDNESDAY": case "Wednesday": case "wednesday": case "wed": case "3":
Console.WriteLine("Regn och <16C");
break;
case "THURSDAY": case "Thursday": case "thursday": case "thu": case "4":
Console.WriteLine("Sol och regn, >20C");
break;
// Notera att det inte spelar någon roll om du skriver resp. "case" efter varandra enligt ovan eller på nästkommande rad som här.
case "FRIDAY":
case "Friday":
case "friday":
case "fri":
case "5":
Console.WriteLine("Orimligt varmt, runt 30C");
break;
case "SATURDAY":
case "Saturday":
case "saturday":
case "sat":
case "6":
Console.WriteLine("Orimligt varmt, runt 32C");
break;
case "SUNDAY":
case "Sunday":
case "sunday":
case "sun":
case "7":
Console.WriteLine("Regn och vind, <18C");
break;
default:
Console.WriteLine("Incorrect input");
break;
}
Uppgift 11 | Vinst eller förlust? |
---|---|
Beskrivning | Skriv ett program som avgör om en person har gått med vinst eller förlust på en försäljning givet ett inköpspris och ett försäljningspris. Utgå exempelvis från följande scenario: Karl köper andelar i en viss fond för 2300 kr runt löning med syfte att spara pengar. Han inser dock efter två veckors tid att han behöver pengarna pga. ett antal kostsamma utekvällar. Han säljer därför av sina andelar. Tyvärr så har fonden inte utvecklats väl under denna period och han säljer därför av andelarna för 1900 kr. Karl har därför gått med förlust på 400 kr (-17.3913043478261%). Du behöver inte avrunda procentsatsen. Om inköpet har resulterat i varken en vinst eller förlust så ska detta förmedlas via konsolen. TIPS: Tänk på att du behöver nyttja datatypen double för att räkna med decimaler (vilket blir nödvändigt vid procentberäkning). |
Lösningsförslag
int.TryParse(Console.ReadLine(), out int buyPrice);
int.TryParse(Console.ReadLine(), out int sellPrice);
double percent = 0;
if (sellPrice < buyPrice)
{
double diff = buyPrice - sellPrice;
percent = diff / (double)buyPrice;
Console.WriteLine("The loss is: " + diff + " (-" + percent * 100 + "%)");
}
else if(sellPrice > buyPrice)
{
double diff = sellPrice - buyPrice;
percent = diff / (double)buyPrice;
Console.WriteLine("The profit is: " + diff + " (" + percent * 100 + "%)");
}
else
{
Console.WriteLine("You've made neither a profit or a loss.");
}
Uppgift 12 | Typ av triangel? |
---|---|
Beskrivning | Skriv ett program som tar emot längden från alla tre sidor hos en triangel och avgör om triangeln är likbent, liksidig eller oliksidig. |
Lösningsförslag
int a, b, c;
Console.Write("Skriv in längden för sida a:");
int.TryParse(Console.ReadLine(), out a);
Console.Write("Skriv in längden för sida b:");
int.TryParse(Console.ReadLine(), out b);
Console.Write("Skriv in längden för sida c:");
int.TryParse(Console.ReadLine(), out c);
Console.WriteLine(); // En extra blankrad
if(a == b && a == c){
Console.WriteLine("Triangeln är en liksidig triangel.");
}
else if(a == b || a == c || b == c){
Console.WriteLine("Triangeln är en likbent triangel.");
}
else{
Console.WriteLine("Triangeln är en oliksidig triangel.");
}
Uppgift 13 | En enkel meny |
---|---|
Beskrivning | Skriv ett program som presenterar användaren till en enklare meny med tre alternativ. Dessa alternativ ska vara: - Beräkna arean hos en cirkel. - Beräkna arean hos en rektangel. - Avsluta programmet utan beräkning. Notera att du behöver olika parametrar för de olika fallen. Exempelvis behöver du radien för att beräkna arean hos en cirkel men höjd och bredd för att istället beräkna arean hos en rektangel. TIPS! För att nyttja PI i C# så kan du nyttja egenskapen Math.PI , men det går så klart även bra att enbart nyttja 3.14 istället. |
Lösningsförslag
int input, r, b, h, area;
Console.WriteLine("Välj ett av följande alternativ:");
Console.WriteLine("1: Beräkna arean hos en cirkel.");
Console.WriteLine("2: Beräkna arean hos en rektangel.");
Console.WriteLine("3: Avsluta applikationen.");
int.TryParse(Console.ReadLine(), out input);
switch(day){
case 1:
Console.Write("Skriv in radien hos cirkeln: ");
int.TryParse(Console.ReadLine(), out r);
Console.WriteLine("Arean hos rektangeln är: " + Math.PI*r*r);
break;
case 2:
Console.Write("Skriv in höjden hos rektangeln: ");
int.TryParse(Console.ReadLine(), out h);
Console.Write("Skriv in bredden hos rektangeln: ");
int.TryParse(Console.ReadLine(), out b);
Console.WriteLine("Arean hos rektangeln är: " + b*h);
break;
case 3:
Console.WriteLine("Applikationen avslutas.");
break;
default:
Console.WriteLine("Din input är felaktig. Försök igen.");
break;
}
Iteration/Arrayer
Datatypen array är oftast något svår att förstå sig på inledningsvis. Exempelvis så kan man inte manipulera storleken (t.ex. lägga till en plats eller ta bort en plats i listan) på en array då dessa är statiska. Vi måste dessutom alltid ha i åtanke att, åtminstone för C#, indexpositionerna i en array alltid startar från position 0. Dvs. att när vi då exempelvis itererar över en array så måste man
1) börja på 0 (om vi inte vill hoppa över det första elementet) och
2) vara försiktig så att vi inte pekar på en indexposition som inte finns.
Se nedan exempel:
int[] arr = new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
int x = arr[0]; // x = 2;
x = arr[9]; // x = 20;
x = arr[10]; // IndexOutOfRangeException då vi pekar på en position som inte existerar.
Iteration är ett koncept som tillåter oss att återupprepa ett stycke kod tills dess att vi når ett angivet resultat. En vanlig tillämpning av detta är nyttjandet av loopar såsom for-loopar
, while-loopar
och foreach-loopar
. Föreställ dig exempelvis att vi vill söka efter ett angivet heltal i en array av heltal. Utan iteration så skulle vi behöva manuellt gå igenom varje element i arrayen och kontrollera dess värde med hjälp av if-satser
. Genom att istället tillämpa iteration så kan vi säga åt vårt program att gå igenom hela arrayen åt oss och vi behöver bara skriva en if-sats
istället för 10 (om arrayen från föregående kodexempel skulle nyttjas). Dvs. i stil med:
int search = 12; // Elementet vi letar efter i arrayen.
int[] arr = new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
for(int i = 0; i < arr.Length; i++){
if(arr[i] == search){
Console.WriteLine("Elementet hittades på plats:" + i);
}
}
OBS! I ovan kodexempel så är det värt att lägga märke till följande aspekter:
- Syntaxen för en
for-loop
.- Vi skapar först en
int
som representerar indexpositionen i arrayen och tilldelar den värdet 0 (för att starta på den första positionen i arrayen). - Vi säger därefter att loopen ska fortsätta köras tills dess att
i
inte längre är mindre än 10 (i < arr.Length
). - Därefter så exekveras koden i loopen så att vi under den första iterationen får
arr[0] == search
. Då detta inte stämmer så hoppar vi upp tilli++
som kommer att öka värdet påi
så att vi under nästa iteration istället fårarr[1] == search
osv.
- Vi skapar först en
- Egenskapen
Length
hos arrayer som tillåter oss att hämta längden hos en array. I ovan fall så skulle vi därför få 10.
Uppgiftsförteckning
Uppgift 1 | De första 100 positiva heltalen |
---|---|
Beskrivning | Skriv en metod, PrintNumbers , som skriver ut alla positiva heltal från 1 till och med 50. |
Lösningsförslag
void PrintNumbers(){
for(int i = 1; i <= 50; i++){
Console.WriteLine(i);
}
}
Uppgift 2 | Strukturerad utskrift | ||
---|---|---|---|
Beskrivning |
Skriv en metod, PrintNumbersTwo , som skriver ut alla positiva heltal från 1 till och med 50. Metoden ska skriva ut heltalen i intervaller av 10. Exempel på interaktion med metoden:
|
Lösningsförslag
void PrintNumbersTwo(){
for (int i = 1; i <= 50; i++)
{
if(i == 10)
{
Console.Write(i);
Console.WriteLine();
}
else if (i == 20)
{
Console.Write(i);
Console.WriteLine();
}
else if (i == 30)
{
Console.Write(i);
Console.WriteLine();
}
else if (i == 40)
{
Console.Write(i);
Console.WriteLine();
}
else if (i == 50)
{
Console.Write(i);
Console.WriteLine();
}
else
Console.Write(i + ", ");
}
}
Uppgift 3 | Strukturerad utskrift II | ||
---|---|---|---|
Beskrivning |
Skriv en metod, NestedPrint , som skriver ut följande mönster:
|
Lösningsförslag
void NestedPrint(){
for(int i = 1; i <= 5; i++)
{
for(int j = 1; j <= i; j++)
{
Console.Write("*");
}
// Används för att "gå till nästa rad", dvs. en break-line.
Console.Write("\n"); // Går även att byta ut mot Console.WriteLine();
}
}
Uppgift 4 | Strukturerad utskrift III | ||
---|---|---|---|
Beskrivning |
Skriv en metod, NestedPrintTwo , som skriver ut följande mönster:
|
Lösningsförslag
static void NestedPrintTwo()
{
int count = 1;
for (int i = 5; i >= 1; i--)
{
for (int j = i - 1; j >= 1; j--)
Console.Write(" ");
for (int k = 1; k <= count; k++)
{
Console.Write("*");
Console.Write(" ");
}
count++;
Console.WriteLine();
}
}
Uppgift 5 | Strukturerad utskrift IV | ||
---|---|---|---|
Beskrivning |
Skriv en metod, NestedPrintThree , som tar emot ett heltal som användaren anger. Metoden ska sedan iterera så pass många gånger som heltalet representerar och, för varje iteration, skriva ut enligt följande mönster:
|
Lösningsförslag
void NestedPrintThree(int iterations){
for(int i = 1; i <= iterations; i++)
{
for(int j = 1; j <= i; j++)
{
Console.Write(i);
}
Console.WriteLine();
}
}
Uppgift 6 | Strukturerad utskrift V | ||
---|---|---|---|
Beskrivning |
Skriv en metod, NestedPrintFour , som tar emot ett heltal som användaren anger och skriver ut följande mönster:
* skrivs ut per rad. Antalet rader som skrivs ut bestäms av det heltal som tas emot som argument.
|
Lösningsförslag
void NestedPrintFour(int iterations){
for(int i = 0; i < iterations; i++)
{
for(int j = 1; j <= iterations-i; j++)
Console.Write(" ");
for(int k = 1; k <= 2 * i-1; k++)
Console.Write("*");
Console.WriteLine();
}
}
Uppgift 7 | Summan av alla heltal mellan 1-100 |
---|---|
Beskrivning | Skriv en metod, GaussianSum , som skriver ut summan av alla positiva heltal från 1 till och med 100. OBS! Resultatet av beräkningen är 5050, men detta ska beräknas i metoden. Du ska mao. inte hårdkoda resultatet och skriva ut det. |
Lösningsförslag
void GaussianSum(){
int sum = 0;
for (int i = 1; i <= 100; i++)
{
sum += i;
}
Console.WriteLine(sum);
}
// alt. lösning
void GaussianSum(){
Console.WriteLine(100(100+1)/2));
}
Uppgift 8 | Beräkna medelvärdet | ||
---|---|---|---|
Beskrivning |
Skriv en metod, Average , som beräknar medelvärdet av heltal som anges av användaren. Metoden ska fortsätta ta emot heltal tills dess att användaren anger -1 . När detta sker så beräknas medelvärdet vilket metoden sedan skriver ut och returnerar. Exempel på interaktion med metoden:
|
Lösningsförslag
int Average()
{
int sum, count, input;
sum = count = input = 0;
while (input != -1)
{
Console.Write("Ange ett heltal: ");
int.TryParse(Console.ReadLine(), out input);
if (input == -1)
break;
sum += input;
if (input != 0)
count++;
}
if(count == 0)
{
Console.WriteLine("Beräkning kan ej genomföras");
return 0;
}
else
{
Console.WriteLine("Medelvärdet är: " + (sum / count));
return sum / count;
}
return 0;
}
Uppgift 9 | Fakultet (matematik) |
---|---|
Beskrivning | Skriv en metod, CalculateFactorial , som tar emot ett heltal som argument och skriver ut fakulteten hos det talet. OBS! För att beräkna fakulteten hos ett tal så beräknar man produkten hos alla heltal - från och med 1 - till och med heltalet i fråga. Dvs. att om vi exempelvis vill beräkna fakulteten för heltalet 5 så skulle det se ut enligt: !5 = 1 * 2 * 3 * 4 * 5 vilket ger oss 120. Notera att heltalet i fråga måste vara större än 0, annars kan ingen beräkning ske. |
Lösningsförslag
void CalculateFactorial(int input){
if(input > 0){
for (int i = input - 1; i >= 1; i--)
{
input *= i;
}
Console.WriteLine("Fakulteten är: " + input);
}
else
Console.WriteLine("Heltalet måste vara större än 0!");
}
Uppgift 10 | Rekursiv metod (Fakultet II) | ||
---|---|---|---|
Beskrivning |
En rekursiv metod är en metod som anropar sig själv tills dess att ett s.k. "basfall" uppnås. Denna typ av metod är mer vanligt förekommande i funktionella språk, men det är fullt möjligt att nyttja dem även i C# . Fördelarna med denna typ av metoder är att de resulterar i mindre kod och oftast är mer resurseffektiva (dvs. snabbare). Nackdelarna är det kan vara svårt att förstå sig på processen samt att det är betydligt svårare att felsöka dem i jämförelse med vanlig iteration. Ett exempel på rekursion skulle vara följande:
Rec räknar från det heltal som skrivs in till och med 10 och skriver ut följden i konsolen.Uppgiften är att försöka lösa Uppgift 9 (Fakultet) på nytt fast genom att nyttja rekursion istället. OBS! Denna uppgift är svår och faller egentligen något utanför kursens ramar (dvs. att innehållet är överkurs). Tanken med uppgiften är att introducera begreppet rekursion samt tillhandahålla möjligheten att testa på det. |
Lösningsförslag
void CalculateFactorial(int input){
if(input == 0)
return 1;
else
return input * CalculateFactorial(input - 1);
}
Uppgift 11 | Primtal? |
---|---|
Beskrivning | Skriv en metod, IsPrime , som tar emot ett heltal och avgör om heltalet är ett primtal eller ej. Ett primtal är ett heltal som är större än 1 och som enbart är jämnt delbart med 1 eller sig självt. Exempelvis så är 2, 3 och 5 primtal medan 4 och 6 inte är det då de även är jämnt delbara med 2. TIPS! Nyttja modulus och iteration för att kontrollera om det finns fler än två ( 1 resp. talet självt ) faktorer. Tänk på att jämna tal, utöver 2 , inte kan vara primtal. |
Lösningsförslag
bool IsPrime(int input){
// De första fallen kan hanteras via selektion.
if (input == 1) return false;
if (input == 2) return true;
for (int i = 2; i * i <= input; i++)
{
if (input % i == 0)
return false;
}
// Om talet har passerat loopen så är det ett primtal.
return true;
}
Uppgift 12 | Alla primtal upp till… |
---|---|
Beskrivning | Skriv en metod, PrimeNumbers , som tar emot ett heltal och skriver ut samtliga primtal från 1 upp till och med det heltalet. TIPS! Nyttja din implementation från Uppgift 11 för att lösa uppgiften. |
Lösningsförslag
void PrimeNumbers(int input){
// De första fallen kan hanteras via selektion.
if (input < 2)
Console.WriteLine("Ange ett heltal större än 1.");
else
{
for (int i = 1; i <= input; i++)
{
if(IsPrime(i))
Console.WriteLine(i + " is a prime.");
}
}
Uppgift 13 | Fibonacci |
---|---|
Beskrivning | Skriv en metod, Fibonacci , som tar emot ett heltal och skriver ut tal i Fibonnaci-sekvensen. Antalet tal som skrivs ut avgörs av det angivna heltalet. Ett Fibonnaci-tal är summan av de två föregående talen i en sekvens av heltal. Exempelvis är de första 5 Fibonnaci-talen: 0 1 1 2 3. Vi kan i denna talföljd identifiera det tidigare nämnda mönstret givet 0 + 1 = 1 , 1 + 1 = 2 , 1 + 2 = 3 osv. |
Lösningsförslag
void Fibonacci(int input)
{
int n1, n2 = 1, n3;
n1 = n3 = 0;
Console.WriteLine(n1);
Console.WriteLine(n2);
for (int i = 2; i < input; i++)
{
n3 = n1 + n2;
Console.WriteLine(n3);
n1 = n2;
n2 = n3;
}
}
Alt. lösning:
void Fibb(int input)
{
int i = 0;
for (int n1 = 0, n2 = 1, n3 = 0; i < input; n3 = n1 + n2, n1 = n2, n2 = n3, i++)
{
Console.WriteLine(n1);
}
}
Uppgift 14 | Multiplikationstabellen för X | ||
---|---|---|---|
Beskrivning |
Skriv en metod, CalculateMultTable , som tar emot ett heltal som argument och returnerar en array av heltal. Metoden ska beräkna multiplikationstabellen (från 1 till och med 10) för heltalet och bygga upp en array innehållandes denna multiplikationstabell. Ett exempel på interaktion med metoden är:
|
Lösningsförslag
int[] CalculateMultTable(int input){
int[] arr = new int[10];
for(int i = 1; i <= arr.Length; i++){
arr[i-1] = input * i;
}
return arr;
}
Uppgift 15 | Utskrift av arrayer |
---|---|
Beskrivning | Skriv en metod, PrettyPrint , som tar emot en array av heltal som argument och inte returnerar någonting. Problemet med Uppgift 1 är att vi inte kan skriva ut innehållet i den array som skickas tillbaka i nuläget. Om vi exempelvis nyttjar Console.WriteLine(CalculateMultTable(3)); så kommer vi enbart att skriva ut dess datatyp snarare än innehållet i arrayen. För att skriva ut innehållet så behöver man istället peka på vilket element man specifikt vill skriva ut och det är detta PrettyPrint är ämnad att utföra. Metoden ska skriva ut en array enligt följande format: 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 NOTERA att det alltså inte ska förekomma ett kommatecken efter det sista värdet. Metoden ska även kunna skriva ut innehållet i en array av heltal oavsett dess storlek. |
Lösningsförslag
void PrettyPrint(int[] input){
for(int i = 0; i < input.Length; i++){
if(i == input.Length-1)
Console.Write(input[i]);
else
Console.Write(input[i] + ", ");
}
}
Uppgift 16 | Utskrift av arrayer (baklänges) |
---|---|
Beskrivning | Skriv en metod, PrettyPrintReversed , som tar emot en array av heltal som argument och skriver ut innehållet i arrayen baklänges. Baklänges innefattar att om arrayen innehåller värdena [1, 3, 9] så ska utskriften vara [9, 3, 1]. Metoden ska skriva ut en array enligt följande format: 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 NOTERA att det alltså inte ska förekomma ett kommatecken efter det sista värdet. Metoden ska även kunna skriva ut innehållet i en array av heltal oavsett dess storlek. |
Lösningsförslag
void PrettyPrintReversed(int[] input){
for(int i = input.Legnth-1; i >= 0; i--){
if(i == 0)
Console.Write(input[i]);
else
Console.Write(input[i] + ", ");
}
}
Uppgift 17 | Största värdet i en array |
---|---|
Beskrivning | Skriv en metod, HighestNumber , som tar emot en array av positiva heltal som argument och returnerar det största värdet i arrayen. |
Lösningsförslag
int HighestNumber(int[] input){
int max = 0;
for(int i = 0; i < input.Length; i++){
if(input[i] > max)
max = input[i];
}
return max;
}
Uppgift 18 | Näst största värdet i en array |
---|---|
Beskrivning | Skriv en metod, SecondHighestNumber , som tar emot en array av heltal som argument och returnerar det näst största värdet i arrayen. TIPS! Reflektera kring hur implementationen i Uppgift 17 kan anpassas för att hämta det näst största värdet istället för det största. |
Lösningsförslag
int SecondHighestNumber(int[] input)
{
int max = input[0], nMax = 0;
for (int i = 1; i < input.Length; i++)
{
if (input[i] > max)
{
nMax = max;
max = input[i];
}
else if (input[i] > nMax && input[i] != max)
nMax = input[i];
}
return nMax;
}
Uppgift 19 | Medelvärdet i en array |
---|---|
Beskrivning | Skriv en metod, AverageNumber , som tar emot en array av heltal som argument och returnerar medelvärdet av alla värden i arrayen. |
Lösningsförslag
int AverageNumber(int[] input){
int sum = 0;
for(int i = 0; i < input.Length; i++){
sum += input[i];
}
return sum / (input.Length-1);
}
Uppgift 20 | Summering av arrayer | ||
---|---|---|---|
Beskrivning |
Skriv en metod, SumArrays , som tar emot två arrayer av heltal som argument (arrayA och arrayB ) och returnerar en array - arrayC - som innehåller summan av talen på resp. position. Ett exempel på interaktion med metoden är:
|
Lösningsförslag
int[] SumArrays(int[] arrayA, int[] arrayB){
int[] arrayC = new int[arrayA.Length];
for(int i = 0; i < arrayA.Length; i++){
arrayC[i] = arrayA[i] + arrayB[i];
}
return arrayC;
}
Uppgift 21 | Count | ||
---|---|---|---|
Beskrivning |
Skriv en metod, Count , som tar emot en array av heltal och ett heltal som argument och returnerar antalet gånger det heltalet förekommer i arrayen. Ett exempel på interaktion med metoden är:
|
Lösningsförslag
int Count(int[] arr, int n){
int count = 0;
for(int i = 0; i < arr.Length; i++){
if(arr[i] == n)
count++;
}
return count;
}
Uppgift 22 | PrintUniques | ||
---|---|---|---|
Beskrivning |
Skriv en metod, PrintUniques , som tar emot en array av heltal som argument och skriver ut alla unika värden i arrayen. Om arrayen inte innehåller några unika värden så ska "There are no unique values in the array." skrivas ut. Ett exempel på interaktion med metoden är:
Count från Uppgift 21.
|
Lösningsförslag
void PrintUniques(int[] arr)
{
int count = 0;
for (int i = 0; i < arr.Length; i++)
{
if (Count(arr, arr[i]) < 2)
{
Console.WriteLine(arr[i] + " is a unique value.");
count++;
}
}
if (count == 0)
Console.WriteLine("There are no unique values in the array.");
}
Uppgift 23 | Sort array | ||
---|---|---|---|
Beskrivning |
Skriv en metod, SimpleSort , som tar emot en array av heltal som argument och sorterar dem enligt storleksordning. Ett exempel på interaktion med metoden är:
|
Lösningsförslag
void SimpleSort(int[] arr)
{
int temp = 0;
for (int i = 0; i < arr.Length; i++)
{
for(int j = i; j < arr.Length; j++)
{
if(arr[i] > arr[j])
{
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
}
Uppgift 24 | IsDuplicate | ||
---|---|---|---|
Beskrivning |
Skriv en metod, IsDuplicate , som tar emot en array av heltal som argument samt ett heltal och avgör om heltalet förekommer fler än en gång i arrayen. Ett exempel på interaktion med metoden är:
Count (Uppgift 21).
|
Lösningsförslag
bool IsDuplicate(int[] arr, int n)
{
int count = 0;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] == n)
count++;
}
if (count > 1)
return true;
return false;
}
Strängar
En sträng är egentligen en array utav tecken (char
). Detta innebär att vi kan behandla en sträng likt hur vi behandlar en array. Föreställ dig exempelvis att vi har en sträng i stil med:
string hello = "Hello World!";
och att vi är intresserade av att hämta det tecken som förekommer på just indexposition 4. Vi kan uppnå detta genom att skriva hello[4]
(som då är ‘o’).
Vi skulle även kunna iterera över en sträng, likt hur vi skulle göra för en array som består av heltal. Exempelvis enligt:
string text = "Hello everybody!";
char c = '';
for (int i = 0; i < text.Length; i++)
{
c = text[i]; // nyttjar indexering. 'c' kommer första iterationen att innehålla 'H' sedan 'e' osv.
}
Datatypen string
innehåller även många olika inbyggda metoder som gör det möjligt att enkelt hantera och manipulera strängar på olika sätt. Några exempel på några vanligt förekommande metoder är IndexOf
, Substring
, Split
, ToUpper
och ToLower
.
IndexOf
kan nyttjas för att returnera indexpositionen hos en specifik char
i en sträng men även för att kontrollera om en sträng förekommer inuti en annan sträng. Om en sådan förekomst inte påträffas (dvs. om strängen inte finns i den andra strängen) så returneras -1, vilket kan nyttjas som en typ av kod vid felhantering. Exempel på nyttjande av metoden:
string text = "Hello world, it is I!";
string searchText = "world";
int startIndex = text.IndexOf(searchText); // startIndex = 6
int startIndex2 = text.IndexOf('e'); // startIndex2 = 1
string searchText2 = "test";
int startIndex3 = text.IndexOf(searchText2); // startIndex3 = -1
Substring
kan nyttjas för att returnera en del utav en sträng. Vilken del som ska returneras samt och storleken på denna del är beror på vilka argument som anges. Exempelvis kan vi ange att vi vill ha allt från en angiven startposition string s = exempel.Substring(3);
men vi kan även ange ytterligare ett argument som avser hur långt vi vill gå från startpositionen (dvs. längden på delsträngen) string s = exempel.Substring(3, 7);
. OBS! Även blanksteg räknas som ett tecken i en sträng. Exempel på nyttjande av metoden:
string text = "Hello world, it is I!";
string subString = text.Substring(6); // subString = "world, it is I!"
string subString2 = text.Substring(6, 5); // subString = "world"
Split
kan nyttjas för att returnera en array av strängar från en sträng som separerats på ett (eller flera) angivet/angivna tecken. Som namnet antyder innefattar metoden att vi “splittar” (delar upp) en sträng. Exempel på nyttjande av metoden:
string fruits = "Apples, Oranges, Pears";
// Vi anger att vi vill dela upp strängen vid ','.
// Resultatet blir en array som innehåller 3 st. strängar.
string[] listOfFruits = fruits.Split(','); // listOfFruits = ["Apples", "Oranges", "Pears"]
För att undvika tomma strängar så har vi även möjligheten att nyttja något som kallas för StringSplitOptions
:
string fruits = "Apples, Oranges, Pears";
// Vi anger att vi vill dela upp strängen vid ',' och ' '.
// Resultatet blir en array som innehåller 3 st. strängar.
string[] listOfFruits = fruits.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
Notera att utan StringSplitOptions
så skulle vi få en array med 5 element då mellanslag förekommer framför “Oranges” resp. “Pears” i strängen.
ToLower
och ToUpper
är metoder som kan nyttjas för att helt enkelt transformera en sträng så att den antingen enbart innehåller gemener eller versaler. Detta kan vara särskilt smidigt i fall som exempelvis då vi vill jämföra två strängar eller kontrollera dess innehåll. Exempel på nyttjande av metoderna:
string input1 = "HelLO wOrlD";
string toLower = input1.ToLower(); // "hello world"
string input2 = "HelLO wOrlD";
string toUpper = input2.ToUpper(); // "HELLO WORLD"
I denna sektion så förväntas du öva på dessa olika former av strängmanipulering.
Uppgiftsförteckning
Uppgift 1 | StringLength |
---|---|
Beskrivning | Skriv en metod, StringLength , som tar emot en sträng som argument och beräknar längden på strängen (antalet tecken). Då en string kan, som tidigare nämnt, tolkas som en array av bokstäver så kan man självfallet nyttja egenskapen Length precis som vi har gjort i tidigare uppgifter men detta är inte syftet sett till uppgiften. Metoden StringLength ska dock beräkna längden via iteration istället.TIPS! Nyttja en foreach -loop för att iterera över strängen. |
Lösningsförslag
int StringLength (string input){
int length = 0;
foreach(char c in input)
{
length++;
}
return length;
}
Uppgift 2 | Reverse string |
---|---|
Beskrivning | Skriv en metod, StringReversed , som tar emot en sträng som argument och skriver ut strängen i bakvänd ordning. Dvs. givet strängen "Hello world!" så ska "!dlrow olleH" skrivas ut. |
Lösningsförslag
void StringReversed (string input){
for(int i = input.Length-1; i >=0; i--)
{
Console.Write(input[i]);
}
}
Uppgift 3 | RemoveSpaces |
---|---|
Beskrivning | Skriv en metod, RemoveSpaces , som tar emot en sträng som argument och skriver ut den efter att alla mellanslag har tagits bort från strängen. Om inga mellanslag förekommer i strängen så ska “No spaces in string.” skrivas ut istället. TIPS! Nyttja den inbyggda metoden Split . |
Lösningsförslag
void RemoveSpaces (string input){
string[] noSpaces = input.Split(' ');
if(noSpaces.Length < 2)
Console.WriteLine("No spaces in string.");
else
{
string output = string.Empty;
for(int i = 0; i < noSpaces.Length; i++)
{
output += noSpaces[i];
}
Console.WriteLine(output);
}
// Alt. lösning
void RemoveSpaces (string input){
string output = string.Empty;
int count = 0;
for(int i = 0; i < input.Length; i++)
{
if(input[i] != " ")
output += input[i];
else
count++;
}
if(count > 0)
Console.WriteLine("No spaces in string.");
else
Console.WriteLine(output);
}
Uppgift 4 | RemoveSpecificChar |
---|---|
Beskrivning | Skriv en metod, RemoveSpecificChar , som tar emot ett tecken samt en sträng som argument och returnerar strängen efter att alla tecken som matchar argumentet har tagits bort. |
Lösningsförslag
string RemoveSpecificChar (string input, char c){
string output = string.Empty;
for(int i = 0; i < input.Length; i++)
{
if(input[i] != c)
output += input[i];
}
return output;
}
Uppgift 5 | Sammanställning av sträng |
---|---|
Beskrivning | Skriv en metod, GetStringContent , som tar emot en sträng som argument och skriver ut alla bokstäver, siffror och specialtecken som förekommer i strängen. Dvs. givet meningen “Hello world! 123” så ska följande skrivas ut: Bokstäver: 10 Siffror: 3 Specialtecken: 1. Notera att mellanslag inte tillhör någon kategori och därför inte ska tillgodoräknas. TIPS! Det finns en inbyggd metod för datatypen char som kan avgöra om ett tecken är en siffra samt en annan som kan avgöra om ett tecken är en bokstav. |
Lösningsförslag
void GetStringContent(string input)
{
int digits, letters, symbols;
digits = letters = symbols = 0;
for (int i = 0; i < input.Length; i++)
{
// För att hantera mellanslag
if (input[i] == ' ') { }
else if (char.IsDigit(input[i]))
digits++;
else if (char.IsLetter(input[i]))
letters++;
else
symbols++;
}
Console.WriteLine("Bokstäver: " + letters);
Console.WriteLine("Siffror: " + digits);
Console.WriteLine("Specialtecken: " + symbols);
}
Uppgift 6 | Manuell Substring |
---|---|
Beskrivning | Skriv en metod, SubString , som tar emot en sträng samt ett heltal som argument och returnerar en delsträng från och med det angivna heltalet där heltalet representerar en indexposition. Skriv sedan en annan metod, SubString som tar emot en sträng samt två heltal som argument och returnerar en delsträng mellan indexpositionen som det första heltalet avser och indexpositionen som det andra heltalet avser. OBS! Metoderna har samma namn men inte samma metodsignatur (två argument gentemot tre). Vi kommer att behandla detta ytterligare i senare kurser, men notera gärna detta. Denna uppgift är tänkt att öka förståelsen för hur Substring fungerar genom att skriva en egen implementation av metoden. Uppgiften ska därför inte lösas mha. den inbyggda metoden Substring . |
Lösningsförslag
string SubString(string input, int start)
{
string substring = string.Empty;
// Felhantering för att undvika IndexOutOfRange
if(input.Length <= start || start < 1)
return substring;
for (int i = start; i < input.Length; i++)
{
substring += input[i];
}
return substring;
}
string SubString(string input, int start, int stop)
{
string substring = string.Empty;
// Felhantering för att undvika IndexOutOfRange
if(input.Length <= start || start < 1 || input.Length <= stop)
return substring;
for (int i = start; i <= stop; i++)
{
substring += input[i];
}
return substring;
}
Uppgift 7 | Manuell IndexOf |
---|---|
Beskrivning | Skriv en metod, IndexOfChar , som tar emot en sträng, ett tecken samt ett heltal - som avser startposition för sökningen - och skickar tillbaka indexpositionen som tecknet förekommer på i strängen. Om tecknet inte förekommer i strängen så ska -1 returneras. OBS! Denna uppgift är tänkt att öka förståelsen för hur IndexOf fungerar genom att skriva en egen implementation av metoden. Uppgiften ska därför inte lösas mha. den inbyggda metoden IndexOf . |
Lösningsförslag
int IndexOfChar(string input, char c, int pos)
{
for(int i = pos; i < input.Length; i++)
{
if(input[i] == c)
return i;
}
return -1;
}
Uppgift 8 | IsStringInString |
---|---|
Beskrivning | Skriv en metod, IsStringInString , som tar emot två strängar som argument och avgör om den andra strängen förekommer i den första strängen. TIPS! Nyttja den inbyggda metoden Substring eller din implementation från Uppgift 6 för att jämföra den andra strängen mot den första strängen. Nyttja den inbyggda metoden IndexOf eller din implementation från Uppgift 7 för att hämta positionen i den första strängen där delsträngen (den andra strängen) börjar. |
Lösningsförslag
bool IsStringInString(string input, string substring)
{
// Positionen i input för den första bokstaven i substring
int index = input.IndexOf(substring[0]);
// variabel som tillåter oss att gå vidare till nästa "IndexOf"-värde
int pos = 0;
// Iteration för att om substring[0] t.ex. är 'a' så förekommer det sannolikt flera gånger i strängen.
// -1 är felkoden för om tecknet inte hittas i strängen.
while(index != -1)
{
// Felhantering så att vi inte får IndexOutOfRange.
// Vi plockar ut en delsträng från input, med samma längd som "substring" och jämför dem mot varandra.
if (index + substring.Length < input.Length && input.Substring(index, substring.Length) == substring)
return true;
// Uppdatera från vilken indexposition vi vill titta på.
// Om vi inte gör detta så kommer vi att kolla på t.ex. position 10 för evigt.
pos = index + 1;
index = input.IndexOf(substring[0], pos);
// Alt. Uppgift 7 implementation
// index = IndexOfChar(input, substring[0], pos);
}
return false;
}
Problemlösning
I denna sektion så hittar du övningsuppgifter utan några lösningsförslag. Tanken med dessa uppgifter är att du ska kombinera de koncept som har behandlats i tidigare sektioner för att lösa problem på egen hand. Om du kör fast så kan du i första hand återgå till relevanta tidigare sektioner, se över kursmaterialet eller Googla efter tillvägagångssätt på egen hand.
Uppgiftsförteckning
Uppgift 1 | Summering och sammanslagning av arrayer (Enkel) |
---|---|
Beskrivning | Skriv en metod, SumArrays , som tar emot två arrayer av heltal som argument (arrayA och arrayB ) och returnerar en array - arrayC - som innehåller summan av talen på resp. position. Dvs. att om värdet på position 0 i arrayA är 5 och värdet på position 0 i arrayB är 13 så ska position 0 i arrayC innehålla värdet 18 osv.OBS! Om den ena arrayen är längre än den andra så ska värdet från den längre arrayen placeras i arrayC . |
Uppgift 2 | Prisberäkning för inträde (Enkel) |
---|---|
Beskrivning | Skriv en metod, AdmissionPrice , som beräknar priset för inträde till ett nöjesfält baserat på gästernas ålder. Antalet gäster som tillhör gruppen bestäms utav användaren som skriver in N . Därefter hämtas samtliga av dessa gästers namn och deras resp. ålderin. Pristabellen som gäller är: - Barn (3-12): 50 kr. - Pensionär (65+): 75 kr. Samtliga resterande åldersgrupper betalar alltid 110 kr. Om gruppen består utav fler än 4 gäster så ges en rabatt på 20% på totalpriset. Metoden ska efter beräkning skriva ut antalet gäster i gruppen och den totala summan. |
Uppgift 3 | BMI kalkylator (Enkel) |
---|---|
Beskrivning | Skriv en metod som beräknar BMI (body mass index) värdet för en person. Metoden ska läsa in personens längd och vikt och därefter nyttja en utav två formler för att utföra beräkningen. Vilken formel som ska nyttjas beror på om längd och vikt anges enligt metriska eller imperiska mått (dvs. exempelvis cm gentemot feet + inches). Den metriska formeln är: BMI = (weight / (height * height)) och den imperiska formeln är: BMI = (weight / (height * height)) * 703 |
Uppgift 4 | Ordbyte (Enkel) |
---|---|
Beskrivning | Skriv en metod, ReplaceWord , som byter alla förekomster av ett utvalt ord mot ett annat. Metoden ska ta emot en mening som argument och därefter fråga användaren vilket ord som ska bytas ut samt vad det ska bytas ut mot. Om ordet som ska bytas ut inte förekommer i meningen så ska användaren meddelas om detta och ges möjligheten att ange ett annat ord. |
Uppgift 5 | Element på udda positioner (Enkel) |
---|---|
Beskrivning | Skriv en metod som tar emot en array av heltal och returnerar samtliga element som förekommer på udda indexpositioner. Dvs. att givet exempelvis arrayen [3, 5, 10, 2, 6] så ska 5 och 2 returneras. Om arrayen inte har några udda positioner så ska null returneras. |
Uppgift 6 | Guessing game (Enkel) |
---|---|
Beskrivning | Skriv ett program som tillåter en användare att gissa på ett “hemligt” nummer. Efter varje gissning så ska programmet skriva ut huruvida gissningen var lägre eller större än det hemliga numret. Denna process ska återupprepas tills dess att användaren gissar rätt eller anger “EXIT”. Om användaren gissar rätt så ska antalet gissningar som krävdes för att komma fram till svaret skrivas ut. |
Uppgift 7 | LongestWord (Enkel) |
---|---|
Beskrivning | Skriv en metod, LongestWord , som tar emot en mening och returnerar det längsta ordet i meningen. Om det förekommer två eller flera ord - vilka samtliga har samma längd och är längre än resterande ord i meningen - så ska det första ordet returneras. Dvs. att givet exempelvis meningen "I love cats" så ska "love" skickas tillbaka. TIPS! Nyttja den inbyggda metoden Split för att dela upp meningen på mellanslag. |
Uppgift 8 | “Enkel” addition (Enkel) |
---|---|
Beskrivning | Skriv en metod, SimpleAdd , som tar emot ett heltal (n) och returnerar summan av alla heltal från 1 till och med n. Dvs. att om n är 12 så ska 78 returneras (1+2+3…11+12). |
Uppgift 9 | ToggleString (Enkel) |
---|---|
Beskrivning | Skriv en metod, ToggleString , som tar emot en sträng och returnerar samma sträng efter att ha bytt ut alla gemener mot versaler och versal mot gemener. Dvs. att givet strängen “HelLo wORld” så ska “hELlO WorLD” returneras. Strängen måste vara längre än 1 tecken men mindre än 100 tecken, om detta krav inte uppfylls så ska en tom sträng returneras. |
Uppgift 10 | PowerOf (Enkel) |
---|---|
Beskrivning | Skriv en metod, PowerOf , som tar emot två heltal (n & p ). Metoden ska sedan returnera heltalet n upphöjt i p . Dvs. att givet heltalen 5 och 3 så ska 125 returneras. Om det istället är heltalen 5 och 4 så ska 625 returneras osv.TIPS! Nyttja datatypen long istället för int för att undvika att heltalet blir för stort (det största möjliga värdet som en int kan innehålla är 32767). NOTERA att den inbyggda metoden Math.Pow inte ska nyttjas för att lösa uppgiften. |
Uppgift 11 | FizzBuzz (Enkel) | ||
---|---|---|---|
Beskrivning |
Skriv en metod, FizzBuzz , som tar emot 3 heltal. n som representerar antalet iterationer, x som representerar det första delbara talet och y som representerar det andra delbara talet. Metoden fungerar på så sätt att den skriver ut alla tal mellan 1 till och med n . Om ett tal dock är jämnt delbart med x så ska "Fizz" skrivas ut framför talet. Om talet är jämnt delbart med y så ska “Buzz“ skrivas ut framför talet och om talet är jämnt delbart med x och y så ska “FizzBuzz“ skrivas ut framför talet. OBS! Varje tal ska enbart skrivas ut en gång. Exempel på interaktion med metoden kan tänkas se ut enligt följande:
|
Uppgift 12 | Palindrom (Enkel/Medel) |
---|---|
Beskrivning | Skriv en metod, IsPalindrome , som avgör om en sträng är ett palindrom eller ej. Ett palindrom är ett ord eller en mening som är exakt likadan skrivet baklänges, t.ex. “Sirap i paris”. Metoden ska ta mellanslag, specialtecken och versaler/gemener i beaktelse när den avgör om strängen är ett palindrom eller ej. |
Uppgift 13 | Hotellbokning (Enkel/Medel) |
---|---|
Beskrivning | Inom en hotellverksamhet önskar man få överblick över vilka rum som är bokade samt vilka som är lediga. Skriv först ett program (eller en metod) som läser in “bokat” kontra “ledigt” i en array som består utav 15 platser. Varje plats i arrayen motsvarar ett rum på hotellet. b. Utöka sedan programmet genom att lägga till möjligheten att genomföra bokningar. Vid en bokning så ska det första lediga rummet i rumslistan (arrayen) identifieras och sedan ändra värde till “bokat”. c. Utöka sedan programmet ytterligare genom att låta användaren ange om ett rum önskas bokas eller avbokas. Om rummet ska bokas kan implementationen i b) nyttjas, om en avbokning ska ske så behöver vi dock kunna hantera detta. Vid en avbokning så ska rumsnummer anges och efter avbokning så ska värdet i arrayen ändras till “ledigt”. |
Uppgift 14 | Hitta medianen (Enkel/Medel) |
---|---|
Beskrivning | Medianen är det tal som representerar mitten i en talföljd. Om vi exempelvis har heltalen 10, 63 och 15 så agerar 15 medianvärdet. Om vi istället har heltalen 10, 63, 15 och 25 så blir medianen istället 20 (15 + 20 / 2). Skriv en metod som tar emot en array av heltal som en parameter och returnerar medianen. TIPS! Tänk på att arrayen först och främst bör sorteras i storleksordning. Uppgift 23, SortArray, under sektionen “Iteration/arrayer” kan nyttjas för detta syfte. Efter detta så kan vi antingen enkelt plocka ut värdet i mitten (om arrayen består utav ett udda antal element) eller så behöver vi identifiera de två mittenvärden som finns i arrayen och utföra beräkningen enligt ovan exempel. |
Uppgift 15 | StringFormat (Enkel/Medel) |
---|---|
Beskrivning | Skriv en metod, StringFormat som tar emot en array av strängar och skriver ut samtliga strängar i arrayen enligt nedan format: Om arrayen innehåller [apples, oranges] så får vi: apples and oranges Om arrayen istället innehåller flera strängar t.ex. [apples, oranges, bananas] så får vi istället: apples, oranges and bananas TIPS! Nyttja metoden string.Split . |
Uppgift 16 | Tillägg till array (Enkel/Medel) |
---|---|
Beskrivning | Skriv en metod, AddInOrder , som tar emot en array av heltal samt ett heltal, lägger till heltalet i arrayen och sedan returnerar arrayen. Heltalet ska placeras i korrekt ordning i arrayen. Om heltalet redan förekommer i arrayen så ska tillägget inte ske. OBS! Metoden kan föreutsätta att arrayen redan är placerad i storleksordning, men du får självfallet nyttja en sorteringsalgoritm om du vill utöka metoden själv. |
Uppgift 17 | AlternateMerge (Medel) |
---|---|
Beskrivning | Skriv en metod, AlternateMerge , som tar emot två arrayer av heltal och returnerar en array som innehåller samtliga element från resp. array. Elementen ska dock placeras i turordning där vi först tar elementet på position 0 i den första arrayen följt av elementet på position 0 i den andra arrayen osv. Dvs. att givet arrayen [3, 5, 10, 2, 6] och [8, 1, 4, 12, 7] så skulle följande array returneras: [3, 8, 5, 1, 10, 4, 2, 12, 6, 7]. |
Uppgift 18 | Beräkning av heltal (Medel) | ||
---|---|---|---|
Beskrivning |
Skriv en metod som läser in ett godtyckligt antal positiva eller negativa tal från användaren. Metoden ska sedan räkna ut antalet positiva resp. negativa tal. För att avsluta inmatningen så ska användaren ange "e". Metoden ska då avslutningsvis skriva ut antalet positiva och negativa tal. Exempel på interaktion med metoden:
while -loop för att läsa in heltal från användaren.
|
Uppgift 19 | Beräkning av SGD (Medel) |
---|---|
Beskrivning | Den största gemensamma delaren (SGD) för ett antal heltal är det största heltalet som talen kan delas med utan att ge någon rest. Exempelvis är SGD(6, 9) = 3 då 3 är det största talet som är delbart med både 6 och 9. Skriv en metod som beräknar och returnerar den största gemensamma delaren för två heltal. För att läsa mer om SGD och se mer utförliga exempel på hur processen går till så kan följande länk nyttjas: SGD med Euklides algoritm. TIPS! Nyttja modulus för att avgöra huruvida divisionen resulterar i rest kombinerat med iteration för att identifiera SGD. |
Uppgift 20 | Teckenbyte (Medel) | ||
---|---|---|---|
Beskrivning |
Skriv en metod som kan läsa in flera textrader från användaren och byta ut varje förekomst av tecknet "O" till tecknet "Ö" resp. "o" till "ö". Metoden ska läsa in en rad i taget varvid metoden sedan ska presentera raden med de teckenbyten som har skett för att sedan läsa in nästa rad. Denna process ska upprepas tills dess att användaren anger "EXIT". Exempel på interaktion med metoden kan tänkas se ut enligt följande:
|
Uppgift 21 | RotateArrayBy2 (Medel/Svår) |
---|---|
Beskrivning | Skriv en metod, RotateArrayBy2 , som tar emot en array av heltal och roterar elementen i en array med 2 positioner åt vänster. Dvs. att givet arrayen [3, 5, 10, 2, 6] så skulle följande array returneras: [10, 2, 6, 3, 5]. OBS! Skriv din implementation utan att deklarera en ny array. |
Uppgift 22 | "String slicing" (Medel/Svår) | ||
---|---|---|---|
Beskrivning |
Skriv en metod som tar emot en sträng samt ett heltal (n ) och returnerar alla angränsande delsträngar (substrings ) av längden n i den ordning som de anges. Exempel på interaktion med metoden:
Concat samt Substring .
|
Uppgift 23 | Decimal to binary (Medel/Svår) |
---|---|
Beskrivning | Skriv en metod, DecToBin , som översätter ett heltal enligt det decimala talsystemet till det binära talsystemet. Det decimala talsystemet är det som vi nyttjar till vardags med basen 10 (0-9). Det binära talsystemet nyttjar istället basen 2 där något antingen är av eller på (0 eller 1). Således får vi exempelvis 1010 om vi översätter 10 , 1100100 om vi översätter 100 osv. NOTERA att ju längre något är till vänster i ett binärt tal, desto större är det. I 1010 så har vi 8, 4, 2, 1 där 1:orna indikerar de värden som ska tillgodoräknas (i detta fall 8:an och 2:an för 10).Om du vill läsa mer om hur man konverterar från det decimala talsystemet till det binära så kan du nyttja följande länk: Dec to binary. Om du vill nyttja en redan existerande konverterare så kan du kika på följande länk: Dec/Bin Converter. TIPS! Nyttja iteration och modulus. Uppgiften skall lösas utan den inbyggda metoden Convert.ToString . |
Uppgift 24 | Tidsberäkning av tågresor (Medel/Svår) |
---|---|
Beskrivning | Ett persontågsföretag vill ha ett program (en metod i detta fall) för att underlätta tidsberäkningen av tågresor med syftet att upprätta en tidtabell. Metoden ska läsa in avgångsort, avstånd mellan avgångsorten och destinationen samt datum och klockslag för avgång. Därefter ska metoden räkna ut vilket datum och vilken tid tåget kommer till destinationen. Tågets genomsnittliga hastighet är 130 km/h. TIPS! Nyttja SVT-triangeln för att beräkna tiden (givet hastigheten och avståndet). Datatypen DateTime kan nyttjas för att enklare behandla datum och klockslag, men det krävs då att man utforskar lite vad datatypen har att erbjuda på egen hand. Det är dock fullt möjligt att nyttja strängar istället. Följande länk kan nyttjas för att få en inblick i DateTime : DateTime |
Uppgift 25 | Textmarkering (Medel/Svår) | ||
---|---|---|---|
Beskrivning |
Skriv ett program som läser in en sträng med valfri text. Programmet ska därefter markera alla förekomster av tecknet “å” genom att skriva ut texten igen och på raden under skriva ett * för varje förekomst av tecknet (“å”). Exempelvis kan interaktion med programmet se ut enligt följande:
* .c. Utöka programmet ytterligare så att det istället för att skriva * för “å” och “ä” skriver tecknet * för “å” och tecknet % för “ä”.
|
Uppgift 26 | Summera individuella siffror i ett heltal (Medel/Svår) |
---|---|
Beskrivning | Skriv en metod som summerar samtliga siffror i ett heltal och returnerar summan. Om metoden exempelvis tar emot heltalet 1234 så ska 10 returneras. Uppgiften ska lösas utan att konvertera heltalet till en sträng. TIPS! Nyttja division och det decimala talsystemet för att “hoppa” en decimal i taget och summera dessa allt eftersom. Dvs. att vi från 1234 först plockar ut 4:an vilket lämnar oss med 123 , därefter plockar vi ut 3:an osv. |
Uppgift 27 | IsInteger (Medel/Svår) |
---|---|
Beskrivning | Skriv en metod, IsInteger som tar emot en sträng och avgör om strängen representerar ett riktigt heltal. Metoden ska ignorera mellanslag men behöver kunna hantera + -tecken och - -tecken. TIPS! Metoden char.IsDigit kan nyttjas för att avgöra om ett tecken representerar en siffra eller ej. |
Uppgift 28 | Begynnelsebokstäver (Medel/Svår) | ||
---|---|---|---|
Beskrivning |
Skriv en metod som skriver ut alla begynnelsebokstäver i en mening. Med begynnelsebokstäver så avses det första bokstaven i resp. ord i en mening. Exempel på interaktion med metoden:
|
Uppgift 29 | En bättre sökalgoritm (Svår) |
---|---|
Beskrivning | I introduktionen till sektionen “Iteration/Arrayer” så beskrivs en enkel sökalgoritm för att identifiera ett heltal i en array av heltal. Denna typ av sökalgoritm är dock väldigt ineffektiv då vi ev. måste iterera igenom hela arrayen innan vi kan fastställa om heltalet förekommer eller ej. Denna uppgift går således ut på att skriva en mer effektiv sökalgoritm. Processen för denna sökalgoritm kan beskrivas enligt nedan: 1. Kontrollera om elementet förekommer i mitten av arrayen. 2. Om det inte förekommer i mitten, är heltalet vi söker efter större än eller mindre än heltalet i mitten? Om det är mindre -> Upprepa sökningen, fast denna gång enbart från det första elementet till och med elementet till vänster om mittenvärdet. Om det är större -> Upprepa sökningen, fast denna gång enbart från det elementet till höger om mittenvärdet till och med det sista elementet i arrayen. 3. Upprepa processen tills vi har identifierat heltalet eller tills dess att vi kan fastställa att det inte förekommer i arrayen. OBS! Metoden förutsätter att arrayen redan är placerad i storleksordning. Skriv en metod, AvSearch , som tar emot en array av heltal samt ett heltal. Metoden ska därefter identifiera om heltalet förekommer i arrayen eller ej. TIPS! För att fastställa att talet inte förekommer i arrayen så är det fördelaktigt att ständigt uppdatera ramen som vi vill undersöka. Om vi t.ex. i första iterationen ser att talet tillhör den vänstra delen av arrayen så kan vi ändra vårt “max-värde” (inledningsvis det sista elementet i arrayen) till mittenvärdet -1. Därefter så fortsätter vi att iterera tills dess att vårt “min-värde” (inledningsvis det första elementet i arrayen) är större än eller lika med vårt “max-värde”. , men du får självfallet nyttja en sorteringsalgoritm om du vill utöka metoden själv. |
Uppgift 30 | RemoveDuplicates (Svår) |
---|---|
Beskrivning | Skriv en metod, RemoveDuplicates , som tar emot en array av heltal. Metoden ska sedan ta bort alla duplicerade värden i arrayen. Dvs. att givet exempelvis arrayen: [6, 6, 3, 3, 1, 9, 4] så ska en array med värdena [6, 3, 1, 9, 4] returneras.Testa först att skriva en implementation som ersätter alla duplicerade värden med 0:or snarare än att ta bort elementet från arrayen (reducera dess storlek). När du har lyckats med en sådan implementation så kan du sedan ge dig på den mer avancerade versionen som även reducerar arrayens storlek. TIPS! Du kan nyttja implementationen från Uppgift 24 ( IsDuplicate ) under sektionen “Iteration/Arrayer” samt en ytterligare stödmetod som reducerar storleken på arrayen genom att ta bort ett angivet heltal från arrayen. Tänk i detta fall då på att inte ta bort alla förekomster av heltalet (vi vill exempelvis behålla en utav 6:orna i ovan exempel).NOTERA att datastrukturen array ska nyttjas, inte ArrayList , List eller liknande datastrukturer. Det kan ev. dock vara fördelaktigt att reflektera kring inbyggda metoder för dessa andra typer av datastrukturer såsom Append , Add och Remove . |
Feedback
OBS! All feedback är välkommen, men försök gärna att vara så tydlig och konstruktiv i din feedback som möjligt. För att uppnå denna tydlighet så ber vi dig att inleda din feedback på två olika sätt:
Om din feedback avser ett problem med innehållet på sidan så ska feedbacken inledningsvis inkludera följande: Vilken sektion problemet har identifierats inom samt vilken uppgift som avses. Ett exempel på en sådan inledning skulle kunna tänkas vara: "Sektion: 2 Uppgift: 4 ..."
Om din feedback istället avser t.ex. förbättringsförslag för hemsidan (utseendemässigt, innehållsmässigt eller i förhållande till navigationen) så ska feedbacken inledas enligt nedan: "Övrig feedback ..."