Forum

[Pascal] Macierze i zamiana miejscami wierszy (kolumn)

[+] Twoje konto

Subskrybuj kanał najnowszych wypowiedzi w tym temacie

Wątek zamknięty Forum > Porady > Programowanie > [Pascal] Macierze i zamiana miejscami wierszy (kolumn)

Macierze w Turbo Pascalu - zamiana miejscami wartości maksymalnych i minimalnych
Idź do strony:1
Ocena: (Ocen: 0)
Wypowiedzi 1 - 9 z 9
 Zarejestrowany, zwieszony gehenna Kopiuj nick (82.197.35.*) |  
Wypowiedź dodana: 29 listopada 2008, 17:49:34 | Wypowiedź edytowana Ostatnio edytowana: 30 listopada 2008, 09:07:42 po raz 1-wszy przez: Dżyszla
« Opcje

Jestem tu nowy ,ale mysle ,ze jeszcze nie raz tu zajze xD to tyle tytulem wstepu.
Mialem do napisania dwa programy ,jeden ,ktory wczytuje macierz o n wierszach i m kolumnach ,ktora to bedzie zamieniac wartosc maksymalna w danych kolumnach i wierszach z wartoscia minimalna. Tu nic trudnego, zrobione, problem pojawia sie gdy po zamienieniu wyrazu wmin i kmin na wmax i kmax ustala bazowe wartosci dla wmax i kmax (moze troche zagmatwalem wiec:

m[wmax][kmax]:=m[wmin][kmin];
m[wmin][kmin]:=m[wmax][kmax];

Jak nie trudno zauwazyc wiadomo co sie dzieje :-D ,probowalem wszystkiego od ponownego wyliczania wmin,kmin co jednak pomija poczatkowa wartosc tych wyrazow ,wiec powstaje wmin2,kmin2 (wmin,kmin nie sa brane pod uwage przez prgram), probowalem wyzerowac wartosci ,nawet z komenda if xD To jest 1 problem

Drugi problem tyczy sie tego samego zadania ,tylko ,ze jego wersja ma brzmiec teraz tak " ... macie zamienic kolumny z wartoscia max z kolumna z wartoscia min ..." mam za duzo zmiennych w ktorych sie gubie i potrzebuje nakierowania na czym mam "pracowac" przy zamiania calych kolumn

Zmienne : wmax,kmax,wmin,kmin,i,j,w,k no i tablica 2d m ,gdzie w to wiersze ,k kolumny ,wmax i kmax to pozycja z maksymalna wartoscia ,adekwatnie wmin i kmin to z najmniejszym ,"i" i "j" to moje liczniki dla wierszow i kolumn.

Bylbym wdzieczny za jaka kolwiek pomoc

 Gość REKLAMA Kopiuj nick (*->*)
Wypowiedź dodana: 29 listopada 2008, 17:49:35

 Zarejestrowany, zwieszony Stasiek-j Mężczyzna Kopiuj nick (0.0.0.*) |  
Wypowiedź dodana: 30 listopada 2008, 02:49:00
Za tą wypowiedź przyznano użytkownikowi punkt pożyteczności
« Opcje

m[wmax][kmax]:=m[wmin][kmin];
m[wmin][kmin]:=m[wmax][kmax];

To nie zadziała. Bo zauważ, że po pierwszej linijce w komórce m[wmax][kmax] nie będzie już tej wartoście największej, tylko wpisana przed chwilą wartość najmniejsza. Więc w drugiej linijce tak naprawdę do m[wmin][kmin] wpiszesz to, co było tam już wcześniej.

Rozwiązaniem jest zastosowanie zmiennej tymczasowej, w której zapamiętasz pierwotną wartość m[wmax][kmax]

PS. Możesz ten problem porównać sobie do czegoś takiego: chcesz zamienić miejscami dwa kubki używając tylko jednej ręki.


Stasiek

 Zarejestrowany, zwieszony gehenna Kopiuj nick (82.197.35.*) |  
Wypowiedź dodana: 30 listopada 2008, 09:05:52
« Opcje

Ten problem z pierwszym zadaniem rozwiazalem juz wczoraj ,ale nie widzialem tu opcji edytuj i nie chcialem spamowac xD w drugim zadaniu moim osiagnieciem jest zamiana ostatniego elementu z ostatnim elementem kolumny z najwiekszym wyrazem i najmniejszym ,ale nie wiem co zrobic by zamienialo tez inne ... moze petla for tylko dla wierszy :
For i:=1 to w do ?

AvatarAdministrator Dżyszla Mężczyzna Kopiuj nick (83.2.108.*) |  
Wypowiedź dodana: 30 listopada 2008, 09:12:57
« Opcje

Edytuj jest po rozwinięciu polecenia Opcje w prawym górnym roku wypowiedzi ;-)

Co do problemu - proponuję utworzyć procedurę, której zadaniem będzie zamiana dwóch wartości w tablicy miejscami. Tablice mogą być albo globalne, ale przekazywane jako parametr funkcji.
Teraz, aby zamienić kolumny wystarczy odpowiednia pętla for "jadąca" po kolejnych wierszach i wywołująca utworzoną funkcję. W ten sposób łatwiej zapanować nad ilością zmiennych.


mgr inż. Dżyszla

Nie odpisuję na problemy zgłaszane na e-mail lub PW!

Także dzięki firmie Netlook.pl możesz za darmo korzystać z tej strony!

 Zarejestrowany, zwieszony gehenna Kopiuj nick (82.197.35.*) |  
Wypowiedź dodana: 30 listopada 2008, 09:34:15
« Opcje

Co do opcji edytuj ,szukalem jej ,takze w tym na co mnie nakierowales w tej chwili wczesniej (raport,cytuj,link). Wracajac do tematu chodzi mi o to czy mojej "pracy" ma podlegac jedna zmienna (wiersze)? a druga ma byc ciagle kmax? Bo problemem by nie byla zamiana byle jakich kolumn ,strasznie utrudnia mi myslenie to ,ze to ma byc kolumna z kmax i kmin xD
Bylbym wdzieczny za wizualne wyjasnienie tylko tego fragmentu

AvatarAdministrator Dżyszla Mężczyzna Kopiuj nick (83.2.108.*) |  
Wypowiedź dodana: 30 listopada 2008, 09:43:54 | Wypowiedź edytowana Ostatnio edytowana: 30 listopada 2008, 09:49:03 po raz 1-wszy przez: Dżyszla
« Opcje

A... Bo edycja dostępna jest tylko przez określony czas ;-) Więc jeśli dużo później chciałeś - nie mogłeś.

Szczerze, to intencji autora zadania nie jestem pewien. Być może chodzi o to, by wziąć pod uwagę pierwszy wiersz, i w nim zamienić miejscami wartości maksymalne i minimalne. Następnie drugi, tam znów je odszukać i zamienić.

W takim przypadku należy (algorytmicznie):
1. Odszukać kolumnę z wartością maksymalną i minimalną
2. Zamienić je miejscami
3. Przejść do następnego wiersza
4. Jeśli nie osiągnięto końca tablicy - przesunąć się na kolejny wiersz i wykonać punkty 1-4.

W takiej sytuacji bardzo przydatne okażą się kolejne funkcje - np. kmin(nr_wiersza) i kmax(nr_wiersza) (tak, tak - jako funkcje!), które będą zwracać indeksy kolumn we wskazanym miejscu, których wartością są min/max.

Aby ułatwić sobie na początku zadanie, to faktycznie operowanie na tablicy globalnej będzie czytelniejsze.

Tak dzieląc kod, powinien stać się znaczeni czytelniejszy...

Czyli na początku tworzymy:

function kmin(nr_wiersza: integer): integer;
function kmax(nr_wiersza: integer): integer;
procedure zamien(nr_wiersza1, nr_kolumny1, nr_wiersza2, nr_kolumny2);

Teraz w głównym wystarczy wspomniana wcześniej pętla na kształt:

for i:=0 to wierszy do zamien(i,kmin(i),i,kmax(i));

Swoją drogą to to chyba jakiś wstęp do sortowania bąbelkowego widać ;-)

*** Dodano o 09:49:03: *** (Autoscalanie)

PS. To zamien to można wykonać jeszcze prościej jako procedurę z parametrami referencyjnymi, czyli:

procedure zamien(var wartosc1, wartosc2: integer);

Wtedy wystarczy przekazać do tej procedury komórki do zamiany. :-)

zamien(m[i,kmin(i)],m[i,kmax(i)]);


mgr inż. Dżyszla

Nie odpisuję na problemy zgłaszane na e-mail lub PW!

Także dzięki firmie Netlook.pl możesz za darmo korzystać z tej strony!

 Zarejestrowany, zwieszony gehenna Kopiuj nick (82.197.35.*) |  
Wypowiedź dodana: 30 listopada 2008, 10:25:19 | Wypowiedź edytowana Ostatnio edytowana: 30 listopada 2008, 10:25:57 po raz 1-wszy przez: gehenna
« Opcje

Chodzi o zamiane kolumny (calej) z wartoscia min na kolumne cala w ktorej jest wartosc max np. wartosc min=1 wartosc max=9
1 2 3 || 3 2 1
4 5 6 || 6 5 4
7 8 9 || 9 8 7

To tak dla wyjasnienia ,zebys nie gryzl sie z tym co to ma byc xD, mysle ,ze juz sobie z tym poradze ,w razie problemow sie odezwe. Dziekuje za pomoc ;-)

AvatarAdministrator Dżyszla Mężczyzna Kopiuj nick (83.2.108.*) |  
Wypowiedź dodana: 30 listopada 2008, 10:41:10
« Opcje

Czyli algorytm się w zasadzie mój sprawdzi ;-) Bo jest tylko kwestią, jak wybierane jest kmin i kmax (można pominąć parametr wiersza i nakazać wyszukiwanie w całej tablicy). Oczywiście wtedy te wartości można wyrzucić przed pętlę i w niej używać już wyłącznie zmiennych, które przechowują wartości tychże funkcji.

Tak szczerze powiedziawszy, to coś takiego bardzo łatwo realizuje się na wskaźnikach - jeśli interpretować tablicę dwuwymiarową, jako tablicę kolumn (a więc pierwszy określa kolumnę, drugi wiersz), to wtedy wystarczy jedna zamiana wskaźników by zamienić miejscami całe kolumny. Ale rozumiem, że na razie to by były zbyt wysokie loty?


mgr inż. Dżyszla

Nie odpisuję na problemy zgłaszane na e-mail lub PW!

Także dzięki firmie Netlook.pl możesz za darmo korzystać z tej strony!

 Zarejestrowany, zwieszony gehenna Kopiuj nick (82.197.35.*) |  
Wypowiedź dodana: 30 listopada 2008, 10:59:11 | Wypowiedź edytowana Ostatnio edytowana: 30 listopada 2008, 10:59:50 po raz 1-wszy przez: gehenna
« Opcje

Dla mnie moze nie ,ale nie chce hmm "wynuzac" sie nad poziom panujacy w grupie ^^ z wiadomych przyczyn .Wole to przerobic na terazniejsze "myslenie" a przyszlosc czyli wyzsze loty niech poczekaja na swoja kolej

 
Idź do strony:1

[+] Pokaż/odśwież listę czytających i monitorujących ten wątek

Podobne tematy:
Tytuł wątkuDziałWypowiedziWyświetleńOcenaOstatnia wypowiedź
RozwiązaneWątek zamkniętyMacierze w Pascalu...
Macierze/tablice - posługiwanie się nimi w języku Pascal
Porady / Programowanie236 444 19.03.2009 12:35:47
WątekKody źródłowe kilku programów Pascal
Komentarze do zasobu Kody źródłowe kilku programów Pascal
Komentarze / Moje programy i teksty2245 9.06.2010 17:30:49
WątekWyświetlenie wartości z koprocesora.Porady / Programowanie498 1.06.2008 23:40:02
WątekRysowanie w dwóch programach - jak połączyć?
Pascal - programy graficzne
Porady / Programowanie295 6.06.2009 21:47:15
RozwiązaneWątek zamknięty[Pascal] Transpozycja
Dlaczego funkcja transpozycji macierzy nie działa
Porady / Programowanie3192 27.10.2012 22:31:02

Wątek zamknięty - nie można już do niego dodawać nowych wypowiedzi

Subskrybuj kanał najnowszych wypowiedzi w tym temacie


Chcesz mieć też takie forum na swojej stronie? Napisz!

Strona istnieje od 25.01.2001
Ta strona używa plików Cookie
Helion.pl  
archive To tylko kopia strony wykonana przez robota internetowego! Aby wyświetlić aktualną zawartość przejdź do strony.
Ładowanie...

Optymalizowane dla przeglądarki Firefox
© Copyright 2001-2017 Dawid Najgiebauer. Wszelkie prawa zastrzeżone.
Ostatnia aktualizacja podstrony: 22.09.2014 12:12
Wszystkie czasy dla strefy czasowej: Europe/Warsaw