Funkcja wskaźnikowa przestawiająca elementy tablicy i podająca skrajne wartości

0

Witam,

mam do napisania i przetestowania taką funkcję
int minmaxreord(int* tab, int size, int* pmn, int& mx)
która pobiera tablicę intów o wymiarze size i

  • przestawia elementy tak, że elementy parzyste znajdują się przed nieparzystymi (w ramach grup parzyste i nie parzyste kolejność jest dowolna)
    -do zmiennej wskazywanej przez pmn wstawia najmniejszą wartość tablicy, a do zmiennej, której referencją jest mx nadaje wartość elementu największego
    -zwraca indeks pierwszego elementu nie parzystego po przestawieniu (zero jeżeli wszystkie elementy są nie parzyste, size czyli pozycję poza tablicą jeżeli wszystkie elementy są parzyste.

Wszystkie wyniki powinny być wypisywane w funkcji main, sama funkcja minmaxreord nic nie pisze.

stworzyłem coś takiego :

#include <iostream>
using namespace std; 

int minmaxreord(int* tab, int size, int* pmn, int& mx){
	//pobranie tablicy intów
	 int *i = &size;
	 tab = new int[*i];
	   for(int k = 0; k < *i; ++k)
  {
    cout << "Podaj wartosc " << (k + 1) << " elementu: ";
    cin >> tab[k];
  }
//wyznaczenie max
  for(int k = 0; k < size; ++k)
    if(tab[k] > mx)
      mx = tab[k];
//wyznaczenie min
   for(int k = 0; k < size; ++i)
    if(tab[k] < *pmn)
      *pmn = tab[k];
//uporzadkowanie tablicy
   int k, l, pom;
   l = 0;
   for (k=0; k<*i; k++) 
if (*tab%2 == 0) { 
pom=*tab; 
*tab=tab[l]; 
tab[l]=pom; 
l++; 
}



};

main(){
	 
	



}

Nie wiem czy funkcja jest w porządku bo nie umiem jakoś jej zainicjować w main tak aby działała.
Proszę o sprawdzenie i jakieś podpowiedzi.

Jeżeli chodzi o zwrot indexu to muszę znowu po kolei sprawdzić całą tablicę od początku (zaczyna się od parzystych) i znaleźć pierwszą nie parzystą ?

Z góry dziękuję za pomoc i pozdrawiam.

0

Ktoś tu nie chodził na zajęcia... ;)
Wybacz kolego, ale Twój kod wygląda jak posklejany z trzech innych i to bez zbytniej wiedzy jak to działa.
Zgodnie z treścią zadania, funkcja ma nic nie wypisywać, a Ty w niej pytasz użytkownika o dane. Masz do niej przekazać tablicę, którą inicjujesz w main(). Masz nawet na nią miejsce w argumentach.

Czy potrafisz racjonalnie wyjaśnić co to jest i dlaczego tak robisz (ja nie mam pojęcia co to ma być):

         int *i = &size;
         tab = new int[*i];

Wyznaczanie min i max możesz przecież zrobić w pętli przestawiającej. Nie musisz jechać po tablicy trzy razy.

Pętla przestawiająca też jakaś grubo ciosana. Iteratorem jest k ale do indeksów używasz l, warunek jest jakiś od czapy (hint: użyj indeksów!), brak wartości zwracanej (treść zadania nawet tego wymaga) itd. itp.

W funkcji main() masz stworzyć tablicę, pobrać dane od usera, wywołać funkcję przekazując wymagane dane (łącznie z tablicą), wypisać wyniki. Czego konkretnie nie wiesz? Jeśli napisałeś funkcję samodzielnie, nie powinieneś mieć problemów z prawidłowym stworzeniem main().

BTW, czy na pewno masz zamienić tylko pary liczb? Mogę się mylić, ale wydaje mi się, że masz np. z {1, 9, 4, 7, 2, 5, 3} zrobić {4, 2, 1, 9, 7, 5, 3} i zwrócić indeks do elementu o wartości 1.

0
Kumashiro napisał(a)

BTW, czy na pewno masz zamienić tylko pary liczb? Mogę się mylić, ale wydaje mi się, że masz np. z {1, 9, 4, 7, 2, 5, 3} zrobić {4, 2, 1, 9, 7, 5, 3} i zwrócić indeks do elementu o wartości 1.

Tak , masz rację ma to dokładnie tak wyglądać.

Uczę się zdalnie i to jest druga praca domowa trochę nie zrozumiałem treści zadania i rzeczywiście namieszałem. Dzięki za pomoc, spróbuje to poprawić i wrzucę to co uda mi się stworzyć.

Pozdrawiam.

0

#include <iostream>
#include "stdafx.h"

using namespace std; 


void printTable(int *tab, int size) {
        int i;
        for (i = 0; i < size; ++i) cout << tab[i] << " ";
        cout << endl;
}

int minmaxreord(int* tab, int size, int* pmn, int& mx){

	int x;

	int &min = *pmn; 
    min = tab[0];
	
	int max = mx ;
    max = tab[0];

	//pętla główna
	for (int i=0; i<size;++i){
    //szukanie najmniejszej liczby
		if(min>tab[i])
		{
			min = tab[i];
		}
    //szukanie największej liczby
		if(max<tab[i]){
			max = tab[i];
		}
	//porządkowanie
if(tab[i]%2 ==0){
	x=tab[i];
	tab[i]=tab[i+1];
	tab[i+1]=x;
}
	}
	int n;
    //jeżeli pierwszy element jest po sortowaniu nieprzarzysty to znaczy, że wszystkie elementy są nie parzyste
	if(tab[0]%2 !=0){
		n=0;
	}else{
	for (int i = 1; i < size; i++)
{   
	if (tab[i]%2 != 0){
		i=n;
	}break; //wyjście z pętli po znalezieniu pierwszej liczby nie parzystej
	if(i=size){
		n=size;
}
}
	}
	
	return n ;
};

int main(void){
	int n;
	int tab[] = {3,1,6,7,4}; 
	int i = sizeof(tab)/sizeof(tab[0]);
	int *min;
	int max;
	cout << "ilość elementów tablicy - "<< i << "elementów" ;
	

	minmaxreord(tab, i, min, max);

	cout << "tablica po uporządkowaniu "<< endl;
	printTable(tab,i);
	cout << "wartość najmniejsza: " << min << endl ;
	cout << "warość największa: " << max << endl ;
	 
	



}

 

problem jest taki, że w ogóle nie chce mi się to uruchomić po wciśnięciu debug gdy program zaczyna się już uruchamiać pokazuje mi, że zmienna min nie jest zainicjowana i jeszcze jakieś 'krzaczki'. Wydaje mi się, że nie zrozumiałem o co chodzi z tymi wskaźnikami. Próbuję to jakoś naprawić ale po wielu próbach nie mam pomysłu co dalej. Proszę o pomoc.

0

OK, pisząc:

int  *min;

mówisz: "przydziel mi miejsce w pamięci, w którym będę przechowywał adres do innego miejsca w pamięci, przechowującego wartość typu int". Nie powoduje to automagicznego przydzielenia miejsca w pamięci na tę wskazywaną wartość. Masz tylko miejsce na adres. Zamiast tego, przydziel miejsce na wartość, a do funkcji przekaż jedynie wskaźnik do niego (tak, jak funkcja tego oczekuje):

int   min;
/* ... */
blah = minmaxreord(tab, size, &min, max);

W funkcji zaś musisz zrobić dereferencję jeśli chcesz coś zapisać w miejscu wskazywanym przez wskaźnik:

int minmaxreord(int* tab, int size, int* pmn, int& mx) {
    /* ... */
 
    *pmn = 4;

    /* ... */
}

Poczytaj o wskaźnikach. Uwaga! Argument mx funkcji nie jest wskaźnikiem! To jest referencja!... O tym też poczytaj.

0

dzięki za pomoc wszystko zaczęło w sumie dziać z tą tylko różnicą, że nieparzyste sortowały się na początek natomiast powinny parzyste. Okazało się, że to dużo więcej roboty. Posiłkowałem się algorytmem z neta ale coś mi się chyba zapętla bo po pokazaniu ile elementów ma tablica jest czarny ekran.


#include <iostream>
#include "stdafx.h"
#include <stdio.h>

using namespace std; 


void printTable(int *tab, int size) {
        
        for (int i = 0; i < size; ++i) cout << tab[i] << " ";
        cout << endl;
}

int minmaxreord(int* tab, int size, int* pmn, int& mx){

	int x;

	(*pmn)=tab[0];
	mx=tab[0];

	
	for (int i=0; i<size;i++){
    //szukanie najmniejszej liczby
		if((*pmn)>tab[i])
		{
			(*pmn)= tab[i];
		}
    //szukanie największej liczby
		if(mx<tab[i]){
			mx = tab[i];
		}
	}
	//porządkowanie
	
	int i=0; 
int j=size; 
int ile_niep=0; // licznik nieprzystych 


do 
{ 
if ((tab[i]%2 ==0) && (tab[j]%2 ==0)) 
{ 
    i++;  // szukamy nieparzystej od początku zbioru 
} 
else if ((tab[i]%2 == 0) && (tab[j]%2 !=0)) 
{ 
     i++;   // ta para jest dobrze ułożona więc bierzemy się za następną 
     j--; 
}
else if ((tab[i]%2 != 0) && (tab[j]%2 == 0 )) 
{ 
     x=tab[i];           // zamiana miejscami 
     tab[i]=tab[j]; 
     tab[j]=x; 
     i++;                        // wskazanie następnej pary 
     j--; 
} 
else if ((tab[i]%2 != 0) && (tab[j]%2 != 0)) 
{ 
     j--;   // szukamy następnej parzystej od końca zbioru 
} 
}while(i=j); 

// licznik ile_niep zwiększamy w następujących przypadkach: 

// - gdy zwiększamy "i"  a liczba PRZED zwiększeniem była NIEPARZYSTA 
// - gdy zmniejszamy "j"  a liczba PRZED zmniejszeniem była NIEPARZYSTA 


	
		int n = 0 ;

	for(int i = 1; i < size; i++){ 
	if (tab[i]%2 != 0){
		n = i;
	}break; //wyjście z pętli po znalezieniu pierwszej liczby nie parzystej
	if(i=size){
		n = size;
}
}
return n;
}
	


int main(void){
	int n = 0;
	int tab[] = {3,1,6,7,4}; 
	int i = sizeof(tab)/sizeof(tab[0]);
    int min;
	int max;
	cout <<  " Tablica zawiera "<< i << " elementow"<< endl ;
	

	minmaxreord(tab, i, &min, max);

	cout << "tablica po uporzadkowaniu "<< endl;
	printTable(tab,i);
	cout << "wartosc najmniejsza: " << min << endl ;
	cout << "warosc najwieksza: " << max << endl ;
	cout << n << endl;
	
	system("PAUSE");
	 
	


return 0;	
}

 

Oprócz tego wszystko jest ok więc już prawie się udało. Dzięki wielkie jeszcze raz za pomoc.

0

dobra już sobie poradziłem, wszystko gra i buczy po przebudowie kodu.

Pozdrawiam.

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