LINUX.ORG.RU

Помогите заочнице-первочку с задачей :)

 


0

2

Надо написать функцию, которая обрабатывает несколько комплексных чисел. Я ее написала, когда комплексные числа передаются через двумерный массив. А надо через строку:

'(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 запуталась.

Помогите, пожалуйста :)



Последнее исправление: wovoceg (всего исправлений: 1)

Ответ на: комментарий от aol

а мне не надо решение. мне нужна помощь)

wovoceg
() автор топика

написала, когда комплексные числа передаются через двумерный массив. А надо через строку

Не надо. Надо что-то вроде
1)

type
  PComplex = ^TComplex;
  TComplex = record
    Re, Im: Real;
  end;

procedure SomeShit(const a: array of TComplex; n: Integer);
begin
  { ... }
end;

// или для FreePascal с его указатель-как-массив
procedure SomeShit(a: PComplex; n: Integer);
begin
  // ...
end;

И отдельно написать разбор строкового ввода.

bormant ★★★★★
()
Ответ на: комментарий от bormant

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

wovoceg
() автор топика
Ответ на: комментарий от wovoceg

я изучала массивы

Чем массив из двойных чисел отличается от обычного массива? Может быть тем, что значений в два раза больше? Чем ещё? :)

Deleted
()

первочку

что это значит?

Deleted
()
Ответ на: комментарий от Deleted

нет, максимум язык запросов типа sql

Deleted
()
Ответ на: комментарий от wovoceg

препод говорит, что можно через pos,insert,delete

Можно. Но подход кривой. Возможно, причиной тому всего-лишь текущий этап обучения (я не изучала записи-я изучала массивы).

Напишите что-то вроде:

type
  TComplex = array [0..1] of Real;
function cRead(var c: TComplex): Boolean;
var t: Char;
begin
  cRead:=False;
  repeat Read(t) until t>' ';
  if t<>'(' then Exit;
  Read(c[0]);
  repeat Read(t) until t>' ';
  Read(c[1]);
  repeat Read(t) until t>' ';
  if t<>')' then Exit;
  cRead:=True;
end;

Но тут должны быть обязательные пробелы (показаны «_»):
(число_,число_)
Более корректный способ в разборе на "(*)", затем на «*;*», затем Val для половинок.

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)

ну можно и тупо в лоб распарсить

  1. бежим по строке пока не наткнёмся на открывающую скобку
  2. далее будем двигаться до ';'
    1. проверяем символ если '-' запоминаем знак
    2. если ' ' пропускаем, если число заносим в массив целые
    3. если ',' или '.' переключаемся на массив дробные
    4. если ';' завершаем обработку целого
      1. элементы массива целые суммируются по формуле xi*10^(длина массива - индекс)
      2. вычисляем сумму элементов массива дробные по формуле xi*10^-(i+1) где i индекс элемента
      3. умножаем на знак если надо
  3. движемся до закрывающиеся скобки
    1. проверяем символ если '-' запоминаем знак
    2. если ' ' пропускаем, если число заносим в массив целые
    3. если ',' или '.' переключаемся на массив дробные
    4. если ';' завершаем обработку мнимого
      1. элементы массива целые суммируются по формуле xi*10^(длина массива - индекс)
      2. вычисляем сумму элементов массива дробные по формуле xi*10^-(i+1) где i индекс элемента
      3. умножаем на знак если надо
  4. результат пихаем в массив
Silerus ★★★★
()
Ответ на: комментарий от Deleted

Плюсую. Там и понятно станет что можно использовать, а что нельзя.

turtle_bazon ★★★★★
()
Ответ на: комментарий от Deleted

А нахера препод требует Паскаль? Он до сих пор от 80-х годов не очнулся?

Отстаньте от препода, он что знает, то и требует. :)

sergej ★★★★★
()
Ответ на: комментарий от Silerus

Зачем так сложно? В условии этого нет.

def convert(val: str) -> list:
    x = ''
    result = []
    for ch in val:
        if not (ch == '-' or ch.isdigit()):
            if x:
                result.append(int(x))
                x = ''
        else:
            x += ch
    assert result and not len(result) % 2
    return [result[idx:idx+2] for idx in range(0, len(result), 2)]
KillTheCat ★★★★★
()
Ответ на: комментарий от wovoceg

мне препод говорит, что можно через pos,insert,delete

Он походу тебя домагается

goingUp ★★★★★
()
Ответ на: комментарий от KillTheCat

почему сложно - тупо в лоб, при условии что из паскаля я помню что к элементам строки можно обращаться как к массиву, и судя по гуглу там есть val() - тогда половину алгоритма можно выкинуть.

Silerus ★★★★
()

пффт


program SamShit;
Uses SysUtils;

begin
    writeln(StringReplace(StringReplace('(1;2) (-1;-2) (2;1) (-2;-1)', '(', '[', [rfReplaceAll]), ')', ']', [rfReplaceAll]));
end.

anonymous
()
Ответ на: комментарий от Silerus

Вообще тут работы минут на 20 с отладкой.

Не известно она это или он.

Тут интересно другое. Непонятно зачем им до сих пор паскаль.

Мне сейчас облом пилить завтра утром может запилю чтобы быстрее взбодриться.

HIS
()
Ответ на: комментарий от anonymous

Актуальное название программы для её контента :)

HIS
()
Ответ на: комментарий от HIS

Непонятно зачем им до сих пор паскаль.

1: потому что преподы только его и знают
2: потому что алгоритмы можно учить вообще не всем
3: паскаль годный язык, хоть и малопопулярный

anonymous
()

Проснёшься. Уточни ТЗ. Какого типа числа на выходе получить нужно. Плавающая точка должна быть?

HIS
()

cVal поведением похожа на Val, в том числе не допускает мусора после числа:

type
  TComplex = array [0..1] of Real;

function RTrim(const s: String): String;
var i: Integer;
begin
  i:=Length(s); while (i>0) and (s[i]<=' ') do Dec(i);
  RTrim:=Copy(s,1,i);
end;

procedure cVal(const s: String; var c: TComplex; var code: Integer);
{ Вход: "_*(_*ДействЧисло_*;_*ДействЧисло_*)" }
var t: TComplex; i, j: Integer;
begin
  i:=1;
  while (i<=Length(s)) and (s[i]<=' ') do Inc(i);
  if (i>Length(s)) or (s[i]<>'(') then begin
    code:=i; Exit;
  end;
  Inc(i); j:=Pos(';',s);
  Val(RTrim(Copy(s,i,j-i)),t[0],code);
  if code>0 then begin
    Inc(code,i); Exit;
  end;
  Inc(j); i:=Pos(')',s);
  Val(RTrim(Copy(s,j,i-j)),t[1],code);
  if code>0 then begin
    Inc(code,j); Exit;
  end;
  if i<Length(s) then begin
    code:=i+1; Exit;
  end;
  c:=t;
end;

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 2)
Ответ на: комментарий от anonymous

Обрисовал задачу и не предоставил ни одного решения.

anonymous
()
Ответ на: комментарий от anonymous

Тупняк неистовый конечно. Может Харальд и прав проводя свои тесты на киску. :)

HIS
()
Ответ на: комментарий от bormant

Я сейчас уже почти сплю и не сильно интерпретатором работаю. Облом идти запускать турбопаскаль на досбоксе.

HIS
()
Ответ на: комментарий от bormant

Нужно и на этом компе турбопаскаль 7 поставить...

HIS
()
Ответ на: комментарий от HIS

сейчас уже почти сплю и не сильно интерпретатором работаю

Ну как появится что по существу сказать, милости просим.

bormant ★★★★★
()

С таким обычно ходят на:
http://www.cyberforum.ru/pascal/

Не исключено, что поиск поможет прямо сразу.

PS. Если специально задачу разбирать на входе "( число ; число )" не ставили, то и решать ее не надо, вводите ваши комплексные числа парами через пробел и не забивайте голову всякой ерундой:

type
  TComplex: array [0..1] of Real;
var
  a: array [0..3] of TComplex;
...
  for i:=Low(a) to High(a) do
    for j:=Low(a[i]) to High(a[i]) do
      Read(a[i,j]);
  ReadLn;

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)

Вот, хоть без массива:

program HelloWorld;
uses sysutils;
var
str : string;
v1 : integer;
v2 : integer;
v3 : integer;
v4 : integer;
v5 : integer;
v6 : integer;
v7 : integer;
v8 : integer;
begin
    str := '(1;2) (-1;-2) (2;1) (-2;-1)';
    writeln(str);
    sscanf(str, '(%d;%d) (%d;%d) (%d;%d) (%d;%d)', [@v1, @v2, @v3, @v4, @v5, @v6, @v7, @v8]);
    writeln('(',v1,';', v2, ') ', '(', v3, ';', v4, ') (',v5,';', v6, ') (', v7, ';', v8, ')');
end.

https://rextester.com/OTH88403

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.