Szukanie elemetów w tablicy


(Bolkowice10) #1

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.


(P) #2

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ć?


(Bolkowice10) #3

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.


(P) #4

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".


(Bolkowice10) #5

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


(P) #6

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…


(Bolkowice10) #7

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,


(P) #8

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,


(Bolkowice10) #9

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


(P) #10

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".


(Bolkowice10) #11
#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....


(P) #12
  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.


(Bolkowice10) #13

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;

}

(P) #14

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".


(Bolkowice10) #15

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;

}

(P) #16

Ok, ok, sorki…

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

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


(Bolkowice10) #17

PROBLEM ROZWIĄZANY! DZIĘKUJE pskosinki BARDZO!


(P) #18

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…


([alex]) #19

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).