Permalänk

C# hjälp sökes!

Hejsan!

Jag har varit frånvarande från skolan i ett antal veckor på grund av en sjukdom, och har då missat mycket av våra programmeringslektioner. Istället för att jag skulle behöva göra om de prov och uppgifter jag har missat gav min lärare mig en uppgift som jag ska lösa tills på fredag. Innan ni slutar läsa, NEJ jag ber er INTE göra mitt skolarbete åt mig, jag vill endast ha några tips och lite hjälp som skulle kunna underlätta uppgiften för mig.

Jag har läst C# nu i en och en halv termin, så jag har grundkunskaper antar jag. Alla tips är välkomna!

Uppgiften En gubbe står på X-axeln i ett koordinatsystem och kastar en granat mot ett förbestämt mål som befinner sig någonstans på X-axeln. För att beräkna var gubben träffar med granaten använder man sig utan en andragradsfunktion (ax^2+bx+c=0), där användaren anger abc-variablerna för att tala om för programmet hur han vill kasta.

Hittills har jag skrivit en pseudokod på hur jag vill att programmet ska fungera:

Kod:

Pseudokod Placera granaten på koordinat 3 (målområde 2, 3, 4) Skriv ut ”Granaten har placerats på en koordinat” Så länge det är miss, loopa nedanstående. Läs in användarens värden på abc Beräkna (ax^2+bx+c=0) Om x = mellan 2 och 4 när y = 0 //Träff på antingen koordinat 2, 3 eller 4 på X-axeln samt 0 på Y-axeln ger träff Skriv ut ”Träff” Annars Skriv ut ”Miss! Försök igen.” Läs in nya koordinater.

Det jag har problem med nu är hur jag ska börja. Har suttit i flera timmar och bara stirrat in i skärmen, utan att komma på något vettigt.

Har ni några bra tips eller förslag på hur jag enklast skriver den här koden?

Alla svar är uppskattade!

MVH

Visa signatur

i5 2500k @ 4.2GHz | Antec Kühler H2O 620 | MSI P67A-GD55 | GTX 570 DCU II | 120GB Intel 320 SSD | WD Caviar Green 1,5TB | 2x8 GB Corsair Dominator 1600Mhz | 750W OCZ | BitFenix Shinobi | Asus VS248H

Permalänk
Medlem

Re: C# hjälp sökes!

Du behöver alltså läsa in 3 värden från användaren, sätta in dessa i en formel och sedan se om resultatet är inom vissa gränser, för att därefter presentera resultatet.

Har du verkligen programmerat i 1.5 termin utan att stöta på en if-sats?

En liten hjälp på vägen:

if ( x > 2 && x < 4 && y == 0) { Console.WriteLine("Träff!"); } else { Console.WriteLine("Miss!"); }

Visa signatur

Medlem i signaturgruppen nyliberala datahakkare med POSIX-kompatibla system.

Permalänk
Hedersmedlem

Lägg upp delproblem. Börja med att programmera de enklaste sakerna. Läsa in variablerna är ju enkelt t ex.

Permalänk
Medlem

Ett sätt att lösa det på

enum Constants { A = 0, B, C }; static void Main(string[] args) { List<double> input = (new[] { 0, 1, 2 }).ToList().ConvertAll(i => double.Parse(Console.ReadLine())); var x = (from n in new[] { 2, 3, 4 } where Math.Abs(input[(int)Constants.A] * n * n + input[(int)Constants.B] * n + input[(int)Constants.C]) < 0.5 select n).FirstOrDefault(); Console.WriteLine(x); var y = new[] { "Miss! Försök igen.", "Träff", "Miss! Försök igen." }[Math.Max(0, x - 2)]; Console.WriteLine(y); if (x != 3) Main(args); }

Eventuellt lägga till ett par write() så man vet vad det är man skriver in!

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Permalänk

Tackar för alla svar!

Förstår faktiskt inte mycket av koden ni har skrivit om jag ska vara ärlig. Detta är lite överkurs från det vi har lärt oss hittills. Har bara läst Programmering A och som sagt inte klar med kursen än. Skrev förövrigt fel i min post, har läst programmering i ett halvår, inte ett och ett halvt år.

Som sagt, tack för alla svar, uppskattas verkligen att ni hjälper till! Jag ska börja skriva koden imorgon och jag postar mina problem i tråden. Jag tror jag vet hur jag ska göra för att läsa in användarens koordinater och, det jag har mest problem med är den matematiska delen. Vet liksom inte hur jag ska få in den i koden, om man säger så..

Men jaja, jag gör ett försök imorgon och postar i tråden om jag behöver hjälp som sagt!

Visa signatur

i5 2500k @ 4.2GHz | Antec Kühler H2O 620 | MSI P67A-GD55 | GTX 570 DCU II | 120GB Intel 320 SSD | WD Caviar Green 1,5TB | 2x8 GB Corsair Dominator 1600Mhz | 750W OCZ | BitFenix Shinobi | Asus VS248H

Permalänk

Okej, jag har börjat skriva lite.

Det jag inte förstår är hur jag ska kunna få in formeln i min kod.. Hur vet jag vad de olika "x-en" är? Skriver man bara ett enkelt "x", eller hur gör man?

Det här är vad jag har såhär långt:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine("Skriv in en koordinat mellan 1 och 5."); string va = Console.ReadLine(); Console.WriteLine("Skriv in en till koordinat mellan 1 och 5."); string vb = Console.ReadLine(); Console.WriteLine("Skriv in den sista variabeln mellan 1 och 5"); string vc = Console.ReadLine(); Console.Write(va * x ^ 2 + vb * x + vc); if (x > 2 && x < 4 && y == 0) { Console.WriteLine("Träff!"); } else { Console.WriteLine("Miss! Försök igen."); } } } }

Hur ser det ut så långt?

Visa signatur

i5 2500k @ 4.2GHz | Antec Kühler H2O 620 | MSI P67A-GD55 | GTX 570 DCU II | 120GB Intel 320 SSD | WD Caviar Green 1,5TB | 2x8 GB Corsair Dominator 1600Mhz | 750W OCZ | BitFenix Shinobi | Asus VS248H

Permalänk
Medlem

Hej!
Då du har "a", "b" och "c" som värden i funktionen (vilket du hämtat från användaren) "ax^2+bx+c=0" innebär det att vi har en ekvation och en okänd (lösbar). För att lösa ut x kan vi använda oss av kvadratkomplettering, men då jag gissar att du har lärt dig PQ-formeln kan du använda den. Du kan använda System.Math.Sqrt() som roten ur.
Sedan har vi ett annat dilemma, du sparar va, vb och vc som string. Då du är på ett nybörjar stadie är det enklast att du bara ändrar dessa till double eller int (double om du vill att användaren skall kunna använda decimal-koordinater och int för heltag). Igentligen ska man felkolla så att inte användaren skriver t.ex. "fem" istället för 5 eller liknande. Detta gör man oftast med en try catch sats. Men då jag gissar att ni inte har gått igenom detta tror jag inte din handledare kräver detta. Men känner du igen try-catch så ska du göra en felkoll.
Glöm inte heller att placera ut en gubbe att träffa

Visa signatur

citera!

Permalänk
Citat:

Ursprungligen inskrivet av Dosshell
Hej!
Då du har "a", "b" och "c" som värden i funktionen (vilket du hämtat från användaren) "ax^2+bx+c=0" innebär det att vi har en ekvation och en okänd (lösbar). För att lösa ut x kan vi använda oss av kvadratkomplettering, men då jag gissar att du har lärt dig PQ-formeln kan du använda den. Du kan använda System.Math.Sqrt() som roten ur.
Sedan har vi ett annat dilemma, du sparar va, vb och vc som string. Då du är på ett nybörjar stadie är det enklast att du bara ändrar dessa till double eller int (double om du vill att användaren skall kunna använda decimal-koordinater och int för heltag). Igentligen ska man felkolla så att inte användaren skriver t.ex. "fem" istället för 5 eller liknande. Detta gör man oftast med en try catch sats. Men då jag gissar att ni inte har gått igenom detta tror jag inte din handledare kräver detta. Men känner du igen try-catch så ska du göra en felkoll.
Glöm inte heller att placera ut en gubbe att träffa

Tackar för svaret!

Ska kolla närmare på det du skrev och försöka mig på det.

Kan jag använda mig utav Convert.ToInt32 för att konvertera strängarna?

Det är just den saken med hur man ska placera ut gubben, hur man ska skapa själva "spelplanen" jag har problem med.

edit: För att använda System.Math.Sqrt() måste talet man anger vara en double va?

Visa signatur

i5 2500k @ 4.2GHz | Antec Kühler H2O 620 | MSI P67A-GD55 | GTX 570 DCU II | 120GB Intel 320 SSD | WD Caviar Green 1,5TB | 2x8 GB Corsair Dominator 1600Mhz | 750W OCZ | BitFenix Shinobi | Asus VS248H

Permalänk
Medlem

System.Math.Sqrt((double)integervariabel)

Vad vi gör är att vi gör om (type casting) en integer-variabel (typ. 2) till en double (typ. 2.000) och slänger in denna i Sqrt(). Tänk på att den returnerar en double också.

Visa signatur

citera!

Permalänk
Medlem

Ska börja med att be om ursäkt för mitt dåliga svar, det är givetvis överkurs och dessutom ett onödigt tillkrånglat sätt jag löste det på. Var bara sugen på att koda lite och tyckte du skulle presentera lite kod själv

För att göra om en sträng till ett tal kan du använda Parse-metoden, men Convert.ToInt32 går oxå bra:

double a = double.Parse(va); int a = int.Parse(va); double a = Convert.ToDouble(va);

Jag tror att det blir enklast för dig om du använder double för alla tal, annars är det lätt att du hamnar i avrundningsfällan (tex 2/3 = 0 om svaret avrundas till ett heltal)

(En liten sidoparantes, Du behöver inte göra cast för att ta roten ur en int, c# kan automatiskt göra upcast från int till double. Dvs Math.Sqrt(integervariabel) är giltig kod.)

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Permalänk

Har fastnat helt. Jag har ingen aning om hur jag ska få in min formel i min kod. Det har tagit helt stopp

Visa signatur

i5 2500k @ 4.2GHz | Antec Kühler H2O 620 | MSI P67A-GD55 | GTX 570 DCU II | 120GB Intel 320 SSD | WD Caviar Green 1,5TB | 2x8 GB Corsair Dominator 1600Mhz | 750W OCZ | BitFenix Shinobi | Asus VS248H

Permalänk
Hedersmedlem

Hej Snabbdullah,

Jag antar att det är beräkningen av x-värdena som är problemet och det är egentligen ett matematiskt problem.

ax^2+bx+c=0 uttrycker en ekvation och jag antar att det inte är av intresse för uppgiften så du kan använda dig av ett verktyg, säg Wolfram Alpha för att ta fram en formel.

Du får då för fallet a != 0 att det finns två möjliga värden för x så att ax^2+bx+c=0,
x1=(-b+Math.Sqrt(b*b-4*a*c))/(2*a)
respektive
x2=(-b-Math.Sqrt(b*b-4*a*c))/(2*a)
Här måste b*b var större än 4*a*c, annars kommer du att få fel i Math.Sqrt().

Om a=0 så har du att bx+c=0 vilket innebär att x=-c/b för att få en lösning. (Wolfram Alpha igen)
Är både a=0 och b=0 så måste c=0 för att ekvationen ska vara lösbar och då är den sann för alla x.

Jag hoppas att det här inte blev alltför rörigt. Programmeringsbiten antar jag att du kan lösa själv. Lycka till

Visa signatur

The variable 'brain' is declared but never used