Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

nyac55

C# - Program Kalkulator w obiektowym z Odwróconą Notacją Polska?

Polecane posty

Ten przykład ma się nijak do Twojego problemu. Proponuję byś wziął jakąś książkę o C# i ją choćby przekartkował.

public partial class Form1 : Form
{
CalculatorCore calculator = new CalculatorCore();

// ...

protected void AddButton_Click(object sender, EventArgs e)
{
calculator.DoSomething();
}
}

Link do komentarza
Udostępnij na innych stronach


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Projekt1_biblioteka_dll;
namespace Projekt1_Windows_Forms
{
public partial class Form1 : Form
{
CalculatorCore calculator = new CalculatorCore(); //tutaj podkreśla mi CalculatorCore
/*Error 4 The type or namespace name 'CalculatorCore' could not be found (are you missing a using directive or an assembly reference?) C:\Users\Patryk\Documents\Visual Studio 2012\Projects\Projekt1_Windows_Forms\Projekt1_Windows_Forms\Form1.cs 16 9 Projekt1_Windows_Forms

*/
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.AppendText("1");
}
private void button2_Click(object sender, EventArgs e)
{
textBox1.AppendText("2");
}
private void button3_Click(object sender, EventArgs e)
{
textBox1.AppendText("3");
}
private void button4_Click(object sender, EventArgs e)
{
textBox1.AppendText("4");
}
private void button5_Click(object sender, EventArgs e)
{
textBox1.AppendText("5");
}
private void button6_Click(object sender, EventArgs e)
{
textBox1.AppendText("6");
}
private void button7_Click(object sender, EventArgs e)
{
textBox1.AppendText("7");
}
private void button8_Click(object sender, EventArgs e)
{
textBox1.AppendText("8");
}
private void button9_Click(object sender, EventArgs e)
{
textBox1.AppendText("9");
}
private void button0_Click(object sender, EventArgs e)
{
textBox1.AppendText("0");
}
private void button19_Click(object sender, EventArgs e)
{
textBox1.AppendText(",");
}
private void button11_Click(object sender, EventArgs e)
{
textBox1.Text = "";
}
private void button12_Click(object sender, EventArgs e)
{
textBox1.AppendText("+");
//pobierz_znak();
pobierz_znak.Add("+");
}
private void button14_Click(object sender, EventArgs e)
{
textBox1.AppendText("-");
pobierz_znak();
}
private void button15_Click(object sender, EventArgs e)
{
textBox1.AppendText("*");
pobierz_znak();
}
private void button16_Click(object sender, EventArgs e)
{
textBox1.AppendText("/");
pobierz_znak();
}
private void Backspace_button_Click(object sender, EventArgs e)
{
int textLength = textBox1.Text.Length;
if (textLength > 0)
textBox1.Text = textBox1.Text.Substring(0, textLength - 1);
}
private void Sign_button_Click(object sender, EventArgs e)
{
int textLength = textBox1.Text.Length;
if (textLength > 0)
if ((textBox1.Text[0]).Equals('-'))
textBox1.Text = textBox1.Text.Substring(1, textLength - 1);
else textBox1.Text = "-" + textBox1.Text;
else textBox1.Text = "-" + textBox1.Text;
}
private void Accept_button_Click(object sender, EventArgs e)
{

}
private void Equal_button_Click(object sender, EventArgs e)
{
switch (sign)
{
case('+'):
textBox1.Text = (variable + Double.Parse(textBox1.Text)).ToString();
break;
case('-'):
textBox1.Text = (liczba - Double.Parse(textBox1.Text)).ToString();
break;
case('*'):
textBox1.Text = (liczba * Double.Parse(textBox1.Text)).ToString();
break;
case('/'):
if (textBox1.TextLength == 1 && textBox1.Text[0].Equals('0'))
{
textBox1.Text = ("Error! Divide by zero!");
}
else
{
textBox1.Text = ((double)liczba / double.Parse(textBox1.Text)).ToString();
}
break;
}
}
}
}

oraz


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Threading.Tasks;
namespace Projekt1_biblioteka_dll
{
public class CalculatorCore
{
void pobierz_znak()
{
znak = textBox1.Text;
}
}

// biblioteka dll

Nie wiem co teraz się dzieje, referencja do biblioteki jest ustawiona dodałem także przestrzeń nazewnictwa, lecz prawdopodobnie nie widzi mi klasy CalculatorCore w dll'ce.

Link do komentarza
Udostępnij na innych stronach

Przestrzeń nazw, nie nazewnictwa.

Using służy do powiedzenia "udostępnij w tym pliku przestrzeń nazw "ABC", a pewnie nie stworzyłeś referencji między projektami. Musisz w projekcie GUI kliknąć prawym na katalog References, wybrać "Add reference" i tam znaleźć musisz swoje dll (być może masz zakładkę "Solution").

Link do komentarza
Udostępnij na innych stronach

Referencja jest. Najpierw stworzyłem bibliotekę skompilowałem ją do pliku dll. Następnie stworzyłem GUI i dodałem referencję. Na koniec, żeby nie przełączać się między 2 plikami dodałem do projektu GUI 2 projekt z biblioteką, by móc szybko uzupełniać kod bez potrzeby wychodzenia z GUI, aby wejść do biblioteki.

_+_+_+_+_

Czy problemem może być w tym wypadku to, że po każdej zmianie należy osobno kompilować bibliotekę z oddzielnego pliku, a nie tak jak jest to teraz z 1 projektu głównego zawierającego projekt z GUI oraz 2 projekt z biblioteką?

Link do komentarza
Udostępnij na innych stronach

Referencja do projektu biblioteka_dll powinna się znajdować w drugim projekcie (Windows_Forms), projekty nie potrzebują referencji do samych siebie.

BTW, strasznie paskudne jest to nowe Visual Studio. Za każdym razem, jak je widzę, to mam wrażenie, że to jakiś program z poprzedniego tysiąclecia.

Link do komentarza
Udostępnij na innych stronach

Przecież już teraz masz dwa projekty w solucji (czy też rozwiązaniu, jak to zostało nazwane w polskiej wersji). I nie bardzo wiem, jak Ci się udało dodać do projektu referencję (odwołanie) do niego samego.

Żeby dodać w projekcie referencję do innego projektu (w Twoim przypadku do projektu Windows_Forms musisz dodać referencję do biblioteka_dll), klikasz PPM na "Odwołania" należące do projektu (Windows_Forms), z menu wybierasz "Dodaj odwołanie", w nowym oknie w zakładce Projekty wybierasz ten inny projekt (biblioteka_dll) i zatwierdzasz.

Żeby natomiast dodać projekt do solucji (czego moim zdaniem nie musisz robić), klikasz na jej ikonę na drzewku (pierwsza od góry) PPM i z menu wybierasz "Dodaj" i dalej "Nowy projekt" albo "Istniejący projekt".

PS samodzielnie tłumaczę z angielskiego, więc być może w rzeczywistości wyrażenia w " " będą się nazywały nieco inaczej.

Link do komentarza
Udostępnij na innych stronach

Żeby dodać w projekcie referencję do innego projektu (w Twoim przypadku do projektu Windows_Forms musisz dodać referencję do biblioteka_dll), klikasz PPM na "Odwołania" należące do projektu (Windows_Forms), z menu wybierasz "Dodaj odwołanie", w nowym oknie w zakładce Projekty wybierasz ten inny projekt (biblioteka_dll) i zatwierdzasz.

Pytałeś jak udało mi się zrobić referencję. Stworzyłem projekt z biblioteką skompilowałem do dll. Dodałem referencję i dodałem projekt do solucji. Natomiast mam jeszcze 1 pytanie: moja referencja odwołuje się do samego pliku w rozszerzeniu dll, czyli do biblioteki. Czy powinna odwoływać się do projektu biblioteki?? Bo teraz nie widzi mi obiektu, tak jak to jest na screenie.

Link do komentarza
Udostępnij na innych stronach

Nie sądziłem, że zrobienie referencji może być takie trudne. Załączam filmik we flashu. Stworzyłem 2 projekty - jeden GUI, a drugi to DLL. Na filmiku jest pokazane, jak należy stworzyć referencję oraz gdzie i jak stworzyć obiekt klasy CalculatorCore.

Jeśli tworzysz sam bibliotekę w ramach tej samej solucji co GUI, to nie dodaje się jej poprzez wskazanie pliku dll. DLL wskazujesz, gdy np. pobrałeś jakieś biblioteki (np SQLite) i potrzebujesz ich użyć w projekcie.

ONPCalculator.zip

Link do komentarza
Udostępnij na innych stronach

Po dodaniu referencji i stworzeniu obiektu, klikasz na obiekt i dodajesz using. U mnie się coś takiego nie wyświetla. Dodatkowo u ciebie podczas tworzenia obiektu było widać przestrzeń nazw, u mnie nie. Chyba coś namieszałem. Teraz gdy po stworzeniu obiektu najechałem na CalculatorCore, by dodać using Były praktycznie 2 opcje Generuj klasę dla 'CalculatorCore' oraz Generuj nowy typ.

_+_+_+_+_

Stworzyłem jeszcze raz projekt skompilowałem do biblioteki dll. Dodałem referencję i obecnie referencja działa, lecz mam błąd typu:

Błąd 1 ?Projekt1_Windows_Forms.Form1.Dispose(bool)?: nie znaleziono odpowiedniej metody do zastąpienia C:\Users\Patryk\Documents\Visual Studio 2012\Projects\Projekt1_Windows_Forms\Projekt1_Windows_Forms\Form1.Designer.cs 14

?? O co chodzi?

Link do komentarza
Udostępnij na innych stronach

Odpaliłem na komputerze stacjonarnym i działa normalnie.

Teraz myślę nad tym jak przekazywać elementy z textBoxa do biblioteki, mam pytanie jak się to robi?


Stack<String> Stos;
void pobierz_znak()
{
//Takie coś umieściłem w bibliotece
//w funkcji chciałem napisać init = textBox1.Text; ,lecz to nie działa. Albo nie widzi mi textBox1 ,albo źle //to robię
//także funkcja pobierz_znak() nie jest widziana w windows forms
}

Proszę o pomoc i sugestie ,ewentualnie jakiś przykład jak wartości z textBoxa powinienem wrzucać do funkcji ,bądź na stos.

_+_+_+_

1.wies.niak mam wielką prośbę czy mógłbyś wytłumaczyć mi w oparciu o przykłady kodu jak mogę przekazywać wartości z textBoxa na stos oraz jak je ściągać ze stosu, by policzyć wynik operacji. Chciałbym zrobić tak, żeby po wpisaniu wartości do textBoxa i naciśnięciu przycisku zatwierdź wartość zmiennej trafiała na szczyt stosu. TO samo dla 2 wartości. Następnie 3 wartość to znak operacji, która też trafia na stos. Po naciśnięciu przycisku '=' Wartości są ściągane ze stosu, sprawdzane jest jaka to operacja np. switch'em ,wykonywana i wypisana do textBoxa. (Wtedy prawdopodobnie na stosie pozostanie tylko wynik operacji).

2.Kolejny pomysł po naciśnięciu znaku operacji przed zatwierdzeniem go, naciśnięcie innego spowoduje zamianę go w textBoxie ,a dopiero zatwierdź wrzuca na stos.

3.Jeżeli mamy wynik obliczony, to musielibyśmy zatwierdzić tylko 1 operand i znak operacji ,a nie dwa itd.

Na początek chciałbym, żebyś mi wyjaśnił 1 fazę, jeśli to nie problem. (chodzi mi np. o jakieś przykłady kodu (jak wrzucać na stos) wraz z wytłumaczeniem).

edit:

Program nie widzi, także:


Stack<String> stos = new Stack<string>();
stos.Push(textBox1.Text);

Error 4 The type or namespace name 'textBox1' could not be found (are you missing a using directive or an assembly reference?) C:\Users\Patryk\Documents\Visual Studio 2012\Projects\Projek1_Biblioteka_dll\Projek1_Biblioteka_dll\Class1.cs 12 19 Projek1_Biblioteka_dll

Error 6 The name 'pobierz_znak' does not exist in the current context C:\Users\Patryk\Documents\Visual Studio 2012\Projects\Projekt1_Windows_Forms\Projekt1_Windows_Forms\Form1.cs 89 13 Projekt1_Windows_Forms

Error 2 Invalid token ')' in class, struct, or interface member declaration C:\Users\Patryk\Documents\Visual Studio 2012\Projects\Projek1_Biblioteka_dll\Projek1_Biblioteka_dll\Class1.cs 12 32 Projek1_Biblioteka_dll

Error 1 Invalid token '(' in class, struct, or interface member declaration C:\Users\Patryk\Documents\Visual Studio 2012\Projects\Projek1_Biblioteka_dll\Projek1_Biblioteka_dll\Class1.cs 12 18 Projek1_Biblioteka_dll

Link do komentarza
Udostępnij na innych stronach

Obecnie chciałem sprawdzić jak działa stos i jak odwoływać się do obiektów. Stworzyłem przykładowy program, lecz chyba źle to robię bo mam błędy. Może mi ktoś powiedzieć jak się powinno to zapisywać?


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Stos.console
{
class Stos
{
Stos obiekt = new Stos();
Stack<String> stos = new Stack<string>();
void stos()
{
stos.Push("opole");
}
static void Main(string[] args)
{
stos.Push(2);
}
}
}

error code:

Error 1 An object reference is required for the non-static field, method, or property 'Stos.console.Stos.stos' c:\users\patryk\documents\visual studio 2012\Projects\Stos1\Stos1\Program.cs 15 13 Stos1

Link do komentarza
Udostępnij na innych stronach

Polecam poczytać komunikaty błędów. Nie możesz w statycznej metodzie odwoływać się do niestatycznego pola.

Stos jest w wewnątrz CalculatorCore, więc nie możesz odwołać się do niego i przekazać textboxa. Zrób to przez metodę, w najprostszej wersji, calculator.Add(textBox1.Text),

Link do komentarza
Udostępnij na innych stronach


CalculatorCore calculator = new CalculatorCore();
....
button..
calculator.Add(textBox1.Text); // To jest w GUI


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ONPCalculator.Core
{
public class CalculatorCore
{
Stack<String> stos = new Stack<string>(); // stos jest w bibliotece

void pobierz_znak()
{
//
}
}
}

Mam błąd i podkreśla Add:

error code:

Error 1 'ONPCalculator.Core.CalculatorCore' does not contain a definition for 'Add' and no extension method 'Add' accepting a first argument of type 'ONPCalculator.Core.CalculatorCore' could be found (are you missing a using directive or an assembly reference?) C:\Users\Patryk\Documents\Visual Studio 2012\Projects\Projekt1_Windows_Forms\Projekt1_Windows_Forms\Form1.cs 89 24 Projekt1_Windows_Forms

Dodałem coś takiego, żeby sprawdzić co się stanie:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ONPCalculator.Core
{
public class CalculatorCore
{
Stack<String> stos = new Stack<string>();
//stos.Add(textBox1.Text);
string init;
void pobierz_znak()
{
stos.Push("lol");
stos.Push("2 mole gazu");
init=stos.Pop();
stos.Peek();
//
}
}
}

Aczkolwiek w GUI mam błąd:


private void buttonPlus_Click(object sender, EventArgs e)
{
textBox1.AppendText("+");
calculator.Add(textBox1.Text); // podkreśla Add
//pobierz_znak();
// calculator.pobierz_znak.Add("+");
}

Link do komentarza
Udostępnij na innych stronach

OK, Stworzyłem coś takiego:


private void buttonPlus_Click(object sender, EventArgs e)
{
textBox1.AppendText("+");
string liczba = textBox1.Text;
calculator.Add(liczba);
//pobierz_znak();
// calculator.pobierz_znak.Add("+");
} // GUI

oraz


Stack<String> stos = new Stack<string>();
//stos.Add(textBox1.Text);
string init;
void Add(string liczba)
{
if (liczba.Equals('+') || liczba.Equals('-') || liczba.Equals('*') || liczba.Equals('/'))
Char.Parse(liczba);
else
Double.Parse(liczba);
}// DLL

Jednak wyrzuca mi błąd:

Error 1 'ONPCalculator.Core.CalculatorCore' does not contain a definition for 'Add' and no extension method 'Add' accepting a first argument of type 'ONPCalculator.Core.CalculatorCore' could be found (are you missing a using directive or an assembly reference?) C:\Users\Patryk\Documents\Visual Studio 2012\Projects\Projekt1_Windows_Forms\Projekt1_Windows_Forms\Form1.cs 90 24 Projekt1_Windows_Forms

Link do komentarza
Udostępnij na innych stronach

Metoda Add nie jest publiczna, stąd też z zewnątrz jest niedostępna.

Po drugie, wykonujesz parsowanie, ale wyniku nigdzie nie zapamiętujesz.

No i kod zyskałby na przejrzystości, gdybyś zamiast wielkiego if'a zastosował switch'a (z wyszczególnionymi operatorami i parsowaniem liczby w default'ie).

Mam jeszcze jedno pytanie: masz w ogóle pomysł na wykonywanie samych obliczeń?

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.

×
×
  • Utwórz nowe...