tw_psycho Opublikowano 11 Czerwca 2006 Zgłoś Opublikowano 11 Czerwca 2006 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: 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
quuba-kr Opublikowano 11 Czerwca 2006 Zgłoś Opublikowano 11 Czerwca 2006 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*cJedno 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ULLISSES Opublikowano 11 Czerwca 2006 Zgłoś Opublikowano 11 Czerwca 2006 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
SGJ Opublikowano 11 Czerwca 2006 Zgłoś Opublikowano 11 Czerwca 2006 a nie szybciej było by skorzystac z pliku *.ini? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ULLISSES Opublikowano 12 Czerwca 2006 Zgłoś Opublikowano 12 Czerwca 2006 W sumie można użyć, ale czy będzie szybciej, to już pewien nie jestem. Tak czy inaczej trzeba przeczytać o obsłudze plików. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 12 Czerwca 2006 Zgłoś Opublikowano 12 Czerwca 2006 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
tw_psycho Opublikowano 13 Czerwca 2006 Zgłoś Opublikowano 13 Czerwca 2006 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. :-) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
quuba-kr Opublikowano 13 Czerwca 2006 Zgłoś Opublikowano 13 Czerwca 2006 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...