Inlägg

Inlägg som Zero_Digits har skrivit i forumet
Av Zero_Digits

Tack för tipset! Jag tror dock detta är som ni säger lite överkurs just nu. Jag körde en if sats som bara tillät 10 eller 12 siffror istället. Får duga sålänge. Men kommer absolut komma tillbaka till detta efter mina studier

Förövrigt har jag en till fråga angående att jämföra och söka i strängar. Jag har i min kod en funktion som ska tillåta användaren att söka efter namn. Den simplaste formen är ju att köra en "==" mellan användarens inmatning och det namnet i listan man vill åt. Men då måste namnen vara identiska. Nu har jag hittat metoden "String.Contains()" som söker i en sträng efter den angivna inmatningen. Problemet med String.Contains() är att den är case sensetive. Det blir ganska dumt när man ska söka på carl och det inte funkar för att det ska vara Carl... Min fråga är då ifall det finns någon smidig lösning på detta? String.compare() & String.equals() har jag provat men dom funkar också bara om namnet är exakt samma, alltså det räcker inte bara med förnamn eller efternamn som det hade gjort i string.Contains()

Av Zero_Digits
Skrivet av Pamudas:

Flera bra synpunkter i tråden, men har inte sett någon som kommenterat valet av "long" för personnummer? Int/heltal överlag är väl rätt dumt för ett personnummer... Tänkte då ett tal inte kan börja på 0, vilket innebär att samtliga födda mellan 00 och 09 inte får vara med

Personnummer sparas bättre i en sträng (string) och kan då även formateras lättare med fyra sista siffrorna m.m.
Bara en liten tanke för bättre kod

Ahh spännande. Googlade runt lite och antar att det är "TryParse" man får använda då för att se att strängen innehåller siffror. Vad jag inte kan klura ut just nu är hur man gör ett undantag för "-" om användaren skulle mata in till exempel: 19750416-7587. Har du några tips på bra läsningar om detta?

Av Zero_Digits
Skrivet av Dalton Sleeper:

Jag skummade lite snabbt och fastnade först och främst på stavfel, och många dessutom Det är inte bara koden som skall göra rätt, utan det skall se snyggt och prydligt ut också! Har du inte stavningskontroll i din utvecklingsmiljö?

Ingen stavningskontroll aktiverad verkar det som. Men jag ska kika på detta. Brukar alltid slarva till stavningen när jag bara leker runt i koden. Detta är såklart en dålig vana, tur att detta inte är en inlämningsuppgift Tack för feedback!

Av Zero_Digits
Skrivet av zoomster2:

@Zero_Digits: Kanon!

En annan bonus. För att se skillnad mot foreach(..) vs for(;;)
Vad händer om du matchar 2 personer med samma namn när du söker på namn när det gäller vilket index du får ut?

Hejsan, tack för feedbacken, har vart på 1 vecka semester men är nu tillbaka vid skolbänken. Varför jag använder foreach är på grund av att jag har en lista som jag utgår ifrån och att efter vad jag har lärt mig är foreach smidigare med listor med tanke på att du aldrig kan komma out of bounds. Söker jag på ett namn som matchar med ett annat så får jag ut båda namnen, följt av vardera personnummer och med korrekt index placering enligt vad jag har testat mig till. vad tänkte du?

Skrivet av ZecretW:

Du bör lägga till en "default:" sist i din switch sats och tala om att det alternativet inte är aktivt, om man skriver in ett tal annat än de i menyn.

Dessutom, om man ska hårddra det så bör alla funktioner som manipulerar listan ligga som statiska metoder i klassen och som tar listan som ett "ref" indata argument.

Detta får jag kolla närmare på, tack för tipset

Av Zero_Digits

Koden börjar bli riktigt lång och stökig nu märker jag. Måste jobba på att implementera koden i olika metodrar istället för att ha allt i main metoden. Nåväl. Detta är vad jag lyckades knappa ihop efter parametrarna ni gav mig.

class Program { static void Main(string[] args) { List<PersonDatabas> Databas = new List<PersonDatabas>(); long sökning = 0; while (true) { System.Console.WriteLine("===Person databas==="); System.Console.WriteLine("Ange svarsallternativ"); System.Console.WriteLine("________________________"); System.Console.WriteLine("1: Lägg till person i databasen"); System.Console.WriteLine("2: Sök på ett personnummer"); System.Console.WriteLine("3: Sök på person med namn"); System.Console.WriteLine("4: SKriv ut alla medlemmar i databasen"); int svar = 0; try { svar = System.Convert.ToInt32(System.Console.ReadLine()); } catch { System.Console.WriteLine("Ange enbart siffror enligt menyvalen."); } switch (svar) { case 1: { System.Console.Write("Ange personens namn: "); string namn = System.Console.ReadLine(); System.Console.Write("Ange personens personnummer: "); long personNr = System.Convert.ToInt64(System.Console.ReadLine()); PersonDatabas personDatabas = new PersonDatabas(namn, personNr); Databas.Add(personDatabas); System.Console.WriteLine("Du lade till: " + namn + " med personnummer " + personNr); break; } case 2: { System.Console.Write("Ange personens personnummer: "); try { sökning = System.Convert.ToInt64(System.Console.ReadLine()); } catch { System.Console.WriteLine("Ange endast siffror i personnummer"); continue; } foreach (var element in Databas) { if (sökning == element.personNr) { int index = (Databas.IndexOf(element) + 1); System.Console.WriteLine(index + ": " + element.name + " med person nr " + element.personNr); } else if (sökning != element.personNr) { System.Console.WriteLine("Personen är inte inlaggd"); } break; } if (Databas.Count == 0) { System.Console.WriteLine("Databasen är tom"); } break; } case 3: { System.Console.Write("Ange personens namn: "); string namn = System.Console.ReadLine(); foreach (var person in Databas) { if (string.Compare(namn, person.name, System.StringComparison.OrdinalIgnoreCase) == 0) { int index = (Databas.IndexOf(person) + 1); System.Console.WriteLine(index + ":" + person.name + " med person nr " + person.personNr); } else if (string.Compare(namn, person.name) == -1 || string.Compare(namn, person.name) == 1) { System.Console.WriteLine("Personen är inte inlaggd"); } } if (Databas.Count == 0) { System.Console.WriteLine("Databasen är tom"); } break; } case 4: { System.Console.WriteLine("Skriver ut alla medlemmar: "); int index = 0; foreach (var element in Databas) { index++; System.Console.WriteLine(index + ": " + element.name + ": " + element.personNr); } break; } } } } } class PersonDatabas { public string name; public long personNr; public PersonDatabas(string name, long personNr) { this.name = name; this.personNr = personNr; } }

Av Zero_Digits

@Shimonu: Ojdå! Bättre?

System.Console.Write("Ange personens personnummer: "); long sökning = System.Convert.ToInt64(System.Console.ReadLine()); foreach (var element in Databas) { if (sökning == element.personNr) { int index = (Databas.IndexOf(element) + 1); System.Console.WriteLine(index + ": " + element.name + " med person nr " + element.personNr); } } if (Databas.Count == 0) { System.Console.WriteLine("Databasen är tom"); } else { System.Console.WriteLine("Personen är inte inlaggd"); } break;

Av Zero_Digits

Feedback på min kod (Färdig)

blev precis klar med uppgift 14.1 i arbetsboken om programmering. Tänkte se ifall det var någon som har feedback att ge då jag sitter hemma och knappar helt ensam och vet inte alltid om min kod är så snygg den kan vara.

Uppgifts anvisning: Skapa en klass som hanterar personer med namn och personnummer. Skapa sedan en lista med själp av klassen list. användaren ska i programmet kunna lägga till personer till listan, samt söka på personnummer i listan. När användaren söker ska namnet och index för personern skrivas ut.

class Program { static void Main(string[] args) { List<PersonDatabas> Databas = new List<PersonDatabas>(); while (true) { System.Console.WriteLine("===Person databas==="); System.Console.WriteLine("Ange svars allternativ"); System.Console.WriteLine("________________________"); System.Console.WriteLine("1: Lägg till person i databasen"); System.Console.WriteLine("2: Sök på ett person nummer"); System.Console.WriteLine("3: Sök på person med namn"); System.Console.WriteLine("4: Skriv ut alla medlemmar i databasen"); int svar = System.Convert.ToInt32(System.Console.ReadLine()); switch (svar) { case 1: { System.Console.Write("Ange personens namn: "); string namn = System.Console.ReadLine(); System.Console.Write("Ange personens person nummer:"); long personNr = System.Convert.ToInt64(System.Console.ReadLine()); PersonDatabas personDatabas = new PersonDatabas(namn, personNr); Databas.Add(personDatabas); break; } case 2: { System.Console.Write("Sök på en person med personnummer: "); long sökning = System.Convert.ToInt64(System.Console.ReadLine()); foreach (var element in Databas) { if (sökning == element.personNr) { int index = (Databas.IndexOf(element) + 1); System.Console.WriteLine(index + ": " + element.name + ": " + element.personNr); } else { System.Console.WriteLine("Personen är inte inlaggd"); } } break; } case 3: { System.Console.Write("Ange personens namn: "); string namn = System.Console.ReadLine(); foreach (var person in Databas) { if (string.Compare(namn, person.name) == 0) { System.Console.WriteLine(person.name + ": " + person.personNr); } else { System.Console.WriteLine("Personen är ej inlaggd"); } } break; } case 4: { System.Console.WriteLine("Skriver ut alla medlemmar: "); foreach (var element in Databas) { System.Console.WriteLine(element.name + ": " + element.personNr); } break; } } } } } class PersonDatabas { public string name; public long personNr; public PersonDatabas(string name, long personNr) { this.name = name; this.personNr = personNr; } }

Av Zero_Digits

@BrutalSwede: Tack för feedbacken och ja, det ska jag självklart göra . Är bara helt slut i huvudet efter denna uppgiften, objekt orienterad programmering har verkligen vart mitt största hinder hittils i min 2 månader långa programmerings karriär.. haha

Av Zero_Digits

Löste det med följande metod. Tack för all hjälp. Vet att jag har vart lite besvärlig, tackar för att ni stod ut

case 4: { City min = citys[0]; City max = citys[0]; foreach (var element in citys) { if (element.degrees > min.degrees) { min = element; } if (element.degrees < max.degrees) { max = element; } } System.Console.WriteLine("Kallast är det i " + max.name + ": " + max.degrees + " varmast är det i : " + min.name + ": " + min.degrees); break; } }

Av Zero_Digits

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

case 4: case 4: { int min = int.MinValue; int max = int.MaxValue; string c1; string c2; foreach (var element in citys) { if (element.degrees > min) { min = element.degrees; c1 = element.name; } if (element.degrees < max) { max = element.degrees; c2 = element.name; // Varför kan jag inte ta med mig namnet på detta sättet? } System.Console.WriteLine(); break;

Av Zero_Digits

@perost: Jag håller med fullständigt och tackar för kritiken. Det svåra med programmering för mig är just det du tar upp med vad man hittar på nätet. Studiemedel och lärare hänvisar ofta till att man som programmerare måste lära sig att hitta lösningar på nätet. Samtidigt som att man inte ska sno vad någon annan gjort. I detta fallet hittar jag inte "rätt" lösning isåfall. Eftersom jag inte har en aning om att delegate är föråldrad eller att man ska använda lambda istället. Hur man loopar igenom en foreach loop och håller kvar det lägsta värdet är något jag heller inte vet hur man gör tyvärr. Men det får jag väl bli bättre på att googla mig till

Av Zero_Digits

@Dave1080: Nu lossnade en hel del, tack! Det är ju givet att man måste deklarera till en variabel innan man kan skriva ut det... Har suttit och stirrat på detta sedan klockan 9 imorse..

Av Zero_Digits

@Dave1080: Jag har fått sorteringen att funka nu. Det enda jag behöver nu är ett sätt att skriva ut det första och det sista elementet i listan. Har testat flera olika sätt som "ska" funka. Men konsolen skriver bara ut klass namnen. Vad gör jag för fel?

Jag har testat med: var last = citys[citys.count-1]; för att få ut det sista elementet. Men det skrivs bara ut Väderleken.City

case 4: { citys.Sort(delegate (City c1, City c2) { return c1.degrees.CompareTo(c2.degrees); }); foreach (var element in citys) { System.Console.WriteLine(); } break; }

Av Zero_Digits

Jag fixade case 3 nu. Tack för tipsen, googla har jag gjort hela dagen, men känns som att det finns 1000 olika sätt att göra detta på.
Försökte precis med denna metoden, jag har ingen aning om vad jag håller på med haha... Det funkade inte.

case 4: { citys.Sort(); System.Console.WriteLine("Den kallaste staden är: "+citys.First() +" & den varmaste staden är: "+ citys.Last()); break; }

Av Zero_Digits

C# Objektorienterad programmering och listor

Hej, sitter lite i knipa här med objektorienterad programmering i C#. Har inte riktigt lossnat för mig. Hur går jag tillväga i följande uppgift?
Jag vill interagera med en listas element för att kunna skriva ut alla temperaturer i listan och dela det med antalet element i listan.

Sen måste jag också komma åt det högsta och lägsta temperaturen. Känner mig vilsen. Har kommenterat nedanför där jag har stött på problem.

class Program { static void Main(string[] args) { List<City> citys = new List<City>(); while (true) { System.Console.WriteLine("====VÄDERLEKEN===="); System.Console.WriteLine("1: Ange ny stad "); System.Console.WriteLine("2: Se temperatur för samtliga städer"); System.Console.WriteLine("3: Se medeltemperatur för samtliga städer"); System.Console.WriteLine("4: Se vilken stad som är kallast & vart det är varmast"); int input = System.Convert.ToInt32(System.Console.ReadLine()); switch (input) { case 1: { System.Console.Write("Stadens namn: "); string names = System.Console.ReadLine(); System.Console.Write("Ange temperatur: "); int degrees = System.Convert.ToInt32(System.Console.ReadLine()); City city = new City(names,degrees); citys.Add(city); break; } case 2: { System.Console.WriteLine("Temperatur för samtliga städer är: "); foreach(var item in citys) { System.Console.WriteLine(item.name + ": " + item.degrees); } break; } case 3: { System.Console.Write("Medeltemperatur för samtliga städer är: "); foreach(var item in citys) { System.Console.WriteLine(); //Hur adderar man elementen i en lista? } break; } case 4: { System.Console.WriteLine("Lägst temperatur är det i: " + " Varmast är det i: "); //Hur kommer jag åt listans index? break; } } } } } class City { public string name; public int degrees; public City(string name, int degrees) { this.name = name; this.degrees = degrees; } }

Av Zero_Digits

C# 2D Vektor spel

Kämpar i nuläget med denna uppgift, jag förstår inte varför utskriften blir fel. Koordinaterna som matas in hamnar inte rätt på spelbrädet, och jag kan inte luska ut vart jag har knappat fel. Hjälp snälla!

UPPDATERING: Jag tror det är Y axeln som inte funkar som den ska.

static void Main(string[] args) { int[,] GameBoard = new int[4, 4]; int x; int y; System.Random Position = new System.Random(); GameBoard[Position.Next(4), Position.Next(4)] = 2; while (true) { GameGrid(GameBoard); System.Console.WriteLine("NEW SHOT"); System.Console.Write("INPUT X COORDINATES: "); x = int.Parse(System.Console.ReadLine()); int guessedRow = x-1; System.Console.Write("INPUT Y COORDINATES: "); y = int.Parse(System.Console.ReadLine()); int guessedColumn = y-1; System.Console.WriteLine("____________________"); if(GameBoard[guessedRow,guessedColumn] == 2) { System.Console.WriteLine("You hit the target, congratulations!!"); return; } else { GameBoard[guessedRow,guessedColumn] = 1; //användarens inmatning sätts som variabeln: 1 System.Console.WriteLine("You missed! try again"); } } } //______________________________________________________ static void GameGrid(int[,] grid) { int count = 1; System.Console.WriteLine(" |1|2|3|4|"); for (int y = 0; y < 4; y++) { System.Console.Write("" + count + "|"); for (int x = 0; x < 4; x++) { if(grid[y,x] == 1) //Här sker något fel. Användarens inmatning är 1. Men det blir helt fel placering på spelbrädet { System.Console.Write("* "); } else { System.Console.Write(""); } } System.Console.WriteLine(""); count++; } }

Av Zero_Digits

@FrazzorXx: Jag har inte så mycket kunskap om foreach så ville mest testa vattnet lite och få lite förståelse för hur den funkar. På vilket sätt passar den inte till denna uppgiften?

Av Zero_Digits

Tack för snabbt svar, det är ju solklart nu, stirrat mig blind på vissa deler i koden.

Vad jag försöker göra är att be användaren mata in hur många temperaturer som det ska vara för att sedan ange varje temperaturen i vektorn med hjälp av foreach loopen. Har redan klarat det med for loopen men jag får det inte riktigt att funka med foreach.

For loopen adderar ju hela tiden ett steg i iterationen, men foreach går ju från start till slut. Så hur interagerar jag med foreach loopens index?

Av Zero_Digits

C# Kompileringsfel vid definering av vektor

Console.WriteLine("Ange hur många mätningar som har utförts: "); string input = Console.ReadLine(); double temp = Convert.ToDouble(input); double[] Temperature = new double[temp]; //På denna raden får jag meddelandet "Cant implicitly convert type double to an int" Console.WriteLine("Ange grader i celsius vid varje mätning: ");

Felet försvinner om jag ändrar variabel "temp" till datatypen int. Varför sker detta? bara nyfiken, användarens inmatning i temp ska egentligen vara en int oavsett. Eftersom det är antalet gånger temperaturen har mäts som ska matas in.

Av Zero_Digits

@pv2b: Hej igen! Mycket bra förklarat. Det var lite som @perost var inne på där att C# gav mig ett kompileringsfel när jag skulle returnera double variabeln utan att konvertera den till int först. Hur som helst borde ju C# kunna implicit konvertera talen åt båda hållen i detta fallet då själva metoden enbart tar emot Int typer som ska skickas igenom en ganska basic algoritm utan decimaler inblandat, den borde ju känna av att detta double värdet funkar som en int. Men men. Tack igen!