Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.63.236] |
|
Сообщ.
#1
,
|
|
|
Надо написать функцию, которая обрабатывает несколько комплексных чисел. Я ее написала, когда комплексные числа передаются через двумерный массив. А надо через строку:
'(1;2) (-1;-2) (2;1) (-2;-1)' Как эту строку преобразовать в двумерный массив? [[1,2],[-1,-2],[2,1],[-2,-1]] числа другие, это для примера Писать надо на чистом паскале. tp7 в dosbox, freepascal На Java и Python смогла. Даже на C strtok хотя падает по segfault. А на паскале с delete,pos запуталась. Помогите, пожалуйста мне не надо готовое решение. мне нужна помощь) |
Сообщ.
#2
,
|
|
|
по сути, так:
цикл от 1 до 4 { находим открывающую скобку - strchr; переводим строку со след. символа в число - atoi - x ищем ';' - strchr переводим строку со след. символа в число - atoi (мнимая часть) - y пишем (x,y) в элемент массива } |
Сообщ.
#3
,
|
|
|
Если не обязательно следить за корректностью формата входной строки (она гарантировано корректная), то достаточно ограничиться проверкой на принадлежность символа к цифрам и по подобию схемы Горнера формировать очередное число.
program test; const N = 100; type TComplex = record Re, Im: integer end; TArray = array [0..N - 1] of TComplex; const S: string = '(127;298) (-14;-28) (22;15) (-72;-91)'; function GetNumber(const AStr: string; var AStartPos: integer; var ANumber: integer): boolean; var i: integer; R, Sign: integer; begin {пропускаем разделители} i := AStartPos; while i <= length(AStr) do begin if (AStr[i] in ['0'..'9', '-']) then break; Inc(i); end; {если цифры не встретились, то вернуть false} if i > length(AStr) then begin AStartPos := i; GetNumber := False; exit; end; {т.к. цифры встретились - получаем число} Sign := 0; if AStr[i] = '-' then begin Inc(i); Sign := -1; end; R := 0; while i <= length(AStr) do begin if not (AStr[i] in ['0'..'9']) then break; R := R * 10 + byte(AStr[i]) - byte('0'); Inc(i); end; R := (R xor Sign) - Sign; AStartPos := i; ANumber := R; GetNumber := True; end; var StartPos: integer; Vector: TArray; Len: integer; i: integer; begin {ввод массива} Len := 0; StartPos := 1; repeat if not GetNumber(s, StartPos, Vector[Len].Re) then break; if not GetNumber(s, StartPos, Vector[Len].Im) then break; Inc(Len); until StartPos > length(s); {тестовая печать} writeln(s); writeln('Len=', Len); for i := 0 to Len - 1 do writeln(Vector[i].Re, ' ', Vector[i].Im); end. |
Сообщ.
#4
,
|
|
|
Сообщ.
#5
,
|
|
|
Я так понял ТС уже не ответит, но очень интересно было бы глянуть как смогла на питоне реализовать.
|