Vinnaren i pepparkakshustävlingen!
2016-11-01, 14:50
  #3037
Medlem
MeanMEs avatar
Citat:
Ursprungligen postat av Kablash
Aa, om man gör typ int sum = n1 + n2 så funkar det om man lägger in sum istället.

Men varför gör den så? Försöker förstå så jag vet varför det blir så. Varför gör den mina int n1 och n2 till strings innan utskrift?
Om du tittar på definitionen för metoden WriteLine så ger den:

WriteLine(Int32)
Writes the text representation of the specified 32-bit signed integer value, followed by the current line terminator, to the standard output stream.

https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx
Citera
2016-11-01, 19:15
  #3038
Medlem
Citat:
Ursprungligen postat av Kablash
Aa, om man gör typ int sum = n1 + n2 så funkar det om man lägger in sum istället.

Men varför gör den så? Försöker förstå så jag vet varför det blir så. Varför gör den mina int n1 och n2 till strings innan utskrift?


Testa att skriva Console.WriteLine($"The sum is: {n1 + n2}");

Istället.

Vilket är samma som att skriva Console.WriteLine(string.Format("The sum is: {0}", n1 + n2)); men betydligt mer lättläsligt.
Citera
2016-11-02, 14:23
  #3039
Medlem
Sane?s avatar
Citat:
Ursprungligen postat av MeanME
Om du tittar på definitionen för metoden WriteLine så ger den:

WriteLine(Int32)
Writes the text representation of the specified 32-bit signed integer value, followed by the current line terminator, to the standard output stream.

https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx
Du har rätt i sak, men vad som händer i detta exempel är string + int => string concat int.tostring. Det har inget med WriteLine att göra.
Citera
2016-11-02, 19:09
  #3040
Medlem
Jag har en string som heter value, som innehåller "1". Nu skulle jag vilja lägga på "2" med, i slutet. Hur ska man göra detta?
Citera
2016-11-02, 19:22
  #3041
Medlem
tj.s avatar
Citat:
Ursprungligen postat av Andree1
Jag har en string som heter value, som innehåller "1". Nu skulle jag vilja lägga på "2" med, i slutet. Hur ska man göra detta?
Kod:
string value "1";
value value "2"
Eller den förkortade versionen.
Kod:
string value "1";
value += "2"
Citera
2016-11-03, 01:11
  #3042
Medlem
MeanMEs avatar
Citat:
Ursprungligen postat av Sane?
Du har rätt i sak, men vad som händer i detta exempel är string + int => string concat int.tostring. Det har inget med WriteLine att göra.
Jo, för att definitionen för det du gav den, ser ut så.
Så det har allt att göra med det.

När du programmerar ha för vana att regelbundet gå in och kolla vad olika metoder har för syntax, då det kan resultera i underliga buggar för vad som tillsynes ser ut att vara korrekt kod men buggar likt förbaskat för att man missat något. Jag kollar regelbundet upp sällan använd syntax antingen på MSDN eller i min egen programmeringsdatabas.

Bara sök på C# "metodnamn" och titta hur MS ger syntaxen.
Citera
2016-11-03, 18:11
  #3043
Medlem
Kod:
public int DivideAndRound(double numeratordouble denominator)
        {
         
double d1 numerator denominator;
         
double d2 numerator denominator;
         
int i1 Convert.ToInt32(d1);
         if (
d2 >= 5)
         {
             
int i2 1;
             {
                 return 
i1 i2;
             }
         }
         else (
d2 <= 4)
         {
             
int i2 0;
             {
                 return 
i2 i1;
              }
           }
       } 

Precis börjat med c# och har en uppgift som ska dela två st double och runda av till närmaste heltal.

Tanken är att numerator % denominator ska ge en siffra som i if/else satsen antingen rundas upp eller ner.

Så jag tänkte att något sånt här skulle fungera. Men får ett error bakom "else (d2 <= 4)". Error meddelandet är "; expected".

Varför blir det så? Och funkar det här för att dela och runda av?

Vet att det säkert är skitfult skrivet men vi är på första veckan i första kursen.

edit: Detta ligger i en klass som ska innehålla funktionerna medans input finns i "program" tabben och länkar till dessa funktioner.
__________________
Senast redigerad av Kablash 2016-11-03 kl. 18:15.
Citera
2016-11-03, 20:24
  #3044
Medlem
tj.s avatar
Citat:
Ursprungligen postat av Kablash
Kod:
public int DivideAndRound(double numeratordouble denominator)
        {
         
double d1 numerator denominator;
         
double d2 numerator denominator;
         
int i1 Convert.ToInt32(d1);
         if (
d2 >= 5)
         {
             
int i2 1;
             {
                 return 
i1 i2;
             }
         }
         else (
d2 <= 4)
         {
             
int i2 0;
             {
                 return 
i2 i1;
              }
           }
       } 

Precis börjat med c# och har en uppgift som ska dela två st double och runda av till närmaste heltal.

Tanken är att numerator % denominator ska ge en siffra som i if/else satsen antingen rundas upp eller ner.

Så jag tänkte att något sånt här skulle fungera. Men får ett error bakom "else (d2 <= 4)". Error meddelandet är "; expected".

Varför blir det så? Och funkar det här för att dela och runda av?

Vet att det säkert är skitfult skrivet men vi är på första veckan i första kursen.

edit: Detta ligger i en klass som ska innehålla funktionerna medans input finns i "program" tabben och länkar till dessa funktioner.
Du kan inte ha ett villkor i en else. Den ska vara en default om något annat inte överensstämmer. I ditt fall blir det således
Kod:
if (d2 >= 5

    
int i2 1
    return 
i1 i2

else 
// d2 <= 4 

    
int i2 0
    return 
i2 i1

Vill du ha fler villkor får du använda dig av else if (xxx == yyy). Du ska heller inte ha måsvingar efter din tilldelning av i2.
Citera
2016-11-04, 04:48
  #3045
Medlem
Citat:
Ursprungligen postat av tj.
Vill du ha fler villkor får du använda dig av else if (xxx == yyy). Du ska heller inte ha måsvingar efter din tilldelning av i2.

Ah okej, då förstår jag!

Har ändrat hela koden nu dock, då jag märkte att jag inte riktigt fattade vad % gjorde. Jag trodde det var så att om man delar 1/2 (som blir 0.5) så skulle % ge 5. Men så var det ju inte.

Så jag hittade en annan metod. Math.Round. Så skrev ja till midpointrounding.awayfromzero så att .5 rundas bort från 0.

Kod:
double d1 numerator denominator;
Math.Round(d1MidpointRounding.AwayFromZero);
int i Convert.ToInt32(d1);
return 
i

Jag får dock fortfarande problem. 1/2 (som blir 0.5) rundas till 0 istället för 1. Även fast jag har lagt till att mid point rounding ska vara away from zero.

Kod:
double d1 2;   //som blir 0.5
Math.Round(d1MidpointRounding.AwayFromZero);  //här bör väl 0.5 avrundas till 1.
int i Convert.ToInt32(d1);
return 
i;   //Och här ska koden ge ut 1. 

Men den ger ut 0.
Citera
2016-11-04, 14:59
  #3046
Medlem
Sane?s avatar
Citat:
Ursprungligen postat av Kablash
Jag får dock fortfarande problem. 1/2 (som blir 0.5) rundas till 0 istället för 1. Även fast jag har lagt till att mid point rounding ska vara away from zero.

Kod:
double d1 2;   //som blir 0.5
Math.Round(d1MidpointRounding.AwayFromZero);  //här bör väl 0.5 avrundas till 1.
int i Convert.ToInt32(d1);
return 
i;   //Och här ska koden ge ut 1. 

Men den ger ut 0.
Du gör flera vanliga nybörjarmisstag, bra kodexempel
Kod:
double d1 2;   //som blir 0.5 
Vad som händer här är heltalsdivision följt av en konvertering till flyttal. (int)1 / (int)2 = 0. Detta är vad % är till för, den ger resten vid heltalsdivision (int)1 % (int)2 = 1, men det är inte viktigt för ditt problem. För att få till flyttalsdivision måste minst ett av de ingående talen vara ett flyttal.
Kod:
Math.Round(d1MidpointRounding.AwayFromZero);  //här bör väl 0.5 avrundas till 1. 
Här är det lätt att tro att d1 uppdateras när Round anropas, men det används bara som in-parameter. Resultatet av Round returneras från anropet. Detta gäller för i princip allt i .NET ramverket, utom när out- och ref-parametrar används.

Följande borde göra vad du vill åstadkomma:
Kod:
double d1 2.0// 0.5
d1 Math.Round(d1MidpointRounding.AwayFromZero); // 1.0
int i = (int)d1// 1
return i
Citera
2016-11-04, 16:08
  #3047
Medlem
Sane?s avatar
Citat:
Ursprungligen postat av MeanME
Jo, för att definitionen för det du gav den, ser ut så.
Så det har allt att göra med det.
Nej, det samma sak händer även när WriteLine inte är inblandad.

Testa själv:
Kod:
var "test" 2// blir "test12", inte "test3" 
Vad som händer är:
Kod:
string.Concat(string.Concat("test"1.ToString()), 2.ToString()) 
__________________
Senast redigerad av Sane? 2016-11-04 kl. 16:11.
Citera
2016-11-04, 22:11
  #3048
Medlem
MeanMEs avatar
Citat:
Ursprungligen postat av Sane?
Nej, det samma sak händer även när WriteLine inte är inblandad.

Testa själv:
Kod:
var "test" 2// blir "test12", inte "test3" 
Vad som händer är:
Kod:
string.Concat(string.Concat("test"1.ToString()), 2.ToString()) 
Ja, det är ju exakt vad som står i MS definition att det skall bli med, försök fatta...

Den ger textrepresentationen alltså en sträng av en integer.

Alltså "test" + 1 + 2 blir textrepresentationen av dessa tre värden då adderar man inte dem.
Man lägger ihop dem.
Det är samma sak som om du lägger ihop tre strängar som så:
string problem = "test" + "1" + "2"; // .Concat krävs inte resultatet blir detsamma utan.
Det är textrepresentationen av dessa tre strängar du får, inget annat.
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