Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Kaburagi

Program w turbo pascalu

Rekomendowane odpowiedzi

Witam!

Mam do zrobienia program składający w z menu, w którym mamy opcje dodawania osób, wyświetlania, szukaniu imienia i nazwiska po ciągu znaków, wyszukiwanie osób z zakresu wiekowego.

Sam program nie jest trudny, jednakże nie wiem jak wyszukać imienia, którego podajemy fragment.. Nieważne czy to początek, środek, czy też końcówka.

 

Dla przykładu w tablicy mamy imiona :

karol

karolina

 

Wpisując "ka" powinno nam wyświetlić oba imiona, natomiast wpisując "lina" zaledwie karolinę.

 

Zrobiłem podobny program, ale wyszukujący tylko po pierwszych literach...

Oto jego kod:

 

program bazad;
uses crt;
type
   lista=record
   imie:string [30];
   nazwisko:string [30];
   wiek:integer;
   end;
var tab:array[1..5] of lista;
   szukane,slowo:string;
   znak,nic:char;
   i,j,licznik,dlugosc,dol,gora,zamiana:integer;

Begin
Repeat
clrscr;
writeln('[d] Dodawanie');
writeln('[i] Wyszukiwanie po imieniu');
writeln('[n] Wyszukiwanie po nazwisku');
writeln('[w] Wyszukiwanie po wieku');
writeln('[p] Podglad');
writeln('[Esc] Koniec programu');
znak:=upcase(readkey);
        Case znak of
        'D':Begin
            clrscr;
            licznik:=licznik+1;
            i:=i+1;
                 write('Podaj imie: ');readln(tab[i].imie);
                 write('Podaj nazwisko: ');readln(tab[i].nazwisko);
                 write('Podaj wiek: ');readln(tab[i].wiek);
            end;
        'P':Begin
            clrscr;
            For i:=1 to licznik do
                WITH tab[i] do
                writeln(imie:20,nazwisko:20,wiek:8);
            end;
        'I':Begin
            clrscr;
            write('Podaj pierwsze litery imienia: ');readln(szukane);
            dlugosc:=ord(szukane[0]);
                 For i:=1 to licznik do
                 Begin
                     For j:=1 to dlugosc do
                       Begin
                       znak:=tab[i].imie[j];
                       slowo:=slowo+znak;
                       end;
                 IF slowo=szukane then
                    WITH tab[i] do
                    writeln(imie:20,nazwisko:20,wiek:8);
                    slowo:='';
                 end;
            end;
        'N':Begin
            clrscr;
            write('Podaj pierwsze litery nazwiska: ');readln(szukane);
            dlugosc:=ord(szukane[0]);
                 For i:=1 to licznik do
                 Begin
                     For j:=1 to dlugosc do
                     slowo:=slowo+tab[i].nazwisko[j];
                 IF slowo=szukane then
                    WITH tab[i] do
                    writeln(imie,nazwisko:20,wiek:8);
                 slowo:='';
                 end;
            end;
        'W':Begin
            clrscr;
            write('Przedzial dolny: ');readln(dol);
            write('Przedzial gorny: ');readln(gora);
              IF gora<dol then
                 Begin
                 zamiana:=dol;
                 dol:=gora;
                 gora:=zamiana;
                 end;
            For i:=1 to licznik do
               Begin
               j:=tab[i].wiek;
               IF (j>=dol) and (j<=gora) then
               WITH tab[i] do
               writeln(imie,nazwisko:20,wiek:8);
               end;
            end;
        #27:halt end;
writeln('Nacisnij [ENTER] aby wrocic do menu');
readln;
until false;
end.

 

Nie jest to program na sprawdzian etc., jednakże jakiś czas próbuję go już zrobić, ale wszystkie moje próby kończą się fiaskiem... A znając mój charakter, nie spocznę póki nie znajdę odpowiedzi, jak to zrobić. ;)

 

Proszę o pomoc i z góry dziękuję za podpowiedzi i rozwiązanie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

najmniej efektywne:

 

w pętli po literach słowa {

licznik = 0 ;

w pętli po szukanym {

jeśli litera_zew == litera_wew licznik++, inaczej break ;

}

jeśli licznik == dlugosc_szukanego { znaleziony = true ; break }

}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@209458

 

Tak, widziałem taką możliwość rozwiązania tegoż problemu, jednakże mój prof. zawsze mówi, że takie rozwiązania nie do końca są właściwe i dlatego nie chcę korzystać z tej metody.. Chciałbym to zrobić w sposób "logiczny", a nie za pomocą wszelkiego rodzaju komend - "ułatwiaczy".

 

 

@Januzi

 

Nie rozumiem o co chodzi w Twoim rozwiązaniu.

Jeśli możesz to spróbuj wytłumaczyć bardziej łopatologicznie. ;)

 

----

 

A co do samego programu, to tak na mój rozum, podany przez nas ciąg powinien być sprawdzany z całym słowem i jeżeli ciąg w danym słowie się znajduje, to owe słowo powinno być wypisywane, jeśli zaś nie ma tego ciągu w słowie to program powinien przeskoczyć to kolejnego indeksu w tablicy i tak aż do końca.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie porównuj całych stringów w sensie równości ale szukaj różnic - jak pierwsza litera się nie pokrywa to drugiej nie ma sensu porównywać czyli mniej więcej to co napisał januzi - dotyczy to oczywiście przypadku jak szukasz tylko od początku wyrazu

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

jakisdluginapis

dlugi

 

j != d

a != d

k != d

i != d

s != d

d == d

l == l

u == u

g == g

i == i

dopasowanych liter = 5, długość szukanego napisu = 5; znaleziony

 

 

ew. szukasz w pascalu gotowej funkcji, która działa jak strpos

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeszcze tak mnie w nocy trochę natchnęło... ;D

A mianowicie.. Pomyślałem sobie, żeby porównać wszystkie imiona w tablicy i posortować je metodą bąbelkową.

Najdłuższe imię zostałoby wpisane w komórce pierwszej. I pętla kręciłaby się tak długo, aż dojdzie do ostatniej litery komórki pierwszej.

Czy tak może być?

 

@Black

 

Szukanie od początku wyrazów zrobiłem... Tylko nie wiem jak zrobić by znalazło dane słowo po np. 2ch ostatnich literach.

 

 

@Januzi

 

Jeśli dobrze rozumiem Twoje rozwiązanie, to w miejscach, w których nie ma podanego ciągu wstawia się 'd' i całość sprawdzania przeskakuje do kolejnej literki. Wszystko ciągnie się tak długo, aż wyczerpie całą długość słowa.

 

 

W między czasie zrobiłem taki program, z małą tylko różnicą, że wyszukujemy 1 literki. Poniższy kod działa i czy podobną metodą mogę zrobić program, w którym rozwiązaniu mi pomagacie?

 

 

 

program tulukasz;

uses
   crt;

type
   tablica=array[1..255] of integer;

var
  a,i,j,licznik:integer;
  znak,literka:char;
  slowo:string;
  tab:tablica;

begin
repeat
licznik:=0;

textcolor(white);
clrscr;
writeln('[W] Wpisz ciag znakow');
writeln('[Y] Wyswietl ciag znakow');
writeln('[s] Wpisz znak, ktory chcesz wyszukac');
writeln('[Esc] Koniec');
znak:=upcase(readkey);
                     case znak of
                          'W':
                              begin
                              licznik:=0;
                              clrscr;
                              write('Wpisz ciag znakow : ');
                              read(slowo);
                              j:=length(slowo);

                              end;

                          'Y':
                              begin
                              clrscr;
                              for i:=1 to j do
                                  if slowo[i]=literka then
                                     begin
                                     textcolor(yellow);
                                     write(slowo[i]);
                                     textcolor(white);

                                     end
                                        else


                                            write(slowo[i]);


                              end;
                          'S':
                              begin
                              clrscr;
                              write('Podaj liczbe, ktora chcesz wyszukac : ');
                              literka:=readkey;
                              writeln;
                              for i:=1 to j do
                                  if literka=slowo[i] then
                                  begin
                                  licznik:=licznik+1;
                                  write(i,' ');

                                  end;

                                  write(' to pozycje znaku ',literka,' ktory wystepuje ',licznik,' razy');
                              end;

                          #27:
                              halt;

                     end;




readln;
until false;
end.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

jak to ma chodzić w pętli dla wielu nazwisk to licznik ustaw na zero w każdej sekcji "S" bo innaczej będą herezje w kolejnych przejsciach

no i tak samo zrobisz dla całych wyrazów - jak znajdziesz pierwszą pasującą literę to:

- jak bieżąca pozycja w przeszukiwanym nazwisku + długość szukanego stringa jest większa od długości przeszukiwanego nazwiska to omiń to - bo i tak szukany wyraz się tam nie mieści

- jak mniejsze / równe to porównuj kolejne litery przy pomocy while - jak literki równe to porównujesz dalej, jak nie to przerywasz, w pętli while zwiększasz licznik

- jak ten licznik z while po wyjściu z pętli równa się długości szukanego wyrazu to go znalazłeś ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...