Witajcie.
Ostatni projekt, o pomoc w którym was prosiłem poszedł mi bardzo dobrze. Jednak dostałem do napisania kolejne zadanie i znów zwracam się do userów in4 z prośbą o pomoc.
Otóż projekt przedstawia się następująco: Program ma wczytywać kod innego programu z pliku tekstowego, sprawdzać czy zgadza się ilość lewych i prawych nawiasów " { " i " } " , a także sortować wszystkie zmienne zawarte w tym programie według typu, a w ramach typu dodatkowo alfabetycznie.
Macie jakieś sugestie, co zastosować, aby powyższy program zrealizować? Z góry dzięki
Pozdro.
Forum > Tematy dowolne > Pomoc w języku C - podejście drugie
Wysłane 2013-12-08 15:03
Wysłane 2013-12-08 15:21 , Edytowane 2013-12-08 15:22
a co rozumiesz poprzez sortować zmienne? poustawiać w tym wczytanym programie i to nadpisać czy jak?
zakładając, że kod również w C to zmienne będą na początku każdej funkcji czyli musisz szukać wzorca "typ <rożna ilość różnych rzeczy>)<spacja lub enter lub nic>{", a potem typów
zmienne globalne będą na początku pod include i define, też łatwy wzorzec.
klamry ekstremalnie prosto:
czytasz znak po znaku i za każdym razem gdy trafisz na klamrę { inkrementujesz licznik klamer, a jak } dekrementujesz. jeżeli na koniec licznik ma 0 to się zgadza.
edytka:
powinieneś ewentualnie uwzględnić klamry pomiędzy znakami " '
Wysłane 2013-12-08 15:59
Zamiast uczyć programować, to dają w niczym służące zadania.
Fakt, jakieś pewnie regex wykorzystasz, sortowania, ale jakim kosztem?
Wysłane 2013-12-08 18:21
@Netman
Nawet pisanie dla siebie jakiegoś programiku i powoli budowanie coraz większego projektu powoduje, że nabierasz doświadczenia i wiesz już od czego zacząć. Możesz 10 razy pisać program, np. kalkulator, ale niech każdy następny będzie bardziej optymalny, bardziej rozbudowany, z usuniętymi wadami, które znalazłeś w poprzednich wersjach.
@Ignacek 9
Czy coś tam jeszcze potrzebujesz wiedzieć ? Bądź jest coś nie halo z kodem ? Pisz, a pewnie pomożemy :)
Wysłane 2013-12-08 18:59
@szarlih
Wymagania, które po prostu się programuje jak każde inne wymagania.
@Inferno
Tylko, że przez ten czas spędzony nad tym programem, można byłoby się nauczyć 10 nowych rzeczy.
Wysłane 2013-12-08 19:30
@Netman
No to teraz ma zaimplementować jak każdy inny taki program.
szukasz dziury w całym.
A kto mu zabroni to napisać na 10 sposobów ucząc się nowych rzeczy? Albo wykorzystać nowe struktury, zrobić to z wykorzystaniem wielowątkowości, czy co tam jeszcze chce.
Wysłane 2013-12-08 20:35
@szarlih Ach, zapomniałem dodać, że wynik przeprowadzonej analizy ma pójść do nowego pliku tekstowego.
Z klamrami: na przykład jak masz taką sytuację, że masz klamry pootwierane byle jak, np najpierw coś Ci się zamyka,a potem otwiera, to licznik będzie się zgadzał, a kod nie bardzo :D
Wysłane 2013-12-08 20:54
@Ignacek 9
No to możesz próbować czytać bloki. Wiesz, że blok ma zacząć się od linii deklaracji (typu funkcja, if, pętla) + { (w następnej lub w tej), a skończyć na }. Funkcję czytającą zapuszczasz w rekurencji (tzn. jeżeli wewnątrz bloku trafiasz na początek bloku to uruchamiasz ją jeszcze raz dla wewnętrznego bloku. Jak funkcja dojdzie do swojego } to ok. Jak nie, wywalasz błąd. Funkcja musi zwracać pozycje na której skończyła przetwarzanie, żeby ta, która ja wywołała wiedziała gdzie podjąć dalsze przetwarzanie. Po zakończeniu pierwszej funkcji sprawdzasz czy kod został przetworzony do końca (coś nie zostało). Musisz ignorować linie - komentarze i puste. Musisz ignorować klamry w cudzysłowach i apostrofach.
Jest to o tyle fajne, że w funkcji przetwarzającej blok możesz uruchamiać to sortowanie zmiennych.
Wysłane 2013-12-08 21:05 , Edytowane 2013-12-08 21:16
@Netman Proszę Cię, samymi regexpami tu nic nie podziałasz :)
Fajne algorytmiczne zadanko, z kilkoma rodzajami rozwiązania, które uczy nieźle myślenia analitycznego i projektowania swojego kodu żeby dało się go łatwo utrzymywać.
Odnośnie prośby:
Ja bym zrobił to rekurencyjnie. Każdy kolejny poziom zagnieżdżenia powoduje wywołanie rekurencyjne. Na początku metody sortujesz zmienne. Problemem może być warunek końca listy zmiennych, pamiętaj że syntaktycznie, kod jest rozdzielany średnikami a nie znakiem nowej linii więc jedna linijka może zawierać cały program :)
W skrócie:
1. Czytaj plik do znalezienia '{' lub EoF
1.1 Jeżeli EoF to wyjdź z programu. kod nie zawiera nawiasu otwierającego
2. przesuń się o znak i wywołaj metodę która sprawdza kod pomiędzy '{' i '}'
2a. Najpierw wczytaj zmienne - odkładaj je do tablicy, jeżeli chcesz wspierać deklaracje w stylu 'int aa,ac,ab' powinieneś posortować nazwy, ale do tablicy pakuj to jako jeden ciąg znaków
2b. Posortuj tablicę zmiennych (proste sortowanie stringów)
2c. po wczytaniu zmiennych, czytaj plik aż znajdziesz '{' '}' lub koniec pliku
2c1. '{' wywołaj metodę rekurencyjnie - ale musisz monitorować co ta metoda zwróci. Jeżeli 2c3 to zwróć to samo
2c2. '}' wyjdź z metody z kodem który mówi że skończył się blok (np. 1)
2c3. EoF wyjdź z metody z kodem który mówi że skończył się plik (np. -1)
3. W głównej pętli sprawdź co zwróciła rekurencyjne metoda, jeżeli -1 to masz zły plik (bo się zdążył skończyć a ty potrzebujesz jeszcze jeden nawias '}' ) , jeżeli 1 to wracasz do 1.
I to chyba tyle. Jeżeli uznasz to podejście za dobre - zacznij od szkieletu rekurencji z jakimś najprostszym plikiem przykładowym i potem dokładaj ficzery :) np. w punkcie 2c sprawdzaj czy znalezione znaki nie są umieszczone w '"' lub w komentarzu itp.
@Ignacek 9
wiesz... są takie aplikacje która sprawdzają czy klamry są dobrze domknięte....nazywają się kompilatory i są w **uj skomplikowane :D tu możesz poczytać o fazach kompilacji w 'c' [LINK] wydaje mi się, że nie o to w zadaniu chodzi :D
Wysłane 2013-12-09 16:59
@Ignacek 9
to już jest naprawdę detal
pseudokod :
if(znak == '}')
zapisuj że taki nawias
else if(znak == '{')
zapisuj że taki inny nawias
Wysłane 2013-12-24 16:13
@Ignacek 9
Nie wiem co studiujesz i gdzie, ale masz rozwiązanie wyłożone na tacy, wystarczy je zaimplementować. Jeżeli dopiero zaczynasz - to polecam zacisnąć zęby, poczytać o C i zrobić to samemu - nie musi być perfekcyjne, ważne żeby działało.
Jeżeli studiujesz już jakiś czas - to współczuję pracodawcy który będzie Cię zatrudniał.
Temat ciągnie się na forum już 2 tygodnie - nie wierzę że nie miałeś czasu żeby to zrobić.
Nie chcę wychodzić na drewniaka, który nie zna się na życiu a w trakcie studiów czas spędzał na hobbystycznym klepaniu kodu (zapewniam cię, MS AGH to nie jest miejsce dla abstynentów :D). Nie chodzi też o uczciwość wobec prowadzącego (chociaż jest to istotne) - chodzi o uczciwość wobec siebie. Możemy Ci doradzić, pomóc w znalezieniu rozwiązania, ale nie wyręczać Cię w zadaniu domowym - takie jest moje zdanie.
Kto jest online: 0 użytkowników, 258 gości