logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[pascal] [Pascal] Jak zautomatyzować zliczanie wpisanych znaków w programie?

sp33dway 12 Maj 2009 21:19 3267 10
REKLAMA
  • #1 6522567
    sp33dway
    Poziom 10  
    Posty: 12
    Witam...zrobilem czesc zadania w pascalu.... mianowicie program pokazuje wpisane przeze mnie litery dopiero kiedy wpisze tyle ile ma ich byc i w taki sposob ze np. w pionowej lini ma byc tylko 3 lub 4 liter...
    zreszta jak otworzycie w pascalu to bedziecie wiedziec o co chodzi

    A teraz musze zrobic jakis automat ktory bedzie zliczal te wszyskie litery.... czyli musze usunac jedna linijke w pascalu i zastapic ja inna (linia zaznaczona na czerwono)...

    Oto moj program:

    uses crt;
    var
    a:byte;
    b:byte;
    a1:integer;
    b1:integer;
    tab:array[1..20] of char;
    begin
    clrscr;
    write('podaj liczbe znakow zakodowania:'); --->tej lini musze sie pozbyc i zrobic jakis automat ktory bedzie zliczal tyle liter ile wpisze...jak to zrobic??

    readln(b);

    write('podaj klucz kodownia:');
    readln(b1);
    for a:=1 to b do
    tab[a]:=readkey;
    clrscr;
    for a:=1 to b do
    write(tab[a]);
    a1:=1;
    for a:=1 to b1 do
    for b:=1 to b1 do
    begin
    gotoxy(a+1,b+1);
    write(tab[a1]);
    a1:=a1+1;
    end;
    repeat until keypressed;
    end.

    Jesli macie jakies propozycje bede wdzieczny

    Regulamin, p 11 - proszę wpisywać sensowną treść w polu temat!
    "zresztą jak otworzycie w pascalu..." - kolega nie umie opisać co ma robić jego program? Proszę to poprawić.
    [Dr.Vee]
  • REKLAMA
  • #2 6522666
    redie
    Poziom 16  
    Posty: 169
    Pomógł: 25
    Ocena: 1
    Proszę bardzo, może być?

    
    uses crt;
    var
    a:byte;
    b:byte;
    a1:integer;
    b1:integer;
    tab:array[1..20] of char;
    z:char;
    begin
    clrscr;
    
    write('podaj klucz kodownia:');
    readln(b1);
    write('podaj tresc: ');
    
    {for a:=1 to b do
    tab[a]:=readkey;}
    
    {zamiast twojej pętli}
    a:=1;
    repeat
    z:=readkey;
    if (ord(z)<>13) then
    begin
      tab[a]:=z;
      a:=a+1;
    end;
    until(ord(z)=13);
    
    clrscr;
    for a:=1 to b do
    write(tab[a]);
    a1:=1;
    for a:=1 to b1 do
    for b:=1 to b1 do
    begin
    gotoxy(a+1,b+1);
    write(tab[a1]);
    a1:=a1+1;
    end;
    repeat until keypressed;
    end.
    


    Nie pyta się o ilość znaków. Wpisywanie kończy się wciskając enter.
  • REKLAMA
  • #3 6522772
    sp33dway
    Poziom 10  
    Posty: 12
    wlasnie o takie cos mi chodzilo....wielki dzieki....
    Tylko moglbys mi wytlumaczyc, co to jest ten ord(z) i po co jest te 13??

    Bo wiem ze trzeba to bylo zrobic repeatem tylko nie wiedzialem jak...

    A jest jakis latwiejszy sposob bez tego ord(z) i tej 13??
  • #4 6522846
    xanio
    Poziom 27  
    Posty: 933
    Pomógł: 68
    Ocena: 55
    Nie do końca wiem co chcesz osiągnąć bo ten program jest pełen błędów, jednak postaram się pomóc.

    Powiedz tylko, dlaczego 'klucz' to u Ciebie jedna wartość i to w dodatku integer? Czy to ma być szyfrowanie zbliżone do kodu Cezara?

    Gdybyś chciał wiedzieć ile masz znaków do zakodowania to coś w tym stylu:

    var
    ilosc: integer;
    tekst: array[0..1000] of char;

    begin
    ilosc:=0;
    writeln('Podaj tekst do zakodowania:');
    repeat
    tekst[ilosc]:=readkey;
    ilosc:=ilosc+1; {inc(ilosc);}
    until tekst[ilosc-1]<>#13;
    ilosc:=ilosc-1;
    writeln('Wprowadziles ',ilosc,'znakow');
    readln
    end.

    ewentualnie, gdybys przetrzymywal tekst w zmiennych str
    ring a nie array of char to dlugosc stringa zwraca funkcja length.

    Dodano po 3 [minuty]:

    ord zwraca kod znaku (zamienia char na byte), 13 to kod entera
  • REKLAMA
  • #5 6523232
    adammikolajfilipek
    Poziom 11  
    Posty: 6
    Ocena: 1
    Funkcja ord( z ) zwraca kod ascii od z, a 13 to kod ascii entera - czyli program zaproponowany przez kolegę czeka na enter.
    Generalnie jeżeli nie jeteśmy pewni co do ilości wprowadzanych znaków, to czytamy je pojedyńczo i czekamy ma znacznik końca wprowadzania czyli enter ( ew. na escape lub inne )

    przy czym kolego redie podawanie gotowych rozwiązań do niczego nie prowadzi


    swoją drogą - pisząc w TP to pod chyba ctrl + f1 była pomoc, owszem po angielsku - ale bez tego języka to z programowaniem to ciężko będzie
  • REKLAMA
  • #6 6524073
    redie
    Poziom 16  
    Posty: 169
    Pomógł: 25
    Ocena: 1
    ejjj, a czy to wogóle musi być tablica char ?
    bo wystarczy:

    
    tab:string;
    dlugosc:int;
    ...
    writeln(tab);
    dlugots:=length(tab);
    


    a odwołanie się do i-tego miejsca w string to tab[i], tak jak w tablicy

    Edit:
    O rzeczywiście xanio juz o tym napisał :)
  • #7 6525002
    sp33dway
    Poziom 10  
    Posty: 12
    więc jak to poprawić? Chodzi mi oto jak pozbyć się tego ord i zastąpić to lenghtem
  • #8 6525160
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    Kolego sp33dway proszę się trochę wysilić i nie czekać na gotowca (Regulamin, p. 16). Już wszystko zostało napisane na temat rozwiązania problemu kolegi.

    Przypominam również o poprawie pierwszego postu w temacie.

    Pozdrawiam,
    Dr.Vee
  • #9 6525509
    sp33dway
    Poziom 10  
    Posty: 12
    juz zrobilem wszystko ladnie gra

    Tak ma byc

    uses crt;
    var
    a,b,a1,b1:integer;
    tab:array[1..100] of char;
    begin
    clrscr;
    write('Podaj klucz kodowania: ');
    readln(b1);
    write ('Podaj sˆowo: ');
    readln(tab);
    b:=length(tab);
    clrscr;
    for a:=1 to b do
    write(tab[a]);
    a1:=1;
    for a:=1 to b1 do
    for b:=1 to b1 do
    begin
    gotoxy(a+1,b+1);
    write(tab[a1]);
    a1:=a1+1;
    end;
    repeat until keypressed;
    end.
  • #10 6530157
    adammikolajfilipek
    Poziom 11  
    Posty: 6
    Ocena: 1
    Dawno nie pisałem w pascalu i z ciekawości zainstalowałem sobie tp 7.0
    to co mnie zaciekawiło to

    tab:array[1..100] of char;

    a potem

    readln(tab);

    u mnie próba wczytania tablicy przez readln wywala błąd

    i taka uwaga co do :

    readln(b1);

    Zmienną b1 masz zadeklarowaną jako integer, a co jeśli użytkownik wpisze np. 'abc' lub -23 ?
    ( oczywiście integer przyjmie -23, ale potem pętla For juz się wyłoży )
    Warto zawsze coś takiego przewidzieć i temu zapobiec - tutaj to tylko mini programik, ale warto wyrabiać nawyki.
    Kolejna rzecz to nazywanie zmiennych - zamiast literek a,b,a1 itd lepiej użyć nieco dłuższych nazw, które coś "mówią" np. 'Klucz', 'DlugoscKlucza', 'Slowo', 'DlugoscSlowa'
  • #11 6532278
    xanio
    Poziom 27  
    Posty: 933
    Pomógł: 68
    Ocena: 55
    -tablicy nie wprowadza się przez readln. W tym wypadku lepiej użyć stringów.

    -jeżeli chodzi o pobranie zmiennej integer od użytkownika to:
    
    
    var
      a: integer;
      res: integer;
    
    begin
      repeat
        write('podaj liczbe: ');
       {$I-}
        readln(a);
       {$I+}
        res:=ioresult;
        if res<>0 then writeln('wprowadzono zla wartosc');
      until res=0;
    end.
    

Podsumowanie tematu

✨ Dyskusja dotyczy automatycznego zliczania liczby wprowadzonych znaków w programie napisanym w Pascalu, bez konieczności wcześniejszego podawania ich ilości. Zaproponowano rozwiązanie polegające na wczytywaniu znaków pojedynczo za pomocą funkcji readkey w pętli repeat aż do naciśnięcia klawisza Enter (kod ASCII 13), co eliminuje potrzebę ręcznego podawania liczby znaków. Wyjaśniono działanie funkcji ord, która zwraca kod ASCII znaku, oraz znaczenie kodu 13 jako znaku końca wprowadzania (Enter). Alternatywnie zasugerowano użycie typu string zamiast tablicy char, co pozwala na wykorzystanie funkcji length do automatycznego określenia długości wprowadzonego tekstu. Podkreślono również znaczenie walidacji danych wejściowych, np. przy wczytywaniu wartości typu integer, aby uniknąć błędów podczas działania programu. Wskazano na praktyczne aspekty programowania w Turbo Pascalu, takie jak czytanie znaków, obsługa klawiatury i dobre praktyki nazewnictwa zmiennych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA