Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Pascal - Procedury wczytywania i wypisywania plików

dezerter69 12 Gru 2014 14:02 684 11
  • #1 12 Gru 2014 14:02
    dezerter69
    Poziom 9  

    Witam,
    Trochę za późno zabrałem się za pisanie programu na zaliczenie. Temat mojego projektu to statystyki pliku , ile slow ile znakow ile linii i histogram. Ten program chce napisać sam, ale że na laborkach z programowania podczas wykłądania procedur i funkcji zagapiłem się i praktycznie nic nie wyniosłem z tych zajęć to mam teraz pewne problemy zrozumieć procedury i funkcje.
    Na razie moim problemem jest napisanie dwóch procedur 1. wczytanie pliku 2. wypisanie zawartosci pliku.
    Oto co mam, jak mówiłem, nie do końca łapie ocb więc program może być trochę nie logiczny.

    Kod: pascal
    Zaloguj się, aby zobaczyć kod


    Wiem, że w przy deklaracji w programie procedury WczytywaniePliku nie może być w nawiasie (var plikOtwierany) bo nigdzie wcześniej nie jest sczytywany ale nie wiem w jaki sposób pierwsza procedura może nadać zmienna globalną by druga procedura mogła ją dostać więc napisałem to tak i liczę, że napiszecie mi/ nakierujecie mi jak mam to rozwiązać.

    a tutaj procedury napisane w Lazarusie przy pomocy modułów.

    Kod: pascal
    Zaloguj się, aby zobaczyć kod



    Kod: pascal
    Zaloguj się, aby zobaczyć kod

    0 11
  • #2 12 Gru 2014 14:18
    arnoldziq
    Moderator Programowanie

    Niepotrzebnie otwierasz i czytasz plik w osobnych procedurach.
    Zrób jedną procedurę (albo lepiej funkcję) do odczytu nazwy pliku z klawiatury.
    I przekaż te nazwę do kolejnej procedury, która plik otworzy i wyświetli.

    0
  • #3 12 Gru 2014 14:33
    dezerter69
    Poziom 9  

    Wiem, że tak byłoby efektowniej, ale właśnie szukam takiego rozwiązania jak podałem, bo chce bardziej zrozumieć procedury i funkcje, dzięki poprawnemu zapisowi takich dwóch procedur łątwiej by mi było zrozumieć jak działają prcedury a dokładniej jak za pomocą jednej procedury nadać zmienną do innej.
    Dodatkowo zmienna plikOtwierany używam w innych procedurach w moim projekcie i chce tą zmienną nadać w procedurze a nie w głownym programie.
    Chciałem pierwszą procedurę zapisać za pomocą funkcji ale funkcja nie może być typu tekst.

    Tak chciałem to zapisać.


    Kod: pasca
    Zaloguj się, aby zobaczyć kod

    0
  • #4 12 Gru 2014 14:46
    arnoldziq
    Moderator Programowanie

    To zrób tak :

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0
  • #5 12 Gru 2014 14:52
    dezerter69
    Poziom 9  

    Tak właśnie chciałem zrobić ale pisze mi
    wczytaniepliku.pas(4,28) Error: Illegal function result type
    Z tego co kumam funkcja nie może być typu plikowego nie wiem jednak czemu.

    0
  • #6 12 Gru 2014 14:57
    arnoldziq
    Moderator Programowanie

    Racja :/
    Nie pomyślałem o tym.
    No to pozostaje Ci taki zapis :

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0
  • #7 12 Gru 2014 15:07
    dezerter69
    Poziom 9  

    Ok ta procedura mi się kompiluje, teraz jednak nie kompiluje mi się procedura wypisywania.

    Kod: pascal
    Zaloguj się, aby zobaczyć kod

    taki błąd mi się pojawia.
    wypisaniepliku.pas(7,11) Error: Forward declaration not solved "WypisaniePliku(var Text);"

    I czy taki zapis w programie głównym będzie poprawny ?

    Kod: pascal
    Zaloguj się, aby zobaczyć kod

    0
  • #8 12 Gru 2014 15:21
    arnoldziq
    Moderator Programowanie

    dezerter69 napisał:
    I czy taki zapis w programie głównym będzie poprawny ?

    Nie.
    Zrób tak :
    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0
  • #9 12 Gru 2014 16:09
    dezerter69
    Poziom 9  

    Intuicja mi podpowiada, że tak głowny program wyglądać nie może bo program najpierw kompiluje moduły a dopiero potem kompiluje reszte więc z tego co kumam w głownym programie nie może być zdeklarowana zm plikOtwierany:text. W dodatku przy każdej procedurze zmienna plikowa musi być podana z varem przynajmniej z tego co rozumiem.
    Postanowiłem, że tym razem napiszę funkcje która sczyta plik do tablicy.
    Ale mogę się mylić.
    Chce to teraz zrobić za pomocą funkcji która zmieni plik na tablice a potem to funkcje wypisze za pomoca procedury. Skompilowało się, ale nie wypisuje pliku.

    Pr główny

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Funkcja
    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Procedura

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    przy okazji jak uzyskac dlugosc stringa ?
    chcialem zrobic typ tablicowy
    TTabString: array = [1..Length(string)] of string . Ale nie działało.
    I czy da się jakoś by zmienna IloscLini mogła być użyta w procedurze ? Jak ją zmienić w zmienna globalną ?

    0
  • #10 12 Gru 2014 16:15
    arnoldziq
    Moderator Programowanie

    Wybacz, ale to co napisałeś, to kompletna bzdura :/
    Zastanów się proszę, ile to zajmie pamięci :

    Kod: delphi
    Zaloguj się, aby zobaczyć kod
    I w ogóle jaki ma to sens.

    Twój program powinien się zawierać w kilku prostych krokach:
    1. Odczyt nazwy pliku z klawiatury.
    2. Otwarcie pliku.
    3. Odczyt linii tekstu z pliku.
    4. Wyświetlenie linii tekstu.
    5. Sprawdzenie czy koniec pliku? Jeżeli nie powrót do punktu 3.
    6. zamknięcie pliku.
    7. Koniec programu.

    Odczytywanie więcej niż jednej linii tekstu na raz nie ma ani sensu ani potrzeby.
    A już tworzenie gigabajtowych tablic w pamięci, to już zupełna pomyłka.

    0
  • #11 12 Gru 2014 16:42
    dezerter69
    Poziom 9  

    Hahah, faktycznie coś mi się powaliło, zmniejszylem to na razie do 20 w celach próbnych ale wywala mi błąd, że przekroczyłem pamięć raised exception class 'External: SIGSEGV'.
    Dla tego tak dziwnie to pisze, ponieważ jest mi to potrzebne do projektu, w którym mam pobrać plik a następnie podać jego statystyki, liczba słów, liczba zdań, i histogram.
    I chce napisać program który działa tak,
    1.jest funkcja która sczytuje plik i zamienia go na tablice stringow.
    2.procedura która liczy ile linijek ma ta tablica
    3. procedura ktora zamienia tablice stringow na tablice charow i liczy ile tych charow jest (tutaj chyba nie trzeba zamieniac tablicy stringow na chary)
    4.procedura liczaca liczbe wystapien spacji i kropek, co w rezultacie ma dać liczbe slow
    5. procedura liczaca ile razy wystepuje poszczegolna litera.

    0
  • #12 12 Gru 2014 17:26
    arnoldziq
    Moderator Programowanie

    1. Tworzysz zmianą klasy TStringList. Ładowanie pliku TStringList.LoadFroFile(nazwa_pliku)
    2. Liczba linii -> TStringList.count
    3. Ilość znaków -> sizeof(TstringList.text)
    4. Liczenie spacji -> prosta pętla na przeliczanie występowania znaków w TStringList.text.
    5. To samo co wyżej, wywołane dla każdej litery.

    Ten program można napisać w ok 20 liniach. Deklarując 3-4 zmienne.

    0