Vinnaren i pepparkakshustävlingen!
2017-07-09, 09:43
  #13
Moderator
Protons avatar
Citat:
Ursprungligen postat av 65mmtoothpick
Nu fungerar allt som det ska.

Jag använde en bool med Try.Parse så den returnerar true eller false. Sen la jag in hela switchen i den if-satsen.

Sökningen fixade jag genom att se till att värderna på min rygga[i] inte är null
Ja TryParse returnerar en bool. Kan vi få se hur just denna if ser ut? Du kanske har gjort den lite bökigare än vad den borde behöva vara?

Det jag menar är att eftersom TryParse returnerar en bool behöver du inte ta emot den nånstans, utan kan använda den direkt i if-satsen eftersom if är intresserad av värdena true eller false, inget annat.

Så, pseudokoden
Kod:
bool test false;
test int.TryParse(nånting);
if(
test == true){
//do stuff

Kan utan problem huggas ner till
Kod:
if(int.TryParse(nånting)){
//do stuff

Observera även att jag tagit bort jämförelsen då den är redundant, allt som är intressant är true eller false för en if.

Hajjaru?
Citera
2017-07-09, 11:03
  #14
Medlem
Citat:
Ursprungligen postat av Proton
Ja TryParse returnerar en bool. Kan vi få se hur just denna if ser ut? Du kanske har gjort den lite bökigare än vad den borde behöva vara?

Det jag menar är att eftersom TryParse returnerar en bool behöver du inte ta emot den nånstans, utan kan använda den direkt i if-satsen eftersom if är intresserad av värdena true eller false, inget annat.

Så, pseudokoden
Kod:
bool test false;
test int.TryParse(nånting);
if(
test == true){
//do stuff

Kan utan problem huggas ner till
Kod:
if(int.TryParse(nånting)){
//do stuff

Observera även att jag tagit bort jämförelsen då den är redundant, allt som är intressant är true eller false för en if.

Hajjaru?

Så ser min kod ut nu.

Kod:
string str Console.ReadLine();
bool isValidNumber int.TryParse(strout int number);
if (
isValidNumber)
{
        switch (
number)
       
//Case 1,2,3,4 o så.
       
}
       else 
       {
       
       } 

Är det såhär du menar?
Kod:
string str Console.ReadLine();
if (
int.TryParse(strout int number)
{
//do stuff

Citera
2017-07-10, 10:02
  #15
Moderator
Protons avatar
Citat:
Ursprungligen postat av 65mmtoothpick
Är det såhär du menar?
Kod:
string str Console.ReadLine();
if (
int.TryParse(strout int number)
{
//do stuff

Just så, fast med en till parentes så iffen blir riktig med, det saknas en nu.

Kod:
if (int.TryParse(strout int number)) 
ska det vara.
Citera
2017-07-10, 16:48
  #16
Medlem
Citat:
Ursprungligen postat av Proton
Just så, fast med en till parentes så iffen blir riktig med, det saknas en nu.

Kod:
if (int.TryParse(strout int number)) 
ska det vara.

Jag behöver bli noggrannare i min kodning. Tack för hjälpen Proton!
Jag satt helt seriöst - 7h i fredags, i lördags i 9h och söndagen 7h, med programmering
Citera
2017-07-10, 21:32
  #17
Moderator
Protons avatar
Citat:
Ursprungligen postat av 65mmtoothpick
Jag behöver bli noggrannare i min kodning. Tack för hjälpen Proton!
Jag satt helt seriöst - 7h i fredags, i lördags i 9h och söndagen 7h, med programmering
Se det positivt, du har ju troligen lärt dig en del på kuppen, nästa uppgift kommer troligen gå betydligt smidigare för dig.
Citera
2017-08-06, 11:11
  #18
Medlem
MataRengis avatar
Citat:
Ursprungligen postat av A-Z.a-z.0-9
Nu kan jag inte c#, men är
Kod:
rygga[i] += Console.ReadLine(); // Sparar föremålet i ryggsäcken

Verkligen giltig kod?

Kan man skriva
Kod:
rygga[i] + "hej"
i C#?

Det låter irrationellt. Hur adderar man en vektor av X med X? Betyder det att man vill addera "X" med alla listans X? Eller lägga till ett X till listan? Eller addera med det första värdet i listan?

Är det ens tillåtet inom våra matematiska regler att addera matriser av olika storlekar (nu är inte X ens en matris, utan endast ett värde, men vi kanske kanske kunnat låtsas att C# tolkar om det som en representation av en matris med ett värde)?

Jadå, det är möjligt. Matematik är en sak, men det här är stränghantering.
Plustecknet är en operator som concatenate, dvs skarvar ihop, två strängar.

Se följande:
string rygga = ""; // skapar en strängvariabel som jag initierar med en tom sträng.
rygga = "Kopp "; // lägger in strängen "Kopp" i variabeln rygga. Observera att jag avslutar med ett mellanslag.
rygga = rygga + "Sked "; // jag konkatenerar, skarvar till, det som fanns i rygga med en ny sträng. Vad vi får är "Kopp Sked".
Föregående rad är precis samma sak som
rygga += "Sked "; // dvs att jag lägger till Sked i strängen.

Som sagt det här har inget med matematik att göra. Glöm linjär algerbra matrishantering. Glöm addition av matematiska matriser. Det här handlar om strängar.

Samma sak kan man göra om rygga är en array:

string[5] rygga = rygga[5]; // Här skapar jag en array med fem element, alla tomma ännu.
rygga[3] = "Kopp ";
rygga[3] += "Sked ";
Detta gör samma sak som ovan på element nummer tre i string array rygga. Inga problem. Kompilatorn klagar inte. Det blir inte nåt run-time error.

Sen är frågan om det är precis det som man vill göra. Kanske det är bättre med en list eller nåt annat. Men det avgör man utifrån uppgiften vad som är bäst.

rygga[i] += Console.ReadLine(); // Sparar föremålet i ryggsäcken
Detta är definitivt korrekt kod. Man väntar på input från tangentbordet och skarvar in det i det i:te elementet i sträng-arrayen rygga. Klagar inte kompilatorn, får man inget run-time error, så är koden korrekt. Om man nu är just det man vill göra. Ingen kompilator klarar att hitta logiska fel.
Citera
2017-08-06, 22:00
  #19
Medlem
Citat:
Ursprungligen postat av MataRengi
Jadå, det är möjligt. Matematik är en sak, men det här är stränghantering.
Plustecknet är en operator som concatenate, dvs skarvar ihop, två strängar.

Se följande:
string rygga = ""; // skapar en strängvariabel som jag initierar med en tom sträng.
rygga = "Kopp "; // lägger in strängen "Kopp" i variabeln rygga. Observera att jag avslutar med ett mellanslag.
rygga = rygga + "Sked "; // jag konkatenerar, skarvar till, det som fanns i rygga med en ny sträng. Vad vi får är "Kopp Sked".
Föregående rad är precis samma sak som
rygga += "Sked "; // dvs att jag lägger till Sked i strängen.
Tack, men jag vet hur allt detta fungerar.

Citat:
Ursprungligen postat av MataRengi
Som sagt det här har inget med matematik att göra. Glöm linjär algerbra matrishantering. Glöm addition av matematiska matriser. Det här handlar om strängar.
Nix, det tänker jag nog faktiskt inte glömma. Eftersom Strängar = Listor av tecken = Endimensionella matriser.

Citat:
Ursprungligen postat av MataRengi
Samma sak kan man göra om rygga är en array:

string[5] rygga = rygga[5]; // Här skapar jag en array med fem element, alla tomma ännu.
rygga[3] = "Kopp ";
rygga[3] += "Sked ";
Detta gör samma sak som ovan på element nummer tre i string array rygga. Inga problem. Kompilatorn .
Hmm. Vi har nog använt olika utgångspunkter här. Jag utgick utifrån att koden var skriven så att `rygga` är en sträng, alltså en lista där varje element är en char;
Kod:
rygga :: [Char]
(Lista med chars)

Alltså inte samma som ditt exempel, som är av typen
Kod:
rygga :: [[Char]]
(Lista av listor av chars)

Så jag håller med dig, om man ska anta att `rygga` är en lista av strängar, och inte en sträng. Vilket man nog borde anta vid närmare eftertanke.

Citat:
Ursprungligen postat av MataRengi
Sen är frågan om det är precis det som man vill göra. Kanske det är bättre med en list eller nåt annat. Men det avgör man utifrån uppgiften vad som är bäst.
Ja, det låter jag också vara osagt

Citat:
Ursprungligen postat av MataRengi
rygga[i] += Console.ReadLine(); // Sparar föremålet i ryggsäcken
Detta är definitivt korrekt kod. Man väntar på input från tangentbordet och skarvar in det i det i:te elementet i sträng-arrayen rygga. Klagar inte kompilatorn, får man inget run-time error, så är koden korrekt. Om man nu är just det man vill göra.
Mjo, jag håller med dig. Det blev nog bara knasigt från min sida eftersom jag fick för mig att rygga skulle vara en sträng ( )

Citat:
Ursprungligen postat av MataRengi
Ingen kompilator klarar att hitta logiska fel.
Joho! GHC. The one and only.

Ett program som är skrivet i Haskell kan inte ha sådana logiska fel. Kompilatorn börjar skrika om att programmet inte är logiskt korrekt, och vilken information som är motsägelsefull).

När jag försöker implementera det logiska felet jag syftade på i Haskell så skriker GHC till med en mycket läskigt meddelande

Kod:
rygga :: [Char]
rygga = "Blabla"

addNewItem :: [Char] -> [Char]
addNewItem item = rygga ++ [item]
Detta går inte att kompilera, för att:
Citat:
• Couldn't match expected type ‘Char’ with actual type ‘[Char]’
• In the expression: item
In the second argument of ‘(++)’, namely ‘[item]’
In the expression: rygga ++ [item]
Och detta bror inte på att programmet försöker köras (Haskell är dessutom lazy), utan på att GHC har analyserat koden och dragit slutsatsen att det finns logiska galenheter
__________________
Senast redigerad av A-Z.a-z.0-9 2017-08-06 kl. 22:57.
Citera
2017-08-07, 09:55
  #20
Medlem
Rygga är en array av strängar, dock är den felaktigt deklarerad.

En sträng måhända vara en chararray i grunden, men först och främst är det ett strängobject. Du kan inte ändra ett index i en sträng som om det vore en vanlig chararray, du kan dock plocka ut det. Varje ändring av en sträng kräver ett nytt strängobject, därför är använding av stringbuilder bättre ifall du ska meka mycket med innehållet i en sträng.
Citera
2017-08-12, 14:32
  #21
Medlem
Citat:
Ursprungligen postat av A-Z.a-z.0-9
Joho! GHC. The one and only.

[svammel borttaget]

Och detta bror inte på att programmet försöker köras (Haskell är dessutom lazy), utan på att GHC har analyserat koden och dragit slutsatsen att det finns logiska galenheter
Det där är ju inte ett logikfel, det är ett typfel. Självklart klagar kompilatorn om du ger den ogiltig kod.
Ett logikfel är t.ex. att du vill beräkna 2-1 men skriver 2+1. Lycka till att hitta en kompilator som löser det.
Citera
2017-08-13, 12:09
  #22
Medlem
MataRengis avatar
Citat:
Ursprungligen postat av Gottisborgen
En sträng måhända vara en chararray i grunden, men först och främst är det ett strängobject. Du kan inte ändra ett index i en sträng som om det vore en vanlig chararray, du kan dock plocka ut det. Varje ändring av en sträng kräver ett nytt strängobject, därför är använding av stringbuilder bättre ifall du ska meka mycket med innehållet i en sträng.

Nu tänker jag säga nåt som låter lika illa som att svära i kyrkan...

I C# brukar str += annan_str; sägas vara dålig kod. Just eftersom ingenting bara läggs på efteråt, utan att en ny sträng skapas och den gamla kopieras dit och konkateneras med en ny. Stringbuilder är det som man ska använda eftersom den är mer minneseffektiv, tidseffektiv och lite annat.

Så här gör jag. Om tiden inte är en begränsad faktor, typ när programmet väntar på input från consolen, eller man använder str bara sparsamt eller man använder småsträngar istf megabytsträngar - då tycker jag str += annan_str; är en okej lösning.

Stringbuilder använder jag vid stora strängar som anropas repetetivt inuti loopar. Dvs när det gör nån skillnad i tid eller minnesutnyttjande.

Har/Gör jag rätt eller fel? Vad är era tankar? Vad gör proffsen?
Citera
2017-08-13, 14:24
  #23
Medlem
tj.s avatar
Citat:
Ursprungligen postat av MataRengi
Nu tänker jag säga nåt som låter lika illa som att svära i kyrkan...

I C# brukar str += annan_str; sägas vara dålig kod. Just eftersom ingenting bara läggs på efteråt, utan att en ny sträng skapas och den gamla kopieras dit och konkateneras med en ny. Stringbuilder är det som man ska använda eftersom den är mer minneseffektiv, tidseffektiv och lite annat.

Så här gör jag. Om tiden inte är en begränsad faktor, typ när programmet väntar på input från consolen, eller man använder str bara sparsamt eller man använder småsträngar istf megabytsträngar - då tycker jag str += annan_str; är en okej lösning.

Stringbuilder använder jag vid stora strängar som anropas repetetivt inuti loopar. Dvs när det gör nån skillnad i tid eller minnesutnyttjande.

Har/Gör jag rätt eller fel? Vad är era tankar? Vad gör proffsen?
Beror på kontexten. Överlag föredrar jag läsbar kod före att hämta hem en millisekund eller två. Det är trots allt ett högnivåspråk där man får mycket optimering på köpet när man kompilerar koden. Att skriva ihop två strägar i C# 6.0 går att göra lite snyggt så här.
Kod:
var firstname "Flashback"
var lastname "Flashbacksson"
var fullname = $"{firstname} {lastname}" 
eller på det gamla sättet
Kod:
var fullname string.Format("{0} {1}"firstnamelastname); 
Vill man slå ihop en stor sträng från en array med exempelvis komma-separering går det att göra elegant med LINQ.
Kod:
var numbers = new List<int>();
for (var 
010i++) 
{
    
numbers.Add(i);
}

var 
concatinatedString string.Join(","numbers); 
Sen kan man ju fråga sig varför man i vissa fall, som i den här tråden med ryggsäcken, överhuvudtaget konkatinerar en sträng istället för att spara värdena i en egen datatyp eller någon form av collection, vilket är vad man förmodligen skulle göra i praktiken. Men å andra sidan är det en skoluppgift.
Citera
2017-08-19, 00:17
  #24
Medlem
MeanMEs avatar
Citat:
Ursprungligen postat av MataRengi
Nu tänker jag säga nåt som låter lika illa som att svära i kyrkan...

I C# brukar str += annan_str; sägas vara dålig kod. Just eftersom ingenting bara läggs på efteråt, utan att en ny sträng skapas och den gamla kopieras dit och konkateneras med en ny. Stringbuilder är det som man ska använda eftersom den är mer minneseffektiv, tidseffektiv och lite annat.

Så här gör jag. Om tiden inte är en begränsad faktor, typ när programmet väntar på input från consolen, eller man använder str bara sparsamt eller man använder småsträngar istf megabytsträngar - då tycker jag str += annan_str; är en okej lösning.

Stringbuilder använder jag vid stora strängar som anropas repetetivt inuti loopar. Dvs när det gör nån skillnad i tid eller minnesutnyttjande.

Har/Gör jag rätt eller fel? Vad är era tankar? Vad gör proffsen?
Du kan ju titta på dessa exempel:

https://www.dotnetperls.com/#C#+stringbuilder

Där finns ofta benchmarktester för varje kommando så du får en vettig känsla för när det är läge för att använda den.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback