Skocz do zawartości

Problem z C++


Recommended Posts

  • 3 tygodnie później...

Gdy elementów do posortowania jest mało wybór algorytmu sortującego praktycznie nie ma znaczenia.

Np. funkcja sortująca do zmodyfikowania 1 zadania:

void Sortowanie( float tablica[], int rozmiar )
{
	for( int i = 0; i < rozmiar; i++ )
	{
		int p = i;  //Do tej zmiennej zapisujemy najmniejsza znaleziona wartosc tablicy zaczynajac od i
		for( int j = i + 1; j < rozmiar; j++ ) //Przechodzimy po kolejnych wartosciach nieposortowanych w tablicy
		{
			if( tablica[p] > tablica[j] )  //Gdy znajdziemy mniejszy element
				p = j;  
                                //Podmiana wartosci ktora przechowuje wczesniejszy indeks tablicy na indeks tablicy zawierajacy mniejsza wartosc
		}
		//Podmiana obecnej wartosci tablicy na kolejna najmniejsza wartosc
		if( p != i ) //Aby nie przepisywac tego samego elementu
		{
			int t = tablica[i];  //Kopia zapasowa wartosci tablicy
			tablica[i] = tablica[p];  //Przepisanie najmniejszej kolejnej wartosci tablicy na odpowiadajace mu miejsce
			tablica[p] = t;  
                        //Przepisanie wartosci z kopii zapasowej na miejsce wszesniej przypisanej innemu elementowi wartosci tablicy
		}
	}
}

Jest to chyba najprostsze sortowanie i najmniej efektywne ale do małej ilości elementów się sprawdzi.

Wywołanie funkcji w main:

Sortowanie( waluta, dni );

Przykładowa funkcja mediany:

void Mediana( float tablica[], int rozmiar )
{
	if( rozmiar % 2 )  //Sprawdzenie czy wartosc jest parzysta czy nieparzysta
		cout << "Mediana wynosi: " << (tablica[rozmiar/2-1] + tablica[rozmiar/2])/2 << endl;  
	//2 elementy ze srodka (rozmiar/2-1 [-1] ze wzgledu na indeksowanie od 0) 
	else
		cout << "Mediana wynosi: " << tablica[ rozmiar / 2 - 1 ] << endl;
}

Wywołanie funkcji w main:

Mediana( waluta, dni );

Lepiej używać funkcji niż cały kod wykonywać w main, kod jest bardziej przejrzysty, a w razie potrzeby ponownego wykorzystania danego kodu wystarczy wywołać ponownie funkcje. No i najważniejsze jest to zalecane a nawet wymagane.

Przykładowo jak mogłaby wyglądać funkcja main w oparciu o podany kod:

int main()
{
    int dni;
    float *waluta;
    cout <<  "Ile dni ma podany okres: ";
    cin >> dni;
    waluta = new float [dni];
    WpisanieDoTablicy( waluta, dni );
    PokazTablice( waluta, dni );
    SumaiSrednia( waluta, dni );
    Sortowanie( waluta, dni );
    PokazTablice( waluta, dni );
    Mediana( waluta, dni );
    
    delete [] waluta;
    return 0;
} 
Edytowane przez egzopro
  • Popieram 1
Link to post
Share on other sites

Jak to jest jeszcze aktualne, to proponuję zerknąć na  std::sort() - zapodajesz tablicę i ci ją sortuje. Mediana to wartość środkowego wyrazu ciągu, więc możesz sobie wziąć odpowiedź z postu wyżej.

BTW - czy was pokręciło, żeby proponować komuś własnoręczne pisanie sortowania?!! I to jeszcze używając sortowania przez wybieranie...

Link to post
Share on other sites

Sortowanie przez wybieranie jest chyba najbardziej naturalne, a szczególnie gdy chodzi o rozwiązywanie podstawowych przykładów w trakcie nauki programowania (gdy sami mamy wymyślić sposób rozwiązania danego zadania). Chciałem tylko właśnie taki prosty przykład implementacji funkcji dla danego zadania przedstawić i tylko tyle.

Jeżeli ten przykład jest naprawdę aż tak bardzo słaby czy też żenujący to mogę go usunąć ;) 

Oczywiście znam bardziej wydajne metody sortowania aczkolwiek wiem że nie ma sensu utrudniać komuś zadania w trakcie nauki składni języka programowania skomplikowanymi i trudniejszymi w zrozumieniu algorytmami gdyż w razie potrzeby sięgnie do odpowiednich bibliotek lub materiałów z tym związanych.

Natomiast myślę że std::sort() nie jest odpowiednim rozwiązaniem tego zadania gdyż "Napisz program, który: " chyba raczej wymaga własnej implementacji kodu danego zadania niż pójście na skróty i użycie bibliotecznej funkcji. I wydaje mi się że są to zadania dla osoby uczącej się programowania a więc bardziej sprawdzenie kreatywności danej osoby niż optymalnie napisanego kodu.

Link to post
Share on other sites

Idąc twoim tokiem rozumowania można by dojść do konieczności napisania własnego kompilatora. Gdyby w takiej głupocie trzeba było dołączać jakieś zewnętrzne biblioteki, to bym się zastanowił, ale użycie funkcji z biblioteki standardowej....

 

A jeśli już od kogoś wymagają napisania sortowania, to zdążyli już wspomnieć o jakichś podstawowych metodach. Implementacja Quick Sort nie jest jakąś czarną magią.

Link to post
Share on other sites

egzopro - Trochę po czasie... ale bardzo dziękuję za naprawdę wyczerpujące rozwiązanie. ;D Przyda się.


W sumie teraz mam kolejne pytanie. XDDDD

 

http://i.imgur.com/Aw071gZ.png?1

 

Chodzi o tę drugą część zadania, z literą. x; 

Link to post
Share on other sites

Jeżeli ta "baza" to kolekcja trzymająca obiekty klasy Książka, to można wygooglować tego typu rzeczy (po ang.).

 

Przykładowa klasa Książka (+ coś o wyszukiwaniu):

http://stackoverflow.com/questions/12737171/using-stdfind-with-a-custom-book-class

 

Przykład kolekcji Vector trzymającej obiekty własnego typu i sortowanie:

http://stackoverflow.com/questions/1380463/sorting-a-vector-of-custom-objects

Link to post
Share on other sites

Wszystko zależy od tego czy można korzystać z dodatkowych bibliotek aby rozwiązać zadanie czy też nie, przykład podany przez Karister wymaga użycia biblioteki <vector>, natomiast jeżeli w zadaniu nie można korzystać z bibliotek w dość znacznym stopniu ułatwiającym zadanie polecam skorzystać z list jednokierunkowych/dwukierunkowych. 

Podobny przykład z wykorzystaniem listy jednokierunkowej: 

http://www.algorytm.org/klasyczne/lista/lista-1-c.html

Link to post
Share on other sites

To nie jest żadna biblioteka "Vector" tylko klasa należąca do standardu języka. A jak ktoś zabrania używać standardu, to niech się puknie w łeb a potem skoczy z mostu, żeby uwolnić innych od swojej głupoty. Równie dobrze można zabronić używać tablic, wskaźników i ifów.

Link to post
Share on other sites

"Podaj rozwiązanie bez tablic pomocniczych." - z treści zadania. To zadanie nie jest raczej jakimś projektem w znaczeniu bardziej profesjonalnym, to raczej zadanie które ma pomóc zrozumieć c++ i nauczyć się go od podstaw a część zagadnień trzeba poznać bardziej od środka :). Dobrze wiemy że nikt programistą się nie rodzi tylko dochodzi do tego ciężką pracą a upraszczanie wszystkiego na poziomie nauki języka nie jest najlepszą drogą do jego poznania.

Link to post
Share on other sites

To nie wyklucza zdania "bez tablicy pomocniczej". Zmienna pomocnicza to dodatkowy twór do ułatwienia implementacji czegoś. Na przykład przepisywanie z jednej tablicy do drugiej w celu sortowania/wyszukiwania. Ale jedna lista/tablica/cokolwiek tak czy siak będzie w tym programie. A czy to będzie własna lista, Vector, tablica- mój wybór.  W treści nie jest napisane, że celem zadania jest zaimplementowanie swojej listy, tylko przetworzenie pewnych danych.

Edytowane przez Karister
Link to post
Share on other sites
  • 2 tygodnie później...

Pisać tak, żeby kompilował się w obu :)

 

No i oczywiście obadać flagi tych kompilatorów (bo np. jeden może obsługiwać pewne cechy jezyka domyślnie, a drugi dopiero z jakimś parametrem).

 

W każdym razie żadne dwa kompilatory nie są ze sobą w 100% zgodne. Rozjazdy są czasem nawet między poszczególnymi wersjami, dlatego np. Firefox OS używa starego GCC.

Edytowane przez szatkus
Link to post
Share on other sites
  • 1 miesiąc temu...

________

 

Siema, znów mam problem. Tym razem z Javą... ;_; Zadanie jest ogólnie banalne, a ja nie wiem jak to za bardzo zrobić. xdddd Mam proste zadanie; ma być zmienna 'a' o wybranej wartości i proste działanie. Strukturalnie to ogarniam, ale obiektowo nie bardzo. 

 

Napisałam coś takiego:


 
public class zad 
{
	double a;

public double obl()
{
	return a*2;
}


    
    public static double main(String[] args) 
    {
    	zad zad_ = new zad();
    	zad.a=5;
    	System.out.println(zad.obl());
    	
    }
}

Pewnie padniecie przez to...  :facepalm: Ale muszę się dowiedzieć jak to powinno wyglądać. :'(

 

////// Dobra, problem już sama rozwiazałam. xd

Edytowane przez effy_
Link to post
Share on other sites
  • 2 miesiące temu...

I znów ja... </3

 

Tym razem mam problem... ale z asemblerem. ;_; Mam napisać symulator do wyznaczania średniej geometrycznej i arytmetycznej z 10 liczb całkowitych wprowadzanych przez użytkownika, przy czym liczby, które będzie wprowadzał użytkownik mogą być dodatnie i ujemne.

 

Czy jest ktoś, kto ogarnia asemblera? xDDD

Link to post
Share on other sites

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Odpowiedz w tym wątku...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...