Trädvy Permalänk
Medlem
Registrerad
Apr 2017

Hjälp med C#-kod

Hej,

Trodde jag kunde lösa det igår men det gick ej bra. Kan någon förklara förklara för mig vad jag gör för fel? eller hur jag ska tänka för att få en fungerande kod:

Console.WriteLine("Ange ett år mellan 1950-2050:");
int år;
Int32.TryParse(Console.ReadLine(), out år);
if (år > 1950 && år < 2050)
{
Console.WriteLine("Du verkar ha svårt att följa instruktioner");
}
else if (år > 1950 && år < 2050 && år % 4 == 0)
{
Console.WriteLine("Olympiska spel var det under detta år!");
}
else if (år > 1950 && år < 2050 && år % 4 == 0 + 2)
{
Console.WriteLine("Fotboll-VM var det under detta år");
}
else
{
Console.WriteLine("Ingenting särskilt detta år");
}

Rubrik /mod
Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013

@Juleslelo: När du skapar en fråga relaterad till kod så är det bra att beskriva vad du försöker göra och vad du har testat. Jag har svårt att veta vad som specifikt är fel och vad du vill ska hända av det du angett ovan.

Sen bör du lägga din kod innanför [code-tag] [/code-tag] utan -tag. Detta gör det enklare att läsa.

Console.WriteLine("Ange ett år mellan 1950-2050:"); int år; Int32.TryParse(Console.ReadLine(), out år); if (år > 1950 && år < 2050) { Console.WriteLine("Du verkar ha svårt att följa instruktioner"); } else if (år > 1950 && år < 2050 && år % 4 == 0) { Console.WriteLine("Olympiska spel var det under detta år!"); } else if (år > 1950 && år < 2050 && år % 4 == 0 + 2) { Console.WriteLine("Fotboll-VM var det under detta år"); } else { Console.WriteLine("Ingenting särskilt detta år"); }

Vi kan skriva om till lite pseudo-kod för att förtydliga.

Din första if-sats nu: OM år är STÖRRE än 1950 OCH år är MINDRE än 2050
Så om du anger 1951 blir denna true (1951 är större än 1950 och mindre än 2050) och går in i if-blocekt och skriver ut "Du verkar ha svårt att följa instruktioner", därefter avslutas programmet.

Det jag tror du menar: OM år är MINDRE än 1950 ELLER år är STÖRRE än 2050.

if (år < 1950 || år > 2050)

Sedan rekommenderar jag dig att skriva kod på engelska, variabler bör aldrig ha åäö.

Trädvy Permalänk
Medlem
Registrerad
Apr 2017

@zaibuf: Tack nu verkar den lira lite grann, jag vet men uppfiften är på Svenska därför håller jag med till det.
men är det bättre att skriva "||" än "&&"?

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@Juleslelo: Förutom vad zaibuf redan sagt så bör du även se över de övriga villkoren. Vad händer om användaren matar in exakt 1950 eller 2050?

Och en småsak är att det är lite konstigt att skriva år % 4 == 0 + 2, det går lika bra att bara skriva år % 4 == 2.

Skrivet av Juleslelo:

men är det bättre att skriva "||" än "&&"?

Det handlar inte om bättre eller sämre, det är två olika operatorer. x && y ("x och y") är sant endast om både x och y är sanna, medan x || y ("x eller y") är sant om någon eller båda av x eller y är sanna.

Tänk på att ett tal kan inte vara både mindre än 1950 och större än 2050 samtidigt, men det kan vara större än 1950 och mindre än 2050 samtidigt.

Trädvy Permalänk
Medlem
Registrerad
Apr 2017

@perost: Topp och tack för input! jag håller på att lär mig som sagt och känner att tänkandet måste man ändra på helt men det kommer

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013
Skrivet av Juleslelo:

@perost: Topp och tack för input! jag håller på att lär mig som sagt och känner att tänkandet måste man ändra på helt men det kommer

Rekommenderar att du börjar med att lösa uppgiften som du hade gjort i verkligheten, skriv ner med papper och penna.
Skriv som jag gjorde ovan i psuedokod.
När du känner att du löst problemet, skriv koden. Hjälper väldigt mycket i början när man ska lära sig.

Trädvy Permalänk
Medlem
Registrerad
Apr 2017

Hjälp med C#

@zaibuf: tanken nu är att skapa ett program där jag kan mata in 10 tal i en array och efter inmatningen ska man få möjlighet att se största tal eller minsta eller alla tal. Menyn som vissas efter all inmatning återkommer efter varje val. Användaren ska alltså kunna välja flera olika alternativ ända tills man tröttnar och väljer 5 (avsluta). Jag kan mata in tal och får ut en meny men sedan är det stopp, får inte till det. jag vet att det ska vara något med For loop men allt jag in blir det bara error

static void Main(string[] args)
{
int[] tal = new int[10];
for (int i = 0; i < 10; i++)
{
Console.Write("Ange tal nr " + (i + 1) + ": ");
Int32.TryParse(Console.ReadLine(), out tal[i]);
}
while (true)
{
Console.WriteLine();
Console.WriteLine("Vad vill du göra?");
Console.WriteLine("1. Visa största talet");
Console.WriteLine("2. Visa minsta talet");
Console.WriteLine("3. Visa medelvärdet med en decimal");
Console.WriteLine("4. Visa alla inmatade tal");
Console.WriteLine("5. Avsluta detta program");
int val;
Int32.TryParse(Console.ReadLine(), out val);

}

}
}
}

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013
Skrivet av Juleslelo:

@zaibuf: tanken nu är att skapa ett program där jag kan mata in 10 tal i en array och efter inmatningen ska man få möjlighet att se största tal eller minsta eller alla tal. Menyn som vissas efter all inmatning återkommer efter varje val. Användaren ska alltså kunna välja flera olika alternativ ända tills man tröttnar och väljer 5 (avsluta). Jag kan mata in tal och får ut en meny men sedan är det stopp, får inte till det. jag vet att det ska vara något med For loop men allt jag in blir det bara error

static void Main(string[] args)
{
int[] tal = new int[10];
for (int i = 0; i < 10; i++)
{
Console.Write("Ange tal nr " + (i + 1) + ": ");
Int32.TryParse(Console.ReadLine(), out tal[i]);
}
while (true)
{
Console.WriteLine();
Console.WriteLine("Vad vill du göra?");
Console.WriteLine("1. Visa största talet");
Console.WriteLine("2. Visa minsta talet");
Console.WriteLine("3. Visa medelvärdet med en decimal");
Console.WriteLine("4. Visa alla inmatade tal");
Console.WriteLine("5. Avsluta detta program");
int val;
Int32.TryParse(Console.ReadLine(), out val);

}

}
}
}

Jag hade deklarerat int val; utanför loopen och sedan ända värdet i loopen beroende på vad användaren väljer.
Istället för while(true) kan du deklarera en bool utanför loopen, ex) bool running = true; därefter om användaren väljer 5 för att avsluta så sätter du boolen till false och loopen kommer att avbrytas i nästa iteration.

Sen hade jag delat upp varje del av menyn i en egen metod som du anropar beroende på inmatat val, själva menyn skulle också kunna ligga i en egen metod, för läslighet.

switch(val) { case 1: PrintMaxNumber(tal); break; case 2: PrintMinNumber(tal); break; // etc } static void PrintMaxNumber(int[] numbersArray) { // Kontrollera arrayen och se vilket tal som är högst // skriv ut det i en Console.WriteLine(); }

Är du osäker på metoder så kan du skriva allt innanför loopen, blir dock snabbt väldigt rörigt.
Kolla upp switch-case : http://www.csharp-examples.net/switch/

Trädvy Permalänk
Medlem
Registrerad
Apr 2017

@zaibuf: alright tack, jag försöker deklarera int val utanför loopen sedan fortsätter med bool fast måste läsa om det då vi har inte kommit så långt än i kursen.

Trädvy Permalänk
Medlem
Registrerad
Apr 2017

@zaibuf: Jag får inte till det att lira helt enkelt, har du lust att kika på min kod igen?

{
int[] tal = new int[10];
for (int i = 0; i < 10; i++)
{
Console.Write("Ange tal nr " + (i + 1) + ": ");
Int32.TryParse(Console.ReadLine(), out tal[i]);
}
static void menytext()
{
Console.WriteLine();
Console.WriteLine("Vad vill du göra?");
Console.WriteLine("1. Visa största talet");
Console.WriteLine("2. Visa minsta talet");
Console.WriteLine("3. Visa medelvärdet med en decimal");
Console.WriteLine("4. Visa alla inmatade tal");
Console.WriteLine("5. Avsluta detta program");
}

static void Main(string[] args)
{
while (true)
{
menytext();
int val;
Int32.TryParse(Console.ReadLine(), out val);
if (val == 1) Console.WriteLine("Största värdet i arrayn är " + tal.Max());
else if (val == 2) Console.WriteLine("Minsta värdet i arrayn är " + nr.Min());
else if (val == 3) Console.WriteLine("Summan av alla talen i arrayn är " + nr.Sum());
else if (val == 4)
else if (val == 5) break;
}
}

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013

@Juleslelo vad specifikt är det som du inte får till? Vad sker nu? Vad vill du ska ske? Om du kan svara på de två första, vart tror du då felet kan vara?

Om du kikar på din kod här så använder du olika variabler: tal.Max() och nr.Min().

if (val == 1) Console.WriteLine("Största värdet i arrayn är " + tal.Max()); else if (val == 2) Console.WriteLine("Minsta värdet i arrayn är " + nr.Min()); else if (val == 3) Console.WriteLine("Summan av alla talen i arrayn är " + nr.Sum());

Programmet körs igång i metoden Main. Det betyder att du inte bara kan ha kod liggandes som denna:

{ int[] tal = new int[10]; for (int i = 0; i < 10; i++) { Console.Write("Ange tal nr " + (i + 1) + ": "); Int32.TryParse(Console.ReadLine(), out tal[i]); }

Vill du separera koden så behöver du göra en metod av det och eventuellt sätta din int[] till en property i klassen. Men nu börjar vi spåra iväg från komplexiteten på denna uppgift.

// Här startar programmet. static void Main(string[] args) { int[] tal = GenerateNumbers(); bool isRunning = true; while (isRunning) { MenyText(); Int32.TryParse(Console.ReadLine(), out int val); if (val == 1) Console.WriteLine("Största värdet i arrayn är " + tal.Max()); else if (val == 2) Console.WriteLine("Minsta värdet i arrayn är " + tal.Min()); else if (val == 3) Console.WriteLine("Summan av alla talen i arrayn är " + tal.Sum()); else if (val == 4) // Visa alla inmatade tal. else if (val == 5) isRunning = false; else Console.WriteLine("Nu förstod jag inte vad du menade."); } } // Skriver ut menyn i konsolen static void MenyText() { Console.WriteLine(); Console.WriteLine("Vad vill du göra?"); Console.WriteLine("1. Visa största talet"); Console.WriteLine("2. Visa minsta talet"); Console.WriteLine("3. Visa medelvärdet med en decimal"); Console.WriteLine("4. Visa alla inmatade tal"); Console.WriteLine("5. Avsluta detta program"); } // Genererar och returerar en int array bestående av tio nummer. static int[] GenerateNumbers() { int[] tal = new int[10]; for (int i = 0; i < tal.Length; i++) { Console.Write("Ange tal nr " + (i + 1) + ": "); Int32.TryParse(Console.ReadLine(), out tal[i]); } return tal; }

Jag är dock osäker på om det är meningen att ni ska använda LINQ eller göra uträkningarna själv med hjälp av loopar.
Det är viktigt i början att förstå hur saker fungerar innan man börjar att förenkla.

Notera:
3) ska visa medelvärdet med en decimal, inte totala summan (som du gör nu).

Rekommenderar dig också att använda måsvingar för dina if-satser även om det är en rad.
Det är best practise att alltid använda måsvingar för att inte få oönskade buggar.

Tips:
Lär dig använda debuggern. Sätt en breakpoint vid ingången i programmet, tryck F5 för att starta med debuggern. Steppa igenom koden med F10 / F11 för att steg för steg se vad som sker. Du kan även hålla över variabler och se / ändra dess värden medan programmet körs. Är du osäker på hur man sätter breakpoint och använder debuggern --> läs här

Trädvy Permalänk
Medlem
Registrerad
Apr 2017

@zaibuf: Du förklarar bättre än min nuvarande lärare, vet att mycket hänger på mig att forska och läsa på samt öva men tycker att det är frustrerande när man ej får den hjälp man behöver när man kör fast. Jag hann redan lösa uppgiften med klasskamrat men jag tackar som bara fan för all din hjälp. Du är grym!

Trädvy Permalänk
Medlem
Registrerad
Apr 2017

Nu är det stopp igen och behöver lite hjälp. uppgiften går ut på att skapa ett program som består av 2 metoder. Första metoden har jag fixat och den går ut på att ta emot en sträng som argument och inte ha något returvärde och output på skärmen ska skrivas med * omkring sig. Den andra metoden ska ta emot en sträng som argument och returnerar en sträng som är samma som den som den fick som argument, men varje bokstav är skiftad ett steg. T.ex. MANGO blir NBOHP här är det stopp

static string SkiftadEttSteg(string ord){ string[] alphabetet = new string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
{
return string ord
}

static void Main(string[] args)
{
Console.WriteLine("Ange ett ord:");
string ord = Console.ReadLine();

ord = SkiftadEttSteg(ord);
for (int i = 0; i < ord.Length; i++)
{
Console.Write(ord[i] + "*");
}
}
}
}

Trädvy Permalänk
Medlem
Registrerad
Nov 2011

@Juleslelo: Förklara hur du tänker dig att det borde fungera. Det är svårt att hjälpa när du inte talar om specifikt vad du sitter fast på och vad du har försökt hittills.

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@Juleslelo: Viktigt att tänka på när det gäller C# är att det inte går att ändra på innehållet i strängar, så du måste alltid skapa en ny sträng när du vill "ändra" på en sträng. En annan egenskap som strängar har i C# är att []-operatorn returnerar ett värde av typen char, som kan hanteras som en heltalstyp.

Så t.ex.:

string s1 = "abc"; char c = s1[0]; // c == 'a' c += 1; // c == 'b' string s2; s2 += c; // s == "b"

Notera att char-värden omges med ' medan strängar använder ". Det råkar även vara så att värdena för a-z och A-Z ligger tillsammans, så 'a' + 1 = 'b' o.s.v.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013
Skrivet av Juleslelo:

Nu är det stopp igen och behöver lite hjälp. uppgiften går ut på att skapa ett program som består av 2 metoder. Första metoden har jag fixat och den går ut på att ta emot en sträng som argument och inte ha något returvärde och output på skärmen ska skrivas med * omkring sig. Den andra metoden ska ta emot en sträng som argument och returnerar en sträng som är samma som den som den fick som argument, men varje bokstav är skiftad ett steg. T.ex. MANGO blir NBOHP här är det stopp

static string SkiftadEttSteg(string ord){ string[] alphabetet = new string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
{
return string ord
}

static void Main(string[] args)
{
Console.WriteLine("Ange ett ord:");
string ord = Console.ReadLine();

ord = SkiftadEttSteg(ord);
for (int i = 0; i < ord.Length; i++)
{
Console.Write(ord[i] + "*");
}
}
}
}

Lite att ta i beaktelse när man arbetar med ASCII värden.

Ska Å Ä och Ö ingå eller endast A-Z.
Ska metoden hantera både stora och små bokstäver (ASCII-värden skiljer dessa åt).
Ska t.ex. bindesträck, underscore etc. ingå, eller är det någon felhantering av dessa?
Det jag menar är, ska symboler ignoreras och enbart följa med tillbaka på samma position eller ska de också skiftas, eller är rentav den strängen ogiltig?

Adderar du t.ex. 1 på Z så får du ], vilket kanske inte är att föredra? Istället kanske du vill ha ett A eller Å i detta fall?
=============================================================================

Innan jag ger dig ett förslag på en lösning jag knåpade ihop, så kan jag ge lite tips hur jag tänkte:

- Håll i ett alfabet i en eller två strängar (tänk på stora- och små -bokstäver).

- Loopa igenom inmatade strängen, detta kommer att ge dig en iteration av char (bokstäver).

- Kontrollera om aktuellt värde efter skiftning (+1) finns med i strängen av alfapetet. Om inte har du fått för långt och behöver börja om alfabetet. (Du vill t.ex. inte ha symboler och andra flummiga tecken.)

- Appenda resultatet till den skiftade strängen som du returerar i slutet.