Убедительная просьба ко всем, кто выкладывает исходники: 1. Обязательно пользуйтесь тэгом code (иначе очень трудно читать)
2. Старайтесь делать отступы
Если вы хотите чтобы вам помогли в написании программы, внятно излагайте задание!
Прежде чем задать вопрос, воспользуйтесь учебником
Возможно, что нужная вам программа уже написана, поэтому советую просмотреть список здесь и здесь Отредактировано куратором: Lord_of_Darkness. Дата: 07.07.2006 19:36
Качнул исходник а по какому принципу она работает не совсем понятно. Программа складывает числа в двоичной системе.
var sr,sf,ss:string;
function BinAdd(s1,s2:string):string;
var s:string; l,i,d,carry:byte;
begin
if length(s1)>length(s2) then while length(s2)<length(s1) do s2:='0'+s2
else while length(s1)<length(s2) do s1:='0'+s1;
l:=length(s1);
s:=''; carry:=0;
for i:=l downto 1 do begin
d := (ord(s1[i])-ord('0')) + (ord(s2[i])-ord('0')) + carry;
carry := d div 2;
d:=d mod 2;
s:=char(d+ord('0')) + s;
end;
if carry<>0 then s:='1'+s;
BinAdd:=s;
end;
begin
writeln('Введите первое число');
readln(sf);
writeln('Введите второе число');
readln(ss);
sr:=BinAdd(sf,ss);
writeln('результат = ',sr);
end.
Вместо char по-моему должно быть chr.
Читать описание функций chr и ord, работу со строками.
Сначала строки выравниваются по длине путем добавления незначащих нулей. Потом в цикле формируются символы (0 или 1) в результирующей строке с учетом переноса (carry) от предыдущего формирования . Если после прохождения цикла имеется перенос, то к результирующей строке добавляется 1.
Защиты от дурака нет .
Member
Статус: Не в сети Регистрация: 10.12.2007 Откуда: Санкт-Петербург
Пожалуйста, скажите в чем ошибка. Прога должна находить максимальный элемент выше главной диагонали и минимальный ниже, а у меня находит во всем массиве.
Код:
program zadacha1; const n=4; m=4; type massiv=array[1..n,1..m]of integer; procedure zapoln(var mas1:massiv); var i,j:integer; begin randomize; for i:=1 to n do for j:=1 to m do mas1[i,j]:=random(80); end; procedure vivod(var mas2:massiv); var i,j:integer; begin for i:=1 to n do begin for j:=1 to m do write(mas2[i,j]:4); writeln; end; end; procedure maxmalndiag(var mas3:massiv;var maximalnii:integer); var i,j:integer; begin for i:=1 to n do for j:=1 to m do begin if j>=i then begin maximalnii:=mas3[1,1]; if mas3[i,j]>=maximalnii then maximalnii:=mas3[i,j]; end; end; end; procedure minmaimdiag(var mas4:massiv;var minimalnii:integer); var i,j:integer; begin for i:=1 to n do for j:=1 to m do begin if j<=i then begin minimalnii:=mas4[1,1]; if mas4[i,j]<=minimalnii then minimalnii:=mas4[i,j]; end; end; end; var mas:massiv; max,min:integer; begin zapoln(mas); vivod(mas); maxmalndiag(mas,max); writeln('maximalnii element,legashchii vishe diagonali raven',' ',max); writeln; minmaimdiag(mas,min); writeln('minimalnii element,legashchii nige diagonali raven',' ',min); readln; end.
manya А главная диагональ ведь не в счет? Если нет, то зачем знаки <= и >= ?
Потом не понятно совершенно вот эти строки:
maximalnii:=mas3[1,1];
minimalnii:=mas4[1,1];
Во-первых они должны быть в начале процедуры, а во-вторых для процедуры которая находит значение, находящееся ниже диагонали должно быть написано:
minimalnii:=mas4[n,m];
И строки:
if mas3[i,j]>=maximalnii
if mas4[i,j]<=minimalnii then
Тоже странные, если элементы равны, то зачем их запоминать? Тут должны быть знаки строгие < и >.
Member
Статус: Не в сети Регистрация: 10.12.2007 Откуда: Санкт-Петербург
sashar2 Спасибо, но всё равно не работает
Код:
program zad54; const n=4; m=4; type massiv=array[1..n,1..m]of integer; procedure zapoln(var mas1:massiv); var i,j:integer; begin randomize; for i:=1 to n do for j:=1 to m do mas1[i,j]:=random(80); end; procedure vivod(var mas2:massiv); var i,j:integer; begin for i:=1 to n do begin for j:=1 to m do write(mas2[i,j]:4); writeln; end; end; procedure maxmalndiag(var mas3:massiv;var maximalnii:integer); var i,j:integer; begin maximalnii:=mas3[1,1]; for i:=1 to n do for j:=1 to m do begin if j>i then begin
if mas3[i,j]>maximalnii then maximalnii:=mas3[i,j]; end; end; end; procedure minmaimdiag(var mas4:massiv;var minimalnii:integer); var i,j:integer; begin minimalnii:=mas4[n,m]; for i:=n downto 1 do for j:=m downto 1 do begin if j<i then begin if mas4[i,j]<minimalnii then minimalnii:=mas4[i,j]; end; end; end; var mas:massiv; max,min:integer; begin zapoln(mas); vivod(mas); maxmalndiag(mas,max); writeln('maximalnii element,legashchii vishe diagonali raven',' ',max); writeln; minmaimdiag(mas,min); writeln('minimalnii element,legashchii nige diagonali raven',' ',min); readln; end.
manya Я насчет диагонали не так сказал, там должно быть условие не:
if j>i then
и
if j<i then, а должно быть:
if ((j+i)<(n+1))) then
и
if ((j+i)>(n+1))) then
Но это только справедливо для квадратной матрицы, у другой диагонали-то не будет, поэтому не ясно зачем тут n и m.
Member
Статус: Не в сети Регистрация: 10.12.2007 Откуда: Санкт-Петербург
sashar2 Спасибо большое
Добавлено спустя 59 минут, 19 секунд А можно я ещё спрошу? Задача по треугольнику Паскаля. Вводится номер строки и столбца, где находится элемент, а выводится его значение. Прога работает, но при значениях строк и столбцов больше 30 виснет. Как это исправить?
Код:
program treygpas; function pas(n,k:integer):longint; begin if (n>k) and (k<>1) then pas:=pas(n-1,k-1)+pas(n-1,k) else pas:=1; end; var l,m:integer; p:longint; begin readln(l); readln(m); if l>=m then begin p:=pas(l,m); write(p); end else writeln('nedopystimoe znachenie'); readln; end.
Прога работает, но при значениях строк и столбцов больше 30 виснет.
Она вообще-то работает, при такой рекурсии и указанных числах считать придется довольно долго . Можете ради спотивного интереса в самой функции после строки pas:=pas(n-1,k-1)+pas(n-1,k) добавить вывод на экран пары n и k, которая обсчитывалась на текущий момент (не забывая при этом операторные скобки begin end). И потом глядеть на пляшущие по экрану числа .
Вот здесь (http://ru.wikipedia.org/wiki/Биномиальный_коэффициент - сорри, ссылка нормально не вставляется) есть пару формул, поглядите. Если вам не нужна рекурсия, то вполне может подойти.
manya Тогда уговаривайте преподавателя подождать, пока досчитает . Или не задавайте таких больших чисел. Можно еще демонстрировать процесс работы с помощью выведения на экран текущей пары просчитываемых коэффициентов - хоть видно будет, что не зависает, а работает.
Member
Статус: Не в сети Регистрация: 10.12.2007 Откуда: Санкт-Петербург
Скажите, пожалуйста, если необходимо, чтобы в матрице последний элемент каждой строки был равен среднему арифметическому предыдущих элементов той же строки, то какое условие должно быть в цикле в процедуре где он ищется?
_________________ Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах... DCN - наше все
Member
Статус: Не в сети Регистрация: 10.12.2007 Откуда: Санкт-Петербург
Lord_of_Darkness Спасибо, а то что - то странное у меня получалось Добавлено спустя 38 минут, 49 секунд Lord_of_Darkness а если в общем виде, то как это будет выглядеть?
Код:
program zadacha; uses crt; const n=3; m=3; type massiv=array[1..n,1..m]of integer; type preobmas=array[1..n,1..m]of real; procedure zapoln(var mas1:massiv); var i,j:integer; begin for i:=1 to n do for j:=1 to m do mas1[i,j]:=random(34); end; procedure vivod(var mas2:massiv); var i,j:integer; begin for i:=1 to n do begin writeln; for j:=1 to m do write(mas2[i,j]:4); end; writeln; end; procedure sredn(var mas3:massiv;var mas4:preobmas); var i,j,s:integer; begin for i:=1 to n do begin s:=0; for j:=1 to m do begin s:=s+mas3[i,j]; end; mas4[i,j]:=s/(n-1); end; end; procedure viv(var mas5:preobmas); var i,j:integer; begin for i:=1 to n do begin writeln; for j:=1 to m do write(mas5[i,j]:8:1); end; end; var mas:massiv; mass:preobmas; begin clrscr; randomize; zapoln(mas); vivod(mas); sredn(mas,mass); writeln('preobrazovannii'); viv(mass); readln; end.
Ребята, я понимаю, что моя задача по сравнению со всеми остальными просто детский лепет, но у меня проблемы.
Написать программу, которая вычисляет, есть ли среди цифр натурального числа нули.
Куратор темы Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
manya
вот так
Код:
procedure sredn(var mas3:massiv;var mas4:preobmas); var i,j,s:integer; begin for i:=1 to n do begin s:=0; for j:=1 to m-1 do s:=s+mas3[i,j]; mas4[i,m]:=s/(m-1); end; end;
Dancing Soul
в данной теме уже много раз обсуждалась проблема разбиения числа на цифры, воспользуйтесь поиском.
Если число может быть не целым, то нужно определить некую точность, т.е. до какого знака после запятой будет вестись расчет. Далее просто умножаем число на 10^x, где 10^x - определенная точность, а дробную часть отбрасываем. Теперь это исходное число для расчетов.
После чего последовательно выполняем следующие действия:
1. делим исходное число на 10 нацело, после чего умножаем на 10 и отнимаем его от исходного. Получаем последнюю цифру этого числа (проверяем, равна нулю или нет, если да, то выходим из цикла с выводом сообщения о присутствии цифры 0 в числе). Далее подаем это число (которое на 10 нацело разделено) снова на вход пункта 1, в качестве исходного.
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения