User Name Password Register
DaniWeb IT Discussion Community
All
What is DaniWeb IT Discussion Community?
You're currently browsing the Pascal and Delphi section within the Software Development category of DaniWeb, a massive community of 456,277 software developers, web developers, Internet marketers, and tech gurus who are all enthusiastic about making contacts, networking, and learning from each other. In fact, there are 3,151 IT professionals currently interacting right now! Registration is free, only takes a minute and lets you enjoy all of the interactive features of the site.
Please support our Pascal and Delphi advertiser: Programming Forums

Stuck on school assignment

Join Date: Nov 2007
Posts: 8
Reputation: pocku is an unknown quantity at this point 
Rep Power: 0
Solved Threads: 0
pocku pocku is offline Offline
Newbie Poster

Help Stuck on school assignment

  #1  
Nov 13th, 2007
Hello. I'm utterly stuck on this one part of my school assignment (for pascal). We are asked to make a calculator like program which calculates integer values only. The program has to read character by character from an input file and if something like an 'a' or # is entered, then an error message will popup telling the user they can't enter that in the input.

The problem I'm having right now is that I can't seem to properly convert the characters to integers and have them add/multiply/subtract/divide up with eachother correctly. If I input an equation with two numbers like: 1+2 or 120/30 or 1000+300 then it works just fine but if I go: 1+2+3 or 1+20+4 or 1+2+3+4 then I get crazy numbers like 1975 or 17245.

This is what my program looks like so far:

program bbb (input,output, infile);

const
   blank = ' ';

var
   infile                                                       : text;
   c                                                            : char;
   eqn, equation                                                : string[20];
   digit1, digit2, digit3, digit4	                        : integer;
   previousnotblank, currentnotblank, legalinteger, previousnum : boolean;

{*****************}

procedure convert;

begin
   digit1:=ord(c)-ord('0');
end; { convert }


{****************}

procedure multidigits;

begin
   digit1:= digit1*10;

   digit3:= ord(c)-ord('0');

   digit1:= digit1+digit3;

   previousnum:=legalinteger;

end; { multidigits }

{****************}

procedure multidigits2;

begin
   digit2:= digit2*10;

   digit4:= ord(c)-ord('0');

   digit2:= digit2+digit4;

   previousnum:=legalinteger;

end; { multidigits }

{*****************}

procedure convert2 ;

begin
   legalinteger:= (ord(c)<=ord('9')) and (ord(c)>=ord('0'));

   if c='-' then
   begin
      read(infile,c);

      if (ord(c)<=ord('9')) and (ord(c)>=ord('0')) then
      begin
         digit2:=ord('0')-ord(c);
         previousnum:=legalinteger;
      end;
   end;

  while legalinteger and (c<>'+') do
   begin

      if legalinteger and previousnum then
         multidigits2
      else

         if legalinteger then
           begin
         
            digit2:=ord(c)-ord('0');
            writeln('convert2: digit2= ',digit2);
            previousnum:=legalinteger;
         
           end;

      if not eoln(infile) then
         read(infile,c)
      else
         legalinteger:=false;

   end;

      if (ord(c)>ord('9')) or (ord(c)<ord('0')) then
        begin
          writeln('error');

          if (c=' ') then
             writeln("There can't be an operation sign at the end.");
             equation:='notcorrect';
        end;


end; { convert2 }


{****************}

procedure plus;
begin

   read(infile,c);

   currentnotblank:= c <> blank;

   previousnum:=false;

   if not currentnotblank then
        begin
           while (c = blank) and not eoln(infile) do
              begin
              read(infile,c);
              end;
           convert2;
           digit1:=digit1+digit2;

        end;

   if currentnotblank then
      begin
         convert2;
         digit1:= digit1+digit2;
      end;

end; { plus }

{****************}
begin
   assign(infile, 'input.txt');

   writeln('Enter equation: ');
   readln(eqn);

   rewrite(infile);
   write(infile,eqn);
   writeln(infile);

   reset(infile);

   while not eof(infile) do
      begin
         previousnum:=false;

   while not eoln(infile) do
   begin

      read(infile,c);
      currentnotblank:= c<>blank;

      if currentnotblank then
      begin

         if (ord(c)>ord('9')) or (ord(c)<ord('*')) or (c='.') or (c='\') then
            begin
               writeln(' There is an error within the equation ');
               equation:= 'notcorrect';
            end;

         legalinteger:= (ord(c)<=ord('9')) and (ord(c)>=ord('0'));

         if legalinteger and previousnum then
            multidigits
         else
         if legalinteger then
            begin
               convert;
               previousnum:=legalinteger;
            end;

         if (c='+') then
            plus
      else
         if (c='*') then
            multi
      else
         if (c='/') then
            divide
      else
         if (c='-') then
            subtract;

      end;


   end; {while not eoln}

   if equation = 'notcorrect' then
      write('There is no answer.')
   else
      write('The answer is: ',digit1);

    writeln;
    readln(infile);

   end; {while not eof}

end.

I left out the subtract, divide and multiply procedures since they look exactly like the plus procedure.

I think the source of the problem is probably with the while-loop under convert2. With an equation like 1+2+3+4, the program seems to be running smoothly when it reads 1, +, and 2, but once it reads the second +, it doesn't call up the plus procedure and instead tries to convert + into an integer.

Any help would be greatly appreciated!!!
Last edited by pocku : Nov 13th, 2007 at 7:59 am.
AddThis Social Bookmark Button
Reply With Quote  
All times are GMT -4. The time now is 6:52 pm.
Forum system based on vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
©2003 - 2008 DaniWeb® LLC