Problem z wczytywaniem zmiennych string, sprawdzenie funkcji

0

Mam problem z wczytywaniem zmiennych typu string w Pascalu.
Nieważne jak zmodyfikuje poniższy kod (czy używam write, writeln, read, readln) program i tak pomija przynajmniej wczytywanie jednej zmiennej - aktualnie "dzialanie".
Dodatkowo prosiłbym o sprawdzenie funkcji o nazwie "wynik", do polecenia:

Napisać program, który DANE przekształci do postaci WYNIK
DANE:='2*3*5*1; 4*4*10;10*4*1;'
WYNIK:='11;18;15'

Podaje cały program, gdyż osobno nie ma takiego problemu:

uses crt;
const n=8;
      m=6;
type  tab1=array[1..n] of string;
      tab2=array[1..m] of string;
      tab3=array[1..4] of string;
      tab4=array[1..4] of integer;
      tab5=array[1..8] of byte;
      tab6=array[1..35] of string;
      tab=array[1..100] of integer;
var   p:byte;
      B:tab2;
      ip,maska,dzialanie:string;

function kod(y:integer; p:byte):string;
var bin,R:string;
    d:integer;
begin
  B[1]:='A';
  B[2]:='B';
  B[3]:='C';
  B[4]:='D';
  B[5]:='E';
  B[6]:='F';
  bin:='';
  while y<> 0 do
  begin
       if p>10 then
       begin
       d:=y mod p;
       if d>9 then R:=B[d-9]
       else str(y mod p,R);
       bin:=R+bin;
       y:=y div p;
       end
       else
       begin
       str(y mod p,R);
       bin:=R+bin;
       y:=y div p;
       end;
  end;
  if p<11 then
  begin
    while length(bin)<8 do bin:='0'+bin;
  end;
  kod:=bin;
end;

procedure konw(ip:string; p:byte);
var x1,x2,x3,x4:integer;
begin
  val(copy(ip,1,pos('.',ip)-1),x1);
  delete(ip,1,pos('.',ip));
  val(copy(ip,1,pos('.',ip)-1),x2);
  delete(ip,1,pos('.',ip));
  val(copy(ip,1,pos('.',ip)-1),x3);
  delete(ip,1,pos('.',ip));
  val(copy(ip,1,length(ip)),x4);
  writeln(kod(x1,p),'.',kod(x2,p),'.',kod(x3,p),'.',kod(x4,p));
end;

function siec(var ip:string; maska:string):string;
var x1,y1:tab4;
    a1,a2,a3,a4,b1,b2,b3,b4,mas:string;
    t1,t2,t3,t4,r1,r2,r3,r4,w1,w2,w3,w4:tab5;
    ms:tab6;
    i:byte;
begin
  mas:='';
  val(copy(ip,1,pos('.',ip)-1),x1[1]);
  delete(ip,1,pos('.',ip));
  val(copy(ip,1,pos('.',ip)-1),x1[2]);
  delete(ip,1,pos('.',ip));
  val(copy(ip,1,pos('.',ip)-1),x1[3]);
  delete(ip,1,pos('.',ip));
  val(copy(ip,1,length(ip)),x1[4]);
  val(copy(maska,1,pos('.',maska)-1),y1[1]);
  delete(maska,1,pos('.',maska));
  val(copy(maska,1,pos('.',maska)-1),y1[2]);
  delete(maska,1,pos('.',maska));
  val(copy(maska,1,pos('.',maska)-1),y1[3]);
  delete(maska,1,pos('.',maska));
  val(copy(maska,1,length(maska)),y1[4]);
  a1:=kod(x1[1],2);
  a2:=kod(x1[2],2);
  a3:=kod(x1[3],2);
  a4:=kod(x1[4],2);
  b1:=kod(y1[1],2);
  b2:=kod(y1[2],2);
  b3:=kod(y1[3],2);
  b4:=kod(y1[4],2);
  for i:=1 to 8 do
  begin
    val(a1[i],t1[i]);
    val(b1[i],r1[i]);
    w1[i]:=(t1[i]) and (r1[i]);
    val(a2[i],t2[i]);
    val(b2[i],r2[i]);
    w2[i]:=(t2[i]) and (r2[i]);
    val(a3[i],t3[i]);
    val(b3[i],r3[i]);
    w3[i]:=(t3[i]) and (r3[i]);
    val(a4[i],t4[i]);
    val(b4[i],r4[i]);
    w4[i]:=(t4[i]) and (r4[i]);
  end;
  for i:=1 to 8 do
  begin
    str(w1[i],ms[i]);
    mas:=mas+ms[i];
  end;
  mas:=mas+'.';
  for i:=1 to 8 do
  begin
    str(w2[i],ms[i+8]);
    mas:=mas+ms[i+8];
  end;
  mas:=mas+'.';
  for i:=1 to 8 do
  begin
    str(w3[i],ms[i+16]);
    mas:=mas+ms[i+16];
  end;
  mas:=mas+'.';
  for i:=1 to 8 do
  begin
    str(w4[i],ms[i+24]);
    mas:=mas+ms[i+24];
  end;
  siec:=mas;

end;

function bin2dec(x:string):string;
var w,e,r,t,a,b,c,d,i:longint;
    g,h,j,k:string;
begin
  val(x[1],a);
  w:=a;
  for i:=2 to 8 do
  begin
    val(x[i],a);
    w:=2*w+a;
  end;
  str(w,g);
  val(x[10],b);
  e:=b;
  for i:=11 to 17 do
  begin
    val(x[i],b);
    e:=2*e+b;
  end;
  str(e,h);
  val(x[19],c);
  r:=c;
  for i:=20 to 26 do
  begin
    val(x[i],c);
    r:=2*r+c;
  end;
  str(r,j);
  val(x[28],d);
  t:=d;
  for i:=29 to 35 do
  begin
    val(x[i],d);
    t:=2*t+d;
  end;
  str(t,k);
  bin2dec:=g+'.'+h+'.'+j+'.'+k;
end;

function wynik(dane:string):string;
var d,i:byte;
    suma,a:integer;
    y:string;

begin
  i:=1;
  d:=length(dane);
  wynik:='';
  while i<=d do
  begin
    suma:=0;
    repeat until dane[i]=';';
    begin
      y:='';
      a:=0;
      repeat until dane[i]='*';
      begin
        i:=i+1;
        if dane[i]=' ' then
        begin
        end
          else y:=y+dane[i];
      end;
      val(y,a);
      suma:=suma+a;
      if dane[i]='*' then i:=i+1;
    end;
    if dane[i]=';' then i:=i+1;
    str(suma,y);
    wynik:=wynik+y+';';
  end;
end;

begin
  writeln('Podaj adres ip: ');
  readln(ip);
  writeln('Podaj adres maski: ');
  readln(maska);
  writeln('Podaj podstawe kodu: ');
  read(p);
  if (p<=16) and (p>=2) then
  begin
    write('Adres ip o podstawie ',p,' to: ');
    konw(ip,p);
    end
  else writeln('Podstawa kodu jest poza zakresem');
  writeln('Adres sieci adresu ip: ',ip,' o masce: ',maska,' to: ', bin2dec(siec(ip,maska)));
  writeln();
  write('DANE:=');
  readln(dzialanie);
  writeln();
  writeln('WYNIK:=',wynik(dzialanie));
end. 
0
repeat until dane[i]=';';

What the...

 repeat until dane[i]='*';
      begin

What the what?! Ktoś tu kursu nie przeczytał?

  a1:=kod(x1[1],2);
  a2:=kod(x1[2],2);
  a3:=kod(x1[3],2);
  a4:=kod(x1[4],2);
  b1:=kod(y1[1],2);
  b2:=kod(y1[2],2);
  b3:=kod(y1[3],2);
  b4:=kod(y1[4],2);

What the...

Nieważne jak zmodyfikuje poniższy kod (czy używam write, writeln, read, readln) program i tak pomija przynajmniej wczytywanie jednej zmiennej - aktualnie "dzialanie".

Słuchaj, nie ważne jak ja zmodyfikuje twój kod, on i tak nie będzie się nadawał do oglądania.

Ja proponuję zacząć od kursu, zwłaszcza przerobić konstrukcję repeat until i zasady programowania tak, żeby kod nie bolał.

0
mimE napisał(a):

Nieważne jak zmodyfikuje poniższy kod (czy używam write, writeln, read, readln) program i tak pomija przynajmniej wczytywanie jednej zmiennej - aktualnie "dzialanie".

Wyjaśnij o co ci chodzi...

0

Pętle poprawiłem...
W javie zrobiłbym to bez problemu, ale zmuszony jestem do programowania w Pascalu.

Poniższy kod działa, więc o co Ci chodzi?

  a1:=kod(x1[1],2);
  a2:=kod(x1[2],2);
  a3:=kod(x1[3],2);
  a4:=kod(x1[4],2);
  b1:=kod(y1[1],2);
  b2:=kod(y1[2],2);
  b3:=kod(y1[3],2);
  b4:=kod(y1[4],2);

A z wczytywaniem zmiennych, chodzi mi o to, że po "DANE:=" powinno dać się wpisać zmienna typu string, ale pomija ten kawałek kodu, nie wiem dlaczego.
Jak uruchomisz program zobaczysz o co mi chodzi.

0

Ma być readln(p);

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