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

Turbo Pascal: Katalog płyt DVD - problem z menu programu

hachigoro 23 Paź 2009 22:20 2321 10
REKLAMA
  • #1 7167257
    hachigoro
    Poziom 2  
    Posty: 3
    Witam, mam problem: napisałem program w turbo pascalu. Tworzy katalog plyt dvd. Problem jest taki, że nie działa i nie wiem, co może być nie tak(pewnie jest problem z ostatnimi linikami: menu). Proszę o pomoc. To mój program:
    Program Katalog_Plyt;
    uses Crt;
    type
    string30=string[30];
    string25=string[25];
    Plyta=record
    Tytul:string[30];
    Rezyser:string[25];
    Gatunek:string[25];
    Licznik:word;
    end;
    const
    MAX_PAMIEC=63000;
    Pojemnosc=MAX_PAMIEC div SizeOf(Plyta);
    var
    Katalog:array[1..Pojemnosc] of Plyta;
    LbPoz:integer;
    procedure Wprowadz_Dane (var r:Plyta);
    begin
    with r do
    begin
    write('Tytul:');
    readln(Tytul);
    write('Rezyser:');
    readln(Rezyser);
    write('Gatunek:');
    readln(Gatunek);
    end;
    end;
    procedure Wypisz_Dane(r:Plyta);
    begin
    with r do
    begin
    write('Tytul:');
    writeln(Tytul);
    write('Rezyser:');
    writeln(Rezyser);
    write('Gatunek:');
    writeln(Gatunek);
    end;
    writeln;
    end;
    procedure Dodaj_Plyte;
    begin
    Inc(LbPoz);
    Write('Nowa pozycja w katalogu:',LbPoz);
    Wprowadz_Dane(Katalog[LbPoz]);
    Katalog[LbPoz].Licznik:=0;
    end;
    procedure Usun_Plyte(Numer:integer);
    begin
    Katalog[Numer]:=Katalog[LbPoz];
    Dec(LbPoz);
    end;
    function Szukaj(Tekst:string; Pozycja:integer):integer;
    var
    i:integer;
    begin
    i:=Pozycja;
    while (Pos(Tekst, Katalog[i].Tytul)=0) and (i<=LbPoz) do
    if i<=LbPoz then
    Szukaj:=i
    else
    Szukaj:=-1;
    end;
    procedure Sprawdz_Plyty(Tytul:string);
    var
    i:integer;
    begin
    write('Podaj tytul szukanej plyty:');
    readln(Tytul);
    repeat
    i:=Szukaj(Tytul,i);
    if i<>-1 then
    begin
    writeln('Pozycja w katalogu nr',i,':');
    Wypisz_Dane(Katalog[i]);
    Inc(i);
    end;
    until i=-1;
    end;
    function Porownaj_Tytul(r1,r2:Plyta):integer;
    begin
    if r1.Tytul<r2.Tytul then Porownaj_Tytul:=-1
    else Porownaj_Tytul:=1;
    end;
    function Porownaj_Rezyser(r1,r2:Plyta):integer;
    begin
    if r1.Rezyser<r2.Rezyser then Porownaj_Rezyser:=-1
    else Porownaj_Rezyser:=1;
    end;
    procedure Sortuj(kryterium:integer);
    var
    i,j:integer;
    Czy_Wiekszy:integer;
    Pomoc:Plyta;
    begin
    for i:=1 to LbPoz-1 do
    for j:=i to LbPoz do
    begin
    if Kryterium=1 then Czy_Wiekszy:=Porownaj_Tytul(Katalog[i],Katalog[j])
    else Czy_Wiekszy:=Porownaj_Rezyser(Katalog[i],Katalog[j]);
    if Czy_Wiekszy=1 then
    begin
    Pomoc:=Katalog[i];
    Katalog[i]:=Katalog[j];
    Katalog[j]:=Pomoc;
    end;
    end;
    end;
    procedure Wypisz_Katalog;
    var
    Kryterium:integer;
    Wypisz:integer;
    begin
    write('Sortowanie wedlug tytulow (1)', 'lub nazwisk autorow(2)');
    readln(Kryterium);
    Sortuj(Kryterium-1);
    readln;
    end;
    function Menu:integer;
    var
    c:char;
    menu:word;
    begin
    ClrScr;
    writeln('Katalog plyt');
    writeln;
    writeln('Wybierz funkcje:');
    writeln('1: Wyszukiwanie pozycji wg tytulu');
    writeln('2: Wyswietlenie wszystkich pozycji');
    writeln('3: Dodawanie plyty do katalogu');
    writeln('0: Koniec pracy');
    writeln;
    readln(menu);
    case menu of
    1:Sprawdz_Plyty;
    2:Wypisz_Dane;
    3:Wprowadz_Dane;
    else
    readln;
    end;
    end.
  • REKLAMA
  • #2 7167365
    xanio
    Poziom 27  
    Posty: 933
    Pomógł: 68
    Ocena: 55
    Zrób wcięcia w kodzie i użyj znacznika [code] do wstawienia programu na forum.

    Sam program jest bardzo prosty.

    Po co masz typy string30=string[30],string25=string[25] skoro ich nie używasz?
    do czego służy w rekordzie Plyta pole licznik?
  • REKLAMA
  • #3 7167377
    hachigoro
    Poziom 2  
    Posty: 3
    Jestem w tym nowy, jeszcze mi nie idzie dobrze, mógłbyś mi to poprawić mimo wszystko, ze jest jak jest?? Bardzo proszę.
  • REKLAMA
  • #4 7167451
    xanio
    Poziom 27  
    Posty: 933
    Pomógł: 68
    Ocena: 55
    Gdybym miał to poprawić, musiałbym napisać program praktycznie od początku. Oczywiście mogę to zrobić ale wtedy wystawię fakturę VAT.

    Wolałbym jednak abyś sam spróbował naprawić program: chętnie pomogę ale najpierw musisz wykazać odrobinę chęci współpracy.

    Aha, na początek podpowiem Ci, że w funkcji Menu() masz zmienną menu typu word. Zmienna nie może się nazywać tak jak funkcja w której z najduje się ta zmienna (bez względu na wielkość liter).
  • #5 7167475
    hachigoro
    Poziom 2  
    Posty: 3
    Przepraszam bardzo, za to, ze jako młody informatyk męczący się 2 dni nad tym programem liczyłem na pomoc kogoś, kto mi jakoś ułatwi. Nie potrzeba mi było wielkiej poprawy, chciałem tylko, by się uruchamiał i dało się wpisywać. Zapomniałem, że forum, które ma pomagać nie działa w ten sposob.
  • #6 7167505
    xanio
    Poziom 27  
    Posty: 933
    Pomógł: 68
    Ocena: 55
    Nie obrażaj się tylko popraw najpierw to na co Ci zwróciłem uwagę (zmienna menu).

    Analizując dalej program widzę, że źle używasz funkcji Sprawdz_Plyty i Wypisz_Dane.

    Twoje deklaracje zakładają, że przekazujesz do nich parametry, jednak później używasz ich nie podając żadnych.

    Edit: poza tym prosiłem Cię już wcześniej abyś wkleił kod używając znaczników [code] tak abyśmy go mogli łatwiej przeanalizować.

    Niestety to, że jesteś tu nowy nie zwalnia Cię z obowiązku wykazania się samodzielnością i przestrzegania regulaminu.
  • #7 7187231
    maciejjank
    Poziom 13  
    Posty: 124
    Pomógł: 1
    Cytat:

    write('Tytul:');
    writeln(Tytul);
    write('Rezyser:');
    writeln(Rezyser);
    write('Gatunek:');
    writeln(Gatunek);

    Moim skromnym zdaniem powinno być :

    
    write('Tytul:');
    writeln('',Tytul);
    write('Rezyser:');
    writeln('',Rezyser);
    write('Gatunek:');
    writeln('',Gatunek);
    
  • #8 7187474
    xanio
    Poziom 27  
    Posty: 933
    Pomógł: 68
    Ocena: 55
    maciejjank chyba ma przyzwyczajenia z innych języków. Ten wcześniejszy kod jest jak najbardziej poprawny.
  • #9 7187523
    wd40
    Poziom 21  
    Posty: 538
    Pomógł: 21
    Ocena: 62
    Ale co CI konkretnie nie działa?
    W tym programie możesz wykonać wyłącznie raz jedną czynność, więc jeżeli dodasz płytę to już jej nie znajdziesz, bo program się skończy.
    Wstaw po ostatnim begin repeat
    A przed end. until 1=0;
    i wywal function Menu:integer
    Chyba się nie pomyliłem, bo strasznie nieczytelnie wkleiłeś ten programik i trudno dojść z czymkolwiek - dobrze, że wklejałeś pascala a nie c++, bo by była masakra. ;)
  • REKLAMA
  • #10 7191275
    maciejjank
    Poziom 13  
    Posty: 124
    Pomógł: 1
    xanio napisał:
    maciejjank chyba ma przyzwyczajenia z innych języków. Ten wcześniejszy kod jest jak najbardziej poprawny.

    Niestety to nie przezwyczajenie z innych języków!
    Sygeruję to tak jak w większości internetowych kursów Pascala uczą.

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z działaniem programu napisanego w Turbo Pascalu, który ma tworzyć katalog płyt DVD. Głównym problemem jest niepoprawne działanie menu programu, szczególnie w ostatnich linijkach kodu. Wskazano, że zmienna o nazwie „menu” w funkcji Menu() jest niepoprawna, ponieważ nie można używać nazwy zmiennej identycznej z nazwą funkcji. Ponadto zauważono błędy w wywoływaniu procedur Sprawdz_Plyty i Wypisz_Dane, które wymagają przekazywania parametrów, a w kodzie są wywoływane bez nich. Zwrócono uwagę na konieczność poprawnego formatowania kodu i stosowania znaczników do wklejania kodu na forum. Dyskusja porusza także kwestie składniowe dotyczące wypisywania danych (writeln vs. write) oraz sugestię, by program umożliwiał wielokrotne wykonywanie operacji poprzez zastosowanie pętli zamiast pojedynczego wywołania menu. Wskazano, że program jest prosty, ale wymaga poprawy struktury i nazewnictwa zmiennych, a także samodzielności autora w rozwiązywaniu problemów.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA