Programmering 2 Omvandling av strängar

Permalänk

Programmet körs från en annan plats när det komplieras än där du har källkoden och Program.cs, högerklicka blomma.png tryck properties och sen välj copy to output directory -> copy if newer så kopieras filen automatiskt till din build output directory.

Sen att dra slutsatsen "inget fungerar" när du får felet FileNotFound känns förhastat. Ta en paus och kolla på vad meddelandet säger till dig

Visa signatur

Ryzen 2700x, Nvidia 2080, 32gb 3200CL14 B-Die, 970 Evo
"Limbo" burk: I52500k, Nvidia 560 ti, 16gb Ram.
Server: FSC PI 2664. Quad core, 4gb minne, lite hårddiskar och en hel del damm.

Permalänk

Finns inget som heter "paus" när du försöker bli antagen till högskola. Men tack för omtanken.

Jag högerklickar på blomma.png men får inget properties alternativ.

Permalänk

Jag fann problemet uppskattar alla svar.

Glömde inkludera bilden i mitt projekt.

Permalänk

Programmering c#

Hur gör den här koden egentligen? Varför skriver den ut 32?

Skärmbild:
https://imgur.com/6EsUEVs

Om jag skriver -2 på index istället för -1 så blir värdet återigen 32, why?

Kör VS i windows.

Permalänk
Hedersmedlem

Vad förväntar du dig att den ska skriva ut?
Kommatecknet är på index 32 in i strängen. Värdet som index sätts till används ju aldrig så det kommer inte heller påverka vad koden gör, så länge som ett kommatecken finns och värdet skrivs över.

Edit: Se till att inte blanda ihop "index" med "i". Sätter du i till -1 eller -2 så lär du få en exception eller liknande (jag kodar sällan i just C# själv) pga out of bounds, men värdet på index läses ju som sagt enbart en gång, på rad 17 om ett kommatecken inte finns i strängen.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk

Glömde att index alltid börjar på 0 -.-

tack haha

Permalänk

Hur får jag det första 'e' att visas, försökte skriva in charAt men nope, hur gör jag?

Länk:
https://imgur.com/qQDNKhd

Permalänk
Medlem
Skrivet av Field_trip:

Hur får jag det första 'e' att visas, försökte skriva in charAt men nope, hur gör jag?

Länk:
https://imgur.com/qQDNKhd

Du kan kolla när 'e' är sant och sedan hoppa ur while-loopen när det stämmer med keywordet

break;

Permalänk

Tack Forsgren

Permalänk
Medlem
Skrivet av Field_trip:

Tack Forsgren

Om du vill ha en snyggare lösning kan du kolla på IndexOf.

https://docs.microsoft.com/en-us/dotnet/api/system.string.ind...

Permalänk

Mycket snyggare indeed, uppskattar det,

https://imgur.com/ekBnVAS

Permalänk
Hedersmedlem
Skrivet av Field_trip:

Mycket snyggare indeed, uppskattar det,

https://imgur.com/ekBnVAS

Du missade att använda "search" på rad 21.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk

Om strängen text skulle innehålla flera kommatecken hoppas jag att du tänker på att du får sista kommatecknets position om du använder den ursprungliga koden. Använder du istället IndexOf får du istället första kommatecknets position.

Permalänk
Medlem
Skrivet av Kommenterande 2:

Om strängen text skulle innehålla flera kommatecken hoppas jag att du tänker på att du får sista kommatecknets position om du använder den ursprungliga koden. Använder du istället IndexOf får du istället första kommatecknets position.

Det vet han om eftersom i kommentarerna tipsas det om break.

Permalänk
Skrivet av Kommenterande 2:

Om strängen text skulle innehålla flera kommatecken hoppas jag att du tänker på att du får sista kommatecknets position om du använder den ursprungliga koden. Använder du istället IndexOf får du istället första kommatecknets position.

tack. Det är jag medveten om men om jag har fler kommatecken så vill jag att konsolfönstret visar "Found "," in [text] at position [x] and [y] hur kan jag göra här?

Jag tänkte IndexOfAny men nej det blir visst fel. Den kanske funkar men kanske så används den inte korrekt.

Permalänk
Medlem
Skrivet av Field_trip:

tack. Det är jag medveten om men om jag har fler kommatecken så vill jag att konsolfönstret visar "Found "," in [text] at position [x] and [y] hur kan jag göra här?

Jag tänkte IndexOfAny men nej det blir visst fel. Den kanske funkar men kanske så används den inte korrekt.

En inte speciellt optimerad variant

var search = 'e'; var text = "Per olsson han hade en bonnagård, lian lian hej"; var matches = text.Select((c, i) => (c, i)).Where(x => x.c == search).Select(x => x.i); Console.WriteLine($"Hittade '{search}' på platserna '{string.Join(", ", matches)}'."); // >>> Hittade 'e' på platserna '1, 18, 20, 45'.

Alternativt att du skriver en funktion som loopar igenom och returnerar index

void Main() { var s = "Per olsson han hade en bonnagård, lian lian hej"; var c = 'e'; Console.WriteLine($"Hittade '{c}' på '{string.Join(", ", s.AllIndexOf(c))}'."); // >>> Hittade 'e' på '1, 18, 20, 45'. } public static class StringExtensions { public static IEnumerable<int> AllIndexOf(this string s, char c) { for (int i = 0; i < s.Length; i++) { if (s[i] == c) { yield return i; } } } }

Permalänk
Medlem
Skrivet av Field_trip:

tack. Det är jag medveten om men om jag har fler kommatecken så vill jag att konsolfönstret visar "Found "," in [text] at position [x] and [y] hur kan jag göra här?

Jag tänkte IndexOfAny men nej det blir visst fel. Den kanske funkar men kanske så används den inte korrekt.

Det finns ett antal olika överlagringar av IndexOf, d.v.s. flera metoder med samma namn men olika funktionalitet. En av dem är IndexOf(Char, Int32), samma som du använde men med ytterligare ett argument som anger var i strängen den ska börja leta. Exemplet i dokumentationen visar just hur man hittar alla förekomster av en karaktär i en sträng.

Permalänk

Programmering 2 c#

Tja

Om jag vill använda en metod som gör att första bokstaven blir en versal fortsatt av gemener, te.x, Hej istället för hej

Hur gör jag då? Jag vill lägga in en char metod

Jag vill göra en liknande kod public string FirstLetterToUpper(string str) { if (str == null) return null; if (str.Length > 1) return char.ToUpper(str[0]) + str.Substring(1); return str.ToUpper(); }

Var tror ni är den bästa och enklaste metoden?

Min fungerar inte. Jag vill alltså att allt man skriver in ska börja på stor bokstav trots att användaren inte trycker ner shift

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace Bokhyllan { public class Bibliotek { static void Main() { Bokhylla bibbla = new Bokhylla(); bibbla.meny(); } } public class Bok { public static int BokNr; public string Titel; //Sparar bokens titel public string Skribent; //sparar bokens författare public string Typ; //sparar bokentypen public int Utgivningsår; //sparar utgivningsåret public Bok(string indataTitel, string indataSkribent, string indataTyp, int indataUtgivningsår) { this.Titel = indataTitel; //mottagen titel tilldelas objektet indatatitel this.Skribent = indataSkribent; //mottagen skribent tilldelas objektet indataskribent this.Typ = indataTyp; //mottagen typ tilldelas objektet indatatyp this.Utgivningsår = indataUtgivningsår; //mottaget utgivningsår tilldelas objektet indatautgivningsår BokNr = BokNr + 1; // Lägger till en ny bok } public string GetTitel() { return Titel; } public string GetSkribent() { return Skribent; } public string GetTyp() { return Typ; } public int GetUtgivningsår() { return Utgivningsår; } public override string ToString() { return Titel + Skribent + Typ + Utgivningsår; } } // Bokens underklasser, roman, tidskrit och novellsamling public class Roman : Bok { public Roman(string indataTitel, string indataSkribent, string indataTyp, int indataUtgivningsår) : base(indataTitel, indataSkribent, indataTyp, indataUtgivningsår) { indataTyp = ""; //initierar en tom variabel } public override string ToString() { return base.ToString(); // returnerar override metoden och namnen på alla dess värden } } public class Tidskrift : Bok { public Tidskrift(string indataTitel, string indataSkribent, string indataTyp, int indataUtgivningsår) : base(indataTitel, indataSkribent, indataTyp, indataUtgivningsår) { indataTyp = ""; // intierar en tom variabel } public override string ToString() { return base.ToString(); // returnerar override metoden och namnen på alla dess värden } } public class Novellsamling : Bok { public Novellsamling(string indataTitel, string indataSkribent, string indataTyp, int indataUtgivningår) : base(indataTitel, indataSkribent, indataTyp, indataUtgivningår) { indataTyp = ""; // intitierar en tom variabel. } public override string ToString() { return base.ToString(); // returnerar override metoden och namnen på alla dess värden } } public class Bokhylla { private List<Bok> BokLista; // En lista som innehåller alla våra böcker. public Bokhylla() { BokLista = new List<Bok>(); } public void meny() { string[] namn = new string[2]; Console.Write("\n\tVar god skriv in ditt förnamn: "); namn[0] = Console.ReadLine(); Console.Write("\tVar god skriv in ditt efternamn: "); namn[1] = Console.ReadLine(); // ReadLine väntar på användarens inmatning och används - // för att programmet ska stanna upp. Console.Clear(); // Rensar konsolfönstret Console.WriteLine("\n\t---------------------------"); Console.WriteLine("\tVälkommen till biblioteket!"); Console.WriteLine("\t---------------------------"); DateTime time = DateTime.Now; // metod för dagens datum och tid. Console.WriteLine("\tDatum: " + time.ToShortDateString()); // skriver ut endast dagens datum. Console.WriteLine("\tTid: " + time.ToShortTimeString()); // skriver ut endast dagens tid. DateTime currentDatetime = DateTime.Now; // Hämtar dagens tid och datum int currentHour = currentDatetime.Hour; // initierar timmar int startMorningHour = 6; // initierar morgon int startAfternoonHour = 12; // initierar eftermiddag int startEveningHour = 17; // initierar kväll int startNightHour = 22; // initierar natt // om morgontimmen är mindre eller lika med timman i stunden och timman är mindre än eftermiddagstimman // så skrivs det ut God morgon [användarens namn] och så vidare. if (startMorningHour <= currentHour && currentHour < startAfternoonHour) { Console.WriteLine("\n\tGod morgon" + " " + namn[0] + " " + namn[1] + "!"); } if (startAfternoonHour <= currentHour && currentHour < startEveningHour) { Console.WriteLine("\n\tGod eftermiddag" + " " + namn[0] + " " + namn[1] + "!"); } if (startEveningHour <= currentHour && currentHour < startNightHour) { Console.WriteLine("\n\tGod kväll" + " " + namn[0] + " " + namn[1] + "!"); } if (startNightHour <= currentHour && currentHour < startMorningHour) { Console.WriteLine("\n\tGod natt" + " " + namn[0] + " " + namn[1] + "!"); } Console.Write("\n\tVar vänlig ange en siffra mellan 1-3\n\t"); //informerar användaren om menyval bool bokHylla = true; // Variabeln bokHylla styr vår huvudloop. while (bokHylla) { // Skriver ut menyn Console.WriteLine("\n\t[1] Registrera en ny bok"); Console.WriteLine("\t[2] Visa böcker"); Console.WriteLine("\t[3] Rensa sparade böcker"); Console.Write("\t[4] Avsluta\n\t"); int menyVal; // Deklarerar variabeln för vår switch sats. Int32.TryParse(Console.ReadLine(), out menyVal); // Hindrar att programmet kraschar vid felaktig inmatning { switch (menyVal) { case 1: NyBok(); FirstLetterToUpper(); <--- röd linje, CS7036 break; case 2: VisaBöcker(); // anropar metoden visa böcker if (BokLista.Count == 0) // om boklistan är lika med 0 { Console.WriteLine("\n\tDet finns inga böcker sparade, lägg in några böcker!"); } break; case 3: RaderaBöcker(); if (BokLista.Count == 0) // om boklistan är lika med 0 { Console.WriteLine("\n\tFinns inga böcker att radera!"); } break; case 4: // ingen nollställning av färg behövs eftersom programmet avslutas bokHylla = false; // Variabeln är falsk och programmet avslutas. Console.ForegroundColor = ConsoleColor.Yellow; // sätter textfärgen till gul Console.Write("\n\tHa en strålande dag, vi ses snart igen!\n\t"); Console.ReadKey(); // väntar på att användaren ska trycka ner en tangent på taangentbordet break; default: //om inmatning av menyval är felaktig så informeras användaren. Console.ForegroundColor = ConsoleColor.Red; // Ändrar textfärg till röd. Console.WriteLine("\n\tOgiltigt val, välj mellan 1-4!"); Console.ResetColor(); // nollställer textfärg. break; // Stänger av programmet. } } } } private void NyBok() { Console.Clear(); //Rensar konsolfönstret. Console.Write("\n\tSkriv in titel: "); string Titel = Console.ReadLine(); Console.Write("\tSkriv in författare: "); string Skribent = Console.ReadLine(); Console.Write("\tSkriv in Utgivningsår: "); string UtgivÅr = Console.ReadLine(); int Utgivningsår; do { bool TestUtgiv = int.TryParse(UtgivÅr, out Utgivningsår); // Kontrollerar om TestUtgiv är sann. if (!TestUtgiv) { Console.ForegroundColor = ConsoleColor.Red; // Ändrar textfärg till röd. Console.Write("\n\tFel inmatning, endast siffror!\n\t"); Console.ResetColor(); // Nollställer färgen. UtgivÅr = Console.ReadLine(); } else { Utgivningsår = int.Parse(UtgivÅr); Console.Clear(); //Rensar konsolfönstret. break; } } while (true); { Console.Write("\n\tÄr boken en [1] Roman, [2] Tidskrift eller [3] Novellsamling?\t"); string Typ = Console.ReadLine(); int Val; if (int.TryParse(Typ, out Val)) { switch (Val) { case 1: { Bok a = new Roman(Titel, Skribent, "Roman", Utgivningsår); BokLista.Add(a); break; } case 2: { Bok a = new Tidskrift(Titel, Skribent, "Tidskrift", Utgivningsår); BokLista.Add(a); break; } case 3: { Bok a = new Novellsamling(Titel, Skribent, "Novellsamling", Utgivningsår); BokLista.Add(a); break; } default: { Console.ForegroundColor = ConsoleColor.Red; // Ändrar textfärg till röd. Console.WriteLine("\tFelaktig inmatning!"); Console.ResetColor(); // Nollställer textfärg. Thread.Sleep(1000); // återvänder till menyn efter 1 sekund break; } } } } } private void VisaBöcker() { Console.Clear(); foreach (var boken in BokLista) { Console.WriteLine("\n\tTitel: {0} \n\tFörfattare: {1} \n\tTyp av bok: {2} \n\tUtgivningsår: {3}\n\t", boken.Titel, boken.Skribent, boken.Typ, boken.Utgivningsår); } } private void RaderaBöcker() { BokLista.Clear(); } public string FirstLetterToUpper(string str) <- här testar jag implementera den to.upper metoden { if (str == null) return null; if (str.Length > 1) return char.ToUpper(str[0]) + str.Substring(1); return str.ToUpper(); } } }

Permalänk
Medlem
Skrivet av Field_trip:

Tja

Om jag vill använda en metod som gör att första bokstaven blir en versal fortsatt av gemener, te.x, Hej istället för hej

Hur gör jag då? Jag vill lägga in en char metod

Jag vill göra en liknande kod public string FirstLetterToUpper(string str) { if (str == null) return null; if (str.Length > 1) return char.ToUpper(str[0]) + str.Substring(1); return str.ToUpper(); }

Var tror ni är den bästa och enklaste metoden?

Min fungerar inte. Jag vill alltså att allt man skriver in ska börja på stor bokstav trots att användaren inte trycker ner shift

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace Bokhyllan { public class Bibliotek { static void Main() { Bokhylla bibbla = new Bokhylla(); bibbla.meny(); } } public class Bok { public static int BokNr; public string Titel; //Sparar bokens titel public string Skribent; //sparar bokens författare public string Typ; //sparar bokentypen public int Utgivningsår; //sparar utgivningsåret public Bok(string indataTitel, string indataSkribent, string indataTyp, int indataUtgivningsår) { this.Titel = indataTitel; //mottagen titel tilldelas objektet indatatitel this.Skribent = indataSkribent; //mottagen skribent tilldelas objektet indataskribent this.Typ = indataTyp; //mottagen typ tilldelas objektet indatatyp this.Utgivningsår = indataUtgivningsår; //mottaget utgivningsår tilldelas objektet indatautgivningsår BokNr = BokNr + 1; // Lägger till en ny bok } public string GetTitel() { return Titel; } public string GetSkribent() { return Skribent; } public string GetTyp() { return Typ; } public int GetUtgivningsår() { return Utgivningsår; } public override string ToString() { return Titel + Skribent + Typ + Utgivningsår; } } // Bokens underklasser, roman, tidskrit och novellsamling public class Roman : Bok { public Roman(string indataTitel, string indataSkribent, string indataTyp, int indataUtgivningsår) : base(indataTitel, indataSkribent, indataTyp, indataUtgivningsår) { indataTyp = ""; //initierar en tom variabel } public override string ToString() { return base.ToString(); // returnerar override metoden och namnen på alla dess värden } } public class Tidskrift : Bok { public Tidskrift(string indataTitel, string indataSkribent, string indataTyp, int indataUtgivningsår) : base(indataTitel, indataSkribent, indataTyp, indataUtgivningsår) { indataTyp = ""; // intierar en tom variabel } public override string ToString() { return base.ToString(); // returnerar override metoden och namnen på alla dess värden } } public class Novellsamling : Bok { public Novellsamling(string indataTitel, string indataSkribent, string indataTyp, int indataUtgivningår) : base(indataTitel, indataSkribent, indataTyp, indataUtgivningår) { indataTyp = ""; // intitierar en tom variabel. } public override string ToString() { return base.ToString(); // returnerar override metoden och namnen på alla dess värden } } public class Bokhylla { private List<Bok> BokLista; // En lista som innehåller alla våra böcker. public Bokhylla() { BokLista = new List<Bok>(); } public void meny() { string[] namn = new string[2]; Console.Write("\n\tVar god skriv in ditt förnamn: "); namn[0] = Console.ReadLine(); Console.Write("\tVar god skriv in ditt efternamn: "); namn[1] = Console.ReadLine(); // ReadLine väntar på användarens inmatning och används - // för att programmet ska stanna upp. Console.Clear(); // Rensar konsolfönstret Console.WriteLine("\n\t---------------------------"); Console.WriteLine("\tVälkommen till biblioteket!"); Console.WriteLine("\t---------------------------"); DateTime time = DateTime.Now; // metod för dagens datum och tid. Console.WriteLine("\tDatum: " + time.ToShortDateString()); // skriver ut endast dagens datum. Console.WriteLine("\tTid: " + time.ToShortTimeString()); // skriver ut endast dagens tid. DateTime currentDatetime = DateTime.Now; // Hämtar dagens tid och datum int currentHour = currentDatetime.Hour; // initierar timmar int startMorningHour = 6; // initierar morgon int startAfternoonHour = 12; // initierar eftermiddag int startEveningHour = 17; // initierar kväll int startNightHour = 22; // initierar natt // om morgontimmen är mindre eller lika med timman i stunden och timman är mindre än eftermiddagstimman // så skrivs det ut God morgon [användarens namn] och så vidare. if (startMorningHour <= currentHour && currentHour < startAfternoonHour) { Console.WriteLine("\n\tGod morgon" + " " + namn[0] + " " + namn[1] + "!"); } if (startAfternoonHour <= currentHour && currentHour < startEveningHour) { Console.WriteLine("\n\tGod eftermiddag" + " " + namn[0] + " " + namn[1] + "!"); } if (startEveningHour <= currentHour && currentHour < startNightHour) { Console.WriteLine("\n\tGod kväll" + " " + namn[0] + " " + namn[1] + "!"); } if (startNightHour <= currentHour && currentHour < startMorningHour) { Console.WriteLine("\n\tGod natt" + " " + namn[0] + " " + namn[1] + "!"); } Console.Write("\n\tVar vänlig ange en siffra mellan 1-3\n\t"); //informerar användaren om menyval bool bokHylla = true; // Variabeln bokHylla styr vår huvudloop. while (bokHylla) { // Skriver ut menyn Console.WriteLine("\n\t[1] Registrera en ny bok"); Console.WriteLine("\t[2] Visa böcker"); Console.WriteLine("\t[3] Rensa sparade böcker"); Console.Write("\t[4] Avsluta\n\t"); int menyVal; // Deklarerar variabeln för vår switch sats. Int32.TryParse(Console.ReadLine(), out menyVal); // Hindrar att programmet kraschar vid felaktig inmatning { switch (menyVal) { case 1: NyBok(); FirstLetterToUpper(); <--- röd linje, CS7036 break; case 2: VisaBöcker(); // anropar metoden visa böcker if (BokLista.Count == 0) // om boklistan är lika med 0 { Console.WriteLine("\n\tDet finns inga böcker sparade, lägg in några böcker!"); } break; case 3: RaderaBöcker(); if (BokLista.Count == 0) // om boklistan är lika med 0 { Console.WriteLine("\n\tFinns inga böcker att radera!"); } break; case 4: // ingen nollställning av färg behövs eftersom programmet avslutas bokHylla = false; // Variabeln är falsk och programmet avslutas. Console.ForegroundColor = ConsoleColor.Yellow; // sätter textfärgen till gul Console.Write("\n\tHa en strålande dag, vi ses snart igen!\n\t"); Console.ReadKey(); // väntar på att användaren ska trycka ner en tangent på taangentbordet break; default: //om inmatning av menyval är felaktig så informeras användaren. Console.ForegroundColor = ConsoleColor.Red; // Ändrar textfärg till röd. Console.WriteLine("\n\tOgiltigt val, välj mellan 1-4!"); Console.ResetColor(); // nollställer textfärg. break; // Stänger av programmet. } } } } private void NyBok() { Console.Clear(); //Rensar konsolfönstret. Console.Write("\n\tSkriv in titel: "); string Titel = Console.ReadLine(); Console.Write("\tSkriv in författare: "); string Skribent = Console.ReadLine(); Console.Write("\tSkriv in Utgivningsår: "); string UtgivÅr = Console.ReadLine(); int Utgivningsår; do { bool TestUtgiv = int.TryParse(UtgivÅr, out Utgivningsår); // Kontrollerar om TestUtgiv är sann. if (!TestUtgiv) { Console.ForegroundColor = ConsoleColor.Red; // Ändrar textfärg till röd. Console.Write("\n\tFel inmatning, endast siffror!\n\t"); Console.ResetColor(); // Nollställer färgen. UtgivÅr = Console.ReadLine(); } else { Utgivningsår = int.Parse(UtgivÅr); Console.Clear(); //Rensar konsolfönstret. break; } } while (true); { Console.Write("\n\tÄr boken en [1] Roman, [2] Tidskrift eller [3] Novellsamling?\t"); string Typ = Console.ReadLine(); int Val; if (int.TryParse(Typ, out Val)) { switch (Val) { case 1: { Bok a = new Roman(Titel, Skribent, "Roman", Utgivningsår); BokLista.Add(a); break; } case 2: { Bok a = new Tidskrift(Titel, Skribent, "Tidskrift", Utgivningsår); BokLista.Add(a); break; } case 3: { Bok a = new Novellsamling(Titel, Skribent, "Novellsamling", Utgivningsår); BokLista.Add(a); break; } default: { Console.ForegroundColor = ConsoleColor.Red; // Ändrar textfärg till röd. Console.WriteLine("\tFelaktig inmatning!"); Console.ResetColor(); // Nollställer textfärg. Thread.Sleep(1000); // återvänder till menyn efter 1 sekund break; } } } } } private void VisaBöcker() { Console.Clear(); foreach (var boken in BokLista) { Console.WriteLine("\n\tTitel: {0} \n\tFörfattare: {1} \n\tTyp av bok: {2} \n\tUtgivningsår: {3}\n\t", boken.Titel, boken.Skribent, boken.Typ, boken.Utgivningsår); } } private void RaderaBöcker() { BokLista.Clear(); } public string FirstLetterToUpper(string str) <- här testar jag implementera den to.upper metoden { if (str == null) return null; if (str.Length > 1) return char.ToUpper(str[0]) + str.Substring(1); return str.ToUpper(); } } }

Den där metoden i sig ser väl ut som att den skulle funka, däremot så är anropet konstigt:

FirstLetterToUpper(); <--- röd linje, CS7036

Den faktiska metoden tar en sträng som argument och returnerar den nya strängen med inledande stor bokstav, men anropet här görs utan argument och returvärdet används inte.

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

Vad innebär att den inte fungerar? Du får gärna skriva felmeddelande, för jag ser inget direkt fel med själva metoden. Jag kan inte C# men körde din i repl.it och den fungerade om jag bara döpte om till "public static string" istället för bara "public string".

Dock hade jag skrivit den såhär istället:

public static string FirstLetterToUpper(string str) { if (str == null) return null; else return char.ToUpper(str[0]) + str.Substring(1); }

Visa signatur

10700K | NVIDIA RTX 3080

Permalänk
Medlem
Skrivet av kwame:

Vad innebär att den inte fungerar? Du får gärna skriva felmeddelande, för jag ser inget direkt fel med själva metoden. Jag kan inte C# men körde din i repl.it och den fungerade om jag bara döpte om till "public static string" istället för bara "public string".

Dock hade jag skrivit den såhär istället:

public static string FirstLetterToUpper(string str) { if (str == null) return null; else return char.ToUpper(str[0]) + str.Substring(1); }

Det som inte hanteras i din variant är om man passar in tom sträng...

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

Som ovan säger så finns det bättre sätt att null-checka strings!

Kika på

string.IsNullOrWhiteSpace()

Permalänk

Det funkar inte. Antog att man skulle skriva in null i case 1: firstlettertoupper(null); men bokstäverna var fortfarande gemener.

Permalänk
Medlem
Skrivet av Field_trip:

Det funkar inte. Antog att man skulle skriva in null i case 1: firstlettertoupper(null); men bokstäverna var fortfarande gemener.

Japp, för du behöver skicka in strängen du vill göra om, samt fånga upp resultatet i en ny variabel, eftersom C# hanterar strängar som värdetyper (i vissa fall)

String s = "sträng med små bokstäver"; String uppercase = FirstLetterToUpper(s);

Sen tror jag du bör fundera på var du skall anropa denna funktionen. Skall den ändra titeln på den nya boken som precis skapats? I så fall bör du nog anropa denna funktionen på den sträng som användaren matat in innuti "NyBok()" funktionen.

Visa signatur

| EVGA Z170 FTW | i7 6700k | ASUS RTX 3070 | 16GB DDR4 3200MHz | Cooler Master V850 | Samsung 840 Evo 250GB + 2x WD Black 500GB + Seagate 2TB SSHD + Samsung 970 Evo M.2 500GB |

Permalänk

Sen tror jag du bör fundera på var du skall anropa denna funktionen. Skall den ändra titeln på den nya boken som precis skapats? I så fall bör du nog anropa denna funktionen på den sträng som användaren matat in innuti "NyBok()" funktionen.
[/quote]

Exakt.

Permalänk
Medlem

Nu har jag inte läst igenom hela men måste du inte dela upp och omvandla din string i metoden till char innan försöker sig på att göra första tecknet till versal?

Permalänk

Programmering 2

Min mentor skrev att koden "liknar" andras, så jag försökte lägga till min twist på koden och göra en switch sats inuti en switch. Men jag vet inte hur jag ska göra längre.

Kan någon vara vänlig och knuffa mig i rätt riktning? Jag blir galen, jag vill skapa en ny bok varrje gång jag trycker [1] sen går allt fint tills jag kommer till "Är boken en roman tidskrift eller novvelllsamling. Den upprepas hela tiden, och det fixas om jag sätter minbool till falskt (eller behövs den ens?), men jag vet inte var jag ska skriva in den? Sedan läggs mina böcker inte till i listan, de bara skrivs över när jag skapar en ny bok.

while (isRunning) { // Skriver ut menyn Console.WriteLine("\n\t[1] Registrera en ny bok"); Console.WriteLine("\t[2] Visa böcker"); Console.WriteLine("\t[3] Rensa sparade böcker"); Console.Write("\t[4] Avsluta\n\t"); if (int.TryParse(Console.ReadLine(), out int menyVal)) // Hindrar att programmet kraschar vid felaktig inmatning { switch (menyVal) { case 1: // skapa en ny bok { Console.Clear(); //Rensar konsolfönstret. Console.Write("\n\tTitel: "); string Titel = Console.ReadLine(); Console.Write("\tFörfattare: "); string Skribent = Console.ReadLine(); Console.Write("\tUtgivningsår: "); int.TryParse(Console.ReadLine(), out int nr); bool minBool = true; while (minBool) { // skriver ut menyn för typ av bok Console.WriteLine("\n\tÄr boken en [1] Roman, [2] Tidskrift eller [3] Novellsamling?"); if (int.TryParse(Console.ReadLine(), out int Bokval)) { switch (Bokval) { case 1: { bokLista.Add(new Roman(Titel, Skribent, " ", nr)); Console.Write("\t"); break; } case 2: { bokLista.Add(new Roman(Titel, Skribent, " ", nr)); Console.Write("\t"); break; } case 3: { bokLista.Add(new Roman(Titel, Skribent, " ", nr)); Console.Write("\t"); break; } default: { Console.WriteLine("\n\tOgiltigt val!"); break; } } } else { Console.WriteLine("\n\tVälj mellan 1-3"); } } } break;

Använder VS i windows. Uppskattar hjälpen.

Permalänk
Medlem

den loopar oändligt eftersom conditionen för loopen aldrig bryts. minBool måste bli false när du uppnått ditt mål och vill gå ur loopen.

Permalänk
Medlem

Utöver problemet som Simon^L nämner så hade jag funderat över ditt kodupplägg. Att nästla switch-satser blir snabbt en mardröm. Överväg att bryta ut kod i separata funktioner.

Permalänk
Skrivet av Simon^L:

den loopar oändligt eftersom conditionen för loopen aldrig bryts. minBool måste bli false när du uppnått ditt mål och vill gå ur loopen.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace Bokhyllan { class Bok { public string Titel; //Sparar bokens titel public string Skribent; //sparar bokens författare public string Typ; //sparar bokentypen public int Utgivningsår; //sparar utgivningsåret public Bok(string Titel, string Skribent, string Typ, int Utgivningsår) { this.Titel = Titel; //mottagen titel tilldelas objektet Titel this.Skribent = Skribent; //mottagen skribent tilldelas objektet Skribent this.Typ = Typ; //mottagen typ tilldelas objektet typ this.Utgivningsår = Utgivningsår; //mottaget utgivningsår tilldelas objektet utgivningsår } // Bokens underklasser, roman, tidskrit och novellsamling public class Roman : Bok { public Roman(string Titel, string Skribent, string Typ, int Utgivningsår) : base(Titel, Skribent, Typ, Utgivningsår) { Typ = "Roman"; } public override string ToString() { return base.ToString(); // returnerar override metoden och namnen på alla dess värden } } public class Tidskrift : Bok { public Tidskrift(string Titel, string Skribent, string Typ, int Utgivningsår) : base(Titel, Skribent, Typ, Utgivningsår) { Typ = "Tidskrift"; } public override string ToString() { return base.ToString(); // returnerar override metoden och namnen på alla dess värden } } public class Novellsamling : Bok { public Novellsamling(string Titel, string Skribent, string Typ, int Utgivningsår) : base(Titel, Skribent, Typ, Utgivningsår) { Typ = "Novellsamling"; } public override string ToString() { return base.ToString(); // returnerar override metoden och namnen på alla dess värden } } static void Main(string[] args) { bool isRunning = true; // boolen isRunning är sann tills användaren avslutar programmet List<Bok> bokLista = new List<Bok>(); // skapar listan med alla böcker string[] namn = new string[2]; Console.Write("\n\tVar god skriv in ditt förnamn: "); namn[0] = Console.ReadLine(); Console.Write("\tVar god skriv in ditt efternamn: "); namn[1] = Console.ReadLine(); // ReadLine väntar på användarens inmatning och används - // för att programmet ska stanna upp. Console.Clear(); // Rensar konsolfönstret Console.WriteLine("\n\t---------------------------"); Console.WriteLine("\tVälkommen till biblioteket!"); Console.WriteLine("\t---------------------------"); DateTime time = DateTime.Now; // metod för dagens datum och tid. Console.WriteLine("\tDatum: " + time.ToShortDateString()); // skriver ut endast dagens datum. Console.WriteLine("\tTid: " + time.ToShortTimeString()); // skriver ut endast dagens tid. DateTime currentDatetime = DateTime.Now; // Hämtar dagens tid och datum int currentHour = currentDatetime.Hour; // initierar timmar int startMorningHour = 6; // initierar morgon int startAfternoonHour = 12; // initierar eftermiddag int startEveningHour = 17; // initierar kväll int startNightHour = 22; // initierar natt // om morgontimmen är mindre eller lika med timman i stunden och timman är mindre än eftermiddagstimman // så skrivs det ut God morgon [användarens namn] och så vidare. if (startMorningHour <= currentHour && currentHour < startAfternoonHour) { Console.WriteLine("\n\tGod morgon," + " " + namn[0] + " " + namn[1] + "!"); } if (startAfternoonHour <= currentHour && currentHour < startEveningHour) { Console.WriteLine("\n\tGod eftermiddag," + " " + namn[0] + " " + namn[1] + "!"); } if (startEveningHour <= currentHour && currentHour < startNightHour) { Console.WriteLine("\n\tGod kväll," + " " + namn[0] + " " + namn[1] + "!"); } if (startNightHour <= currentHour && currentHour < startMorningHour) { Console.WriteLine("\n\tGod natt," + " " + namn[0] + " " + namn[1] + "!"); } Console.Write("\tVar vänlig ange en siffra mellan 1-4\n\t"); //informerar användaren om menyval while (isRunning) { // Skriver ut menyn Console.WriteLine("\n\t[1] Registrera en ny bok"); Console.WriteLine("\t[2] Visa böcker"); Console.WriteLine("\t[3] Rensa sparade böcker"); Console.Write("\t[4] Avsluta\n\t"); if (int.TryParse(Console.ReadLine(), out int menyVal)) // Hindrar att programmet kraschar vid felaktig inmatning { switch (menyVal) { case 1: // skapa en ny bok { SkapaNyBok(); break; } case 2: Console.WriteLine("\n\tDina sparade böcker visas nedan"); foreach (Bok item in bokLista) { Console.Clear(); Console.WriteLine("\n\tTitel: " + item.Titel + "\n\tFörfattare: " + item.Skribent + "\n\tUtgivningsår: " + item.Utgivningsår); } if (bokLista.Count == 0) { Console.Clear(); Console.WriteLine("\n\tDet finns inga sparade böcker."); } break; case 3: if (bokLista.Count == 0) { Console.Clear(); Console.WriteLine("\n\tDet finns inga sparade böcker."); } else { bokLista.Clear(); Console.WriteLine("\n\tDin boklista är nu rensad!"); break; } break; case 4: isRunning = false; break; default: Console.Clear(); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("\n\tOgiltigt menyval, välj mellan 1-4!"); Console.ResetColor(); break; } } } } public static void SkapaNyBok() { Console.Clear(); //Rensar konsolfönstret. Console.Write("\n\tTitel: "); string Titel = Console.ReadLine(); Console.Write("\tFörfattare: "); string Skribent = Console.ReadLine(); Console.Write("\tUtgivningsår: "); int Utgivningsår = 0; bool lyckad = int.TryParse(Console.ReadLine(), out Utgivningsår); if (!lyckad) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("\n\tFel inmatning, testa igen."); Console.ResetColor(); Console.Clear(); Console.Write("\t"); } else { } bool minBool = true; while (minBool) { // skriver ut menyn för typ av bok Console.WriteLine("\n\tÄr boken en [1] Roman, [2] Tidskrift eller [3] Novellsamling?"); if (int.TryParse(Console.ReadLine(), out int Bokval)) { switch (Bokval) { case 1: { Bok a = new Roman(Titel, Skribent, " ", Utgivningsår)); Console.Write("\t"); break; } case 2: { Bok a = new Roman(Titel, Skribent, " ", Utgivningsår)); Console.Write("\t"); break; } case 3: { Bok a = new Roman(Titel, Skribent, " ", Utgivningsår)); Console.Write("\t"); break; } default: { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("\n\tOgiltigt val!"); Console.ResetColor(); break; } minBool = false; } } else { Console.WriteLine("\n\tVälj mellan 1-3"); } } } } }

Tack
Men nu sparas inga böcker och SkapaNyBok() metoden hittar inte min lista. Hur ska jag göra?