Zadanie - klasa reprezentująca liczbę

0

Co jest źle w tym przekierowaniu liczba[i] do tab[i]?

#include <iostream>
#include <cstdlib>


using namespace std;

int main()
{
	
	int tab[10];
	string liczba;
	
	cout<<"Podaj liczbe: ";
	cin>>liczba;
	
	cout<<liczba<<endl;

	cout << "Dlugosc napisu to: " << liczba.length() << endl;
	
	for (int i=0; i<liczba.size(); i++) {
        cout<< liczba[i] << ", ";
        tab[i]=liczba[i];
        }
    
	cout<<endl;
	cout<<"Podaj liczbe ktora chcesz wypisac: ";
	int i;
	cin>>i;
	cout<<tab[i-1];
	
}
2

Zdajesz sobie sprawę z tego, że '1' to nie jest to samo co 1?
Znak '1' w tablicy ASCII ma wartość liczbową 49. Analogicznie z innymi liczbami.
Zakładając, że tylko ASCII Cię interesuje, to

tab[i] = liczba[i] - '0';

Tylko nie rozumiem po co tab skoro możesz używać liczba w ten sam sposób.

0
  1. Stringi są w nagłówku string nie cstdlib. A więc po co #include<cstdlib>?
  2. String przechowuje znaki typu char. A więc kody ASCII cyfr, a nie cyfry. A więc tab[i]=liczba[i] zapisuje kod ASCII cyfry, a nie cyfrę. Wpisz w Wikipedię hasło "ASCII". Uczyli Was o atoi? Jak nie, to na upartego zrób to stringstreamem.

Rozszerzenie: Komputer zapisuje znaki (takie jak 'a', '?', a nawet znak cyfry np. '2' kodując je do liczb. I tak na przykład pytajnikowi odpowiada liczba 63, literze a - liczba 97, a ZNAKOWI CYFRY 2 - liczba 50. I takie właśnie liczby przechowuje char (i string). Musisz przekonwertować kod odpowiadający cyfrze 2 na liczbę 2.

0

#include<cstdlib> użyłem bo próbowałem zastosować właśnie atoi i to pozostałość. Tak mam pomieszane w głowie ze zapomniałem o ASCII. Moja wina.

0

Mam tak i teraz do każdego elementu tablicy jest przypisana liczna, którą podam. Nie jest rozdzielona.

#include <iostream>
#include <cstdlib>
#include <string>



using namespace std;

int main()
{
	
	int tab[10];
	string liczba;
	
	cout<<"Podaj liczbe: ";
	cin>>liczba;
	
	cout<<liczba<<endl;

	cout << "Dlugosc napisu to: " << liczba.length() << endl;
	
	 for (int i=0; i<liczba.length(); i++) {
        cout<< liczba[i] << ", ";
       	tab[i] = atoi( liczba.c_str());
    }
  
  
    
	cout<<endl;
	cout<<"Podaj liczbe ktora chcesz wypisac: ";
	int i;
	cin>>i;
	cout<<tab[i-1];
	
}

1

Nad tym się zastanów: atoi( liczba.c_str()) Tu jest błąd

0

no tak sobie myślę, że by musiało byc atoi( liczba[i].c_str()) ale takie rozwiązanie nie działa, a w internecie szukam i nie ma, a na temat tego nie mówił wykładowca

0

Napisz mi, co zwraca funkcja c_str()

0

Wyciąga tekst z obiektu klasy string i zwraca go w formie tablicy char.

1

a czy liczba[i] jest na pewno typu string? ;)
Wydaje mi się, że w swoim kodzie mylisz pojęcie liczby i cyfry (mówię o końcówce).
Zastanawiam się też po co Ci jakieś tab.

0

A poza tym Ty chcesz przekonwertować do inta tablicę charów czy pojedynczy char?

1

Po co konwertujesz liczbę na liczbę (i to niepoprawnie)? Jak dostać cyfrę ze znaku przecież Ci napisałem parę postów wyżej.

0

mam teraz taki kod i jak go przerobić żeby był w klasie

#include <iostream>
#include <cstdlib>
#include <string>



using namespace std;

int main()
{
	
	int tab[10];
	string liczba;
	
	cout<<"Podaj liczbe: ";
	cin>>liczba;
	
	cout<<liczba<<endl;

	cout << "Dlugosc napisu to: " << liczba.length() << endl;
	
	 for (int i=0; i<liczba.length(); i++) {
        cout<< liczba[i] << ", ";
       	tab[i] = liczba[i] - '0';
    }
  
  
    
	cout<<endl;
	cout<<"Podaj liczbe ktora chcesz wypisac: ";
	int i;
	cin>>i;
	cout<<tab[i-1];
	
}
1
  1. Najpierw ni napisz, czemu to działa: tab[i] = liczba[i] - '0' To jest poprawne, ale chcę, żebyś rozumiał, dlaczego.
  2. Jak nie korzystasz z atoi to wywal #include <cstdlib>
  3. Zanim umieścimy to w klasie: rozszerz to na przypadek, gdy nie wiesz, ile cyfr ma liczba (może mieć 2 a może mieć 20). Podpowiedź: new/delete
0

no bo
0- '0'
1-'1 'zamiast 49
dobrze rozumiem?

#include <iostream>
#include <string>



using namespace std;

int main()
{
	int *tab;
	int n;
	string liczba;
	
	cout<<"Podaj liczbe: ";
	cin>>liczba;
	
	cout<<liczba<<endl;

	cout << "Dlugosc napisu to: " << liczba.length() << endl;
	n=liczba.length();
	
	tab = new int[n]; 
	
	 for (int i=0; i<liczba.length(); i++) {
        cout<< liczba[i] << ", ";
       	tab[i] = liczba[i] - '0';
    }
  
  
    
	cout<<endl;
	cout<<"Podaj liczbe ktora chcesz wypisac: ";
	int i;
	cin>>i;
	cout<<tab[i-1];
	
	delete[] tab;
	
}

0

Czy to już bym mógł umieścić jakoś w klasie?

0

Tak, ale zastąp pytanie o to, którą cyfrę wypisać, funkcją wypisującą tę liczbę w całości, tak jak jest w zadaniu.

0

Pytanie: Czy mówili Wam o przeciążaniu operatora << (przeciążaniu operatorów wejścia / wyjścia?)

0

Nie mówili o tym <<

0

Mam wypisywanie. Co dalej?

#include <iostream>
#include <string>



using namespace std;

void wypisz(int tab[], int n){
	
	for(int i=0; i<n; i++){
		
		cout<<tab[i];
		
	}
	
	cout << endl;
	
}


int main()
{
	int *tab;
	int n;
	string liczba;
	
	cout<<"Podaj liczbe: ";
	cin>>liczba;

	n=liczba.length();
	
	tab = new int[n]; 
	
	 for (int i=0; i<liczba.length(); i++) {
       	tab[i] = liczba[i] - '0';
    }
  
  
    wypisz(tab, n);

	
	delete[] tab;
	
}

0

Wsadź do klasy.

0

Dobrze przełożone?

#include <iostream>
#include <string>



using namespace std;

class Liczba{
	
	private:
	int *tab;
	int n;
	
	public:
	Liczba ();
	~Liczba();
	string liczba;
	void wypisz(int *tab, int n);	
	
};

Liczba::Liczba(){
	
	
	tab = new int[n]; 
	
	 for (int i=0; i<liczba.length(); i++) {
       	tab[i] = liczba[i] - '0';
    }
	
	cout<<"Podaj liczbe: ";
	cin>>liczba;

	n=liczba.length();
	
}

Liczba::~Liczba(){
	
	
	delete[] tab;
	
	
}



void Liczba::wypisz(int tab[], int n){
	
	for(int i=0; i<n; i++){
		
		cout<<tab[i];
		
	}
	
	cout << endl;
	
}


int main()
{
 
      Liczba w;


	

	
	
//co tu umieścić by wypisało się
  
  
    

	
	
	
}

0

Źle.

I mam nadzieję, że sam wpadniesz na to, dlaczego źle i co trzeba zrobić, by było dobrze. Podpowiedź: Powtórz notatki / skrypt / podręcznik / cokolwiek na temat klas.

0

PS. Wychodzę na jakąś godzinę / półtorej. Będziesz musiał sam sobie radzić przez ten czas.

0

W skryptach, które mam znalazłem tylko przeciążenie << które nie wiem czy nawet prawidłowo działa. Nie mam żadnego podobnego zadania do tego i w dalszym ciągu jestem w szarej d...

#include <iostream>
#include <cstring>

using namespace std;

class Liczba{
	
	private:
	int *tab;
	int n;
	int lc;
	
	public:
	Liczba ();
	~Liczba();
	string liczba;
	void wypisz(int *tab, int n);	
	void tablica(int n){
		
    	tab = new int[n]; 
    
 	}
	
	Liczba operator+(Liczba&);	
	friend ostream& operator<<(ostream&,Liczba&);
	
	
	
};

Liczba::Liczba(){

	 for (int i=0; i<liczba.length(); i++) {
       	tab[i] = liczba[i] - '0';
    }
	
	cout<<"Podaj liczbe: ";
	cin>>liczba;

	n=liczba.length();
	
}

Liczba::~Liczba(){
	
	
	delete[] tab;
	
	
}



void Liczba::wypisz(int tab[], int n){
	
	for(int i=0; i<n; i++){
		
		cout<<tab[i];
		
	}
	
	cout << endl;
	
}


int main()
{
	
	Liczba x;

	
	cout<<x;
	
	

  
  
    

	
	
	
}


Liczba Liczba::operator+(Liczba&x){
	
	Liczba w;
	int i=0, p=0, d;
	while(i<lc||i<x.lc){
		d=x.tab[100-1-i]+tab[100-1-i]+p;
		w.tab[100-1-i]=d%10;
		p=d/10;
		i++;	
	}
	w.lc=i;
	return w;	
}

ostream& operator<<(ostream&out, Liczba&x){
	
	if(x.lc){
		for(int i=0; i<x.lc; i++){
			out<<(int)x.tab[100-x.lc+i];	
		}	
	}
	else{
		out<<0;	
	}
	return out;			
}
0

Nie bierz się za coś więcej, póki nie zrobisz podstawy. Mówiłem, że źle zrobiłeś już wczytywanie i wypisywanie w klasie - czemu bierzesz się za dodawanie, zamiast poprawić poprzednie błędy?

Albo operator <<, albo funkcja wypisz. Oba spełniają tę samą rolę. Jeśli nikt nie mówił Ci o przeciążaniu operatora >>, to na razie odpuść i zrób poprawnie chociaż bez tego.

Wróć do kodu z postu https://4programmers.net/Forum/C_i_C++/284669-zadanie_klasa_reprezentujaca_liczbe?p=1333973#id1333973 i popraw błędy, które tam są. Bo nie zrobiłeś tego wciąż. (natomiast nawaliłeś kolejne błędy) Dopiero, jak doprowadzisz ten kod do działania, wtedy przejdziemy dalej.

1
  1. Podpowiedź: Jak klasa ma uzyskać stringa.

  2. Od 13:00 dzisiaj mnie nie ma aż do poniedziałku. Albo będziesz musiał radzić sobie sam, albo znajdź kogoś innego.

  3. Nie rób na chybcika, bo nic tak nie zrobisz. Zastanów się, zanim napiszesz jakąkolwiek linijkę. Nie pisz, póki nie jesteś pewny, że to, co napiszesz, działa i będziesz wiedział, dlaczego. Inaczej będziesz dalej produkował więcej błędów, niż poprawnych fragmentów.

  4. Rób po kolei. Nie bierz się za następny problem, póki nie rozwalisz poprzedniego. Nie ma sensu rozwijanie błędnego kodu.

Tyle, jeśli chodzi o rady ode mnie na ten moment :)

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