Czy dany ciąg znaków to liczba

0

Jak wyrzucić błąd podczas wczytywania danych do tablicy jeśli skrypt wpisał litere lub znak?
Jeśli będzie to liczba przechodzi dalej.

Bardzo bym prosił o jakąś wskazówkę, najlepiej kawałek skryptu.
Próbowałem try except end ale nie wychodzi. Próbowałem wczytywać wszystko do jednej tablicy a potem kopiować do drugiej z StrToInt ale była kolizja danych.

tablica jest zmiennej integer i dlatego się wszystko wykrzacza przy wpisaniu litery lub znaku. Jak to ominąć?

Bardzo prosze o pomoc.

2

Ech, ręce opadają :/ Przecież Delphi/Pascal to nie jest żaden język skryptowy!!! Co do pytania to najprostszym rozwiązaniem jest pod VCL TryStrToInt lub normalnie użycie Val (z którego i tak pod VCL korzysta tamta funkcja).

Więcej informacji o wspomnianych metodach masz na mnóstwie stron do znalezienia w Google.

0

Siedziałem kombinowałem i nadal był ten sam problem. W szczególności koliduje mi Str z Int. Próbowałem jedna i drugą opcją.

0

Pokaż kod, który niby się "wykrzacza" i opisz problem sensownie, podając dokładną treść błędu(ów).

0
var
a1 = array [0 .. 100000] of integer;
i,n :integer;
w: string;
for i := 1 to N do
    begin
      readln(t, w);
      if TryStrToInt(w) then
      begin
      a[i] := w;
      end
      else
      ShowMessage('blad');
    end;          

unit1.pas(108,10) Error: Wrong number of parameters specified for call to "TryStrToInt"
Error: Found declaration: TryStrToInt(const AnsiString;out LongInt):Boolean;
unit1.pas(110,15) Error: Incompatible types: got "AnsiString" expected "LongInt"

0

Ponownie ręce poadają. Jak można mieć jakikolwiek kłopot z zastosowaniem Val po przejrzeniu opisów z przykładowym kodem w Delphi, na stronach z dwóch pierwszych wyników w Google? Masakra. Ok patrz...

program test;

{$APPTYPE CONSOLE}

var
  S : string;
  V, ErrCode : integer;
begin
  repeat
    Write('Wpisz cokolwiek lub wcisnij Enter aby zakonczyc: ');
    Readln(S);
    if S <> '' then
    begin
      Val(S, V, ErrCode);
      if ErrCode = 0 then
      begin
        Writeln('Podales liczbe: ', V);
      end
      else
      begin
        Writeln('Podany tekst nie jest liczba calkowita!');
      end;
    end;
  until S = '';
end.

Cytując stronę Let Me Google That For You:
"Czy było to takie trudne?" :/

0
for i := 1 to N do
begin
  readln(t, w);
  if TryStrToInt(w) then  // brak drugiego argumentu funkcji
  begin
    a[i] := w;            // próbujesz wpisać String do komórki typu Integer
  end
  else
    ShowMessage('blad');
end;

Poprawiony i sprawny kod:

for i := 1 to N do
begin
  ReadLn(t, w);

  if not TryStrToInt(w, a[i]) then
    ShowMessage('blad');
end;
0

furiousprogramming a jakbyś mi to poprawił pod ten skrypt byłbym bardzo wdzięczny:

type
  a1 = array [0 .. 100000] of string;
var
  LICZ: TStringlist;
  t: text;
  N, i, j, x: integer;
  w: string;
  intLicznikZamian:integer;
  intLicznikPorownan1:integer;
  intLicznikPorownan2:integer;
  por1por2:integer;
  a: a1;
  start, stop, elapsed : cardinal;
begin
  start := GetTickCount;
  LICZ := TStringlist.Create;
  LICZ.LoadFromFile('przedsortowaniem.txt');
  N := LICZ.Count;
  LICZ.Free;
  begin
    intLicznikZamian:=0;
    intLicznikPorownan1:=0;
    intLicznikPorownan2:=0;
    assignFile(t, 'przedsortowaniem.txt');
    reset(t);
    for i := 1 to N do
    begin
      readln(t, w);
      if not TryStrToInt(w, a[i]) then
    ShowMessage('blad');
    end;
    CloseFile(t);
    for j := N - 1 downto 1 do
    begin
      x := a[j];
      inc(intLicznikPorownan1);
      i := j + 1;
      while (i <= N) and (x > a[i]) do
      begin
        inc(intLicznikPorownan2);
        a[i - 1] := a[i];
        inc(i);
        inc(intLicznikZamian);
      end;
      a[i - 1] := x;
    end;
    assignFile(t, 'posortowaniu.txt');
    ReWrite(t);
    for i := 1 to N do
    begin
      Writeln(t, a[i]);
    end;
    CloseFile(t);
  end;
  por1por2:=intLicznikPorownan1+intLicznikPorownan2;
  Label7.Caption:=FloatToStr(N);
  Label4.Caption:=FloatToStr(por1por2);
  Label5.Caption:=FloatToStr(intLicznikZamian);
  stop := GetTickCount;
  elapsed := stop - start;
  ShowMessage('Czas wykonania sortowania: ' + IntToStr(elapsed) + ' ms.');
end;                                
0

Jak ma to działać. Ty chłopie myśl co robisz najpierw. Programowanie to nie uczenie się na pamięć regułek. Trzeba myśleć co się robi! I znowu pieprzysz o jakimś skrypcie. Pascal to nie skrypt!

I Tak, rozumiem każdego początki i dział Newbie. Ale sorry, z Twojej postawy wynika, że nie chcesz się niczego nauczyć, oczekując jedynie gotowca. A za to wątek powinien polecieć do Kosza.

PS. nie rozumiem też takiego "miksowania" zastosowanych rozwiązań. Raz używasz TStringList, ale później do tworzenia pliku po operacji sortowania korzystasz z konstrukcji tworzenia pliku typowanego. WTF?! Załadować plik do obiektu typu TStringList tylko po to aby uzyskać ilość wierszy? A później już z niego nie korzystać. Dla mnie dziwne.

A i teraz dojrzałem. Zmienna a, typ a1. No brawo za nazewnictwo ;/ Prosisz o pomoc, a sam robisz jakieś "obfuskacje" kodu źródlowego aby był początkowo nie do ogarnięcia. Sam nie ogarniasz jak widzę za bardzo, a robiąc taki bajzel w źródle, sprawiasz, że innym też cięzko odgadnąć co poeta miał na myśli ;/

0

Widzę, że jesteś kolego wielkim znawcą a przypatrz się na te 6 linijek kodu których nie używam a jednak zliczają i przypisuje je pod Label:

LICZ: TStringlist;

LICZ := TStringlist.Create;
  LICZ.LoadFromFile('przedsortowaniem.txt');
  N := LICZ.Count;
  LICZ.Free;

Label7.Caption:=FloatToStr(N);

Do tego przypisane N służy do pętli. Komentować każdy umie a gdybyś się przyjrzał to tam wszystko pisze.

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