1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Здравствуйте уважаемые пользователи ресурса! Прошу помощи в решении задачи.
Ввести файл 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;
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);
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; 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.
flag - переменная boolean, которая принимает значения true или false если условие выполняется If flag then то же что и If flag=true then вывести произведение, иначе вывести что нету таких.
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:5) то некоректно использовать
if P=1 then //нету таких чисел
потому что если у тебя будет например: 1 9 6 1 -1 -2 7 -1 то произведение будет: 1*1*(-1)*(-1)=1 т.е P=1 но ведь таких чисел 4! А переменая flag смотрит если было произвидено хотя бы одно умножение, если да то очевидно что такие элементы существуют и можно вывести произведение на экран.
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, и у вас выведет что нету таких элементов
Большое спасибо за пояснение! Можно ли исправить данную ситуацию без помощи flag? Через else может просто?
Если у тебя проблема с boolean то можно через любую переменую каторая будет изменять свое значения в зависимости было или нет совершено умножение например: там где flag:=true меняем на a:=1 (a-переменая каторая сначала 0) потом смотришь если она 0 то таких чисел нет...
А почему вам не нравится flag? можно переделать. В смысле просто через else?
Я вас понял, конечно же, будет лучше использовать flag. Почему предложенный Вами код программы намного короче? Я делал основываясь на примере.. к примеру присутствует часть кода
reset(f); P:=1; while not EOF(f) do begin read(f,b);
Я вас понял, конечно же, будет лучше использовать flag. Почему предложенный Вами код программы намного короче? Я делал основываясь на примере.. к примеру присутствует часть кода
reset(f); P:=1; while not EOF(f) do begin read(f,b);
?
у него короче потому что он вычисление делает сразу когда пишет в фаиле. А ты сначала записываешь в фаиле, потом читаешь из него и делаешь вычисления.
Если у тебя проблема с boolean то можно через любую переменую каторая будет изменять свое значения в зависимости было или нет совершено умножение например: там где flag:=true меняем на a:=1 (a-переменая каторая сначала 0) потом смотришь если она 0 то таких чисел нет...
Спасибо за ответ, это будет верно с точки зрения написания программы? До этого с такой проблемой не сталкивался..
Если с flag(boolean) то все будет верно. Так как у boolean всего два значения(True/False), а для переменой которая будет принимать только значения 0 и 1 будет нелогично исп. типы integer или logint и.д. так что придеться создать свой тип (0..1) бинарный. Всё же когда у нас только два выбора, нужно исп. логический тип boolean.
Задача Ввести файл 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.
Задача Ввести файл 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, содержимое файла будет тем же как и до изменения. Если преоброзовать файл то надо где-то помнить изначальное его содержимое.
// увеличение на 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.