tylko cyfr w aplikacji konsolowej

0

Witam! To znowu ja (patrz post: "kilka pytań na temat aplikacji konsolowych i nie tylko" - przy okazji wielkie dzieki za odpowiedzi). Tym razem zmagam się... tak, tak... dalej z aplikacją konsolową. Tym razem mam mniej pytan ;-) Oto one:

  1. Jak sprawić, aby user tego programu mógł wpisac tylko same cyfry? dla przykładu kawałek kodu:

...

write('Prosze wpisac ilosc punktow za ta odpowiedz: ');
readln(ptk); // tu chcĘ aby nie mozliwe było wpisanie nic innego oprócz cyfr/liczb

//a oto dlaczego:

punkt := strtoint(ptk);
koniec := suma + punkt;
score := inttostr(koniec);
write('Suma uzyskanych punktow: ');
writeln(+score+);

...

bo jesli kod jest w powyższej postaci, gdy wpisze sie w miejsce ilosci punktów zamiast cyfry tylko jakąś litere to...

wiadomo: jakis tam błąd (a konkretnie EConvertError )
próbowałem z "try", al emi jakos nie wychodzi

  1. Moje drugie pytanie dotyczy polskich fontów w aplikacji konsolowej. A mianowicie: Czy możliwe jest używanie polskich

fontów (śćźżńąłóę) w aplikacji konsolowej? bo jesli w kodzie napisze, np.

writeln('wpisz hasło');

to wiadmo zamiast " ł " pokazuje sie jakas tam kreska. w przypadku innych liter pokazuja sie blizej nieokreslone znaki ;-)

Z góry dzieki za odpowiedzi
Pozdrawiam
Queshczyn

0

CO do punktu pierwszego to musisz wczytywać kolejne znaki i sprawdzać czy to są cyfry. Jeśli są to dodajemy je do jakiegoś stringa no i mamy. I to wszystko oczywiście w jakiejś pętli aż się naciśnie enter #13. Miałem kiedyś taką procedurke ale w pascalu próbowałem ją przepisać do delphi ale jakoś nie wychodzi.

0

W poniższym programiku masz odpowiedź na oba pytania.
Przeanalizuj go dokładnie, są tam komentarze:

program ConsoleTest;
{$APPTYPE CONSOLE}
uses
  Windows;
  
var
  s: string;
  i: integer;

{
  Print - odpowiednik WRITE, z tym, że polskie znaki
  będą wyświetlane prawidłowo
}
procedure Print(const Text: string);
begin
  s := Text;
  CharToOem(PChar(s), PChar(s));
  Write(s);
end;

{
  PrintLn - odpowiednik WRITELN, z tym, że polskie znaki
  będą wyświetlane prawidłowo
}
procedure PrintLn(const Text: string);
begin
  s := Text;
  CharToOem(PChar(s), PChar(s));
  Writeln(s);
end;


begin
  Print('Podaj łańcuch: (zwróć uwagę na polskie litery !!!)');
  Readln(s); //<-- użytkownik wpisuje linię tekstu
  {
    w pętli FOR sprawdzamy wszystkie znaki łańcucha s;
    jeśli jakiś znak nie jest cyfrą, wyświetlamy informację
    (PrintLn) i przerywamy pętlę (Break)
  }
  for i := 1 to Length(s) do
  begin
    {
      cyfry mają kody ASCII 48 - 57
      <a href="http://www.jack1024.glt.pl/misc/ascii.html">http://www.jack1024.glt.pl/misc/ascii.html</a>
    }
    if not ( (Ord(s[i]) >= 48) and (Ord(s[i]) <= 57) ) then
    begin
      PrintLn('Znak "' + s[i] + '" nie jest cyfrą !!!');
      Break;
    end;
  end;

  Writeln;
  Writeln('Press ENTER to exit...');
  Readln;
end.

//dopisek
Funkcja sprawdzająca, czy dany łańcuch da się skonwertować na liczbę całkowitą stosując try..except..end :

function CzyLiczbaCalkowita(const s: string): boolean;
begin
  try
    StrToInt(s);
  except
    //niestety nic z tego
    Result := False;
    Exit;
  end;
  //OK, to liczba !
  Result := True;
end;

można jeszcze tak:

function CzyLiczbaCalkowita2(const s: string): boolean;
begin
  try
    StrToInt(s);
  except
    on EConvertError do
    begin
    //niestety nic z tego
      Result := False;
      Exit;
    end;
  end;
  //OK, to liczba !
  Result := True;
end;

//dopisek 2
Opis Crt już wkrótce. Może dzisiaj, może jutro.
(Wiesz o co mi chodzi)

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