![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток.
Суть вопроса такова: Имеется переменная A0, которая равна, например, 63 (положительное, целое). Как разбить данное число на два 6 и 3 и присвоить их переменным A1 и A2? Поиски привели к исходинкам на Паскале: Код:
var
s:string;
a,t,i,sum:integer;
begin
sum:=0;
readln(a); {ввод числа}
str(a,s); {перевод из числа в строку}
for i:=1 to length(s) do
begin
val(s[i],t,err); {перевод i-того символа строки в число}
sum:=sum+t;
end;
writeln(sum);
end.Суть ясна, перевод в строчный. Но здесь идет сумма этих цифр, как занести именно в переменные? Да и на Делфи вроде как inttostr используется при переводе в строчное. |
|
#2
|
|||
|
|||
|
Есть вараинты.
1. Через строку: Код:
var
A : Array Of Integer;
S : String;
C : Char;
InNmb, I, L : Integer;
begin
InNmb := 63;
S :- IntToStr(InNmb);
L := Length(S);
// инвертрируем строку если нам нужен младший разряд в младшем элементе
For I := 1 To (L div 2) Do
Begin
C := S[i];
S[i] := S[L-I+1];
S[L-I+1] := C;
End;
// Заполняем массив
SetLength(A,L);
For I := 1 To L Do
A[I-1] := StrToInt(S[i]);
end;2. Через деление Код:
var
A : Array Of Integer;
InNmb : Integer;
begin
InNmb := 63;
SetLength(A,0);
While InNmb > 0 Do
Begin
SetLength(A,Length(A)+1);
A[High(A)] := InNmb mod 10;
InNmb := InNmb div 10;
End; |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
vers0 (10.07.2019)
| ||
|
#3
|
|||
|
|||
|
Цитата:
Извините, может, будет глупый вопрос, но все же (мало знаком с данной темой): После While InNmb > 0 Do идет деление и соответственно "выяснение" из каких цифр состоит InNmb, а вот как потом разнести эти цифры по переменным A1 и A2? Или строка SetLength(A,Length(A)+1); как раз и заполняет A+1 и т.д.? но тогда в var почему они не обозначены? Последний раз редактировалось vers0, 09.07.2019 в 14:21. |
|
#4
|
|||
|
|||
|
Это не строка, а массив. Т.к. заранее не известна длинна числа (кол-во разрядов), я использовал массив для сохранения результатов. Если ты уверен, что будети только 2 разряда, то после цикла можно записать так:
Код:
A1 := A[0]; A2 := A[1]; |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
vers0 (10.07.2019)
| ||
|
#5
|
|||
|
|||
|
Цитата:
Да, количество разрядов будет известно. Спасибо за пример и помощ. |
|
#6
|
|||
|
|||
|
Цитата:
Если написать A1 := A[0];, то A1 присваивается сумма двух чисел из которых состоит значение InNmb. Т.е. InNmb=27, а A1=9, при этом A2=48827616 Как присвоить A1=2, а A2=7 ?? Последний раз редактировалось vers0, 20.07.2019 в 16:10. |
|
#7
|
|||
|
|||
|
У меня, вроде, все правильно работает.
Только надо инвертировать разряды. Видимо ты пытаешься как-то добраться до массива неправильно, вот и получаешь какой-то мусор. Код:
procedure TForm1.Button1Click(Sender: TObject);
var
A : Array Of Integer;
InNmb : Integer;
A1, A2 : Integer;
begin
InNmb := 27;
SetLength(A,0);
While InNmb > 0 Do
Begin
SetLength(A,Length(A)+1);
A[High(A)] := InNmb mod 10;
InNmb := InNmb div 10;
End;
A1 := A[1];
A2 := A[0];
ShowMessage(Format('A1=%d, A2=%d',[A1,A2]));
end; |
|
#8
|
|||
|
|||
|
Цитата:
Код тот же, единственное InNmb заменено на s1 и A1,A2 выводятся через Edit3.Text:=IntToStr(A1); Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
s1:=d1+m1+y1;
begin
SetLength(A,0);
While s1 > 0 Do
Begin
SetLength(A,Length(A)+1);
A[High(A)] := s1 mod 10;
s1 := s1 div 10;
End;
A1 := A[0];
A2:=A[1];
Edit3.Text:=IntToStr(A1);
Edit4.Text:=IntToStr(A2);
end;
end;Самое интересное, что сумма в А1 всегда верная, какие бы входные данные не передавались. A1, A2, S1 фигурируют только в этой процедуре, больше ни где. Последний раз редактировалось vers0, 21.07.2019 в 12:45. |
|
#9
|
|||
|
|||
|
Значит что-то не так.
1. Сделай все переменные, включая массив A, локальным (если возможно). 2. Массив A должен быть именно динамическим (проверь его описание). 3. Проверь типы данных. В моем примере они все Integer. 4. Убедись, что никакой другой код "не встревает" во время вычисления (не сохраняет в эти переменные ничего). Косяк явно у тебя, я проверил свой код и он работает абсолютно правильно. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
vers0 (21.07.2019)
| ||
|
#10
|
|||
|
|||
|
Цитата:
Действительно отдельно код работает корректно, а в моем коде выводит косяк. 1. Сделал локально все переменные (s1 глобально, но сделал локальную s0 (s0:=s1)) 2. Массив Array Of Integer 3. Все переменные Integer, включая d1, m1, y1 4. Сначала идет строка s1:=d1+m1+y1; потом s0:=s1; потом массив. Больше эти переменные вообще нигде не встречаются на данный момент. d1, m1, y1 принимают значения по case combobox1.ItemIndex of и т.д. Может здесь загвоздка? P.S. даже после ввода промежуточных переменных ничего не поменялось... d0:=StrToInt(d1); m0:=StrToInt(m1); y0:=StrToInt(y1); s1:=d0+m0+y0; Последний раз редактировалось vers0, 21.07.2019 в 20:04. |
|
#11
|
|||
|
|||
|
ok, попробуй сделать отдельной функцией и вызывай ее:
Код:
procedure SplitNumber(InNmb : Integer; var A1 : Integer; var A2 : Integer);
var
A : Array Of Integer;
begin
SetLength(A,0);
While InNmb > 0 Do
Begin
SetLength(A,Length(A)+1);
A[High(A)] := InNmb mod 10;
InNmb := InNmb div 10;
End;
A1 := A[1];
A2 := A[0];
end;тогда у себя в коде делаешь примерно так: Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
s1:=d1+m1+y1;
SplitNumber(s1,A1,A2);
ShowMessage(Format('S1=%d, A1=%d, A2=%d',[S1,A1,A2]));
end;ЗЫ. Если правильно помню, то если нажать в сообщении Ctrl+C, то в буфер обмена скопируется текст сообщения. |
|
#12
|
|||
|
|||
|
Что-то вы сильно увлеклись... vers0, если число всегда двузначное, то пляски вокруг массивов ненужны, lmikle предложил универсальное решение для любых чисел, тебе нужно просто взять результат целочисленного деления на 10 и остаток от деления.
27 div 10 = 2 27 mod 10 = 7 |
|
#13
|
|||
|
|||
|
Цитата:
Ну, в принципе, что-то в этом есть ![]() Действительно, если число всегда двухзначное, то такое решение сработает вполне. |
|
#14
|
|||
|
|||
|
Цитата:
--------------------------- Project1 --------------------------- S1=9, A1=48958688, A2=9 --------------------------- OK --------------------------- В итоге ничего не поменялось ![]() --------------------------- Project1 --------------------------- d0=3, m0=1, y0=5, S1=9, A1=49941728, A2=9 --------------------------- OK --------------------------- Последний раз редактировалось vers0, 23.07.2019 в 18:33. |
|
#15
|
|||
|
|||
|
Э, чувак. Ну вот же в сообщении все понятно. Никаких 27 у тебя на входе в разбиение нет. S1 у тебя равно 9, в обоих случаях. Тогда и понятно появление большого числа во второй переменной - там просто происходит выход за границу массива и читается просто какой-то случайный мусор. Если постаишь в опциях компилятора вкл соотв. проверку, на этом месте получишь исключение. Так что код работает правильно, просто кое-кто подсовывает данные, нарушающие входные условия, соответвенно, получаешь мусор на выходе.
|