Здравствуйте уважаемые пользователи ресурса! Прошу помощи в решении задачи.
Ввести файл 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
26.04.2011 20:36
вычисляем произведение:
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
26.04.2011 20: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.
Freedom
26.04.2011 21:12
Цитата(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
26.04.2011 21:39
Что такое If flag then?
Freedom
26.04.2011 21:50
Цитата(mfractus @ 26.04.2011 22:39)
Что такое If flag then?
flag - переменная boolean, которая принимает значения true или false если условие выполняется If flag then то же что и If flag=true then вывести произведение, иначе вывести что нету таких.
mfractus
26.04.2011 22: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.
DarkWishmaster
26.04.2011 22:25
так как у тебя интервал [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
26.04.2011 22:25
Цитата(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
26.04.2011 22:29
Большое спасибо за пояснение! Можно ли исправить данную ситуацию без помощи flag? Через else может просто?
Freedom
26.04.2011 22:34
Цитата(mfractus @ 26.04.2011 23:29)
Большое спасибо за пояснение! Можно ли исправить данную ситуацию без помощи flag? Через else может просто?
А почему вам не нравится flag? можно переделать. В смысле просто через else?
DarkWishmaster
26.04.2011 22:34
Цитата(mfractus @ 26.04.2011 22:29)
Большое спасибо за пояснение! Можно ли исправить данную ситуацию без помощи flag? Через else может просто?
Если у тебя проблема с boolean то можно через любую переменую каторая будет изменять свое значения в зависимости было или нет совершено умножение например: там где flag:=true меняем на a:=1 (a-переменая каторая сначала 0) потом смотришь если она 0 то таких чисел нет...
mfractus
26.04.2011 22:38
Цитата(Freedom @ 26.04.2011 23:34)
А почему вам не нравится flag? можно переделать. В смысле просто через else?
Я вас понял, конечно же, будет лучше использовать flag. Почему предложенный Вами код программы намного короче? Я делал основываясь на примере.. к примеру присутствует часть кода
reset(f); P:=1; while not EOF(f) do begin read(f,b);
?
DarkWishmaster
26.04.2011 22:40
Цитата(mfractus @ 26.04.2011 22:38)
Я вас понял, конечно же, будет лучше использовать flag. Почему предложенный Вами код программы намного короче? Я делал основываясь на примере.. к примеру присутствует часть кода
reset(f); P:=1; while not EOF(f) do begin read(f,b);
?
у него короче потому что он вычисление делает сразу когда пишет в фаиле. А ты сначала записываешь в фаиле, потом читаешь из него и делаешь вычисления.
mfractus
26.04.2011 22:41
Цитата(DarkWishmaster @ 26.04.2011 23:34)
Если у тебя проблема с boolean то можно через любую переменую каторая будет изменять свое значения в зависимости было или нет совершено умножение например: там где flag:=true меняем на a:=1 (a-переменая каторая сначала 0) потом смотришь если она 0 то таких чисел нет...
Спасибо за ответ!
DarkWishmaster
26.04.2011 22:50
Цитата(mfractus @ 26.04.2011 22:41)
Спасибо за ответ, это будет верно с точки зрения написания программы? До этого с такой проблемой не сталкивался..
Если с flag(boolean) то все будет верно. Так как у boolean всего два значения(True/False), а для переменой которая будет принимать только значения 0 и 1 будет нелогично исп. типы integer или logint и.д. так что придеться создать свой тип (0..1) бинарный. Всё же когда у нас только два выбора, нужно исп. логический тип boolean.
mfractus
26.04.2011 22:52
Задача Ввести файл 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
26.04.2011 23:05
Цитата(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
26.04.2011 23:09
Вот пример:
// увеличение на 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
26.04.2011 23: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 можно только читать из файла
mfractus
26.04.2011 23:19
Цитата(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 можно только читать из файла
Огромное спасибо! Очень помогли!
Freedom
26.04.2011 23:21
А вот по условию задачи, это нужно каждый чётный элемент, подходящий под условие, менять на еденицу, или каждое второе число подходящее условию заменять на единицу?
mfractus
26.04.2011 23:26
Цитата(Freedom @ 27.04.2011 0:21)
А вот по условию задачи, это нужно каждый чётный элемент, подходящий под условие, менять на еденицу, или каждое второе число подходящее условию заменять на единицу?
По условию, каждый второй элемент. Не верно?
Freedom
26.04.2011 23:28
Цитата(mfractus @ 27.04.2011 0:26)
По условию, каждый второй элемент. Не верно?
Всё верно.Я просто понял условие по другому немного
mfractus
26.04.2011 23:33
Цитата(Freedom @ 27.04.2011 0:28)
Всё верно.Я просто понял условие по другому немного
((Filepos(f)-1) mod 2<>0) - Вот это значит каждый второй элемент? Верно?
Freedom
26.04.2011 23:35
Цитата(mfractus @ 27.04.2011 0:33)
((Filepos(f)-1) mod 2<>0) - Вот это значит каждый второй элемент? Верно?
Верно
mfractus
26.04.2011 23:38
Цитата(Freedom @ 27.04.2011 0:35)
Верно
Большое спасибо!
Добавлено через 5 мин.
Цитата(Freedom @ 27.04.2011 0:21)
каждый чётный элемент, подходящий под условие, менять на еденицу, или каждое второе число подходящее условию заменять на единицу?
А нет ведь никакой разницы? Это одно и тоже?
Lapp
27.04.2011 0:04
Цитата(mfractus @ 27.04.2011 0:38)
А нет ведь никакой разницы? Это одно и тоже?
Конечно, не одно и то же. Условие однозначно трактуется как каждое второе, подходящее по условию. На всяк случай приведу пример До: 10 -1 2 20 4 0 После: 10 -1 1 20 4 1
mfractus
27.04.2011 11:32
Код готовой программы. Сколько раз прописывать 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
27.04.2011 15:39
Цитата(mfractus @ 27.04.2011 12:32)
Код готовой программы. Сколько раз прописывать flag:=false;?
Достаточно одного раза в начале программы.
mfractus
27.04.2011 18:58
Цитата(Freedom @ 27.04.2011 16:39)
Достаточно одного раза в начале программы.
Спасибо! Так и сделал!
mfractus
28.04.2011 23:42
Скажите, пожалуйста, что значит строка write(a,' ');? То что запись - знаю. В скобках, что за пробел?
Lapp
29.04.2011 5:12
Цитата(mfractus @ 29.04.2011 0:42)
Скажите, пожалуйста, что значит строка write(a,' ');? То что запись - знаю. В скобках, что за пробел?
Я просмотрел всю тему и не смог найти такой фрагмент. Откуда ты его взял?
Совет: убери этот пробел, прогони прогу и посмотри, что получится. Думаю, сразу поймешь.
и почему бы не повысить репу ребятам за помощь?.. жалко клика?
mfractus
29.04.2011 8:51
Цитата(Lapp @ 29.04.2011 6:12)
Я просмотрел всю тему и не смог найти такой фрагмент. Откуда ты его взял?
Совет: убери этот пробел, прогони прогу и посмотри, что получится. Думаю, сразу поймешь. и почему бы не повысить репу ребятам за помощь?.. жалко клика?
Это с другой программы, не тему ведь ради этого создавать. Воспользовался Вашим советом. Этот пробел разделяет числа в файле до изменения и после. Если убрать, то вместо 1 2 3 4 5 6, получится 123456
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.