• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kalkulator - pobieranie wartości z linii zlecenia ( argc argv )

Object Storage Arubacloud
0 głosów
1,311 wizyt
pytanie zadane 21 maja 2017 w C i C++ przez Betonowy Nowicjusz (160 p.)

Witam, mam do zrobienia kalkulator który pobierał będzie wartości z linii zlecenia ( CMD ). Nie wiem jak przypisać wartości pobrane z linii do argumentów w moim programie - musi to być zrobione na klasie z prywatnymi polami. I tu moje prośba o podpowiedź jak zrobić żeby moje metody działały na pobranych argumentach 

#include <iostream>
#include <conio.h>

using namespace std;



class Kalkulator {

	int argument1;
	int argument2;
	int wynik;
	char operacja;
public:
	void podaj_argument_1()
	{
		cout << "Podaj 1 argument: " << endl;
		cin >> argument1;
	}
	void podaj_argument_2()
	{
		cout << "Podaj 2 argument: " << endl;
		cin >> argument2;
	}
	void dodawanie()
	{
		wynik = argument1 + argument2;
	}
	void podaj_wynik_dodawania()
	{
		cout << wynik;
	}
	
};

int main( int argc , char * argv[]  )
{
	
	for (int i = 0; i < argc; ++i)
	{
		cout << argv[i]<< endl;
	}
	Kalkulator K1;
	K1.podaj_argument_1();
	K1.podaj_argument_2();
	K1.dodawanie();
	K1.podaj_wynik_dodawania();
	

	_getch();

}

 

2 odpowiedzi

0 głosów
odpowiedź 21 maja 2017 przez d0n Mądrala (6,440 p.)

Można to zrobić na mnóstwo sposobów:
1. Napisać funkcję inicjuj( int a, int b ) w klasie Kalkulator, która ustawi swoje prywatne pola argument1 i argument2 na a i b i przekazać im wartości z linii polecen zamienione na int'y jakąś funkcją ( np. atoi z cstdlib ) i który będzie używany zamiast podaj_argument, gdy będą argumenty z linii poleceń
2. Zamiast funkcji inicjuj napisać konstruktor ( tez z takimi samymi argumentami i dzialaniem ), taki konstruktor używający listy inicializacyjnej wyglądał by tak:
 

Kalkulator ( int a, int b ) : argument1( a ), argument2( b ) {}

3. Napisać dwa konstruktory ( domyślny i taki jak w 2 ), gdzie domyślny użyje metod podaj_argument() i będzie wywoływany, gdy nie będzie argumentów z linii poleceń

Jeśli nie znasz konstruktorów i nie są Ci potrzebne to to olej, napisz zamiast nich zwykłe funkcje składowe klasy ( metody ),
napisalem się o tych konstruktorach, bo skróciły by kod i zrobiły go elegantszym, ale naprawdę nie potrzeba tu żadnych konstruktorów i opcja 1 jest bardzo spoko

0 głosów
odpowiedź 21 maja 2017 przez Betonowy Nowicjusz (160 p.)

Pomogłeś :) Zdecydowałem się na pierwszą opcję, nie znam na tyle dobrze konstruktorów żeby dobrze je wykorzystać. Pobieranie argumentów działa, teraz wykorzystać kompilację warunkową żeby działało albo pobieranie z CMD albo normalnie przez Visuala. Nie bardzo wiem jak to zdefiniować żeby wybrało jedną z opcji. Coś na zasadzie jeśli argv ==coś_tam to wykonaj inicjuj czy jakoś inaczej kombinować ? 

#include <iostream>
#include <conio.h>
#include <cstdlib>

using namespace std;



class Kalkulator {

	int argument1;
	int argument2;
	int wynik;
	char operacja;
public:
	int inicjuj(int a, int b)
	{

		argument1 = a;
		argument2 = b;

		return 0;
	}
	void podaj_argument_1()
	{

		cout << "Podaj 1 argument: " << endl;
		cin >> argument1;

	}
	void podaj_argument_2()
	{
		cout << "Podaj 2 argument: " << endl;
		cin >> argument2;

	}
	void dodawanie()
	{

		wynik = argument1 + argument2;
		cout << wynik << endl;
	}
	void odejmowanie()
	{
		wynik = argument1 - argument2;
		cout << wynik << endl;
	}

};

int main(int argc, char * argv[])
{

	for (int i = 0; i < argc; ++i)
	{
		cout << argv[i] << endl;
	}

	int a, b;
	a = atoi(argv[1]);
	b = atoi(argv[2]);

	Kalkulator K1;


	K1.inicjuj(a, b);
	

	K1.podaj_argument_1();
	K1.podaj_argument_2();
	K1.dodawanie();
	K1.odejmowanie();



	_getch();


}

 

komentarz 21 maja 2017 przez Betonowy Nowicjusz (160 p.)
edycja 22 maja 2017 przez Betonowy

EDIT: Trochę inaczej ale problem rozwiązany :) 

Próbuję coś na tej zasadzie : 

if (argc =! 0) {

#define LINIA
	}
	int a, b;
	
	Kalkulator K1;
#ifdef LINIA
	a = atoi(argv[1]);
	b = atoi(argv[2]);

#endif
	
	K1.inicjuj(a, b);

 

komentarz 22 maja 2017 przez d0n Mądrala (6,440 p.)

Rozumiem, że chcesz uzyskać następującą funkcjonalność:
    Jeśli były argumenty wywołania, to zainicjuj kalkulator nimi, jeśli ich nie było wczytaj a i b
Aby to osiągnąć wystarczy napisac:
 

if (argc == 2 ) // mamy dwa argumenty
    inicjuj( atoi( argv[1] ), atoi( argv[2] ) );
else
{
    K1.podaj_argument_1();
    K1.podaj_argument_2();
}

Piszę to ponieważ masz chyba złe przeświadczenie o kompilacji warunkowej
Wszystko co napiszemy po '#' oznacza dyrektywę preprocesora i jest wykonywane zanim w ogóle powstanie program, więc napisanie:

if (argc =! 0) {
 
#define LINIA
    }

Dla preprocesora oznacza tylko zdefiniuj LINIA, preprocesor nie patrzy w kod, działa przed procesem kompilacji i wykonuje tylko interesujące go linie rozpoczęte "#", nie patrząc na resztę kodu

1
komentarz 22 maja 2017 przez Betonowy Nowicjusz (160 p.)
Tak, poczytałem trochę i tak właśnie to zrobiłem jak napisałeś :) Dzięki

Podobne pytania

–1 głos
1 odpowiedź 909 wizyt
pytanie zadane 27 grudnia 2018 w C i C++ przez Pandzia156 Nowicjusz (120 p.)
0 głosów
3 odpowiedzi 49,811 wizyt
pytanie zadane 29 listopada 2016 w C i C++ przez TheBatman94 Początkujący (450 p.)
0 głosów
1 odpowiedź 697 wizyt
pytanie zadane 16 maja 2016 w C i C++ przez matysolek Nowicjusz (170 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...