Szukanie elemetów w tablicy

Witam Was! Mam taki problem odnosnie tablic. Mam wpisac iles tam liczb i mam sprawdzic czy jakas liczba jest 2 razy wieksza od jakies liczby która wystąpila poprzednio.Myśle że trzeba to zrobic na tablicach ale się kompletnie zawiesiłem… nie proszę o rozwiązanie proszę o wskazówki.

Jaki język programowania…?

I właściwie w czym jest problem? Zadanie brzmi dokładnie tak? Bo w zależności od języka można to zrobić na parę mniej czy bardziej skomplikowanych sposobów.

Dajmy na to, że wpisujesz, 3, 2, 5, 6, no i mamy liczbę która jest dwa razy większa od pierwszej wprowadzonej liczby. Co wtedy trzeba zrobić?

Język C++ zapomniałem dodac. moze byc tez taki ciag: 2,3,5,6 i tez bedzie poprawna odpowiedz, bo drugi element jest 2 razy mniejszy od ostatniego w tym przypadku. Zadanie brzmi mniej więcej tak w skrócie: trzeba podac n liczb i jesli jakas liczba jest 2 razy wieksza od poprzednich to ma wyświelic napic TAk, jesli tak nie jest to napis NIE.

n jest określone? Jeżeli tak to jest nieco prościej.

Zainteresuj się wektorami. Tworzysz wektor liczb całkowitych, pobierasz ile liczb zostanie wprowadzonych do zmiennej n. Pobierasz pierwszy element, dodajesz do wektora. Potem w pętli od 0 do n-1 pobierasz liczby i dodajesz do wektora. Po pobraniu (jeszcze w tej głównej pętli) deklarujesz zmienną straznik = 0 i robisz kolejną pętlę od 0 do aktualnego rozmiaru wektora - 1 i sprawdzasz w niej czy aktualnie pobrany element jest dwukrotnie większy od jakiegoś poprzedniego. Jeżeli tak to wyświetlasz TAK, ustawiasz zmienną straznik na 1 i robisz break. Jak poza pętlą zmienna straznik będzie miała nadal wartość 1 to wiesz, że nie znaleziono dwukrotnie większej liczby i wyświetlasz “NIE”.

hohoho chyba to nie ten level jak dla mnie :stuck_out_tongue_winking_eye: zaczynam programowanie… z przymusu niestety

Może źle opisałem… nie mam do tego talentu. ^^

Wektor to po prostu tablica o niezadeklarowanej długości, o ile mogę to tak opisać.

Posługujesz się tym tak:

vector liczby;

int a;

cin >> a;

liczby.push_back(a);

for (int i = 0; i < liczby.size(); i++) {

    cout << liczby[i] << endl;

}

Na początek może spróbuj zrobić to bez strażnika, tzn. jedynie wypisywanie “TAK”, to nieco “narusza” logikę, bez tego może być na początek łatwiej. ^^

Z czymś konkretnym masz problem?

Może ktoś inny lepiej wytłumaczy, albo poda lepszy sposób…

Pomysł bardzo fajny, bo ogólnie juz cos czytałem na ten temat, jednak mam prowadzacego jakiego mam i wymaga zebysmy używali tylko tego co było omawiane na wykładzie. Wiec wektorów nie mielismy… same petle i tablice,

Nieco się zapędziłem. :wink: Nie wiedziałem czy liczba elementów jest określona i napisałem o wektorze, ale z tego co później zrozumiałem, to na początku podajesz jaka jest liczba elementów, tak? Jeżeli tak to opis będzie taki sam z tym, że musisz zamienić słowo wektor na tablica. :stuck_out_tongue: I tablicę musisz stworzyć po pobraniu liczby jej elementów,

1.podaje liczbe n.

  1. wpisuje wartosci dla n

  2. sprawdzam czy jakas liczba jest 2 razy większa od poprzednich

przykłady wygladają tak.

Przykład nr 1

Dla danych wejściowych:

4

5000

2000

7000

1000

poprawną odpowiedzią jest:

NIE

Przykład nr 2

Dla danych wejściowych:

4

1000

5000

7000

2000

poprawną odpowiedzią jest:

TAK

Ah… to co innego niż myślałem, prostsze. No i ogólnie to o czym mówi Description_1.

Pobierasz liczbę elementów tablicy, n.

Deklarujesz tablicę o n elementach.

Pobierasz do tablicy n liczb.

Deklarujesz zmienną straznik = 0

Robisz pętlę od i = 1 do n, w niej pętlę od j = 0 do i, a w niej sprawdzasz czy liczby == liczby[j] * 2

Jeżeli tak to ustawiasz straznik = 1, robisz break. Po wyjściu z drugiej pętli jesteś w pierwszej, sprawdzasz czy straznik == 1, jeżeli tak to robisz break.

Już poza pętlami sprawdzasz czy straznik == 1, jeżeli tak to wyświetlasz “TAK”, w przeciwnym wypadku “NIE”.

#include 

using namespace std;

int T[100];

int main()

{

int n,straznik;

cin>>n;

for(int k=0;k
{

cin>> T[k];

}

straznik=0;

for (int i=1;n;i++)

{

	for(int j=0;i;j++)

	{

	if (T[i]==T[j]*2)

	straznik=1; break;

	}

}

if (straznik=1)

cout<<"TAK!"<
else

cout<<"nie"<
return 0;

}

coś takiego napisałem, ale to cos mi nie gra…

  1. To:

    for (int i = 1; n ; i++)

powinno wyglądać tak:

for (int i = 1; i < n; i++)

Po środku ma być warunek. Jeżeli warunkiem jest po prostu liczba n, i nie jest równa 0, to warunek będzie zawsze prawdziwy. Czyli będziesz zwiększał indeks tablicy w nieskończoność i dostaniesz segfault. 2. Jeżeli chcesz umieścić w instrukcji warunkowej więcej niż jedną instrukcję to musisz użyć klamerek: {} 3. Tutaj:

if (straznik = 1)

zawsze masz prawdę, przypisujesz do zmiennej 1, które zawsze będzie konwertowane na true. Użyj operatora porównania: == No i możesz zrobić małą optymalizację:

for (int i = 1; i < n ; i++) {

	for(int j = 0; j < i ; j++) {

		if (T[i] == T[j]*2) {

			straznik=1; break;

		}

	}

	if (straznik == 1) break;

}

Jak znalazłeś coś co pasuje to nie ma potrzeby sprawdzać pozostałych liczb.

Jeżeli chodzi o tablicę… Mógłbyś najpierw pobrać liczbę elementów, a potem zadeklarować tablicę używając zmiennej. Z tym że o ile większość kompilatorów, o ile nie wszystkie, to obsługują o tyle nie jest to częścią standardu. Jak musisz pisać zgodnie ze standardem to musisz albo zadeklarować tyle elementów żeby Ci wystarczyło (jak zrobiłeś), albo stworzyć dynamiczną tablicę używając wskaźników.

poprawiłem błedy i niestety dla w/w przykładu 2 nie działa…

#include 

using namespace std;

int T[100];

int main()

{

int n,x;

cin>>n;

for(int k=0;k
{

cin>> T[k];

}

x=0;

for (int i=1;i
{

	for(int j=0;i;j++)

	{

	if (T[i]==T[j]*2)

	x=1; break;

	}

}

if (x==1)

cout<<"TAK!"<
else

cout<<"NIE!"<
return 0;

}

Nie umieściłeś ifa w klamrach:

if (T[i]==T[j]*2) {

   x=1; break;

}

Nie ma znaczenia że podajesz instrukcje w jednej linii, jeżeli chcesz podać więcej niż jedną to musisz użyć klamer.

Edit.

Ah, czekaj… Nie poprawiłeś warunku w drugiej pętli. Powinno być “j < i”, nie “i”.

poprawiłem to i po wpisywaniu liczb program wysiada…

#include 

using namespace std;

int T[100];

int main()

{

int n,x;

cin>>n;

for(int k=0;k
{

cin>> T[k];

}

x=0;

for (int i=1;i
{

	for(int j=0;i;j++)

	{

	if (T[i]==T[j]*2)

	{

		x=1; break;

	}

	}

}

if (x==1)

cout<<"TAK!"<
else

cout<<"NIE!"<
return 0;

}

Ok, ok, sorki…

Nie zauważyłem, że poprawiłeś warunek tylko w pierwszej pętli.

W drugiej powinno być: “j < i”, nie “i”.

PROBLEM ROZWIĄZANY! DZIĘKUJE pskosinki BARDZO!

Podany przeze mnie algorytm wypisuje tylko “TAK”…? Bez strażnika (co poleciłem na początek by było prościej), tak, ze strażnikiem wypisuje także “NIE”. Dla mnie działa…

Jeżeli jest podane ograniczenie na same liczby wstępujące w tym ciągu i nie jest to duży zakres to można znacznie uprościć program zmieniając złożoność do O(n).