fonbook w danych dynamicznych

0

Witam wszystkich :) napisałem program ksiazki telefonicznej no i szukanie w kolejce mi nie działa:( [dodawanie nowej osoby i losowej działa dobrze !] no i szukałem błedu bo podobny program już zrobiłem ale to jest podobnie rozwiązane :(
mam nadzieje ze pomożecie, z góry thx :)

 program fonbuk ;
uses crt;
type
   wskaznik =^element;
   element = record
           imie,nazwisko,fon:string;
           next:wskaznik;
           end;
var
head,tail :wskaznik;
imie,nazwisko,fon:string;
menu,ile,i,namelos,surlos:integer;

procedure los ;
          begin

               namelos     := random(9);
               case namelos of
                    0: imie:='Asia  ';
                    1: imie:='Kasia ';
                    2: imie:='Basia ';
                    3: imie:='Jan   ';
                    4: imie:='Adam  ';
                    5: imie:='Ania  ';
                    6: imie:='Poitr ';
                    7: imie:='Grzes ';
                    8: imie:='Lukas ';
                    9: imie:='Tomek ';
               end;
               surlos :=random(9);
               case surlos of
                    0: nazwisko:='Stronkiewicz  ';
                    1: nazwisko:='Nowak         ';
                    2: nazwisko:='Slowak        ';
                    3: nazwisko:='Losak         ';
                    4: nazwisko:='Bosak         ';
                    5: nazwisko:='Brzyskiewicz  ';
                    6: nazwisko:='Bober         ';
                    7: nazwisko:='Psikuta       ';
                    8: nazwisko:='Bombkiewicz   ';
                    9: nazwisko:='Dracena       ';
               end;
               for i:=0 to 9 do
                   fon[i]:=chr(random(9)+48);
          end;


procedure enqueue (var h,t:wskaznik;i,n,f:string);
          var nowy:wskaznik;
          begin
               new (nowy);
               nowy^.imie    :=i;
               nowy^.nazwisko:=n;
               nowy^.fon     :=f;
               nowy^.next:=nil;
               if h=nil then
                  begin
                       h:=nowy;
                       t:=h;
                  end
                  else
                      begin
                       t^.next:=nowy;
                       t:=t^.next;
                      end;
          end;


function printqueue (h:wskaznik):string;
          begin
          while h<> nil do
                begin
                     write (h^.imie,' ',h^.nazwisko,' ');

                     writeln   (h^.fon);
                     h:=h^.next;
                end;
          end;

procedure add (var h,t:wskaznik;imie,nazwisko,fon:string);
          begin
          write ('dziala');
          end;

function search (h:wskaznik):string;
          begin
          writeln ('podaj poszukiwane imie lub nazwisko');
           readln (imie);
           writeln;
           writeln ('wyszukane osoby to:') ;

          while h<> nil do
                begin
                     if (h^.imie=imie) or (h^.nazwisko=imie) then
                        begin
                             write (h^.imie,' ',h^.nazwisko,' ');
                             writeln   (h^.fon);
                        end;
                     h:=h^.next;
                end;
          end;

begin
{----------------------Menu-----------}
clrscr;
while (menu<>1) or (menu<>2) or (menu<>3) do
begin
writeln;
writeln ('wybierz co chcesz zrobic?');
writeln ('wyswitel wszystkie losowo wybrane rekordy w ksiazce --- wcisnij 1');
writeln ('wyszukaj osob(e/y) ------------------------------------ wcisnij 2');
writeln ('dodaj osobe do ksazki --------------------------------- wcisnij 3');
writeln ('zakoncz ----------------------------------------------- wcisnij 4');
writeln;

write ('wybieram: ');
readln (menu);

{-------------------MENU WYBOR 1 -----------    }
if (menu=1) then
   begin
   writeln ('ile osob wylosowac?');
   readln (ile);
   randomize ;
   while ile >0 do
      begin
           los;
           enqueue (head,tail,imie,nazwisko,fon);
           dec(ile);
      end;
   writeln;
   writeln ('wylosowane osoby to:') ;
   printqueue (head);
end;

{-----------------Menu wybor 2--------}
if(menu=2) then search(head);
{-----------------Menu wybor 3--------}
if(menu=3)then
begin
writeln ('ile osob dodac?');
               readln (ile);
               while ile>0 do
                     begin
                          writeln ('podaj imie, nazwisko oraz numer ',ile,'osoby');
                          readln (imie); readln(nazwisko); readln (fon);
                          enqueue (head,tail,imie,nazwisko,fon);
                          dec(ile);
                     end;
                    writeln;
                    writeln ('dodaneane osoby to:') ;
                    printqueue (head);

end;
end;
readln;
end.
0

Po pierwsze takie tematy to do Newbie.

zygfryt napisał(a)

Witam wszystkich :) napisałem program ksiazki telefonicznej no i szukanie w kolejce mi nie działa:( [dodawanie nowej osoby i losowej działa dobrze !]

Po drugie wprawdzie obecnie nie mam zainstalowanego Pascala i piszę z głowy ale nawet nie wiesz jak się mylisz.

rocedure los ;
          begin
               namelos     := random(10);
               case namelos of
                    0: imie:='Asia';
                    1: imie:='Kasia';
                    2: imie:='Basia';
                    3: imie:='Jan';
                    4: imie:='Adam';
                    5: imie:='Ania';
                    6: imie:='Poitr';
                    7: imie:='Grzes';
                    8: imie:='Lukas';
                    9: imie:='Tomek';
               end;
               surlos :=random(10);
               case surlos of
                    0: nazwisko:='Stronkiewicz';
                    1: nazwisko:='Nowak';
                    2: nazwisko:='Slowak';
                    3: nazwisko:='Losak';
                    4: nazwisko:='Bosak';
                    5: nazwisko:='Brzyskiewicz';
                    6: nazwisko:='Bober';
                    7: nazwisko:='Psikuta';
                    8: nazwisko:='Bombkiewicz';
                    9: nazwisko:='Dracen';
               end;
               fon:='';
               for i:=1 to 9 do
                 fon:=fon + chr(random(10)+$30);
          end;

Tak powinno działać a na pewno nie działało tak jak było. Można też było zastosować tablice.

Po trzecie zafunduj sobie (nie wiem czy jest gotowa w Pascalu jest odpowiednik LowerCase z Delphi) jakąś funkcję zmieniającą wszystkie litery na małe (lub duże) np. taką:

function lowercase(s: string): string;
var
  i: integer;
begin
  if  length(s) > 0 then
  begin
     for i:= 1 to length(s) do
    begin
      if s[i] in ['A'..'Z'] then
        s[i]:= Chr(Ord(s[i]) + $20);
    end;
  end;
  lowercase:= s;
end;

jak pobierasz imie do szukania to po tym

imie:= lowercase(imie);

a sprawdzanie warunku czy wyszukiwane imiona lub nazwiska są takie same powinno wyglądać tak:

if (lowercase(h^.imie)=imie) or (lowercase(h^.nazwisko)=imie) then

Po czwarte ta pętla menu na moje oko dziwnie wygląda raczej zastosowałbym:

repeat
{kod w pętli}
until (menu=4);

Może jeszcze czegoś nie zauważyłem ale już późno a jak wspomniałem nie mam Pascala a nie chce mi się tego przerabiać na Delphi (choć wiele roboty nie ma chyba tylko dodać dyrektywę {$APPTYPE CONSOLE} w wywalić z uses Crt bo i tak chyba jest niepotrzebne).

EDIT//
Jeszcze znalazłem randomize wywołuje się tylko raz więc powinno ono być na początku programu (przed pętlą menu) a nie tak jak masz teraz.

0

zamiast

namelos := random(9);
case namelos of

zrob

Case Random(9) of
0

Jak już "czepiasz się" tego nieszczęsnego losowania to lepiej:

procedure los;
const
   IMIONA : array [0..9] of string  = ('Asia', 'Kasia', 'Basia', 'Jan', 'Adam',
          'Ania', 'Poitr', 'Grzes', 'Lukas', 'Tomek');
   NAZWISKA : array [0..9] of string  = ('Stronkiewicz', 'Nowak', 'Slowak', 'Losak', 'Bosak',
		  'Brzyskiewicz', 'Bober', 'Psikuta', 'Bombkiewicz', 'Dracen');	
var
  i: Integer;	  
begin
  imie:= IMIONA[Random(High(IMIONA) + 1)]; {ew. Random(10) ale tak jest lepiej}
  nazwisko:= NAZWISKA[Random(High(NAZWISKA) + 1)]; {ew. Random(10) ale tak jest lepiej}
  fon:='';
  for i:=1 to 9 do
    fon:=fon + chr(random(10)+$30);
end;

Poza tym Random(10) a nie Random(9) jak już :P

0

hmm.... zmieniłem tego while obsługujacego menu jak mówiłeś na repeat until no i działa, ale wiesz to bym jeszcze doszlifował, nie chodzi mi też o losowanie imion czy coś w stylu zamiast random 9 to random 10 bo to też nie naprawi błedu w wyszukiwaniu chodzi o to że on nie wyszykuje podanych osób (ale samo dodawanie losowe i nawet to późniejsze ręczne działa!! tylko opcja 2 z menu nie działa!)
p.s troche nie kumam to po co sa działy na forum oddzielnie dla c dla pascala i innych skoro wszystko kieruje sie do działu newbie??

a już rozwiązałem sam okazało sie ze wystarczy dać apostrof w procedurze los zaraz do imieniu lub po nazwisku a procedura search uznałała te spacje za jakieś dziwne znaki i dlatego nie chodziła :P no ale dzięki za support :) pozdro!! mokrego :)

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