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

jak zebezpieczyć funkcję w c++

Object Storage Arubacloud
0 głosów
138 wizyt
pytanie zadane 20 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)
edycja 20 stycznia 2017 przez heros22pt
Witam, mam mały problem. Napisałem program, wykorzystujący find_if - ma znaleźć elementy mniejsze od 10.. No i napotykam problem, ponieważ funkcja nie zawsze dostaje choćby jeden element przechodzący ten predykat, czyli mniejszy od 10. Wtedy program wysypuje się. Mam pytanie, jak zabezpieczyć funkcję, jeśli nie znajdzie żadnego elementu mniejszego od podanej wartości, czyli defacto find_id nie zwróci nic. ?
komentarz 20 stycznia 2017 przez DragonCoder Nałogowiec (36,500 p.)
A kod?
komentarz 20 stycznia 2017 przez heros22pt Użytkownik (950 p.)
nie mam problemu z kodem. Mój problem jest ogólny i nie dotyczy tylko find_if, a także innych gotowych funkcji stl.

ale wygląda to następująco:

--predykat coś zwracający

-- jakiś wektor zawierający zmienne

-- funkcja find_if szukająca pierwszej zmiennej która jest mniejsza od jakiejś tam wartości.

Problem jest dokładnie wtedy, kiedy w wektorze nie ma podanej wartości czyli np. wszystkie liczby są większe od 10, a mam znaleźć mniejszą liczbę..

funkcja find if zawsze coś zwraca, ale jak nie ma co zwrócić - program się wysypuje... Jak temu zaradzić, może jest jakaś funkcja typu while(!eof) żeby w razie gdyby funkcja przejrzała już wszystkie liczby i nic nie znalazła, po prostu nic nie zwróciła...

Proszę o jakieś wskazówki, może być strona internetowa, albo napisane w komentarzu, ponieważ nie mogę nic sensownego znaleźć, nawet na stronie cplusplus.com...

1 odpowiedź

+1 głos
odpowiedź 20 stycznia 2017 przez criss Mędrzec (172,590 p.)
wybrane 20 stycznia 2017 przez heros22pt
 
Najlepsza
Zwracałem ci na to uwage w twoim poprzednim pytaniu.

Możesz zwracać wskaźnik na znaleziony element (jeśli został znaleziony) albo nullptr jeśli nie został znaleziony (jeśli find_if nic nie znalazła, to zwraca iterator na element za ostatnim elementem - to samo co zwracają metody .end() kontenerów STL). Albo po prostu zwracać od razu to co zwróciła find_if - iterator. W obu przypadkach masz szanse sprawdzić czy wartość zwróconą przez twoją funkcje powinieneś dereferencjować (tak sie mówi? :D). W przypadku wskaźnika przyrównując do nullptr, a w przypadku iteratora przyrównując do przeszukiwanyKontener.end().
komentarz 20 stycznia 2017 przez heros22pt Użytkownik (950 p.)

nie do końca rozumiem. Przepraszam że zajmuję Ci czas takimi pytaniami, ale mógłbyś spojrzeć do tego kodu?

#include<iostream>
#include<cstdlib>
#include<ctime>
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;

struct Dziecko
{
	string nazwisko;
	string imie;
	int x;
	int y;
};
string losuj_imie(string losowe_imie)
{	
	for (int i = 0; i < 6; ++i)
	{
		losowe_imie[i] = rand() % ('Z' - 'A') + 'A';
	}
	return losowe_imie;
}
void wyswietl_liste(vector<Dziecko> Lista)
{
	for (int i = 0; i < 5; ++i)
	{
		cout << Lista[i].nazwisko << "  -  ";
		cout << Lista[i].imie << "  -  ";
		cout << Lista[i].x << "  -  ";
		cout << Lista[i].y << endl;
	}
}
float odleglosc(int x, int y)
{
	return sqrt(x*x + y*y);
}
bool czy_dalej(Dziecko &a, Dziecko &b)
{
	float odl1, odl2;
	odl1=odleglosc(a.x, a.y);
	odl2 = odleglosc(b.x, b.y);

	if (odl1 < odl2)
		return true;
	else
		return false;
}

bool ktore_nazwisko_pierwsze_wg_alfabetu(Dziecko &a, Dziecko &b)
{
	if (a.nazwisko<b.nazwisko)
	{
		return true;
	}
	else
	{
		if (a.nazwisko == b.nazwisko)
		{
			if (a.imie < b.imie)
			{
				return true;
			}
			else return false;
		}
		else return false;
	}
		//return false;
}
void sortuj_wg_alfabetu(vector<Dziecko> &lista)
{
	sort(lista.begin(), lista.end(), ktore_nazwisko_pierwsze_wg_alfabetu);

}
bool predykat_do_find_if(Dziecko a)
{
	if (sqrt((a.x)*(a.x) + (a.y)*(a.y)) < 10)
	{
		return true;
	}
	else return false;
}
Dziecko dzieci_ktore_sa_blizej_niz_10(vector<Dziecko>&ListaDzieci)
{
	//Dziecko itr;
	auto itr = find_if(ListaDzieci.begin(), ListaDzieci.end(), predykat_do_find_if);
	if (itr != ListaDzieci.end())
	{
		return *itr; //chyba nie tak
	}
}
int main()
{
	srand(time(NULL));
	string imieD="      ";
	vector<Dziecko> Lista_dzieci;
	Dziecko testowa_zmienna;
	for (int i = 0; i < 5; ++i)
	{
		testowa_zmienna.imie = losuj_imie(imieD);
		testowa_zmienna.nazwisko = losuj_imie(imieD);
		testowa_zmienna.x = rand() % 20;
		testowa_zmienna.y = rand() % 20;

		Lista_dzieci.push_back(testowa_zmienna);
	}
	wyswietl_liste(Lista_dzieci);
	sort(Lista_dzieci.begin(), Lista_dzieci.end(), czy_dalej);
	cout << endl << "Po Posortowaniu wzgledem odleglosci: " << endl;
	wyswietl_liste(Lista_dzieci);

	//zadanie a
	sortuj_wg_alfabetu(Lista_dzieci);

	cout << endl << "Po Posortowaniu wzgledem nazwiska i imienia: " << endl;
	wyswietl_liste(Lista_dzieci);

//	//zadanie b
//	vector<Dziecko> dziecko{};
	Dziecko dziecko_ponizej_10;
	dziecko_ponizej_10=dzieci_ktore_sa_blizej_niz_10(Lista_dzieci);

	cout <<endl<< dziecko_ponizej_10.nazwisko << "  -  " << dziecko_ponizej_10.imie << "  -  " << dziecko_ponizej_10.x << "  -  " << dziecko_ponizej_10.y;;
	system("pause");

}

Program za każdym razem losuje nowe współrzędne, więc raz są współrzędne spełniające predykat, a innym razem nie. Może jak by ktoś mi to pokazał na przykładzie to bym zrozumiał

komentarz 20 stycznia 2017 przez criss Mędrzec (172,590 p.)
edycja 20 stycznia 2017 przez criss

Zmodyfikuj funkcje dzieci_ktore_sa_blizej_niz_10 tak, żeby zwracała któreś z tych wymienionych przeze mnie (wskaźnik / iterator).

std::vector<Dziecko>::iterator dzieci_ktore_sa_blizej_niz_10(vector<Dziecko>&ListaDzieci)
{
    return find_if(ListaDzieci.begin(), ListaDzieci.end(), predykat_do_find_if);
}

Następnie (modyfikuje twój kod z maina):

    auto dziecko_ponizej_10 = dzieci_ktore_sa_blizej_niz_10(Lista_dzieci);
 
    if(dziecko_ponizej_10 != Lista_dzieci.end())
       cout <<endl<< dziecko_ponizej_10->nazwisko << "  -  " << dziecko_ponizej_10->imie << "  -  " << dziecko_ponizej_10->x << "  -  " << dziecko_ponizej_10->y;

I nie przepraszaj :P Od tego jest forum, a mnie nikt nie zmusza do pomagania.

edit: lekko edytowałem kod, w ifie był == zamiast !=

opcja ze wskaźnikami:


Dziecko * dzieci_ktore_sa_blizej_niz_10(vector<Dziecko>&ListaDzieci)
{
    auto it = find_if(ListaDzieci.begin(), ListaDzieci.end(), predykat_do_find_if);
    if(it == ListaDzieci.end())
      return nullptr;
    return &(*it);
}

    if(Dziecko * dziecko_ponizej_10 = dzieci_ktore_sa_blizej_niz_10(Lista_dzieci))
       cout <<endl<< dziecko_ponizej_10->nazwisko << "  -  " << dziecko_ponizej_10->imie << "  -  " << dziecko_ponizej_10->x << "  -  " << dziecko_ponizej_10->y;

 

Podobne pytania

0 głosów
1 odpowiedź 195 wizyt
pytanie zadane 14 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)
0 głosów
1 odpowiedź 235 wizyt
pytanie zadane 18 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)
0 głosów
1 odpowiedź 123 wizyt

92,543 zapytań

141,386 odpowiedzi

319,500 komentarzy

61,929 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!

...