Zapisywanie elementów z przedziału x do nowej tablicy

0

Witam mam problem z zadaniem w którym muszę zapisać elementy z przedziału x do nowej tablicy y.
Zwraca mi błąd, że wyrażenie musi mieć stałą wartość linijka (int zliczone[i]=tab[i]). Nie za bardzo wiem jak się z tym uporać

int* zliczPrzedzial(int tab[], int n, int srednia, int odchylenie) {
	int przedzial1 = srednia - odchylenie;
	int przedzial2 = srednia + odchylenie;
	int* zliczone = new int[n];
	for (int i = 0; i < n; i++) {
		if (tab[i] > przedzial1 && tab[i] < przedzial2) {
			int zliczone[i] = tab[i];
		}
	}
	return zliczone;
}
1

int zliczone[i] po co ten int? Próbujesz deklarować nową tablicę?

0

Rzeczywiście,a mam jeszcze pytanko no bo tak w sumie nie wiem ile elementów chce mieć w tablicy zliczone[] a przypisuję do n przez co później wychodzą mi takie rzeczy
screenshot-20191219133128.png
Da się określić w jakiś sposób żeby tablica miała w tej funkcji tyle elementów ile zostanie do niej wrzucone. bo takie coś int* zliczone = new int[]; nie przejdzie

0

Jeżeli zamiast int*zliczone = new int[n] zrobię vector<int>zliczone(n); to i tak muszę podać to n a przy okazji wyskakuję mi błąd "brak odpowiedniej funkcji konwersji elementu na"
chyba, że ja to źle zapisuję

int* zliczPrzedzial(int tab[], int n, int srednia, int odchylenie) {
	int przedzial1 = srednia - odchylenie;
	int przedzial2 = srednia + odchylenie;
	vector<int>zliczone(n);
	for (int i = 0; i < n; i++) {
		if (tab[i] > przedzial1 && tab[i] < przedzial2) {
			 zliczone[i] = tab[i];
		}
	}
	return zliczone;
}
3

Zwracasz vector. I możesz użyć push_back() zamiast podawać wielkość na starcie.

vector<int> foo;
foo.push_back(1);
foo.push_back(3);
foo.push_back(3);
foo.push_back(7);
/* foo == [1, 3, 3, 7] */
0

chciałem zrobić z push_back jak mówiłeś ale po 1 wyskakuje mi, że wyrażenie musi być modyfikowaną l-wartością "zliczone.push_back(i)=tab[i]" i brak odpowiedniej funkcji konwersji elementu na. Da się w ogóle tak zrobić jak ja to próbuję czy to jest kompletnie bez sensu ?

int* zliczPrzedzial(int tab[], int n, int srednia, int odchylenie) {
	int przedzial1 = srednia - odchylenie;
	int przedzial2 = srednia + odchylenie;
	vector<int> zliczone;
	for (int i = 0; i < n; i++) {
		if (tab[i] > przedzial1 && tab[i] < przedzial2) {
			zliczone.push_back(i) = tab[i];
		}
	}
	return zliczone;
}
1

pushbackujesz wartość, a nie indeks. Przecież dałem przykład...

0

Ok myślałem, że po prostu pokazałeś jak dodać element do tablicy za pomocą tej metody i że będę mógł dodać w ten sposób to w takim razie jaki jest sposób na dodanie przez iteracji za pomocą vectora i czy w ogóle taki jest ?

1

Pokazałem jak dodać element do tablicy. Ty wziąłeś mój przykład i postarałeś się zrobić coś zupełnie innego.

3

push_back dodaje element na koniec vectora (https://en.cppreference.com/w/cpp/container/vector/push_back)
zamiast:

zliczone.push_back(i) = tab[i];

powinno być:

zliczone.push_back(tab[i]);

Dodatkowo:
obiekt zliczone które zwracasz jest typu std::vector<int>, natomiast twoja funkcja informuje że zwraca int*:

int* zliczPrzedzial(int tab[], int n, int srednia, int odchylenie) {

to też musisz poprawić

0

Czy to jest odpowiedni typ ? bo błąd ustąpił, a szukając pod nazwą vector<int> type function w cplusplus.com nie mogę znaleźć żadnego przykładu.

vector<int> zliczPrzedzial(int tab[], int n, int srednia, int odchylenie) {
	int przedzial1 = srednia - odchylenie;
	int przedzial2 = srednia + odchylenie;
	vector<int> zliczone;
	for (int i = 0; i < n; i++) {
		if (tab[i] > przedzial1 && tab[i] < przedzial2) {
			zliczone.push_back(tab[i]);
		}
	}
	return zliczone;
}
2

Alternatywą jest użycie copy_if, co znacznie skróci kod do i zwiększy jego czytelność.

    vector<int> tab {1,5,-3,4,5,87,12,3,7,4,4,3};
    vector<int> newtab;
    int min {0}, max {3};
    
    copy_if( tab.begin(), tab.end() , back_inserter(newtab), [=]( int v ) { return (v<=max && v>=min); } );
0

W jaki sposób mogę teraz wypisać taki vector ?

1

https://en.cppreference.com/w/cpp/algorithm/copy

std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));

lub

for (auto elem: vec) {
  std::cout << elem << " ";
}
0

@plx211:

copy(zliczone.begin(), zliczone.end(), ostream_iterator<int>(cout, " ")); 

"wyrażenie musi mieć typ klasy" jak patrze po necie to wchodzi tutaj już obiektówka a tego nie mam zamiaru zrobić jest jakieś inne rozwiązanie na to ?

0

Już się uporałem musiałem przypisać do vectora funkcje. Dzięki za pomoc wszystkim

vector<int> zliczone = zliczPrzedzial(tab, n, srednia, odchylenie);

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