Jump to content
php.lv forumi

Pascal VAL funkcija


anddiiss

Recommended Posts

Sveiki!

Nezināju, kur citur rakstīt, tāpēc vienīgā loģiskā vieta izskatījās šī. Kā jūs manīsiet, esmu jauniņais, taču pat par spīti tam man ir milzum daudz problēmu ar kurām jātiek galā, piemēram, vecais labais pascal man negrib padoties rokā un strādāt kā vajag.

No manis tika prasīts izveidot programmu, kura atļauj ievadīt simbolu rindu: blabla 5.45 ahah utt..

To arī izdarīju, bija prasīts izvilkt reālos skaitļus no turienes, to arī panācu, papūloties, bet tagad, no manis ir prasīts saskaitīt šos skaitļus,diemžēl tas vairs nav tik vienkārši, dators pēc mana skripta skaita tā: 5.1 + 2 = 5+1+2=8 ... galīgi greizi.

Ko lai es pielaboju?

 

program Project1;
{$APPTYPE CONSOLE}
uses
 SysUtils;
var
  u:array[1..10]of real;
  f:array[1..10]of string = ('0','1','2','3','4','5','6','7','8','9');
  o:array[1..26]of string = ('a','b','c','d','e','f','g','h','i','j','k','l',
  'm','n','o','p','q','r','s','t','u','x','y','z','v','w');
  a,s,m,t:string;
  l,k,n,q,i:integer;
  sum:real;
begin
writeln;
writeln('------------------------------------------------------------------------');
writeln('Sis programmas merkis ir izvadit no simbolu rindas realos skaitlus!!');
writeln('Ludzu, ievadiet vairakus simbolus, lai no tiem atlasitu realos skaitlus!');
writeln('------------------------------------------------------------------------');
writeln;
write('Ievadit simbolu rindu: ');
readln(a);
m:='';
l:=length(a);
for n:=1 to l do
 begin
s:=Copy(a,n,1);
if (s = '.') then m:=m+s;
for q:=1 to 26 do begin
   	s:=Copy(a,n,1);
   	t:=Copy(a,n+1,1);
   	if (s = ' ') and (t = o[q] ) then m:=m;
   	end;
for k:=1 to 10 do
 	begin
   	s:=Copy(a,n,1);
   	t:=Copy(a,n+1,1);
   	if (s= ' ')  and (t = (f[k]))then m:=m+s;
   	if (s = (f[k]))then m:=m+s;
 	end;
  end;
writeln;
Write('Simbolu rindas realie sk.: ');
write(m);
writeln;
for n:=1 to l do
 begin
 Val(m[n], u[n], i);
 writeln(u[n]:2:2);
 sum:=sum+u[n];
 end;

//writeln('Ciparu summa ir : ', sum:2:2);
readln;

Edited by anddiiss
Link to comment
Share on other sites

Sagribējās atsvaidzināt Pascal zināšanas. :)

 

Īstenībā nesaprotu kāpēc Tev jāizmanto visi tie masīvi ar skaitļiem un burtiem? Arī mainīgo nosaukumi, izņemot Sum, nav informatīvi. Cik izskatās nav nemaz pārbaudes uz nestandarta pierakstu, piemēram '5..10', vai '5.10.8.7'. Viens no variantiem varētu būt šāds:

 

program realsum;

{$mode objfpc}{$H+}

uses
 {$IFDEF UNIX}{$IFDEF UseCThreads}
 cthreads,
 {$ENDIF}{$ENDIF}
 Classes,
 { you can add units after this }
 crt;

{$R *.res}

var
 RealNumbersSet: array[1..10] of real;
 InputString: String;
 ConvertedNumber, Sum: Real;
 Code: word;
 Dot: boolean;
 StringLength, FirstNumber, AsciiCode, i, j: Byte;

begin
 InputString := 'aaa 52.40 bbb 8.73.7.15 ccccccc5..10.';
 StringLength := Length(InputString);
 i := 1;
 j := 0;
 FirstNumber := 0;
 Dot := false;
 Sum := 0;

 while (i <= StringLength) do
 begin
  	AsciiCode := ord(InputString[i]);
  	if FirstNumber > 0 then
  	begin
       	if (AsciiCode = 46) then
       	begin
        		if (i = StringLength) or (ord(InputString[i + 1]) = 46) or (Dot) then
        		begin
                 	AsciiCode := 0;
                 	Dot := false;
        		end
        		else
            		Dot := true;
       	end;

       	if ((AsciiCode < 48) or (AsciiCode > 57)) and (AsciiCode <> 46) then
       	begin
        		val(Copy(InputString, FirstNumber, i - FirstNumber), ConvertedNumber, Code);
        		if Code = 0 then
        		begin
                 	inc(j);
                 	RealNumbersSet[j] := ConvertedNumber;
        		end;
        		FirstNumber := 0;
        		Dot := false;
       	end;
  	end
  	else
  	begin
       	if (AsciiCode >= 48) and (AsciiCode <= 57) then
       	begin
        		FirstNumber := i;
       	end;
  	end;
  	inc(i)
 end;

 writeln('Real values in string:');
 for i := 1 to j do
 begin
  	writeln(RealNumbersSet[i]:0:2);
  	Sum := Sum + RealNumbersSet[i];
 end;

 writeln;
 writeln('Real values sum: ', Sum:0:2);

 repeat until keypressed;
end.

Programma veidota uz FreePascal, bet domāju viņai būtu jāstrādā arī uz Turbo/Borland Pascal, algoritms jau nu noteikti. Negatīvi skaitļi arī netiek pārbaudīti.

Edited by Maris-S
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...