największy element w liście jednokierunkowej cyklicznej

0

Zaimplementować tylko funkcję , która jako parametr wejściowy dostaje listę jednokierunkową cykliczną ( w której przechowywane są liczby całkowite ) bez licznika , a jako wynik pod swoją nazwą ) zwróci wartość elementu największego przechowywanego na liście jeżeli lista nie jest pusta , a w przeciwnym razie zero . Należy zdefiniować typy danych , z których się korzysta w tej funkcji .

Czy kod jest poprawny? Po kompilacji z main nie wyświetla żadnych komunikatów, więc wydawało by się ze funkcja działa poprawnie. Czy ktoś mógłby to potwierdzić ?
Potrzebuję na studia. Być może coś jest nie tak z "int max = temp ->number"?

struct element{
    int number;
    element* next;
};

struct single_list{
    element* current;
};

bool isEmpty(single_list l){
    if (l.current == nullptr)
        return true;
    return false;
}

int get_max(single_list l){
    if (isEmpty(l)){
        element *temp = l.current;
        int max = temp->number;
        do{
            if(max < temp->number)
                max = temp->number;
            temp=temp->next;
        }while(temp!=l.current);

        return max;
    }
    return 0;
}
3

A przetestowałeś ten kod? Jakbyś przetestował to byś wiedział, że nie jest poprawny.

Pierwszy If ma zły warunek.

3

if (isEmpty(l)) zapisz ten wiersz słowami po polsku, a będziesz wiedział co jest nie tak.
Nie wiem czemu wszyscy komplikowanie sobie życia nazywają czytelnością:

bool isEmpty(single_list l) { return (l.current==nullptr); }

lub jeszcze prościej bo to C++ a nie Java czy C#:

bool isEmpty(single_list l) { return !l.current; }
0

Czy powinno być

if (isEmpty(l.current))

? chociaż wtedy pojawia się problem z przekonwertowaniem 'element* ' na 'single_list'

2
Miłosz Piechota napisał(a):

Czy powinno być

if (isEmpty(l.current))

? chociaż wtedy pojawia się problem z przekonwertowaniem 'element* ' na 'single_list'

Dragonowi chodziło o dwie rzeczy

  1. if (jakiś warunek) return true; else return false; to nieporozumienie. Powinno być return jakiś warunek;
  2. W kodzie masz if (isEmpty(l)){ i wchodzisz w kod wyszukiwania, gdy lista jest PUSTA! Brakuje zaprzeczenia.

Twoja poprawka wykazuje brak przemyślenia sprawy i wygląda na próbę programowania permutacyjnego (losowe zmiany w kodzie, aż zacznie robić coś zgodnie z oczekiwaniem).

0

@MarekR22:
Ja tak wtrącę się w dyskusję z ciekawości

if (jakiś warunek) return true; else return false; to nieporozumienie. Powinno być return jakiś warunek;

odpowiesz mi dlaczego ma być TYLKO return jakiś warunek ?

posłużę się całkiem podobną funkcją isEmpty w dokumentacji z Qt w dokumentacji pisze, że zwraca true gdy jest ok i false gdy jest nie ok. Więc dlaczego doradzasz koledze zwrócenie tylko true ?

2
zkubinski napisał(a):

@MarekR22:
Ja tak wtrącę się w dyskusję z ciekawości

if (jakiś warunek) return true; else return false; to nieporozumienie. Powinno być return jakiś warunek;

jakis warunek jest wyrażeniem logicznym, ergo to jest już wartość true lub false. Dodawanie if (.....) return true; else return false to takie masło maślane.
Ja nie radzę zwracanie tylko true, ale wywalenie if - ma być jak dragon napisał

2

@zkubinski, tobie to tłumaczyłem ze 3 razy ale za każdy razem twój tupet i arogancja nie pozwolili tobie tego doczytać do końca bądź zrozumieć (obstawiam i to i tamto). Sadzisz że kolejne tłumaczenie coś zmieni? Zaraz będą kolejne kilometrowe komentarze usprawiedliwiające brak progresu wyjazdy osobiste za które zarobisz kolejnego BAN'a a nadal z tego nic nie wyniesiesz.

Jeżeli masz bool somecheck(); to wynik wywołania somecheck() ma typ bool
jeżeli wg twojego pojmowania piszesz if(somecheck()==true) to wyraz somecheck()==true też ma typ bool
więc wypada napisać if((somecheck()==true)==true) no ale wyraz (somecheck()==true)==true też ma typ bool
więc wypada napisać if(((somecheck()==true)==true)==true) no ale wyraz ((somecheck()==true)==true)==true też ma typ bool
więc wypada napisać ...

Proszę się odzywać dopiero albo jak skończysz pisanie tego poprawnego if'a wg twojego pojmowania, albo kiedy zrozumiesz że twoje pojmowanie jest bezsensowne.
Może jeszcze jedna możliwość ... napisz kod który na wejście standardowe wyświetli takiego if z podaną w parametrze ilością ==true, jak nie podano lub podano <=0 to ma wyświetlić if(somecheck()) - założę się że nawet to cię przerośnie.

0

@MarekR22:, @_13th_Dragon & reszta

rozpatrzmy taki przypadek - jest to ogólny przykład

int zwrotInt(int z){
    if(z==0){
        return 0;
    }
    else if(z==1){
        return 1;
    }
    
    return -1;
}

bool zwrotBool(int z){
    if(z==0){
        return true;
    }
    else if(z==1){
        return false;
    }
    
    return false;
}

mam taki kod i teraz zestaw pytań

  1. Czy jest on poprawny ?
  2. Czy jest on bezsensowny ?
  3. Czy zawiera bezsensowne return i warunek if ?

Zadając ci to pytanie miałem na myśli dokładnie ten kod

Aha i jeszcze @_13th_Dragon

Jeżeli masz bool somecheck(); to wynik wywołania somecheck() ma typ bool
jeżeli wg twojego pojmowania piszesz if(somecheck()==true) to wyraz somecheck()==true też ma typ bool
więc wypada napisać if((somecheck()==true)==true) no ale wyraz (somecheck()==true)==true też ma typ bool
więc wypada napisać if(((somecheck()==true)==true)==true) no ale wyraz ((somecheck()==true)==true)==true też ma typ bool
więc wypada napisać ...

Nawet na Stack Overflow spotkałem się z opiniami, że czasami lepiej napisać

if(warunek==true)

else if(warunek==false)

tak dla czytelności ale twoją sugestię rozumiem, niemniej jednak to co jest powyżej w zasadzie jest poprawne, więc jeżeli jest poprawne, to czemu nie pisać w sposób czytelny ? Często jest tak, że z warunku wprost nie wynika czy warunek jest false czy true dlatego rekomendują aby pisać j/w

3
int zwrotInt(int z) { return ((z&1)<<1)-(z!=0); }
int zwrotInt(int z) { return 2*(z&1)-(z!=0); }
int zwrotInt(int z) { return ((z==1)<<1)-(z!=0); }
int zwrotInt(int z) { return 2*(z==1)-(z!=0); }
int zwrotInt(int z) { return (z==1)+(z==1)-(z!=0); }
bool zwrotBool(int z) { return !z; }
zkubinski napisał(a):
  1. Czy jest on poprawny ?

Nie da się stwierdzić bo nie podano zadania.

zkubinski napisał(a):
  1. Czy jest on bezsensowny ?

Zdecydowanie bezsensowny jeżeli da się zapisać jednym wierszem i jednym wyrażeniem.

  1. Czy zawiera bezsensowne return i warunek if ?

Jw

zkubinski napisał(a):

Nawet na Stack Overflow spotkałem się z opiniami, że czasami lepiej napisać

if(warunek==true)

else if(warunek==false)

Czy sądzisz że na Stack Overflow sami zawodowcy, na 100% nie brakuje takich jak ty.

zkubinski napisał(a):>

tak dla czytelności ale twoją sugestię rozumiem, niemniej jednak to co jest powyżej w zasadzie jest poprawne, więc jeżeli jest poprawne, to czemu nie pisać w > >
sposób czytelny ?

Jeżeli dla kogoś jeden krótki wiersz jest mniej czytelny niż 9 wierszy to jest to początkujący noob nie znający konstrukcji języka, przykrywający "nieczytelnością" braki podstaw.

0

@_13th_Dragon:

Jeżeli dla kogoś jeden krótki wiersz jest mniej czytelny niż 9 wierszy to jest to początkujący noob nie znający konstrukcji języka, przykrywający "nieczytelnością" braki podstaw.

nie rozumiem czemu rozpatrujesz najprostszy przypadek z którego w prost wynika, że warunek zwróci podczas porównania wykona kod zawierający prawdę lub fałsz i to aż kłuje w oczy ale mimo to, nie zaszkodzi dopisać do jakiej wartości zostaje to porównane ? I co z warunkami z którymi to wprost nie wynika ? Bo ja nie mówię o tych prostych warunkach ale o tych które są niejasne i trzeba wałkować więcej linii kodu aby do tego dojść

0
zkubinski napisał(a):

nie rozumiem czemu rozpatrujesz najprostszy przypadek z którego wprost wynika, że warunek zwróci prawdę lub fałsz i to aż kłuje w oczy

W oczy ci kluje brak podstaw programowania, warunek nigdy niczego nie zwraca!

zkubinski napisał(a):

nie zaszkodzi dopisać do jakiej wartości zostaje to porównane ?

Zaszkodzi, niepotrzebnie zwiększasz ilość wierszy a więc zmniejszasz czytelność kodu.
Ponieważ brak ci podstaw to wyrażenie typu (a<b)-(a>b) jest dla ciebie czarną magią.

zkubinski napisał(a):

I co z warunkami z którymi to wprost nie wynika?

Z którymi warunkami? Co wynika? Nawet zdania sensownie złożyć nie umiesz.

O widzę poprawkę:

zkubinski napisał(a):

... że warunek podczas porównania wykona kod zawierający prawdę lub fałsz

Podczas porównywania warunek porównuje nie wykonuje żadnego innego kodu!
Co znaczy kod zawierający prawdę lub fałsz?
To jakieś brednie!

1

myślę że autorowi się przyda a i może kubinski coś zajarzy(;)). W kwestii tych operacji logicznych. Jak by sobie tak pomyśleć czym jest odejmowanie logicznie no to na myśl przychodzi operacja XOR(tu coś bardzo bardzo ogólnego)
image
https://www.101computing.net/binary-subtraction-using-logic-gates/
ogólnie warto się zapoznać/przypomnieć sobie. Z tego wynika później masa rzeczy.

0

@revcorey:

ogólnie warto się zapoznać/przypomnieć sobie. Z tego wynika później masa rzeczy.

możesz rozwinąć co masz konkretnie na myśli ? Tj. jak dużo rzeczy z tego wynika ?

0
struct element {
	int data;
	struct element* next;
};

void printMinMax(struct element* head)
{
	// sprawdza czy lista pusta
	if (head == NULL) {
		return;
	}

	// wskaznik do przemieszczania sie po liscie
	struct element* current;

	// inicializuje poczatek (head) na obecny wskaznik
	current = head;


	int min = INT_MAX, max = INT_MIN;

	
	do {
		if (current->data < min) {
			min = current->data;
		}
		if (current->data > max) {
			max = current->data;
		}

		current = current->next;
	}while(current != head);

	cout << "\nMinimum = " << min << ", Maximum = " << max;
}

Funkcja jest nowa szukająca min i max, czy teraz wydaje się w porządku?

2

tu łamiesz taką zasadę że coś powinno robić jedną rzecz. czyli osobna funkcja do print osobna do min osobna do max ewentualnie min_max(jak w stl) razem. tak na oko jak data jest mniejsze od min to już chyba nie ma sensu wołać sprawdzania czy jest większe od maks? a tak w ogóle o czemu np. nie inicjować obu min max wartością z heda(chociaż może się już czepiam)?
ja przewrotnie rozbiję to na takie coś tylko jako demonstrację, lepiej będzie w twoim przypadku jak chcesz mieć minmax zaimplementować to razem ale tu pokaz dlaczego warto mieć to porozbijane.

//Tu mamy pseudokod
void print_minmax(const std::pair<int,int>& minMax){
// print
}

int min(const element* list) {
// szukam min
}

int max(const element* list) {
// szukam min
}

std::pair<int,int> minmax(const element* list) {
return make_pair(min(list), max(list));
}

// gdzieś w kodzie bóg wie gdzie
auto minMaxValues = minmax(list);
print_minmax(minMaxValues);
auto output = minMaxValues.first + minMaxValues.second;
// coś robię z minMaxValues;

jestem czysty. Mogę sobie pobrać min max i zrobic sobie co z nimi chcę, a to printować a to jakieś obliczenia itd. Nie potrzebuję za każdym razem printować ich bo po co?

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