Skocz do zawartości


Close Open
Close Open
Zdjęcie
- - - - -

pascal baza


  • Please log in to reply
35 replies to this topic

#1 Anna_A

Anna_A

    Kandydat

  • Forumowicze
  • PipPip
  • 27 Postów:

Napisany 02 March 2006 - 11:13 AM

Witam wszystkich na forum, mam ogromny problem z pewnym zadaniem z turbo pascala :(
Mam zrobić bazę danych w stylu dziennika lekcyjnego, w której badą zawatre dane personalne o uczniach wprowadzane za pomocą procedur zapisu wyprowadzane proc. odczytu. W bazie tej też mam zrobić macierz odpowiadającą za obecności 40 osobowej klasy przez 40 tygodzni szkolnych. Zaczęłąm robić zadanie i coś mi nie wychodzi, dobra z pascala nie jestem i mam z tym niemałe problemy, pomoże mi ktoś? Pliss.

Poniżej wklejam początek programu ten z któym mam najwięjszy problem, mam nadzieję że ktoś umie choć trochę pascala

program rekord; 
uses crt; 

const v=40;          {okresla tygodnie} 
      z=3; 
      godziny:array[1..z] of string[18]=('ilosc godzin zajec','obecnosc','nieobecnosc'); 

type dane=record 
     nr:longint; 
     nazw:string[20]; 
     imie:string[15]; 
     obecnosc:array[1..40,1..3,1..40] of byte; 
     data:record 
          dz,mc:byte; 
          rok:integer; 
          end; 
       msc:string[30]; 
     adres:record 
           ul,msc2:string[20]; 
           dom,mieszk:integer; 
           end; 
     end; 

  var osoba:dane; 
     plik: file of dane; 
     nazwa1:string[20]; 
     t,dec,dec0,dec1,wpi,dop,odcz,kor,ob:char; 
     x,n:integer; 
     w,k,s,i,j,l,r:byte; 
     label 1,2,3;

procedure wpis; 
 begin 
  writeln('Podaj nazwe pliku: '); 
  readln(nazwa1); 
  assign(plik,nazwa1); 
  rewrite(plik); 
  wymiar; 
  for l:=1 to s do 
  for i:=1 to w do 
  begin 
   with osoba,data,adres do 
   begin 
     repeat 
    write('Podaj nr ucznia: '); 
    readln(nr); 
    write('Podaj  nazwisko ucznia: '); 
    readln(nazw); 
    nazw[1]:=upcase(nazw[1]); 
    write('Podaj imie ucznia: '); 
    readln(imie); 
    imie[1]:=upcase(imie[1]); 
    write('Podaj dz. urodzenia: '); 
    readln(dz); 
    write('Podaj miesiac urodzenia: '); 
    readln(mc); 
    write('Podaj rok urodzenia: '); 
    readln(rok); 
    write('Podaj miejsce urodzenia: '); 
    readln(msc); 
    msc[1]:=upcase(msc[1]); 
    writeln('Adres zamieszkania'); 
    write('Podaj ulice: '); 
    readln(ul); 
    ul[1]:=upcase(ul[1]); 
    write('Podaj numer domu: '); 
    readln(dom); 
    write('Podaj numer mieszkania: '); 
    readln(mieszk); 
    write('Podaj miejscowosc zamieszkania: '); 
    readln(msc2); 
    msc2[1]:=upcase(msc2[1]); 
      for j:=1 to k do 
       begin 
        for x:=1 to z do 
        write(godziny[x]:18,' : '); 
        readln(obecnosc[w,k,l]); 
       end; 
  write(plik,osoba); 
  writeln; 
  writeln('Czy chcesz wprowadzic kolejnego ucznia (T/N)?'); 
  writeln; 
  zap:=readkey; 
  zap:=upcase(zap); 
  until zap='N'; 
  end;  end; 
  close(plik); 
 end; 

procedure odczyt; 
 begin 
  writeln('Podaj nazwe pliku: '); 
  readln(nazwa1); 
  assign(plik,nazwa1); 
  reset(plik); 
  writeln('Wprowadzono ',filesize(plik),' uczniow'); 
  while not eof(plik) do 
  begin 
   read(plik,osoba); 
   with osoba,data,adres do 
   begin 
    writeln; 
    writeln('nr rekordu: ',filepos(plik)); 
    writeln('nazwisko         : ',nazw); 
    writeln('imie             : ',imie); 
    writeln('urodzony         : ',dz,'-',mc,'-',rok); 
    writeln('miejscowosc ur.  : ',msc); 
    writeln('adres zamieszk.  : ',ul,' ',dom,'/',mieszk); 
    writeln('miejscowosc      : ',msc2); 
    writeln; 
    writeln('obecnosc':18); 
  {  writeln('Podaj numer strony do ogladania: '); 
     readln(r);} l:=1;      {wybieramy ktora strone macierzy chcemy ogladac} 
       for x:=1 to z do 
        for l:=r to r do 
         begin 
          for i:=1 to w do 
           begin 
            writeln; 
            for j:=1 to k do 
            writeln(godziny[x]:18,' : ',obecnosc[i,j,r]); 
           end; 
           writeln; 
         end; 
   end;   {do with} 
  end;   {do while not} 
  close(plik); 
  readln; 
 end; 

procedure obecnosc; 
 var spr:char; 
     s:byte; 
 begin 
  writeln('Podaj nazwe pliku: '); 
  readln(nazwa1); 
  assign(plik,nazwa1); 
  reset(plik); 
  s:=0; 
  while not eof (plik) do 
  begin 
   seek(plik,s); 
   read(plik,osoba); 
    with osoba do 
     begin 
       l:=1; 
       writeln(nazw,' ',imie); 
       write(godziny[1]:18,' : '); 
       readln(obecnosc[1,1,l]); 
       write(godziny[2]:18,' : '); 
       readln(obecnosc[1,2,l]); 
       obecnosc[1,3,1]:=obecnosc[1,1,l]-obecnosc[1,2,l]; 
       write(godziny[3]:18,' : ',obecnosc[1,3,l]); 
       readln; 
      s:=s+1; 
     end; 
   seek(plik,filepos(plik)-1); 
   write(plik,osoba); 
  end; 
 end; 

procedure odcz_ob; 
 begin 
  writeln('Podaj nazwe pliku: '); 
  readln(nazwa1); 
  assign(plik,nazwa1); 
  reset(plik); 
  writeln('Wprowadzono ',filesize(plik),' uczniow'); 
  while not eof(plik) do 
  begin 
   read(plik,osoba); 
   with osoba,data,adres do 
   begin 
    writeln; 
     {writeln('Podaj numer strony do ogladania: '); 
     readln(r); }r:=1;      {wybieramy ktora strone macierzy chcemy ogladac} 
    writeln(nazw,' ',imie); 
     for l:=r to r do 
      begin 
       for i:=1 to w do 
        begin 
         writeln; 
         for j:=1 to k do 
         write(godziny[x]:18,' : ',obecnosc[i,j,r]); 
        end; 
       writeln; 
      end; 
   end; 
  end; 
  close(plik); 
  readln; 
 end;

Jest baza danych zwykły rekord z jednym podrekordem Obecnosc będącym trójwymiarową macierzą. Chciałam na początku jak tworzę rekord mogłbym sama zadeklarować jakie wymiary ma mieć ta macierz (ostateczna jej wielkość to 40 wierszów, 3 kolumny i 40 stron). Przy tworzeniu pierwszego z rekordów chcę stworzyć macierz właśnie o wymiarach powyższych z tym, że chcę wypełnić wylko jedną stronę. Czyli każdy rekord (osoba) będzie miał przypisany 1 wiersz i 3 kolumny odpowiadające za obecność. Resztę stron chcę uzupełnić za pomocą innej procedury ale na razie mam problem z zadeklarowaniem macierzy w rekordzie tak by jej całej nie wypełniać od razu tylko pierwszą stronę.

Z góry dziękuje za podpowiedzi i wskazówki bo program napewno ma masę błędów:(

#2 Anna_A

Anna_A

    Kandydat

  • Forumowicze
  • PipPip
  • 27 Postów:

Napisany 03 March 2006 - 15:18 PM

Zrobiłam wcześniej program działający na jednym miesiącu, który wszystko pamieta i wyświetla poprawnie. Tylko niewiem jak zrobić z jednego tygodnia aż czterdzieści. Może ktoś z was ma jakiś pomysł, byłabym wdzięczna.
Oto kod programu:
program rekord;
uses crt;

const w=40; {ilosc uczniow w klasie}
      z=3;
      godziny:array[1..z] of string[18]=('ilosc godzin zajec','obecnosc','nieobecnosc');

type dane=record
     nazw:string[20];
     imie:string[15];
     obecnosc:array[1..w] of byte;
     data:record
          dz,mc:byte;
          rok:integer;
          end;
       msc:string[30];
     adres:record
           ul,msc2:string[20];
           dom,mieszk:integer;
           end;
     end;

{  var uczniowie:array[1..w] of dane;}

  var osoba:dane;
     plik: file of dane;
     nazwa1:string[20];
     t,dec,dec0,dec1,zap,dop,odcz,kor,ob:char;
     x,r,n,i,j,k:integer;
     p:string[40];
     label 1,2,3;

 procedure wpis;
 begin
  writeln('Podaj nazwe pliku: ');
  readln(nazwa1);
  assign(plik,nazwa1);
  rewrite(plik);
  repeat
   with osoba,data,adres do
   begin
    write('Podaj  nazwisko ucznia: ');
    readln(nazw);
    nazw[1]:=upcase(nazw[1]);
    write('Podaj imie ucznia: ');
    readln(imie);
    imie[1]:=upcase(imie[1]);
    write('Podaj dz. urodzenia: ');
    readln(dz);
    write('Podaj miesiac urodzenia: ');
    readln(mc);
    write('Podaj rok urodzenia: ');
    readln(rok);
    write('Podaj miejsce urodzenia: ');
    readln(msc);
    msc[1]:=upcase(msc[1]);
    writeln('Adres zamieszkania');
    write('Podaj ulice: ');
    readln(ul);
    ul[1]:=upcase(ul[1]);
    write('Podaj numer domu: ');
    readln(dom);
    write('Podaj numer mieszkania: ');
    readln(mieszk);
    write('Podaj miejscowosc zamieszkania: ');
    readln(msc2);
    msc2[1]:=upcase(msc2[1]);
    obecnosc[x]:=0; {zerujemy wektor obecnosci tworząc go}
   end;
  write(plik,osoba);
  writeln;
  writeln('Czy chcesz wprowadzic kolejnego ucznia (T/N)?');
  writeln;
  zap:=readkey;
  zap:=upcase(zap);
  until zap='N';
  close(plik);
 end;

procedure odczyt;
 begin
  writeln('Podaj nazwe pliku: ');
  readln(nazwa1);
  assign(plik,nazwa1);
  reset(plik);
  writeln('Wprowadzono ',filesize(plik),' uczniow');
  while not eof(plik) do
  begin
   read(plik,osoba);
   with osoba,data,adres do
   begin
    writeln;
    writeln('nr rekordu: ',filepos(plik));
    writeln('nazwisko         : ',nazw);
    writeln('imie             : ',imie);
    writeln('urodzony         : ',dz,'-',mc,'-',rok);
    writeln('miejscowosc ur.  : ',msc);
    writeln('adres zamieszk.  : ',ul,' ',dom,'/',mieszk);
    writeln('miejscowosc      : ',msc2);
    writeln;
    writeln('obecnosc':18);
     for x:=1 to z do
      begin
       writeln(godziny[x]:18,' : ',obecnosc[x]);
      end;
   end;
  end;
  close(plik);
  readln;
 end;

 {--- sprawdzanie i odczyt obecnosci ---}

 procedure obecnosc;
 var spr:char;
     r:byte;
 begin
  writeln('Podaj nazwe pliku: ');
  readln(nazwa1);
  assign(plik,nazwa1);
  reset(plik);
  r:=0; {zmienna wskazujaca poczatek pazy-rekord 0}
  while not eof (plik) do
  begin
  repeat
  seek(plik,r);
  read(plik,osoba);
   with osoba do
   begin
       writeln(nazw,' ',imie);
       write(godziny[1]:18,' : ');
       readln(obecnosc[1]);
       write(godziny[2]:18,' : ');
       readln(obecnosc[2]);
       obecnosc[3]:=obecnosc[1]-obecnosc[2];
       write(godziny[3]:18,' : ',obecnosc[3]);
       readln;
       r:=r+1; {przechodzimy do kolejnego rekordu}
    end;
  seek(plik,filepos(plik)-1);
  write(plik,osoba);
  writeln;
  writeln('Czy chcesz sprawdzac kolejna osobe (T/N)?');
  writeln;
  spr:=readkey;
  spr:=upcase(spr);
  until spr='N';
  end;
 end;

 procedure odcz_ob;
 begin
  writeln('Podaj nazwe pliku: ');
  readln(nazwa1);
  assign(plik,nazwa1);
  reset(plik);
  writeln('Wprowadzono ',filesize(plik),' uczniow');
  while not eof(plik) do
  begin
   read(plik,osoba);
   with osoba,data,adres do
   begin
    writeln;
    writeln(nazw,'  ',imie);
     for x:=1 to z do
      begin
       write(godziny[x]:18,' : ',obecnosc[x]);
       end;
       writeln;
   end;
  end;
  close(plik);
  readln;
 end;
Może ktoś potrafiłby rozmnożyć 1 tydzień dla poszczególnych uczniów tak aby każdy z nich miał 40,podobnie jak w tej macierzy która mi wogule nie wyszła w powyższym poscie, pomóżcie jeśli umiecie, plisss.

#3

  • Goście

Napisany 06 March 2006 - 16:18 PM

Zerknij na to, może coś pomoże: http://www.dzyszla.a...ownload-18.html

#4 Anna_A

Anna_A

    Kandydat

  • Forumowicze
  • PipPip
  • 27 Postów:

Napisany 09 March 2006 - 10:39 AM

Dziękuję, to powyższe zadanie uprościłam bo było tam pare niepotrzebnych rzeczy i praktycznie zostało mi tylko dodanie obecności uczniów z którą walcze ale może uda mi się to zrobić,a wtedy tylko statystyka semestralna,roczna i sortowanie rekodrów, dziękuję za pomoc :)

#5

  • Goście

Napisany 09 March 2006 - 11:02 AM

Nie ma sprawy. Tylko proszę, abyś rozbijana na przyszłosć na nieco mniejsze podproblemy, bo powiem szczerze, że nie chciało mi się całego kodu przeglądać, ani kopiować i kompilować :(

#6 Anna_A

Anna_A

    Kandydat

  • Forumowicze
  • PipPip
  • 27 Postów:

Napisany 09 March 2006 - 11:09 AM

Przepraszam raz jeszcze, i mam nadzieję że już nie będę musiała zajmować czasu, ale jednocześnie ciesze się że uzyskałam pomocną dłon.

#7

  • Goście

Napisany 09 March 2006 - 11:11 AM

Czas możesz zajmować :) Od tego to Forum jest. Tylko nie "coś mi nie wychodzi" ale np.: "nie działa mi wyszukiwanie w bazie, oto funkcja przeszukująca [...] i zmienne [...]". Bo niestety na pytanie ogólne mogłem dać odpwoiedź taką, że również pokazać działający kod podobnego projektu.

#8 Anna_A

Anna_A

    Kandydat

  • Forumowicze
  • PipPip
  • 27 Postów:

Napisany 10 March 2006 - 11:56 AM

Niestety to znowu ja,mam problem i zaraz wyjaśnię dlaczego (dziwne jest to że działało przedtem a teraz mam z tym kłopot),najgorsze że wygląda to poprawnie.

Aby nie zaśmiecać już tego tematu podaję linka któy bezpośrednio w przeglądarce otworzy pełny kod programu,można też ściągnąć na kompa i skompilować.
http://republika.pl/...dragon/TEST.PAS

Otóż, mam problem z odczytem danych.
Zapisując rekord bądź kilka za pomocą procedury Wpis i odczytując ją procedurą odczyt wszystko działa ok.Natomiast wychodząc z programu poprzez menu i klawisz<ESC>, wchodząc ponownie i odczytując go(zapisany plik) przy podrekordach z datą i adresem mam znaki ASCII natomiast nazwisko,imię i te godziny wyświetlają się poprawnie.

Kolejny problem mam z procedurą licz, liczącą godziny w tygodniu dla każdej z kolumn czyli liczba godzin lekcyjnych,liczba ocecnych i nieobecnych,zapisującą ją w nowej macierzy o tym samym wymiarze pod nazwą semestr1.
Niewiem czy nie jestem aż tak mądra czy poprostu niepotrafie napisać prostej procedurki liczącej dla każdego ucznia (tj. osoba[j]) godziny poprzez kolejne tygodnie dla tej osoby (tj w-czyli wiersze w macierzach obecność i semestr1).
Bazę skonstruowałam tak, by każdy uczeń miał swój dzienniczek dlatego każdy uczeń {osoba[j]} ma swoją listę obecności {obecność[w,k]} gdzie w-to kolejne tygodnie( w procedurze dałam na początek 2 tygodnie) a k-to kolumny godzin obecnych,nieobecnych i calkowita liczba zajęć w tygodniu.
Z góry dzięki za jakieś rady i błędy w programie,
pozdrawiam.

#9

  • Goście

Napisany 10 March 2006 - 16:13 PM

Tam jest masa kodu wyłączonego... Poza tym indeksy się chyba nie zgadzają. Dalej - przy odczycie warto zadbać o czyszczenie tablicy.

Ja bym prosił tak:
1. Dać kod taki, jaki jest bez zbędnych komentarzy wyłączajacych części kodu
2. Opisywać kod, bo jest tam zero komentarzy własnych i naprawdę wgryźć się w obcy kod nie jest sprawą prostą i szybką.

3. Posługiwałaś się kiedyś czymś takim, jak debugger?

#10 Anna_A

Anna_A

    Kandydat

  • Forumowicze
  • PipPip
  • 27 Postów:

Napisany 10 March 2006 - 16:34 PM

Przepraszam, wiem że kod nie jest idealny i przejżysty, w klamrach oprócz samego komentarza ukrywałam także elementy które zostały zastapione przez nowe (odkryte)-zostawiłam je tak na wszelki wypadek.
Jeśli chodzi o debugera to niemiałam jeszcze z nim do czynienia, u miem tylko kompilować w pascalu, nic wiecej :(
już poprawiam kod,usuwając wszystko co zbędne zostawiając potrzebne komentarze...

#11

  • Goście

Napisany 10 March 2006 - 16:43 PM

F8 (o ile dobrze pamiętam - tak było w Borland Pascal 7.0) i F7 dla analizowania linijka po linijce z wchodzeniem do funkcji. Następnie takie coś, jak AddWatch (lub podobnie) i można wpisać nazwy zmiennych, które to będą wyświetalne - mozna dzieki temu obserwować, która linijka w jaki sposób modyfikuje daną zmienną.

A w pliku poprawnie się zapisuje?

już poprawiam kod,usuwając wszystko co zbędne zostawiając potrzebne komentarze...

ale chyba nie zamieściłam na serwerze :?

#12 Anna_A

Anna_A

    Kandydat

  • Forumowicze
  • PipPip
  • 27 Postów:

Napisany 10 March 2006 - 16:50 PM

Tzn. tak, nawet jak odczytuje plik który przed chwilą zapisałam jest wszystko ok,
ale jeśli wyjdę i powrócę zpowrotem do porogramu i włącze odczyt,to w miejscu adres mam znaki ASCII a data uroczenia jest wyzerowana.

#13 Anna_A

Anna_A

    Kandydat

  • Forumowicze
  • PipPip
  • 27 Postów:

Napisany 10 March 2006 - 16:50 PM

Tzn. tak, nawet jak odczytuje plik który przed chwilą zapisałam jest wszystko ok,
ale jeśli wyjdę i powrócę zpowrotem do porogramu i włącze odczyt,to w miejscu adres mam znaki ASCII a data uroczenia jest wyzerowana.
http://republika.pl/...ragon/test2.PAS

#14

  • Goście

Napisany 10 March 2006 - 16:51 PM

A nie jest tak, że wcale nie odczytujesz, tylko pozostalości w pamięci czytasz, które po zamknięciu programu znikają?

#15 Anna_A

Anna_A

    Kandydat

  • Forumowicze
  • PipPip
  • 27 Postów:

Napisany 10 March 2006 - 16:54 PM

ale program pyta się o ścieżkę dla konkretnego pliku, zapisanego już na dysku. Dziwne jest to że działało przedtem a teraz zauważyłem że nie jest do końca tak jak powinno, co powinnam zrobic w takim razie?

#16

  • Goście

Napisany 10 March 2006 - 16:56 PM

Przygladałaś się, jak wyglada zapisany plik?

#17 Anna_A

Anna_A

    Kandydat

  • Forumowicze
  • PipPip
  • 27 Postów:

Napisany 10 March 2006 - 17:01 PM

W szkole nas uczyli żeby zawsze podności pierwszą literę w rekordzie typu string więc opcją upcase podnoszę pierwszą literę rekordu nazwisko.
Chciałam by gdy wejdę do procedury wpis program pytał się mnie ile rekordów chcę wprowadzić(tak by nie odpowiadać za każdym razem czy chcę dodać rekord tylko raz zadeklarować ilość-czyli ile) wówczas pętla działa od i=1 aż dojdzie do i równego ile.

#18

  • Goście

Napisany 10 March 2006 - 17:03 PM

procedure odczyt;
 begin
  writeln('Podaj nazwe pliku: ');
  readln(nazwa1);
  assign(plik,nazwa1);
  reset(plik);
  writeln('Wprowadzono ',filesize(plik),' uczniow');
  while not eof(plik) do
  begin
   read(plik,osoba[j]);
   with osoba[j],data,adres do
   begin
    writeln;
    writeln('nr rekordu: ',filepos(plik));
    writeln('nazwisko         : ',nazw);
    writeln('imie             : ',imie);
    writeln('urodzony         : ',dz,'-',mc,'-',rok);
    writeln('miejscowosc ur.  : ',msc);
    writeln('adres zamieszk.  : ',ul,' ',dom,'/',mieszk);
    writeln('miejscowosc      : ',msc2);
    writeln('o b e c n o s c  : ');
     for k:=1 to z do
      begin
       write(godziny[k]:15,' - ',obecnosc[w,k]:2);
      end;
      writeln;
   end;
  end;
  close(plik);
  readln;
 end;

Gdzie jest "j" tutaj zainicjalizowane? A tak w ogóle, to słyszałaś o czyms tkaim, jak zmienne lokalne?

#19 Anna_A

Anna_A

    Kandydat

  • Forumowicze
  • PipPip
  • 27 Postów:

Napisany 10 March 2006 - 17:05 PM

Faktycznie,nie zapisuje się poprawnie do pliku.Widoczne jest nazwisko,imie,miejscowość,ulica ale nie ma daty urodzenia.
wszystkie zmienne na początek deklarowałam jako ogólne by potem mieć w jednym miejscu pokazane jakie już zostały użyte.
J jest zadeklatowane jako zmienna typu byte.
Widze że chyba jest błąd na błędzie w programie...

#20

  • Goście

Napisany 10 March 2006 - 17:08 PM

JA sie nie pytam, jak zadeklarowana, ale jak zainicjalizowana. I jedyną zmienną globalną to powinno być tutaj tablica (ew. jakieś pomniejsze), ale kategorycznie nie zmienne pomocnicze!!! To właśnie dzięki temu nie dosć, że gospodarowanie pamięcią jest gorsze, to dochodzi do błędów, których kompilator nawet nie potrafi wskazać, a i wyszuiwanie ich jest znacznie trudniejsze. Nie robi się tak, że deklaruje wszystkie zmienne w jednym miejscu. Proponuję zerknać raz ejszcze do mojego programu.




0 Użytkowników czyta ten temat

0 użytkowników, 0 gości, 0 anonimowych użytkowników