Implementacja liczb rzeczywistych do programu.

0

mam taki problem że mój program liczący całkę oznaczoną nie potrafi sobie poradzić z liczbami spoza przedziału <-9,9> jednocześnie nie należącymi do całkowitych. zastanawiam się w jaki sposób można by to zrobić

program calka;
uses crt;
        const
          max=50;
          step=1/1000;
var
  v,y,z:text;
  n,m,i,d,l,m2:integer;
  l3:integer;
  o,x,p,q,b,c,m1:real; // granice calkowania  b,c granice calkowania
  t: array [1..max] of char; // wejscie
  s: array [1..max] of char; // stos symboli
  w: array [1..max] of char; //wyjscie
  k: array [1..max] of real;//  wynik onp
  h1: array [1..1000000] of real;// calka
  h2: array [1..1000000] of real;// calka
  kod,kod2:word;
  a:string[50]; // nasza funkcja
  procedure obliczonp(r:integer);
  begin
       for i:=1 to d do
           begin

            if w[i] in ['0','1','2','3','4','5','6','7','8','9'] then
            begin
            val(w[i],k[r],kod);
               r:=r+1;
               end
            else if w[i] in ['x'] then
                   begin
                    if c>b then
                     begin
                       k[r]:=x;
                       r:=r+1;
                       end
                    else
                    begin
                    x:=c;
                   end;
               end
            else if w[i] in ['*'] then
                  begin
                  p:=k[r-1];
                  q:=k[r-2];
                  k[r-2]:=p*q;
                   r:=r-1;
                   end
            else if w[i] in ['+'] then
                  begin
                  p:=k[r-1];
                  q:=k[r-2];
                  k[r-2]:=p+q;
                  r:=r-1;
                  end
            else if w[i] in ['/'] then
                  begin
                  p:=k[r-2];
                  q:=k[r-1];
                  k[r-2]:=p/q;
                  r:=r-1;
                  end
            else if w[i] in ['-'] then
                    begin
                    p:=k[r-1];
                    q:=k[r-2];
                    if q=0 then  // warunek dla '-' bedacym minusem znakowym
                            begin
                           k[r-1]:=-p
                            end

                  else if q<>0 then
                     begin
                  k[r-2]:=q-p;
                  r:=r-1;
                  end;
                    end
            else if w[i] in ['='] then
                    begin
                    o:=k[r-1];
                    end;

end;
     //writeln(k[r-1]:5:2); // kontrola czy dobrze liczy
  end;
  procedure onp(j,k:integer);

  begin
       for i:=1 to max do
           begin
                if t[i] in ['0','1','2','3','4','5','6','7','8','9','x'] then
                        begin
                        w[j]:= t[i];
                       j:=j+1;
                       end
                else if t[i] in ['('] then
                   begin
                   s[k]:=t[i];
                   k:=k+1;
                   end
                else if t[i] in [')'] then
                   begin
                 repeat  begin
                   w[j]:=s[k-1];
                   j:=j+1;
                   k:=k-1;
                   end;   until s[k-1] in ['('];
                   s[k]:= t[max]; // prowizoryczne zerowanie
                   end

                else if t[i] in['='] then
                     begin
                          for  k:=k-1 downto 1 do  //zrzucanie operatorow ze stosu
                               begin
                               w[j]:=s[k];
                               j:=j+1;
                               end;
                          w[j]:='=';
                          end
                else if t[i] in ['+','-'] then
                     begin
                          if s[k-1] in ['+','-','/','*'] then
                             begin
                                  for l:=1 to k-1 do
                                      begin
                                           if s[k-1] in ['+','-','/','*'] then    //priorytety wykonywania dzialan
                                              begin
                                              w[j]:=s[k-1];
                                              k:=k-1;
                                              s[k]:=t[i];
                                              j:=j+1;
                                              end;
                                      end;
                                      k:=k+1;
                             end
                                             else
                                                 begin
                                                 s[k]:=t[i];
                                                 k:=k+1;
                                                 end;
          end
                   else if  t[i] in ['/','*'] then
                        begin
                             if s[k-1] in ['/','*'] then   //priorytety wykonywania dzialan
                                begin
                                w[j]:=s[k-1];
                                s[k-1]:=t[i];
                                j:=j+1;
                                end
                             else
                                 begin
                                 s[k]:=t[i];
                                 k:=k+1;
                                 end;
                         end;
          end;
           write('wzor onp przyjmuje postac   ');

          for j:=1 to j do
             begin
             write(w[j]);
             d:=j;
             end;
          writeln;
           writeln;
           writeln;
end;
  procedure prostokat();
   begin
        writeln('wybrano metode prostokatow');
               for n:=1 to n do
                   begin
                   h1[n+1]:=h1[n+1]+h1[n];
                   end;
   writeln('calka w przyblizeniu wynosi');
   writeln(h1[m2]*step:5:5);
   end;
 procedure trapez();
  begin
        writeln('wybrano metode trapezopodobna');
        begin
                                   for n:=1 to n do
                                       begin
                                       h2[n+1]:=h2[n+1]+h2[n]
                                       end;
        writeln('calka w przyblizeniu wynosi');
        writeln((2*h2[m2]-h2[1])/2*step:5:5);
        end;
   end;
begin
begin
begin
    Writeln('Zanim zaczniesz korzystac z programu calka upewnij sie ze w pliku "calka.txt" ');
    Writeln('jest wzor funkcji calkowanej zakonczonej znakiem "=", a  w plikach "calka2.txt oraz "calka3.txt"  ');
    Writeln('odpowiednio dolna i gorna granica calkowania');
    Writeln('');
         ASSIGN(v, 'calka.txt');
         ASSIGN(y, 'calka2.txt'); {granica górna calkowania}
         ASSIGN(z, 'calka3.txt'); {granica dolna calkowania}
                   reset(v);
                   reset(y);
                   reset(z);
                   readln(v, a);
                   readln(y, b);
                   readln(z, c);
                   close(v);
                   close(y);
                   close(z);
                   end;
                    write('wzor f calkowanej  ');         writeln(a);
                    write('Dolna grania calki:  ');        writeln(b:5:5);
                    write('gorna granica calki:  ');        writeln(c:5:5);
                      t:=a ; {nadaje tabeli stringi z pliku "calka.txt"}
                      onp(1,1);
                      x:=b;
                      obliczonp(1);
                      n:=1;
                 repeat
                     obliczonp(1);
                     x:=x+step;
                     h1[n]:=o;
                     h2[n]:=o;
                     n:=n+1;
                     until x>c;
end;
m1:=(c-b)/step;
m2:=round(m1);
writeln('wybierz metode calkowania');
writeln('1 metoda prostokatow');
writeln('2 metoda trapezopodobna (dokladniejsza przy wyzszych potegach)');
writeln('3 obie metody jednoczesnie');

readln(l3);

if l3=1 then
   begin
        writeln;writeln;writeln;
   prostokat;
   end
else if l3=2  then
   begin
   writeln;writeln;writeln;
   trapez;
   end
else if l3=3 then
   begin
   writeln;writeln;writeln;
   trapez;
   writeln;writeln;writeln;
   prostokat;
   end;
Repeat until keypressed;
end. 

jak mniej lub bardziej widać program opiera się o ONP i teraz mam prośbę czy ktoś mógłby mi pomóc przerobić go tak by działały w nim wszystkie liczby real lub chociaż integery?

0

zamień wszędzie real na double

0

wątpie by to coś dało.

głównie rozchodzi się o tę procedurę

 procedure onp(j,k:integer);
 
  begin
       for i:=1 to max do
           begin
                if t[i] in ['0','1','2','3','4','5','6','7','8','9','x'] then
                        begin
                        w[j]:= t[i];
                       j:=j+1;
                       end
                else if t[i] in ['('] then
                   begin
                   s[k]:=t[i];
                   k:=k+1;
                   end
                else if t[i] in [')'] then
                   begin
                 repeat  begin
                   w[j]:=s[k-1];
                   j:=j+1;
                   k:=k-1;
                   end;   until s[k-1] in ['('];
                   s[k]:= t[max]; // prowizoryczne zerowanie
                   end
 
                else if t[i] in['='] then
                     begin
                          for  k:=k-1 downto 1 do  //zrzucanie operatorow ze stosu
                               begin
                               w[j]:=s[k];
                               j:=j+1;
                               end;
                          w[j]:='=';
                          end
                else if t[i] in ['+','-'] then
                     begin
                          if s[k-1] in ['+','-','/','*'] then
                             begin
                                  for l:=1 to k-1 do
                                      begin
                                           if s[k-1] in ['+','-','/','*'] then    //priorytety wykonywania dzialan
                                              begin
                                              w[j]:=s[k-1];
                                              k:=k-1;
                                              s[k]:=t[i];
                                              j:=j+1;
                                              end;
                                      end;
                                      k:=k+1;
                             end
                                             else
                                                 begin
                                                 s[k]:=t[i];
                                                 k:=k+1;
                                                 end;
          end
                   else if  t[i] in ['/','*'] then
                        begin
                             if s[k-1] in ['/','*'] then   //priorytety wykonywania dzialan
                                begin
                                w[j]:=s[k-1];
                                s[k-1]:=t[i];
                                j:=j+1;
                                end
                             else
                                 begin
                                 s[k]:=t[i];
                                 k:=k+1;
                                 end;
                         end;
          end;
           write('wzor onp przyjmuje postac   ');
 
          for j:=1 to j do
             begin
             write(w[j]);
             d:=j;
             end;
          writeln;
           writeln;
           writeln;
end; 

działa ona tak że dla wyrażenia na wejściu np 253=
otrzymujemy 253
= i tu jest problem bo algorytm obliczania onp liczy tylko 5*3 i tę 2jkę ignoruje i nie wiem jak sobie z tym poradzić, dla tablicy charów nie da się wprowadzić do jednej komórki liczby a w tabeli stringów nie działa komenda if tabela[komorka] in....

0

t[i] - zamień na stringa.
for - zamień na while
if t[i] in ['0','1','2','3','4','5','6','7','8','9','x'] then - x obrabiaj osobno
if t[i] in ['0','1','2','3','4','5','6','7','8','9'] then - tu metodą połowienia znajdź najdłuższy ciąg który nie wyłoży StrToFloat(Copy(t,Z,max-Z)), gdzie Z od i do max

0

mógłbyś mi wytłumaczyć jak działa ostatnia linijka? aha i problemem jest to że jak t[i] zamienię na stringa to operacja in pisze że jest overloaded >.<

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