Mam dość duży problem. Dostaliśmy na studiach zadanie, dzięki któremu możemy podwyższyć sobie trochę ocenę z C/C++, z części C dostaliśmy zadanie, ale mam z nim pewien problem. Oto treść zadania:
Poprawka do C
Program ma umożliwiać wykonywanie operacji na wektorach wczytywanych z pliku. Poniżej lista wymagań:
Możliwe elementy:
skalar, zapisywany w postaci
S nazwa wartość
wektor, zapisywany w postaci
V nazwa wymiar_x
wartość_1 ... wartość_n // dane mogą być podzielone na kilka linijek
macierz
M nazwa wymiar_nx wymiar_ny
wartość_1 ... wartość_nx*ny // dane mogą być podzielone na kilka linijek
S, V, M są słowami kluczowymi, nie mogą się zmieniać. nazwa jest dowolnym łańcuchem znakowym, wymiar jest typu int, wartość typu float
Oraz operacje:
+ dodawanie
- odejmowanie
* mnożenie
/ dzielenie
T transponowanie
. iloczyn skalarny
x iloczyn wektorowy
D wyznacznik
R macierz odwrotna
Plik wejściowy korzysta z odwrotnej notacji polskiej, np dla działania (a+b)*c elementy będą w pliku w następującej kolejności:
a // element S, V lub M
b // element S, V lub M
+
c // element S, V lub M
*
Dla działania a*(b+c)
a
b
c
+
*
Program ma zwracać wynik w postaci elementu S, V, lub M na stdout oraz do pliku wyjściowego.
Wszystkie błędy muszą być zwracane na stderr, w przypadku wystąpienia błędu program ma zwrócić odpowienii kod błędu:
0 - wszystko OK, wynik na ekranie
1 - błąd parsowania pliku, w przypadku gdy plik nie spełnia założonego formatowania
2 - błąd działania, w przypadku gdy nie da się wykonać działania, np S T, S V +, niezgodne wymiary macierzy, etc...
Założenia:
plik wejściowy nie będzia miał wiecej niż 100 argumentów (ale trzeba to sprawdzić!)
nazwa każdego elementu nie będzie dłuższa niż 16 znaków (ale trzeba to sprawdzić!)
Wymagania:
a) program musi używać struktur do przechowywania danych S, V, M,
b) struktury powinna przechowywać pełną informacje o typie i własnościach
wszystkie działania powinny odbywać się przez funkcje, które przyjmują struktury jako argumenty
struktury będące wynikiem działania programu powinny mieć element nazwa w postaci index_%03d gdzie zakodowana liczba jest kolejnym numerem operacji, startując od 0
program musi się składać z trzech jednostek kompilacji:
a) zaliczenie_c.c - główny kod, zawiera funkcję main()
b) operacje_m.c - wszystkie operacje matematyczne w postaci funkcji
c) operacje_io.c - wszystkie operacje wejścia/wyjścia, czyli czytanie/pisanie plików, wyświetlanie wyniku na ekranie
jednostki kompilacja 4b) i 4c) muszą posiadać odpowiednie pliki nagłówkowe
programu musi posiadać plik Makefile kompilujący program do pliku 'zaliczenie_c', każdy plik *.c kompilowany osobno, wymagane targets
a) all - buduj wszystko
b) clean - wyczyść pliki powstałe w wyniku kompilacji
wywołanie programu:
zaliczenie_c plik_wejściowy plik_wyjściowy
Wskazówki:
do przechowywania kolejki argumentów można wykorzystać tablicę uni, unia może przechowywać każdy z typów danych
tablica powinna zachowywać się jak stos - dorzucamy elementy na końcu lub usuwamy z końca
użyć zewnętrznego indeksu do oznaczania aktualnej pozycje na stosie
podobnie robimy dla tablicy operacji
dopuszczam możliwość konsultacji ale pewne rodzaje podpowiedzi które będą polegały na podaniu konkretnych rozwiązać związane będą z obniżką oceny o 0.5 stopnia.
Warunki zaliczenia:
warunkiem uzyskania oceny pozytywnej jest przesłanie działającego programu
za działający program jest maksymalna ocena 5.0
za niechlujnie napisany program (brak porządnego formatowania i wcięć będą odejmowane 0.5 stopnia)
błędy i ostrzeżenia podczas kompilacji skutkują brakiem oceny
j.w. wspomniano, można konsultować program ale może się to wiązać z obniżeniem oceny, o czy ostaniecie poinformowani przed uzyskaniem odpowiedzi
program będzie testowany na plikach testowych, wgląd do nich będzie po ocenieniu zadania
zastrzegam możliwość weryfikacji samodzielności wykonania zadania poprzez rozmowę ze studentem w celu dyskusji zastosowanych rozwiązań (standardowa obrona zadania)
Rozwiązanie proszę przesłać jako archiwum tar.gz.
Ja już pisałem program z operacjami na macierzach wektorach itd. Robiłem osobne funkcje do dodawania, odejmowania, mnożenia i dzielenia. Tylko, że ja to w inny sposób robiłem, po prostu czytałem z pliku i zapisywałem te rzeczy do zmiennych/tablic i później dawałem to jako argumenty do funkcji i jakoś szło. Tutaj jest ta odwrotna notacja Polska i nie wiem jak się za to zabrać, nawet nie wiem jak zacząć, bo zastanawiam się nad dwoma rzeczami.
- Zastanawia mnie ten fragment
Plik wejściowy korzysta z odwrotnej notacji polskiej, np dla działania (a+b)*c elementy będą w pliku w następującej kolejności:
a // element S, V lub M
b // element S, V lub M
+
c // element S, V lub M
*
Czyli jak robię np. mnożenie wektora przez skalar załóżmy. Mam wektor [3, 5] i skalar 6.
To co mam to tak zapisać w pliku wejściowym czy co?
3
6
*
5
6
*
+
????
I tak z każdym działaniem?
Po co są te słowa kluczowe, czy może poprzez słowa kluczowe mam to zapisywać typu
S
V
*
I co wtedy zrobić? Mam zrobić jakiś case, że jeśli w tablicy (do której wartości wsadziłem poprzez czytanie z pliku) [n-2] to S, a [n-1] to V i [n] to *, to wtedy wywołuje funkcję mnozenie_skalar_wektor()???
Macie pomysł może od czego zacząć robić ten program, żebym go zrozumiał? Chyba zacznę od czytania po prostu macierzy/wektora/skalaru i przypisaniu ich do odpowiednich struktur? Taki zrobiłem mniej więcej plik wejściowy.
S skalar1 3
S skalar2 5
V wektor1 3
2 4 7
V wektor2 3
3 6 1
macierz_A 3 3
1 2 3
4 5 6
7 8 9
macierz_B 3 3
9 8 7
6 5 4
3 2 1