Помощь - Поиск - Пользователи - Календарь
Полная версия: Ввести файл F из 12 элементов
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
mfractus
Здравствуйте уважаемые пользователи ресурса! Прошу помощи в решении задачи.

Ввести файл F из 12 элементов. Определить в нём произведение тех
элементов, чей модуль лежит в диапазоне [ 1; 5]. Заранее спасибо!

Начал с ввода файла F:

program ABC;
var b,P,i:integer;
f:file of integer;
begin
assign(f,'f.dat');
rewrite(f);
writeLn('вводите 12 компонент файла f:');
for i:=1 to 12 do
begin
writeLn('введите ',i,'-ую компоненту файла f');
readLn(b);
write(f,b);
end;

DarkWishmaster
вычисляем произведение:


P:=1;
for i:=1 to 12 do
begin
writeLn('введите ',i,'-ую компоненту файла f');
readLn(b);
if (abs(b)>=1) and (abs(b)<=5) then P:=P*b;
write(f,b);
end;
writeln('произведение элементов: ',P);



mfractus
Большое спасибо! В итоге будет так?

program ABC;
var b,P,i:integer;
f:file of integer;
begin
assign(f,'f.dat');
rewrite(f);
writeLn('вводите 12 компонент файла f:');
P:=1;
for i:=1 to 12 do
begin
writeLn('введите ',i,'-ую компоненту файла f');
readLn(b);
if (abs(b)>=1) and (abs(b)<=5) then P:=P*b;
write(f,b);
end;
writeln('произведение элементов: ',P);
else
writeLn('в файле нет таких элементов');
close(f);
end.
Freedom
Цитата(mfractus @ 26.04.2011 21:48) *

Большое спасибо! В итоге будет так?

program ABC;
var b,P,i:integer;
f:file of integer;
begin
assign(f,'f.dat');
rewrite(f);
writeLn('вводите 12 компонент файла f:');
P:=1;
for i:=1 to 12 do
begin
writeLn('введите ',i,'-ую компоненту файла f');
readLn(b);
if (abs(b)>=1) and (abs(b)<=5) then P:=P*b;
write(f,b);
end;
writeln('произведение элементов: ',P);
else {тут не понятно что за условие}
writeLn('в файле нет таких элементов');
close(f);
end.


Есть ошибка, если вы хотите чтобы писало есть такие элементы или нет, то примерно:
program ABC;
var b,P,i:integer;
f:file of integer;
flag:boolean;
begin
assign(f,'f.dat');
rewrite(f);
writeLn('write 12 elements of f:');
P:=1;
flag:=false;
for i:=1 to 12 do
begin
writeLn('write ',i,'element f');
readLn(b);
if (abs(b)>=1) and (abs(b)<=5) then begin P:=P*b; flag:=true; end;
write(f,b);
end;
If flag then
writeln('Proizvedenie= ',P) else
writeLn('No this elements');
close(f);
end.
mfractus
Что такое If flag then?
Freedom
Цитата(mfractus @ 26.04.2011 22:39) *

Что такое If flag then?

flag - переменная boolean, которая принимает значения true или false если условие выполняется
If flag then то же что и If flag=true then
вывести произведение, иначе вывести что нету таких.
mfractus
Вот так можно сделать?
 program ABC;
var b,P,i:integer;
f:file of integer;
begin
assign(f,'f.dat');
rewrite(f);
writeLn('вводите 12 компонент файла f:');
for i:=1 to 12 do
begin
writeLn('введите ',i,'-ую компоненту файла f');
readLn(b);
write(f,b);
end;
// поиск
reset(f);
P:=1;
while not EOF(f) do
begin
read(f,b);
if (abs(b)>=1) and (abs(b)<=5) then
begin
P:=P*b;
end;
end;
// вывод результатов
if P=1 then
begin
writeLn('В файле нет таких элементов')
end
else
writeln('произведение элементов: ',P);
close(f);
end.
DarkWishmaster
так как у тебя интервал [1:5] а не (1:5) то некоректно использовать
if P=1 then //нету таких чисел

потому что если у тебя будет например: 1 9 6 1 -1 -2 7 -1
то произведение будет: 1*1*(-1)*(-1)=1 т.е P=1 но ведь таких чисел 4!
А переменая flag смотрит если было произвидено хотя бы одно умножение, если да то очевидно что такие элементы существуют и можно вывести произведение на экран.
Freedom
Цитата(mfractus @ 26.04.2011 23:06) *

Вот так можно сделать?
 program ABC;
var b,P,i:integer;
f:file of integer;
begin
assign(f,'f.dat');
rewrite(f);
writeLn('вводите 12 компонент файла f:');
for i:=1 to 12 do
begin
writeLn('введите ',i,'-ую компоненту файла f');
readLn(b);
write(f,b);
end;
// поиск
reset(f);
P:=1;
while not EOF(f) do
begin
read(f,b);
if (abs(b)>=1) and (abs(b)<=5) then
begin
P:=P*b;
end;
end;
// вывод результатов
if P=1 then
begin
writeLn('В файле нет таких элементов')
end
else
writeln('произведение элементов: ',P);
close(f);
end.


У вас ведь промежуток [1;5] если сделать как вы то получается если произведение=1 тогда вывести что нет таких, а если например один из элементов=1 тогда, получается что P так и останется 1, и у вас выведет что нету таких элементов
mfractus
Большое спасибо за пояснение! Можно ли исправить данную ситуацию без помощи flag? Через else может просто?
Freedom
Цитата(mfractus @ 26.04.2011 23:29) *

Большое спасибо за пояснение! Можно ли исправить данную ситуацию без помощи flag? Через else может просто?

А почему вам не нравится flag? можно переделать. В смысле просто через else?
DarkWishmaster
Цитата(mfractus @ 26.04.2011 22:29) *

Большое спасибо за пояснение! Можно ли исправить данную ситуацию без помощи flag? Через else может просто?

Если у тебя проблема с boolean то можно через любую переменую каторая будет изменять свое значения в зависимости было или нет совершено умножение например:
там где flag:=true меняем на a:=1 (a-переменая каторая сначала 0)
потом смотришь если она 0 то таких чисел нет...
mfractus
Цитата(Freedom @ 26.04.2011 23:34) *

А почему вам не нравится flag? можно переделать. В смысле просто через else?

Я вас понял, конечно же, будет лучше использовать flag. Почему предложенный Вами код программы намного короче? Я делал основываясь на примере.. к примеру присутствует часть кода
reset(f);
P:=1;
while not EOF(f) do
begin
read(f,b);
?
DarkWishmaster
Цитата(mfractus @ 26.04.2011 22:38) *

Я вас понял, конечно же, будет лучше использовать flag. Почему предложенный Вами код программы намного короче? Я делал основываясь на примере.. к примеру присутствует часть кода
reset(f);
P:=1;
while not EOF(f) do
begin
read(f,b);
?


у него короче потому что он вычисление делает сразу когда пишет в фаиле. А ты сначала записываешь в фаиле, потом читаешь из него и делаешь вычисления.
mfractus
Цитата(DarkWishmaster @ 26.04.2011 23:34) *

Если у тебя проблема с boolean то можно через любую переменую каторая будет изменять свое значения в зависимости было или нет совершено умножение например:
там где flag:=true меняем на a:=1 (a-переменая каторая сначала 0)
потом смотришь если она 0 то таких чисел нет...

Спасибо за ответ!
DarkWishmaster
Цитата(mfractus @ 26.04.2011 22:41) *

Спасибо за ответ, это будет верно с точки зрения написания программы? До этого с такой проблемой не сталкивался..

Если с flag(boolean) то все будет верно. Так как у boolean всего два значения(True/False), а для переменой которая будет принимать только значения 0 и 1 будет нелогично исп. типы integer или logint и.д. так что придеться создать свой тип (0..1) бинарный. Всё же когда у нас только два выбора, нужно исп. логический тип boolean.
mfractus
Задача Ввести файл F . Каждый второй элемент в файле, чьё значение лежит в
диапазоне [−3; 5] заменить единицей. Файл вывести до и после
преобразования. Практически аналогична, но вот в ней не могу прописать условие.

Начинаю с ввода F

begin
assign(f,'f.dat');
writeLn('введите первую компоненту файла f (признак конца
ввода: "555")');
//ввод файла
rewrite(f);
readLn(b);
i:=1; //номер компоненты файла
while b<>555 do
begin
write(f,b);
inc(i);
writeLn('введите ',i,'-ую компоненту файла f');
readLn(b);
end;
//вывод файла до изменения
reset(f);
writeLn('файл f до изменения:');
while not EOF(f) do
begin
read(f,b);
write(b:5);
end;
writeLn;


Добавлено через 2 мин.
Цитата(DarkWishmaster @ 26.04.2011 23:50) *

Если с flag(boolean) то все будет верно. Так как у boolean всего два значения(True/False), а для переменой которая будет принимать только значения 0 и 1 будет нелогично исп. типы integer или logint и.д. так что придеться создать свой тип (0..1) бинарный. Всё же когда у нас только два выбора, нужно исп. логический тип boolean.

Большое спасибо за столь подробное объяснение!
DarkWishmaster
Цитата(mfractus @ 26.04.2011 22:52) *

Задача Ввести файл F . Каждый второй элемент в файле, чьё значение лежит в
диапазоне [−3; 5] заменить единицей. Файл вывести до и после
преобразования. Практически аналогична, но вот в ней не могу прописать условие.

Начинаю с ввода F

Можно:
1)Ввести в 1 файл, потом создать ещё один где ты уже будешь писать преобразовыне числа.
2) Когда записываешь в 1 файл можно запоминать числа в векторе, а потом уже rewrite и пишешь числа из вектора и изменяем их.
3)Если тупо надо вывести на экран файл то можно так:

begin
assign(f,'f.dat');
writeLn('введите первую компоненту файла f (признак конца
ввода: "555")');
//ввод файла
rewrite(f);
readLn(b);
i:=1; //номер компоненты файла
while b<>555 do
begin
write(f,b);
inc(i);
writeLn('введите ',i,'-ую компоненту файла f');
readLn(b);
end;
//вывод файла до изменения
reset(f);
writeLn('файл f до изменения:');
while not EOF(f) do
begin
read(f,b);
write(b:5);
end;
//вывод файла после изменения
reset(F);
while not Eof(F) do
read(f,b);
if (b>=-3) and (b<=5) then write(1:5)
else write(b:5);
writeLn;


но при пункте 3, содержимое файла будет тем же как и до изменения. Если преоброзовать файл то надо где-то помнить изначальное его содержимое.
mfractus
Вот пример:
 // увеличение на 5 в файле элементов больших четырех,
// не стоящих на позициях кратных трём
reset(f);
while not EOF(f) do
begin
read(f,b);
if (b>4) and ((filepos(f)-1) mod 3 <> 0) then
begin
seek(f,filepos(f)-1);
b:=b+5;
write(f,b);
end;
end;
//вывод файла после изменения
reset(f);
writeLn('файл f после изменения:');
while not EOF(f) do
begin
read(f,b);
6
write(b:5);
end;
writeLn;
close(f);
end.
DarkWishmaster
меняешь условие на
if (b>=-3) and (b<=5) and ((Filepos(f)-1) mod 2<>0) then
begin
seek(f,filepos(f)-1);
b:=1;
write(f,b);
end;


хм, а я думал что при reset можно только читать из файла
mfractus
Цитата(DarkWishmaster @ 27.04.2011 0:14) *

меняешь условие на
if (b>=-3) and (b<=5) and ((Filepos(f)-1) mod 2<>0) then
begin
seek(f,filepos(f)-1);
b:=1;
write(f,b);
end;


хм, а я думал что при reset можно только читать из файла

Огромное спасибо! Очень помогли! smile.gif
Freedom
А вот по условию задачи, это нужно каждый чётный элемент, подходящий под условие, менять на еденицу, или каждое второе число подходящее условию заменять на единицу?
mfractus
Цитата(Freedom @ 27.04.2011 0:21) *

А вот по условию задачи, это нужно каждый чётный элемент, подходящий под условие, менять на еденицу, или каждое второе число подходящее условию заменять на единицу?

По условию, каждый второй элемент. Не верно?
Freedom
Цитата(mfractus @ 27.04.2011 0:26) *

По условию, каждый второй элемент. Не верно?

Всё верно.Я просто понял условие по другому немного
mfractus
Цитата(Freedom @ 27.04.2011 0:28) *

Всё верно.Я просто понял условие по другому немного

((Filepos(f)-1) mod 2<>0) - Вот это значит каждый второй элемент? Верно?
Freedom
Цитата(mfractus @ 27.04.2011 0:33) *

((Filepos(f)-1) mod 2<>0) - Вот это значит каждый второй элемент? Верно?

Верно
mfractus
Цитата(Freedom @ 27.04.2011 0:35) *

Верно

Большое спасибо!

Добавлено через 5 мин.
Цитата(Freedom @ 27.04.2011 0:21) *

каждый чётный элемент, подходящий под условие, менять на еденицу, или каждое второе число подходящее условию заменять на единицу?

А нет ведь никакой разницы? Это одно и тоже?
Lapp
Цитата(mfractus @ 27.04.2011 0:38) *
А нет ведь никакой разницы? Это одно и тоже?

Конечно, не одно и то же.
Условие однозначно трактуется как каждое второе, подходящее по условию.
На всяк случай приведу пример
До:
10 -1 2 20 4 0
После:
10 -1 1 20 4 1
mfractus
Код готовой программы. Сколько раз прописывать flag:=false;?
 program ABC;
var b,P,i:integer;
f:file of integer;
flag:boolean;
begin
assign(f,'f.dat');
// ввод файла
rewrite(f);
writeLn('вводите 12 компонент файла f:');
flag:=false;
for i:=1 to 12 do
begin
writeLn('введите ',i,'-ую компоненту файла f');
readLn(b);
write(f,b);
end;
// поиск элементов чей модуль лежит в диапазоне [1; 5]
reset(f);
P:=1;
flag:=false;
while not EOF(f) do
begin
read(f,b);
if (abs(b)>=1) and (abs(b)<=5) then
begin
P:=P*b;
flag:=true;
end;
end;
// вывод результатов
if flag then
writeln('произведение элементов: ',P)
else
writeLn('в файле нет таких элементов');
close(f);
end.
Freedom
Цитата(mfractus @ 27.04.2011 12:32) *

Код готовой программы. Сколько раз прописывать flag:=false;?

Достаточно одного раза в начале программы.
mfractus
Цитата(Freedom @ 27.04.2011 16:39) *

Достаточно одного раза в начале программы.

Спасибо! Так и сделал!
mfractus
Скажите, пожалуйста, что значит строка write(a,' ');? То что запись - знаю. В скобках, что за пробел?
Lapp
Цитата(mfractus @ 29.04.2011 0:42) *
Скажите, пожалуйста, что значит строка write(a,' ');? То что запись - знаю. В скобках, что за пробел?

Я просмотрел всю тему и не смог найти такой фрагмент. Откуда ты его взял? blink.gif

Совет: убери этот пробел, прогони прогу и посмотри, что получится. Думаю, сразу поймешь.


и почему бы не повысить репу ребятам за помощь?.. жалко клика?
mfractus
Цитата(Lapp @ 29.04.2011 6:12) *

Я просмотрел всю тему и не смог найти такой фрагмент. Откуда ты его взял? blink.gif

Совет: убери этот пробел, прогони прогу и посмотри, что получится. Думаю, сразу поймешь.
и почему бы не повысить репу ребятам за помощь?.. жалко клика?

Это с другой программы, не тему ведь ради этого создавать. Воспользовался Вашим советом. Этот пробел разделяет числа в файле до изменения и после. Если убрать, то вместо 1 2 3 4 5 6, получится 123456 smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.