Pascal - z stringa na tablice liczb

0

Witam, mam problem aby ze stringa, liczby znalazły się w tablicy. Napisałem takie coś ale chodzi mi o to aby w tablicy liczb znalazły się dokładnie te wartości które podałem w stringu a nie ich kody ASCII. Po prostu aby moć wykonywać na tablicy liczb działania arytmetyczne. Z góry dziękuje za pomoc.

var
  a:string ;
  b:array[1..10] of integer;
  c:array[1..10] of integer;
  d:string;
  e:integer;
  i:integer;
begin
  writeln('podaj liczby, zostana zapisane do stringa');
  readln(a);
  writeln(a);

  for i:=1 to 10 do
  begin
    b[i]:=ord(a[i]);
  end;

  for i:=1 to 10 do
  begin
    writeln(b[i]);
  end;

  readln;
end.      
1
var
  s: string;
  c: array[1..10] of integer;
  i: integer;

begin
  writeln('Podaj ciag cyfr');
  readln(s);

  for i := 1 to 10 do
  begin
    c[i] := ord(s[i]) - 48;
    writeln(c[i]);
  end;
end.
 
0
b[i]:=ord(a[i]);

Zamień na:

B[I] := StrToInt(A[I]);

(dodając uprzednio SysUtils do modułów, lub skorzystaj z funkcji Val).
Ewentualnie weź pod uwagę kod ASCII liczby 0 oraz pozostałych liczb i odnajdź prawidłowość ;)

0

A jakby to wyglądało w drugą stronę tzn z tablicy na stringa? Gdybym chciał napisać własną funkcję? Bo takie coś jak

b[i]:=chr(c[i])+48;
gdzie
b to string a c to tablica liczb nie działa.

0
b[i]:=chr(c[i]+48);

Btw, jeżeli b to string (a nie tablica), to raczej:

b := b+chr(c[i]+48); // lub b += chr( ... ; jeżeli korzystasz z FPC
0

Dlatego to nie przejdzie:

b[i]:=chr(c[i])+48;

bo z takie zapisu wynika, że do znaku typu Char chcesz dodać liczbę; Poprawy zapis w tym stylu wyglądałby tak:

b[i] := chr(c[i] + 48);

Poza tym kombinowanie takie nie ma sensu, jeśli mamy gotowe funkcje: Val, IntToStr i StrToInt;

0

Mimo wszystko program nie działa ani korzystajac z IntToStr ani b[i] := chr(c[i] + 48).

program Project1;

{$mode objfpc}{$H+}

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

var
  i:integer;
  tab:array[1..5] of integer;
  c:string;
begin

  for i:=1 to 5 do
  begin
     readln(tab[i]);
  end;
    for i:=1 to 5 do
  begin
     c[i]:=chr(c[i] + 48)

  end;
    writeln(c);
    readln;

end.

Przy użyciu b[i] := chr(c[i] + 48) gdy dochodzi do wykonania tej linii dostaje błąd SIGSEGV natomiast przy użyciu IntToStr takie błędy:

project1.lpr(25,6) Warning: Variable "c" does not seem to be initialized
project1.lpr(25,12) Error: Incompatible types: got "AnsiString" expected "Char"
project1.lpr(33) Fatal: There were 1 errors compiling module, stopping

1

c[i]:=chr(c[i] + 48)
String (i jego pochodne) nie działają dokładnie tak, jak tablica.
Musiałbyś zrobić coś takiego:

c := '                     '; // inicjacja zmiennej `c` (alokacja miejsca w pamięci)
{tutaj ta pętla}

lub po prostu po ludzku:

c := c+chr(tab[i]+48);

lub w przypadku Free Pascala, z którego - jak zauważyłem - korzystasz:

c += chr(tab[i]+48);

PS: dane wczytujesz do zmiennej tab a robisz: c[i]+48 - to nie ma sensu co najmniej z dwóch powodów.

0
c := '                     '; // inicjacja zmiennej `c` (alokacja miejsca w pamięci)
{tutaj ta pętla}

A to SetLength na łańcuchach jest już zbyt mainstreamowe...? :]

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