Wątek przeniesiony 2018-06-08 13:25 z Delphi i Pascal przez furious programming.

Pomysł na aplikację wykorzystującą różne elementy języka

0

Witam mam stworzyć projekt na informatyke, który będzie miał te elementy: rekordy,typy,funkcje,procedury,pliki tekstowe,sortowanie,baza danych itd.. Np jakaś baza np samochodowa która bedzie tworzyla metryki samochodowe(kolor,marka,silnik itp.) i w pliku tekstowym po skonczeniu kompilowania wypisze mi posortowane samochody wzgledem np pojemnosci silnika. I tu moje pytanie czy moglby ktos podrzucic jakis podobny pomysl tylko troszke bardziej rozwiniety? Dodam ze jestem noga z informatyki a chce zaliczyc to tylko na 3...

0

Podstawowe pytanie – jakiego środowiska zamierzasz użyć? TP7, Delphi, Lazarus?

Mateusz19921 napisał(a):

I tu moje pytanie czy moglby ktos podrzucic jakis podobny pomysl tylko troszke bardziej rozwiniety?

Zrób hipotetyczny serwis społecznościowy. Możliwość rejestracji użytkowników, edycji ich danych profilowych, dodawania znajomych i pisania do nich wiadomości. To wystarczy, aby móc skorzystać z wymienionych elementów jezyka, a przy okazji trochę pobawić się danymi z bazy.

0

Dziękuję za szybką odpowiedź. Używam Lazarusa. Interesuje mnie co masz na mysli 'pisania do nich wiadmości', jak to ma wyglądać ?:)

0
Mateusz19921 napisał(a):

Używam Lazarusa.

W takim razie skorzystaj z formatu INI do przechowywania danych w pliku tekstowym, a do ich obsługi z poziomu kodu użyj klasy TIniFile – jest bardzo prosta i wygodna. Lepsze to niż ręczne parsowanie zawartości za pomocą ReadLn.

Interesuje mnie co masz na mysli 'pisania do nich wiadmości', jak to ma wyglądać ?:)

Niech dany użytkownik może wysłać wiadomość do innego. Potrzebne będą dane nadawcy i odbiorcy oraz treść wiadomości. Każdy użytkownik powinien w bazie zawierać dane profilowe i listę wiadomości – wysłanych i odebranych.

1

Dziękuję, efekty pracy pokażę kiedy skończę swój mały 'projekt'. :)

1

Od razu zasugeruję pewną rzecz.

Niech program używa ogólnego licznika dla ID użytkowników – początkowo niech zawiera wartość 0. Podczas rejestracji użytkownika, użyj bieżącego ID i inkremenetuj ten licznik. Jego stan trzymaj w bazie. Po usunięciu użytkownika, nie dekrementuj ogólnego licznika – on ma tylko rosnąć.

Po wysyłaniu wiadomości, zapisz w strukturze danych odbiorcy (w bazie) wyłącznie ID nadawcy oraz treść wiadomości. Jeśli będziesz potrzebował wyświetlić wiadomość na ekranie, użyj ID nadawcy do pozyskania informacji na jego temat (np. imienia i nazwiska).

Dzięki ogólnemu licznikowi identyfikatorów, ID nie będą się powtarzać, a także pozwoli to zaoszczędzić miejsca w bazie (plik tekstowy będzie mniejszy). Takie rozwiązanie jest proste – do takiej testowej aplikacji służącej do ćwiczenia swoich umiejętności spokojnie wystarczy.

1

Witam, miałem podzielić się programem. Nie podołałem pomysłowi, który Pan mi zaproponował. Zrobiłem troche inny program - mam kilka innych pytań. Mianowicie.

  1. Jak zmienic polecenie, aby powrocilo mi do menu glownego. Kiedy stworzę, np. nową baze danych program mi sie wylacza a chce tego uniknac tylko chcialbym, zeby wrocil do menu glownego.
  2. Jak dodać mozliwosc dodawania kolejnego konkursu bez zmiany bazy glownej?
  3. Tam gdzie jest \ nie mam pojecia jak zrobic...
 program BazaDanych;
uses crt,dos;
type
  Konkurs = record
  Nazwa : string[40];
  Rok : integer;
  Miesiac : string[20];
  Dzien : byte;
  Miejsce : string[200];
  liczbaU : integer;
  end;
const
  NazwaPliku ='M:\dobry\baza.txt';
Var
  S : string;
  Dane : Konkurs;
  I, Kod : integer;
  Plik: file of Konkurs;
  Tab : array[1..6] of Konkurs;
  liczbaKon: integer;
procedure zapiszplik;
var
wybor:Char;
begin
ClrScr;
Assign(Plik, NazwaPliku);
Rewrite(Plik);
Writeln('Jaka liczbe konkursow chcesz dodac?');
readln(liczbaKon);
writeln('Wprowadz informacje o konkursie...');
for I:= Low(Tab) to LiczbaKon do
begin
with Tab[i] do
begin
Writeln('Dane konkursu numer: ', I, ' z : ',LiczbaKon);
Write('Podaj nazwe: ');
readln(Nazwa);
Write('Podaj rok w ktorym nastapi konkurs: ');
readln(Rok);
Write('Podaj miesiac w ktorym nastapi konkurs: ');
readln(Miesiac);
Write('Podaj dzien w ktorym nastapi konkurs: ');
readln(Dzien);
Write('Podaj miejsce gdzie odbedzie sie konkurs: ');
readln(Miejsce);
repeat
Write('Podaj liczbe osob bioracych udzial w konkursie: ');
readln(S);
Val(S, LiczbaU, kod)
until (kod=0) and (LiczbaU > 0 ) and (LiczbaU <High(LiczbaU));
write(plik, Tab[i]);
clrscr;
end;
end;
Writeln('Powrot do Menu Glownego - Enter.');
Writeln('Wyjscie z Programu - Esc.');
repeat
wybor :=readkey;
case wybor of
//  #13 : menu;
  #27 : exit;
end;
until (wybor = #13) or (wybor = #27) ;
close(plik);
readln;
end;
procedure WczytajPlik;
  begin
    ClrScr;
    Assign(Plik, NazwaPliku);
    Reset(Plik);
    LiczbaKon := FileSize(Plik);
    if LiczbaKon > 0 then
    begin
      for I := 1 to LiczbaKon do
      begin
        Read(Plik, Dane);
        Writeln(' Konkurs numer: ', I, ' - dane:');
        Writeln(' Nazwa: ', Dane.Nazwa);
        Writeln(' Rok: ', Dane.Rok);
        Writeln(' Miesiac: ', Dane.Miesiac);
        Writeln(' Dzien: ', Dane.Dzien);
        Writeln(' Miejsce: ', Dane.Miejsce);
        Writeln(' Liczba uczestnikow: ', Dane.LiczbaU);
        Writeln;
      end;
      Readln;
    end;
  end;
// procedure DodajKonkurs;
procedure SzukajMiejsca;
var
  Znaleziono : boolean;
  SzukaneMiejsce : string;
  begin
    ClrScr;
    Assign(Plik, NazwaPliku);
    Reset(Plik);
    LiczbaKon := FileSize(Plik);
    if LiczbaKon > 0 then
    begin
      Znaleziono := False;
      Writeln('Podaj miejsce konkursu, ktore chcesz wyszukac.');
      Write('UWAGA! wielkosc liter ma znaczenie: ');
      Readln(SzukaneMiejsce);
      for I := 1 to LiczbaKon do
      begin
        Read(Plik, Dane);
        Znaleziono := Dane.Miejsce = SzukaneMiejsce;
        if Znaleziono = True then
        begin
          Break;
        end;
      end;
      if Znaleziono = True then
      begin
        Writeln(' Znaleziono Konkurs pod numerem: ', I, ' - dane:');
        Writeln(' Nazwa: ', Dane.Nazwa);
        Writeln(' Rok: ', Dane.Rok);
        Writeln(' Miesiac: ', Dane.Miesiac);
        Writeln(' Dzien: ', Dane.Dzien);
        Writeln(' Miejsce: ', Dane.Miejsce);
        Writeln;
      end
      else
      begin
        Writeln('Nie znaleziono konkursu w podanej miejscowosci: ', SzukaneMiejsce);
        Writeln;
      end;
      Readln;
    end;
  end;
procedure Menu;
var
  Odp : Char;
begin
  ClrScr;
  writeln('Witaj w programie poswieconym tworzeniu bazy danych o konkursach Matematycznych...');
  Writeln;
  Writeln(' Co chcesz zrobic:');
  Writeln;
  Writeln(' 1 = Stworzyc nowa baze danych o konkursach.');
  Writeln(' 2 = Odczytac zapisana baze danych.');
  Writeln(' 3 = Dodac konkurs do istniejacej bazy danych.');
  Writeln(' 4 = Znalezc konkurs po miejscu organizacji.');
  Writeln;
  Writeln(' Kazdy inny klawisz - wyjscie z programu...');
  Odp := ReadKey;
  case Odp of
    '1' : Zapiszplik;
    '2' : WczytajPlik;
  //  '3' : DodajKonkurs;
    '4' : SzukajMiejsca;
  else
    Halt;
  end;
end;
begin
  Menu;
end.
1

Sformatuj ten kod bo nie da się tego analizować. Żeby wracało do menu skorzystaj z konstrukcji

repeat 
[menu] 
until (koniec)

Odpowiedź na resztę bez formatowania kodu to harakiri.

0

Dzięki za odpowiedź. Co do tego co napisałeś wraca tylko raz do menu a pozniej jak chce wlaczyc ktores z polecen wyskakuje blad RunError(5).

W jakim sensie sformatowac?

0

Pomoże ktoś na poniedziałek muszę oddać , a sesja z innych przedmiotów zbliza się. :(

0
Mateusz19921 napisał(a):

[…] a pozniej jak chce wlaczyc ktores z polecen wyskakuje blad RunError(5).

Run-time errors – kod 5 dotyczy braku dostępu do pliku.

W jakim sensie sformatowac?

Dodaj puste linie oddzielające bloki kodu, popraw wcięcia, bo niektóre bloki w ogóle go nie posiadają, przez co kod czyta się bardzo źle. I na litość boską nie używaj modułu Dos

0

Pokaż cały kod jeszcze raz, formatowany (Formatowanie kodu w Delphi). Trudno to analizować ale bez zagłębiania się przerobiłbym procedurę Zapiszplik i dodał parametr do nagłówka. W zalezności od parametru albo zapisujesz nową bazę Rewrite(Plik);, albo dopisujesz do bazy (pkt. 2 i 3) Reset(Plik);

write(plik, Tab[i]);
...
Read(Plik, Dane);

Jak dodasz wiecej niż jeden konkurs to dobrze Ci to działa??

0

Proszę może być tak? Więc naprawiłem bład z tam aby wracalo do menu glownego. Moglbys rozpisac mi ta procedure wczytajplik, bo ja juz sie gubie po prostu... .Poprawiłem kody itp.

program BazaDanych;
uses crt , dos;
type
  Konkurs = record
  Nazwa : string[40];
  Rok : integer;
  Miesiac : string[20];
  Dzien : byte;
  Miejsce : string[200];
  liczbaU : integer;
  end;

const
  NazwaPliku = 'M:\dobry\baza.txt' ;

Var
  S : string;
  Dane : Konkurs;
  I, Kod : integer;
  Plik: file of Konkurs;
  Tab : array[1..6] of Konkurs;
  liczbaKon: Integer;
procedure ZAPISZPLIK;
begin
 ClrScr;
 Assign(Plik, NazwaPliku);
 Rewrite(Plik);
 Writeln('Jaka liczbe konkursow chcesz dodac?');
 readln(liczbaKon);
 writeln('Wprowadz informacje o konkursie...');
 for I:= Low(Tab) to LiczbaKon do
 begin
  with Tab[i] do
   begin
   Writeln('Dane konkursu numer: ', I, ' z : ', LiczbaKon);
   Write('Podaj nazwe: ');
   readln(Nazwa);
   Write('Podaj rok w ktorym nastapi konkurs: ');
   readln(Rok);
   Write('Podaj miesiac w ktorym nastapi konkurs: ');
   readln(Miesiac);
   Write('Podaj dzien w ktorym nastapi konkurs: ');
   readln(Dzien);
   Write('Podaj miejsce gdzie odbedzie sie konkurs: ');
   readln(Miejsce);
    repeat
      Write('Podaj liczbe osob bioracych udzial w konkursie: ');
      readln(S);
      Val(S, LiczbaU, kod)
     until (kod = 0) and (LiczbaU > 0 );
    write(plik, Tab[i]);
    clrscr;
   end;
 end;
close(plik);
readln;
end;

procedure WczytajPlik;
begin
 ClrScr;
 Assign(Plik, NazwaPliku);
 Reset(Plik);
 LiczbaKon := FileSize(Plik);
 if LiczbaKon > 0 then
  begin
  for I := 1 to LiczbaKon do
   begin
    Read(Plik, Dane);
    Writeln(' Konkurs numer: ', I, ' - dane:');
    Writeln(' Nazwa: ', Dane.Nazwa);
    Writeln(' Rok: ', Dane.Rok);
    Writeln(' Miesiac: ', Dane.Miesiac);
    Writeln(' Dzien: ', Dane.Dzien);
    Writeln(' Miejsce: ', Dane.Miejsce);
    Writeln(' Liczba uczestnikow: ', Dane.LiczbaU);
    Writeln;
   end;
  end;
 close(plik);
 readln;
end;

// procedure DodajKonkurs;
begin
 Assign(plik, NazwaPliku);
 reset(plik);
 Write(plik, tab[i]);
 read(plik, Dane);
 close(plik);
 readln;
end;

procedure SzukajMiejsca;
var
Znaleziono : boolean;
SzukaneMiejsce : string;
begin
 ClrScr;
 Assign(Plik, NazwaPliku);
 Reset(Plik);
 LiczbaKon := FileSize(Plik);
 if LiczbaKon > 0 then
  begin
   Znaleziono := False;
   Writeln('Podaj miejsce konkursu, ktore chcesz wyszukac. ') ;
   Writeln('UWAGA! wielkosc liter ma znaczenie. ') ;
   Writeln('Podaj miejscowsc:') ;
   Readln(SzukaneMiejsce) ;
   clrscr;
   for I := 1 to LiczbaKon do
    begin
     Read(Plik, Dane);
     Znaleziono := Dane.Miejsce = SzukaneMiejsce;
     if Znaleziono = True then
      begin
       Writeln(' Znaleziono Konkurs pod numerem: ',I, ' - dane:');
       Writeln(' Nazwa: ', Dane.Nazwa);
       Writeln(' Rok: ', Dane.Rok);
       Writeln(' Miesiac: ', Dane.Miesiac);
       Writeln(' Dzien: ', Dane.Dzien);
       Writeln(' Miejsce: ', Dane.Miejsce);
       Writeln;
      end
       else
        begin
         Writeln('Nie znaleziono konkursu w podanej miejscowosci: ', SzukaneMiejsce);
         break;
        end;
    end;
close(plik);
readln;
  end;
end;

procedure Menu;
var
Odp : Char;
begin
 ClrScr;
 write('Witaj w programie poswieconym tworzeniu bazy danych o konkursach Matematycznych...');
 Writeln;
 Writeln;
 Writeln(' Co chcesz zrobic:');
 Writeln;
 Writeln(' 1 = Stworzyc nowa baze danych o konkursach.') ;
 Writeln(' 2 = Odczytac zapisana baze danych.') ;
 Writeln(' 3 = Dodac konkurs do istniejacej bazy danych.') ;
 Writeln(' 4 = Znalezc konkurs po miejscu organizacji.') ;
 Writeln;
 Writeln(' Kazdy inny klawisz - wyjscie z programu...') ;
 Odp := ReadKey ;
 case Odp of
  '1' : Zapiszplik ;
  '2' : WczytajPlik ;
 // '3' : DodajKonkurs ;
  '4' : SzukajMiejsca ;
  else
   Halt;
 end;
end;

begin
 repeat menu  ;
 until false  ;
end.
0

Nie tego formatownia użyłeś. Na szybko i nie testowałem.

program BazaDanych;
uses crt , dos;
type
  Konkurs = record
  Nazwa : string[40];
  Rok : integer;
  Miesiac : string[20];
  Dzien : byte;
  Miejsce : string[200];
  liczbaU : integer;
  end;
 
const
  NazwaPliku = 'M:\dobry\baza.txt' ;
 
Var
  S : string;
  Dane : Konkurs;
  I, Kod : integer;
  Plik: file of Konkurs;
  Tab : array[1..6] of Konkurs;
  liczbaKon: Integer;
procedure ZAPISZPLIK(nowy : boolean = true);
begin
 ClrScr;
 Assign(Plik, NazwaPliku);
 if nowy then
   Rewrite(Plik)
 else
   Reset(Plik);
 Writeln('Jaka liczbe konkursow chcesz dodac?');
 readln(liczbaKon);
 writeln('Wprowadz informacje o konkursie...');
 for I:= Low(Tab) to LiczbaKon do
 begin
  with Tab[i] do
   begin
   Writeln('Dane konkursu numer: ', I, ' z : ', LiczbaKon);
   Write('Podaj nazwe: ');
   readln(Nazwa);
   Write('Podaj rok w ktorym nastapi konkurs: ');
   readln(Rok);
   Write('Podaj miesiac w ktorym nastapi konkurs: ');
   readln(Miesiac);
   Write('Podaj dzien w ktorym nastapi konkurs: ');
   readln(Dzien);
   Write('Podaj miejsce gdzie odbedzie sie konkurs: ');
   readln(Miejsce);
    repeat
      Write('Podaj liczbe osob bioracych udzial w konkursie: ');
      readln(S);
      Val(S, LiczbaU, kod)
     until (kod = 0) and (LiczbaU > 0 );
    writeln(plik, Tab[i]);
    clrscr;
   end;
 end;
close(plik);
readln;
end;
 
procedure WczytajPlik;
begin
 ClrScr;
 Assign(Plik, NazwaPliku);
 Reset(Plik);
 LiczbaKon := FileSize(Plik);
 if LiczbaKon > 0 then
  begin
  for I := 1 to LiczbaKon do
   begin
    Readln(Plik, Dane);
    Writeln(' Konkurs numer: ', I, ' - dane:');
    Writeln(' Nazwa: ', Dane.Nazwa);
    Writeln(' Rok: ', Dane.Rok);
    Writeln(' Miesiac: ', Dane.Miesiac);
    Writeln(' Dzien: ', Dane.Dzien);
    Writeln(' Miejsce: ', Dane.Miejsce);
    Writeln(' Liczba uczestnikow: ', Dane.LiczbaU);
    Writeln;
   end;
  end;
 close(plik);
 readln;
end;
 
procedure SzukajMiejsca;
var
Znaleziono : boolean;
SzukaneMiejsce : string;
begin
 ClrScr;
 Assign(Plik, NazwaPliku);
 Reset(Plik);
 LiczbaKon := FileSize(Plik);
 if LiczbaKon > 0 then
  begin
   Znaleziono := False;
   Writeln('Podaj miejsce konkursu, ktore chcesz wyszukac. ') ;
   Writeln('UWAGA! wielkosc liter ma znaczenie. ') ;
   Writeln('Podaj miejscowsc:') ;
   Readln(SzukaneMiejsce) ;
   clrscr;
   for I := 1 to LiczbaKon do
    begin
     Readln(Plik, Dane);
     Znaleziono := Dane.Miejsce = SzukaneMiejsce;
     if Znaleziono = True then
      begin
       Writeln(' Znaleziono Konkurs pod numerem: ',I, ' - dane:');
       Writeln(' Nazwa: ', Dane.Nazwa);
       Writeln(' Rok: ', Dane.Rok);
       Writeln(' Miesiac: ', Dane.Miesiac);
       Writeln(' Dzien: ', Dane.Dzien);
       Writeln(' Miejsce: ', Dane.Miejsce);
       Writeln;
      end
       else
        begin
         Writeln('Nie znaleziono konkursu w podanej miejscowosci: ', SzukaneMiejsce);
         break;
        end;
    end;
close(plik);
readln;
  end;
end;
 
procedure Menu;
var
Odp : Char;
begin
 ClrScr;
 write('Witaj w programie poswieconym tworzeniu bazy danych o konkursach Matematycznych...');
 Writeln;
 Writeln;
 Writeln(' Co chcesz zrobic:');
 Writeln;
 Writeln(' 1 = Stworzyc nowa baze danych o konkursach.') ;
 Writeln(' 2 = Odczytac zapisana baze danych.') ;
 Writeln(' 3 = Dodac konkurs do istniejacej bazy danych.') ;
 Writeln(' 4 = Znalezc konkurs po miejscu organizacji.') ;
 Writeln;
 Writeln(' Kazdy inny klawisz - wyjscie z programu...') ;
 Odp := ReadKey ;
 case Odp of
  '1' : Zapiszplik ;
  '2' : WczytajPlik ;
  '3' : ZapiszPlik(False) ;
  '4' : SzukajMiejsca ;
  else
   Halt;
 end;
end;
 
begin
 repeat menu  ;
 until false  ;
end.
0

Wiec tak jesli dodam nowa baze a pozniej dodam jakies konkursy to te z bazy usuwa a wyswietla tylko te ktore dodalem.

0

Jest za gorąco a nie mam klimy. Dla dodania konkursu do bazy zamiast

Assign
....
Reset

daj

Append
0

Wyskakuje mi komunikat : student1.pas(30,15) Error: Call by var for arg no. 1 has to match exactly: Got "File Of Konkurs" expected "Text"

0

Sorry, ja już dzisiaj się nie udzielam bo zaczynam pisać głupoty. Muszę się wyspać. W Lazarusie nie piszę ale komunikat jest raczej jednoznaczny. Patrząc na dokumentację też dojdziesz jak to poprawić. Poprawianie błędów to esencja programowania :)

0
Clarc napisał(a):

Sorry, ja już dzisiaj się nie udzielam bo zaczynam pisać głupoty. Muszę się wyspać. W Lazarusie nie piszę ale komunikat jest raczej jednoznaczny. Patrząc na dokumentację też dojdziesz jak to poprawić. Poprawianie błędów to esencja programowania :)

Dziękuję za pomoc, może podołam tylko czas goni bo egzaminy z algebry, analizy i kombi.

0

Jednak nie wiem o co chodzi, siedzialem dzisiaj nad tym kilka godzin, czytalem rozne ksiazki ale po prostu nie idzie mi tego naprawić, nie wiem co zrobić. Moglby ktos pomoc? jutro muszę oddac :(

0

Napisz z czym konkretnie masz problem, a coś się doradzi.

Append działa tylko z plikami tekstowymi – do typowanych trzeba użyć Reset i Seek. Przykład:

uses
  SysUtils;
const
  FILENAME_OUTPUT = 'numbers.dat';
var
  Output: file of Integer;
begin
  AssignFile(Output, FILENAME_OUTPUT);  // skojarzenie pliku

  if FileExists(FILENAME_OUTPUT) then   // jeśli plik istnieje
  begin
    Reset(Output);                      // otwórz go
    Seek(Output, FileSize(Output));     // przesuń wskaźnik na koniec
  end
  else                                  // jeśli plik nie istnieje
    ReWrite(Output);                    // utwórz go

  Write(Output, $00000000);             // wpisz dane
  Write(Output, $00FF00FF);
  Write(Output, $00FFFFFF);

  CloseFile(Output);                    // zamknij plik
end;

I pamiętaj – dane do pliku typowanego wpisuje się za pomocą Write, nie WriteLn.

0

Dziękuję Panu bardzo!! Zrobiłem to tak i wszystko działa jak należy :

 Assign(Plik, NazwaPliku);
 if nowy then
   Rewrite(Plik)
 else
   reset(plik);
   Seek(Plik,filesize(plik));

Mam jeszcze jedno pytanie. Kiedy wpiszę więcej niż 6 konkursów to mi ucina poczatek kiedy je wyswietla i np wyswietla od miejsca konkursu nr 2. i nie moge scrollem iść do góry.

0

Błąd masz – nie zgrupowałeś Reset i Seek, przez co Seek za każdym razem się wykona. Błędu raczej nie spowoduje, ale w przypadku tworzenia pliku, ta procedura nie ma sensu.

Mateusz19921 napisał(a):

Kiedy wpiszę więcej niż 6 konkursów to mi ucina poczatek kiedy je wyswietla i np wyswietla od miejsca konkursu nr 2. i nie moge scrollem iść do góry.

Konsola standardowo posiada bufor o pewnych rozmiarach, dzięki czemu pamięta wcześniejszy tekst, który nie mieści się na ekranie. Jeśli korzystasz z modułu Crt, to funkcja zapamiętywania niewidocznego już tekstu nie jest obsługiwana, więc scrolla nie widać.

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