Forum > Tematy dowolne > Pomoc w języku C - podejście drugie

Strona 1 z 1 1
skocz

Ignacek 9

Wysłane 2013-12-08 15:03

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 \"\przytul\"

Pozdro.

szarlih

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 " '

to wyżej to nie prawdy objawione tylko moje prywatne opinie « R7 3700X ⇔ Aorus X570 Elite ⇔ RTX 3070 ⇔ 32GB DDR4 ⇔ 2x EV2450BK ⇔ G815 + G903 HERO »

Netman

  • Netman
  • wiadomość Użytkownik

  • 6787 wypowiedzi

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? \"\sam_nie_wim\"

i7 6700k, G.Skill 16GB 3000Mhz, Asus GTX970 DirectCu II Strix, SSD Samsung 256GB, Gigabyte GA-Z170-HD3P, Xonar XD, Dell U2715h ۻۻ Galaxy Tab S ۻۻ Galaxy S8 ۻۻ

szarlih

Wysłane 2013-12-08 17:23

@Netman

uwierz mi: klienci dają dużo bardziej bezsensowne wymagania.
a nic tak nie uczy jak praktyka.

to wyżej to nie prawdy objawione tylko moje prywatne opinie « R7 3700X ⇔ Aorus X570 Elite ⇔ RTX 3070 ⇔ 32GB DDR4 ⇔ 2x EV2450BK ⇔ G815 + G903 HERO »

Inferno

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 :)

Netman

  • Netman
  • wiadomość Użytkownik

  • 6787 wypowiedzi

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.

i7 6700k, G.Skill 16GB 3000Mhz, Asus GTX970 DirectCu II Strix, SSD Samsung 256GB, Gigabyte GA-Z170-HD3P, Xonar XD, Dell U2715h ۻۻ Galaxy Tab S ۻۻ Galaxy S8 ۻۻ

szarlih

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.

to wyżej to nie prawdy objawione tylko moje prywatne opinie « R7 3700X ⇔ Aorus X570 Elite ⇔ RTX 3070 ⇔ 32GB DDR4 ⇔ 2x EV2450BK ⇔ G815 + G903 HERO »

Ignacek 9

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

szarlih

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.

to wyżej to nie prawdy objawione tylko moje prywatne opinie « R7 3700X ⇔ Aorus X570 Elite ⇔ RTX 3070 ⇔ 32GB DDR4 ⇔ 2x EV2450BK ⇔ G815 + G903 HERO »

endriu_l

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

Ignacek 9

Wysłane 2013-12-09 16:52

A, program ma jeszcze zapisywać informację, w której linii pojawia się jaki nawias :)

szarlih

Wysłane 2013-12-09 16:59

@Ignacek 9
to już jest naprawdę detal

pseudokod \"\jezor\" :

if(znak == '}')
zapisuj że taki nawias
else if(znak == '{')
zapisuj że taki inny nawias

to wyżej to nie prawdy objawione tylko moje prywatne opinie « R7 3700X ⇔ Aorus X570 Elite ⇔ RTX 3070 ⇔ 32GB DDR4 ⇔ 2x EV2450BK ⇔ G815 + G903 HERO »

Ignacek 9

Wysłane 2013-12-23 19:46

Pokusiłby się ktoś o napisanie tego w całości?
Odwdzięczyć się mogę kuponem na Sniper Ghost Warrior 2 lub AMD Bronze :)

Inferno

Wysłane 2013-12-24 00:18

@Ignacek 9
Interesujące :) A te kupony dają gry za free, czy jednak trza coś jeszcze wyłożyć ? Bo ja w tej chwili pieniążków mam malutko.

Ignacek 9

Wysłane 2013-12-24 12:45

@Inferno Całkowicie za friko ;D
Tylko że ten od AMD jest ważny jedynie do końca 2013 roku ;)

Inferno

Wysłane 2013-12-24 14:49

@Ignacek 9
Łoo, będzie ciężko, ale dopiero mógłbym zacząć w drugi dzień świąt :) W razie czego możesz napisać do mnie na GG, bądź mail i dowiemy się dokładnie jak to ma wyglądać :)
A na kiedy masz program oddać ? Mam nadzieję, że się wyrobię.

endriu_l

Wysłane 2013-12-24 16:13

@Ignacek 9
\"\olaboga\" 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.

Ignacek 9

Wysłane 2013-12-24 17:41

@endriu_lDużo racji endriu.. Po prostu ostatnie 2 tygodnie miałem zawalone robotą... A że studiuję od niedawna to chyba po Twojej interwencji zastosuję się do punktu pierwszego :)

Strona 1 z 1 1
skocz

Kto jest online: 0 użytkowników, 258 gości