Program v C#
Prosím o radu s programem v C#. Poradí mi někdo, jak vyřešit kvadratickou rovnici za pomocí příkazů out, true, false(měl by fungovat na tomto principu). Mnohokrát děkuji za pomoc.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Metody
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Zadejte přirozené číslo: ");
int n = System.Int32.Parse(Console.ReadLine());
int soucet = Soucetn(n);
Console.WriteLine("Součeet čísel od 1 do {0} je {1}.",n, soucet);
}
static int Soucetn(int k)
{
int s = 0;
for(int i =1; i<=k; i++)
s+= i;
return s;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Metody
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Zadejte přirozené číslo: ");
int n = System.Int32.Parse(Console.ReadLine());
int soucet = Soucetn(n);
Console.WriteLine("Součeet čísel od 1 do {0} je {1}.",n, soucet);
}
static int Soucetn(int k)
{
int s = 0;
for(int i =1; i<=k; i++)
s+= i;
return s;
Odpovědi
Diskuze
příliš nerozumím vloženému kusu kódu, které s výpočtem kvadratické rovnice nemá příliš společného, ale zkusíme to vzít od začátku: jakým způsobem se počítá kvadratická rovnice? co se musí vypočítat jako první?
Doporučil bych pro začátek zkusit vypočítat vzorovou kvadratickou rovnic na papír a očíslovat si kroky a pak metodou "Rozděl a Panuj" jednotlivé kroky prováděl.
Jak vypadá běžná kvadratická rovnice? jaká čísla se budou zadávat?
běžná kvadratická rovnice vypadá: x2+2x+5=0
Vzorec, podle kterého se kvadratická rovnice počítá je na wikipedii. Bohužel nevím, jak jej přepsat.
Uvedený text není důležitý.
Ještě jednou mockrát děkuji.
Vím, že to možná zní strašně směšně, ale při programování je nejdůležitější rozebrat chování programu krok za krokem, nesnažit se přeskočit hned k výsledku, ale pěkně popořadě. Proto mi sem prosím napiš, co bys udělal jako první. (můžeš normálně slovy, do céčka to napíšem potom)
Rovnice x2+2x+5=0 je kvadratickou rovnicí, ale tuším, že program by měl umět vypočítat všechny kvadratické rovnice, proto je vhodné kvadratické rovnice definovat obecněji. Lze to nějak zobecnit? jak pojmout rovnice 20x2+6x+2=0, 2x2+8x+17=0, 3678x2+289x+2=0 a nekonečně mnoho dalších?
Vzorečku pro výpočet x1 a x2 se nezalekni, nejdřív bych doporučoval rozebrat ten program po částech, on se ten vzoreček může zjednodušit. Pokud Ti dělá potíže přepis vzorce do kódu můžeme se o tom bavit důkladněji.
kvadratická rovnice např. x2-3x-10=0 dosadím do vzorce kvadratické rovnice. Do a se dosadí x2(to je 1), do b -3x(to je -3) a do c -10, tzn.
x jedna, dvě se rovná 3 plus mínus (pod sebou) odmocnina, v ní je
9 mínus 4 krát 1 krát mínus deset, to celé lomeno dvěma, tzn.
3 plus mínus (pod sebou) odmocnina , v ní je 9 plus 40, to celé lomeno dvěma, tzn.
3 plus mínus (pod sebou) lomeno dvěma, vzniknou dva kořeny 5 a - 2
(1. kořen vznikl 3 + 7 : 2 = 5, 2. kořen vznikl 3 - 7 : 2 = -2).
Se srdečným pozdravem a s díky
Lucie
a) zadání kvadratické rovnice
v programu může být napsáno přímo, že a=1; b=-3; c=-10; nebo si může program načíst hodnoty a,b,c načíst z klávesnice... V každém případě bude nutné do proměnných a,b,c dostat správná čísla, protože se v nich počítá i v tom vzorci. (to jsem myslel, když jsem se ptal, jak tuto kvadratickou rovnici zobecnit, protože kvadratická rovnice lze zapsat ve tvaru ax2+bx+c=0).
b) vypočítat kořeny x1 a x2
- výpočet provedeme podle vzorečku viz. wiki - není třeba v tom hledat vědu.
- dalo by se říct, že pro algoritmus je zákeřné znaménko plus/mínus, ale můžeme pro x1 napsat vzoreček s plus a pro x2 napsat vzoreček s mínus.
- přepsat vzoreček do algoritmu by mělo jít dle "základních pravidel" - jak třeba napíšeš v programu některé z následujících (omlouvám se, pokud jsou příklady příliš triviální, ale je vhodné začít s něčím jednodušším):
1) k= l krát m
2) k= l děleno m
3) k= druhá odmocnina z l
4) k= l děleno m krát n - (v jmenovateli je m krát n)
Současné navrhované řešení ještě stále není konečné, ale o tom příště. Spíš mě zarazila poznámka, jak to "řešit" pomocí příkazů "out, true, false", máš k tomu nějaké bližší informace? Domnívám se, že to není pravděpodobné.
out má načíst oba kořeny, true má vypsat kladné kořeny a false je vypíše, když jsou záporné.
Bohužel nevím, jak úlohu správně přepsat, neboť nevím, co je to algoritmus.Pomohl byste?
Moc děkuji.
Přesný význam slova algoritmus můžeš najít na wiki (http://cs.wikipedia.org/wiki/Algoritmus) pro nás, pro zjednodušení bude stačit, že se jedná o přepis do konkrétního programovacího jazyku v našem případě c#.
V přepisování dle základních pravidel jsem měl namysli například
0) k=l plus m
přepíšeme na:
k=l+m;
1) k= l krát m
přepíšeme na:
k=l*m;
Můžeš zkusit přepsat ty následující?
Nemá se vypsat True/False když je DETERMINANT kladný/záporný?
z části mám ten program již hotový. Hlásí mi to však jednu chybu a nemůžu přijít na to, v čem jsem jí udělala. Pokud by bylo možné poslat mi na můj e-mail lucie.havlenova@seznam.cz tvůj, zaslala bych tě program, který jsem napsala. Možná že ty na tu chybu přijdeš.
Děkuji, Lucie
chybu, o které jsem se zmiňovala, se mi podařilo odstranit, ale potřebovala bych, jestli by si se nepokusil to doplnit, aby program vypsal, že rovnice nemá řešení.
Díky moc
Lucie
using System;
using System.Collections.Generic;
using System.Text;
namespace Kvadr_rov
{
class Program
{
static void Main(string[] args)
{
double a = NactiKoeficient("a");
double b = NactiKoeficient("b");
double c = NactiKoeficient("c");
if (a != 0)
{
double koren1, koren2;
int Rovnice = KvadratickaRovnice(a, b, c, out koren1,out koren2);
Reseni(Rovnice, koren1, koren2);
}
else
{
Console.WriteLine("Rovnice nemá řešení.");
}
}
static int KvadratickaRovnice(double a, double b, double c, out double x1, out double x2)
{
double determinant = (b * b) - (4 * a * c);
if (determinant == 0.0)
{
x1 = -b / (2 * a);
x2 = 0.0;
return 0;
}
else if (determinant > 0.0)
{
x1 = (-b + Math.Sqrt(determinant)) / (2 * a);
x2 = (-b - Math.Sqrt(determinant)) / (2 * a);
return 1;
}
else
{
x1 = -b / (2 * a);
x2 = Math.Sqrt(-determinant) / (2 * a);
return 2;
}
}
static void Reseni(int rovnice, double x1, double x2)
{
Console.WriteLine("Rovnice má dva reálné kořeny:");
Console.WriteLine("x1={0:F2}", x1);
Console.WriteLine("x2={0:F2}", x2);
}
static double NactiKoeficient(string koeficient)
{
Console.Write("Zadej {0}: ", koeficient);
return Double.Parse(Console.ReadLine());
}
}
}
Všiml jsem si že pokud a=0, potom "Rovnice nemá řešení." což není pravda, pokud a=0 tak se nejedná o kvadratickou rovnici. - ale i taková rovnice jde vyřešit.
Dále bych doporučil raději používat "diskriminant". Pojem "determinant" souvisí s maticemi a to je trochu jiný typ příkladu.
Kdy rovnice nemá řešení? Budu předpokládat, že máš řešit soustavu v R (reálná čísla). V takovém případě kvadratická rovnice nemá řešení, pokud je diskriminant menší než 0.
(Protože ve vzorečku pro výpočet kořenů se počítá druhá odmocnina z diskriminantu, ale v reálných číslech neleze vypočítat druhou odmocninu ze záporného čísla).
Přidáme tedy někam podmínku, že pokud diskriminant bude menší než 0 tak rovnice nemá řešení. Ale všimni si, že už tu jednu podmínku na diskriminant máš, v současné době má 3 možnosti:
a) if (determinant == 0.0)
b) else if (determinant > 0.0)
c) else
Moje otázka zní, jaké všechny hodnoty diskriminantu (nebo, jak jsi napsala determinant) spadají do možnosti c)?
V takovém případě není třeba kořeny vůbec počítat.
Proč předáváš do této procedury proměnou "rovnice"? jakých hodnot může nabývat?
Za jakých okolností se zavolá proc. Resení? resp. za jakých se nezavolá. (pojmem (ne)zavolá myslím, (ne)spustí). Co to znamená, že se spustí?