Skocz do zawartości
tw_psycho

Pierwszy Program...

Rekomendowane odpowiedzi

Witam,

 

Jestem w trakcie pisania pierwszego programu w Delphi. No, i rzecz jasna utknalem w martwym punkcie.

Zadaniem programu bedzie pobieranie pytania z pliku tekstowego o nazwie 1.txt, czyli w zasadzie po prostu wyswietlanie w memo zawartosci pliku 1.txt i za pomoca przyciskow, w razie poprawnej odpowiedzi dodanie jednego punktu. Po udzieleniu odpowiedzi wyskakuje okienko z informacja czy dobrej odpowiedzi udzielilem, a nastepnie przejscie na nastepnego pytania z pliku 2.txt. Pytan ma byc dziesiec. Odpowiedzi beda sztywne, to znaczy dla pierwszego pytania prawidlowa odpowiedz to B, dla drugiego c, trzeciego a itd. (sam sobie to dostostuje). Po prostu pytania txt beda musialy byc dopasowane tak, aby prawidlowe odpowiedzy byly pod prawidlowymi odpowiedziami w programie. Rozumiecie o co chodzi?

 

Kod programu wyglada tak:

unit gen;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;  const  AppName = 'GenTest v1.0';  good = 'Dobrze!;-)';  bad = 'Buu, źle! :-(';type  TForm1 = class(TForm)	Button1: TButton;	Button2: TButton;	Button3: TButton;	Button4: TButton;	Memo: TMemo;	Button5: TButton;	Label1: TLabel;	Label2: TLabel;	procedure Button5Click(Sender: TObject);	procedure Button1Click(Sender: TObject);	procedure Button2Click(Sender: TObject);	procedure Button3Click(Sender: TObject);	procedure Button4Click(Sender: TObject);  private	{ Private declarations }  public	{ Public declarations }  end;var  Form1: TForm1;  X : Integer;implementation  {$R *.dfm}procedure TForm1.Button5Click(Sender: TObject);var  Plik : TextFile;  S : String;begin  AssignFile(Plik, '1.txt');  Reset(Plik);	repeat	  Readln(Plik, S);	  Memo.Lines.Add(S);	until S = '';end;procedure TForm1.Button1Click(Sender: TObject);begin  ShowMessage (bad);  memo.clear;end;procedure TForm1.Button2Click(Sender: TObject);begin  ShowMessage(good);  memo.clear;end;procedure TForm1.Button3Click(Sender: TObject);begin  ShowMessage (bad);  memo.clear;end;procedure TForm1.Button4Click(Sender: TObject);begin  ShowMessage(bad);  memo.clear;end;end.

program wyglada tak:

 

post-12856-1150050922_thumb.jpg

 

 

Dobrze, a teraz najwazniejsze. Pytanie wczytuje petla repeat do pierwszej pustej lini. Nie wiem czy to dobre rozwiazanie, bo plik mozna po prostu wczytac w calosci. Ale nie wiem jak to zrobic. To po pierwsze.

Po drugie, to nie mam pojecia co zrobic, zeby przejsc do drugiego pytania. Tak zeby po kliknieciu na jakakolwiek odpowiedz, przechodzil do nastepnego pliku tekstowego i zeby zmienil prawidlowa odpowiedz, tak zeby caly czas nie klikac na B. Czyli zaczal wszystko od poczatku, pamietajac wartosc zmiennej X i przechodzac do pliku 2.txt.

Po trzecie, to chcialbym, zeby po poprawnej odpowiedzi dodawal jeden punkt, a na samym koncu w okienku wyswietlil wynik. Ale tu chyba sobie poradze - poleceniem

inc(x);
przy poprawnej odpowiedzi, a potem
showmessage('zdobyles ' x ' punktow na 10 mozliwych');

To chyba wszystko. Prosilbym, o jasne wyrazanie sie, dla mnie nie ma rzeczy oczywistych w tej kwesti, wiec bez skrotow myslowych, w szczegolnosci. Najlepiej po prostu podac kawe na lawe i opisac, w ten sposob zapamietam. Bede bardzo wdzieczny za pomoc, przynajmniej czesciowa. ;-)

 

Pozdrawiam.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Podam moją koncepcję rozwiązania problemu. Najlepiej utworzyć jeden plik z pytaniami.

np. fizyka3.txt, nazwę fizyka3 wyświetlić w okienku - wiemy co załadowaliśmy do pamięci. A teraz zawartość pliku:

1 Jak na imię miał Einstein?0 Edmund0 Alfred1 Albert0 Adalbert2 Który wzór jest prawdziwy?0 E=m*c1 E=m*c*c0 E=m*c*c/20 E=m*c*c*c
Jedno pytanie to jedna linia.Cztery odpowiedzi to cztery linie.Razem 5 linii. Wyswietlać zawartość od drugiego znaku.

Dokładniej: znaleźć pierwsze wystąpienie spacji w String.To co na prawo wyświetlić. Z tego co na lewo wyciągnąć albo numer pytania, albo informacje, która odpowiedź jest prawdziwa. Dla każdej z odpowiedzi wygenerować kolejno A B C D. Button potwierdzający odpowiedź niech tylko uruchamia wspólną procedurę np. Sprawdzaj(k) , gdzie k oznacza numer naciśniętego Button: A-1,B-2,C-3,D-4. Procedura Sprawdzaj zawiera porównanie if(rowne)przysłanego przez Button parametru z tym odczytanym z pliku, dokonuje zwiększenia licznika poprawnych odpowiedzi,ShowMessage(good); else ShowMessage(bad); na koniec memo.clear; Wcześniej trzeba ustawić zmienną int np.poprawna, która pamięta numer poprawnej odpowiedzi.Zrobić to przy czytaniu każdej z czterech odpowiedzi.Potrzebny jest mały licznik liczący do czterech wiersze odpowiedzi. Który wiersz odpowiedzi ma jedynkę na początku ten ma prawo ustawić swoją wartością licznik poprawna. ---------Dalej... wygląda na to,że button5 powinien przeczytać tylko 5linii i oddać sterowanie użytkownikowi, który udzieli odpowiedzi. Nie możemy teraz jeszcze raz nacisnąć button5, bo jeszcze raz otworzymy ten sam plik i ustawimy się na jego początku. Proponuje powołać do życia nową zmienną boolean o nazwie pierwszyraz i ustawić ją na true. Tam gdzie czytasz plik:if(pierwszyraz) otworzyć plik,reset(plik), ustawić pierwszyraz na false. Celowo nie piszę kodu, bo nie chcę Ci odbierać radości z twórczego działania.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ogólnie rzecz biorąc pozwolę sobie niezgodzić się z powyższymi założeniami.

 

znaleźć pierwsze wystąpienie spacji w String.

Ale po co? Przecież z założenia wynika, iż szablon jest taki "(0/1)(spacja)(odpowiedz)", więc po co szukać? Na sztywno czytać 1 znak (indeks 0) jako wartość liczbową lub logiczną (jak kto woli), a resztę jako pytanie.

 

Poza tym:

 

1. Mając minimum 256MB pamięci, możemy zaszaleć i utoworzyć w pamięci tablicę z pytaniami i odpowiedziami. Następnie załadować wszystkie na raz z pliku. Oszczędzi nam to pamiętania, gdzie w pliku jesteśmy i innych problemów związanych z poruszaniem się wewnątrz otwartego pliku.

 

2. Teoria wspólnej funckji Sprawdzaj() jest dobra. Informację o tym, która odpowiedź jest poprawna, możesz przypisać do przycisku (do cechy Button.Tag). Funkcja sprawdzaj, gdy dostanie numer wciśniętego przycisku, sprawdzi, czy był prawidłową odpowiedzią.

 

3. W testach (np. na prawo jazdy) nie ma informacji o tym, czy dobrze odpowiedzieliśmy. Wyniki poznajemy na końcu. Tutaj można by zrobić podobnie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

może zamiast wymyślać 2 razy koło :) skorzystasz z metod które już sa zaimplementowane dla TMemo...

Memo1->Lines->LoadFromFile(nazwaPliku);
w celu wczytania całego pliku do memo...

Ale to i tak trochę nieoptymalny sposób wczytywać każde pytanie z osobnego pliku... a odpowiedzi i tak z góry ustalone... trochę nonsens :) I wyświetlanie popupa za każdym razem to juz oznacza że ten program będzie bardziej denerwował niż pomagał :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

1. Nie robie tego dla siebie.

2. Robie to dla 6 z informatyki.

3. Ocena juz wystawiona. ;-)

4. Za malo mialem na to czasu.

5. Inaczej nie umialem - czyli patrz pkt 4 ;-)

6. Nastepny program bedzie lepszy :)

7. Bo teraz mam duzo czasu.

8. Ala ma kota. :)

9. Pozdrawiam.

10. I dziekuje za zainteresowanie. :-)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

1. Nie robie tego dla siebie.

Wszystko co robimy,robimy dla siebie.

Pierwszy krok jest najtrudniejszy.

Wszystkie języki są do siebie podobne.

Zachęcam do dalszych działań.

Szkoda, że nie przetrzepiesz bitów swojemu Bartonowi.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...