Permalänk
Medlem

Använda matematik i c#

Hej.
Tänkte precis skriva PQ formeln i min kod. Men det vill sig inte riktigt.

Formeln vet nog de flesta hur den skrivs i vanliga fall, men hur man skriver det som kod har jag ingen aning om, hur man skriver formler i huvudtaget har jag inte en aning om.

Så lite hjälp skulle uppskattas !

tack!

Permalänk
Medlem
Skrivet av Progrmor:

Hej.
Tänkte precis skriva PQ formeln i min kod. Men det vill sig inte riktigt.

Formeln vet nog de flesta hur den skrivs i vanliga fall, men hur man skriver det som kod har jag ingen aning om, hur man skriver formler i huvudtaget har jag inte en aning om.

Så lite hjälp skulle uppskattas !

tack!

Nu kan jag inte programmera men detta kanske hjälper dig
http://www.codeproject.com/Tips/81541/A-simple-program-to-sol...
annars är det bara att googla!

Visa signatur

OS: MacOS/ Windows 10 Pro 64-bit MB: ASUS-Z97-A CPU: i7 4790k
NÄTAGG: EVGA SUPERNOVA G2
RAM: 32768 MiB GPU: 1070 FTW Chassi: Fractal Design R4
MBP 13" i5 | 256GB | 16GB RAM | MID 2014

Permalänk
Hedersmedlem

Många operatorer (+, -, *, /) fungerar ju som vanligt men mera avancerade hittar man i System.Math. Kvadratroten ur x beräknas till exempel med
System.Math.Sqrt(x);

Permalänk
Medlem

Du säker lösningar till en andragradsekvation, vad är det som är konstigt, roten ut? plus minus?

Visa signatur

Citera om du vill ha svar.

Permalänk
Medlem
Skrivet av muppens:

Du säker lösningar till en andragradsekvation, vad är det som är konstigt, roten ut? plus minus?

Går inte direkt att bara skriva

double pqFormula = -p/2 + (roten ur) (p/2)^2 - q

Permalänk
Medlem

public static void calcPQ() { double x; double p; double q; double pq = p / 2 + System.Math.Sqrt(p / 2) ^ 2 - q; System.Math.Sqrt(x);

skrev detta. Fick error. Hjälp?

Permalänk
Medlem
Skrivet av Progrmor:

public static void calcPQ() { double x; double p; double q; double pq = p / 2 + System.Math.Sqrt(p / 2) ^ 2 - q; System.Math.Sqrt(x);

skrev detta. Fick error. Hjälp?

PQ-formeln är väl ändå

Citat:

x = - p/2 +- sqrt((p/2)^2 - q)

(Andragradsekvation - två lösningar - två beräkningar)

Har inte testat eller kompilerat på något vis, men detta bör fungera

using System; public static void calcPQ() { double x; double p; double q; double x1 = -(p/2) + Math.Sqrt(Math.Pow((p / 2), 2) - q); double x2 = -(p/2) - Math.Sqrt(Math.Pow((p / 2), 2) - q); }

Visa signatur

CPU: Intel i5 2500K @ 4,7GHz Mobo: Asus P8Z68-V
GPU: Asus STRIX 970 RAM: 8GB Corsair Vengence 1600 MHz CL9
PSU: OCZ ModXStream 700W Chassi: NZXT Phantom

Citera så att jag hittar tillbaka!

Permalänk
Medlem
Skrivet av Progrmor:

public static void calcPQ() { double x; double p; double q; double pq = p / 2 + System.Math.Sqrt(p / 2) ^ 2 - q; System.Math.Sqrt(x);

skrev detta. Fick error. Hjälp?

Nu är jag ingen hejare på .NET men är du säker på att du har en reell lösning till talet.

Alltås att det inte är minus under rottecknet beroende på din input

sqrt( (p/2)^2 -q ) säg att p = 2, q = 5 så blir sqrt(-4);

Permalänk
Medlem
Skrivet av csoLs:

PQ-formeln är väl ändå

(Andragradsekvation - två lösningar - två beräkningar)

Har inte testat eller kompilerat på något vis, men detta bör fungera

using System; public static void calcPQ() { double x; double p; double q; double x1 = -(p/2) + Math.Sqrt(Math.Pow((p / 2), 2) - q); double x2 = -(p/2) - Math.Sqrt(Math.Pow((p / 2), 2) - q); }

class Program { public static void calcPQ() { double x; double p; double q; double x1 = +(p / 2) + Math.Sqrt(Math.Pow((p / 2), 2) - q); double x2 = -(p / 2) - Math.Sqrt(Math.Pow((p / 2), 2) - q); }

Skrev detta. Ser bra ut förutom två errors.
x1 raden. Får : "Use of inassigned local variable "p" " och även samma meddelande angående "q".

Dock inget error på x2 raden... hmm wierd?

Permalänk
Medlem
Skrivet av Progrmor:

class Program { public static void calcPQ() { double x; double p; double q; double x1 = +(p / 2) + Math.Sqrt(Math.Pow((p / 2), 2) - q); double x2 = -(p / 2) - Math.Sqrt(Math.Pow((p / 2), 2) - q); }

Skrev detta. Ser bra ut förutom två errors.
x1 raden. Får : "Use of inassigned local variable "p" " och även samma meddelande angående "q".

Dock inget error på x2 raden... hmm wierd?

För det första: Du har gjort fel på x1, det ska vara -(p / 2) även där.

Felmeddelandena får du för att du varken gett p eller q något värde.

Visa signatur

CPU: AMD Phenom II x4 960T @ 3.4Ghz | MB: ASUS M5A78L-M/USB3 | RAM: 8GB (2x4GB) Corsair XMS3 @ 1333Mhz | GPU: ASUS Radeon HD 6870 DirectCU | PSU: Corsair CX500 | Lagring: Intel 330 180GB + WD Caviar Green 640GB

Citera osv osv.

Permalänk
Hedersmedlem
Skrivet av Progrmor:

class Program { public static void calcPQ() { double x; double p; double q; double x1 = +(p / 2) + Math.Sqrt(Math.Pow((p / 2), 2) - q); double x2 = -(p / 2) - Math.Sqrt(Math.Pow((p / 2), 2) - q); }

Skrev detta. Ser bra ut förutom två errors.
x1 raden. Får : "Use of inassigned local variable "p" " och även samma meddelande angående "q".

Dock inget error på x2 raden... hmm wierd?

Du måste ju sätta p och q till något för att få ett svar. Just nu har du bara deklarerat variablerna och det räcker inte.

Visa signatur

Använd gilla för att markera nyttiga inlägg!

Permalänk
Medlem
Skrivet av Xadeious:

För det första: Du har gjort fel på x1, det ska vara -(p / 2) även där.

Felmeddelandena får du för att du varken gett p eller q något värde.

Skrivet av giplet:

Du måste ju sätta p och q till något för att få ett svar. Just nu har du bara deklarerat variablerna och det räcker inte.

Okej, men om jag vill få användarens siffror? Kör jag inte bara:

double pos = -(p / 2) + Math.Sqrt(Math.Pow((p / 2), 2) - q); double neg = -(p / 2) + Math.Sqrt(Math.Pow((p / 2), 2) * q); Console.WriteLine("Type the value of 'p': "); //input p = double.Parse(Console.ReadLine()); Console.WriteLine("Type your value of 'q': "); //input q = double.Parse(Console.ReadLine());

Permalänk
Hedersmedlem
Skrivet av Progrmor:

Okej, men om jag vill få användarens siffror? Kör jag inte bara:

Jodå, men du vill nog fråga efter p först och räkna sedan.

Permalänk
Datavetare

Lite off-topic, men kanske lite intressant att veta för någon...

Angående att rötterna kan bli imaginära, många känner nog inte till att i C99 (och senare) är komplexa tal en av de primitiva typerna, i.e. att räkna med komplexa tal är en egenskap i språket C och inte ett tillägg i form av ett bibliotek som i de flesta andra språk.

Anledningen är tydligen önskemål från Fortran-lägret där man ibland vill byta till C för det är snabbt och har bättre support än Fortran. En trevlig bieffekt av att komplexa tal är en primitiv typ i C är att kompilatorn kan göra en rad extra antaganden och alla beräkningar med komplexa tal utförs därför automatiskt via SSE så att både den reella delen och den imaginära delen beräknas med en enda instruktion (i alla fall om man kompilerar med GCC eller ICC)!

Så här skulle man kunna lösa TS problem i C99

#include <complex.h> #include <stdio.h> #include <stdlib.h> typedef struct roots { double complex _1; double complex _2; } roots_t; roots_t pq(double complex p, double complex q) { roots_t roots = { -p / 2 + csqrt(cpow(p / 2, 2) - q), -p / 2 - csqrt(cpow(p / 2, 2) - q) }; return roots; } const char * cfmt(char *buf, size_t sz, double complex c) { if (cimag(c)) snprintf(buf, sz, "%.2f + %.2fi", creal(c), cimag(c)); else snprintf(buf, sz, "%.2f", creal(c)); return buf; } int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, "Usage: %s <p> <q>\n where x^2 + <p>*x + <q> = 0\n", argv[0]); return EXIT_FAILURE; } double p = strtod(argv[1], NULL); double q = strtod(argv[2], NULL); roots_t roots = pq(p, q); char root_str[20]; printf("%s\n", cfmt(root_str, sizeof root_str, roots._1)); printf("%s\n", cfmt(root_str, sizeof root_str, roots._2)); return EXIT_SUCCESS; }

Dold text
Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Men nu har du blandat ihop PQ-formeln IGEN! Dessutom måste du (självklart) ange värden till p och q INNAN du använder PQ-formeln...

Console.WriteLine("Type the value of 'p': "); //input double p = double.Parse(Console.ReadLine()); Console.WriteLine("Type your value of 'q': "); //input double q = double.Parse(Console.ReadLine()); double pos = -(p / 2) + Math.Sqrt(Math.Pow((p / 2), 2) - q); double pos = -(p / 2) - Math.Sqrt(Math.Pow((p / 2), 2) - q);

Sen om du vill slippa problemet med imaginära tal kan du först kontrollera så att p halva i kvadrat minus q inte blir negativt... Men det kanske är överkurs för din del..(?)

Visa signatur

CPU: Intel i5 2500K @ 4,7GHz Mobo: Asus P8Z68-V
GPU: Asus STRIX 970 RAM: 8GB Corsair Vengence 1600 MHz CL9
PSU: OCZ ModXStream 700W Chassi: NZXT Phantom

Citera så att jag hittar tillbaka!

Permalänk
Medlem
Skrivet av csoLs:

Men nu har du blandat ihop PQ-formeln IGEN! Dessutom måste du (självklart) ange värden till p och q INNAN du använder PQ-formeln...

Console.WriteLine("Type the value of 'p': "); //input double p = double.Parse(Console.ReadLine()); Console.WriteLine("Type your value of 'q': "); //input double q = double.Parse(Console.ReadLine()); double pos = -(p / 2) + Math.Sqrt(Math.Pow((p / 2), 2) - q); double pos = -(p / 2) - Math.Sqrt(Math.Pow((p / 2), 2) - q);

Sen om du vill slippa problemet med imaginära tal kan du först kontrollera så att p halva i kvadrat minus q inte blir negativt... Men det kanske är överkurs för din del..(?)

Ingen anledning till att bli arg väll? Jag har faktiskt nyss opererat bort halsmandlarna så har inte fått sova på 46 timmar snart.. Så ber om ursäkt om jag är ute i dimman med min kodning.

Permalänk
Medlem

Eftersom du gjort en metod för beräkningen, kan du ju lika väl deklarera p och q som parameter till metoden.

Skickades från m.sweclockers.com

Visa signatur

-- FubbHead

Permalänk
Medlem

För komplexa tal i .NET 4/4.5 kan du använda dig av System.Numerics.Complex ( http://msdn.microsoft.com/en-us/library/system.numerics.compl... ).

Permalänk
Medlem

Jag är nybörjare när det gäller programmering. Och förstår inte alla uttryck ni använder. Så ber helt enkelt någon att fixa till denna koden:

namespace conFormula { class Program { public static void calcPQ() { double x; double p; double q; Console.WriteLine("Type the value of 'p': "); //input double p = double.Parse(Console.ReadLine()); Console.WriteLine("Type your value of 'q': "); //input double q = double.Parse(Console.ReadLine()); double pos = -(p / 2) + Math.Sqrt(Math.Pow((p / 2), 2) - q); double pos = -(p / 2) - Math.Sqrt(Math.Pow((p / 2), 2) - q); } public static void Category() { string welcome = "Welcome to my formula programe. "; Console.WriteLine(welcome); } static void Main(string[] args) { Category(); calcPQ(); Console.ReadKey(); } } }

Ger upp mina försök att få till detta ^^ Överlåter det helt till någon annan med mer erfarenhet.
tack!

Permalänk
Skrivet av Progrmor:

Jag är nybörjare när det gäller programmering. Och förstår inte alla uttryck ni använder. Så ber helt enkelt någon att fixa till denna koden:

*KOD*

Ger upp mina försök att få till detta ^^ Överlåter det helt till någon annan med mer erfarenhet.
tack!

public static void calcPQ() { Console.WriteLine("Type the value of 'p': "); //input double p = double.Parse(Console.ReadLine()); Console.WriteLine("Type your value of 'q': "); //input double q = double.Parse(Console.ReadLine()); double x1 = -(p / 2) + Math.Sqrt(Math.Pow((p / 2), 2) - q); double x2 = -(p / 2) - Math.Sqrt(Math.Pow((p / 2), 2) - q); }

Bör funka.

Har lite dåligt samvete för att jag bara postar det såhär, men det som huvudsakligen blir fel är att du deklarerar dina variabler flera gånger.
En variabel deklaration ser ut såhär: double x; Detta kan bara göras en gång i varje scope (område i koden, när en varaibel går ur scope kan du deklarera om den (har jag för mig att det funkar i C# iaf)). När du sedan vill komma åt x gör du bara som vanligt och lämnar ute typen (double). Till exempel x = 2;

Problemet med ovanstående kod är att om Math.Pow((p / 2), 2) - q blir mindre än 0 så kommer Math.Sqrt() ge fel eller något i den stilen, eftersom svaret är ett imaginärt tal (2i exempelvis). Detta kan du lösa på två sätt: kolla om Math.Pow((p / 2), 2) - q blir mindre än noll, och meddela i sådana fall användaren om att det blir ett imaginärt tal. Annars räknar du bara ut det. Alternativt kan du använda datatypen Complex istället, vilken kan hantera imaginära tal. Glöm inte att skriva det till konsollen, svaren alltså.

Någon får gärna rätta mig, har inte ens en C# komplikator till hands.

Permalänk
Medlem
Skrivet av martinrlilja:

public static void calcPQ() { Console.WriteLine("Type the value of 'p': "); //input double p = double.Parse(Console.ReadLine()); Console.WriteLine("Type your value of 'q': "); //input double q = double.Parse(Console.ReadLine()); double x1 = -(p / 2) + Math.Sqrt(Math.Pow((p / 2), 2) - q); double x2 = -(p / 2) - Math.Sqrt(Math.Pow((p / 2), 2) - q); }

Bör funka.

Har lite dåligt samvete för att jag bara postar det såhär, men det som huvudsakligen blir fel är att du deklarerar dina variabler flera gånger.
En variabel deklaration ser ut såhär: double x; Detta kan bara göras en gång i varje scope (område i koden, när en varaibel går ur scope kan du deklarera om den (har jag för mig att det funkar i C# iaf)). När du sedan vill komma åt x gör du bara som vanligt och lämnar ute typen (double). Till exempel x = 2;

Problemet med ovanstående kod är att om Math.Pow((p / 2), 2) - q blir mindre än 0 så kommer Math.Sqrt() ge fel eller något i den stilen, eftersom svaret är ett imaginärt tal (2i exempelvis). Detta kan du lösa på två sätt: kolla om Math.Pow((p / 2), 2) - q blir mindre än noll, och meddela i sådana fall användaren om att det blir ett imaginärt tal. Annars räknar du bara ut det. Alternativt kan du använda datatypen Complex istället, vilken kan hantera imaginära tal. Glöm inte att skriva det till konsollen, svaren alltså.

Någon får gärna rätta mig, har inte ens en C# komplikator till hands.

Äntligen!! tackar.

Jag med komplikator kan berätta att det funkar kanon förutom att den inte printar ut resultatet.

Permalänk
Avstängd
Skrivet av Progrmor:

Äntligen!! tackar.

Jag med komplikator kan berätta att det funkar kanon förutom att den inte printar ut resultatet.

Det ser ut som en skoluppgift så det kanske vore bra om du löste i alla fall något av den själv? En hint är att titta på Console.WriteLine...