Solved

# output average number of cigarettes and average weight

Posted on 2000-03-26
290 Views
This program needs to output the average number of cigarettes and the average weight for the Accepted applicants.  The way I've done it here shows the averages for each individual accepted applicant. If I var the averages as anything else, then I get an error on these lines: (numb+...)/4;
(wt..)/4, however, if I leave them vared as real, then my results come out in exponential form(Example: 006 + 000002+E07)   Here it is:

var name: string;
numb: integer;
wt: integer;
AppFile: text;
avgnumb: real;
avgwt: real;
posit: string;

procedure GETDATA (var localAppFile: text;
var localname: string;
var localnumb: integer;
var localwt: integer);

begin
end; {GETDATA}

procedure POSITION(var localnumb: integer;
localwt: integer;
posit: string);

begin
if (numb < 10) and (wt < 180) then
writeln ('Accepted ')
else
begin
writeln ('Rejected ');
writeln ('Your weight is more than the given weight ');
writeln ('The number of cigarettes you smoke is over the limit ');
end;
end; {POSITION}

procedure ACCEPTED (var avgnumb: real;
var avgwt: real;
posit: string);
begin
if (posit = 'Accepted') then
avgnumb := (numb + numb + numb + numb) / 4;
avgwt := (wt + wt + wt + wt) / 4;
writeln ('Average number of cigarettes for accepted applicants: ' , avgnumb);
writeln ('Average weight of accepted applicants: ' , avgwt);
end;{ACCEPTED}

begin {main}
assign (AppFile, 'A:\AppFile2.dat');
reset (AppFile);
while not seekeof (AppFile) do
begin
GETDATA (AppFile, name, numb, wt);
POSITION (numb, wt);
ACCEPTED (avgnumb, avgwt, posit);
end;
close (Appfile)
end.

0
Question by:kazooie21
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 2

LVL 48

Accepted Solution

dbrunton earned 5 total points
ID: 2659897
Not tested but compiled correctly for me.  I hope that you can see the errors that you are making.

program form;

var
name : string;
numb : integer;
totalnumb : integer;
wt : integer;
totalwt : integer;
applicants : integer;
AppFile : text;
avgnumb : real;
avgwt : real;
posit : string;

procedure GETDATA (var localAppFile : text;
var localname : string;
var localnumb : integer;
var localwt : integer);

begin
end; {GETDATA}

procedure POSITION(localnumb: integer;
localwt : integer;
var posit : string);

begin
if (localnumb < 10) and (localwt < 180) then
begin
writeln ('Accepted ');
posit := 'Accepted';
end
else
begin
writeln('Rejected ');
writeln('Your weight is more than the given weight ');
writeln('The number of cigarettes you smoke is over the limit ');
posit := 'Not accepted';
end;
end; {POSITION}

procedure ACCEPTED(posit : string; localwt : integer; localnum : integer);
begin
if (posit = 'Accepted') then
begin
totalwt := localwt + totalwt;
totalnumb := totalnumb + localnum;
inc(applicants);
end;
end; {ACCEPTED}

begin {main}
totalnumb := 0;
totalwt := 0;
applicants := 0;
assign(AppFile, 'A:\AppFile2.dat');
reset(AppFile);
while not seekeof(AppFile) do
begin
GETDATA(AppFile, name, numb, wt);
POSITION(numb, wt, posit);
ACCEPTED(posit, wt, numb);
end;
close(Appfile);
avgnumb := totalnumb/applicants;
avgwt := totalwt/applicants;
writeln('Average weight for accepted applicants is ', avgwt:6:2);
writeln('Average number of cigarettes for accepted applicants is ', avgnumb:6:2);
end.
0

Author Comment

ID: 2661645
When I ran this, I got 'Error 200: division by 0'
0

LVL 48

Expert Comment

ID: 2662970
Replace the last five lines with these lines and try again.

if applicants  <> 0 then
begin
avgnumb := totalnumb/applicants;
writeln('Average number of cigarettes for accepted applicants is',
avgnumb:6:2);
avgwt := totalwt/applicants;
writeln('Average weight for accepted applicants is ', avgwt:6:2);
end
else
writeln('No candidates found');
end.

0

LVL 3

Expert Comment

ID: 2663422
>>   if (posit = 'Accepted') then
avgnumb := (numb + numb + numb + numb) / 4;
avgwt := (wt + wt + wt + wt) / 4;
. . .

You've done the same mistake than before: when you want to control more than ONE instruction within an IF, a begin-else pair is mandatory.

>>       avgwt := (wt + wt + wt + wt) / 4;

Dbrunton's correction was perfect, but perhaps you don't notice the reason why you're wrong. If you say wt + wt + wt + wt , you're using the SAME variable each time you add. Thus, you're adding four times the last value held by WT variable, which is NOT the idea of summing different values; that's why you have an instruction like this:

totalwt := localwt + totalwt;

this is, an adder, which totalizes the corresponding value (localwt) each time it is executed.
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

### Suggested Solutions

By reading this blog, MSPs will gain insight into how to improve communications with their clients as well as establish a more profitable business.
Invest in your employees with these five simple steps to improve employee engagement and retention.
I've attached the XLSM Excel spreadsheet I used in the video and also text files containing the macros used below. https://filedb.experts-exchange.com/incoming/2017/03_w12/1151775/Permutations.txt https://filedb.experts-exchange.com/incoming/201…
Are you ready to implement Active Directory best practices without reading 300+ pages? You're in luck. In this webinar hosted by Skyport Systems, you gain insight into Microsoft's latest comprehensive guide, with tips on the best and easiest way…
###### Suggested Courses
Course of the Month3 days, 15 hours left to enroll