Nieoczekiwane wartosci przy zamianie stringa do int. Co sie dzieje?

0

Witam, przy probie zamienienia stringow do int i zapisania ich w tablicy, program wyswietla dziwne wartosci. Ponizej screen. Przepraszam za kiepska jakosc. Z gory dziekuje za pomoc.

http://imageshack.us/f/541/z6uy.jpg/

Na koncu w odczytach tablicy na 4 i 6 pozycji wyswietlaja sie dziwne wartosci.

0

na początku tworzysz tablicę dynamiczną tab[1], a potem wrzucasz do niej 20 elementów. Wylatujesz poza zakres tablicy

0

Probowalem robic rozne kombinacje z tablicami. Czy na pewno chodzi o tablice, wraz ze wzrostem elementow zwiekszam rozmiar tablicy n++? Zawsze na czwartej i czóstej pozycji wywala inna wartosc.

0

nie muszę chyba pisać co myślę o ludziach wklejajacych kod jako załącznik-obrazek ]:>
dosc ze masz za małą tablicę (1 elementowa), to na dodatek indeksujesz od 1 jak humanista a nie informatyk.
a wielkosc tablicy ustala się raz operatorem new, n++ nic w tej materii nie zmienia.

0

Jak wiesz że ma być tego dokładnie 20 to po kiego bawisz się w dynamiczne przydzielanie?
Jak wiesz że ma być liczba to po kiego się bawisz w stringstream?

#include <iostream>
using namespace std;

int main()
  {
   unsigned tab[20],n=0;
   for(n=0;n<20;)
     {
      cout<<"Podaj liczbe nr "<<(n+1)<<": ";
      if(cin>>tab[n]) ++n;
      else
        {
         cin.clear();
         if(cin.get()=='k') break;
         cout<<"ma być liczba całkowita dodatnia"<<endl<<endl;
        }
      while(cin.get()!='\n') {}
     }
   for(unsigned i=n-1;i<n;--i) cout<<tab[i]<<' ';
   return 0;
  }
0
MarekR22 napisał(a):

nie muszę chyba pisać co myślę o ludziach wklejajacych kod jako załącznik-obrazek ]:>

No powiedz co myslisz?

Ucze sie dopiero. Chyba dla takich jak ja jest to forum prawda? Elementow w tablicy moze byc maksymalnie 20. Moze byc mniej. Chcialem zrobic by wpisywanie liczb konczylo sie rowniez poprzez nacisniecie znaku 'k'.

Ogólnie dzieki za pomoc, ale problem dalej nie rozwiazany.

(Dobra, wkleilem obrazek wraz z kompilacja by nie trzeba bylo wklepywac kodu tylko Od razu zobaczyc co z tego wyniklo, ale OK)

0

Pomoze ktos?

0

Wrzuć kod.

0

Prosze bardzo. Uprzedzam ze sie dopiero ucze!

 #include <iostream>
#include <string>
#include <sstream>
using namespace std;
 int main(){
 	
	int n=1,b;
	string ab;
	
	int *tab = new int[n];
	
	while(ab!="k" && n<20){
	 cout<<"podaj liczbe "<<n<<": ";
	 cin>>ab;

 		stringstream ss(ab); 
 		ss >> b;
 		
 		if(b>0){
 			
 			tab[n-1]=b;
 			n++;
 		}
 
 	}
 n--;
 cout<<"------ n: "<<n<<endl;
 for(n;n>=0;n--){
 	cout<<tab[n]<<". ";
 } 
	return 0;
 }
0

Koledzy zmienilem na to, ale wciaz nie rozumiem dlaczego w SRODKU w dwoch miejscach wywala jakas zla liczbe. Gdyby to bylo na peryferiach tablicy to bym rozumial a tu gdzies w srodku. Przydzielilem na poczatku tablice n=0, ale pozniej kazdorazowo przed dodaniem elementu ją zwiekszam n++. Skoro wiecie co jest nie tak czy mozecie poprawic ponizszy kod? Zaczynam juz miec oczoplasy od tego i mozg juz nie swiezy:/ Prosze o pomoc.

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
 int main(){
 	
	int n=0,b;
	string ab;
	
	int *tab = new int[n];
	
	while(ab!="k" && n<20){
	 cout<<"podaj liczbe "<<n+1<<": ";
	 cin>>ab;

 		stringstream ss(ab); 
 		ss >> b;
 		
 		if(b>0){
 			n++;
 			tab[n-1]=b;
 			
 		}
 
 	}
 n--;
 cout<<"------ n: "<<n<<endl;
 for(n-1;n>=0;n--){
 	cout<<tab[n]<<". ";
 } 
	return 0;
 }

 
0

Coś takiego co planujesz mógłbyś zrobić na listach ale skoro tablice sprawiają problemy to co dopiero tam.

Po pierwsze pamiętaj że czy dynamiczna tablica czy stała każda musi mieć określony rozmiar wcześniej przed przypisywaniem wartości. Różnica jest taka, że stała ma z góry określony rozmiar natomiast dynamicznej rozmiar ustalasz w trakcie trwania programu i możesz ją usunąć i stworzyć nową. Czyli przed tą twoją pelą MUSISZ USTALIĆ ILE POTRZEBA CO NAJMNIEJ ELEMENTÓW. Tak jak zaczynałem też myślałem, że można tak jak to robisz, ale nie tędy droga.

0

Lagodnie mowiac. n nie ma NIC wspolnego z ta tablica, poza 1 linijka.

0

czyli mam stworzyc najpierw tablice n=20? Myslalem ze dynamiczna tablica moze byc 0 elementowa i przed dodaniem elementu po prostu ja zwiekszam? Zrobilem wczesniej kilkadziesiat zadan z tablicami i nigdy nie mialem problemow.

0
int *tab = new int[n];

w tym miejscu musisz ustalić tablicy rozmiar, potem możesz ją co najwyżej usunąć i nadać nowy rozmiar.

0
int n=0,b;
string ab;
 
int *tab = new int[n];

Pobaw się w bycie interpretatorem: parsujesz pierwszą, drugą oraz pustą trzecią linijkę. Natrafiasz na linijkę czwartą i widzisz, że użyta jest tam zmienna n - z linijki pierwszej wiesz, że zmienna ta jest równa zero, zatem tworzysz tablicę int-ów, która posiada zero elementów. Idziesz dalej i...

0

W ten sposob? Niby teraz wyswietla poprawnie.

 
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
 int main(){
 	
	int n=0,b;
	string ab;
	
	int *tab = new int[20];
	
	while(ab!="k" && n<20){
	 cout<<"podaj liczbe "<<n+1<<": ";
	 cin>>ab;

 		stringstream ss(ab); 
 		ss >> b;
 		
 		if(b>0){
 			n++;
 			tab[n-1]=b;
 			
 		}
 
 	}
 n--;
 cout<<"------ n: "<<n<<endl;
 for(n-1;n>=0;n--){
 	cout<<tab[n]<<". ";
 } 
	return 0;
 }


0

Tak w ten sposób, ale możesz np wcześniej wczytać do n inna wartość która podasz w konsoli i zamiast tej 20 podać te n dzięki czemu będziesz miał kontrole ile ma mieć elementów.

int n=0,b;
string ab;
cin >> n;
int *tab = new int[n];
0
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main()
{
  string line;
 
  unsigned int data[20], pos=0;
 
  do
  {
    cout << "Podaj liczbę #"<<n+1<<": ";
    cin >> line;

    if (line == "k")
      break;
 
    stringstream num_str(line);
    int num;
    num_str >> num;
 
    if(num > 0)
      tab[pos++] = num;
  }

  for (pos--; pos>=0; pos--)
    cout << tab[pos] << " ";
 }

Prawda, że w ten sposób ładniej?
(disclaimer: pisane z palca, może zawierać błędy oraz śladowe ilości orzechów)

0

Skoro obraz nedzy i rozpaczy to prosze o pomoc w zrobieniu tego jak nalezy. Moze mam jakies zle nawyki i braki wiedzy o ktorych nie wiem. Myslalem ze moge sobie stworzyc tablice dynamiczna jedno elementowa i sobie ja zwiekszac o jeden przed dodaniem elementu. W tym zadaniu uzytkownik moglby wprowadzic tylko jedna liczbe i nacisnac 'k'. Zatem wczesniejsze utworzenie 20elementowej tablicy gdzie wykorzystane jest tylko 1 miejsce byloby marnotrastwem.

0

Myslalem ze moge sobie stworzyc tablice dynamiczna jedno elementowa i sobie ja zwiekszac o jeden przed dodaniem elementu.

Możesz.
Ale musiałbyś ręcznie realokować oraz kopiować bloki pamięci - trochę z tym byłoby roboty. Poczytaj o free, memcpy oraz ogólnie o wskaźnikach oraz operacjach na pamięci w C++ - to nie jest Pascal, gdzie wystarczy zrobić SetLength(Tablica, NowyRozmiar);, a kompilator zaopiekuje się wszystkim.
Dlatego wymyślono std::vector, które to wszystko robi za Ciebie (a nawet więcej).

Zatem wczesniejsze utworzenie 20elementowej tablicy gdzie wykorzystane jest tylko 1 miejsce byloby marnotrastwem.

Większość kontenerów działa na takiej zasadzie, czyli nie alokuje tyle danych ile jest wymagane, tylko zawsze i za każdym razem nieco więcej (np.1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 i tak dalej). Dzięki temu unika się częstych i kosztownych operacji na pamięci.

0

Czyli wniosek taki ze lepiej byloby utworzyc tablice stala z 20 elementami a nie dynamiczna. W innym przykladzie uzytkownik moglby wpisac np 200 liczb badz zakonczyc po jednym elemencie literka 'k' i wtedy 199 miejsc tablicy byloby niewykorzystane. Hmm musze posprawdzac wczesniejsze swoje programy bo zawsze robilem z dynamicznymi tablicami jak teraz i wszystko gralo jak nalezy.

0

Czyli wniosek taki ze lepiej byloby utworzyc tablice stala z 20 elementami a nie dynamiczna. W innym przykladzie uzytkownik moglby wpisac np 200 liczb badz zakonczyc po jednym elemencie literka 'k' i wtedy 199 miejsc tablicy byloby niewykorzystane. Hmm musze posprawdzac wczesniejsze swoje programy bo zawsze robilem z dynamicznymi tablicami jak teraz i wszystko gralo jak nalezy.

0

Dynamicznie to będzie wyglądało tak:

#include <iostream>
#include <cstring>
using namespace std;
 
int main()
  {
   unsigned *tab=0,n=0;
   while(true)
     {
      cout<<"Podaj liczbe nr "<<(n+1)<<": ";
      unsigned v;
      if(cin>>v)
        {
         unsigned *tmp=new unsigned[n+1];
         memcpy(tmp,tab,n*sizeof(unsigned));
         if(tab) delete[] tab;
         tab=tmp;
         tab[n++]=v;
        }
      else
        {
         cin.clear();
         if(cin.get()=='k') break;
         cout<<"ma być liczba całkowita dodatnia"<<endl<<endl;
        }
      while(cin.get()!='\n') {}
     }
   for(unsigned i=n-1;i<n;--i) cout<<tab[i]<<' ';
   delete[] tab;
   return 0;
  }

Oczywiście za pomocą vector'a wspomnianego przez @Patryk27 wyżej było by prościej.

0

Dziekuje wszystkim. Przerobilem kod uzywajac vectorow. Wszystko dziala jak nalezy. Czy ponizszy kod jest poprawny? Tzn czy jest optymalny z punktu programisty?

 

#include <iostream>
#include <vector>
#include <sstream>
using namespace std;

int main(){
int n=0,b,d=0;	
vector<int> vector1;
string caldod;
cout<<"k - konczy program"<<endl;
while(n<20 && caldod!="k"){
	if(d==0){
	
	cout<<"podaj liczbe "<<n+1<<": ";
	
	}
	d=0;
	cin>>caldod;
	
	stringstream ss(caldod); 
 	ss >> b;
	
	if(b>0){
		
		vector1.push_back(b);
		n++;
		
		
	}
	else{
		if(caldod!="k"){
		d=1;
		cout<<"podaj dodatnia liczbe calkowita "<<n+1<<": ";
		
		}
	}
}
n--;
cout<<"\n";
for(n;n>=0;n--)
cout<<vector1[n]<<". ";
	
	
return 0;
	
}
0

1.Beznadziejne (pseudo)formatowanie kodu.
2.vector sam trzyma swój rozmiar, nie musisz mieć osobnej zmiennej do tego celu.
3.Idiotycznie ponazywane zmienne...
4.Kilka minut gapiłem się w kod w poszukiwaniu znaczenia zmiennej d - wciąż nie wiem; 4b) dlaczego jest int-em, skoro korzystasz z niej, jak z bool-a?

0
  1. Podwójne porównywanie z "k".
  2. Bezsensowne (niepotrzebne) użycie stringstream.
  3. Niepotrzebne ograniczenie do 20 elementów lub wystarczy zwykła tablica.
0

Co masz na mysli piszac pseudo formatowanie? Poprawilem zmienna d na bool'a. Ta zmienna sprawia ze gdy uzytkownik wpisze liczbe ujemna lub 0 wtedy wyswietla sie napis 'podaj dodatnia liczbe calkowita'. Bez tego wyswietlalo sie podwojnie 'podaj dodatnia liczbe calkowita''podaj liczbe'.
Zmienilem tez wypisywanie tablicy od 0 do konca vektora z uzyciem vector.size.
Dragon a jak bys napisal kod bez uzycia stringa tak zeby petle przerywalo nacisniecie konkretnego klawisza np. k?
Panowie zebysmy sie zrozumieli wiem, ze utrudnilem sobie to zadanie, ale chodzi w tym o NAUKE nowych rzeczy, a nie o sztywne rozwiazanie zadania. Jestem laikiem. Pzdr.

#include <iostream>
#include <vector>
#include <sstream>
using namespace std;

int main(){
int n=0,b;
bool d;	
vector<int> tab;
string liczba;

cout<<"k - konczy program"<<endl;

while(n<20 && liczba!="k"){
	if(d==false){	
	cout<<"podaj liczbe "<<n+1<<": ";
	}
	
	d=false;
	cin>>liczba;
	
	stringstream ss(liczba); 
 	ss >> b;
	
	if(b>0){
		tab.push_back(b);
		n++;	
	}
	else{
		if(liczba!="k"){
		d=true;
		cout<<"podaj dodatnia liczbe calkowita "<<n+1<<": ";
		
		}
	}
}

cout<<"\n";
for(n=0;n<tab.size();n++)
cout<<tab[n]<<". ";

return 0;
	
}

 

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