view:if count>0 then writeln(' €Ја®Є „ҐмЈЁ '); if count>0 then begin i:=0; while i<count do writeln(mas[i].name,mas[i].babki) ; end else writeln(' ‘ЇЁб®Є Їгбв'); goto start;
save: if count<N then begin writeln('‚ўҐ¤ЁвҐ бў®Ґ Ё¬п '); readln(imya); mas[count].name:=imya; inc(count); end else writeln('ЌҐв бў®Ў®¤®Ј® ¬Ґбв '); assign (f,'c:\123.txt'); append(f); i:=0; while i<count do begin mas[i].babki:=sum; writeln(f,mas[i].name); writeln(f,mas[i].babki); end; close(f); goto start;
exit: end.
Дело в том что инфа никак не может сохраниться(помогает только CTRL+BREAK), а сам файл все толстеет и толстеет. При просмотре все время пишет что список пуст
Кто видел наверно еще не забыл
Автор: volvo 4.02.2006 6:22
под меткой View:
view: if count>0 then writeln(' Игрок Деньги '); if count>0 then begin i:=0; while i<count do begin writeln(mas[i].name, mas[i].babki) ; inc(i) { <--- Увеличивать счетчик кто будет ? } end; end;
Аналогично при Save:
{ assign (f,'123.txt'); } { <--- Это совсем не обязятельно, переменная уже связяна с файлом } append(f); i:=0;
while i<count do begin mas[i].babki:=sum; writeln(f,mas[i].name); writeln(f,mas[i].babki); inc(i) { <--- А вот это - обязательно !!! } end;
И мой тебе совет: во-первых, забудь вообще, что есть метки (и про Goto тоже забудь, ты пишешь не на Бейсике, а на Паскале !!!), а во-вторых, подумай о других - кириллицу переводи в Windows-кодировку. А то если я буду выкладывать файлы так, как удобно мне - поверь, ты мало что поймешь...
Автор: CORS@R 4.02.2006 6:49
Точно про счетчик то я забыл. С goto вроде как то проще(в школе бейсик был). Есть маленький глюк при просмотре, но эта фигня щас поправим. С кодировкой больше так не буду. Thank you very much
Автор: CORS@R 4.02.2006 8:47
Цитата(CORS@R @ 4.02.2006 2:49)
Есть маленький глюк при просмотре, но эта фигня щас поправим
Блин глюк оказался не маленьким и не при просмотре а при сохранение: играю я значит и решил сохранить результат(Допустим имя qw, а деньги - 130). Сохранил. Нажимаю просмотр - все хорошо (qw 130). Дальше играю, опять сохраняю(имя as деньги 45), смотрю а там вместо qw 130 as 45 вот такое чудо qw 130 qw 45 as 45
Посмотри еще разок, а то я запарился уже
Автор: volvo 4.02.2006 17:44
Переделай часть с Save и View вот так:
view: if count>0 then writeln(' player money '); if count>0 then begin i:=1; { <--- Индексация начинается с 1, а не с 0 !!! } while i<=count do begin { Соответственно не забывай про "=" } writeln(mas[i].name, ' ', mas[i].babki); inc(i) end; end else writeln(' <empty>');
goto start;
save: if count<N then begin writeln('enter your name '); readln(imya); inc(count); { <--- Сначала увеличь счетчик, потом - работай с записью } mas[count].name:=imya; mas[count].babki:=sum; { <--- Сразу заполняй число денег для записываемого игрока... }
append(f); { ... и записывай в файл ... } writeln(f,mas[count].name); { <--- Не надо ДОзаписывать ВСЕ, достаточно только mas[count] } writeln(f,mas[count].babki); close(f); end else writeln('not enough mem '); goto start;
А в начале программы при чтении из файла -
while (not eof(f)) do begin inc(count); { <--- Сначала увеличиваем индекс, потом читаем } readln(f,mas[count].name); readln(f,mas[count].babki); end;
Автор: CORS@R 4.02.2006 18:54
Спасибо, все работает. А я вчера чуть ли не всю ночь сидел, нифига не получалось, только что проснулся и сразу сюда.
Автор: CORS@R 4.02.2006 20:52
А как сделать так чтобы экзешник и файл 123.txt находились в любой папке ?
Автор: volvo 4.02.2006 21:01
Не указывай путь к TXT файлу явно. Напиши просто '123.txt' - тогда, если EXE и TXT будут в ОДНОЙ и той же папке, программа будет работать...
Автор: CORS@R 4.02.2006 22:11
Я так и делал, вылетало с какой-то ошибкой. Щас попробовал - работает. Наверное я сам виноват не тот экзешник наверное в папку к txt - файлу кидал
Автор: CORS@R 4.02.2006 22:37
Блин, хочется зашифровать данные в файле. Вроде как я понял можно сделать файл типизированным а не текстовым, но тогда вроде как нельзя пользоваться функцией append или я что-то не так понял
Автор: volvo 4.02.2006 22:48
Все правильно понял... Append работает только с текстовыми файлами... Можешь зашифровать простым XOR-ом: перед тем, как записать в файл строку - пройти по ней и сделать так:
XorKey := ... { тут - любое значение типа Byte } For i := 1 To Length(s) Do s[i] := Char( Byte(s[i]) Xor XorKey );
Теперь строка будет не в таком явном виде, как раньше... Для расшифровки - повторить ту же операцию с тем же XorKey, при повторном прогоне Xor восстанавливаются исходные значения...
Автор: CORS@R 5.02.2006 2:07
С шифровкой понял, реализую потом. Есть маленькая проблема: при сохранение имя игрока сохраняется но потом при большом количестве раз сохранений этот список разрастается. Хочется сделать чтобы если при совпадение введенного имени и имени который уже в файле поле babki не заменялось новым значением sum а прибавлялось к старому. Вот я что-то наклепал но это что-то не пашет
save: if count<N then begin
writeln('Введи имя');
readln(imya); if imya=mas[count].name then begin inc(count); mas[count].name:=imya; mas[count].babki:=mas[count].babki+sum; goto w; end;
inc(count);
mas[count].name:=imya;
mas[count].babki:=sum;
w: append(f);
writeln(f,mas[count].name);
writeln(f,mas[count].babki);
close(f);
end
else writeln('Нет места ');
Автор: volvo 5.02.2006 2:19
Опять метки...
save:
writeln('‚Введи имя'); readln(imya); b := False; { <--- Эту переменную придется определить в начале } for i := 1 to count do begin if imya = mas[i].name then begin
inc(mas[i].babki, sum); rewrite(f); for j := 1 to count do begin writeln(f, mas[j].name); { <--- Здесь была ошибка ! } writeln(f, mas[j].babki); end; close(f); b := true; break; end; end;
if not b then if count<N then begin inc(count); mas[count].name:=imya; mas[count].babki:=sum; append(f); writeln(f,mas[count].name); writeln(f,mas[count].babki); close(f); end; else writeln('Нет места ');
Идея понятна?
Автор: CORS@R 5.02.2006 3:08
че то не так... Играю - сохраняю qw 77 играю - сохраняю as 88 играю - сохраняю zx 145 смотрю - все нормально потом играю, сумма 55, сохраняю как qw Должно быть qw 132 as 88 zx 145 но там zx 145 zx 145 zx 145
Автор: volvo 5.02.2006 3:17
Я подправил, проверь...
Автор: CORS@R 5.02.2006 4:01
Работает . А я уж было собирался через удаление делать. Ищем имя потом все данные которые принадлежат этому имени удаляем и заново на его место записываем новые данные. Но раз ты выбрал свой метод значит он лучше(тем более рабочий)
Автор: CORS@R 5.02.2006 5:13
Еще одна малюсенькая просьба: при просмотре имя игрока находится под надписью "ИГРОК" а значение денег располагается не под "ДЕНЬГИ" а в зависимости отдлины имени игрока. Хочется чтобы и значение денег находились строго под "ДЕНЬГИ". В Си это делается легко а в Паскале не знаю
Автор: volvo 5.02.2006 5:21
Цитата(CORS@R @ 5.02.2006 0:13)
В Си это делается легко а в Паскале не знаю
А в Паскале - еще легче:
view: if count > 0 then writeln('player':15, 'money':7); if count>0 then begin i:=1; while i<=count do begin writeln(mas[i].name:15,mas[i].babki:7) ; inc(i) end; end else writeln(' <empty>');
Автор: CORS@R 5.02.2006 5:39
Блин, че то я уже совсем туплю. Я делал так
view:
if count > 0 then writeln('ИГРОК ДЕНЬГИ'); {<---А про это я че то не подумал}
if count>0 then begin
i:=1;
while i<=count do begin
writeln(mas[i].name:15,mas[i].babki:7) ;
inc(i)
end;
end
else writeln(' <empty>');
И у меня все съезжало вправо.
Автор: CORS@R 6.02.2006 5:19
volvo, смотри: Чтоб сразу нельзя было сохранять деньги я сначала сделал вот так
Код
uses crt; const N=1000; label start1,save, view,view1, start, money, exit; type Dengi=record name:string[9]; babki:word; end; var b,flag:boolean; {<--- Обрати внимание} imya:string[15]; x,y,rez:byte; tmp:word; mas: array[1..N] of dengi; otv,otvet:char; i,j,sum,stavka,count:integer; f:text;
begin {start1:} textbackground(1); textcolor(10); clrscr; start1:count:=0;
assign(f,'123.txt'); reset(f); begin while (not eof(f)) do begin inc(count); readln(f,mas[count].name); readln(f,mas[count].babki);
Вот как ты думаешь, я сейчас все брошу и буду посимвольно сравнивать эти тексты?
Если тебя заинтересовал вопрос - то покажи то, что ты изменил в программе, а не пость килобайты кода...
Автор: CORS@R 6.02.2006 5:46
Извеняюсь, не подумал. Изменения пометил так {<--}
Автор: volvo 6.02.2006 6:06
Не знаю, почему это у тебя не работает, мне просто жалко времени - разбираться с таким кодом, как у тебя... Я тебе показал (при переводе на C), что можно вообще обойтись без меток, программа от этого только выиграет.
Ты же продолжаешь добавлять все новые и новые метки и все больше и больше запутываешь программу. То, что у тебя сейчас занимает 277 строк, можно уложить в 50-60, и обойтись без секции Label вообще... Так что выбирай, или ты начинаешь писать на Паскале, или я в эту тему больше не захожу. Так же как и в другие, где приводятся программы со сплошными переходами по GoTo...
Автор: CORS@R 6.02.2006 22:02
Ну не 50 - 60 строк, но от меток избавился. Так пойдет?
Код
uses crt; const N=100; type Dengi=record name:string[9]; babki:word; end; var b:boolean; imya:string[15]; x,y,rez,flag:byte; tmp:word; mas: array[1..N] of dengi; otv,otvet:char; i,j,sum,stavka,count:integer; f:text;
procedure cursor; begin x:=WhereX; y:=WhereY-1; gotoXY(x,y); end;
PROCEDURE view; begin if count>0 then begin writeln; writeln(' -------------------------------------------'); writeln(' | ?ѓђЋЉ':10, ' | „ҐмЈЁ':10,' |'); writeln(' |-------------------------------------------|'); end; if count>0 then begin i:=1; while i<=count do begin writeln(' | | |'); writeln(' | ',mas[i].name:10,' | ', mas[i].babki:10,' |'); writeln(' | | |'); inc(i); end; writeln(' -------------------------------------------'); end else writeln(' ‘ЇЁб®Є Їгбв'); end;
procedure start1; begin count:=0; assign(f,'123.txt'); reset(f); while (not eof(f)) do begin inc(count); readln(f,mas[count].name); readln(f,mas[count].babki); end; close(f); flag:=0; writeln; writeln(' ------------- -------- --------------- '); writeln(' |1-ЌЋ‚›‰ ?ѓђЋЉ| |2-?ѓђЋЉ?| |3-‚›•Ћ„ ?‡ ?ѓђ›|'); writeln(' ------------- -------- --------------- '); writeln; otvet:=readkey; if otvet='1' then begin writeln; writeln(' Љ Є вҐЎп §®ўгв ?я'); writeln; readln(imya); end; if otvet='2' then begin view; start1; end; if otvet='3' then halt; randomize; sum:=100; writeln; writeln( ' Ћђ…‹ ?‹? ђ…ЉЂ '); while sum>0 do begin if sum>=1000 then begin writeln; writeln(' Њ®Ґ Є §Ё® ®Ў Єа®вЁ«®бм, в Є зв® Ё¤Ё Є вл ®вбо¤ Ї®Є п вҐЎп Ґ гЎЁ«'); writeln; readln; save; end; start; if otv>'4' then begin writeln; writeln(' “ ⥡п ᮢᥬ Ї«®е® б® §аҐЁҐ¬ ? Ќ ЇЁб ® ¦Ґ: '); writeln; writeln(' -------- --------- ---------- ------------------ ----------------- '); writeln(' | 0-Ћђ…‹ | | 1-ђ…ЉЂ | | 2-?ѓђЋЉ? | | 3-‡ЂЃђЂ’њ „…Ќњѓ? | | 4-‚›•Ћ„ ?‡ ?ѓђ› | '); writeln(' -------- --------- ---------- ------------------ ----------------- '); writeln; writeln( ' Ђ ' ,otv,' п зв®-в® Ґ ўЁ¦г'); writeln('--------------------------------------------------------------------------------'); start; end; if otv='2' then begin view; start; end; if otv='3' then begin if flag=1 then begin save; start1; end else begin writeln; writeln(' •®зҐим ¤ҐмЈЁ § Ўа вм? ЌҐ в Є Ўлбва®. —в®Ўл ¤ҐмЈЁ § Ўа вм Ёе 㦮 § а Ў®в вм!'); writeln; readln; start; end; end; if otv='4' then halt; if otv='0' then begin cursor; writeln(' Ћђ…‹'); end; if otv='1' then begin cursor; writeln(' ђ…ЉЂ'); end; money; rez:=random(2); if rez=1 then begin writeln; writeln(' ‚лЇ « ђ…ЉЂ'); end; if rez=0 then begin writeln; writeln(' ‚лЇ « Ћђ…‹'); end; tmp:=ord(otv)-48; if rez=tmp then begin writeln; writeln(' ”г и а '); inc(sum,stavka); writeln; writeln(' ‘зҐв: ',sum); flag:=1; writeln('-----------------------------------------------------------------'); end else begin writeln; writeln( ' ”г б в ЄЁ¬ ЁЈа вм ¤ ¦Ґ Ґ ЁвҐаҐб®'); dec(sum,stavka); writeln; writeln(' ‘зҐв: ',sum); flag:=1; writeln('------------------------------------------------------------------'); end; end; if sum<=0 then begin writeln; writeln(' “ вҐЎп § Є®зЁ«Ёбм Ў ЎЄЁ. Љ Є в®«мЄ® Ї®пўпвбп, § 室Ё'); readln; halt; end; end;
begin textbackground(1); textcolor(10); clrscr; start1; end.