Помощь новичкам

  1. @ahtam, первый символ строки при наличии директивы {$string_nullbased+} будет 0-евым её элементом. Если же использована {$string_nullbased-}, то эффект противоположный, и индексация начинается с 1-цы. По умолчанию (без явного указания данных директив) используется индексация с 1-цы. Дополнительную информацию о директивах компилятора можно посмотреть в: Справка > Справочник по языку > Директивы компилятора.

  2. Если ничего не вводить в поле, то Ваша программа упадёт с ошибкой: Unit1.pas(30) : Ошибка времени выполнения: Индекс находился вне границ массива. Требуется проверка на выход индекса за границы строки:

procedure Form1.button1_Click(sender: Object; e: EventArgs);
begin
  var  c:=textbox1.Text;
  if c.Length < 1 then
    exit;
  
  label1.Text := c[1];
end;

, но лучше не молча обрабатывать ошибочные случаи ввода, а сообщать пользователю об этом. Ниже приведены ссылки, по которым Вы можете узнать как это делать.

Ссылки:

Очень интересная информация.

Приятно было узнать, что она оказалась интересной кому-то.

Только что понял что форум выдал мне права переноса даже админских тем в другие разделы (раньше только созданные не_админами разрешало). И вот помнится эту тему хотели перенести в раздел паскаля, но @Admin не нашёл как…

Остаётся только вопрос - стоит ли это делать? Эту тему не отображает если с сайта перейти на форум, потому что она находится в разделе разное. Но в самоволку это делать не очень хочется.

1 лайк

Вау… очередной админ…))))))

Думаю, надо.

Все указанные вами способ я уже до этого экспериментировал, использовал другие функции COPY, SUBSTR, … Но результата для меня то, чтобы можно было затем использовать другие функции, например ord. label1.Text := ord(c[1]) или другая форма вҷдаёт тоже самую ошибку.

Потому что типы надо преобразовывать! Copy и s.Substring возвращают строку, а не символ. А вот Convert.ToChar или обращение к символу через индексатор строки как раз вернёт char. Обратно присвоить строке символ вроде можно без преобразований, там есть неявное приведение Но если так нужно, можно использовать c.ToString.

Во первых, спасибо Всем, кто оказал помощь и написал комментарий. Во вторых, сделал его чуть по другому и получилось. Project33.rar (11,2 КБ)

Ну и зачем вы преобразовываете всё в массив, когда вам надо только взять 1 символ? Если делать так - то просто textbox1.Text[1].

Спасибо Сергей за консультации.

Часто переключаюсь между языками программирования и довольно часто попадается задачка по переворачиванию числа Х без строк/символов на подобии

if x=0...
if x<0 then begin минус:=true; x:=abs(x) end;
...
  var y := 0;

  while x > 0 do
  begin
    y := (y * 10) + (x mod 10);
    x := x div 10;
  end;
// if минус then y:=-y;

где нужно учитывать как переполнение, так и запятую.

Но вот как можно упростить

var i := pi.ToString.Reverse;

чтобы возвращало не перечисление через foreach var v in i do write(v), а просто строку ? Предопределение i:string:=… естественно выбивает ошибку, а i:=string(…) молча очищает консоль, игнорируя следующую строку println(i,i.Length)

.JoinIntoString(’’) или определить метод Reverse для строки

Это звучит странно, как будто вы недотестировали. Приведите код, потому что должно выводить ошибку а не консоль очищать.

А вот что касается реализации:

У метода с Array.Reverse, похоже, лучший баланс простоты и скорости.

1 лайк

Собственно, текст в те две строки между begin-end.

Результаты отличаются: особенности конкретной версии Net, архитектуры и ОС ? В PascalABC Net также ?

Как привести хотя бы в функцию:

Function Rev(x:string)Lstring;
begin
 var arr:= x.ToCharArray();
 &Array.Reverse(arr);
 // return new string(arr); // <-- ошибка
end;

Насколько и как отличаются?

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

Для возврата значения из функции или метода (без применения var параметров) в PascalABC.NET можно использовать один из способов:

  1. Result := returnValue;
  2. FunctionName := returnValue;, однако, данный вариант признан устаревшим.

А теперь по русски, не проглатывая 70% своей мысли.

На это по крайней мере неприятно смотреть. Ну если уже лень открывать редактор чтоб в нём набрать, откомпилировать и скопировать сюда - компилируйте хотя бы в уме.

Даже если вы не знаете что такое return, если не можете догадаться что делать с полученным new string - поможет уже только морг.

Если я правильно понял машинный перевод, у разных пользователей результаты отличаются и у одних быстрее Array, у других StringBuilder, а у третьих разница непринципиальна. В статье на stackoverflow указано иначе ?

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

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

1 лайк

Смотрите ещё на размер строк, это много на что влияет. Что вижу я - в той теме на StackOverflow слишком разорванные данные, некоторые тесты были для больших, некоторые для маленьких строк. А в некоторых вообще не сказали какой размер.

Ну, могу предположить что дело в первую очередь в версии .Net . Потому что раньше StringBuilder работал точно так же как List<char>, за исключением пары полюшек. А сейчас у него внутри вроде как связный список, в котором каждая следующая нода - содержит array of char, размером в 2 раза больше массива предыдущей ноды.

Вот только если указать размер буфера при создании StringBuilder - и раньше и сейчас создаётся всего 1 внутренний массив, сразу правильного размера. Поэтому если указывать размер - разницы скорости между Array.Reverse и StringBuilder практически не должно быть (единственное - StringBuilder сразу заполняется в правильном порядке, а в случае с массивом надо ещё вызывать сам Array.Reverse).

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

Если переводить весь сайт программно - большая часть смысла всё равно теряется, даже если использовать что то лучше гугл переводчика.