diff --git a/Luento10/ArvotJaViitteet/ArvotJaViitteet.cs b/Luento10/ArvotJaViitteet/ArvotJaViitteet.cs new file mode 100644 index 0000000000000000000000000000000000000000..1aeb67cdffce43f508b7c77d3cf453b1aa39a8a5 --- /dev/null +++ b/Luento10/ArvotJaViitteet/ArvotJaViitteet.cs @@ -0,0 +1,40 @@ +using System; + +/// <summary> +/// Luento 10. Arvopohjaiset ja viitepohjaiset muuttujat +/// </summary> +public class ArvotJaViitteet +{ + /// <summary> + /// Arvopohjaiset ja viitepohjaiset muuttujat + /// </summary> + public static void Main() + { + int[] taulukko1 = { 1, 2, 3 }; + //Console.WriteLine(taulukko1); + int[] taulukko2 = taulukko1; + taulukko2[1] = 4; + + // Tätä ei nähty luennolla. Tarkoitus oli näyttää tämä, mutta unohdin. + // Sama tehtiin Pythonissa ja ajatus oli näyttää, että + // viite- ja arvopohjaisten muuttujien idea on hyvin samantapainen eri kielissä. + Console.WriteLine($"Eka alkio nyt: {taulukko1[0]}"); + Muuta(taulukko1); + Console.WriteLine($"Eka alkio Muuta-funktion kutsumisen jälkeen: {taulukko1[0]}"); + + int a = 3; + Console.WriteLine($"Arvopohjainen muuttuja aluksi: {a}"); + Muuta(a); + Console.WriteLine($"Arvopohjainen muuttuja Muuta-funktion kutsumisen jälkeen: {a}"); + } + + public static void Muuta(int luku) + { + luku = 1000; + } + + public static void Muuta(int[] t) + { + t[0] = 1000; + } +} \ No newline at end of file diff --git a/Luento10/ArvotJaViitteet/ArvotJaViitteet.csproj b/Luento10/ArvotJaViitteet/ArvotJaViitteet.csproj new file mode 100644 index 0000000000000000000000000000000000000000..085a6e3d4beb32574a83a24dd27da9164799f4a0 --- /dev/null +++ b/Luento10/ArvotJaViitteet/ArvotJaViitteet.csproj @@ -0,0 +1,9 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>net8.0</TargetFramework> + <ExternalConsole>true</ExternalConsole> + </PropertyGroup> + +</Project> diff --git a/Luento10/Luento10.pdf b/Luento10/Luento10.pdf new file mode 100644 index 0000000000000000000000000000000000000000..07eaa8f29c80ca4ea0455fe06c1d03b0c587bb1a Binary files /dev/null and b/Luento10/Luento10.pdf differ diff --git a/Luento10/Luento10.sln b/Luento10/Luento10.sln new file mode 100644 index 0000000000000000000000000000000000000000..d25864c100a435658438824e11f36ef2ff859df6 --- /dev/null +++ b/Luento10/Luento10.sln @@ -0,0 +1,29 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 + +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Taulukot", "Taulukot\Taulukot.csproj", "{0FC203C8-42F6-4D00-86E3-E6A17363798C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArvotJaViitteet", "ArvotJaViitteet\ArvotJaViitteet.csproj", "{C05BE3D5-EB6E-443F-AAC7-08E6CBFF0F23}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaulukotTest", "TaulukotTest\TaulukotTest.csproj", "{DF748CEF-0034-4407-9D73-12514497335D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0FC203C8-42F6-4D00-86E3-E6A17363798C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0FC203C8-42F6-4D00-86E3-E6A17363798C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0FC203C8-42F6-4D00-86E3-E6A17363798C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0FC203C8-42F6-4D00-86E3-E6A17363798C}.Release|Any CPU.Build.0 = Release|Any CPU + {C05BE3D5-EB6E-443F-AAC7-08E6CBFF0F23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C05BE3D5-EB6E-443F-AAC7-08E6CBFF0F23}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C05BE3D5-EB6E-443F-AAC7-08E6CBFF0F23}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C05BE3D5-EB6E-443F-AAC7-08E6CBFF0F23}.Release|Any CPU.Build.0 = Release|Any CPU + {DF748CEF-0034-4407-9D73-12514497335D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF748CEF-0034-4407-9D73-12514497335D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF748CEF-0034-4407-9D73-12514497335D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF748CEF-0034-4407-9D73-12514497335D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Luento10/Luento10.sln.ctbackup b/Luento10/Luento10.sln.ctbackup new file mode 100644 index 0000000000000000000000000000000000000000..c9246afe9bf027d9c8c2e19ffd056489aeef52a7 --- /dev/null +++ b/Luento10/Luento10.sln.ctbackup @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Taulukot", "Taulukot\Taulukot.csproj", "{0FC203C8-42F6-4D00-86E3-E6A17363798C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArvotJaViitteet", "ArvotJaViitteet\ArvotJaViitteet.csproj", "{C05BE3D5-EB6E-443F-AAC7-08E6CBFF0F23}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0FC203C8-42F6-4D00-86E3-E6A17363798C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0FC203C8-42F6-4D00-86E3-E6A17363798C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0FC203C8-42F6-4D00-86E3-E6A17363798C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0FC203C8-42F6-4D00-86E3-E6A17363798C}.Release|Any CPU.Build.0 = Release|Any CPU + {C05BE3D5-EB6E-443F-AAC7-08E6CBFF0F23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C05BE3D5-EB6E-443F-AAC7-08E6CBFF0F23}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C05BE3D5-EB6E-443F-AAC7-08E6CBFF0F23}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C05BE3D5-EB6E-443F-AAC7-08E6CBFF0F23}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Luento10/Merkkijonot/Merkkijonot.cs b/Luento10/Merkkijonot/Merkkijonot.cs new file mode 100644 index 0000000000000000000000000000000000000000..0acf4af2cd46895de877e488ed9b0581c7cab3e3 --- /dev/null +++ b/Luento10/Merkkijonot/Merkkijonot.cs @@ -0,0 +1,19 @@ +using System; +using System.Text; +using System.Linq; +using System.Collections.Generic; + +/// @author +/// @version +/// <summary> +/// Luento 10, lyhyt katsaus StringBuilder-merkkijonoon +/// </summary> +public class Merkkijonot +{ + /// <summary> + /// Alustetaan pari StringBuilderia + /// </summary> + public static void Main() + { + } +} \ No newline at end of file diff --git a/Luento10/Merkkijonot/Merkkijonot.csproj b/Luento10/Merkkijonot/Merkkijonot.csproj new file mode 100644 index 0000000000000000000000000000000000000000..df22a1ba07d539b07cf0adbaa6457daadeb433db --- /dev/null +++ b/Luento10/Merkkijonot/Merkkijonot.csproj @@ -0,0 +1,9 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>net7.0</TargetFramework> + <ExternalConsole>true</ExternalConsole> + </PropertyGroup> + +</Project> diff --git a/Luento10/Taulukot/Taulukot.cs b/Luento10/Taulukot/Taulukot.cs new file mode 100644 index 0000000000000000000000000000000000000000..ed9e24f9ca317254219a04e67ca49d1698cc7df2 --- /dev/null +++ b/Luento10/Taulukot/Taulukot.cs @@ -0,0 +1,199 @@ +using System; + + +#region Henkilon tiedot voitaisiin tallentaa esimerkiksi näin (tämän luennon ulkopuolista asiaa) + +public class Henkilo +{ + public string Nimi { get; set; } + public int Syntymavuosi { get; set; } + public string Osoite { get; set; } + public string Puhelin { get; set; } + public string Email { get; set; } + public string[] Harrastukset { get; set; } + public double TilinSaldo { get; set; } + + // Henkilöllä on myös metodeja, kuten TulostaTiedot(), LaskeIka(), jne. + // Opimme luokista lisää seuraavalla viikolla +} + +#endregion + +/// <summary> +/// Luento 10. Taulukot +/// </summary> +public class Taulukot +{ + /// <summary> + /// Vielä taulukoista + /// </summary> + public static void Main() + { + // Muistutus/tarkennus: Taulukoiden arvojen tulisi liittyä toisiinsa ja + // olla "samaa kategoriaa" (esim. lämpötilat, luennolle osallistujien nimet, + // lumiukon pallot, ...) + double[] lampotilat = { -1.0, 1.0, 2.0, -15.5, -14.5, -20.0, -30.0 }; + + // double[] henkilonTiedot = { 42.1, 183.0, 75.0, -10.0 }; + // Tällä tavalla tietojen tallentaminen ei ole suositeltavaa. + // Tähän tarkoitukseen paremmin sopivat luokat, tietueet tai monikot + + // Esimerkki 1: Taulukon alkioilla on kiinteä tyyppi, kuten muillakin muuttujilla + // string[] henkilot = { "Antti-Jussi", "Jonne", "Tuomo", 4 }; + // int[] luvut = { 3, 2, 1, "Jono" }; + // var luvut = new int[] { 3, 2, 1, "Jono"}; + + // Esimerkki 2: Taulukon sisältöä voi kuitenkin muuttaa. + int[] luvut = { 1, 2, 3, 5, 2, -1, 2 }; + luvut[0] = 5; + Console.WriteLine(luvut[0]); + + // Esimerkki 3: Alkioiden vaihto (ns. swap) + luvut[0] = 2; + luvut[6] = 1; + Console.WriteLine($"Ekassa on nyt {luvut[0]} ja vikassa {luvut[6]}"); + // Mikä on taulukon viimeisessä paikassa oleva alkio? + int temp = luvut[luvut.Length - 1]; + // Kopioidaan ekasta paikasta luku viimeiseen + luvut[luvut.Length - 1] = luvut[0]; + // Uudessa C#:ssa onnistuu myös näin: + // luvut[^1] = luvut[0]; + + luvut[0] = temp; + Console.WriteLine($"Ekassa on nyt {luvut[0]} ja vikassa {luvut[6]}"); + + // Esimerkki 4: TulostaJos(luvut, 1) + TulostaJos(luvut, 1); + + // Esimerkki 5: MontakoLukuaEnnenNollaa(luvut) + int[] luvut2 = { 1, 2, 3, 5, 2, -1, 2, 0, 8, 9, 1, -1, 0, 8, 9 }; + int ennenNollaa = MontakoLukuaEnnenNollaa(luvut2); + + // Esimerkki 6: Negatiivisten summa + double[] luvut3 = { -1.5, -2.0, 0, 2, 5, -3 }; + double summa = NegatiivistenSumma(luvut3); + Console.WriteLine($"Negatiivisten lukujen summa on {summa}"); + + // Esimerkki 7: Niiden merkkijonojen määrä, joista löytyy kirjain 'a' + string[] nimet = { "Antti-Jussi", "Jonne", "Vesa", "Tuomo", "Antti Aarnio" }; + int nimetJoissaA = KuinkaMonessaEsiintyy(nimet, 'a'); + } + + /// <summary> + /// Kuinka monessa merkkijonossa esiintyy etsittävä kirjain + /// </summary> + /// <param name="jonot">Merkkijonot</param> + /// <param name="etsittavaMerkki">Etsittävä merkki</param> + /// <returns>Jonojen lukumäärä</returns> + /// <example> + /// <pre name="test"> + /// string[] nimet = { "Antti-Jussi", "Jonne", "Vesa", "Tuomo", "Antti Aarnio" }; + /// KuinkaMonessaEsiintyy(nimet, 'a') === 3; + /// KuinkaMonessaEsiintyy(nimet, 'b') === 0; + /// KuinkaMonessaEsiintyy(nimet, 'A') === 3; + /// KuinkaMonessaEsiintyy(new string[]{ }, 'a') === 0; + /// </pre> + /// </example> + public static int KuinkaMonessaEsiintyy(string[] jonot, char etsittavaMerkki) + { + int monessako = 0; + foreach (string jono in jonot) + { + if (jono.ToLower().IndexOf(char.ToLower(etsittavaMerkki)) >= 0) + { + monessako++; + } + } + + return monessako; + } + + /// <summary> + /// Negatiivisten lukujen summa + /// </summary> + /// <param name="luvut">Luvut</param> + /// <returns>Summa</returns> + public static double NegatiivistenSumma(double[] luvut) + { + double summa = 0.0; + for (int i = 0; i < luvut.Length; i++) + { + // Tutkitaan onko alkion arvo negatiivinen + if (luvut[i] < 0) + { + summa += luvut[i]; + } + } + + return summa; + } + + /// <summary> + /// Montako lukua on ennen nollaa. + /// </summary> + /// <param name="luvut">Luvut</param> + /// <returns>Montako ennen nollaa</returns> + /// <example> + /// <pre name="test"> + /// int[] luvut = { 1, 2, 3, 5, 2, -1, 2, 0, 8, 9, 1, -1, 0, 8, 9 }; + /// MontakoLukuaEnnenNollaa(luvut) === 7; + /// MontakoLukuaEnnenNollaa(new int[] { }) === 0; + /// MontakoLukuaEnnenNollaa(new int[] { 3, 2, 1 }) === 3; + /// MontakoLukuaEnnenNollaa(new int[] { 0, 3, 2, 1 }) === 0; + /// </pre> + /// </example> + public static int MontakoLukuaEnnenNollaa(int[] luvut) + { + int montakoLukua = 0; + foreach (int luku in luvut) + { + if (luku == 0) break; + else montakoLukua++; + } + + return montakoLukua; + } + + /// <summary> + /// Tulosta luku mikäli se mätsää etsittävään lukuun + /// </summary> + /// <param name="luvut">Luvut</param> + /// <param name="etsittavaLuku">Etsittävä luku</param> + public static void TulostaJos(int[] luvut, int etsittavaLuku) + { + // Käydään läpi jokainen alkio taulukosta "luvut" + // Jos alkion arvo on täsmälleen "etsittavaLuku"-parametrin arvo + // Tulostetaan se + for (int i = 0; i < luvut.Length; i++) + { + if (luvut[i] == etsittavaLuku) + { + Console.WriteLine(luvut[i]); + } + } + } + + /// <summary> + /// Kuinka monesta merkkijonosta löytyy etsittävä kirjain + /// </summary> + /// <param name="jonot">Jonot</param> + /// <param name="etsittavaMerkki">Etsittävä merkki</param> + /// <returns>Sopivien merkkijonojen määrä</returns> + /// <example> + /// <pre name="test"> + /// string[] jonot = { "Antti-Jussi", "Jonne", "Vesa", "Tuomo" }; + /// LoytyykoKirjain(jonot, 'a') === 2; + /// LoytyykoKirjain(jonot, 'A') === 2; + /// LoytyykoKirjain(jonot, 'b') === 0; + /// LoytyykoKirjain(jonot, '-') === 1; + /// string[] jonot2 = { "Jonne", "Jonne" }; + /// LoytyykoKirjain(jonot, 'j') === 2; + /// string[] jonot3 = { }; + /// LoytyykoKirjain(jonot, 'C') === 0; + /// </pre> + /// </example> + public static int LoytyykoKirjain(string[] jonot, char etsittavaMerkki) + { + return 0; + } +} \ No newline at end of file diff --git a/Luento10/Taulukot/Taulukot.csproj b/Luento10/Taulukot/Taulukot.csproj new file mode 100644 index 0000000000000000000000000000000000000000..085a6e3d4beb32574a83a24dd27da9164799f4a0 --- /dev/null +++ b/Luento10/Taulukot/Taulukot.csproj @@ -0,0 +1,9 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>net8.0</TargetFramework> + <ExternalConsole>true</ExternalConsole> + </PropertyGroup> + +</Project> diff --git a/Luento10/TaulukotTest/TaulukotTest.cs b/Luento10/TaulukotTest/TaulukotTest.cs new file mode 100644 index 0000000000000000000000000000000000000000..57aabf9c6127759f64cfe03cf03306d43dfac7f5 --- /dev/null +++ b/Luento10/TaulukotTest/TaulukotTest.cs @@ -0,0 +1,46 @@ +// ReSharper disable all +using System; +using System.Text; +using System.Linq; +using System.Collections.Generic; +using NUnit.Framework; +using static Taulukot; +using static Henkilo; + + [TestFixture] + [DefaultFloatingPointTolerance(0.000001)] + public class TestTaulukot + { + [Test] + public void TestKuinkaMonessaEsiintyy90() + { + string[] nimet = { "Antti-Jussi", "Jonne", "Vesa", "Tuomo", "Antti Aarnio" }; + Assert.AreEqual( 3, KuinkaMonessaEsiintyy(nimet, 'a') , "in method KuinkaMonessaEsiintyy, line 92"); + Assert.AreEqual( 0, KuinkaMonessaEsiintyy(nimet, 'b') , "in method KuinkaMonessaEsiintyy, line 93"); + Assert.AreEqual( 3, KuinkaMonessaEsiintyy(nimet, 'A') , "in method KuinkaMonessaEsiintyy, line 94"); + Assert.AreEqual( 0, KuinkaMonessaEsiintyy(new string[]{ }, 'a') , "in method KuinkaMonessaEsiintyy, line 95"); + } + [Test] + public void TestMontakoLukuaEnnenNollaa131() + { + int[] luvut = { 1, 2, 3, 5, 2, -1, 2, 0, 8, 9, 1, -1, 0, 8, 9 }; + Assert.AreEqual( 7, MontakoLukuaEnnenNollaa(luvut) , "in method MontakoLukuaEnnenNollaa, line 133"); + Assert.AreEqual( 0, MontakoLukuaEnnenNollaa(new int[] { }) , "in method MontakoLukuaEnnenNollaa, line 134"); + Assert.AreEqual( 3, MontakoLukuaEnnenNollaa(new int[] { 3, 2, 1 }) , "in method MontakoLukuaEnnenNollaa, line 135"); + Assert.AreEqual( 0, MontakoLukuaEnnenNollaa(new int[] { 0, 3, 2, 1 }) , "in method MontakoLukuaEnnenNollaa, line 136"); + } + [Test] + public void TestLoytyykoKirjain171() + { + string[] jonot = { "Antti-Jussi", "Jonne", "Vesa", "Tuomo" }; + Assert.AreEqual( 2, LoytyykoKirjain(jonot, 'a') , "in method LoytyykoKirjain, line 173"); + Assert.AreEqual( 2, LoytyykoKirjain(jonot, 'A') , "in method LoytyykoKirjain, line 174"); + Assert.AreEqual( 0, LoytyykoKirjain(jonot, 'b') , "in method LoytyykoKirjain, line 175"); + Assert.AreEqual( 1, LoytyykoKirjain(jonot, '-') , "in method LoytyykoKirjain, line 176"); + string[] jonot2 = { "Jonne", "Jonne" }; + Assert.AreEqual( 2, LoytyykoKirjain(jonot, 'j') , "in method LoytyykoKirjain, line 178"); + string[] jonot3 = { }; + Assert.AreEqual( 0, LoytyykoKirjain(jonot, 'C') , "in method LoytyykoKirjain, line 180"); + } + } + diff --git a/Luento10/TaulukotTest/TaulukotTest.csproj b/Luento10/TaulukotTest/TaulukotTest.csproj new file mode 100644 index 0000000000000000000000000000000000000000..9c331f55aa74c0b6837c6216ef9175f588632ab1 --- /dev/null +++ b/Luento10/TaulukotTest/TaulukotTest.csproj @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Project Sdk="Microsoft.NET.Sdk"> + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <IsPackable>false</IsPackable> + </PropertyGroup> + <ItemGroup> + <PackageReference Include="NUnit" Version="3.13.1"/> + <PackageReference Include="NUnit3TestAdapter" Version="3.17.0"/> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3"/> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\Taulukot\Taulukot.csproj"/> + </ItemGroup> +</Project>