logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak znaleźć indeks największej wartości w tablicy w C++?

neo_dc 04 Lis 2006 08:59 5978 33
Najlepsze odpowiedzi

Jak w C++ znaleźć indeks największego elementu w tablicy i przepisać go na końcową pozycję podczas sortowania przez wybieranie?

Najprościej nie kopiować elementu do drugiej tablicy, tylko znaleźć indeks maksimum, zapamiętać go w zmiennej pomocniczej i potem zamienić wartości miejscami za pomocą tymczasowej zmiennej [#3186062][#3189516] Przejdź pętlą po tablicy od początku do aktualnej granicy `j`, trzymaj w `ml` chwilowe maksimum oraz w `m` jego indeks; gdy znajdziesz większy element, ustawiasz `ml` i `m` na jego wartość i pozycję [#3189516] Po zakończeniu przeszukiwania robisz zamianę: `pom = tab[j]; tab[j] = tab[m]; tab[m] = pom;`, a potem zmniejszasz zakres i szukasz dalej od końca [#3189516] Nie uzależniaj algorytmu od tego, że liczby są z zakresu 0–999, bo sortowanie ma działać dla dowolnych danych; dlatego zamiast porównywać do `m=999`, użyj zmiennej maksimum i indeksu maksimum [#3189020]
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
  • #1 3185689
    neo_dc
    Poziom 32  
    Posty: 2206
    Pomógł: 178
    Ocena: 211
    Witam, nie wiem czy to odpowiedni dział, ale proszę o pomoc...

    Jestem początkującym programistą i dostałem takie zadanie domowe, nie mogę sobie poradzić z kawałkiem zadania.

    
    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    main()
    
    {
        	int i;
        	int tab[1000];
    	int j;
    	
    
    
    srand(30001);
    	for(i=0;i<=999;i=i++)
    		{
    		tab[i]=rand()%1000;
    		cout << tab[i]<<" ["<<i<<"] ";
    		}
    
    cout<<"\n-----------------------------------------------------------------------------------\n";
    
    
    
    int m;
    i=0;
    m=999;
    int tab2[1000];
    
    do {
    	
    
    	for (i=0;i<=999;i++)			
    	{
    		cout<<tab[i]<<" ";
    	
    			if (tab[i]==m)		//jesli wartosc rowna sie m
    			{
    			cout<<"tak , jest to index "<<i<<" ";
    			cout<<" m wynosi "<<m<<"\n";
    			
    			
    			
    						
    	}
    
    
    	else	{				//jesli sie nie rowna	
    	cout<<"nie, jest to index "<<i<<" ";					
    	cout<<"m wynosi "<<m<<"\n";
    		}
    
    
    
    }
    m=m--;						//odejmij od m 1
    j=j++;
    cout<<" m rowna sie "<<m;
    }
    while (m>0);					//rob dopoki m bedzie wieksze od 0
    
    cout<<"\n\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n";
    }
    
    
    
    


    Jak widać program generuje tablice o 1000 elementach z przedziału od 1 do 999.
    Ta część poszła mi ok. Teraz mam tę tablicę posortować takim algorytmen, że znajduję największy element w tablicy, daję mu indeks 999, potem o jeden mniejszy, on dostaje indeks 998 itd aż znajdę ostatni najmniejszy element ( czyli tablica wynikowa powinna być po kolei od 1 do 999 ).

    Ze znalezieniem elementów nie mam problemu.

    Natomiast chcę zrobić takie coś, że:
    - jeśli dany element = m ( np. te 999 ), to
    - jego wartość przypisz elementowi o indeksie 999 tablicy o indeksie j ( tablica [j] )
    - po tym odejmij od m jedynkę, dodaj do j jedynkę i ponów wyszukiwanie
    - rób dopóki m>0

    Z odjęciem od m jedynki nie ma problemu, cały program pięknie szuka mi elementów ( jako pomoc tutaj zastosowałem sobie, ze wypisuje mi czy element jest równy m czy też nie i podaje jego indeks ).

    Nie wiem natomiast jak przypisać ( skopiować, nie wiem jak to powiedzieć ) element właśnie znaleziony do nowej tablicy tablica[j].

    Mam nadzieję, że dało się mnie zrozumieć :)
    Proszę o pomoc bo juz siedzę cały dzień nad tym :(
  • REKLAMA
  • #2 3186062
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    troszkę zagmatwałeś sprawę... tab2 jest zbędna - kiedy znajdziesz największy element wpisujesz do zmiennej pomocniczej zawartość komórki do której wstawiasz. teraz do tej komórki wstawiasz to co znalazłeś, a do tej znalezionej wstawiasz z pomocniczej (zamiana wartości poprzez pomocniczą zmienną, żeby nic nie stracić).
    wstawiasz od końca, więc za każdym razem przeszukujesz o jeden element od końca mniej (czyli od i do m).
    pomyśl nad tym, zadanie nie jest takie trudne:) jeśli naprawdę nic nie zadziała, to będę podpowiadał dalej (nie chcę dawać od razu gotowca, masz się sam nauczyć).
    poza tym nie trzeba pisać m=m-- wystarczy m--.
    polecam korzystanie z debuggera - wstawiasz sobie breakpoint i obserwujesz jak się zachowują zmienne w czasie działania programu.
  • REKLAMA
  • #3 3187296
    Łuk_F
    Poziom 17  
    Posty: 257
    Pomógł: 34
    Ocena: 12
    Witam

    Z tego co napisałeś rozumiem że tablic masz posortować przez wybieranie http://pl.wikipedia.org/wiki/Sortowanie_przez_wybieranie

    Co do opisu to źle napisałeś:
    Cytat:
    Teraz mam tę tablicę posortować takim algorytmen, że znajduję największy element w tablicy, daję mu indeks 999, potem o jeden mniejszy, on dostaje indeks 998 itd aż znajdę ostatni najmniejszy element ( czyli tablica wynikowa powinna być po kolei od 1 do 999 ).

    Skąd wiesz że następny element po maksymalnym będzie o jeden mniejszy jak zawartość tablicy jest losowana.
  • #4 3188747
    neo_dc
    Poziom 32  
    Posty: 2206
    Pomógł: 178
    Ocena: 211
    Nie wiem, że następny element będzie mniejszym, ale program działa tak, że przeszukuje za każdym razem całą tablicę.

    Co do tej zmiennej pomocniczej popracuję nad tym i sprawdzę czy mi zadziała.
  • #5 3188794
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    sęk w tym że nie może przeszukiwać całej tablicy, bo zawsze znajdzie ten sam, największy element.
    polecam zrobić tak jak wczesniej napisałem, przeszukiwanie od i do m jest sensowne, bo m co przebieg zmniejszasz, a to co za m zapełniałbyś już znalezionymi.
    do tego sugeruję nie robić porównania ==, tylko sprawdzać czy < lub > - wtedy zapisujesz sobie element który jest dowolnie większy od aktualnego najwyższego.
  • #6 3188939
    neo_dc
    Poziom 32  
    Posty: 2206
    Pomógł: 178
    Ocena: 211
    int m;
    i=0;
    m=999;
    k=0;
    int n=0;
    
    do {
    	
    
    	for (i=0;i<=999;i++)			//dla calej tablicy
    	{
    		cout<<tab[i]<<" ";
    	
    			if (tab[i]==m)		//jesli wartosc rowna sie m
    			{
    			cout<<"tak , jest to index "<<i<<" ##### ";
    			cout<<" m wynosi "<<m<<"\n";
    			k=tab[999-n];		//przypisuje zmiennej k zawartosc komorki do ktorej mam wpisac
    			tab[999-n]=m;		//zapisuje znaleziona wartosc w komorce
    			tab[i]=k;
    			cout<<" tab[999 - n ] = "<<k<<"\n";
    			
    			k++;
    			n++;
    			
    						
    	}


    Bez sensu :/
    Nie działa heh :/
    Program nie znajduje caly czas tej samej wartosci bo odejmowana jest od licznika jedynka ( za pierwszym obiegiem ma znalezc 999, za drugim 998 itd... ).
  • #7 3189020
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    źle się do tego zabierasz. wiesz, że w tablicy są wartości z zakresu 0-999 i korzystasz z tego, a tak być niepowinno. nie możesz uzależniać w ten sposób algorytmu od wpisanych danych, bo jeśli wrzucisz np 1001 to program się posypie. algorytm sortowania musi być uniwersalny.
    domyślam się że obcięta końcówka to
    m--
    } while (m>0); (co w zasadzie można zastąpić przez } while(--m)
    pętle są ok, masz problem w tym wyszukiwaniu. zrób tak jak radziłem - wprowadzasz zmienną zawierającą chwilową maksymalną wartość, nazwijmy ją max. w warunku sprawdzasz czy to co masz w danym elemencie tablicy jest większe. jeśli jest większe, to uaktualniasz max oraz zapisujesz sobie indeks tego elementu (do jakiejś zmiennej, powiedzmy ind). tak przechodzisz całą tablicę od i do m (czyli musisz poprawić swojego for). jak już przejdziesz, to robisz zamianę - pod element tablicy o indeksie m (czyli już nie użyty w wyszukiwaniu, a nie zawierający posortowanego elementu, bo dekrementowaliśmy m po poprzednim sortowaniu) wpisujesz element z tablicy o indeksie ind, a do elem. o indeksie ind, to co w elemncie m (oczywiście poprzez zmienną pomocniczą).
    w zasadzie podałem Ci cały opis słowny algorytmu. następna moja wypowiedź to chyba gotowy kod będzie...
    ps. proponuję rozbić programik na funkcję main i funkcję wypisującą tablicę (używasz tego conajmniej 2 razy). fragment wpisujący losowe wartości też by można, ale niekoniecznie, bo robisz to tylko raz. w tym przykładzie.
  • REKLAMA
  • #8 3189376
    neo_dc
    Poziom 32  
    Posty: 2206
    Pomógł: 178
    Ocena: 211
    Heh poddałem się siedziałem pół nocy nad tym, nie nadaję się na programiste nie umiem logicznie myśleć chyba :/

    
    #include <cstdlib>
    #include <iostream>
    using namespace std;
    
    const int n = 1000; // zadana liczba elementów w sortowanym zbiorze
    
    // funkcja porównująca
    bool mniejsze(int x, int y)
    {
      return x < y;
    }
    
    int main(int argc, char *argv[])
    {
      size_t i, j, t;
      int x, a[n], b[n];
    
      // 
      // tworzenie przykładowej tablicy z przypadkową zawartością
      // tablica b[] służy do zapamiętania stanu a[]
      srand(30001);
      for (i = 0; i < n; i++)
        a[i] = b[i] = rand()%1000;
    
      // 
      // właściwe sortowanie
      for(i = 0; i < n - 1; i++)
      {
        t = i;
        for (j = i + 1; j < n; j ++)
          if (mniejsze(a[j], a[t]))
            t = j;
        x = a[t]; 
        a[t] = a[i]; 
        a[i] = x;
      }
    
      // 
      // wyświetlanie wyników
      cout << "Sortowanie przez wybieranie\n"
           << "  lp    przed       po\n"
           << "------------------------" << endl;
      for(i = 0; i < n; i++)
      {
        cout.width(4); cout << i + 1;
        cout.width(9); cout << b[i];
        cout.width(9); cout << a[i] << endl;
      };
      cout << endl;
    
      return 0;
    }


    To działa, przerobiłem tylko żeby generowało moją tablicę...
    Mój kolega zrobił to bez funkcji, nie wiem najwyżej dostane 2 :|
  • Pomocny post
    #9 3189516
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    to co wrzuciłeś nie jest do końca zgodne z założeniami jakie podałeś na początku... spójrz na to (pomijam zbędne części, jest tu tylko odpowiedni algorytm):
    int m=0, ml, pom; 
    i=0;
    	for(int j=999;j>=0;j--)
    	{
    		ml=0;
    		for (i=0;i<j;i++)          
    			if (tab[i]>ml)
    				ml=tab[m=i];
    		pom=tab[j];
    		tab[j]=tab[m];
    		tab[m]=pom;
    	}

    ml - zmienna przechowująca maksimum chwilowe
    m - indeks elementu tablicy zawirający ml
    działanie jest dokładnie takie jak opisałeś - wstawianie od końca.
    jeśli za zadanie miałeś po prostu napisać program sortujący, to polecam poszukać algorytmu sortowania Shella.
  • #10 3192590
    neo_dc
    Poziom 32  
    Posty: 2206
    Pomógł: 178
    Ocena: 211
    Dziękuję, jutro się temu dokładnie przyjrzę, dzisiaj już nie mam sił :) Jakby co to jeszcze będę pytał, wbrew pozorom to gotowce nie ułatwiają życia, wolę coś rozumieć chociaż :D
  • #11 3192625
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    nie ma za co, to też trening dla mnie:)
    nie wiem z jakiego środowiska korzystasz, ale tak jak napisałem wcześniej, wrzuć sobie brakpoint na początku algorytmu i po kolei obserwuj jak się zmieniają zmienne i jak całość działa. jest to moim zdaniem świetna rzecz zarówno do nauki jak i do znajdywania błędów, bo masz wszystko jak na dłoni.
    pozdrawiam i powodzenia, czekam na pytania:)
  • #12 3192750
    neo_dc
    Poziom 32  
    Posty: 2206
    Pomógł: 178
    Ocena: 211
    korzystam ze standardowego kompilatora w fedora core..

    Ten breakpoint to przydatne jest, jak to " włączyć" ? :D

    Dobra idę spać już do jutra i dziekuje jeszcze raz :)
  • #13 3192794
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    hm, nie znam na tyle linuksa i jego oprogramowania. nie jestem pewny, czy nie będziesz potrzebował dodatkowego softu do debugowania.
    breakpoint to punkt w którym mówisz kompilatorowi (czy tam debugerowi, nie znam szczegółów) by przerwał wykonywanie programu. od tego momentu sam sterujesz przebiegiem programu - możesz kazać przejść do następnej linii kodu, wejść w głąb funkcji itd. dodatkowe okienko pozwala obserwować każdą aktualnie potrzebną zmienną, zajrzeć do zawartości tablicy itd.
    ja sam korzystam z visual studio 2005 pro (czyli pod windowsami).
  • #14 3200667
    Svisstack
    Poziom 14  
    Posty: 60
    Pomógł: 8
    Potrzebujesz GNU Debuggera; jezeli korzystasz z pakietow binarnych to
    apt-get update && apt-get install gdb

    A jezeli chcesz instalowac ze zrodel to:
    wget -v http://ftp.gnu.org/gnu/gdb/gdb-6.5.tar.gz && tar -xvzf ./gdb-6.5.tar.gz && cd gdb* && ./configure && make && sudo make install

    Wydaje mi sie ze przyda ci sie tez do tego manual:
    http://sources.redhat.com/gdb/current/onlinedocs/gdb_toc.html

    Program odpalasz komenda:
  • #15 3201508
    Azucena
    Poziom 11  
    Posty: 8
    Witam
    Dołącze swoje pytanie do tego posta.

    Dostałam zadanie aby napisać w języku c++, tablice dwuwymiarową 2x2, wyznaczyć jej max, a elementy podaje użytkownik.

    Proszę o pomoc, bo akurat tej tablicy nie umię napisać.
  • #17 3201823
    Azucena
    Poziom 11  
    Posty: 8
    tablica czego czego ??

    Czyli jest to niepełne zadanie ??

    Myśle że int czegoś innego się nie uczyliśmy
  • #18 3203193
    neo_dc
    Poziom 32  
    Posty: 2206
    Pomógł: 178
    Ocena: 211
    Witam :)

    Jak narazie kumam mniej wiecej o co chodzi (bynajmniej tak mi sie wydaje :D ).

    A int to rodzaj zmiennej :)
  • #19 3208871
    Azucena
    Poziom 11  
    Posty: 8
    Jak na razie mam same błędy nie wiem dlaczego biblioteki nie chcą mi się załadować

    #include <iostream.h>
    #include <conio.h>
    int main()
    {
    int tab[2][2];
    int max[tab];
    int n,i;
    for(int i=0; i<tab; i++);
    cout<<"Tablica została zainicjowana liczbami:\n"<<endl;

    cout<<"Najwieksza wartosc z tablicy to:"<<max(tab)<<endl;
    return 0;
    }

    Pokazuje mi że nie otwiera bibliotek, nie rozpoznaje endl i cout, jak dobrze rozumię jeszcze ejst mulitdeklaracja dla "i".

    Muszę zrobić tabele 2x2 , wypełnić ją i wyznaczyć z niej max.
  • #20 3209416
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    Azucena -> skoro piszesz w c++, to nazwy bibliotek bez .h.
    musisz też po nich dodać
    using namespace std;

    poza tym po co Ci conio.h? jeśli chodzi o funkcję max, to zamiast dołączać bibliotekę napisz własną funkcję - nic trudnego.
  • #21 3212907
    Azucena
    Poziom 11  
    Posty: 8
    Koleżanka poradziła użycie conio , ale z tego co przeczytałam jest to już trochę przestarzała biblioteka, właśnie nie wiem jaką funkcję użyć , może while , bo chyba for jest złym pomysłem ??
    Ale jeżeli while nie wiem wtedy jak napisać funkcje i żeby ona działała poprawnie razem z funkcją max.
    Najpierw pierwsza funkcja wypełniająca tabele , czyli używam for, druga to max, czy istnieje sposób aby była tylko jedna funkcja która wypełnia liczbami i zarazem oblicza max ??

    #include <iostream> (znowu nie widzi mi biblioteki , a dziwne że bez .h pierwszy raz się z tym spotykam)
    using namespace std; (prosi mnie abym wpisała oczekiwaną nazwę, nie znam tego polecenia, jeszcze nie mieliśmy go))
    int main()
    {
    int tab[2][2];
    int max[tab];( coś tu brakuje aby dobrze funkcjonowało, nie wiem zła deklaracja max który musi się odnosić do tablicy)
    int n,i;
    for(int i=0; i<tab; i++); (A tu wielokrotne użycie i , przecież musze jakoś ją wypełnić , i tu pomysł aby użyć while)
    cout<<"Tablica została zainicjowana liczbami:\n"<<endl;
    (i znowu mi nie rozpoznaje endl i cout, czy źle to napisałam czy poprostu błąd tclite)
    cout<<"Najwieksza wartosc z tablicy to:"<<max(tab)<<endl;
    return 0;
    }
    (i na końcu mi pisze że chociaż zdeklarowałam max i i nigdy ich nie użyłam przecież napisałam funkcje z ich użyciem)

    Jestem bardzo słaba w c++ , próbowałam to porównac z zadaniami z turbo pascalu, ale nawet nie mogłam sobie tego wyobraźić . Proszę bardzo o szczegółowe instrukcje , albo chociaż o mały poprawny zarys programu, abym chociaż nie miała problemów z deklaracją bibliotek.
  • #22 3213775
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    bez .h bo tak mówi standard języka, podobnie ma się sprawa z tą drugą linią, mówi ona, że używasz poleceń z biblioteki standardowej, bez tego musiałabyś pisać np std::cout itd.
    przez tabelkę musisz przejść zarówno przez wiersze jak i przez kolumny, więc musisz zagnieździć for w for - coś takiego (tylko przykład, warunek wymyślony):
    for(int i=0;i<10;i++)
    {
    for(int j=0;j<10;j++)
    {
    tab[j][i];
    }
    }

    klamry są zbędne w tym wypadku, dałem je by było widać co jest gdzie.
    źle zabierasz się za wartość maksymalną - wystarczy zainicjować zmienną typu int (int max;). faktycznie możesz zrobić jej wyszukiwanie już w chwili wstawiania - robisz sprawdzenie (if (warunki)) czy wartość w max jest mniejsza od wpisanej, jeśli tak to wpisujesz do max nową wartość, jeśli nie to nie robisz nic i czekasz na kolejną wartość. przy takim podejściu nie potrzebujesz żadnej funkcji szukającej max.
    napisz z jakiego kompilatora korzystasz, może on robi problem - korzystam z visual studio 2005 (a wcześniej 6) oraz znam borland c++ builder i nie miałem z nimi problemów. borlanda można probrać za darmo w wersji personal (www.borland.com).

    jeśli będziesz potrzebować czegoś bardziej konkretnego (czytaj: więcej konkretnego kodu), to coś z siebie wyprodukuję w wolnej chwili:).
  • #23 3214131
    Azucena
    Poziom 11  
    Posty: 8
    Ja używam tclite, a może to winna programu że mi nie rozpoznaje, ściągne borlanda.
  • REKLAMA
  • #24 3214316
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    używasz antycznego oprogramowania:) poza tym nie jest on przystosowany do C++ (nie w pełni, zgodnie z tym co na stronie pisze).
    od razu Ci napiszę: jak już odpalisz borlanda, daj File -> close all. później daj file -> new -> other -> console wizard. dalej powinno być zaznaczone c++ (nie wiem do czego służy VCL, jeśli zostawisz zaznaczone będziesz musiała mieć te dyrektywy preprocesora, które zobaczysz po utworzeniu pliku).
    jeśli mam być szczery, to nie lubię borlanda, tworzenie projektu i zarządzanie nim jest trochę toporne (tak to odbieram, może po prostu się nie znam na środowisku). dlatego jeśli masz możliwości zdobądź wspomniany wcześniej visual studio (wersja 6 jest ok, choć czasem (bardzo rzadko) może robić problemy - nie jest w pełni zgodna z C++, wersja 2005 jest dla mnie bardzo przyjazna:) ).
  • #25 3252348
    neo_dc
    Poziom 32  
    Posty: 2206
    Pomógł: 178
    Ocena: 211
    Witam to znowu ja...

    Natrafiłem na kolejny problem...

    Takie polecenie:

    W tablicy n-elementowej ( n<= 10000000 ) znaleźć długość podciągu kolejnych niemalejących elementów, oraz jeśli możliwe to zwrócić podciąg o tej długości..

    Zrobie sobie tablice 10 mln komorek i co dalej ?

    Wiem pewnie dla was problem idiotyczny ale ja nie mam tego daru myslec az tak stricte logicznie :(
  • #26 3252479
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    żeby było jasne... przykładowo mamy ciąg:
    35052498273884237979
    i program powinien zwrócić:
    35 (długość 2)
    05 (2)
    249 (3)
    8 (1)
    27 (2)
    388 (3)
    4 (1)
    2379 (4)
    ?
    jeśli tak, to:
    robisz sobie zmienną indeks. do indeks wpisujesz numer komórki tablicy.
    teraz pętlą przechodzisz przez całość tablicy, porównując każdą komórkę z zawartością komórki następnej. jeśli jest następna większa lub równa to idziesz dalej. i wracasz do "przeglądania".
    jeśli następna jest mniejsza od aktualnej komórki to znaczy że podciąg niemalejący się skończył - teraz wypisujesz tablicę od komórki o indeksie zapisanym w zmiennej indeks aż do aktualnego indeksu (albo tworzysz kolejkę (dynamicznie, na wskaźnikach), a wypisujesz na końcu), różnica indeksów (+1) będzie dawać długość. do indeks wpisujesz teraz indeks komórki z którą porównywałeś i była ona mniejsza (w ten sposób jakby zaczniesz szukać nowego podciągu) i wracasz do przeglądania tablicy.

    troszkę zamieszane, ale chyba idea jest w miarę jasna:).
    nie musisz myśleć jakoś nie wiem jak logicznie, wystarczy że sobie siądziesz z kartką na kolanach, narysujesz sobie przykładową tablicę i zaczniesz sobie rysować i pisać jak to ma działać - to bardzo pomaga na początku przy tworzeniu algorytmu czy funkcji.
  • #27 3252503
    Svisstack
    Poziom 14  
    Posty: 60
    Pomógł: 8
    neo_dc napisał:
    Witam to znowu ja...

    Natrafiłem na kolejny problem...

    Takie polecenie:

    W tablicy n-elementowej ( n<= 10000000 ) znaleźć długość podciągu kolejnych niemalejących elementów, oraz jeśli możliwe to zwrócić podciąg o tej długości..

    Zrobie sobie tablice 10 mln komorek i co dalej ?

    Wiem pewnie dla was problem idiotyczny ale ja nie mam tego daru myslec az tak stricte logicznie :(


    Nie podales jakiego podciagu, wiec zakladam ze program ma znalesc NAJDLUZSZY podciag.

    
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int a[10000000],al,bl,_bl;
    
    int max(int a, int b) { if(a>b) { return a; } return b; }
    
    int main(int argc, char *argv[])
    {
        int i,j,k,l;
        
        scanf("%d",&al);
        for(i=0;i<al;i++) { scanf("%d",&a[i]); }
    
        for(i=1,bl=0,_bl=1;i<al;i++) { 
                                   
             if(a[i-1]<=a[i]) { 
                    _bl++;
             } else { 
                    bl=max(bl,_bl);
                    _bl=0;
             }
             
        }
    
        bl=max(bl,_bl);    
        printf("Dlugosc najdluzszego wspolnego podciagu niemalejacego to: %d\n",bl);
        
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


    przerob sobie ten kod tak aby wypisywal jeszcze liczby w tym podciagu, bo ja nie mam czasu teraz musze zadania z matmy zrobic
  • #28 3253519
    neo_dc
    Poziom 32  
    Posty: 2206
    Pomógł: 178
    Ocena: 211
    kod Svisstack-a nie działa :) ale i tak dziekuje za pomoc :)

    Wiesniack dokladnie - tez tego nie wiem :D co to ma byc za ciag.... chyba najdluzszy....
    Wskaznikow jeszcze nie mialem ale zobacze co sie da zrobic...

    Dziekuje i jakby co bede wracal
  • #29 3255640
    Svisstack
    Poziom 14  
    Posty: 60
    Pomógł: 8
    neo_dc napisał:
    kod Svisstack-a nie działa :) ale i tak dziekuje za pomoc :)

    Wiesniack dokladnie - tez tego nie wiem :D co to ma byc za ciag.... chyba najdluzszy....
    Wskaznikow jeszcze nie mialem ale zobacze co sie da zrobic...

    Dziekuje i jakby co bede wracal


    Nie dziala bo zapewne nie podales danych wejsciowych czyli w pierwszej lini n, a w drugiej n liczb oddzielonych pojedynczym odstepem.
  • #30 3264302
    Azucena
    Poziom 11  
    Posty: 8
    Witam , aktualnie używam Turbo C++ teraz, bo Borlanda jeszcze mi linku aktywacyjnego nie przysłali , w zadaniu teraz mam 3 błędy :
    1. multideklaracja "i"
    w pętli for
    2. Nie rozumię ostzreżenia "Call of nonfunction in function main"
    Do tego pokazuje mi że "max", "i", "n" nie były nigdy użyte

    
    #include <iostream.h>
    int main()
    {
    int tab[2][2];
    int max;
    int n,j,i;
    for(int i=0; i<10; i++)
    {
    for(int j=0; j<10; j++)
    {
    tab[j][i];
    }
    }
    cout<<"Tablica została zainicjowana liczbami:\n"<<endl;
    
    cout<<"Najwieksza wartosc z tablicy to:"<<max(tab[j][i])<<endl;
    return 0;
    }
    


    Jednak zmniejszyłam błędy kiedy dodałam .h na koniec biblioteki

Podsumowanie tematu

✨ Dyskusja dotyczy problemu znalezienia indeksu największej wartości w tablicy w języku C++ oraz implementacji algorytmu sortowania przez wybieranie. Poruszono kwestie poprawnego przeszukiwania tablicy, unikania błędów logicznych i składniowych, takich jak niepoprawne inkrementacje czy wielokrotne deklaracje zmiennych. Zwrócono uwagę na konieczność stosowania zmiennej pomocniczej do przechowywania tymczasowych wartości podczas zamiany elementów oraz na poprawne zmniejszanie zakresu przeszukiwania, aby algorytm działał efektywnie i uniwersalnie, niezależnie od danych wejściowych. Omówiono także użycie debuggera (np. GNU Debugger - gdb) do śledzenia działania programu i wykrywania błędów. W dalszej części dyskusji pojawiły się pytania o implementację tablic dwuwymiarowych 2x2, wyszukiwanie maksymalnej wartości w takiej tablicy oraz problemy z kompilacją i użyciem bibliotek standardowych C++ (iostream, namespace std). Użytkownicy doradzali poprawne deklaracje, inicjalizacje zmiennych, zagnieżdżone pętle do iteracji po tablicach dwuwymiarowych oraz unikanie przestarzałych bibliotek (np. conio.h). Poruszono także temat znalezienia najdłuższego podciągu niemalejącego w dużej tablicy (do 10 milionów elementów) z przykładowym kodem i wyjaśnieniem logiki algorytmu. Wskazano na potrzebę podawania danych wejściowych oraz na znaczenie podstawowej znajomości języka C++ i środowiska programistycznego. W dyskusji pojawiły się rekomendacje dotyczące środowisk programistycznych, takich jak Borland C++ i Visual Studio, oraz uwagi o kompatybilności i wygodzie ich użycia.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA