Zabezpieczenie przed wprowadzaniem błędnych danych.

0

Mam program gdzie w jednym miejscu wprowadza się litery a w innym liczby... I moje pytanko brzmi jak to zabezpieczyć aby tam gdzie wpisuje się liczby nie można było wpisać liter?

  1. Tam gdzie wprowadza się liczby
  • zmienna przechowująca te liczby jest typu byte

a - wprowadzana liczba typu byte

bo jak dam warunek:
if a > #57 then ''

to wywala błąd typów danych

0

Znowu pytanie o banały... Wiesz ile razy był ten temat omawiany tutaj na forum...?


Kiedyś siostra o to samo prosiła mnie na zajęcia w TI - podpowiedziałem jej w jaki sposób można to wykonać za pomocą procedury Val; Algorytm jest tak skonstruowany, że nie pozwala wpisać innych znaków niż cyfry oraz nie pozwala pominąć wpisywania liczby;

Podaję w załączniku plik Square.pas, który wykorzystuje tą metodę; Nie jest idealny bo pisany kilka lat temu (można go w pewnych miejscach skrócić), ale działa wyśmienicie; Przeanalizuj go sobie i napisz coś podobnego;

Jeśli nie interesuje Cię blokowanie przed pominięciem wpisania liczby to także wykorzystaj wyżej wymienioną procedurę, tylko pobieranie liczby z klawiatury oprzyj o tym String i po podaniu konwertuj ją na liczbę;

0

Dla kogo banały to banały.. nie wiem..

0

Jak to zrobić.?

Mam coś takiego ale to dalej nie działa ;(

a jest typu byte
p jest typu string

str(a,p);
if p > #57 then write(' ');

kompilator nie wywala już błędu, ale po wpisaniu litery program się sypie

0

To znaczy, że oszukałeś debugera.

0
Guepardo napisał(a):

a - wprowadzana liczba typu byte

bo jak dam warunek:
if a > #57 then ''

to wywala błąd typów danych

Oczywisty błąd. Nie można porównywać różnych typów (w tym przypadku Byte z Char)

Guepardo napisał(a):

Mam program gdzie w jednym miejscu wprowadza się litery a w innym liczny... I moje pytanko brzmi jak to zabezpieczyć aby tam gdzie wpisuje się liczby nie można było wpisać liter?

Załóżmy, że dane wprowadzasz w kontrolce TEdit;

if TryStrToInt(Edit1.Text,a) then
begin
  //wprowadzono liczbowę
end
else
begin
  //wprowadzono nie liczbę
end;
0

Podałem Ci przecież jedno z rozwiązań - pewnie nawet nie przeanalizowałeś...


Za pobieranie liczby od użytkownika odpowiada dokładnie procedura GetNumber:

procedure GetNumber(var Number: String; const Min, Max: Integer);
var
  Num, ErrorID: Integer;
  Key: Char;
  Correct: Boolean;
begin
  Num := 0;
  ErrorID := 0;
  Key := #0;
  Correct := False;

  repeat
    Key := ReadKey;

    if (Key = '0') or (Key = '1') or (Key = '2') or (Key = '3') or
       (Key = '4') or (Key = '5') or (Key = '6') or (Key = '7') or
       (Key = '8') or (Key = '9') then
      begin
        Number := Number + Key;
        Write(Key);
      end
    else
      begin
        if Key = #8 then
          begin
            if Number <> '' then
              begin
                Delete(Number, Length(Number), 1);
                Erase;
              end;
          end
        else
          if Key = #13 then
            if Number <> '' then
              begin
                Val(Number, Num, ErrorID);

                if ErrorID <> 0 then
                  begin
                    Num     := 0;
                    ErrorID := 0;
                  end
                else
                  if (Num >= Min) and (Num <= Max) then
                    Correct := True;
              end;
      end;
  until (Key = #13) and (Number <> '') and (Correct);

  WriteLn;
end;

Procedura jest stara i pisana w połowie z siostrą, stąd można ją trochę skrócić, jednak i w tej postaci działa bardzo dobrze; Algorytm ten pozwala jedynie na pobranie liczby naturalnej (bo w podanym programie służył do pobierania współrzędnych do rysowania prostokąta w konsoli), więc aby przystosować go pod inne (np. ujemne czy zmiennoprzecinkowe) trzeba go troszkę zmodyfikować; Pobierz sobie ten plik i sprawdź (ten co podałem pisany był pod TP7, ale FPC też powinien go przetrawić);


Jeśli nie chcesz blokować programu tylko pozwolić użytkownikowi na wpisanie dowolnych rzeczy a potem rozróżnić co podał, to zadeklaruj sobie zmienną łańcuchową (String) i po podaniu czegokolwiek spróbuj ją przekonwertować (procedurą Val) i jeśli się powiedzie - zapisz sobie tą liczbę do zmiennej liczbowej, a jeśli nie to wyświetl stosowny komunikat i każ użytkownikowi podać nową;

Zastanów się jak to ma działać, rozpisz sobie krok po kroku co trzeba zrobić i spróbuj, a na pewno znajdziesz rozwiązanie;

Nie zapomnij, że procedura Erase nie służy do kasowania pliku, tylko do usuwania na ekranie ostatniej cyfry z wprowadzanej przez użytkownika liczby i jest także zdefiniowana w pliku Square.pas;

0

Pytania o banalne podstawy zadajemy w dziale Newbie i tam ten temat przenoszę. Poza tym poprawiłem temat wątku, bo Zabezpieczenie programu za pewne nie tylko mi kojarzy się jednoznacznie z na przykład zabezpieczniem przed nielicencjonowanym użyciem albo przed reversowaniem go itp. A co do pytania dostałeś już odpowiedź - procedura: Val.

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