|
[ panterloki @ 07.05.2013. 11:00 ] @
| Pokusavam da napravim program u c# 2010 64bit, koji resava trougao i odredjuje sve parametre trougla kao sto su povrsina, obim, visina...
E sad mi se javlja problem da za svaki textbox gde pretvaram vrednosi u double dolazi do greske kad je textbox prazan, pa dodelim vrednosti na samom pocetku programa svakom textbox-u vrednost nula,
medjutim ne bi trebalo nikakve vrednosti da ima textbox, pogotovo ne nula, jer bi trebalo da postavljam neke uslove za dalje resavanje gde naravno parametri trougla ne smeju imati vrednost nula gde to ima smisla,
pa mi je palo napamet da ako je textbox prazan on uopste ne radi transformaciju iz stringa u double, kroz if naredbu, medjutim posle ne mogu da koristim te iste varijable/promenljive van if/else naredbe.
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
at.Text = bt.Text = ct.Text = Ot.Text = Pt.Text = rt.Text = Rto.Text = hat.Text = hbt.Text = hct.Text= usta.Text = ustb.Text = ustg.Text= "0" ;
}
private void Trougao_Click(object sender, EventArgs e)
{
}
private void Resitrougao_Click(object sender, EventArgs e)
{
if ((string.IsNullOrEmpty(at.Text)) & (string.IsNullOrEmpty(bt.Text)) & (string.IsNullOrEmpty(ct.Text)) & (string.IsNullOrEmpty(Ot.Text)) & (string.IsNullOrEmpty(rt.Text)) & (string.IsNullOrEmpty(Pt.Text)) & (string.IsNullOrEmpty(hat.Text)) & (string.IsNullOrEmpty(hbt.Text) & string.IsNullOrEmpty(hct.Text) & string.IsNullOrEmpty(Rto.Text) & string.IsNullOrEmpty(usta.Text) & string.IsNullOrEmpty(ustb.Text) & string.IsNullOrEmpty(ustg.Text)))
{
}
else
{
double at1 = double.Parse(at.Text);
double bt1 = double.Parse(bt.Text);
double ct1 = double.Parse(ct.Text);
double Ot1 = double.Parse(Ot.Text);
double Pt1 = double.Parse(Pt.Text);
double rt1 = double.Parse(rt.Text);
double Rto1 = double.Parse(Rto.Text);
double hat1 = double.Parse(hat.Text);
double hbt1 = double.Parse(hbt.Text);
double hc1 = double.Parse(hct.Text);
double usta1 = double.Parse(usta.Text);
double ustb1 = double.Parse(ustb.Text);
double ustg1 = double.Parse(ustg.Text);
}
if ((at1 == 0) || (bt1 == 0) || (ct1 == 0))
{
}
else
{
Ot1 = at1 + bt1 + ct1;
}
double p = Ot1 / 2;
Pt1 = Math.Sqrt(p * (p - at1) * (p - bt1) * (p - ct1));
at.Text = at1.ToString();
bt.Text = bt1.ToString();
ct.Text = ct1.ToString();
rt.Text = rt1.ToString();
Rto.Text = Rto1.ToString();
hat.Text = hat1.ToString();
hbt.Text = hbt1.ToString();
hct.Text = hct1.ToString();
usta.Text = usta1.ToString();
ustb.Text = ustb1.ToString();
ustg.Text = ustg1.ToString();
Ot.Text = Ot1.ToString();
Pt.Text = Pt1.ToString();
}
private void at_TextChanged(object sender, EventArgs e)
{
}
}
}
i u desription dobijem ovo:
Error 1 The name 'at1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 49 18 Planimetrija
Error 5 The name 'at1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 54 23 Planimetrija
Error 10 The name 'at1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 57 38 Planimetrija
Error 13 The name 'at1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 58 23 Planimetrija
Error 2 The name 'bt1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 49 32 Planimetrija
Error 6 The name 'bt1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 54 29 Planimetrija
Error 11 The name 'bt1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 57 50 Planimetrija
Error 14 The name 'bt1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 59 23 Planimetrija
Error 3 The name 'ct1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 49 46 Planimetrija
Error 7 The name 'ct1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 54 35 Planimetrija
Error 12 The name 'ct1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 57 62 Planimetrija
Error 15 The name 'ct1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 60 23 Planimetrija
Error 18 The name 'hat1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 63 24 Planimetrija
Error 19 The name 'hbt1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 64 24 Planimetrija
Error 20 The name 'hct1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 65 24 Planimetrija
Error 4 The name 'Ot1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 54 17 Planimetrija
Error 8 The name 'Ot1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 56 24 Planimetrija
Error 24 The name 'Ot1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 69 23 Planimetrija
Error 9 The name 'Pt1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 57 13 Planimetrija
Error 25 The name 'Pt1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 70 23 Planimetrija
Error 16 The name 'rt1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 61 23 Planimetrija
Error 17 The name 'Rto1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 62 24 Planimetrija
Error 21 The name 'usta1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 66 25 Planimetrija
Error 22 The name 'ustb1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 67 25 Planimetrija
Error 23 The name 'ustg1' does not exist in the current context C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 68 25 Planimetrija
A ako stavim ovu drugu if/else naredbu da bude deo prve else naredbe funkcionise, medjutim ako ne dodelim vrednost svakom textboxu kao sto sam to uradio da na pocetku programa radi,
ali mi posle te dodeljene vrednosti za 0 smetaju jer parametri trougla ne bi smeli da budu 0 :D. Da li neko ima ikakvu ideju, kako da resim ovaj problem, hvala unapred.
|
[ Mihajlo Cvetanović @ 07.05.2013. 11:22 ] @
Kako tačno želiš da se kod ponaša? Opiši svojim rečima. Ovaj kod dole rešava samo deo problema (možda), ali tek kad znam kako tačno kod treba da radi mogu da znam kako treba da izgleda.
Code: private void Resitrougao_Click(object sender, EventArgs e)
{
double at1;
double bt1;
double ct1;
double Ot1;
double Pt1;
double rt1;
double Rto1;
double hat1;
double hbt1;
double hc1;
double usta1;
double ustb1;
double ustg1;
double.TryParse(at.Text, out at1);
double.TryParse(bt.Text, out bt1);
double.TryParse(ct.Text, out ct1);
double.TryParse(Ot.Text, out Ot1);
double.TryParse(Pt.Text, out Pt1);
double.TryParse(rt.Text, out rt1);
double.TryParse(Rto.Text, out Rto1);
double.TryParse(hat.Text, out hat1);
double.TryParse(hbt.Text, out hbt1);
double.TryParse(hct.Text, out hc1);
double.TryParse(usta.Text, out usta1);
double.TryParse(ustb.Text, out ustb1);
double.TryParse(ustg.Text, out ustg1);
// Ostatak koda je isti. Ono što se nije parsiralo dobilo je vrednost 0. Ako ikad poželiš da
// razlikuješ vrednost 0 i za uspešno i za neuspešno parsiranje onda moraš da proveravaš
// povratnu vrednost funkcije TryParse.
// ...
}
[ panterloki @ 07.05.2013. 11:56 ] @
Svi textbox-ovi treba da budu prazni pri pokretanju programa, kada unesem vrednosti koje zelim program treba prvo da proveri da li sve vrednosti odgovaraju jedna drugoj, tj. da se proveri da li je moguce postojanje takvog trougla, dalje kad se pritisne dugme onda se rese svi ostali parametri trougla u zavisnosti od toga da li ima dovoljno podataka. Problem je bio u tome da ako textbox nema vrednost automatski me izbacuje iz programa zato sto kad if/else naredba proba da pretvori prazan string u double dolazi do greske.
Znaci hocu da kad kliknem da se resi trougao da iako su textbox-ovi prazni, na osnovu unesenih parametara ili rese ostali parametri ili da izadje messagebox koji ce da kaze da takav trougao ne postoji ili nije moguce resiti sve parametre na osnovu datih informacija, sad sam probao kod sljaka, hvala covece.
[ Mihajlo Cvetanović @ 07.05.2013. 12:20 ] @
U tvom kodu nedostaju message boxovi koje spominješ. Njima je mesto u if blokovima koji su kod tebe trenutno prazni. Na kraju if blokova koji prikazuju grešku stavi return, da se ne bi izvršavao ostatak koda.
[ panterloki @ 07.05.2013. 23:08 ] @
Code: if ((double.TryParse(at.Text, out at1) is double) & (double.TryParse(bt.Text, out bt1) is double) & (double.TryParse(ct.Text, out ct1) is double))
goto sss;
if ((double.TryParse(at.Text, out at1) is double) & (double.TryParse(bt.Text, out bt1) is double) & (double.TryParse(usta.Text, out usta1) is double))
goto ssu;
sss:
if ((at1 <= 0) || (bt1 <= 0) || (ct1 <= 0) || ((at1 + bt1 <= ct1) || (at1 + ct1 <= bt1) || (ct1 + bt1 <= at1)))
{
MessageBox.Show("Postojanje trougla sa unesenim vrednostima nije moguce");
goto kraj;
}
else
{
Ot1 = at1 + bt1 + ct1;
double p = Ot1 / 2;
Pt1 = Math.Sqrt(p * (p - at1) * (p - bt1) * (p - ct1));
rt1 = Pt1 * 2 / Ot1;
Rto1 = at1 * bt1 * ct1 / 4 / Pt1;
hat1 = 2 * Pt1 / at1;
hbt1 = 2 * Pt1 / bt1;
hct1 = 2 * Pt1 / ct1;
usta1 = Math.Acos((ct1 * ct1 + bt1 * bt1 - at1 * at1) / (2 * ct1 * bt1)) / Math.PI * 180;
ustb1 = Math.Acos((ct1 * ct1 + at1 * at1 - bt1 * bt1) / (2 * ct1 * at1)) / Math.PI * 180;
ustg1 = Math.Acos((at1 * at1 + bt1 * bt1 - ct1 * ct1) / (2 * at1 * bt1)) / Math.PI * 180;
goto kraj;
}
ssu:
{
ustb1 = Math.Asin(Math.Sin(usta1 * Math.PI / 180) * bt1 / at1) / Math.PI * 180;
ustg1 = 180 - ustb1 - usta1;
ct1 = at1 * Math.Sin(usta1 * Math.PI / 180) / Math.Sin(ustb1 * Math.PI / 180);
goto sss;
}
kraj:
ja se izvinjavam ako preterujem, ali mi slabo ide, pa cu cesto da potrazim pomoc.
ovaj kod bi trebao da radi sledece (za sad je odradjeno samo za unesene sve stranice trougla i [sss] i dve stranice i to a i b i ugao alfa [ssu]);
Za unese vrednosti stranica kod odredju sve ostale parametre trougla i to funkcionise, proverava da li je uneseni string tipa double tj da li je realan broj,
a kasnije i da li je pozivtivan i veci od nule, kao i to da li je moguce postojanje trougla sa stranicama unetih vrednosti i to funksionise.Dalje
Za unese vrednosti stranica a i b i ugla alfa treba prvo da odredi ugao beta zatim ugao gama pa stranicu c, nakon cega se vraca na pocetnu petlju,
gde proverava da li je moguce da postoji takav trougao i ako postoji resava ostale parametre, ali se ne desava to vec izalzi messagebox da postojanje
tog trougla nije moguce, proverio sam i ne bi trebalo da je greska u matematici. Ja mislim da je greska verovatno u pocetnim uslovima sto bi najvise imalo smisla i ako je tako
kako da se to otkloni?
Izvinjavam se zbog napinjanja.
Mozda bi bilo najbolje da mi neko da link gde mogu da nadjem knjigu za C# pa da se mucim sam, Hvala unapred.
[ panterloki @ 07.05.2013. 23:42 ] @
problem je bio i u uslovima i u matematici, ispravio sam ih
ali sad dolazi do novog problema
Code: private void Resitrougao_Click(object sender, EventArgs e)
{
double at1;
double bt1;
double ct1;
double Ot1;
double Pt1;
double rt1;
double Rto1;
double hat1;
double hbt1;
double hct1;
double usta1;
double ustb1;
double ustg1;
double.TryParse(at.Text, out at1);
double.TryParse(bt.Text, out bt1);
double.TryParse(ct.Text, out ct1);
double.TryParse(Ot.Text, out Ot1);
double.TryParse(Pt.Text, out Pt1);
double.TryParse(rt.Text, out rt1);
double.TryParse(Rto.Text, out Rto1);
double.TryParse(hat.Text, out hat1);
double.TryParse(hbt.Text, out hbt1);
double.TryParse(hct.Text, out hct1);
double.TryParse(usta.Text, out usta1);
double.TryParse(ustb.Text, out ustb1);
double.TryParse(ustg.Text, out ustg1);
bool k0 = double.TryParse(at.Text, out at1);
bool k1= double.TryParse(bt.Text, out bt1);
bool k2= double.TryParse(ct.Text, out ct1);
bool k3= double.TryParse(usta.Text, out usta1);
bool k4 = double.TryParse(ustb.Text, out ustb1);
bool k5 = double.TryParse(ustg.Text, out ustg1);
bool k6 = double.TryParse(hat.Text, out hat1);
bool k7 = double.TryParse(hbt.Text, out hbt1);
bool k8 = double.TryParse(hct.Text, out hct1);
bool k9 = double.TryParse(Ot.Text, out Ot1);
bool k10 = double.TryParse(Pt.Text, out Pt1);
bool k11 = double.TryParse(rt.Text, out rt1);
bool k12 = double.TryParse(Rto.Text, out Rto1);
if (k0=k1=k2)
goto sss;
if (k0=k1=k3)
goto ssu;
if (k1=k2=k3)
goto ssu1;
sss:
if ((at1 <= 0) || (bt1 <= 0) || (ct1 <= 0) || ((at1 + bt1 <= ct1) || (at1 + ct1 <= bt1) || (ct1 + bt1 <= at1)))
{
MessageBox.Show("Postojanje trougla sa unesenim vrednostima nije moguce");
goto kraj;
}
else
{
Ot1 = at1 + bt1 + ct1;
double p = Ot1 / 2;
Pt1 = Math.Sqrt(p * (p - at1) * (p - bt1) * (p - ct1));
rt1 = Pt1 * 2 / Ot1;
Rto1 = at1 * bt1 * ct1 / 4 / Pt1;
hat1 = 2 * Pt1 / at1;
hbt1 = 2 * Pt1 / bt1;
hct1 = 2 * Pt1 / ct1;
usta1 = Math.Acos((ct1 * ct1 + bt1 * bt1 - at1 * at1) / (2 * ct1 * bt1)) / Math.PI * 180;
ustb1 = Math.Acos((ct1 * ct1 + at1 * at1 - bt1 * bt1) / (2 * ct1 * at1)) / Math.PI * 180;
ustg1 = Math.Acos((at1 * at1 + bt1 * bt1 - ct1 * ct1) / (2 * at1 * bt1)) / Math.PI * 180;
goto kraj;
}
ssu1:
{
at1 = Math.Sqrt(ct1 * ct1 + bt1 * bt1 - 2 * ct1 * bt1 * Math.Cos(usta1 * Math.PI / 180));
ustb1 = Math.Asin(Math.Sin(usta1 * Math.PI / 180) * bt1 / at1) / Math.PI * 180;
ustg1 = 180 - ustb1 - usta1;
goto sss;
}
ssu:
{
ustb1 = Math.Asin(Math.Sin(usta1 * Math.PI / 180) * bt1 / at1) / Math.PI * 180;
ustg1 = 180 - ustb1 - usta1;
ct1 = at1 * Math.Sin(ustg1 * Math.PI / 180) / Math.Sin(usta1 * Math.PI / 180);
goto sss;
}
kraj:
at.Text = at1.ToString();
bt.Text = bt1.ToString();
ct.Text = ct1.ToString();
rt.Text = rt1.ToString();
Rto.Text = Rto1.ToString();
hat.Text = hat1.ToString();
hbt.Text = hbt1.ToString();
hct.Text = hct1.ToString();
usta.Text = usta1.ToString();
ustb.Text = ustb1.ToString();
ustg.Text = ustg1.ToString();
Ot.Text = Ot1.ToString();
Pt.Text = Pt1.ToString();
kod unosenja stranica b i c i ugla alfa izbacuje mi resenje postojanje trougla nije moguce. (ssu1)>(sss)
[Ovu poruku je menjao panterloki dana 08.05.2013. u 08:14 GMT+1]
[ Mihajlo Cvetanović @ 08.05.2013. 09:45 ] @
Pogrešno ti je ovo if (k0=k1=k2) (i ostalo slično). Visual Studio ti je verovatno daje neko upozorenje, ali ga ignorišeš. Šta ti je bio cilj s ovom proverom? Pretpostavljam da je ispravno if (k0 && k1 && k2). Takođe, umesto & treba da koristiš &&. Oba rade sličnu, ali ne potpuno istu, radnju, i bolje ti je da se odmah navikavaš na ono što radi ceo svet.
Takođe, ne valja ti rabota sa ovim silnim goto. Umesto da izvršenje programa skače unaokolo stavi unutar if bloka ono što važi za taj if blok. U tvom slučaju deo koda koji počinje kod sss se uvek izvršava, i zato taj deo koda treba da stoji posle ostalih delova. Tako ti ne treba goto. Elegantnije bi bilo da taj glavni deo koda stoji u posebnoj funkciji, ali to bi podrazumevalo još neke dodatne komplikacije, pa je možda bolje to ostaviti za kasnije.
[ Mihajlo Cvetanović @ 08.05.2013. 09:52 ] @
Takođe, ako ti program radi nešto pogrešno i želiš da ti neko pomogne onda moraš da navedeš šta je input, šta je očekivani output, i šta je konkretni output. Ti si naveo samo ovo treće (postojanje trougla nije moguće), ali neophodno je i prvo i drugo.
[ panterloki @ 08.05.2013. 11:42 ] @
Citat: Mihajlo Cvetanović:
Pogrešno ti je ovo if (k0=k1=k2) (i ostalo slično). Visual Studio ti je verovatno daje neko upozorenje, ali ga ignorišeš. Šta ti je bio cilj s ovom proverom?
Cilj je bio da ako su k0, k1 i k2 = true tj, imaju realnu vrednost da se kod izvirsava.
A sta znaci ovo if (k0 && k1 && k2)?
I da li mozete neku knjigu, skriptu, neki on line kurs ili slicno vezano za c# da mi prosledite, jer sam pokusavao da nadjem nesto ali slaba vajda, i sta mislite da li bi trebalo da se bavim programiranjem ili ne,
cini mi se da mi ne ide bas, mada hteo bi da to znam?
[ AMD guy @ 08.05.2013. 19:12 ] @
Sta radi && imas ovde
http://msdn.microsoft.com/en-us/library/2a723cdk(v=vs.110).aspx
A to da li treba da se bavis programiranjem zavisi od tebe i tvoje posvecenosti i strpljenja.
A za C# knjigu, ova nije losa
http://www.shopmania.rs/knjige...ak-po-korak-john-sharp-1137764
[ panterloki @ 08.05.2013. 20:10 ] @
Jel garantujes za tu knjigu, jer planiram da je kupim, ako je dobra?
[ AMD guy @ 08.05.2013. 22:53 ] @
Kakvu garanciju trazis?
Knjiga jeste dobra, ali je samo jedna knjiga, procitaj sto je vise moguce knjiga na ovu temu.
[ panterloki @ 09.05.2013. 09:53 ] @
Pa mislio sam da mi potvrdis, ako si je procitao da sa sigornoscu znam da je vredi kupiti.
Nego, opet nesto ne stima... Code: if (m1 && m2)
{
Om1 = nm1 * am1;
goto o;
}
if (m1 && m3)
{
am1 = Om1 / nm1;
goto o;
}
o:
{
ums1 = (nm1 - 2) * 180 / nm1;
bdm1 = nm1 * (nm1 - 3) / 2;
Pm1 = nm1 * am1 * am1 * (Math.Cos(ums1/2)/Math.Sin(ums1/2)) / 4;
rm1 = 2 * Pm1 / (nm1 * am1);
Rom1 = Math.Sqrt(2 * Pm1 / nm1 / Math.Sin(ums1));
}
Za unesene vrednosti nm1=3 i am1=neko x uporno mi za Pm1 izabcuje negativnu vrednost sto mi se cini nemogucim jer nm1 je pozitivan
am1 je pozitivan kada se nadje ums1 kotangens ugla je pozitivn tj. u ovom slucaju ctg od 30 i podeljeno sa 4 kako to moze da da negativnu vrednost???
[ mish_ns @ 09.05.2013. 12:29 ] @
Pozdrav...
Stavis lepo breakpoint na ulazu u f-ju...
Ideš na Add watch i gledaš vrednosti promenljivh...
Onda pokreneš kod...i udariš F8 ili F7 kad dođeš do breakpointa...
[ mish_ns @ 09.05.2013. 12:47 ] @
Eh da...koliko se sećam, ove funkcije Sin Cos, prihvataju parametar koji pretstavlja ugao u radijanima!!!
Ti verovatno prosledjuješ stepene, pa te to buni...
Da bi konvertovao stepene u radijane koristi formulu:
Ugao radijani = (Ugao° * Pi ) / 180°
Code:
Dim ugao As Double = stepeni * Math.PI / 180.0
Dim sinus As Double = Math.Sin(ugao)
[ panterloki @ 09.05.2013. 15:45 ] @
Hvala, mogao sam i sam da se setim toga koristio sam ga u ranijim primerima, cak sam i deo koda gde ih koristim postavio ovde u temi
[ panterloki @ 09.05.2013. 16:43 ] @
Da li postoji nacin da se odredi koji je textbox selektovan?
Kako ja to zamisljam sad da postoji :
string p = SelectedTextBox();
i sad vrsim operacije nad tim stringom... U mom slucaju p= p+ "√";
[ mish_ns @ 10.05.2013. 06:10 ] @
Za to imaš Focus event...
ovo je jedan od načina:
Code:
Private Sub TextBox_Focus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.Enter, TextBox2.Enter
Dim selTextBox As TextBox = sender
If selTextBox.Equals(TextBox1) Then
//selektovan 1 text box
ElseIf selTextBox.Equals(TextBox2) Then
//selektovan 2 text box
End If
End Sub
[ panterloki @ 10.05.2013. 07:03 ] @
Probao sam svasta i sa Focused, Selected, GotFocus,CanFocus, ContainsFocus i cini mi se da nista ne funkcionise, tj. ne znam sintaksu za to, a kod koji se ostavi ne razumem ni malo, da li je to za c# i kako da ga primenim
ne znam sta je sta u kodu i cemu sluzi, ako moze malo objasnje?
[ mish_ns @ 10.05.2013. 07:10 ] @
Ovo je kod za Visual Basic...
Definisana je funkcija koja rukuje događajima za TextBox1 i TextBox2 (....Handles TextBox1.Enter...)
Sa If naredbom određuješ koji je textbox ustvari selektovan...
Ako nije problem da objasniš tačno zašto ti treba to?
[ panterloki @ 10.05.2013. 07:15 ] @
Hocu mogucnost da se u textbox ubaci kvadratni koren kao simbol i neki broj naravno i da se proverava ako textbox sadrzi kvadratni koren da ga on preko metode math i jos nekih kodova pretvori u double i onda da vrsi operacije nad njim, pa sam probao da implementiram kod, ali ga nisam razumeo, a i bilo mi je pomalo cudna sintaksa.
[ mish_ns @ 10.05.2013. 08:03 ] @
ja bih to ovako:
Code:
If InStr(1, TextBox1.Text, "√") > 0 Then
Label1.Text = Math.Sqrt(TextBox1.Text.Substring(1, TextBox1.Text.Length - 1))
End If
Ovde je opet VB.
Proverava se da li textbox sadži simbol kvadratnog korena, ako sadrži
primenjuje se funkcija Sqrt na podkorenom broju.
Npr. Ukucaš √3 u text box...
Proverava se da li postoji simbol korena,
ovaj deo 'TextBox1.Text.Substring(1, TextBox1.Text.Length - 1)' eliminiše simbol korena i prosleđuje se samo broj
SQrt funkciji, i na kraju ispisuje kao text neke labele....
[ panterloki @ 10.05.2013. 11:38 ] @
Nema sanse da se snadjem, sve zivo sam probao, i vrsljao po netu, probao sam i sa tim gde je kursor bio poslednji put da se tu upisuje, ali slaba vajda, da li neko moze da predlozi neko resenje?
Code: private void sqrtt_Click(object sender, EventArgs e)
{
if (at.Focused)
{
at.Text = at.Text + "√";
at.Select();
System.Windows.Forms.SendKeys.Send("{RIGHT}");
}
if (bt.Focused)
{
bt.Text = bt.Text + "√";
bt.Select();
System.Windows.Forms.SendKeys.Send("{RIGHT}");
}
if (ct.Focused)
{
ct.Text = ct.Text + "√";
ct.Select();
System.Windows.Forms.SendKeys.Send("{RIGHT}");
}
Nista se ne desava kada kliknem na dugme, a kad umesto TextBox.Focused napisem TextBox.Focused == false onda funkcionise, ali ne onako kako bi zeleo jer ubacuje "√" u svaki TextBox.
[ Mihajlo Cvetanović @ 10.05.2013. 11:47 ] @
Umesto simbola za koren može da se koristi stepenovanje. Kvadratni koren je x 1/2, kubni koren je x 1/3. Korisnik može da koristi kapicu ( caret) kao simbol stepenovanja, 2^3=8, 9^(1/2)=3.
Druga opcija je da se koriste funkcije. Standardno se funkcija za kvadratni koren zove sqrt, pa bi u text boxu korisnik mogao da ukuca sqrt(9) i dobije 3.
[ plague @ 10.05.2013. 11:56 ] @
Nisam pratio temu od pocetka, ali ovo iznad ti ne radi jer kada kliknes na pretpostavljam dugme za korenovanje, u tom trenutku nijedan textbox ti nije u fokusu. Ono sto je u fokusu je to dugme za koje si klinuo.
Probaj da resis to tako sto ces u klasi napraviti privatno polje private TextBox lastFocusedTextBox = null; koje ce biti referenca ka zadnjem TextBoxu koji je bio u fokusu.
Obradi event GotFocus za svaki textbox koji ce raditi: lastFocusedTextBox = sender as TextBox;
Zatim u metodi:
Code (csharp):
private void sqrtt_Click(object sender, EventArgs e)
{
if (lastFocusedTextBox != null)
{
lastFocusedTextBox.Text += "√";
lastFocusedTextBox.Select();
System.Windows.Forms.SendKeys.Send("{RIGHT}");
}
}
[ Mihajlo Cvetanović @ 10.05.2013. 12:17 ] @
Ja bih maksimalno izbegavao ovo SendKeys. Ako je cilj pomeriti kurzor na kraj textboxa onda postoje drugi načini. U WinForms projektu koristi se SelectionStart property, a u WPF projektu koristi se Select funkcija (sa drugim parametrom jednakim nuli).
[ panterloki @ 10.05.2013. 14:03 ] @
Ne bih znao kako se obradjuje event, ako moze neko da obajsni.
[ plague @ 10.05.2013. 14:51 ] @
Znas sta je samo ni ne znas da znas. :]
Elem, obraditi event znaci vezati handler funkciju za njega.
Ti si to u programu bar jednom uradio kada si napisao funkciju private void sqrtt_Click(object sender, EventArgs e) { ... }
Ono sto se desilo je da se za event Click vezala funkcija pod nazivom sqrtt_Click.
Vezivanje mozes uraditi rucno ili preko dizajnera.
Kada selektujes kontrolu u Properties nadji nesto ovakvo:
Samo nadji GotFocus u listi i klikni 2x na prazno polje desno. Visual Studio ce automatski napraviti funkciju i vezati je za event.
To uradi za sve TextBox-ove za koje zelis da imaju mogucnost da upisu onaj koren znak u njih.
Kada budes imao te prazne handler funkcije u svakoj napisi:
Code (csharp):
lastFocusedTextBox = sender as TextBox;
Realno sve to mozes uz pomoc jednog handler-a, ali da te ne bunimo.
[ panterloki @ 10.05.2013. 18:53 ] @
Ne postoji GotFocus Event, ali sam sredio i puno vam hvala, ako dodje do jos kojih problema i zastoja javljam se, ako boze zdravlje zavrsim program do 15,16,17 Zamolio bih vas da ga istestirate.
[ panterloki @ 11.05.2013. 22:56 ] @
Code: double am1;
double am2;
double am3;
double.TryParse(am.Text, out am1);
int i ;
int kas = am.TextLength;
for (i = 0; i < kas; i++)
{
while (char.IsDigit(am.Text[i]))
{
double.TryParse(am.Text, out am2);
}
if (am.Text[i] == '√')
{
double.TryParse(am.Text, out am3);
am1 = am2 * Math.Sqrt(am3);
}
}
Kod mi izbacuje gresku:
Error 1 Use of unassigned local variable 'am2' C:\Users\Panterloki\Desktop\Planimetrija\Planimetrija\Form1.cs 283 27 Planimetrija
Zelim da ako se unese koren u textbox i string bude oblika n√t da se izracuna priblizna decimalna vrednost tog unesenog izraza.
Ne znam da li bi kod to radio cak i da nema ove greske.
Moze li pomoc?
[ panterloki @ 11.05.2013. 23:23 ] @
Code: double cu1;
double am1;
double am2;
double am3;
double.TryParse(am.Text, out am1);
int i = 0;
int qd;
int qs;
string cv = "";
string cc = "";
string cc1 = "";
int kas = am.TextLength;
for (i = 0; i < kas; i++)
{
if (am.Text[i] == '√')
{
qd=i-1;
qs = i + 1;
int k;
int s;
for (k=0;k<=qd;k++)
{
cv= cv + am.Text[k];
}
for (s = at.TextLength; s >= qs; s--)
{
cc = cc + am.Text[s];
}
for (int r = cc.Length - 1; r >= 0; r--)
{
cc1 += cc[i];
}
}
}
double.TryParse(cv, out am2);
double.TryParse(cc1, out am3);
am1 = am2 * Math.Sqrt(am3);
Probao sam i ovako ali za bilo koji input za textbox oblika n√t izlzi mi 0 umesto n*Math.Sqrt(t);
[ Mihajlo Cvetanović @ 12.05.2013. 22:42 ] @
Malo mi je kasno da se mentalno naprežem, pa imam samo savet opšteg tipa. Debaguj kod korak po korak (umesto trčanja sa F5 ideš korak po korak sa F10 i F11). Ako tokom debagovanja u nekom trenutku stanje programa nije onakvo kakvo očekuješ da bude u tom trenutku onda je tu negde i problem.
[ panterloki @ 13.05.2013. 09:20 ] @
Gde gledam sta se dasava se programom, kako pokrecem do odredjenog dela?
U svakom slucaju imam drugo resenje, ali ne znam kako da preko foreach petlje to resim.
Code: string s = am.Text;
string[] sr = s.Split('√');
foreach (string word in sr)
{
am2 = Convert.ToDouble(sr);
am1 = am2 * am2;
}
Kako da dodelim vise vrednosti jednoj promenljivoj, pa da onda koristim i prvu, drugu, n-tu vrednost za obradu?
Ili nesto drugo da uradim?
[ Mihajlo Cvetanović @ 13.05.2013. 09:47 ] @
Ne znam šta ovde želiš da postigneš, a istovremeno ne znam šta je krajnji cilj aplikacije, pa ne mogu da odgovorim. Daj mi primer nekog komplikovanijeg inputa i šta program treba da uradi s tim inputom.
Što se tiče debagovanja, iskoristi breakpointe da bi se debager zaustavio na konkretnom mestu u kodu (pozicioniraj kurzor na mesto u kodu i onda F9). Da bi video šta se dešava sa programom moraš da posmatraš promenljive koje su deo programa (promenljive koje si ti tu uveo). Kad pokreneš debager otvore ti se nove kartice imena Auto i Locals, i tu vidiš vrednosti raznih promenljivih, ali vidiš vrednosti samo kad se debager zaustavi u nekom delu koda.
[ mish_ns @ 13.05.2013. 09:57 ] @
Citat: Zelim da ako se unese koren u textbox i string bude oblika n√t da se izracuna priblizna decimalna vrednost tog unesenog izraza.
Ovo je napisao čovek...to bi značilo da kada ti uneseš recimo:
5√3 u programu treba da prevedeš u 5*Math.Sqrt(3)
Tako sam ja razumeo...
[ Mihajlo Cvetanović @ 13.05.2013. 10:25 ] @
Taj primer nije dovoljno komplikovan. Da li su sledeći inputi dozvoljeni, i šta je njihov rezultat:
√
√3
√-3
√*3
√√3
5*√3
5+√3
√3*5
√(3*5)
√5+√3
√(5+√3)
[ panterloki @ 13.05.2013. 10:30 ] @
Citat: mish_ns:
Citat: Zelim da ako se unese koren u textbox i string bude oblika n√t da se izracuna priblizna decimalna vrednost tog unesenog izraza.
Ovo je napisao čovek...to bi značilo da kada ti uneseš recimo:
5√3 u programu treba da prevedeš u 5*Math.Sqrt(3)
Tako sam ja razumeo...
Upravo tako, Program je o planimetriji, resava trougao, cetvorouga, i pravilan mnogougao i mogu da se unose vrednosti samo oblika n√t gde su n i t elementi skupa prirodnih brojeva.
[ panterloki @ 13.05.2013. 10:34 ] @
[ Mihajlo Cvetanović @ 13.05.2013. 10:44 ] @
Ako je to jedini dozvoljeni input, to jest ako mora da postoji simbol √ i moraju da postoje brojevi pre i posle simbola onda bi ovaj kod mogao da bude rešenje:
Code:
string[] params = am.Split('√');
if (params.Count != 2)
throw new Exception("U izrazu mora da postoji simbol '√'");
if (params[0].Length == 0 || params[1].Length == 0)
throw new Exception("Moraju da postoje brojevi levo i desno od simbola '√'");
double n, t;
if (!Double.TryParse(params[0], out n))
throw new Exception("Tekst levo od simbola '√' nije broj");
if (!Double.TryParse(params[1], out t))
throw new Exception("Tekst desnoo od simbola '√' nije broj");
double result = n * Math.Sqrt(t);
Plašim se samo da n√t nije jedini dozvoljeni input. Zato sam i postavio pitanje šta je sve dozvoljeni input.
[ mish_ns @ 13.05.2013. 10:44 ] @
Code:
Dim index, duzina As Integer
Dim s1, s2, rez As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
index = TextBox1.Text.IndexOf("√") 'vraća index simbola
duzina = TextBox1.Text.Length 'vraća dužinu stringa tj. br. karaktera upisanog izraza
s1 = TextBox1.Text.Substring(0, index) 'brojevi do simbola npr 5√3 - vraća 5
s2 = TextBox1.Text.Substring(index + 1, duzina - index - 1) 'brojevi od simbola √ - vraća 3
rez = s1 * Math.Sqrt(s2) ' rezultat 5*Math.Sqrt(3)
Label1.Text = rez ' ispis rezultata na formi
End Sub
meni se ovo čini najlakšim rešenjem...koristio sam VB pošto C# nemam...
Ali vrlo lako možeš prevesti iz VB u C#...
[ panterloki @ 13.05.2013. 10:49 ] @
Mihajlo dobro ste zapazili moja greska, uvek razmisljam kao da sam jos u matematici pa kad je recimo √5 to je isto sto i 1√5, izvinjavam se. Znaci sad programerski:
Input moze da bude oblika n, n√t i √t gde su n i t prirodni brojevi.
[ Mihajlo Cvetanović @ 13.05.2013. 11:05 ] @
Onda ovako nekako:
Code: if (am.Length == 0)
throw new Exception("Izraz je prazan");
string[] params = am.Split('√');
if (params.Count > 2)
throw new Exception("U izrazu mora da postoji samo jedan simbol '√'");
double n, t, result;
if (params[0].Length == 0)
n = 1; // Podrazumevana vrednost za mnozenje
else if (!Double.TryParse(params[0], out n))
throw new Exception("Tekst levo od simbola '√' nije broj");
if (params.Count == 1)
{
result = n;
}
else
{
if (params[1].Length == 0)
throw new Exception("Mora da postoji broj desno od simbola '√'");
if (!Double.TryParse(params[1], out t))
throw new Exception("Tekst desno od simbola '√' nije broj");
result = n * Math.Sqrt(t);
}
[ panterloki @ 14.05.2013. 15:32 ] @
Hvala na pomoci, trebalo je malo premodifikovati kod. Tek sad sam shvatio kad sam sracunao koliko uslova treba da postoji koliko ce ovaj program da bude predugacak... Sracunao sam da pored svega sto je do sada izpisano , a to je oko 700 linija koda da cu morati da pisem jos, bar 8000 - 8500 linija koda da bi program bio gotov, da li su programi inace toliko dugacki, i sta mi predlazete da radim jer ne znam da licu imati vremena da zavrsim sve to ni do 6.juna kad mi je i maturski iz programiranja?
[ Mihajlo Cvetanović @ 14.05.2013. 15:53 ] @
Ne znam dovoljno o tome šta sve program treba da radi, pa ne mogu da ti dam neki konkretan savet, ali 8000 linija koda nije bog zna kako mnogo (mada bi lepše bilo da se razbije u nekakve funkcionalne celine, možda čak i klase, koje bi stajale u različitim fajlovima).
Ako već vidiš da nećeš završiti projekat do zadatog roka, i ako rok ne može da se pomera, onda redefiniši projekat i smanji posao, tako da manji projekat može da se završi do roka.
Uzgred, ovaj deo koda kao input ima promenljivu am, a kao output promenljivu result. Ako taj deo koda treba da se primenjuje i za neke druge promenljive onda treba da stoji kao posebna funkcija, koja će se pozivati gde god da je to potrebno.
Code: double Calculate(string am)
{
// Onaj prethodno ispisani kod
// ...
return result;
}
Kad god dođeš u situaciju da ti se duplira kod taj kod premesti u posebnu funkciju. U tom slučaju količina koda koju treba da napišeš postaje manja.
[ panterloki @ 14.05.2013. 16:37 ] @
Hvala na dosadasnjim savetima i pomoci svima. Samo jos nesto i nadam se da necu vise dosadjivati.
Imam problem oko delova programa gde se nepoznata ne moze odrediti analiticki, vec samo graficki ili numericki, a ja jos uvek nemam dovoljno znanje matematike za tako nesto, pogotovo da tako nesto implementiram u program, sta sa tim delovima programa da radim?
[Ovu poruku je menjao panterloki dana 14.05.2013. u 17:50 GMT+1]
[ Mihajlo Cvetanović @ 14.05.2013. 16:57 ] @
Najjednostavnije je da pitaš profesora (ili nekog drugog) da ti pomogne sa matematičkim delom. Pretpostavljam da matematičko rešenje ipak postoji.
Ako matematičko rešenje ne postoji, možda postoji računarsko rešenje. Možda ako ti je data vrednost rešenja unapred možeš da verifikuješ da li je data vrednost ispravna. Možda čak program može da proceni koliko je neka vrednost blizu tačnom rešenju. Ako je verifikacija rešenja moguća, i ako je moguće utvrditi koliko je bilo koja vrednost bliska tačnom rešenju, onda program može da proveri opseg mogućih vrednosti, i pronađe ono koje je najbliže tačnom rešenju.
[ Mihajlo Cvetanović @ 14.05.2013. 17:10 ] @
Čitao sam temu od početka, pa se sad nešto mislim, mora da postoji matematičko rešenje. Računaš podatke o trouglu, a ne nekakve defirencijale i numeričku analizu. Sa trouglovima trebalo bi sve da bude prilično prosto. Piši šta te muči, pa ti možda neko i pomogne. U najgorem slučaju bar ćeš lepo uobličiti problem s kojim ćeš izaći pred profesora (da njega pitaš).
[ panterloki @ 14.05.2013. 18:11 ] @
Zapravo je rec o pravilnom mnogouglu, u svakom slucaju imam sam da izvucem podatke iz sledeceg x*ctg(pi/x)=k , gde je k elemnt R^+; Kako odavde odrediti x? isao sam na WolphramAlpha pitao sam i ovde na forumu Nedeljko mi je rekao da moze numericki, sto sam i video na Wolphram-u ali tek kad se ubaci neka konkretna vrednost inace, numericki se odrede po 5-6 resenja jednacine.
[ Mihajlo Cvetanović @ 15.05.2013. 09:11 ] @
Ne mogu da ti pomognem, prvo jer ima premalo informacija, a drugo jer ni u školi nisam baš mario za trigonometriju. Primetio bih, kao laik, da mi je čudno da promenljiva x učestvuje u jednačini na dva mesta, i kao da na ta dva mesta ima različite dimenzije (i dužinu i ugao).
[ Mihajlo Cvetanović @ 15.05.2013. 09:59 ] @
Bacio sam pogled na članak na Vikipediji, čini se da ovom jednačinom želiš da izračunaš stranicu pravilnog mnogougla ako je poznata površina. Mnogougao se u suštini sastoji od N trouglova, pa se računanje stranice mnogougla svodi na računanje stranica jednakostraničnog trougla ako znaš površinu (koju imaš jer je N puta manja od površine mnogougla), i uglove (koje isto imaš jer je jedan od njih 2pi/N, a druga dva su pi*(N-1)/N).
Za računanje stranica trougla vidi http://answers.yahoo.com/question/index?qid=20101123164632AAiGZTT
[ panterloki @ 15.05.2013. 11:02 ] @
Pravilni mnogougao je onaj cije su sve stranice i uglovi jednaki, to ne znaci da su trouglovi od kojih je taj mnogougao sacinjen jednakostranicni, jer da jesu lako bi se setio, a ovde ja imam poznato koliko je stranica mnogougla i povrsina.
P(MNOGUGLA)=n*a*r(poluprecnik upisane kruznice)/2;
r=a/2*tg(cu(centrlni ugao mnogougla)/2);
cu=2*pi/n;
[ Mihajlo Cvetanović @ 15.05.2013. 11:34 ] @
Moraju da budu jednakokraki trouglovi sa zajedničkim temenom u centru mnogougla. Probaj da nacrtaš pravilni mnogougao koji nije sačinjen od istovetnih jednakokrakih (pardon, nisu jednakostranični nego jednakokraki) trouglova i videćeš da je to nemoguće. Pogrešno sam napisao gore "jednakostranični", ali sam naveo da se sva tri ugla znaju, i da druga dva imaju istu vrednost. Sve što je napisano u mom prethodnom postu i dalje važi.
[ plague @ 15.05.2013. 12:19 ] @
Ako ti trebaju stranice njih mozes dobiti preko formule:
gde je povrsina malog torugla koju dobijas preko zadate povrsine mnogougla i broja stranica(jednakokrakih trouglova), a je ugao trougla u centru mnogougla koji takodje znas jer znas broj trouglova.
Kada izracunas imaces duzine krakova, dalje mozes da spustis visinu na na stranicu i da preko pravouglog tougla uz pomoc povrsine , , i nove hipotenuze koja je stanica da izracunas sve ostalo.
Uzmi ovo s rezervom, nisam se bavio matematikom neko vreme.
[ panterloki @ 15.05.2013. 13:33 ] @
Znam ja sve to, ali kazem za slucaj gde su mi poznati samo vrednost tj. duzina stranice i povrsina mnogougla, tu mi je nepoznat broj stranica, kao i sve ostalo, a odatle ne mogu da dobijem nista, ja sam sve lepo napisao u prethodnom postu.
[ plague @ 15.05.2013. 13:58 ] @
Citat: a ovde ja imam poznato koliko je stranica mnogougla i povrsina.
"o" me je zbunilo, a mislio si "kolik a je stranica".
Ako dolaze u obzir samo pravilni mnogouglovi, prvo sto mi pada na pamet je da "za svaki" broj stranica od 3 do n probas da izracunas druzinu stranice metodom kojom sam napisao u prethodnom postu. Povecanjem broja stranica, duzina se smanjuje. Uvecavas broj dok ne nadjes poklapanje u cijem slucaju takav mnogougao postoji i videces koji je u pitanju, u slucaju da ne nadjes poklapanje, tj da tvoja zadata stranica postane veca od duzine izracunate za neko , onda takav pravilni mnogougao ne postoji.
Sada, zavisno od toga kako pridjes ovome mozes napisati "efikasniji" ili "manje efikasan" algoritam. Navodnici su tu jer koliko moze biti efikasno ako moras da pogadjas.
Razmislicu jos da li postoji neko bolje resenje.
Edit: Nadjoh ovo:
Citat:
S is the length of any side
N is the number of sides
TAN is the tangent function calculated in degrees
Link
[Ovu poruku je menjao plague dana 15.05.2013. u 15:16 GMT+1]
[ panterloki @ 15.05.2013. 21:51 ] @
Izvinjavam se za zabunu, pa jedino to da proverava za vrednosti n o 3 pa nadalje, pa ako se poklopi super, ako ne nista, medjutim ne znam koliko je to dobro jer se ovde radi o racionalnim brojevima, i nije to toliko precizno koliko covek moze da bude.
[ dusans @ 15.05.2013. 22:39 ] @
Ako i ne dobiješ tačno poklapanje, rezultat će biti bar približan kod pogotka.
Kod promašaja će razlika biti drastična - probaj i videćeš.
[ panterloki @ 20.05.2013. 09:13 ] @
Code:
if (am.Text.Length == 0)
{
goto next;
}
string[] Kam = am.Text.Split('√');
if (Kam.Count() > 2)
{
throw new Exception("U izrazu mora da postoji samo jedan simbol '√'");
}
double n, t;
if (string.IsNullOrEmpty(Kam[0]))
{
n = 1;
if (am.Text.Contains('√'))
{
am1 = n * Math.Sqrt(Double.Parse(Kam[1]));
}
}
else
{
if (!Double.TryParse(Kam[0], out n))
{
throw new Exception("Tekst levo od simbola '√' nije broj");
}
if (Kam.Count() == 1)
{
am1 = n;
}
else
{
if (string.IsNullOrEmpty(Kam[1]))
{
throw new Exception("Mora da postoji broj desno od simbola '√'");
}
if (!Double.TryParse(Kam[1], out t))
{
throw new Exception("Tekst desno od simbola '√' nije broj");
}
am1 = n * Math.Sqrt(Double.Parse(Kam[1]));
}
}
next:
if (Om.Text.Length == 0)
{
goto next1;
}
string[] KOm = Om.Text.Split('√');
if (KOm.Count() > 2)
{
throw new Exception("U izrazu mora da postoji samo jedan simbol '√'");
}
double nO, tO;
if (string.IsNullOrEmpty(KOm[0]))
{
nO = 1;
if (Om.Text.Contains('√'))
{
Om1 = nO * Math.Sqrt(Double.Parse(KOm[1]));
}
}
else
{
if (!Double.TryParse(KOm[0], out nO))
{
throw new Exception("Tekst levo od simbola '√' nije broj");
}
if (KOm.Count() == 1)
{
Om1 = nO;
}
else
{
if (string.IsNullOrEmpty(KOm[1]))
{
throw new Exception("Mora da postoji broj desno od simbola '√'");
}
if (!Double.TryParse(KOm[1], out tO))
{
throw new Exception("Tekst desno od simbola '√' nije broj");
}
Om1 = nO * Math.Sqrt(Double.Parse(KOm[1]));
}
}
next1:
Da li neko moze da mi kaze, zbog cega ne funkcionise deo koda?
Tu gde je promenljiva am, am1 radi savrseno, pretvara string oblika n u n, pretvara string oblika √t u math.sqrt(t), pretvara string oblika n√t u n*math.sqrt(t), ali kad je u pitanju deo koda gde je promenljiva Om, i Om1 funkcionise samo kad se u textbox unese string oblika n i kao rezultat izbacuje n, ali za n√t i √t izbaci da je vrednost nula i ne funkcionise na nacin na koji bi trebao da funkcionise.
[ Mihajlo Cvetanović @ 20.05.2013. 09:32 ] @
Napravi napor da deo koda koji radi računicu prebaciš u posebnu funkciju koja prima argumen string a vraća vrednost double. Onda tu funkciju možeš da pozoveš dva, ili dvesta dva puta, i uvek će da radi na isti način. Već sam ti to spomenuo, ali nisi me tad konstatovao.
Ova dva dela koda izgledaju identično, pa ako je to zaista ono što stoji kod tebe onda je problem na nekom drugom mestu.
[ panterloki @ 20.05.2013. 15:25 ] @
Code:
public double Pretvori (string args)
{
double result;
if (args.Length == 0)
{
result = Double.NaN;
}
string[] Kam = args.Split('√');
if (Kam.Count() > 2)
{
throw new Exception("U izrazu mora da postoji samo jedan simbol '√'");
}
double n, t;
if (string.IsNullOrEmpty(Kam[0]))
{
n = 1;
if (args.Contains('√'))
{
result = n * Math.Sqrt(Double.Parse(Kam[1]));
}
}
else
{
if (!Double.TryParse(Kam[0], out n))
{
throw new Exception("Tekst levo od simbola '√' nije broj");
}
if (Kam.Count() == 1)
{
result = n;
}
else
{
if (string.IsNullOrEmpty(Kam[1]))
{
throw new Exception("Mora da postoji broj desno od simbola '√'");
}
if (!Double.TryParse(Kam[1], out t))
{
throw new Exception("Tekst desno od simbola '√' nije broj");
}
result = n * Math.Sqrt(Double.Parse(Kam[1]));
return result;
}
}
}
private void Resimnogougao_Click(object sender, EventArgs e)
{
double cu1;
double nm1;
double am1;
double Om1;
double Pm1;
double rm1;
double Rom1;
double ums1;
double bdm1;
double.TryParse(nm.Text, out nm1);
double.TryParse(Om.Text, out Om1);
double.TryParse(Pm.Text, out Pm1);
double.TryParse(rm.Text, out rm1);
double.TryParse(Rom.Text, out Rom1);
double.TryParse(ums.Text, out ums1);
double.TryParse(bdm.Text, out bdm1);
double.TryParse(cu.Text, out cu1);
bool m1 = double.TryParse(nm.Text, out nm1);
bool m2 = double.TryParse(am.Text, out am1);
bool m3 = double.TryParse(Om.Text, out Om1);
bool m4 = double.TryParse(Pm.Text, out Pm1);
bool m5 = double.TryParse(rm.Text, out rm1);
bool m6 = double.TryParse(Rom.Text, out Rom1);
bool m7 = double.TryParse(ums.Text, out ums1);
bool m8 = double.TryParse(bdm.Text, out bdm1);
bool m9 = double.TryParse(cu.Text, out cu1);
Pretvori(am.Text);
Pretvori(Om.Text);
Pretvori(Pm.Text);
Pretvori(rm.Text);
Pretvori(Rom.Text);
Pretvori(ums.Text);
Pretvori(bdm.Text);
Pretvori(cu.Text);
if (m1 && m2)
{
Om1 = nm1 * am1;
goto o;
}
if (m1 && m3)
{
am1 = Om1 / nm1;
goto o;
}
if (m1 && m4)
{
cu1 = 360 / nm1;
am1 = Math.Sqrt(2 * Pm1 / nm1 / Math.Sin(cu1 * Math.PI / 180)) * 2 * Math.Sin(cu1 / 2 / 180 * Math.PI);
goto o;
}
if (m1 && m5)
{
cu1 = 360 / nm1;
am1 = rm1 * 2 * Math.Tan(cu1 / 360 * Math.PI);
goto o;
}
if (m1 && m6)
{
cu1 = 360 / nm1;
am1 = Rom1 * 2 * Math.Sin(cu1 / 360 * Math.PI);
goto o;
}
if (m1 && m7)
{
MessageBox.Show("Nema dovoljno podataka za izracunavanje parametara");
goto kr;
}
if (m1 && m8)
{
MessageBox.Show("Nema dovoljno podataka za izracunavanje parametara");
goto kr;
}
if (m1 && m9)
{
MessageBox.Show("Nema dovoljno podataka za izracunavanje parametara");
goto kr;
}
if (m2 && m3)
{
nm1 = Om1 / am1;
goto o;
}
if (m2 && m4)
{
nm1 = 4 * Pm1 / (am1 * am1 * Math.Sqrt(3));
goto o;
}
if (m2 && m5)
{
cu1 = Math.Atan(am1 / (2 * rm1)) / Math.PI * 360;
nm1 = 360 / cu1;
goto o;
}
if (m2 && m6)
{
cu1 = Math.Asin(am1 / (2 * Rom1)) * 360 / Math.PI;
nm1 = 360 / cu1;
goto o;
}
if (m2 && m7)
{
nm1 = 360 / (180 - ums1);
goto o;
}
if (m2 && m8)
{
nm1 = (3 + Math.Sqrt(9 + 8 * bdm1)) / 2;
goto o;
}
if (m2 && m9)
{
nm1 = 360 / cu1;
goto o;
}
if (m3 && m4)
{
MessageBox.Show("Nema dovoljno podataka da se ostale vrednosti odrede analiticki");
goto kr;
}
if (m3 && m5)
{
MessageBox.Show("Nema dovoljno podataka da se ostale vrednosti odrede analiticki");
goto kr;
}
if (m3 && m6)
{
MessageBox.Show("Nema dovoljno podataka da se ostale vrednosti odrede analiticki");
goto kr;
}
if (m3 && m7)
{
nm1 = 360 / (180 - ums1);
am1 = Om1 / nm1;
goto o;
}
if (m3 && m8)
{
nm1 = (3 + Math.Sqrt(9 + 8 * bdm1)) / 2;
am1 = Om1 / nm1;
goto o;
}
if (m3 && m9)
{
nm1 = 360 / cu1;
am1 = Om1 / nm1;
goto o;
}
if (m4 && m5)
{
MessageBox.Show("Nema dovoljno podataka da se ostale vrednosti odrede analiticki");
goto kr;
}
if (m4 && m6)
{
MessageBox.Show("Nema dovoljno podataka da se ostale vrednosti odrede analiticki");
goto kr;
}
if (m4 && m7)
{
nm1 = 360 / (180 - ums1);
am1 = Math.Sqrt(4 * Pm1 / nm1 * Math.Tan(Math.PI / nm1));
goto o;
}
if (m4 && m8)
{
nm1 = (3 + Math.Sqrt(9 + 8 * bdm1)) / 2;
am1 = Math.Sqrt(4 * Pm1 / nm1 * Math.Tan(Math.PI / nm1));
goto o;
}
if (m4 && m9)
{
nm1 = 360 / cu1;
am1 = Math.Sqrt(4 * Pm1 / nm1 * Math.Tan(Math.PI / nm1));
goto o;
}
if (m5 && m6)
{
nm1 = Math.PI / Math.Acos(Rom1 / rm1);
am1 = 2 * Math.Sqrt(Rom1 * Rom1 - rm1 * rm1);
goto o;
}
if (m5 && m7)
{
nm1 = 360 / (180 - ums1);
cu1 = 360 / nm1;
am1 = 2 * rm1 * Math.Tan(cu1 * Math.PI / 360);
goto o;
}
if (m5 && m8)
{
nm1 = (3 + Math.Sqrt(9 + 8 * bdm1)) / 2;
cu1 = 360 / nm1;
am1 = 2 * rm1 * Math.Tan(cu1 * Math.PI / 360);
goto o;
}
if (m5 && m9)
{
am1 = 2 * rm1 * Math.Tan(cu1 * Math.PI / 360);
goto o;
}
if (m6 && m7)
{
nm1 = 360 / (180 - ums1);
cu1 = 360 / nm1;
am1 = 2 * Rom1 * Math.Sin(cu1 * Math.PI / 360);
goto o;
}
if (m6 && m8)
{
nm1 = (3 + Math.Sqrt(9 + 8 * bdm1)) / 2;
cu1 = 360 / nm1;
am1 = 2 * Rom1 * Math.Sin(cu1 * Math.PI / 360);
goto o;
}
if (m6 && m9)
{
am1 = 2 * Rom1 * Math.Sin(cu1 * Math.PI / 360);
goto o;
}
if (m7 && m8)
{
MessageBox.Show("Nema dovoljno podataka za odredjivanje ostalih paremetara mnogougla");
goto kr;
}
if (m7 && m9)
{
MessageBox.Show("Nema dovoljno podataka za odredjivanje ostalih paremetara mnogougla");
goto kr;
}
if (m8 && m9)
{
MessageBox.Show("Nema dovoljno podataka za odredjivanje ostalih paremetara mnogougla");
goto kr;
}
o:
{
cu1 = 360 / nm1;
ums1 = (nm1 - 2) * 180 / nm1;
bdm1 = nm1 * (nm1 - 3) / 2;
Om1 = nm1 * am1;
Rom1 = am1 / (2 * Math.Sin((cu1 * Math.PI / 180) / 2));
rm1 = am1 / (2 * Math.Tan((cu1 * Math.PI / 180) / 2));
Pm1 = nm1 * am1 * rm1 / 2;
}
if ((nm1 % 1 != 0)||(bdm1 % 1 !=0)||(nm1<3))
{
MessageBox.Show("Ne postoji pravilan mnogougao sa unesenim vrednostima");
return;
}
kr:
{
cu.Text = cu1.ToString();
nm.Text = nm1.ToString();
am.Text = am1.ToString();
Om.Text = Om1.ToString();
Pm.Text = Pm1.ToString();
rm.Text = rm1.ToString();
Rom.Text = Rom1.ToString();
ums.Text = ums1.ToString();
bdm.Text = bdm1.ToString();
}
}
Napravio sam funkciju pozivam je ali opet nece da funkcionise na isti nacin kao sto sam i u prethodnom postu napisao, ubacio sam i ostatak koda, da vidite da li je greska mozda u ostatku koda, ali cisto sumljam.
[Ovu poruku je menjao panterloki dana 20.05.2013. u 16:36 GMT+1]
[ Mihajlo Cvetanović @ 20.05.2013. 15:54 ] @
Funkcija Pretvori ima "return result" unutar else grane. Da je u tvom kodu tako Visual Studio bi ti javio grešku prilikom bildovanja (funkcija mora potpuno da bude "pokrivena" sa return, a ova nije ako izvršenjem ne uđe u else granu), i ne bi mogao ni da pokreneš program. Pretpostavljam da je tvoj kod drugačiji od ovog što ovde piše.
Takođe, funkcija Pretvori vraća double, ali prilikom osam pozivanja funkcije ta povratna vrednost se ignoriše i nigde se ne koristi. Pretpostavljam da je cilj ipak da se iskoriste te vrednosti.
Takođe, ako već funkcija Pretvori čita string (recimo am) i pretvara ga u double, onda nema potrebe da se poziva double.TryParse(am.Text, out am1). To sad treba rešiti, i postoji nekoliko načina da se to reši, ali ne znam kako jer ne znam kako si zamislio da ti radi program. Kako program treba da se ponaša ako je tekst am prazan, a kako ako ima nešto što liči na n√t, a kako ako ima nešto što ne liči na n√t? Ti moraš da odgovoriš na ova tri pitanja, i onda će se znati kod koji će da ostvari traženo ponašanje.
Trenutno ako am ima simbol √ onda m2 postane false (jer simbol √ nije deo double broja), am1 postane nula, a svi rezultati poziva funkcija Pretvori se ionako ignorišu.
[ panterloki @ 20.05.2013. 16:57 ] @
Resen problem. Jel treba da se brisu postovi ako niko ne odgovori pre nego sto ja resim ili da ih ostavim da "vise"?
[ AMD guy @ 21.05.2013. 13:39 ] @
Poruke se ne brisu, u slucaju da jos neko zatreba.
Copyright (C) 2001-2024 by www.elitesecurity.org. All rights reserved.
|