Zadanie - klasa reprezentująca liczbę

0

Cześć :)

Mam do zrobienia zadanie w C++, od razu mówię, że raczej średnio się w nim orientuję. Bardzo proszę o waszą pomoc.

Zadanie:
Zdefiniuj klasę Liczba, która przechowuje w tablicy cyfry liczby dziesiętnej. Zdefiniuj operacje
wypisywania liczby, nadawania jej wartości (w postaci parametru konstruktora będącego napisem)
oraz mnożenia przez liczbę typu int. W przypadku gdy w czasie mnożenia okaże się, że tablica jest
za mała, procedura mnożąca powinna kopiować jej zawartość do większej. Zdefiniuj wreszcie
metodę silnia, która policzy silnię zadanej jako parametr liczby typu int.

#include <iostream>
#include <sstream>

using namespace std;

class liczba{
	
	private:
		int tab[];
		int t;
	public:
		liczba(string s);
		void wypisz();
		void mnozenie(int i);
		int silnia();
			
};

liczba::liczba(string s){
	
	for(int i=0;i<s.length();i++){
		
		t=s.length();
	
		if((s[i]==0)||(s[i]==1)||(s[i]==2)||(s[i]==3)||(s[i]==4)||(s[i]==5)||(s[i]==6)||(s[i]==7)||(s[i]==8)||(s[i]==9))
		{
			tab[i]=(int)s[i];
		}
		
	}
	
}

void liczba::mnozenie(int z){
	
	int d=1;
	int l;
	for(int i =0;i<t;i++)
	{
		d*10;
	}
	for(int i =0;i<t;i++)
	{
		l=d*tab[i];
	}	
	l*=z;
	ostringstream ss;
	ss << l;
	string s = ss.str();
	for(int i=0;i<s.length();i++)
	{
		
		
		
			tab[i]=(int)s[i];
		
	}
}
int liczba::silnia()
{
	int d=1;
	int l;
	for(int i =0;i<t;i++)
	{
		d*10;
	}
	for(int i =0;i<t;i++)
	{
		l=d*tab[i];
	}
	return l;
}
void liczba::wypisz(){
	for(int i =0;i<t;i++)
	{
		cout<<tab[i];
	}
}

int main()
{
	string s="123245";
	int i=2;
	
	liczba *l1 = new liczba(s);
	l1->wypisz();
	i=l1->silnia();
	cout<<"\n"<<i;	
	
}

3

Opisałeś zadanie, ale Twojego problemu już nie...

Na pierwszy rzut oka:

  • używasz nagich new (zapominając już o delete). To zły nawyk,
  • tego ifa-potworka można zamienić na isdigit z <ctype>,
  • int tab[]; nie skompiluje się jako element struktury. Użyj std::vector<int> na przykład,
  • popraw formatowanie (http://format.krzaq.cc może pomóc). Tragedii nie ma, ale można lepiej,
  • tab[i]=(int)s[i]; ⟵ tak się nie zamienia cyfry na liczbę.
1

Jakie jest pytanie?

0

Co muszę zrobić, żeby program działał poprawnie?

1

napisac go poprawnie.

a teraz zadaj pytanie co konkretnie Ci nie dziala i ktora funkcja za to odpowiada (za ta jedna rzecz)

3

Zacznij od doprowadzenia do tego, aby program się w ogóle skompilował. Potem możesz wziąć moje uwagi pod uwagę. Następnie debugger w rękę i do dzieła. Zapraszamy również do zadawania konkretnych pytań.

0

Program mi się kompiluje, tylko uzyskuje zły wynik. Nie wiem czy tablica przechowuje dobre dane. Konkretnie chodzi mi o zdanie "przechowuje w tablicy cyfry liczby dziesiętnej".

0

Jakiego kompilatora używasz? Twój program nie ma prawa się skompilować.

0

DEV-C++ i nawet uzyskuje wynik

0

uzyj kompilatora z tego tysiaclecia ;)
bo Twoj kod niestety nie ma prawa dzialac

0
tyryry napisał(a):

DEV-C++ i nawet uzyskuje wynik

Ostatnia wersja takowego wyszła 12 lat temu (nawet wtedy był niezgodny z ówczesnymi standardami), zamień go na coś innego.

2

Jaka wersja Dev-C++?

Jeśli to jest Bloodshed Dev-C++, to rzeczywiście słabiutko, bo jest to program wielce przestarzały i z wielką ilością błędów.

Uaktualnij go w takim wypadku do rozwijanej wersji Orwell Dev-C++: https://sourceforge.net/projects/orwelldevcpp/ Będzie to najwygodniejsze dla Ciebie rozwiązanie.

0

No robiłem to w wersji Orwell. Wrzuciłem kod do visual studio tam poprawiłem te błędy, które wyskoczyły, ale program nie działa dobrze. Nie potrafię zrozumieć tej tablicy, co powinno się dokładnie w niej znajdować.

0

Elementy. int tab[] jest zapisem oznaczającym nieoznaczoną liczbę elementów oraz int*, zależnie od kontekstu. Najlepiej użyj std::vector po prostu.

0

Uczą Was new / delete czy malloc / free?

0

new / delete

1

No to ja teraz mam do wyboru: Albo samemu zreferować to, co Twój podręcznik / skrypt / notatki / whatever pisze na temat new / delete albo Cię do tych notatek odesłać, z tą wskazówką, że w definicji klasy liczba winno być int *tab a nie int tab[] i że ta właśnie tablica winna być „obsługiwana” przez new / delete a nie jest.

Z lenistwa wybiorę tę drugą opcję. Powtórz notatki, spróbuj zastosować je w praktyce i pokaż kod.

0

I jak mam teraz przechować w tej tablicy te cyfry liczby dziesiętnej?

using namespace std;

class Liczba {

private:
    int* tab;

public:
    void wypisywanie();
    Liczba(int);
    ~Liczba();
};

Liczba::Liczba(int rozmiar)
{
    tab = new int[rozmiar];
}
Liczba::~Liczba()
{
    delete[] tab;
}
0
tyryry napisał(a):

I jak mam teraz przechować w tej tablicy te cyfry liczby dziesiętnej?

Tak, jak Ci będzie wygodniej: albo cyfra jedności na początku tablicy, albo na końcu. Podpowiedź: Łatwiej Ci będzie dopisywać cyfry na koniec tablicy, a nie na początek. Zauważ, w jakiej kolejności piszesz cyfry, gdy coś mnożysz albo dodajesz pod kreską na kartce papieru.

Liczba::Liczba(int rozmiar)
{
tab = new int[rozmiar];
}

Dobrze alokujesz pamięć, to się chwali. Niestety, cytat z treści zadania: nadawania jej wartości (w postaci parametru konstruktora będącego napisem)
Czyli, że jednak musi być Liczba::Liczba(string napis) Musisz sam stwierdzić, jak wiele cyft jest w stringu, i na tej podstawie zaalokować pamięć na odpowiednią ilość elementów tablicy.

Zrób to, to przejdziemy dalej.

0

Tak ma być?

using namespace std;

class Liczba {
	
	private:
	string *tab;

	public:
	void wypisywanie();
	Liczba(string);
	~Liczba();

	
};

Liczba::Liczba(string){
 		
	tab = new string[10];

		      
}  
Liczba::~Liczba(){	

		delete [] tab;  
		    
}
0

Nie i nie.

Zastanów się. W swojej klasie masz za zadanie przechować tablicę cyfr. Czyli: masz przechować cyfry w tablicy.

Konstruktor Twojej klasy ma otrzymać string. string to jest typ napisowy. Typ string przechowuje całe napisy. I Ty dostajesz w konstruktorze NAPIS, który zawiera liczbę (np. "123456", i masz przekonwertować go na tablicę cyfr (np. {1, 2, 3, 4, 5, 6} albo też {6, 5, 4, 3, 2, 1}, jak Ci będzie wygodniej).

Co to jest string *tab = new string[10]? To jest tablica, przechowująca 10 NAPISÓW. nie cyfr. Napisów.

Ja mam propozycję. Najpierw przechowaj w swojej klasie liczbę 123456. Możesz ją po prostu wpisać na chama do kodu. Zrób konstruktor, który ZAWSZE, z jakimkolwiek parametrem wywołany by nie był, sprawi, że w Twoja klasa będzie przechowywać liczbę 123456. Może wtedy zrozumiesz, jak masz przechowywać cyfry. Potem wrócimy do kwestii konswersji stringa na tablicę cyfr.

0

Ja już kurde nie wiem,wytłumacz mi łopatolicznie.

using namespace std;

class Liczba {
	
	private:
	int *tab;
	string napis;

	public:
	void wypisywanie();
	Liczba();
	Liczba(string);
	~Liczba();

	
};

	Liczba::Liczba(){
	
	string napis="123456789";
	cout<<napis<<endl;
}

Liczba::Liczba(string){

	tab = new int[10];
		      
}  
Liczba::~Liczba(){	

		delete [] tab;  
		    
}
0

Czy rozumiesz, co to znaczy "tablica cyfr"?

Czy w ogóle rozumiesz, co to znaczy tablica?

0

no mam tablice, mam napis "123456789" i teraz gdzie go podzielić i jak umieścić w tablicy?

0

Ugh.

Zapomnij o klasach.
Zapomnij o stringach.

Po prostu. Zrób program, który poprosi użytkownika o 10 cyfr. I przechowaj te cyfry w tablicy. Potem niech program zapyta użytkownika, którą cyfrę ma mu wypisać. I niech mu ją wypisze.

Póki tego nie zrobisz, nie ma sensu iść dalej.

Jeśli nie wiesz, jak zrobić powyższe, poczytaj o tablicach.

0

No mam taki program. Programowanie strukturalne rozumiem, ale już obiektowego nie za bardzo.

0

Pokaż go.

0
#include <iostream>

using namespace std;

int main()
{
	
	int tab[10];
	
	for(int i=0; i<10; i++)
	{
		cout<<"Podaj liczbe: ";
		cin>>tab[i];
	}
	
	cout<<"Podaj liczbe ktora chcesz wypisać: ";
	int i;
	cin>>i;
	cout<<tab[i-1];

	
}
0

Czemu if(i=i)? Co to ma znaczyć?

0

Wygląda dobrze.

Napisz to samo, ale zamiast 10 cyfr wczytaj liczbę. Liczbę wczytaj do stringa. Potem po kolei przepisz cyfry ze stringa do tablicy. I poproś użytkownika, którą cyfrę mu wypisać. Załóżmy na razie, że wiesz, że liczba będzie mieć 10 cyfr i ani jednej więcej, ani jednej mniej.

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