Funcja Void Max zwracajaca najwieksza liczbe w tab.

0

Witam! Mam taki problem jako że nie za bardzo wiem co i jak w tym C++
Mam do napisania program
Napisz program wprowadzając dane do tablicy liczb całkowitych,program ma zwrocić najwieksza parzysta liczbę sprosród liczb wprowadzonych do tablicy(funkcja Void Max)
Wie ktoś jak to powinno wyglądać?
Z góry Dziękuje
Pozdrawiam

0

Zauzmy, ze juz masz dane w tej tablicy, to funkcja tak powinna wygladac.

void max(int *tab)
{
  int i, max = tab[0];
  for(i = 1; i < rozmiar; i++) {                /* rozmiar to liczba elementow w tablicy */
          if(!(tab[i] & 0x1)) {
               if(tab[i] > max)    
                       max = tab[i];
          }
  }
}

w max masz ta liczbe ;)

0

#include <conio.h>
#include <iostream>
using namespace std;

void  max(int *wsk);

void main ()
{
  try
  {
    int n;
    cout<<"Z ilu elementow sklada sie tablica? : ";
    while(!(cin>>n))
    {
        cout<<"To nie jest liczba calkowita, jeszcze raz ";
        cin.sync();
        cin.clear();
    }

    int *tablica=new int[n];

    for(int i=0;i<n;i++)
    {
        cout<<"Podaj liczbe : ";
        while(!(cin>>tablica[i]))
        {
            cout<<"To nie jest liczba calkowita, jeszcze raz ";
            cin.sync();
            cin.clear();
        }
    }

    void (*ws)(int*);
     ws=max;     
     ws(tablica);
    delete [] tablica;

  }

  catch (std::bad_alloc){
      cout<<"Blad allokacji pamieci ";  }

     _getch();
}
void  max(int *wsk)
{

    int max=*wsk;

    while(*wsk)
    {
        if((max <* wsk) && ((*wsk) % 2 ==0))
            max=*wsk;
        wsk++;
    }
    cout<<max;
}
0

Sid:
To się raczej sypnie ;] Chodzi mi o tą nieskończoną pętlę w procedurze max

0

jaką nieskończoną??? Sprawdź sobie, na pewno wszystko śmiga . Pętle while(*wsk) znam z Symfoni c++, wiec o błędzie nie ma mowy... A pętla mówi... dopóki wskaźnik nie będzie pokazywał na NULL...

0

Nie na NULL tylko na 0 (chociaż to w sumie to samo). Jaką masz pewność że za końcem tablicy będzie 0?

Testowałeś ten program u siebie? Mój g++ nie umożliwia zaincludowanie conio.h ;/

Wywaliłem conio.h, dodałem jedną linijkę (tablica[n] = 1000), oraz jedną poprawiłem, oto kod:

#include <iostream>
using namespace std;

void  max(int *wsk);

int main ()
{
  try
  {
        int n;
        cout<<"Z ilu elementow sklada sie tablica? : ";
        while(!(cin>>n))
        {
                cout<<"To nie jest liczba calkowita, jeszcze raz ";
                cin.sync();
                cin.clear();
        }

        int *tablica=new int[n];

        for(int i=0;i<n;i++)
        {
                cout<<"Podaj liczbe : ";
                while(!(cin>>tablica[i]))
                {
                        cout<<"To nie jest liczba calkowita, jeszcze raz ";
                        cin.sync();
                        cin.clear();
                }
        }

        tablica[n] = 1000;

        void (*ws)(int*);
         ws=max;
         ws(tablica);
        delete [] tablica;

  }

  catch (std::bad_alloc){
          cout<<"Blad allokacji pamieci ";        }

}
void  max(int *wsk)
{

        int max=*wsk;

        while(*wsk)
        {
                if((max <* wsk) && ((*wsk) % 2 ==0))
                        max=*wsk;
                wsk++;
        }
        cout<<max;
}

Przetestuj to u siebie na liczbach < 1000. Ta metoda z while (*wsk) { cośtam; wsk++} sprawdza się tylko jeśli wstawisz gdzieś 0 explicite (np masz łańcuch ASCIIZ).

0
tablica[n] = 1000;

WTF????
wcześniej allokowałeś dynamicnie pamięć a teraz tą samą tablicą alokujesz statycznie??? Nie rozumiem??? Przecież to sie mija z celem??? Poza tym, aby tak napisać

 tablica[n] = 1000;

n musiało by być zadeklarowane tak:

const int n=1000;

bez sensu!!!!
Może i przesadziłem z tymi wskaźnikami... ale to dla tego, że wcześniej nie rozumiałem ich w 100% i teraz wszędzie ich używam, bo chcę po prostu je znać w 100%.
właściwie to przesdziłem tylko z tą linijką:

void (*ws)(int*);
     ws=max;     
    ws(tablica);

bo wystarczyło by

max(tablica);

ale i tak w algorytmie zadbałem o wszystko... więc myślę, że nie masz co tutaj poprawiać po mnie...
aaa

wile(*wsk)

kompilator jest na tyle mądry że:

wewnątrz funkcji mamy znów pętle while. Wykonuje się ona dotąd , dopóki znak wskazywany przez wskaźnik- czyli wsk* - jest różny od null, czyli znaku asci różnego od zera

Cytat z Symfoni c++. Chyba nie muszę Ci go tłumaczyć na język polski???

Tak w ogóle, chyba za bardzo nie jesteś zaznajomiony ze wskaźnikami????

0
Sid_ napisał(a)

Cytat z Symfoni c++. Chyba nie muszę Ci go tłumaczyć na język polski???

Tak w ogóle, chyba za bardzo nie jesteś zaznajomiony ze wskaźnikami????

Jedna symfonia wiosny nie czyni. A Ty lepiej czytaj ze zrozumieniem, moje kilkuletnie doswiadczenie wskazuje na to ze petla while(wsk*) w tym zadaniu nie ma racji bytu, wiec nie masz racji wez to sobie do serca i po prostu przyznaj sie do bledu jesli jeszcze go nie widzisz to dokladnie przeanalizuj zadanie.

0
Sid_ napisał(a)
tablica[n] = 1000;

WTF????
wcześniej allokowałeś dynamicnie pamięć a teraz tą samą tablicą alokujesz statycznie??? Nie rozumiem??? Przecież to sie mija z celem??? Poza tym, aby tak napisać

tablica[n] = 1000;

n musiało by być zadeklarowane tak:

const int n=1000;

bez sensu!!!!

Hmmm...

donkey7 napisał(a)
int n;
cout<<"Z ilu elementow sklada sie tablica? : ";
while(!(cin>>n))
// ...
int *tablica=new int[n];
// ...
tablica[n] = 1000;

Teraz przeproś kolegę... Przecież jest dynamicznie, odróżniasz deklarację tablicy od przypisania wartości do jej elementu? WTF tam jest, ale z innego powodu - to przypisanie to wyjście poza zakres tablicy.

Sid_ napisał(a)

Może i przesadziłem z tymi wskaźnikami... ale to dla tego, że wcześniej nie rozumiałem ich w 100%
...
Tak w ogóle, chyba za bardzo nie jesteś zaznajomiony ze wskaźnikami????

Powiedz to samo patrząc w lustro.

Sid_ napisał(a)

kompilator jest na tyle mądry że:

wewnątrz funkcji mamy znów pętle while. Wykonuje się ona dotąd , dopóki znak wskazywany przez wskaźnik- czyli wsk* - jest różny od null, czyli znaku asci różnego od zera

Cytat z Symfoni c++. Chyba nie muszę Ci go tłumaczyć na język polski???

Ty jesteś na tyle 'mądry', że:

  • nie umiesz czytać ze zrozumieniem;
  • masz napisane 'znak ASCII', int jest znakiem ASCII?
  • pętla wykonuje się póki nie trafi na 0, czyli potencjalnie póki nie wypieprzy programu.

Tak w ogóle to po cholerę łapać bad_alloc? Jeszcze jedno:

donkey7 napisał(a)

Nie na NULL tylko na 0 (chociaż to w sumie to samo). Jaką masz pewność że za końcem tablicy będzie 0?

W C NULL to zerowy wskaźnik, w C++ czyste zero, co do cytatu z symfonii to warto zauważyć, że jest tam 'małe' null - null char, znak ASCII o kodzie 0, '\0'.

0

Myslalem, ze sobie z reszta poradzisz i sie czegos nauczysz ale jak sa problemy z takim programem to wrzucam jednak kod ;)

#include <stdio.h>
#include <stdlib.h>

void max(int *tab, int size) {
        int max = tab[0];

        while(size) {
                if(!(tab[size] & 0x1)) {
                        if(tab[size] > max)
                                max = tab[size];
                }
                size--;
        }

        printf("najwieksza parzysta %d\n", max);
}

int main(int argc, char *argv[])
{
        int i, rozmiar, *tablica;

        if(argc != 2) {
                printf("\nUSAGE: %s <size>\n", argv[0]);
                return 0;
        }

        i = rozmiar = atoi(argv[1]);
        tablica = (int*)malloc(rozmiar * sizeof(int));

        while(i) {
                scanf("%d", &tablica[i]);
                i--;
        }

        max(tablica, rozmiar);

        free(tablica);

        return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0