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

Pascal-program dotyczący spalania paliwa w sam.

02 Lut 2009 21:19 5606 30
  • Poziom 10  
    Witam wszystkich! Dostałem na zadanie domowe dośc ciekawy program i chce go dobrze zrobić , ale nie prosze by ktoś odwalił robote za mnie. Opisze w prosty sposób : mamy jakieś wyścigi samochodowe , jesteśmy serwisantami i nie wiemy na ile metrów bądź km drogi zostało nam jeszcze paliwa. I to własnie mamy wyliczyć, tylko program trzeba dodatkowo zbajerować i dobrze zrobić pod względem technicznym. Dystans ( całkowita droga wyścigu) i droge (przebyte już kilometry) mamy wprowadzić sami. Spalanie średnie mamy przyjąć sami i zadeklarować jako stałe. Tak więc mamy wyliczyc km ile nam zostało tj : dystans - droga. W tym programie można tez a nawet trzeba wyliczyć pozostały zapas paliwa tj bak - (droga przebyta*spalanie) . A teraz moje dodatkowo wprowadzone bajery do tego programu , myśle żeby uwzględnić pogode i wtedy spalanie zadeklarujemy o jakiś tam procent większe. Przykładowo w case'ie : 1-normalne warunki bez deszczu , 2- lekka mżawka .... i tak spalanie by sie zwiększało. Czy ktoś ma jakieś pomysły żeby jeszcze coś dodaćdo tego programu? Bardzo mi zależy na tym. Mam Nadzieje że wszyscy wiedzą o co mi chodzi.
  • Poziom 42  
    Ja bym uwzględnił np zmniejszającą się wagę samochodu, która spowoduje krótsze czasy przejazdu, ergo - mniejsze spalanie (samochód jest w stanie szybciej wchodzić na wyższe biegi). Generalnie spalanie powinno być zależne nie od drogi pozostałej, lecz od pozostałego czasu potrzebnego na przebycie drogi do końca wyścigu.
  • Poziom 22  
    Może uwzględnić umiejętności kierowcy, podzielić je np na:
    - podstawowy - największe zużycie paliwa, złe pokonywanie zakrętów, zła zmiana biegów złe hamowanie
    - średnio zaawansowany
    - profesjonalista - najbardziej ekonomiczna jazda, bardzo dobre operowanie biegami i hamulcami

    Można także dodać ogumienie /twarde,miękkie/, wagę kierowcy /wiadomo co ma tu być/, pogodę już podałeś

    Aaa, można wprowadzić parametr jakość/rodzaj paliwa
    czyli np 95 oktanów, 98 oktanów i V-Power, wiadomo czym więcej oktanów tym więcej można przejechać

    I to chyba na razie wszystko co przychodzi mi na szybko do głowy
  • Poziom 10  
    Myślałem że na tym forum nikt mi nie odpowie na takie coś ;) Teraz mi sie narzuciły jeszcze 3 rzeczy jak przeczytałem tą odpowiedź, przy włączonych światłach spalanie bedzie większe. A także spalanie może zależeć od cisnienia opon oraz rodzaju paliwa. Tylko nie wiem jeszcze czy to uwzględniać. Napisze ten program niedługo i dodam go tutaj w celu sprawdzenia. Narazie czekam na inne wskazówki. Dzięki ;)

    Dodano po 4 [minuty]:

    Nie wiem jeszcze jak zapisac tą zależność pozostałego paliwa względem czasu. Mam nadzieje że wiecie o co chodzi?
  • Poziom 14  
    Załóżmy że w czasie T0 masz pełen bak. Znasz procent spalania paliwa na minute(sekundę) więc obecny stan paliwa jest równy różnicy stanu początkowego minus współczynnik spalania razy różnica czasów od stanu początkowego do teraz9(T1). Możesz też sobie wyliczyć, że np jechałeś przez 10 min z włączonymi światłami a później rozpadał się deszcz i dodatkowo uwzględnić jak to wpłynęło na ubytek paliwa.
  • Poziom 10  
    z tym czasem już mi rozjasniłeś tylko czy można napisac taki program który bedzie tak działał : "jechałeś przez 10 min z włączonymi światłami a później rozpadał się deszcz i dodatkowo uwzględnić jak to wpłynęło na ubytek paliwa"
    Byłoby super, tylko ja nie mam pojęcia jak to zrobić :)
  • VIP Zasłużony dla elektroda
    Problem z ubywającą masą pojazdu jest zdecydowanie najciekawszy, choć pewnie w sytuacjach rzeczywistych wpływ tego czynnika jest niewielki - ale zobacz np. wyścigi F1.

    Problem jest ciekawy, bo żeby go opisać potrzeba równania różniczkowego. Myślę, że jak rozwiążesz taki problem nawet w przybliżeniu (np. uwzględniając zmianę masy/spalania skokowo, powiedzmy co przejechane 1000m), to nauczyciel będzie wniebowzięty ;)

    Pozdrawiam,
    Dr.Vee
  • Poziom 14  
    Musisz sobie zaimplementować historię. Historia będzie polegała na tym, że będziesz pamiętał przedziały, na których były jakieś zmiany. Np:
    Jechałeś 10 minut. Historia podróży:
    [0 - 2): nic się nie działo
    [2 - 3): włączyłeś światła
    [3 - 7): padał deszcz
    [7 - 8): padał deszcz + włączyłeś światła
    [8 - 10]: jechałeś normalnie

    A więc musisz sobie zaimplementować historię złożoną z przedziałów. Każdy przedział czasowy ma swój współczynnik spalania. Ubytek paliwa: sumujesz wszystkie ubytki na każdym przedziale.
  • Poziom 10  
    Dr.Vee napisał:
    Problem z ubywającą masą pojazdu jest zdecydowanie najciekawszy, choć pewnie w sytuacjach rzeczywistych wpływ tego czynnika jest niewielki - ale zobacz np. wyścigi F1.

    Problem jest ciekawy, bo żeby go opisać potrzeba równania różniczkowego. Myślę, że jak rozwiążesz taki problem nawet w przybliżeniu (np. uwzględniając zmianę masy/spalania skokowo, powiedzmy co przejechane 1000m), to nauczyciel będzie wniebowzięty ;)

    Pozdrawiam,
    Dr.Vee


    Może pan mi powie mniej więcej jak to zapisać ? Dziękuje
  • Poziom 14  
    Wykorzystanie równań różniczkowych, to by było w symulatorze ruchu samochodu ;). Wydaje mi się że na potrzeby tego programu wszystko możemy sprowadzić do współczynnika spalania paliwa. Im mniej paliwa, tym lżejszy samochód a co za tym idzie - tym mniejszy współczynnik spalania.
  • Poziom 10  
    właśnie mykhalo też tak mi sie wydaje, poprostu za każdym razem odejmowac jakąś cześć z normalnych warunków (zalezy czego dotyczy ) lub np jakąś część ze spalania przy jeździe bez świateł. Ja cały program widze w "case'ie" i potem rozpisujemy dziłania. Czy może wiecej niż 1 case?
  • Poziom 14  
    To jak już to konkretnie zaimplementujesz to nie ma większego znaczenia.
    Masz zmienną współczynnik spalania i w każdej jednostce czasu odejmujesz pewny procent paliwa w zależności od tej zmiennej. Każda metoda, która włącza światła, deszcz itp, to zwiększa ten współczynnik. Każda metoda wyłączająca światła, deszcz itp - zmniejsza ten współczynnik. A więc wszystko zależy od tego jak rozwiążesz problem operowania na tej zmiennej.
  • Poziom 10  
    Myślę że z góry najlepiej będzie odrazu wybrać warunki pogodowe, pore dnia, opony itp. Bo tak nie jestem w stanie napisac że po 10 minut zaczęło padać ale zaczął zapadać zmrok i trzeba włączyc światła. Nie mma pojęcia jak można by to zrobić. A jakby przyjąc zmiane masy do zwiększenia spalania? Jak tu znaleźć wpółczynnik? Jakoś nei może mi sie jeszcze kilka rzeczy rozjaśnić...
  • Poziom 14  
    Możesz zawsze użyć klawiatury. Wciskasz D i pada deszcz. Wciskasz raz jeszcze i przestaje padać. A jeśli chodzi o masę to możesz zrobić to np tak. Samochód z pełnym bakiem ma masę M0 z pustym bakiem ma masę M1.
    Różnica mas to ΔM = M0 - M1. Teraz załóżmy sobie że jeśli samochód ma masę M0 to do współczynnika spalania dodajesz 1 a jeśli ma masę M1 to do współczynnika spalania dodajesz 0(bak i tak jest pusty). Czyli wystarczy sobie teraz przekształcić jeden przedział na drugi i znaleźć jaki punkt z przedziału [0, 1] odpowiada punktowi z przedziału [M0, M1]. I właśnie to będzie ta zmiana współczynnika spalania.
  • Poziom 42  
    Przepraszam, jeśli coś powtórzę, ale wątek się szybko rozrósł :) A co do różniczkowania, to taką uproszczoną metodą może być postapienie np tak:
    1. Zadajesz czasy zmian parametrów (może to być tablica)
    2. Przyjmujesz jakąś jednostkę podstawową (np. minuta, okrążenie) i co minutę wyliczasz w pętli zużycie (w przeciągu tego czasu). Oczywiście sumując ilość spalonego paliwa. W ten sposób na bieżąco także będzie ulegał zmianie czynnik zużycie/masa.
    3. Działając w pętli do momentu wyczerpania paliwa łatwo wyznaczysz ile pozostanie w baku po przejechaniu zadanej odległości/czasu.

    Wadą takiego postępowania jest w zasadzie brak odwracalności tego algorytmu - program wszystko wyznaczy jedynie drogą doświadczalną.
  • Poziom 10  
    Przepraszam ze z takim opóźnieniem. Dzięki wszystkim za wskazówki. Postaram się napisać ten program niedługo i dam go tutaj, może ktoś będzie miał lepszy pomysł i przerobi go. Zależy mi bardzo na tym :)
  • Poziom 42  
    W moim odczuciu Twój zapał oraz ambicje uczynią ten program już znacznie przekraczającym granice wymagalności stawiane przez Twojego nauczyciela :) Ostrożnie, abyś nie podniósł sobie poprzeczki zbyt wysoko w ten sposób! :)
  • Poziom 10  
    Tak wiec napisałem coś dzisiaj w godzinke ;) miałem całe ferie ale wiadomo że sie nie chce w ferie i zostawia sie na ostatnią chwile . Jeśli ktos ma inny pomysł i jeśli ktoś by coś tu jeszcze dodał to bardzo prosze o napisanie. Nie dopisałem kilku linijek , nie wiem jak wyliczyć na ile km mi jeszcze wystarczy paliwa? Nie wiem także jak można wyliczyć zmieniające sie zużycie paliwa wraz ze zmiejszającą sie masa pojazdu? Tylko chciałbym żeby to było w prosty sposób. Ja też za dobry w tym programowaniu nie jestem i dopiero sie ucze. O to program :

    Code:
    Program SP_F1;
    
    uses crt;

    var odp , odp1, odp2, odp3, odp4 : byte;
    var a,b,s,c,d,e,u,o,p,w,sp_r,droga_p: real;
    begin

    clrscr;

         writeln('Podaj średnie spalanie w l/100km');
         readln(a);
         writeln('Podaj całkowity dystans wyścigu w km');
         readln(b);
         writeln('Podaj przejechaną dotąd droge w km');
         readln(s);
         writeln('Podaj ilość paliwa w litrach w baku po tankowaniu');
         readln(e);

         writeln('Wybierz umiejętności kierowcy');
         writeln('1- Podstawowe');
         writeln('2- —Średnio zaawansowany');
         writeln('3- Zaawansowany');
         readln(odp);

         case odp of
                  1: begin
                     u:=a+(a*0.02)
                     end;

                  2: begin
                     u:=a*1
                     end;

                  3: begin
                     u:=a-(a*0.03)
                     end;
         end;

         writeln('Wybierz rodzaj ogumienia');
         writeln('1- Twarde');
         writeln('2- —Średnie');
         writeln('3- Miękkie');
         readln(odp1);

         case odp1 of
              1: begin
                 o:=a-(a*0.05)
                 end;

              2: begin
                 o:=a*1.00
                 end;

              3: begin
                 o:=a+(a*0.05)
                 end;
         end;

         writeln('Wybierz rodzaj paliwa');
         writeln('1- 95 oktan˘w');
         writeln('2- 98 oktan˘w');
         writeln('3- V-Power lub inna wysokooktanowa');
         readln(odp2);

         case odp2 of
              1: begin
                 p:=a*1.00
                 end;

              2: begin
                 p:=a-(a*0.03)
                 end;

              3: begin
                 p:=a-(a*0.05)
                 end;
         end;

         writeln('Wybierz pore dnia');
         writeln('1- Dzień');
         writeln('2- Noc');
         readln(odp3);

         case odp3 of
              1: begin
                 d:=a*1.00
                 end;

              2: begin
                 d:=a+(a*0.02)
                 end;
         end;

         writeln('Wybierz warunki atmosferyczne');
         Writeln('1- Slonecznie');
         Writeln('2- Mzawka');
         Writeln('3- Umiarkowany deszcz');
         Writeln('4- Intensywny deszcz');
         Writeln('5- Umiarkowany snieg');
         Writeln('6- Intensywny snieg');
         readln(odp4);

         case odp4 of
              1: begin
                 w:=a*1.00
                 end;

              2: begin
                 w:=a+(a*0.01)
                 end;

              3: begin
                 w:=a+(a*0.02);
                 end;

              4: begin
                 w:=a+(a*0.03);
                 end;

              5: begin
                 w:=a+(a*0.04);
                 end;

              6: begin
                 w:=a+(a*0.06);
                 end;
         end;


         writeln('—średnie spalanie realne na trasie w litrach wynosi: ');
         writeln(((u+o+p+d+w)/5):0:2);

         writeln('Pozostała droga do przejechania w km to : ');
         writeln((b-s):0:2);

         writeln('Pozostały zapas paliwa w litrach wynosi : ');
         writeln(e-(s*(u+o+p+d+w)/5/100):0:2);
         readln;
         readln;
         readln;
    end.


    Proszę umieszczać kod w znacznikach [code] - dodałem.
    [Dr.Vee]
  • Poziom 14  
    Po pierwsze, to umieść swój kod w odpowiednich znacznikach. Wiem że to Pascal, ale Pascal to też język programowania i należy go tak samo szanować jak inne :D . Muszę powiedzieć, że trochę mnie rozczarowałeś. Miał być deszcz, zmienne warunki atmosferyczne, branie pod uwagę utraty paliwa, zmęczenie kierowcy... Spodziewałem się czegoś więcej. Na przyszłość rodzę używać zmiennych w kodzie, zamiast wpisywanie wszędzie współczynników. Będziesz teraz chciał zmienić jakąś wartość, to musisz przeszukać cały projekt.
  • Poziom 23  
    Jeżeli w case wykonujesz tylko 1 instrukcje dla zakresu zmiennej to niepotrzebny jest blok begin end
    Code:
    case odp of
    
      1:u:=a+(a*0.02);
      2:u:=a*1;
      3:u:=a-(a*0.03);
    end;

    dodatkowo używaj wcięć, masz zmienne których nie używasz, nie musisz dawać dwa razy var wystarczy raz i po nim wypisywać zmienne. Co do programu to możesz umieścić go w pętli repet until i na końcu zrobić warunek wyjścia np. czy opuścić czy powtórzyć z naciśnięciem klawisza T lub N ;)
  • Poziom 10  
    Wcięcia były ale jak wkleiłem tutaj to własnei wszystko wyrównało do lewej. Zawsze pisze z wcięciami , bo dużo lepiej wtedy wszystko widać. Mykhalo - nie mam pojęcia jak własnie zrobić takie coś że nagle zaczyna padać deszcz i np robi się dzień ;/ i chciałbym uwzględnić zmieniającą sie mase , a co za tym idzie mniejsze spalanie. I jak mam wyliczyć na ile km mi jeszcze wystarczy? Mykhalo mógłbyś mi to jakoś napisać ? Byłbym wdzięczny!
  • Poziom 42  
    MAteusz - najprościej to empirycznie i rekursywnie. Czyli musisz podzielić cały dystans (on nie jest znany!) na mniejsze fragmenty i w pętli je wyliczać - parametry będa Ci się zmieniać na bieżąco). Końcowa odpowiedź wyjdzie sama (musisz tylko sprawdzać, kiedy braknie paliwa i przerwać pętlę sprawdzając, ile udało się przejechać.

    No chyba, ze wolisz liczyć całkami :) Wtedy da się to wykonać bez pętli.
  • Poziom 10  
    ja sie porgramowania ucze od kilku miesięcy w szkole :/ więc nie mam pojęcia jak to zapisać ;/ Mi pewne rzeczy trzeba najpierw pokazać , wtedy to sam przemyśle i juz wiem o co chodzi. Dżyszla nie napisałbyś mi tego fragmentu?
  • Poziom 42  
    Code:
    Droga:=0;
    
    Paliwo:=50;
    Czas_Total:=0;
    while Paliwo>0 do begin
       Inc(Droga,1); //1km
       Czas:=80-(50-Paliwo)*0.1; //Czas pokonania owego 1km; przy pełnym zbiorniku 80 sekund; przy pustym 75 sek.
       Czas_Total:=Czas_Total+Czas;
       Paliwo:=Paliwo-(Czas*0.01); //współczynnik spalania - 0.01L/s
       if Droga=100 then begin
           Czas_Total:=Czas_Total+(50-Paliwo)+20; //tankowanie trwa 1l/sek + 20 sek na zjazd;
           Paliwo:=50; //tankujemy po 100 km
       end;
    end;
    writeln('Na 50 l. przy tankowaniu na 100 km do pełna ujedzie się ',Droga,' km w ciągu ',Czas_Total/60,' min');
    Parametry są abstrakcyjne i niesprawdzone.
  • Poziom 10  
    Dżyszla czyli rozumiem że mam wprowadzić w programie poprawki i wyliczyc tak jakby prędkość i czas ?

    Dodano po 7 [minuty]:

    a czy za paliwo można powstawić zmienna którą wprowadziliśmy ile jest litrów podczas tankowania ?
  • Poziom 42  
    Całkowanie po drodze (bo zastosowana pętla jest niczym innym, jak wzorem na przybliżone wyliczenie wartości całki dowolnej funkcji), czyli przyjęcie za podstawę rozważania przebytej drogi to chyba najprostsze logicznie posunięcie, ale nic nie stoi na przeszkodzie, by podstawą było np. spalone paliwo lub czas. Kwestia to właściwie wyliczać pozostałe parametry i właściwie pouzalezniać je od siebie. Wszystko może być sparametryzowane, wszystko może być uzaleznione od większej liczby czynników. Można nawet w skrajności doprowadzić do tzw. "efektu motyla", czyli wręcz marginalnego wpływu daleko powiązanych parametrów.
  • Poziom 10  
    Mnie się wydaje ze poprostu łatwiej jest uzależnić wszystko od drogi a nie od czasu. Podajemy przebytą droge i ilość paliwa w baku i według tego można to wyliczyć. Ale jak to uzależnić według tego co Dżyszla napisałeś? Bo ja tego jakoś nie widze i nie moge pojąć :(
  • Poziom 42  
    Ale musisz pamiętać, że na danej drodze spalanie jest różne! Wszak przykładowo rozpędzając cięższy samochód na odcinku 100m spali on więcej, niż samochód lżejszy gdyż ten drugi szybciej przyspieszając przebędzie dany odcinek w krótszym czasie (pomijam np wpływ oporu powietrza) W algorytmie całym podaje się jedynie parametry początkowe i warunki końca - jeśli liczymy drogę, możemy co najwyżej podać drogę do przebycia, a nie drogę przebytą.
  • Poziom 10  
    ale drogę do przebycia możemy wyliczyć z całkowitego dystansu i przebytej drogi, tak jak to zrobiłem i przyjmujemy że samochód mamy cały czas ten sam , tak jakby to było liczone dla jednego samochodu. Chciałbym wprowadzić to do swojego programu że ze zmieniającą sie masa samochodu zmniejsza sie spalanie ale nie wiem juz całkowicie jak to zrobić :(
  • Poziom 42  
    Tyle, że parametr "droga do przebycia" zupełnie o niczym nie mówi (jeśli nie stworzymy wzorów i nie policzymy wzoru całki). Cały czas myślisz racjonalistycznie, a do problemu należy podejść empirycznie! Przecież testy zderzeniowe też są po to, by z nich wyciągać wnioski. We wszelkich doświadczeniach, szczególnie tych, w których wynik zależy od wielu czynników, obserwuje się teraźniejszość i przeszłość, a nie mówi, co się stanie za chwilę. Dlatego jakiekolwiek wybieganie w przyszłość (pomijając predykcję, która wyłącznie szacuje przyszłe wyniki na podstawie historycznych) nic nie da!