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

Wybranie największej liczby z tablicy alokowanej dynamicznie

Object Storage Arubacloud
+1 głos
971 wizyt
pytanie zadane 24 czerwca 2016 w C i C++ przez niezalogowany
#include <iostream>

using namespace std;

int a;

int main()
{
	cin >> a;
	int *tablica = new int[a];
	
	for (int i = 0; i < a; i++)
	{
		cin >> tablica[i];
		if (tablica[i] % 2 == 0)
		{
			...
		}
	}

	return 0;
}

W jaki sposób mam znaleźć największą liczbę parzystą, spośród wpisanych wcześniej przez użytkownika do tablicy alokowanej dynamicznie. Następnie w przypadku pojawienia się dwóch takich samych największych liczb wybrać pierwszą i wypisać jej miejsce w tablicy.

3 odpowiedzi

+1 głos
odpowiedź 24 czerwca 2016 przez CzikaCarry Szeryf (75,340 p.)
wybrane 5 sierpnia 2016
 
Najlepsza
No to tak: Bierzesz pierwszą liczbę parzystą i zakładasz ze jest największa i zapisujesz ją do zmiennej "największą" oraz jej numer z tablicy zapisujesz w zmiennej"numer". Następnie w każdej iteracji pętli sprawdzasz czy kolejna liczba (tablica[i]) jest większa od zmiennej "największą". Jeśli tak- nadpisujesz ją i zmienną "numer". W taki sposób po przejściu pętli będziesz miał największą liczbę i jej numer.
komentarz 24 czerwca 2016 przez niezalogowany
Dobrze spróbuję w ten sposób. Dziękuję za pomoc :)
komentarz 6 sierpnia 2016 przez niezalogowany
edycja 6 sierpnia 2016
Jedno pytanie, co jak będę miał dwie (lub więcej) takie same największe liczby parzyste i będę musiał wybrać tą o najmniejszym numerze?
komentarz 6 sierpnia 2016 przez CzikaCarry Szeryf (75,340 p.)
Pisałem, że numer nadpisujesz tylko gdy liczba parzysta jest większa, a nie gdy jest równa:D
0 głosów
odpowiedź 24 czerwca 2016 przez kacperdyba Gaduła (3,290 p.)
void Sortowanie( int tab[], int size )
{
    for( int i = 0; i < size; i++ )
    {
        for( int j = 0; j < size - 1; j++ )
        {
            if( tab[ j ] > tab[ j + 1 ] )
                 swap( tab[ j ], tab[ j + 1 ] );
            
        }
    }
}
// tablica sortowanie

if (x % 2 == 0)  // liczba parzysta

if (x[i] == x[i-1])
cout << x[i]

 

Masz gotowe komponenty, teraz pomyśl i złóż samemu ;)

1
komentarz 24 czerwca 2016 przez CzikaCarry Szeryf (75,340 p.)
Tu nie jest potrzebne sortowanie. Trzeba wybrać tylko jedną liczbę. Przecież można zrobić to jedną pętla, nie potrzeba sortowania bąbelkowego.
komentarz 24 czerwca 2016 przez kacperdyba Gaduła (3,290 p.)

w sumie wystarczy poprostu przeprowadzić bubble sort  jeden raz smiley

komentarz 24 czerwca 2016 przez niezalogowany
Wątpię, aby trzeba było użyć w tym zadaniu takowej funkcji. Przypuszczam, że jest zwyczajnie zbyt proste.
komentarz 24 czerwca 2016 przez Ehlert Ekspert (212,670 p.)
Sortowanie w tym zadaniu to marnowanie czasu procesora.
0 głosów
odpowiedź 24 czerwca 2016 przez Bondrusiek Maniak (61,370 p.)
edycja 24 czerwca 2016 przez Bondrusiek

Tutaj przykład wedle myślenia

@CzikaCarry

 

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    int a ;
    cin >> a;
    srand(time(0));

    int *tab = new int[a];
    for(int i = 0 ; i < a ; i++ )
    {
        tab[i] = rand();
    }

    //zakladamy ze pierwszy element jest najwiekszy
    int max = tab[0];

    for( int i = 0 ; i < a ; i++ )
    {
        cout << tab[i] << endl;

    }

    cout << endl;

    for(int i = 0 ; i < a ; i++)
    {
        if(!( i % 2 ))
        {
            //cout << "Nieparzyste elementy tablicy" << endl;
            //cout << tab[i] << endl;
            if(tab[i] > max)
            {
                //jesli taki element jest wiekszy od max to max = tab[i]
                max = tab[i] ;
            }
        }
    }

    cout << endl;
    cout << max << endl;
    return 0;
}

 

komentarz 24 czerwca 2016 przez obl Maniak (51,280 p.)
    //zakladamy ze pierwszy element jest najwiekszy
    int max = tab[0];

To założenie jest nieprawidłowe a co jeżeli pierwsza liczba będzie największa ze zbioru i nieparzysta? Np.int  tab[] = {9, 8, 7, 6, 5, 4, 3, 2, 1} to wtedy tab[0] będzie równe 9 a po przejściu przez twoją pętlę zmienna max będzie równa 9.

komentarz 24 czerwca 2016 przez CzikaCarry Szeryf (75,340 p.)
@obl dobrze mówi, polać mu. Powinni być coś a'la if(tab[i]%2==0) {max=tab[i];}
komentarz 25 czerwca 2016 przez Bondrusiek Maniak (61,370 p.)
Niby masz racje. Indeksowanie tablic jest od 0 czyli liczby parzystej natomiast my w potocznym rozumieniu indeksujemy od 1. Aby się tego pozbyć można dodać do warunku 1 .
komentarz 25 czerwca 2016 przez CzikaCarry Szeryf (75,340 p.)
ale tu nie chodzi o indexowanie tablic, tylko chodzi o to że np. 10 pierwszych liczb w tablicy może być nieparzyste a później liczba parzysta, więc zawsze trzeba sprawdzać czy liczba jest podzielna przez 2.
komentarz 25 czerwca 2016 przez obl Maniak (51,280 p.)
edycja 25 czerwca 2016 przez obl

Hej, Bondrusiek jeżeli nie mam racji, to Cię przeproszę, ale wciąż upieram się przy swoim, że algorytm przez ciebie zaproponowany nie zawsze zadziała tak jak sobie tego zażyczymy.

Jest jeszcze jeden błąd, którego nie zauważyłem wcześniej - linijka 32:

        if(!( i % 2 ))

tutaj powinno być:

        if(!( tab[i] % 2 ))

No i jeszcze przyszło mi do głowy coś takiego, a co jeżeli na wejście podane zostanie np; coś takiego int tab[] = {1, 3 , 5 , 7, 9, 11, 13} (tak tak wredny drań ze mnie). Jaki będzie wynik?

Moja propozycja zmodyfikowanego Twojego kodu to:

#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
int main()
{
    int a ;
    cin >> a;
    srand(time(0));

	int* max = NULL;
 
    int *tab = new int[a];
    for(int i = 0 ; i < a ; i++ )
    {
        tab[i] = rand();
    }
 
    //zakladamy ze pierwszy element jest najwiekszy
 
    for( int i = 0 ; i < a ; i++ )
    {
        cout << tab[i] << endl;
     }
 
    cout << endl;
 
    for(int i = 0 ; i < a ; i++)
    {
        if(!( tab[i] % 2 ))
        {
            //cout << "Nieparzyste elementy tablicy" << endl;
            //cout << tab[i] << endl;
			if(max && tab[i] > *max){
				*max = tab[i];
			}if(!max)
            {
                //jesli taki element jest wiekszy od max to max = tab[i]
                max = new int;
				*max = tab[i];
            }
        }
    }
 
    cout << endl;
	if(!max)
		cout<<"nie ma!"<< endl;
	else
		cout <<"Jest rozwiazanie: "<<*max<< endl;

	delete max;
	delete[] tab;

	cin >> a;
    return 0;
}

EDIT:

Dodałem jeszcze zwalnianie pamięci dla tab.

Podobne pytania

+2 głosów
4 odpowiedzi 6,035 wizyt
0 głosów
0 odpowiedzi 506 wizyt
0 głosów
0 odpowiedzi 92 wizyt

92,580 zapytań

141,433 odpowiedzi

319,665 komentarzy

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

...