Permalänk
Medlem

C# Vektorer

Hej!

Jag vill att indexeringen i min vektor ska backa ett steg varje gång ett värde slås in som är större än 25 och mindre än 1 tills att min vektor har 10 tal mellan 1-25.

Exempel:

Om användaren slår in siffrorna 2 och 10 så blir mina index {0} 2 och {1}10, men när användaren slår in indexposition {2} med värdet 30 så vill jag med en for-loop att nästa värde som ska slås in skriver över {2} tills att villkoren är uppfyllda, som är att ett värde mellan 1-25 för att komma vidare till index {3}

int[] tal = new int[10];

Console.WriteLine (" mata in 10 st heltal mellan 1 & 25. Tryck enter/retrun mellan varje heltal\n");

for (int i = 0; i < tal.Length; i++)
{
int gissadeTal = int.Parse(Console.ReadLine()); // läser in och omvandlar användarens tal

if (gissadeTal < 1 || gissadeTal > 25) //Om det inmatade talet är lägre än noll eller över 25

{
Console.WriteLine("värdet måste vara mellan 1 och 25 ");
}

//INDEXERINGEN SKA GÅ TILLBAKA ETT STEG HÄR MEN VET INTE HUR JAG SKA GÖRA
( tal = i --)

else
{
tal[i] = gissadeTal; // Gissade tal läggs in i vektron tal
}

Permalänk
Medlem
Skrivet av sbozic:

Hej!

Jag vill att indexeringen i min vektor ska backa ett steg varje gång ett värde slås in som är större än 25 och mindre än 1 tills att min vektor har 10 tal mellan 1-25.

Exempel:

Om användaren slår in siffrorna 2 och 10 så blir mina index {0} 2 och {1}10, men när användaren slår in indexposition {2} med värdet 30 så vill jag med en for-loop att nästa värde som ska slås in skriver över {2} tills att villkoren är uppfyllda, som är att ett värde mellan 1-25 för att komma vidare till index {3}

int[] tal = new int[10];

Console.WriteLine (" mata in 10 st heltal mellan 1 & 25. Tryck enter/retrun mellan varje heltal\n");

for (int i = 0; i < tal.Length; i++)
{
int gissadeTal = int.Parse(Console.ReadLine()); // läser in och omvandlar användarens tal

if (gissadeTal < 1 || gissadeTal > 25) //Om det inmatade talet är lägre än noll eller över 25

{
Console.WriteLine("värdet måste vara mellan 1 och 25 ");
}

//INDEXERINGEN SKA GÅ TILLBAKA ETT STEG HÄR MEN VET INTE HUR JAG SKA GÖRA
( tal = i --)

else
{
tal[i] = gissadeTal; // Gissade tal läggs in i vektron tal
}

Kan du inte spara talet i en variabel medan du gör kontrollen och endast sätta in talet om det uppfyller dina kriterier?

1. Begär input från användaren.
2. Validera input
3. Om input är OK, spara värdet.

Permalänk
Medlem

tal

är inte en vektor utan en array vad jag förstår.

Du kan inte dekrementera en array. Däremot kan du dekrementera din iterator, dvs den variabel som du valt att döpa till "i".
Eftersom det du håller på med ser ut som en typisk skoluppgift tänker jag inte ge dig ett rakt svar, ledtrådarna du fått bör vara mer än tillräckliga.

Visa signatur

WS: MSI B350M Mortar | AMD Ryzen 7 1700 | PH-TC14PE | 32GB DDR4 3000MHz | 120GB Intel 530 | 2*500GB HDD | Intel Arc A750 8GB | 2*BenQ G2420HDB
Router: Gigabyte GA-870-UD3 | AMD Phenom II x6 1055t @ 2600MHz, 1.25V | 12GB DDR3 | 2*250GB HDD @ RAID1 | 4TB HDD
Laptop: Thinkpad X220 4291-QF6

Permalänk
Medlem
Skrivet av sbozic:

Hej!

Jag vill att indexeringen i min vektor ska backa ett steg varje gång ett värde slås in som är större än 25 och mindre än 1 tills att min vektor har 10 tal mellan 1-25.

Exempel:

Om användaren slår in siffrorna 2 och 10 så blir mina index {0} 2 och {1}10, men när användaren slår in indexposition {2} med värdet 30 så vill jag med en for-loop att nästa värde som ska slås in skriver över {2} tills att villkoren är uppfyllda, som är att ett värde mellan 1-25 för att komma vidare till index {3}

int[] tal = new int[10];

Console.WriteLine (" mata in 10 st heltal mellan 1 & 25. Tryck enter/retrun mellan varje heltal\n");

for (int i = 0; i < tal.Length; i++)
{
int gissadeTal = int.Parse(Console.ReadLine()); // läser in och omvandlar användarens tal

if (gissadeTal < 1 || gissadeTal > 25) //Om det inmatade talet är lägre än noll eller över 25

{
Console.WriteLine("värdet måste vara mellan 1 och 25 ");
}

//INDEXERINGEN SKA GÅ TILLBAKA ETT STEG HÄR MEN VET INTE HUR JAG SKA GÖRA
( tal = i --)

else
{
tal[i] = gissadeTal; // Gissade tal läggs in i vektron tal
}

Skrivet av Dracc:

tal

är inte en vektor utan en array vad jag förstår.

Du kan inte dekrementera en array. Däremot kan du dekrementera din iterator, dvs den variabel som du valt att döpa till "i".
Eftersom det du håller på med ser ut som en typisk skoluppgift tänker jag inte ge dig ett rakt svar, ledtrådarna du fått bör vara mer än tillräckliga.

Bara för att förtydliga:
Dekrementera är då motsatsen till inkrementera.
Inkrementerar gör du när värdet på iteratorn ökar(med ett).

Visa signatur

Outtröttlig, löpartokig besserwisser!

Bli vegan! För djuren, planeten, hälsan och våra barns skull!

Permalänk
Medlem
Skrivet av MickeBoy:

Kan du inte spara talet i en variabel medan du gör kontrollen och endast sätta in talet om det uppfyller dina kriterier?

1. Begär input från användaren.
2. Validera input
3. Om input är OK, spara värdet.

Hej!

Skoluppgiften vill att man backar i arrayen/vektorn. Jag behöver inte få raka svar men då jag försökt i 4 timmar idag så behöver jag en liten knuff åt rätt håll.

Permalänk
Medlem
Skrivet av Dracc:

tal

är inte en vektor utan en array vad jag förstår.

Du kan inte dekrementera en array. Däremot kan du dekrementera din iterator, dvs den variabel som du valt att döpa till "i".
Eftersom det du håller på med ser ut som en typisk skoluppgift tänker jag inte ge dig ett rakt svar, ledtrådarna du fått bör vara mer än tillräckliga.

Hej!

Vektor och Array är väl samma sak?
Det är en skoluppgift och som jag skriver så vill jag påstå att jag vet vad jag vill göra i pseudokod, men att få ut det i kod har jag inte lyckats med ännu.

Permalänk
Medlem
Skrivet av sbozic:

Hej!

Vektor och Array är väl samma sak?
Det är en skoluppgift och som jag skriver så vill jag påstå att jag vet vad jag vill göra i pseudokod, men att få ut det i kod har jag inte lyckats med ännu.

En till fråga:

Måste indexering backa ett steg för att användaren matar in fel värde, enligt uppgiftsbeskrivningen?

Annars kan man nästla loopar såhär:

for eller foreach(varje tal av din array) { while(tal inte är rätt) { Mata in nytt tal } }

då kommer den inre, while-loopen, att köras klart före iteratorn i inkrementerar.

Och nej, array och vektor är inte samma sak. Vektorer används inte ens i C#. Det finns däremot List<T> som är C#-motsvarigheten. Sen är skillnaden mellan en array och vektor/lista/whatever ganska stor.

Visa signatur

Outtröttlig, löpartokig besserwisser!

Bli vegan! För djuren, planeten, hälsan och våra barns skull!

Permalänk
Medlem
Skrivet av NisseG91:

En till fråga:

Måste indexering backa ett steg för att användaren matar in fel värde, enligt uppgiftsbeskrivningen?

Som jag tyder uppgiften så måste den det och det står att
Detta lösas enklast genom att man styr inmatning till respektive position i vektorn med en for-loop.

Annars kan man nästla loopar såhär:

for eller foreach(varje tal av din array) { while(tal inte är rätt) { Mata in nytt tal } }

då kommer den inre, while-loopen, att köras klart före iteratorn i inkrementerar.

Och nej, array och vektor är inte samma sak. Vektorer används inte ens i C#. Det finns däremot List<T> som är C#-motsvarigheten. Sen är skillnaden mellan en array och vektor/lista/whatever ganska stor.
https://cdn.educba.com/academy/wp-content/uploads/2018/09/C-Array-Vs-List.jpg

Som jag tyder uppgiften så måste den lösas med en loop som gör minus i Arrayn.
Det står - Detta lösas enklast genom att man styr inmatning till respektive position i vektorn med en for-loop.

I min lärobok Programmering 1 så står det att C# görs ingen skillnad på vektor och fält, och på engelska används termen array.

Permalänk
Medlem
Skrivet av sbozic:

Som jag tyder uppgiften så måste den lösas med en loop som gör minus i Arrayn.
Det står - Detta lösas enklast genom att man styr inmatning till respektive position i vektorn med en for-loop.

I min lärobok Programmering 1 så står det att C# görs ingen skillnad på vektor och fält, och på engelska används termen array.

Okej, om det uttryckligen står så.

for(int i = 0; i<hurmångataldunuskulleha;i++) { mata in tal; if(tal inte uppfyller krav) i--; }

Och nej, det görs ingen skillnad, men som sagt: vektor som begrepp finns inte ens i c#. motsvarigheten är en List<T>. Det är dock en helt annan diskussion.

Visa signatur

Outtröttlig, löpartokig besserwisser!

Bli vegan! För djuren, planeten, hälsan och våra barns skull!

Permalänk
Medlem

class Program { static void Main(string[] args) { List<int> list = new List<int>(); while (list.Count < 10) { int value = EnterNumber(); if (value != 0) { list.Add(value); } } Console.WriteLine("Ni matade in dessa 10 tal mellan 1 - 25:"); foreach(var item in list) { Console.WriteLine(item); Console.ReadLine(); } } private static int EnterNumber() { Console.WriteLine("Vänligen ange en siffta mellan 1 och 25"); string enteredValue = Console.ReadLine(); int integer = int.Parse(enteredValue); if (integer > 25 || integer < 1) { return 0; } else { return integer; } } }

Permalänk
Medlem

@sbozic: En vektor är ett matematiskt begrepp som i programmering ofta representeras som en 1-dimensionell array. Många använder därför vektor som synonym för en 1-dimensionell array, men det blir lätt lite rörigt eftersom en del inte har koll på det samt att en del språk har en specifik vektor-typ (t.ex. std::vector i C++).

Det är med andra ord inte fel att kalla det för vektor i det här fallet, men array är nog att föredra om man vill undvika missförstånd. Att kalla det för fält är nog för övrigt ännu värre, eftersom den termen vanligtvis används för variabler i klasser och structs och sällan som synonym för array.

Detta är för övrigt en bra lektion i programmering: att ge saker bra och tydliga namn är svårt, och de bästa namnen är oftast redan tagna!

Ett annat sätt att lösa uppgiften på är förresten att endast inkrementera index-variabeln när du lägger till ett nytt element i arrayen, istället för att alltid inkrementera den och "ångra" dig när det inte gick. Logiken blir lite enklare att följa då i mitt tycke.

Permalänk
Medlem
Skrivet av perost:

@sbozic: En vektor är ett matematiskt begrepp som i programmering ofta representeras som en 1-dimensionell array. Många använder därför vektor som synonym för en 1-dimensionell array, men det blir lätt lite rörigt eftersom en del inte har koll på det samt att en del språk har en specifik vektor-typ (t.ex. std::vector i C++).

Det är med andra ord inte fel att kalla det för vektor i det här fallet, men array är nog att föredra om man vill undvika missförstånd. Att kalla det för fält är nog för övrigt ännu värre, eftersom den termen vanligtvis används för variabler i klasser och structs och sällan som synonym för array.

Detta är för övrigt en bra lektion i programmering: att ge saker bra och tydliga namn är svårt, och de bästa namnen är oftast redan tagna!

Ett annat sätt att lösa uppgiften på är förresten att endast inkrementera index-variabeln när du lägger till ett nytt element i arrayen, istället för att alltid inkrementera den och "ångra" dig när det inte gick. Logiken blir lite enklare att följa då i mitt tycke.

Ok, tack för klargörandet. Vad det gäller uppgiften så ska den lösas genom att värdet läggs in för att sedan skrivas över av nästa värde i arrayn och så ska det hålla på tills att man har 10 heltal mellan 1-25. Och jag har nu hållit på sen kl 10 mer eller mindre utan att få till det. Så här ser det ut just nu. Men koden saknar det jag har som fråga i tråden. Och jag är medveten att det saknas kod där man backar ett steg i arrayn, men det är den jag inte kan få till och vart den ska sitta. Jag vill få in något efter mitt villkor i if-satsen (gissadeTal < 1 || gissadeTal > 25). Men alla försök leder till felmeddelanden.

class Program
{
static void Main(string[] args)
{
int[] tal = new int[10];

Console.WriteLine (" Välkommen till Lotto, mata in 10 st heltal mellan 1 & 25. Tryck enter/retrun mellan varje heltal\n");

for (int i = 0; i < tal.Length; i++)
{
int gissadeTal = int.Parse(Console.ReadLine()); // läser in och omvandlar användarens tal

if (gissadeTal < 1 || gissadeTal > 25) //Om det inmatade talet är lägre än noll eller över 25

{
Console.WriteLine("värdet måste vara mellan 1 och 25 ");
}

else
{
tal[i] = gissadeTal; // Gissade tal läggs in i vektron tal
}

}

Random randomare = new Random();
int slumptal = randomare.Next(1, 25);

for (int i = 0; i < tal.Length; i++)

if (tal[i] == slumptal)
{
Console.WriteLine("\nGrattis " + slumptal + " är rätt gissat");
}

Console.ReadKey();

Permalänk
Medlem

@sbozic: Vad är det som du har problem med? Det enda du behöver göra är som sagt att minska i med 1 på samma ställe som du skriver ut meddelandet om att värdet måste vara mellan 1 och 25.

Du kan för övrigt använda:
[code]
Kod här
[/code]
för att undvika att forumet äter upp formateringen på din kod.

Permalänk
Medlem
Skrivet av perost:

@sbozic: Vad är det som du har problem med? Det enda du behöver göra är som sagt att minska i med 1 på samma ställe som du skriver ut meddelandet om att värdet måste vara mellan 1 och 25.

Du kan för övrigt använda:
[code]
Kod här
[/code]
för att undvika att forumet äter upp formateringen på din kod.

Det blir lite överkurs för mig just nu känns det som med [noparse] etc, men jag ska ta och spara det du säger för senare tillfälle. Angående koden att bra minska med 1 är just det jag inte får till. Jag har provat med

if (gissadeTal < 1 || gissadeTal > 25) i--; men jag får hela tiden felmeddelandet på min efterföljande else kod med syntaxen att else cannot start a statment då jag har ett smikolon efter -- gissar jag. Jag vet helt enkelt inte hur det ska ska kodas.

Permalänk
Medlem
Skrivet av sbozic:

Det blir lite överkurs för mig just nu känns det som med [noparse] etc, men jag ska ta och spara det du säger för senare tillfälle.

noparse kan du ignorera, det var bara för att forumet inte skulle tolka min text som kod. Du behöver bara sätta [code] i början av ett block med kod och [/code] i slutet, annars äter forumet upp din indentering och gör din kod svårare att läsa.

Skrivet av sbozic:

if (gissadeTal < 1 || gissadeTal > 25) i--; men jag får hela tiden felmeddelandet på min efterföljande else kod med syntaxen att else cannot start a statment då jag har ett smikolon efter -- gissar jag. Jag vet helt enkelt inte hur det ska ska kodas.

Syntaxen för en if-sats är:

if (villkor) sats else sats

där else-biten är frivillig. En sats kan här vara lite vad som helst, se dokumentationen, men det viktigaste här är att det kan vara ett block. Ett block är en lista med satser som exekveras i tur och ordning, och som börjar med { och slutar med }. Du vill så gott som alltid använda block istället för individuella satser när det gäller if-satser, eftersom det annars är väldigt lätt att göra fel. D.v.s. du vill nästan alltid skriva if-satserna på följande form:

if (villkor) { sats1 sats2 o.s.v. } else { sats1 sats2 o.s.v. }

Du kan inte skriva t.ex:

if (villkor) sats1 sats2 else ...

eftersom if-satsen då tar slut efter sats1, så att sats2 blir en fristående sats som inte hör till if-satsen. Det blir då fel med else eftersom else endast kan ligga direkt efter en if-sats utan något emellan.

Permalänk
Skrivet av sbozic:

Jag vill att indexeringen i min vektor ska backa ett steg varje gång ett värde slås in som är större än 25 och mindre än 1 tills att min vektor har 10 tal mellan 1-25.

Istället för att krångla till det så borde en enkel while-sats i for-loopen räcka:

for (int i = 0; i < tal.Length; i++) { int gissadeTal = int.Parse(Console.ReadLine()); // läser in och omvandlar användarens tal while (gissadeTal < 1 || gissadeTal > 25) //Så länge det inmatade talet är lägre än noll (här ska det stå "ett" btw) eller över 25 { Console.WriteLine("värdet måste vara mellan 1 och 25 "); gissadeTal = int.Parse(Console.ReadLine()); //For-loopen går inte vidare förrän användaren har matat in ett giltigt heltal } }

Du bör också veta att Random-metodens maxvärde är exkluderande medan minvärdet är inkluderande. Just nu genererar din "randomare" aldrig talet 25, därför ska det vara (1,26) istället:

int slumptal = randomare.Next(1, 26);

Permalänk
Medlem

@Oh Geesus: Gällande hur han borde göra så kan man tycka att en smart lösning är just en smart lösning. Fast i det här fallet så är det inte en smart lösning med while eftersom han då inte gör det som uppgiften kräver. Kravet är att han ska "backa" och sedan skriva över och inte kontrollera innan.

Permalänk
Skrivet av ToddTheOdd:

@Oh Geesus: Gällande hur han borde göra så kan man tycka att en smart lösning är just en smart lösning. Fast i det här fallet så är det inte en smart lösning med while eftersom han då inte gör det som uppgiften kräver. Kravet är att han ska "backa" och sedan skriva över och inte kontrollera innan.

Okej, my bad. Missade att det är ett krav att göra så.

Permalänk
Medlem
Skrivet av Oh Geesus:

Istället för att krångla till det så borde en enkel while-sats i for-loopen räcka:

for (int i = 0; i < tal.Length; i++) { int gissadeTal = int.Parse(Console.ReadLine()); // läser in och omvandlar användarens tal while (gissadeTal < 1 || gissadeTal > 25) //Så länge det inmatade talet är lägre än noll (här ska det stå "ett" btw) eller över 25 { Console.WriteLine("värdet måste vara mellan 1 och 25 "); gissadeTal = int.Parse(Console.ReadLine()); //For-loopen går inte vidare förrän användaren har matat in ett giltigt heltal } }

Du bör också veta att Random-metodens maxvärde är exkluderande medan minvärdet är inkluderande. Just nu genererar din "randomare" aldrig talet 25, därför ska det vara (1,26) istället:

int slumptal = randomare.Next(1, 26);

Tack för Randomare tipset.

Permalänk
Medlem

@sbozic:

Är det någon som faktiskt vet hur man backar ett steg i en array tills villkoret blir sant?

Alltså – för varje varv som for-loopen itererar så kommer värdet på variabeln som styr förändring att öka med ett (1). Men om vi skriver in ett ”olämpligt” värde så kommer värdet att minska med ett (1) i koden inuti loopen.

Permalänk
Medlem

@sbozic:

Flera stycken, inklusive jag, har skrivit detta flera gånger.

För att öka värdet på din variabeln som styr förändring så körs i++ i slutet av varje for-loop.

for(int i =0; i<25;i++) //Här har vi en variabel, i, som styr förändringen i ditt fall. loopen ska köras medan i är mindre än 25. och i++ varje varv.

Så, om någonting blir tokigt vill vi inte att variabeln i ska få ett högre värde när nästa varv av loopen startar. För att göra detta MINSKAR vi värdet på variabeln i, som styr förändringen, när någonting går fel.

i--;

Där du tycker att det är lämpligt.

Alltså:

for(int i =0; i<Tal.length;i++) // i har värdet 0 { MATA IN EN SIFFRA if(siffran vi matade in här ovanför inte är mellan 0-25) //Här sker alltså magin, { skriv ut att dom matade in fel tal i--; //minska i med 1, i har alltså nu värdet -1 } else { Spara talet vi matade in här ovanför i din array(vektor) //Här är värdet på i fortfarande 0 } }

Efter for-loopen kört ett varv kan två saker ha hänt:

  • Efter for-loopen har variabeln i värdet -1 om vi matat in fel tal. den ökar med 1 och vi får då värdet 0 igen. detta innebär att vi är tillbaks på samma plats i arrayen som vi startade på.

  • Efter for-loopen har variabeln i värdet 0 om vi matat in rätt tal. den ökar med 1 och vi får då värdet 1 istället. Detta innebär att vi gått vidare till nästa plats i arrayen.

Visa signatur

Outtröttlig, löpartokig besserwisser!

Bli vegan! För djuren, planeten, hälsan och våra barns skull!

Permalänk
Avstängd

Nisse har ju redan givit dig svaret.

Permalänk
Medlem
Skrivet av NisseG91:

@sbozic:

Flera stycken, inklusive jag, har skrivit detta flera gånger.

För att öka värdet på din variabeln som styr förändring så körs i++ i slutet av varje for-loop.

for(int i =0; i<25;i++) //Här har vi en variabel, i, som styr förändringen i ditt fall. loopen ska köras medan i är mindre än 25. och i++ varje varv.

Så, om någonting blir tokigt vill vi inte att variabeln i ska få ett högre värde när nästa varv av loopen startar. För att göra detta MINSKAR vi värdet på variabeln i, som styr förändringen, när någonting går fel.

i--;

Där du tycker att det är lämpligt.

Alltså:

for(int i =0; i<Tal.length;i++) // i har värdet 0 { MATA IN EN SIFFRA if(siffran vi matade in här ovanför inte är mellan 0-25) //Här sker alltså magin, { skriv ut att dom matade in fel tal i--; //minska i med 1, i har alltså nu värdet -1 } else { Spara talet vi matade in här ovanför i din array(vektor) //Här är värdet på i fortfarande 0 } }

Efter for-loopen kört ett varv kan två saker ha hänt:

  • Efter for-loopen har variabeln i värdet -1 om vi matat in fel tal. den ökar med 1 och vi får då värdet 0 igen. detta innebär att vi är tillbaks på samma plats i arrayen som vi startade på.

  • Efter for-loopen har variabeln i värdet 0 om vi matat in rätt tal. den ökar med 1 och vi får då värdet 1 istället. Detta innebär att vi gått vidare till nästa plats i arrayen.

Hej NisseG91!

Jag har hela tiden trott att jag gjort som du säger men jag har uppenbarligen missat något gång på gång. Som det ser ut nu så har jag lyckats och jag har alla er här att tacka för det. Ska nu kolla igenom koden igen för att se vart jag gjort fel. För i min värd så har jag gjort som du skriver men uppenbarligen inte. Tusen tack!