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...
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.
Dziękuję za szybką odpowiedź. Używam Lazarusa. Interesuje mnie co masz na mysli 'pisania do nich wiadmości', jak to ma wyglądać ?:)
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.
Dziękuję, efekty pracy pokażę kiedy skończę swój mały 'projekt'. :)
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.
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.
- 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.
- Jak dodać mozliwosc dodawania kolejnego konkursu bez zmiany bazy glownej?
- 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.
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.
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?
Pomoże ktoś na poniedziałek muszę oddać , a sesja z innych przedmiotów zbliza się. :(
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…
Pokaż cały kod jeszcze raz, formatowany (https://4programmers.net/Delphi/Artyku%C5%82y/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??
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.
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.
Wiec tak jesli dodam nowa baze a pozniej dodam jakies konkursy to te z bazy usuwa a wyswietla tylko te ktore dodalem.
Jest za gorąco a nie mam klimy. Dla dodania konkursu do bazy zamiast
Assign
....
Reset
daj
Append
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"
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 :)
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.
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 :(
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
.
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.
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ć.