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

Можно код вставить в форматированном виде? Желательно, также привести полный код, чтобы можно было самому его запустить и посмотреть.

Project33.rar (10,0 КБ)

string нельзя ни явно, ни неявно преобразовать в char. Можно, например, попробовать взять первый символ строки s[1]

А, ещё можно System.Convert использовать

System.Convert.ToChar(' ').Print;

Только он выдаст исключение, если длина строки будет больше единицы.

  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;, однако, данный вариант признан устаревшим.