Zapisywanie oraz odczytywanie plików upraszcza proces zapisu postępu prac w programie Maxima. Zaletą takiego rozwiązania jest fakt, że generowany jest plik tekstowy, który można otworzyć w wielu różnych programach. Nie można tego osiągnąć przy pomocy zapisywania projektu. Istnieje cały szereg różnych funkcji, który pozwala na zapisanie oraz odczytanie pliku.
W celu zapisanie danych można skorzystać z funkcji write_data. Funkcja ta przyjmuje dwa argumenty: pierwszy określa obiekt, który ma zostać zapisany, a drugi ścieżkę dostępu do pliku. Jako drugi argument można podać jedynie nazwę pliku. Wtedy plik zostanie zapisany w ścieżce domyślnej określonej przez folder instalacyjny lub będzie to folder gdzie został zapisany projekt.
Wprowadźmy do programu Maxima listę L := [1, 2, 3, 4, 5] oraz macierz M o rozmiarze 3×3, która w kolejnych wierszach ma kolejne liczby naturalne. Następnie zapiszmy obiekt L do pliku daneL.txt, a M do daneM.txt. Zadanie to realizuje poniższy kod:
(%i2) | L: [1, 2, 3, 4, 5]; M: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; | |
(L) | [1, 2, 3, 4, 5] | |
(M) | [[1, 2, 3], [4, 5, 6], [7, 8, 9]] |
(%i3) | write_data(L, "daneL.txt"); | |
(%o3) | done |
(%i4) | write_data(M, "daneM.txt"); | |
(%o4) | done |
Pliki zostały zapisane poprawnie o czym świadczy komunikat "done" pod każdym zapisem. W wyniku działania kodu powstały dwa pliki tekstowe, które można otworzyć w zwykłym notatniku systemowym. W pliku daneL.txt został zapisany wektor:
Jak widać kolejne współrzędne wektora zostały oddzielone przy pomocy znaku spacji. Podobnie została zapisana macierz z tą różnicą, że kolejne wiersze macierzy zostały zapisane do kolejnych wierszy:
Na podstawie powyższych plików warto zauważyć, że w przypadku wprowadzania listy punktów należałoby utworzyć plik tekstowy w którym kolejne punkty byłyby zapisane w oddzielnych wierszach, a ich współrzędne powinny być rozdzielone spacją.
Do odczytywania danych przygotowano w programie Maxima kilka funkcji i każda inaczej interpretuje dane zapisane w pliku. Bardzo ważne, aby pamiętać, że np. zapisaną macierz w pliku można potraktować jako macierz, ale również jako wektor, gdzie należy zignorować wszystkie znaki nowej linii.
Najprostszą funkcją do odczytania danych jest funkcja read_list(), która przyjmuje tylko jeden argument nazwę pliku w którym lista została zapisana. Warto jednak zwrócić uwagę na to jak funkcja ta traktuje obydwa, wcześniej zapisane pliki:
(%i5) | read_list("daneL.txt"); | |
(%o5) | [1, 2, 3, 4, 5] |
(%i6) | read_list("daneM.txt"); | |
(%o6) | [1, 2, 3, 4, 5, 6, 7, 8, 9] |
Jak można zauważyć podczas wczytywania danych z pliku z zapisaną macierzą zostały skonwertowane na listę całkowicie ignorując podział na wiersze.
W celu wczytania macierzy należy użyć innej funkcji read_matrix() ponownie podając kolejny jedyny argument - nazwę pliku. Przykładowe zastosowanie wygląda następująco:
(%i7) | read_list("daneM.txt"); | |
(%o7) |
Jak widać tym razem program poprawnie zintepretował dane wejściowe. Oczywiście należy pamiętać, że podczas wczytywania macierzy we wszystkich wierszach musi być identyczna liczba elementów. Inaczej Maxima zwróci błąd.
W przypadku, gdy jednak istnieje potrzeba wprowadzenia danych w wierszach o nierównej długości to można skorzystać z funkcji read_nested_list(). Każdy wiersz jest wtedy traktowany jako oddzielna lista, a wszystkie odczytane listy są umieszczane na liście wynikowej.
Przypuśćmy, że na dysku znajduje się plik "daneZ.txt", który wygląda następująco:
Wczytując ten plik przy pomocy funkcji read_nested_list() program zwróci:
(%i8) | read_list("daneZ.txt"); | |
(%o8) | [[1], [2, 3], [4, 5, 6]] |
Po dokładnym zapoznaniu się z powyższym artykułem obsługa plików nie powinna stanowić problemu. Warto nadmienić, że jest to jedynie wstęp i funkcje mają różne inne ustawienia i jest ich o wiele więcej. W celu utrwalenia materiału polecam wykonać zadania umieszczone w sekcji Zadania.
Utwórz macierz 3×3, gdzie na pozycji i, j będzie stała wartość i·j2 i zapisz ją do pliku "dane.xyz". Następnie wczytaj dane na listę i podnieś każdy składnik do kwadratu. Otrzymaną listę zapisz tym razem do pliku "wynik.txt". Poprawnym wynikiem będzie: