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

jak zebezpieczyć funkcję w c++

VPS Starter Arubacloud
0 głosów
137 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ź 194 wizyt
pytanie zadane 14 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)
0 głosów
1 odpowiedź 234 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,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...