IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Работа с файлами...
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской

Репутация: -  0  +


Короче задание такое: Создать файл, заполненный целочисленными яислами в диапозоне [-100;100]. Удалить из файла все положительные числа!

У меня короче получаеться вот что: ввожу например 5, т.е. это генирируется 5 чисел. И получается что действие происходит только над четными элементами файла(начиная с 0-го). Например есть числа -10 -11 10 10 -15, то в результате останеться -10 и -15, а -11 куда-то пропадает... помогите... что я только не перепробывал сделать - не получается!

program  _7_14;    
uses crt;
var f : file of integer;
i,n,a : integer;
begin clrscr;
randomize;
assign(f,'myfile.dat');
rewrite(f);
writeln('n=');
read(n);
for i:=1 to n do begin
a:=random(200)-100;
write(f,a);
end;
seek(f,0);
while not eof(f) do begin
read(f,a);
write(a,' ');
end;
seek(f,0);
while not eof(f) do begin
read(f,a);
if a>0 then seek(f,filepos(f)+1)
else begin
write(f,a);
writeln(a,' ');
end;
end;
end. close(f);
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Мне кажется,тут лучше использовать тип text.


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Цитата
И получается что действие происходит только над четными элементами файла(начиная с 0-го)
Угу... А почему - сам виноват:
while not eof(f) do begin
read(f,a);
if a>0 then seek(f,filepos(f)+1) { <--- Вот тут ошибка }
else begin
write(f,a);
writeln(a,' ');
end;
end;

(ты уже прочел число из файла, значит указатель передвинулся на следующий элемент автоматически. Зачем ты передвигаешь его еще дальше? Ну, и потом... Тебе надо не напечатать все числа, кроме положительных, а удалить положительные из файла. Этого ты даже не пытаешься сделать... А нужно для этого всего навсего завести еще одну переменную LastNeg, которая будет хранить смещение последнего правильного НЕположительного числа в файле. Идешь дальше, как только встретил очередное отрицательное - записал его на эту, сохраненную позицию и увеличил ее на 1... А в самом конце - Truncate(LastNeg), чтобы отсечь все лишнее)

Кстати, у тебя файл не закрывается... Предпоследнего End-а не должно быть...

Добавлено через 1 мин.
Цитата
Мне кажется,тут лучше использовать тип text.
С чего бы? Чтоб места занимал больше? Или потому что кто-то не умеет работать с ДРУГИМИ файлами? Мне вот вообще кажется, что на другом языке эта задача решается проще, и что? Это не повод советовать автору писать не на Паскале...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 26.11.2008 23:19) *

завести еще одну переменную LastNeg, которая будет хранить смещение последнего правильного НЕположительного числа в файле.

что-то я вот это предложение не понял=)) особенно " хранить смещение последнего правильного НЕположительного числа в файле"....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Смотри:

{ ... заполнил файл ... }
reset(f); { Перешел на начало файла }

LastNeg := -1; { Самое начало, еще не было обработано ничего }
while not eof(f) do begin
read(f, a); { Читаем очередное число из файла }
if a < 0 then begin { Отрицательное ? }
CurrPos := FilePos(f); { Это нам и надо: запоминаем, где мы БЫЛИ. Продолжать будем отсюда же }
inc(LastNeg); { Увеличиваем счетчик отрицательных чисел ... }
Seek(f, LastNeg); { ... и переходим на ту позицию, куда очередное число должно быть записано }
write(f, a); { Собственно, записываем число }
Seek(f, CurrPos); { И возвращаемся туда, где были, чтобы продолжить сканировать файл }
end;
end;

Seek(f, LastNeg + 1); { А теперь устанавливаем указатель за последним отрицательным числом }
Truncate(f); { ... и "отсекаем" хвост }
reset(f); { Для сохранности данных... Да и вообще, потом надо печатать содержимое файла }

 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской

Репутация: -  0  +


огромное спасибо, все понятно мне разжевали....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской

Репутация: -  0  +


а как мне посчитать конечную сумму получившихся цифр по аски таблице, при этом мне надо открыть файл как нетипизированный.....?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Каких цифр? У тебя нет никаких цифр, у тебя есть числа, представленные НЕ текстом, а двоичным кодом (машинное представление). Что именно тебе надо посчитать?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской

Репутация: -  0  +


мне надо посчитать сумму кодов, которыми зашифрованы числа...
начинаться должно как-то так ( это продолжение этой проги)
close(f);    
assign(g,'myfile.dat');
reset(g,bufsize);
blockread(g,buf,bufsize);


у меня 1-й вопрос: какими типами должны быть переменные? (buf,bufsize)

ВОТ! Нашел как звучит задание! Найти конечную сумму полученного файла, открыв его как нетипизированный!
p.s. открой аську плиз=)

Сообщение отредактировано: Akella -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Повторяю: числа не зашифрованы ничем. Это просто последовательность бит. К примеру, число 25 представлено так: 0000000000011001, а число 126 - так: 0000000001111110. Так что, говоришь, найти-то надо?

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской

Репутация: -  0  +


ВОТ задание так в карточки написано:
Найти конечную сумму полученного файла, открыв его как нетипизированный!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






От тебя, как видно, хотят, чтобы ты научился работать с нетипизированными файлами, зная, что именно там находится... Тогда примерно так:

var
g: file;
sum, X: integer;

{ ... }

assign(g, 'myfile.dat');
reset(g, sizeof(integer)); { <--- открываешь файл с размером буфера = размеру integer-а }
sum := 0;
while not eof(g) do begin
blockread(g, X, 1); { <--- читаем блок, соответствующий следующему числу, в X }
sum := sum + X; { <--- и добавляем к сумме }
end;
{ все, сумма подсчитана, выводим }

(можешь добавить еще проверку ошибок, для этого у BlockRead есть четвертый параметр)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской

Репутация: -  0  +


я так делал, но у меня ошибка 200... что это такое?
вот готовая прога, все работает... спасибо Volvo
program  _7_14;    

uses crt;
var
f : file of integer;
g : file;
i,n,a,CurrPos,LastNeg,sum,buf : integer;

begin
clrscr;
randomize;
assign(f,'myfile.dat');
rewrite(f);
write('n=');
read(n);
for i:=1 to n do begin
a:=random(200)-100;
write(f,a);
end;
seek(f,0);
while not eof(f) do begin
read(f,a);
write(a,' ');
end;
reset(f);
LastNeg := -1;
while not eof(f) do begin
read(f, a);
if a < 0 then begin
CurrPos := FilePos(f);
inc(LastNeg);
Seek(f, LastNeg);
write(f, a);
Seek(f, CurrPos);
end;
end;
Seek(f, LastNeg + 1);
Truncate(f);
reset(f);
gotoxy(1,5);
while not eof(f) do begin
read(f,a);
write(a,' ');
end;
close(f);
assign(g,'myfile.dat');
reset(g,sizeof(integer));
sum:=0;
while not eof(g) do begin
blockread(g,buf,1);
sum:=sum + buf;
end;
gotoxy(1,10);
write(sum);
end.


Сообщение отредактировано: Akella -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гуру
*****

Группа: Пользователи
Сообщений: 1 220
Пол: Мужской

Репутация: -  16  +


Help (Ctrl + F1) по слову blockread Вам окажет неоценимую помощь.

Добавлено через 3 мин.
Обнови tpl'ки - http://pascal.sources.ru/misc/bp7_tpl.htm
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской

Репутация: -  0  +


Помогите сделать похожую задачу, все тоже самое только условие другое: удалить из файла повторяющиеся включения одного и того же числа (массивы нельзя!) ...
мне бы токо условие, 3 часа бьюсь, только паскаль зависает, толку нету=))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






Цитата
3 часа бьюсь, только паскаль зависает
Значит, что-то начал делать? Можно посмотреть, как именно ты начал решать задачу?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской

Репутация: -  0  +


прога зависала из-за условия, потому что оно зацикливалось, поэтому я его удалил, а все остальное как в проге выше!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






Akella, смотри как это делается:
var
f: file of integer;
i, X, Y: integer;
pos, curr: longint;
found: boolean;

begin
assign(f, 'test.dat'); rewrite(f);

{ Запрашиваем данные у пользователя и пишем в файл }
for i := 1 to 10 do begin
write(i:2, ' -> '); readln(X);
write(f, X);
end;

reset(f); pos := 0; { переоткрываем файл и начинаем с самого начала }
while not eof(f) do begin
read(f, X); { прочитали число }
curr := filepos(f); { запомнили, где были в файле }
seek(f, 0); { идем в самое начало }

found := false;

{ и пока не добрались до позиции, в которую записали последнее число }
while filepos(f) < pos do begin
read(f, Y); { Читаем ранее записанные числа, и ищем среди них X }
if Y = X then found := true;
end;
if not found then begin { X не был найден }
{ Значит, пишем его в файл в позицию Pos, и увеличиваем Pos на 1 }
seek(f, pos); write(f, X); inc(pos);
end;
seek(f, curr); { Возвращаемся туда, где остановились, и продлолжим просматривать файл }
end;

{ Все, весь файл пересмотрен, записано Pos чисел, остальные - дубликаты }
seek(f, pos);
{ Отсекаем эти дубликаты }
truncate(f);

{ Проверка, получилось ли то, что задумывалось }
reset(f);
while not eof(f) do begin
read(f, X); write(X:3);
end;
writeln;
close(f);
end.


Но больше на твои вопросы отвечать не буду, до тех пор, пока сам не будешь хотя бы пытаться что-то решить, и показывать результаты своих попыток. Сказать, что ты пытался, но ничего не получилось - очень просто, правда? Но это не проходит больше одного раза...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской

Репутация: -  0  +


спасибо, но мне чуток по другому надо, повторяющиеся цифры вообще не должны потом выводиться=)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской

Репутация: -  0  +


Помогите, что я не правильно написал? wacko.gif Задача такая: В последовательность K вещ. чисел на позицию N вставить число M, следущие за M числа сдвинуть на N+1, N+2 и т.д., т.е.
0.123 0.123 .123 0.123 на позицию 1(считая с нуля) поставим число 1.234 - получим:
0.123. 1.234 0.123 0.123 0.123

program  _7_1;   

uses crt;

var f : file of real;
g : file;
N,K,sum,buf,i,kurpos : integer;
M,x,y,z : real;

begin
clrscr;
randomize;
assign(f,'myfile.dat');
rewrite(f);
write('vvedite kolichestvo sluchainih chisel K=');
readln(K);
for i:=1 to K do begin
x:=random;
write(f,x);
end;
write('vvedite chislo M=');
readln(M);
write('vvedite poziciu zameni N=');
readln(N);
seek(f,0);
writeln('sluchainie chisla');
while not eof(f) do begin
read(f,x);
write(x:2:3,' ');
end;
reset(f);
seek(f,N);
read(f,x);
y := x;
seek(f,N);
write(f,M);
while not eof(f) do begin
kurpos := FilePos(f);
read(f, x);
z := x;
seek(f,kurpos);
write(f,y);
seek(f,kurpos);
y := z;
end;
{ Seek(f, ); Truncate(f);}
reset(f); gotoxy(1,7); write('posle udaleniya polojitelnih chisel'); gotoxy(1,9);
while not eof(f) do begin
read(f,x);
write(x:2:3,' ');
end;
close(f);
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 18.04.2024 22:20
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name