Pobieranie danych z pliku do zmiennej.

0

Witam
Chce zrobic program w pascalu obliczajacy pierwiastki rownania kwadratowego bioracy pod uwage rozwiazania liczb zespolonych,. Z pascalem nie mam nic wspolnego, tak wiec chodzi mi jedynie o rade, w jednej drobnej kwestii. Program ma pobierac z PLIKU 3 wspolczynniki rownania kwadratowego a,b,c i chcialbym by zapisywal kazdy w osobnej zmiennej. Plik ma strukture:

1 -5  2
6 4 -1
3 5  5

Niewiem czy za to zadanie powinienem sie zabrac za pomoca tablicy trzywymiarowej czy jest jakis sposob aby poszczegolne liczby zapisac w poszczegolnych zmiennych i to sobie potem dam pod petla(i czy znak przy LICZBIE bedzie brany pod uwage). Prosze jedynie o podpowiedz w jakis sposob wykonac taki program, nie potrzebny mi zaden gotowy program, jedynie tok myslenia.

jesli chodzi o reszte liczaca pierwiastki w zaleznosci od delty mam juz gotowe, chodzi mi jedynie o pobieranie z pliku. I prosze w miare laickim jezykiem.

Oczywiscie wiem na czym polega pobieranie calych linijek w pascalu, ale jak pobrac np: 1 jako a -5 jako b i 2 jako c ??

dodanie znacznika <code> - fp

0

czy jest jakis sposob aby poszczegolne liczby zapisac w poszczegolnych zmiennych i to sobie potem dam pod petla

Tablica rekordów/obiektów.

ale jak pobrac np: 1 jako a -5 jako b i 2 jako c ??

No pomyśl, jak masz do stringa wczytaną linijkę w formacie a b c, to jak chciałbyś wyłuskać konkretne wartości?
Podpowiem, że masz nawet do tego wbudowane funkcje (inb4 - jeżeli zapytasz "jakie to", odeślę Cię do Google tak czy siak).

0

Po pierwsze dzieki za zainteresowanie i chec pomocy.
Nie wiem o jaka konkretnie ci funkcje chodzi, moze powinienem odczytac pozycje znakow znajac dlugosc calej linijki i potem skombinowac to do tablicy, ale czy to wezmie pod uwage znak przy wartosci?
2. Wczytana linia znakow to string czyli podejrzewam ze trzeba bedzie go jeszcze przekonwertowac tak?

Z drugiej strony znalazlem gotowca ale cos to za proste mi sie wydaje:
np. odczytanie trzech liczb z pliku, którego zawartość to:

1 2 3
wykonujemy za pomocą

ReadLn(F, a, b, c);

Na googlu sie juz troche oszukalem i sa tam podobne programy ale niewiem czy o to chodzi i potrzebuje ukierunkowania.
Wiem ze glupie i proste problemy poruszam ale nie siedze przy programowaniu praktycznie wcale, ale sie zobowiazalem i nie mam wyjscia.

dodanie znacznika <code> i <code class="delphi"> - fp

0

Nie wiem o jaka konkretnie ci funkcje chodzi, moze powinienem odczytac pozycje znakow znajac dlugosc calej linijki i potem skombinowac to do tablicy, ale czy to wezmie pod uwage znak przy wartosci?

Poczytaj o operacjach na stringach w Pascalu; chyba nawet jest pewien artykuł w tym serwisie.

Wczytana linia znakow to string czyli podejrzewam ze trzeba bedzie go jeszcze przekonwertowac tak?

Przekonwertować na liczbę, oczywiście. Patrz wyżej.

wykonujemy za pomocą ReadLn(F, a, b, c);

Ano, nie pomyślałem początkowo - tak też można (http://ideone.com/iwRsdH) zamiast ręcznie wyłuskiwać konkretne wartości.

0

No to wskrzeszamy temat bo mam jeszcze kilka prostych mysle pytan.
Liczone pierwiastki sa typu rzeczywistego i niestety wyswietlaja sie w nieprzyjemny sposob typu:8.2000000000 +000E
1.Chcialbym by pierwiastki wyswietlaly sie z dokladnoscia do tylu miejsc po przecinku ile bedzie trzeba, probowalem pisac w sposob:
writeln(a:2); ale to pozostawia wiele watpliwosci jesli bedzie potrzeba wiecej miejsc...
2. Chcialbym zamiast poczatkowego fora dac while not EoF niestety gdy daje not eof plik sie w ogole nie wczytuje.
3. Prosilbym o jakis tutorial chce z tego kodu zrobic aplikacje okienkowa. Oszukałem sie tego w googlach i nic procz fpc i programach z delphi nie znalazlem. Pisze w Lazarusie, wiem ze ma on jakies narzedzie do pisania apki okienkowej, ale potrzebuje jakiegos poradnika.

Moj program wyglada tak:

program project1;
var F:Text;
    s:string;
    a,b,c:real;
    i:integer;
begin

 {teraz odczyt z pliku}
 Assign(F, 'xxx.txt');
 Reset(F);
    for i:=1 to 6 do
 begin
  ReadLn(F, a,b,c);
if(a=0) then  write('Jest to funkcja liniowa, jej rozwiazanie to',-c/b)
else
if(b*b-(4*a*c)=0) then  write('Funkcja ma jedno miejsce zerowe jest nim ',-b/(2*a))
else
if(b*b-(4*a*c)>0) then  write('wieksze ',-b/2*a)       else       //wersja probna wiec tylko sprawdza czy dziala//
if (b*b-(4*a*c)<0) then  write('mniejsze ',-b/2*a);
         readln();
 end;
 readln();

end.

Double bo edit nie odswieza.

dodanie znacznika <code class="delphi"> - fp

0

Jak określić potrzebę więcej miejsc?
Jeżeli nie działa - to niepoprawnie wpisujesz.
Za wcześnie ci na okienka skoro konsoli nie ogarniasz.

0

Eof juz dziala.
Wiecej miejsc mozna okreslic jezeli kolejne sa 0. (zerami) Ale wynik nie moze byc zaokraglany bo ma wyjsc liczba rzeczywista, lub brak rozwiazan czyli rozwiazanie zespolone.
Nie za wczesnie, pascala sie ucze zaledwie chwile. Po prostu musze to z gui zrobic, takie wymagania. Juz znalazlem niezly angielski filmik na yt, ale to za malo. Chodzi mi o cos w miare przystepnego, konretnie pod cos pdoobnego, ja juz bede to analizowac.
Chcialbym rowniez okreslic epsilony, czy w pascalu mozna jakos zaokraglac liczby?
13thdrakon jezeli nie masz zamiaru pomagac, to prosze nie przeszkadzaj. Nie lubie jak ktos wyskakuje na mnie z znegowanym stosunkiem, nie dotykaj i nie rob.
Ma byc to na projekt to nie mam wyjscia. Pascala sie ucze jakies lacznie 3 godziny wiec i tak nie jest zle.

0

Z jaką precyzją ma zostać wypisana 1/3 ?
Ile kolejnych ma być zerami ?
Czy wiesz że 0.1 to tak naprawdę: 0.10000000000000001 http://ideone.com/v1yGw5 ?

0

@_13th_Dragon
Stwierdzilem ze do 2 programu uzytkownik sam ustali dokladnosc. Mysle ze jest ok.
Poradzilem sobie z tym za pomoca czegos takiego:
np.) var wynik:real; ... writeln(wynik 2) [6 - na wyświetlenie przeznaczasz 6 znaków; 2 - dwa miejsca po przecinku]

Pozostala kwestia jakis poradnikow, tutoriali, oczywiscie szukam na necie, ale wolalbym decyzje osoby siedzacej w temacie gui w lazarusie. Aktualnie wzoruje sie na filmiku gdzie gosc tworzy kalkulator.

O tej jedynce na koncu nie wiedzialem.

Mysle ze do reala moglbym to ewentualnie zmienic w 1 programie, ale przeciez kazda kolejna liczba jest zerem wiec moze ustawie to na sztywno.

0

Prosze o pomoc. Co robie nie tak. Wzorowalem sie na roznych kodach dodaje tak samo i nie dziala:

yZ1ueXw.png

Albo prosze o jakiegos linku ktory by to lopatologicznie wytlumaczyl.

usunięcie zdublowanych linków do tego samego obrazu - fp

0

Czego nie rozumiesz w komunikacie o błędzie?

0

Nierozumiem co jest źle.

0

To nie C++. W pascalu nie ma typu float jeśli chcesz użyć typu zmiennoprzecinkowego do dyspozycji masz:
-Real48
-Single
-Double
-Real
-Extended
-Comp
-Currency

0

Teraz to nic nie rozumiem. To po co jest konwersja StrToFloat i na odwrot? http://www.freepascal.org/docs-html/rtl/sysutils/strtofloat.html

0

google translate:

Convert a string to a floating-point value.

Przekształcenie łańcucha na wartość zmiennoprzecinkową.

StrToFloat converts the string S to a floating point value. S should contain a valid string representation of a floating point value (either in decimal or scientific notation). The thousandseparator character may however not be used.

StrToFloat konwertuje łańcuch s do wartości zmiennoprzecinkowej. S powinna zawierać poprawną reprezentację ciągu wartości zmiennoprzecinkowej (albo w notacji dziesiętnej lub naukowego).Charakter thousandseparator nie może jednak być stosowane.

Które słowo jest jeszcze nie zrozumiałe?

0

Wystarczylo napisac ze funkcja konwersjii jest, ale typ Float w pascalu nie istnieje. To mnie zdziwilo bo ogladalem tutorial i skoro gosc uzyl strtofload to na mysl by mi nie przyszlo ze typu float nie ma. I prosilbym bys nie pisac w tak arogancki sposob. Oczywiscie dziekuje za pomoc. Dalem reala i smiga.

0

@Szelmuś - dobrze, że zaglądnąłeś do dokumentacji, ale nie przeczytałeś jej uważnie:

function StrToFloat(
  const S: 
):Extended;

function StrToFloat(
  const S: ;
  const FormatSettings: TFormatSettings
):Extended;

tak wygląda podana deklaracja, w której jak byk widnieje typ Extended;

Dodatkowo na zadanie domowe zobacz sobie na artykuł, w którym wypisane są wszystkie typy zmiennoprzecinkowe + Currency - Supported RealTypes; Jak widać nie ma typu Float, z resztą nigdy go nie było w Pascalu :]


To mnie zdziwilo bo ogladalem tutorial i skoro gosc uzyl strtofload to na mysl by mi nie przyszlo ze typu float nie ma.

A gdyby była funkcja StrToNumber, to próbowałbyś na siłę użyć typu Number? On też nie istnieje; Nazwy funkcji nie zawsze odpowiadają idealnie nazwom typów;

Funkcja StrToFloat jest ogólna, bo konwertuje łańcuch znaków do wszystkich typów zmiennoprzecinkowych, więc nie było sensu tworzyć dla każdego typu osobnej funkcji; Jej nazwę można rozwinąć do String To Floating Point Number, co znaczy łańcuch znaków do liczby zmiennoprzecinkowej, a typ jest dowolny;

To samo tyczy się StrToInt, która operuje na typach całkowitoliczbowych, jak Byte, Word, Cardinal, Integer itd., bez wskazania na konkretny jeden.

0

Witam, kod pisałem bardzo dawno ale potem miałem miesieczna przerwe a juz niespelna tydzien i projekt musze oddac i tu pojawia sie kilka prostych problemów, w google szukałem i nie potrafie nic znaleźć.

 if Application.MessageBox('Czy chcesz pobrać dane z pliku??', 'Question', MB_YesNo + MB_IconQuestion) = IdYes then
          OpenDialog1.InitialDir := ExtractFileDir(Application.Exename);

               OpenDialog1.Filter := 'All Files|*.txt;*.TXT' ;
       OpenDialog1.Execute   ;      

Chciałbym by domyślnym folderem dla imoportowanego pliku tekstowego był folder gdzie jest exek aplikacjii, ale nie smiga.

Jak pobrac liczby z memo ? Jak sie dowiedziec ile lini ma memo? Próbowałem w ten sposob:

 countMEMO:= Memo1.lines.Count;

ale linie w memo sa stringami wiec to chyba odpada, gdzie countMEMO to suma lini pliku(ich liczba).;
2. Chciałbym wykorzystac gotowy program ktory mam juz od dluzszego czasu podmieniajac plik na memo:

program project1;

var F:Text;
    s:string;
    a,b,c,delta,discriminant,re,im:real;
    i,dok1,dok2:integer;
begin

 {teraz odczyt z pliku}
 Assign(F, 'cycki.txt');
 Reset(F);
 Writeln('Z jaka dokladnoscia maja zostac podane ewentualne pierwiastki?(a -liczba cyfr,b - liczba cyfr po przecinku');
 write('a - ');
 readln(dok1);
 write('b - ');
 readln(dok2);

    while not eof(f) do

 begin
  ReadLn(F, a,b,c);
  delta:=b*b-(4*a*c);
if(a=0) then  write('Jest to funkcja liniowa, jej rozwiazanie to ',-c/b:dok1:dok2)
else
if(delta=0) then  write('Funkcja ma jedno miejsce zerowe jest nim ',-b/(2*a):dok1:dok2)
else
if(delta>0) then   write('x1= ',(-b-(sqrt(delta)))/2*a:dok1:dok2,'    x2= ',(-b+(sqrt(delta)))/2*a:dok1:dok2) else
begin
   re := -b / (2 * a);
   discriminant := sqr (b) - 4 * a * c;
   im := sqrt (abs (discriminant)) / (2 * a);
   if discriminant >= 0
     then write ('Pierwiastki to ', re + im:dok1:dok2, ' i ', re - im:dok1:dok2)
     else write ('Pierwiaski zlozone: ', re:dok1:dok2, 'I*', im:dok1:dok2, ' and ', re:dok1:dok2, 'I*', im:dok1:dok2)   ;
//if (delta)<0 then  write('Pierwiastki nierzeczywiste x1=' ,-b+sqrt(-delta)/(2*a):dok1:dok2,'i    x2=',-b+sqrt(-(delta)):dok1:dok2,'i');
   readln();
 end;
 readln();
     end ;
end.

W tym przypadku Eof zamienie liczbą lini memo, ale niewiem jak zapisac współczynniki z linii memo(który jest stringiem) do zmiennych a,b,c.
Nie ukrywam ze zalezy mi na wygodnym wczytywaniu współczynników poprzez Readln(F,a,b,c);

Moja aplikacja liczaca rozwiazania rownan kwadratowych ma juz 23 MB, prawdopodobnie coś sknociłem, co może być powodem tak duzej wagi? (pisze w lazarusie, wiem ze kompiluje on na wiele platform ale to cos za duzo)
PROSZE O WYROZUMIAŁOŚĆ.

Teoretycznie moge dodac button z wczytaniem z pliku i od razu wypisaniem ale jak moge to zrobic by sie wywołał open/save dialog? Chodzi mi o taka sytuacje:
Jak sie odwołać do pliku wybranego przez uzytkownika, poprzez jaka funkcje, by go potem przypisac do zmiennej. Gdzies to widzialem na forum ale znalezc nie moge.
Mam nadzieje ze ktos zrozumie mój bełkot.

dodanie znacznika <code class="delphi"> - fp

0
Szelmuś napisał(a)

Chciałbym by domyślnym folderem dla imoportowanego pliku tekstowego był folder gdzie jest exek aplikacjii, ale nie smiga.

Na pewno masz poprawne rozstawienie bloków w tym kodzie? (begin..end)

Jak pobrac liczby z memo ?

Normalnie - odwołując się do property Strings i wykorzystując odpowiednie funkcje konwertujące.

Jak sie dowiedziec ile lini ma memo?

xyz.Lines.Count

ale niewiem jak zapisac wspolczynniki z lini memo(ktory jest stringiem) do zmiennych a,b,c.

Ale oczywiście szukałeś i NIC o tym nie było napisane na innych stronach?

Nie ukrywam ze zalezy mi na wygodnym wczytywaniu współczynników poprzez Readln(F,a,b,c);

Nie ukrywam, że Readln-em nie odwołasz się do instancji klasy w sposób, w jaki byś chciał.

Moj aplikacja liczaca rozwiazania rownan kwadratowych ma juz 23 MB, prawdopodobnie coś sknociłem, co moze byc powodem tak duzej wagi? (pisze w lazarusie, wiem ze kompiluje on na wiele platform ale to cos za duzo)

W świetle terabajtowych dysków 23 MB to jest ot tak, nic wielkiego.
Ale powodem są informacje dla debuggera, o czym byś wiedział, gdybyś raczył sam ruszyć cztery litery i sprawdzić na ich oficjalnej stronie. Mają to nawet w ich FAQ.

0
Patryk27 napisał(a):
Szelmuś napisał(a)

ale niewiem jak zapisac wspolczynniki z lini memo(ktory jest stringiem) do zmiennych a,b,c.

Ale oczywiście szukałeś i NIC o tym nie było napisane na innych stronach?

Nie ukrywam ze zalezy mi na wygodnym wczytywaniu współczynników poprzez Readln(F,a,b,c);

Nie ukrywam, że Readln-em nie odwołasz się do instancji klasy w sposób, w jaki byś chciał.

Moj aplikacja liczaca rozwiazania rownan kwadratowych ma juz 23 MB, prawdopodobnie coś sknociłem, co moze byc powodem tak duzej wagi? (pisze w lazarusie, wiem ze kompiluje on na wiele platform ale to cos za duzo)

W świetle terabajtowych dysków 23 MB to jest ot tak, nic wielkiego.
Ale powodem są informacje dla debuggera, o czym byś wiedział, gdybyś raczył sam ruszyć cztery litery i sprawdzić na ich oficjalnej stronie. Mają to nawet w ich FAQ.

1.Dokładnie tak, znalazlem tylko odwoływanie sie do całej lini.
2.W takim razie jak?
3.Fakt faktem ze do programow nigdy nie czytałem FAQ, nie czułem takiej potrzeby i nie spodziewalem sie ze w faq bedzie info o duzej wadze plyiku. W takim razie czy mozna sie ich pozbyc (info debuggera), .czyt usunąc?
W lazarusie siedze juz 8-10 h wiec prosze o wyrozumiałośc, chce zrobic projekt i miec spokoj, raczej delphi pozniej mi sie nie przyda, wiec jesli zadaje nawet te trywialne pytaniato prosze o w miare konstruktywne odpowiedzi. Gdybym cos znalazl na goglach nie pisal takich dlugich postów.

quote="1008499">\

Jak pobrac liczby z memo ?

Normalnie - odwołując się do property Strings i wykorzystując odpowiednie funkcje konwertujące.

W tym momencie nawet nie wiem co do mnie napisałeś. Property czyli właściwosci stringa czyli czego? Gdzie to jest? O co chodzi?

0

1a) http://www.freepascal.org/docs-html/rtl/sysutils/sscanf.html
1b) operacje tekstowe
1c) zapisanie tekstu memo do pliku i wykorzystanie Readln - jest to najgłupsze wyjście, ale kto co woli.

2.Używając Readln nijak się nie odwołasz do TStringList, prawdę mówiąc.

3.Więc może byś teraz łaskawie w końcu zajrzał do tego FAQ? Nawet Ci gotowy link podałem.

4.http://4programmers.net/Delphi/Właściwości

0

FAQ przejrzałem, tak jak myślałem wystarczyło to co napisałeś o informacjach debuggera, reszta tych informacjii jest mi do zycia nie potrzebna.
Skoro mówisz ze to najgłupsze wyjscie to jak to zrobic "lepiej"? Niemam zadnego stażu w programowaniu wiec lepiej poradzic sie madrzejszego czyz nie? jakie rozwiazanie proponujesz?

Cała rzecz polega na tym by osoba ktora zaimpotruje dane z pliku do memo mogla sobie potem cos do nich dopisac i robi to w memo, potem po kliknieciu buttona "do pliku: oblicza dane do nowego pliku wyjsciowego.
Chcialem tak to zrobic.
Dołączam kod jesli ktokolwiek moglby go przejrzec byloby miło, wiem ze jest tam masa niepotrzebnych rzeczy, dlatego prosze i opinie. Czytam to co wrzuciles jak sprobuje to rozpracowac.

0
Szelmuś napisał(a)

jakie rozwiazanie proponujesz?

1a, 1b.

0

Ty czasem nie wrzuciles linku do wskaznikow? Chce zrobic prosty programik a nie od razu uczyc sie calego delphi..

1 użytkowników online, w tym zalogowanych: 0, gości: 1