Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
VitalyaCoolBoy
0 / 0 / 0
Регистрация: 27.10.2016
Сообщений: 44
1

Как написать функцию?

27.11.2016, 21:04. Просмотров 1200. Ответов 10
Метки нет (Все метки)

Задали задачу: Дано натуральное число P. Выбросите из записи числа P цифры 0, оставив прежним порядок прежних цифр.
Задачу необходимо решить через процедуру и через функцию. С процедурой вроде справился, а вот с функцией проблемы.
Подскажите, как написать функцию.

Вот есть код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
var
  Form1: TForm1;
  var P,a,i,s:int64;
  function DelZeroFunc(P,a,i,s:int64):int64;
 
//НАПИСАНИЕ ПРОЦЕДУРЫ
procedure TForm1.Button1Click(Sender: TObject);
var P, a, i, s: int64;
begin
i:=1;
s:=0;
Form1.Label7.Caption:='';
 if Form1.Edit1.Text='' then
  begin
   showmessage('Поле ввода - пустое'); //Если в Edit1 ничего не записано
   exit;
  end;
P:=StrToInt(Form1.Edit1.Text);
if (p<1) then
  begin
   showmessage('P должeн быть не меньше 1');
   exit;
  end;
while P <> 0 do
 begin
  a:=P mod 10;
   if (a<>0) then
    begin
     s:=s+a*i;
     i:=i*10;
    end;
  P:=P div 10;
 end;
Form1.Label7.Caption:=Form1.Label7.Caption + IntToStr(s)+' '; //Вывод в label7
end;
 
function DelZeroFunc(P,a,i,s:int64):int64;
begin
  Result:=s;
  Form1.Label8.Caption:=Form1.Label8.Caption + IntToStr(s)+' ';
end;

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2016, 21:04
Ответы с готовыми решениями:

Как написать подобную функцию на Delphi
// из клиентских в игровые float GameX(float px){return(px+4000)/10;} float...

Как написать такую программу через процедуру/функцию
Вот готовый вариант без процедуры/функции Программа считает количество...

Написать Функцию
Задание:Поток студентов сдавал один и тот же зачет в течении 5 дней. Не...

Написать функцию
Написать функцию, которая удаляет все сдвоенные пробелы пробелы из строки,...

Написать и протестировать функцию
Написать и протестировать функцию,которая определяет,входит ли каждая буква в...

10
cfbogd
botsik
259 / 259 / 140
Регистрация: 05.06.2016
Сообщений: 1,247
Записей в блоге: 1
27.11.2016, 22:19 2
VitalyaCoolBoy, гораздо проще сделать через строку:
Delphi
1
2
3
4
5
6
7
8
9
function killzero(p:int64):integer;
var i:integer;
s:string;
begin
s:=inttostr(p);
for i:=1 to length(s) do
if s[i]='0' then delete(s,i,1);
result:=strtoint(s);
end;
0
VitalyaCoolBoy
0 / 0 / 0
Регистрация: 27.10.2016
Сообщений: 44
27.11.2016, 23:36  [ТС] 3
Спасибо огромное!!!
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26479 / 17783 / 7034
Регистрация: 22.10.2011
Сообщений: 31,301
Записей в блоге: 6
28.11.2016, 00:46 4
Цитата Сообщение от cfbogd Посмотреть сообщение
гораздо проще
не значит правильнее. Кто же удаляет из строки элементы в прямом цикле for, который запоминает начальное и конечное значение, и только потом собственно начинает выполнение? Ничего что после удаления первого же нуля длина строки изменилась, а конечное значение цикла осталось прежним, и происходит вылет за границу строки? Если делать со строкой - то цикл for должен быть обратным, length(s) downto 1
0
cfbogd
botsik
259 / 259 / 140
Регистрация: 05.06.2016
Сообщений: 1,247
Записей в блоге: 1
28.11.2016, 00:50 5
Цитата Сообщение от volvo Посмотреть сообщение
цикл for должен быть обратным
по сути да, вы правы. На следующий раз буду знать, спасибо
0
northener
пофигист широкого профиля
3429 / 2328 / 631
Регистрация: 15.07.2013
Сообщений: 13,796
28.11.2016, 01:20 6
Цитата Сообщение от volvo Посмотреть сообщение
Кто же удаляет из строки элементы в прямом цикле for, который запоминает начальное и конечное значение, и только потом собственно начинает выполнение?
Вот только "запоминание начального и конечного значения цикла" тут собственно мало при чем.
Более важно понимать как происходит удаление элемента в данном конкретном классе или типе. Цикл for предполагает что у всех "элементов" есть заранее заданные индексы, которые никогда не изменяются.
0
D1973
Модератор
3648 / 2628 / 1282
Регистрация: 21.01.2014
Сообщений: 11,119
Записей в блоге: 3
Завершенные тесты: 1
28.11.2016, 06:53 7
VitalyaCoolBoy, вот сразу на вскидку, что в глаза бросилось:
1. Ты пишешь:
Delphi
1
2
3
4
5
if Edit1.Text='' then
  begin
   showmessage('Поле ввода - пустое'); //Если в Edit1 ничего не записано
   exit;
  end;
Это правильно, проверку делать надо, но вот только, что будет, если я введу не число, а какое-то слово или просто пробел? В следующей же строке ты получишь ругань на не соответствие типов.
2.
Delphi
1
if (p<1) then showmessage('P должeн быть не меньше 1');
Это почему еще? А если я введу число -102030405? Меньше оно единицы? Да! Но почему я не могу из него нули повыдирать?
3. Зачем все так сложно-то? cfbogd правильно сказал, что через строку все решается очень просто, вот только и его код имеет смысл оптимизировать...
В итоге получится следующее:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function DelZero(i : integer) : string;
begin
 result := StringReplace(IntToStr(i), '0', '', [rfReplaceAll]);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var P : integer;
begin
 if not TryStrToInt(Edit1.Text, P)
  then begin
        ShowMessage('Поле ввода пусто или введено нечисловое значение');
        Exit;
       end;
 Label1.Caption := DelZero(P);
end;
1
Изображения
 
D1973
Модератор
3648 / 2628 / 1282
Регистрация: 21.01.2014
Сообщений: 11,119
Записей в блоге: 3
Завершенные тесты: 1
28.11.2016, 07:05 8
Ну, а чтобы совсем все по заданию: то вот и с процедурой и с функцией:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function DelZero(i : intеger) : string;
begin
 result := StringReplace(IntToStr(i), '0', '', [rfReplaceAll]);
end;
 
procedure DelZeroP(var i : integer);
begin
 i := StrToInt(StringReplace(IntToStr(i), '0', '', [rfReplaceAll]));
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var P : integer;
begin
 if not TryStrToInt(Edit1.Text, P)
  then begin
        ShowMessage('Поле ввода пусто или введено нечисловое значение');
        Exit;
       end;
 Label1.Caption := DelZero(P);
 DelZeroP(P);
 Label2.Caption := IntToStr(P);
end;
0
Изображения
 
AHBAR
239 / 239 / 167
Регистрация: 05.04.2013
Сообщений: 1,111
28.11.2016, 07:30 9
StringReplace и цикл не нужен

Добавлено через 1 минуту

Не по теме:

пока отвлекся, тут уже понаписали)) надо было страницу обновить..

0
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
28.11.2016, 07:51 10
Предложенные решения дают верный результат, но преподаватель не примет их. Это учебная задача по системам счисления. И ожидается, что в решении будет показано, как выполняется преобразование числа к десятичной записи. Вызов готовой функции StringReplace() преподавателя не устроит.
Цитата Сообщение от D1973 Посмотреть сообщение
А если я введу число -102030405?
Это противоречит условию задачи:
Цитата Сообщение от VitalyaCoolBoy Посмотреть сообщение
Дано натуральное число P.
При условии натурального числа, задача упрощается - это дополнительно намекает на то, что от ученика ждут самостоятельного преобразования к десятичной записи.
0
D1973
Модератор
3648 / 2628 / 1282
Регистрация: 21.01.2014
Сообщений: 11,119
Записей в блоге: 3
Завершенные тесты: 1
28.11.2016, 08:29 11
Лучший ответ Сообщение было отмечено VitalyaCoolBoy как решение

Решение

Не по теме:

Цитата Сообщение от Mawrat Посмотреть сообщение
но преподаватель не примет их.
Зараза этакая >:o


Цитата Сообщение от Mawrat Посмотреть сообщение
Это противоречит условию задачи:
Блин, точно!
Цитата Сообщение от Mawrat Посмотреть сообщение
что от ученика ждут самостоятельного преобразования к десятичной записи.
Не знаю, что ждут от ученика, но ученик точно дождался Вот, с учетом замечаний...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function DelZero(i : int64) : int64;
var n : int64;
begin
 n := 1; result := 0;
 while i <> 0 do
  begin
   if i mod 10 <> 0
    then begin
          result := result + (i mod 10) * n;
          n := n * 10;
         end;
   i := i div 10;
  end;
end;
 
procedure DelZeroP(var i : int64);
var n, m : int64;
begin
 n := 1; m := 0;
 while i <> 0 do
  begin
   if i mod 10 <> 0
    then begin
          m := m + (i mod 10) * n;
          n := n * 10;
         end;
   i := i div 10;
  end;
 i := m;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var P : int64;
begin
 if (not TryStrToInt64(Edit1.Text, P)) or (P <= 0)
  then begin
        ShowMessage('Поле ввода пусто, введено нечисловое значение или ненатуральное число');
        Exit;
       end;
 Label1.Caption := IntToStr(DelZero(P));
 DelZeroP(P);
 Label2.Caption := IntToStr(P);
end;
2
28.11.2016, 08:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2016, 08:29

написать функцию arcctg
Изучать Делфи только начал и незнаю как написать функцию arcctg(x),что только...

Не могу написать функцию
Помогите решить функцию, или хотя бы саму функцию как прописать в делфи ...

Написать функцию sin
Написать функцию Sin1(x, ε) вещественного типа (параметры x, ε — вещественные,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru