Problem z kalkulatorem i wskaźnikami

0

Witam,

dopiero zaczynam swoją przygode z C++, przeczytałem sporo książek dochodząc jednak do granicy programowania zwykłego a obiektowego (nie zacząłem klas)

napisałem pierwszy klakulator, który... no, nie chce się skompilować. Nienawidzę wskaźników, ale specjalnie nieoptymalnie podzieliłem program na funkcje ze wskaźnikami żeby się ich nauczyć. Help please...

PS jeśli to zły dział to przepraszam, przenieście. Nie chce robić spamu, ale też nie kasujcie tego

#include <iostream>
#include <windows.h>

using namespace std;

float *wsk1, *wsk2;

float dodawanie(*wsk1, *wsk2);
float odejmowanie(*wsk1, *wsk2);
float mnozenie(*wsk1, *wsk2);
float dzielenie(*wsk1, *wsk2);
std::string PL(std::string znak);
int inny();

int main()
{
	system("cls");
	cout << PL("Witaj w kalkulatorze :) \n");
	cout << PL("Wybierz operacje na liczbach:\n");
	cout << PL("\t 1. Dodawanie\n");
	cout << PL("\t 2. Odejmowanie\n");
	cout << PL("\t 3. Mnożenie\n");
	cout << PL("\t 4. Dzielenie\n");
	cout << PL("\t 5. Potęgowanie\n");
	cout << PL("\t 6. Pierwiastkowanie\n");
	cout << PL("\t 7. Wyjście\n");
	
    int wybor;
    float Liczba1, Liczba2;
    float m;
    cin >> wybor;
    switch(wybor)
    {
		case 1:
		{
			m = dodawanie(&Liczba1, &Liczba2);
			break;
		}
		case 2:
		{
			m = odejmowanie(&Liczba1, &Liczba2);
			break;
		}
		case 3:
		{
			m = mnozenie(&Liczba1, &Liczba2);
			break;
		}
		case 4:
		{
			m = dzielenie(&Liczba1, &Liczba2);
			break;
		}
		case 5:
		{
			m = potega(&Liczba1, &Liczba2);
			break;
		}
		case 6:
		{
			m = pierwiastek(&Liczba1, &Liczba2);
			break;
		}
		case 7:
		{
			system("cls");
			cout << PL("Kalkulator bY Lisu 2011 ");
			cout << "\u00A9";
			system("pause");
			break;
		}
		default:
		{
			system("cls");
			inny();
			break;
		}
	
    system("pause");
}

int inny()
{
	cout << PL("Nie ma takiej opcji! Prosze wybrać właściwy numer.\n\n");
	cout << PL("Co chcesz teraz zrobić?\n");
	cout << PL("\t1. Chce jeszcze raz! :)\n");
	cout << PL("\t2. Wyjście");
	int klawisz;
	cin >> klawisz;
	if(klaiwsz==2)
		return ((ShellExecute(NULL, NULL, "kalkulator.exe", NULL, NULL, SW_SHOWNORMAL) || 0));
	elseif(klawisz==1)
		close();
	else
	{	
		clrscr();
		inny();
	}
}
	
	
	
float dodawanie(*Liczba1, *Liczba2)
{
	system("cls");
	cout << PL("Dodawanie:");
	cout << PL("\tPodaj pierwszą liczbę (może być ułamek)");
	cin >> *Liczba1;
	cout << PL("\tPodaj drugą liczbę (może być ułamek)");
	cin >> *Liczba2;
	return (*Liczba1+*Liczba2)
}

float odejmowanie(*Liczba1, *Liczba2)
{ return 1.0;
}

float mnozenie(*Liczba1, *Liczba2){
	return 1.0;
	}

float dzielenie(*Liczba1, *Liczba2){return 1.0;}

float potega(*Liczba1, *Liczba2){return 1.0;}

float pierwiastek(*Liczba1, *Liczba2){
	return 1.0;
	}

std::string PL(std::string znak)
{
        for (unsigned i = 0; i < znak.length(); i ++)
        {
                switch(znak[i])
                {
                        case 'ą':
                                znak[i] = static_cast<char>(165);
                        break;

                        case 'ć':
                                znak[i] = static_cast<char>(134);
                        break;

                        case 'ę':
                                znak[i] = static_cast<char>(169);
                        break;

                        case 'ł':
                                znak[i] = static_cast<char>(136);
                        break;

                        case 'ń':
                                znak[i] = static_cast<char>(228);
                        break;

                        case 'ó':
                                znak[i] = static_cast<char>(162);
                        break;

                        case 'ś':
                                znak[i] = static_cast<char>(152);
                        break;

                        case 'ź':
                                znak[i] = static_cast<char>(171);
                        break;

                        case 'ż':
                                znak[i] = static_cast<char>(190);
                        break;

                        case 'Ą':
                                znak[i] = static_cast<char>(164);
                        break;

                        case 'Ć':
                                znak[i] = static_cast<char>(143);
                        break;

                        case 'Ę':
                                znak[i] = static_cast<char>(168);
                        break;

                        case 'Ł':
                                znak[i] = static_cast<char>(157);
                        break;

                        case 'Ń':
                                znak[i] = static_cast<char>(227);
                        break;

                        case 'Ó':
                                znak[i] = static_cast<char>(224);
                        break;

                        case 'Ś':
                                znak[i] = static_cast<char>(151);
                        break;

                        case 'Ź':
                                znak[i] = static_cast<char>(141);
                        break;

                        case 'Ż':
                                znak[i] = static_cast<char>(189);
                        break;
                }
        }
        return znak;
}

proszę o szybką pomoc, i ewentualne podświetlenie błędów wraz z wyjaśnieniem czemu tak a nie inaczej

Z góry dziękuje,

młody (przyszły) programista.

PS Jako że wyskoczyło mi tyle błędów, poprawnie zrobiłem tylko dodawanie...

1

float dodawanie(*wsk1, *wsk2);
float odejmowanie(*wsk1, *wsk2);
float mnozenie(*wsk1, *wsk2);
float dzielenie(*wsk1, *wsk2);

Brakuje tu określena jakiego typu są argumentu funkcji. Powinno być
float dodawanie(float*, float*);
float odejmowanie(float*, float*);
float mnozenie(float*, float*);
float dzielenie(float*, float*);

Nazwy zmiennych wsk1 i wsk2 możesz wstawić w deklaracji funkcji lub pominąć, tak jak napisałem wyżej. Tak samo brak jest typu argumentów w definicjach funkcji:
float dodawanie(*Liczba1, *Liczba2)
{
....
}

a powinno być:
float dodawanie(float* Liczba1, float* Liczba2)
{
...
}

0

dzięki zaraz sprawdzę

0

dzięki, poprawiłem jeszcze 50 innych błędów i działa! :) Jeszcze problem z linkowaniem ale to przez te puste funkcje, odejmwanie, mnożenie itp...

0

FreZZy, a czy nie lepiej (skoro cwiczysz) zrobic tablice wskaznikow funkcji? chodzi mi o to, ze skoro wszystkie Twoje funkcje sa typu float to mozesz wszystkie funkcje zapisac do jednego wskaznika

 float (*wsk[])(int*, int*) = {&dodawanie, &odejmowanie, &mnozenie, &dzielenie}; 

i zamiast instrukcji w case'ach mozesz napisac tak

case:1
case:2
case:3
case:4
wsk[wybor](&Liczba1, &Liczba2)
break;

chyba nic nie pomieszalem :)

edit. Wybaczcie za odkopanie tematu. Ale dopiero teraz spojrzalem na date...
Jeszcze raz przepraszam

0

Heh a może wskaźnik powinien iść flame () 0123...89 ; ale nie obiecuje

1 użytkowników online, w tym zalogowanych: 0, gości: 1