Permalänk
Medlem

Behöver hjälp med C#

Hej, jag har precis börjat programmering 1 i C# på konvux...

Jag fick en uppgift i förrgår om att jag skulle göra en slags omvandlare som går ut på att programmet frågar användaren om ett decimaltal och sedan hur många decimaler användaren vill ha.

Jag håller på att bli galen och tanken om att avsluta kursen har slagit mig många gånger.

Det här är det jag åstadkommit, vad gör jag för fel? jag fattar inget...

class Program
{
static void Main(string[] args)

{
Console.Write("Skriv ett tal med decimaler här:");
string deciTal1 = Console.ReadLine();
decimal tal1 = Convert.ToDecimal(deciTal1);

Console.Write("Hur många decimaler vill du ha?:");
string deciTal2 = Console.ReadLine();
decimal tal2 = Convert.To(deciTal2);

Math.Round(tal1,tal2 );

Console.WriteLine(tal1);

Console.ReadKey();
}
}
}

Permalänk
Keeper of Traditions

Vad får du för fel?

Lägg in koden i CODE-taggar så ser det bättre ut i dina inlägg.

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem

kanske spelar mindre roll men du har 2st { och 3st }

Visa signatur

Citera om du vill ha svar :)

Permalänk
Inaktiv

Du kan inte avrunda decimal, använd double istället.
Dessutom måste du avrunda med ett heltal, dvs int.

Jag städade dessutom koden lite åt dig

Console.WriteLine("Skriv ett tal med decimaler här:"); string read = Console.ReadLine(); double decimalNbr = double.Parse(read); Console.WriteLine("Hur många decimaler vill du ha?:"); read = Console.ReadLine(); int paces = int.Parse(read); var roundedNbr = Math.Round(decimalNbr, paces); Console.WriteLine($"Avrundat: {roundedNbr}"); Console.Read();

Kompilatorn berättade direkt allt som var fel, använd tipsen du får av visual studio.

Permalänk
Medlem

Tack skall du ha, men jag blir inget smartare. @anon81912:

Permalänk
Medlem

Metoden Math.Round(dec,int) vill ha en int som andra parameter. Du ger den en decimal.
Ett annat fel kan vara att du matar in decimaltalet med kommatecken (1,34) istället för med punkt (1.34).
Ett tredje är att du måste lägga det nya talet i en variabel: decimal tal3 = math.round(tal1,tal2); och sedan använda tal3 för att visa

Det går utmärkt att avrunda decimaltal; https://msdn.microsoft.com/en-us/library/system.math.round(v=...

Visa signatur

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.

Permalänk

HJÄLP! Nybörjare C# lånar tråd

Hej!
Lyckades inte skapa en ny tråd så nu lånar jag den här C# tråden haha...
Är en nybörjade i C# som håller på att skapa ett projekt där vi ska räkna ut Alkohol per krona samt spara detta till ett objekt i en vektor som därefter ska sparas till fil. Vårt problem är att ingenting sparas i filen men lyckas inte se vad felet är. Ni får ha överseende med att koden inte på något sett är perfekt men utöver att ingenting sparas i txt-filen så har det ändå fungerat...
Någon som vill rädda vår dag(och betyg....) och se om den kan se vad som är tokigt?
Observera att koden inte är fullständig ännu och vissa av valen saknar funktion och ex bubblesort...

HÄR BÖRJAR KODEN:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ConsoleApplication20;

namespace ConsoleApplication20
{
class Program
{
public static Dryck[] drycker = new Dryck[0];
private static string namn;

public static void Main()
{
Ladda();
{

int i = 0; // gör det möjligt att återgå till huvudmeny samt att få upp menyn igen efter felaktigt tangentval
while (i < 1)
{
Console.WriteLine("ANGE ETT VAL:\n" + // Meny, gör att valen blir på olika rader

"\n1 : Uträkning av APK| " +
"\n--------------------|" +
"\n2 : Summering |" +
"\n--------------------|" +
"\n3 : Information |" +
"\n--------------------|" +
"\n4 : Avslut |" +
"\n--------------------|" );

String s1 = null; // kolla upp vad detta är, går dock ej vara utan
s1 = Console.ReadLine().ToString();
switch (s1)
{
case "1":

Dryck nyDryck = new Dryck();
Console.WriteLine(" (Observera att samtliga värden anges i siffror, samt alkoholhalt anges ex 0,12 för 12% ) \n");
i++;
Console.WriteLine("Ange namn på drycken");
namn= Console.ReadLine();
nyDryck.namn = namn;

Console.WriteLine("Ange mängd i milliliter");
double mängd = 0;
while (!double.TryParse(Console.ReadLine(), out mängd)) // om det skrivs i bokstäver så kommer feltext upp
{ Console.WriteLine("försök igen i enbart siffror"); }
nyDryck.mängd = mängd;

double pris = 0;
Console.WriteLine("Ange pris i kr"); // måste tillägga fler felkontroller på samtliga val
while (!double.TryParse(Console.ReadLine(), out pris)) // om det skrivs i bokstäver så kommer feltext upp
{ Console.WriteLine("försök igen i enbart siffror"); }
nyDryck.pris = pris;

double alkoholhalt = 0;
Console.WriteLine("Ange alkoholhalt");
while (!double.TryParse(Console.ReadLine(), out alkoholhalt)) // om det skrivs i bokstäver så kommer feltext upp, hur ändra så ex 0.12 går skriva?
{ Console.WriteLine("försök igen, använd , istället för ."); }
nyDryck.alkoholhalt = alkoholhalt;

double alkoholperkrona = 0;
alkoholperkrona = mängd * alkoholhalt / pris; // uträkning, fungerar ej helt ännu
Console.WriteLine(alkoholperkrona + "liter alkohol/kr");
nyDryck.alkoholperkrona = alkoholperkrona;

if (alkoholperkrona < 0.1)
{
Console.WriteLine("Dyrt!!");
}
else if (alkoholperkrona > 1)
{
Console.WriteLine("Helt ok!");
}
else if (alkoholperkrona > 1.15)
{
Console.WriteLine("Bra!");
}
else if (alkoholperkrona > 1.5)
{
Console.WriteLine("Mycket bra!");
}
else if (alkoholperkrona > 1.9)
{
Console.WriteLine("Fantastiskt!");

}
else
{
Console.WriteLine("WOW!");
}

//anropa metod som lägger till i vektor
UtökaVektor(nyDryck);

Console.WriteLine("Tryck på valfri tangent för att återgå till huvudmenyn");
Console.ReadKey(); // läser av valfri tangent
Console.Clear(); // tömmer skärmen
i = 0; // visar huvudmenyn på nytt
break;

case "2":
i++;
Console.WriteLine("Här ser du en summering av tidigare uträkningar");
Console.WriteLine("\nTryck på valfri tangent för att återgå till huvudmenyn");
Console.ReadKey(); // läser av valfri tangent
Console.Clear(); // tömmer skärmen
i = 0; // visar huvudmenyn på nytt
break;
case "3":
i++;
Console.WriteLine("information om hur APK fungerar");

Console.WriteLine("\nAlkohol per krona (APK) är ett mått för hur många milliliter ren alkohol ");
Console.WriteLine("man får för en krona, vid köp av alkoholhaltig dryck. APK stiger ");
Console.WriteLine("då dryckens pris sjunker eller alkoholhalten stiger");
Console.WriteLine("vilket innebär att ett lägre värde ger en dyrare berusning.");
Console.WriteLine("Varmt välkommen att klicka dig runt i de olika kategorierna");
Console.WriteLine("och spana in APK-värdet för just din favoritdryck!");

Console.WriteLine("\nTryck på valfri tangent för att återgå till huvudmenyn");
Console.ReadKey(); // läser av valfri tangent
Console.Clear(); // tömmer skärmen
i = 0; // visar huvudmenyn på nytt

break;
case "4":
i++;
break;

case "5":
Spara();
break;
default:
int val = 0;
Console.WriteLine("felaktigt val, testa igen"); // default innebär att när användaren anger annat än menyvalen så dyker denna feltext upp
i = 0;
while (!int.TryParse(Console.ReadLine(), out val))
{ Console.WriteLine("försök igen i enbart siffror"); } // om val görs i annat än siffror
break;

}
}
}
Spara();
}
public static void BubbleSort(int[] nyVektor)
{
bool osorterad = true;
int end = nyVektor.Length - 1;
while (osorterad)
{
osorterad = false;
for (int j = 0; j < end; j++)
{
if (nyVektor[j] > nyVektor[j + 1])
{
Swap(nyVektor, j, j + 1);
osorterad = true;
}
}
end--;
}
}
public static void Swap(int[] nyVektor, int a, int b)
{
int r = nyVektor[a];
nyVektor[a] = nyVektor[b];
nyVektor[b] = r;
}

public static void UtökaVektor(Dryck nytt)
{
Dryck[] nyVektor = new Dryck[drycker.Length + 1];
for (int i = 0; i < drycker.Length; i++)
{
nyVektor[i] = drycker[i];
}
nyVektor[drycker.Length] = nytt;

drycker = nyVektor;

}

public static void Ladda()
{
StreamReader infil = new StreamReader("drycker.txt");
string rad;
while ((rad = infil.ReadLine()) != null)
{
Dryck m = new Dryck();
string[] fält = rad.Split('\t');
m.namn = (fält[0]);
m.mängd = double.Parse(fält[1]);
m.pris = double.Parse(fält[2]);
m.alkoholhalt = double.Parse(fält[3]);
m.alkoholperkrona = double.Parse(fält[4]);

UtökaVektor(m);

}
infil.Close();
}

public static void Spara()
{
StreamWriter utfil = new StreamWriter("drycker.txt");
for (int i = 0; i < drycker.Length; i++)
{
Dryck m = drycker[i];
utfil.Write("{0}\t{1}\t{2}\t{3}\t{4}\t",m,namn, m.mängd, m.pris, m.alkoholhalt, m.alkoholperkrona);
}
utfil.Close();
}
}
}

(KLASS)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication20
{
public class Dryck
{
public string namn = null;
public double mängd = 0; // deklarering av lokala variabler
public double pris = 0;
public double alkoholhalt = 0;
public int val = 0;
public double apk = 0;
public double alkoholperkrona = 0;

public override string ToString()
{
return mängd + " " + pris + ", " + alkoholhalt + " (" + alkoholperkrona + ")";
}

}
}

Permalänk

skriva tal med decimaler i c#

Hej har liknande problem! Är glad vid snabba svar!

Uppgiften går ut på att du ska be användaren skriva in ett tal med decimaler.
Därefter ska ni be användaren skriva in hur många decimaler användaren vill ha.
Din kod ska avrunda talet enligt ovan, men också med ett på förbestämt antal decimaler (exempelvis tre).
Exempel:
Användaren skriver in talet 1,3457322 och 5 för antal decimaler. Talet redovisas dels med så många decimaler som användaren valt (1,34573), samt även med tre decimaler (1,346)

Så här långt har jag kommit:

class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Skriv ett tal med sex (6) antal decimaler.:");
string read = Console.ReadLine();
double decimalNbr = double.Parse(read);

Console.WriteLine("Hur många decimaler ska talet ha?:");
read = Console.ReadLine();
int paces = int.Parse(read);

var roundedNbr = Math.Round(decimalNbr, paces);
Console.WriteLine("Avrundat: {roundedNbr}");

Console.Read();

Hur gör jag för att komma vidare? Jag är fast!
Allt är till hjälp!

Permalänk
Medlem

@Kalebsson: Console.WriteLine("Avrundat: {0}", roundedNbr);

Visa signatur

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.

Permalänk
Medlem

@civilrealist: Spara() ligger utanför while() så den blir aldrig körd, flytta upp den till precis efter switchen.
Även ett stavfel i Spara(): det är ett kommatecken vid namn. 'm,namn' ska vara 'm.namn'

Visa signatur

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.

Permalänk

@kundun: Tack så mycket, det räddade min vecka och mitt arbete, tack

Permalänk

behöver ha lite hjälp till! Känner mig så kokad.

Så här långt har jag kommit:
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Skriv ett tal med sex (6) antal decimaler.:");
string read = Console.ReadLine();
double decimalNbr = double.Parse(read);

Console.WriteLine("Hur många decimaler ska talet ha?:");
read = Console.ReadLine();
int paces = int.Parse(read);

var roundedNbr = Math.Round(decimalNbr, paces);
Console.WriteLine("Avrundat: {0}",roundedNbr);

Console.Read();
{

double test = 3.445;

double res = Math.Round(test, 2); //3.44
double res1 = Math.Round(test, 2, MidpointRounding.ToEven); //3.44
double res2 = Math.Round(test, 2, MidpointRounding.AwayFromZero); //3.45

Console.ReadLine();

}

Allt fungerar bra men vad ska jag lägga till /göra för att få det skriva med ett förbestämt antal decimaler (exempelvis tre) också

Tack på förhand

Permalänk
Medlem
Skrivet av Kalebsson:

behöver ha lite hjälp till! Känner mig så kokad.

Så här långt har jag kommit:
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Skriv ett tal med sex (6) antal decimaler.:");
string read = Console.ReadLine();
double decimalNbr = double.Parse(read);

Console.WriteLine("Hur många decimaler ska talet ha?:");
read = Console.ReadLine();
int paces = int.Parse(read);

var roundedNbr = Math.Round(decimalNbr, paces);
Console.WriteLine("Avrundat: {0}",roundedNbr);

Console.Read();
{

double test = 3.445;

double res = Math.Round(test, 2); //3.44
double res1 = Math.Round(test, 2, MidpointRounding.ToEven); //3.44
double res2 = Math.Round(test, 2, MidpointRounding.AwayFromZero); //3.45

Console.ReadLine();

}

Allt fungerar bra men vad ska jag lägga till /göra för att få det skriva med ett förbestämt antal decimaler (exempelvis tre) också

Tack på förhand

Jag förstår inte hur du lyckats skriva koden om du inte kan förstå hur du löser ditt problem.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

@Kalebsson: Som technocide skriver så får du nog kolla igenom koden och försöka förstå vad den gör. Förstår du det så vet du också svaret.

Tips: Vad tror du dessa raderna gör?:

Console.WriteLine("Hur många decimaler ska talet ha?:"); read = Console.ReadLine(); int paces = int.Parse(read);

Visa signatur

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.

Permalänk

Jag har lyckats få till allt i min kod nu utom IF-satsen där jag verkar ha någon tanke-miss. Kan någon se var jag tänkt fel? Antar att det är något enkelt men tycker att jag har testat vända och vrida på "mindre än" och "mer än" men tycker inte det gör någon större skillnad. Får upp "Helt ok!" nästan oavsett vad..

if (alkoholperkrona < 1)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("\n Dyrt!!");
Console.ResetColor(); // Tar bort färg

}
else if (alkoholperkrona > 1)
{
Console.ForegroundColor= ConsoleColor.Blue;

Console.WriteLine("\n Helt ok!");
Console.ResetColor();
}
else if (alkoholperkrona < 1.5)
{
Console.ForegroundColor= ConsoleColor.Yellow;

Console.WriteLine("\n Bra!");
Console.ResetColor();

}

else if (alkoholperkrona > 1.5)
{
Console.ForegroundColor = ConsoleColor.Magenta;
Console.WriteLine("\n Mycket bra!");
Console.ResetColor();
}
else if (alkoholperkrona > 2)
{
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.WriteLine("\n Fantastiskt!");
Console.ResetColor();

}
else
{
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("\n APK-värdet för efterfrågad dryck verkar inte stämma!");
Console.ResetColor();
}

Permalänk
Medlem

Tankefel.
Tänk på att du måste avgränsa varje villkor, dvs du måste ha två kontroller av värdet på varje if.
Säg att du får ett värde på 1.7, kolla i din kod var du hamnar!

Tips: använd && för att lägga till fler villkor i en if()

Visa signatur

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.

Permalänk
Avstängd

Som kundun säger så stämmer inte dina villkor i IF-satserna. Alla möjliga värden är ju antingen < 1 eller > 1 (förutom exakt 1 då, vilket du också borde ta hänsyn till).

Permalänk

Super!
La till fler villkor i if-satsen med hjälp av &&, tusen tack kundun och snajk!

Permalänk
Medlem

att tänka sig skalan som en tallinje kan underlätta i sådana här fall också, om man tar fallen i tur och ordning och inte lägger kontrollerna i "oordning".

Ex:

var x = GetOutsideTemperature(); if (x < -20) { Console.WriteLine("Kallt som faäen!"); } else if (x < -10) { Console.WriteLine("Svalt..."); } else if (x < 0) { Console.WriteLine("Snart är det vår!"); } else if (x < 10) { Console.WriteLine("Shortsväder"); } else if (x < 20) { Console.WriteLine("Nakenväder"); } else if (x < 30) { Console.WriteLine("Pust och pes!"); } else { Console.WriteLine("Det är så varmt att man måste tända en brasa för att svalka sig!"); }

Sätter man upp sina kontroller av värdet på det här sättet, så kommer man "aldrig" att hamna i situationen att man får "fel" svar.
Om x är 15 tex, så är ju x inte mindre än -20, -10, 0 eller 10. Däremot är det mindre än 20, så då kommer den if-en att fånga upp talet.
En else på slutet fångar upp de tal som inte fångas upp på vägen, tex x = 1337.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av jovnas:

att tänka sig skalan som en tallinje kan underlätta i sådana här fall också, om man tar fallen i tur och ordning och inte lägger kontrollerna i "oordning".

Ex:

var x = GetOutsideTemperature(); if (x < -20) { Console.WriteLine("Kallt som faäen!"); } else if (x < -10) { Console.WriteLine("Svalt..."); } else if (x < 0) { Console.WriteLine("Snart är det vår!"); } else if (x < 10) { Console.WriteLine("Shortsväder"); } else if (x < 20) { Console.WriteLine("Nakenväder"); } else if (x < 30) { Console.WriteLine("Pust och pes!"); } else { Console.WriteLine("Det är så varmt att man måste tända en brasa för att svalka sig!"); }

Sätter man upp sina kontroller av värdet på det här sättet, så kommer man "aldrig" att hamna i situationen att man får "fel" svar.
Om x är 15 tex, så är ju x inte mindre än -20, -10, 0 eller 10. Däremot är det mindre än 20, så då kommer den if-en att fånga upp talet.
En else på slutet fångar upp de tal som inte fångas upp på vägen, tex x = 1337.

Bra tips!

Skickades från m.sweclockers.com

Visa signatur

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.

Permalänk
Medlem
Skrivet av jovnas:

Console.WriteLine("Det är så varmt att man måste tända en brasa för att svalka sig!");

Haha tror jag dog lite