Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 02.11.2021
Сообщений: 10

Как значение Length(list[i]) string, присвоить значение s[i,1] integer?

03.11.2021, 15:55. Показов 2248. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется прекрасная работающая программа:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
list:TStringList;
i:Integer;
begin
list :=TStringList.Create;
s :=Edit1.Text; //вводим предложение
    ExtractStrings([';', ',','.','?','!',':',' '], [' '], PChar(s), list); // с учетом возможных разделителей
        Memo1.Lines.Add('Количество слов: '+IntToStr(list.Count));
 
        Memo1.Lines.Add('');
    for i := 0 to list.Count-1 do
    Memo1.Lines.Add('Длина '+IntToStr(i+1)+'-го слова = '+IntToStr(Length(list[i])));
    list.Free;
    end;
Эта программа считает и кол-во слов, введенных в TEdit, и кол-во букв в каждом слове. Но далее Length(list[i]) string, не присваивается к значению s[i,1] и даже если бы было значение s[i], обнуляются все значения цикла для s[i,1].
Хотя list.Count, также является string, но присваивается для значения integer, и продолжает иметь не обнулённое значение.
Как сделать, чтобы значение Length(list[i]) string присваивалось после цикла?
Или может быть нужен другой модуль для подсчёта кол-ва букв в каждом слове.
Но может быть можно что-то поменять в данном варианте, чтобы значения не обнулялись после цикла подсчета кол-ва букв в каждом слове. Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.11.2021, 15:55
Ответы с готовыми решениями:

Как достать значение из List<List<string>>
Есть JSON в котором лист в листе using System; using Newtonsoft.Json; using System.Collections.Generic; //using...

Как присвоить типу char значение string?
При выполнении строки w.at(1)=l; выдает error2440 cannot convert from std::string to char как перевести l в char или w.at в...

Как присвоить значение вектора string массиву?
Есть вектор строк string. В одном элементе вектора точно не больше 100 символов. Нужно разделить элемент вектора по символам массива. ...

10
0 / 0 / 0
Регистрация: 02.11.2021
Сообщений: 10
04.11.2021, 10:56  [ТС]
видимо я плохо пояснила мою проблему. Эта вставка не мой труд, но труд какого-то профессионала в программировании на Делфи.
Мой вопрос был в том, как может эта программа, или другая, не обнулять значения после просчёта букв в каждом слове.
Потому что если даже мне удаётся в delphi xe 5 присвоить s[i,1]:=Length(list[i]) string, то сохраняется только одно значение s[i,1], к примеру s[1,1] сохраняется, а остальные значения s[2,1] и т.д., равны нулю.
Так мой вопрос в том, как сделать, чтобы после цикла
for i := 0 to list.Count-1 do
Memo1.Lines.Add('Длина '+IntToStr(i+1)+'-го слова = '+IntToStr(Length(list[i])));
list.Free;
end;
все значения Length(list[i]) присвоенные к s[i,1], были сохранены? Участвовали в следующих расчётах?
Спасибо.
0
8 / 4 / 4
Регистрация: 20.10.2021
Сообщений: 11
04.11.2021, 12:35
Лучший ответ Сообщение было отмечено ar777 как решение

Решение

Цитата Сообщение от ar777 Посмотреть сообщение
Хотя list.Count, также является string, но присваивается для значения integer, и продолжает иметь не обнулённое значение.
Свойство Count возвращает количество, это целочисленный тип
Цитата Сообщение от ar777 Посмотреть сообщение
Но далее Length(list[i]) string, не присваивается к значению s[i,1]
Там происходит вывод на экран, а не присваивание
Цитата Сообщение от ar777 Посмотреть сообщение
Как сделать, чтобы значение Length(list[i]) string присваивалось после цикла?
Наверняка есть лучшее решение, но как вариант присвоить значение другому массиву после каждой итерации цикла
Pascal
1
2
3
4
5
6
for i := 0 to list.Count-1 do
    begin
    Memo1.Lines.Add('Длина '+IntToStr(i+1)+'-го слова = '+IntToStr(Length(list[i])));
    ar[i]:= length(list[i]);
    end;
    list.Free;
1
0 / 0 / 0
Регистрация: 02.11.2021
Сообщений: 10
04.11.2021, 19:49  [ТС]
Всё прекрасно, но, мне нужен цикл for i := 1 to Length(t) do

Если сделать как ниже, то просчет будет со 2-го слова, и расчет закончится.
Pascal
1
2
3
4
5
6
for i := 0 to list.Count-1 do
    begin
    Memo1.Lines.Add('Длина '+IntToStr(i+1)+'-го слова = '+IntToStr(Length(list[i])));
    s[i,1]:= length(list[i]);  
    end;
    list.Free;
Добавлено через 24 минуты
Всё прекрасно, но, мне нужен цикл for i := 1 to Length(t) do

Если сделать как ниже, то просчет будет со 2-го слова, и расчет закончится:
Pascal
1
2
3
4
5
6
for i := 1 to Length(t) do
begin
Memo1.Lines.Add('Длина '+IntToStr(i+1)+'-го слова = '+IntToStr(Length(list[i])));
s[i,1]:= length(list[i]);
end;
list.Free;
Или работает только с нулём данный цикл?
Или можно переделать для нормального цикла:
Pascal
1
for i := 1 to Length(t) do
Потому что иногда Делфи не воспринимает, что i:=0.
Спасибо.
0
8 / 4 / 4
Регистрация: 20.10.2021
Сообщений: 11
04.11.2021, 21:37
Лучший ответ Сообщение было отмечено ar777 как решение

Решение

Переменная s содержит введенное предложение в текстовое поле. Далее текст из s делится на слова и эти слова записываются в list. Теперь List это массив из слов.
Pascal
1
Memo1.Lines.Add('Длина '+IntToStr(i+1)+'-го слова = '+IntToStr(Length(list[i])));
Это выводит на экран номер элемента(слова) с помощью IntToStr(i+1), к i прибавляется 1 чтобы первый элемент массива был для пользователя под номером 1. Далее с помощью IntToStr(Length(list[i])) выводится количество символов очередного элемента массива, то есть количество букв слова. Это выводится на экран и затем идет следующая итерация цикла, то есть i и, соответственно, номер элемента и количество букв этого элемента(слова) меняется, в этом месте и нужно сохранить эти значения в другой массив, я так понял это вам и нужно. Логика программы примерно такая.
Цитата Сообщение от ar777 Посмотреть сообщение
Всё прекрасно, но, мне нужен цикл for i := 1 to Length(t) do
Если сделать как ниже, то просчет будет со 2-го слова, и расчет закончится:
for i := 1 to Length(t) do
begin
Memo1.Lines.Add('Длина '+IntToStr(i+1)+'-го слова = '+IntToStr(Length(list[i])));
s[i,1]:= length(list[i]);
Что такое t и что такое s[i,1] не понятно.
Было бы хорошо, если бы вы более точно сформулировали, что вам нужно

Добавлено через 8 минут
Цитата Сообщение от ar777 Посмотреть сообщение
Если сделать как ниже, то просчет будет со 2-го слова, и расчет закончится:
for i := 1 to Length(t) do
Потому что i:=1 в цикле значит отсчет со второго элемента(слова). Нужно i:=0
1
0 / 0 / 0
Регистрация: 02.11.2021
Сообщений: 10
05.11.2021, 12:24  [ТС]
Как я понимаю, сделать for i := 1 to Length(t) do не получится для :
Pascal
1
2
3
4
5
6
for i := 0 to list.Count-1 do
    begin
    Memo1.Lines.Add('Длина '+IntToStr(i+1)+'-го слова = '+IntToStr(Length(list[i])));
    s[i,1]:= length(list[i]);
    end;
    list.Free;
ах, какая жаль.

Добавлено через 1 минуту
слава Богу, что я стала инженершей, а не программисткой

Добавлено через 1 минуту
большое, огромное спасибо, что мне помогают. Вам также счастливым кто-то помогут.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
05.11.2021, 16:37
Цитата Сообщение от ar777 Посмотреть сообщение
стала инженершей
Счастья в браке.

Цитата Сообщение от ar777 Посмотреть сообщение
Но далее Length(list[i]) string, не присваивается к значению s[i,1] и даже если бы было значение s[i], обнуляются все значения цикла для s[i,1].
Вы вот тут чего сказать хотели?
На всякий случай, s: String, т.е. (грубо упрощенно для ShortString) s: array [0..255] of Char, количество измерений у этого массива ровно одно. Что такое s[i,1] -- элемент двумерного массива -- тайна сия пока велика есть.
Приоткроете завесу сей страшной тайны?

Добавлено через 10 минут
Смотрим дальше.
list: TStringList, угу, list[i] -- i-я строка в списке list, Length(list[i]) -- длина i-й строки из списка list, целое число между прочим. Куда ее нужно присвоить, какой целой переменной или какому целочисленному элементу массива или целочисленному полю записи/объекта/класса?
0
0 / 0 / 0
Регистрация: 02.11.2021
Сообщений: 10
05.11.2021, 17:01  [ТС]
for i := 1 to Length(t) do
Length(t) - это длина строки, куда как я понимаю выводятся слова. В принципе это стандартное выражение в Делфи, куда выводятся слова.
Мой расчёт не оканчивается на подсчёте букв в словах, расчёт продолжается. Дело в этом. как затем цифры складываются, это как говорится Бог дал. Там помощь не нужна.
За основу моего расчёта взят цикл for i := 1 to Length(t) do
но затем увидела прекрасное короткое решение подсчёта кол-ва слов и букв в каждом слове, которое уважаемые программисты дополнили очень здорово, но цикл начинается с for i := 0 to list.Count-1 do.
Так вот, иногда Делфи недоволен, что i:=0. Поэтому и был мой вопрос о том, можно ли сделать цикл не for i := 0 to list.Count-1 do,
а цикл for i := 1 to Length(t) do.
Т.к. в другом варианте работает именно цикл for i := 1 to Length(t) do, но там нет просчёта далее:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  str := Edit1.Text + ' '; //пробел для последнего слова
  for i := 1 to Length(Str) do
  begin
    inc(sym);
    case ord(Str[i]) of
      32:
        begin
          inc(sl);
ы[i,1]:=sym-1;
         Memo1.Lines.Add(IntToStr(sl) + ' слово ' + IntToStr(s[i,1]) + ' символов');
          sym := 0;
        end;
    end;
  end;
end;
s[i,1] - участвует далее в расчётах. Вот сколько слов, столько раз будет и значений s[i,1], в нужном кол-ве букв в каждом слове. Дальнейший расчёт готов, это всё есть.
Мне просто хочется понять, можно ли для лучшего короткого цикла с for i := 0 to list.Count-1 do, применить цикл for i := 1 to Length(t) do.
Благодарю вас.
0
8 / 4 / 4
Регистрация: 20.10.2021
Сообщений: 11
05.11.2021, 17:23
Цитата Сообщение от ar777 Посмотреть сообщение
Length(t) - это длина строки, куда как я понимаю выводятся слова
Это очень странная формулировка, согласно которой "слова выводятся в длину строки". Я не очень это понимаю. Вообще гвооря, функция Length возвращает длину переданной ей переменной в скобках, в данном случае это t, што, кстати, порождает еще больше вопросов, так как переменная t непонятно откуда взялась.
Цитата Сообщение от ar777 Посмотреть сообщение
Так вот, иногда Делфи недоволен, что i:=0. Поэтому и был мой вопрос о том, можно ли сделать цикл не for i := 0 to list.Count-1 do,
а цикл for i := 1 to Length(t) do.
можно или нет зависит от контекста, выложите весь код, может заодно узнаем , что такое t В чем и как именно проявляется недовольство Делфи?
Цитата Сообщение от ar777 Посмотреть сообщение
s[i,1] - участвует далее в расчётах. Вот сколько слов, столько раз будет и значений s[i,1], в нужном кол-ве букв в каждом слове
Сколько слов, столько и будет List[i], а s содержит текст, вводимый в текстовое поле, откуда у s двумерность?
Выложите весь код без пропусков
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
05.11.2021, 17:42
Лучший ответ Сообщение было отмечено ar777 как решение

Решение

Цитата Сообщение от ar777 Посмотреть сообщение
Pascal
1
for i := 1 to Length(t) do
потому как t у вас, скорее всего, типа String, первым символом строки является t[1], последним, соответственно, t[Length(t)]. Подобный цикл используют обычно, чтобы посмотреть на каждый из символов строки t[i].
Цитата Сообщение от ar777 Посмотреть сообщение
Pascal
1
for i := 0 to list.Count-1 do
Тут list у вас типа TStringList, в нем list.Count элементов, которые нумеруются от 0 до list.Count-1. Подобный цикл используют, чтобы посмотреть на каждый из элементов списка list.

Цитата Сообщение от ar777 Посмотреть сообщение
s[i,1] - участвует далее в расчётах.
Да пусть хоть песни поёт. Вот только в вашем примере написано, что s: String, другого s нам отсюда не видно, а значит, s[i] в принципе может существовать при допустимых значениях i, а s[i,1] не может существовать.
Вот тут-то вас и непонятно.

Смотрим на фрагмент в сообщении #8:
(1) взяли строку из Edit1, дополнили пробелом
(2) бежим по строке, если видим пробел, добавляем в Memo1 строчки: номер + ' слово ' + количество + 'символов'
Что там делает s[i,1], как объявлен и зачем нужен -- осталось далеко за кадром.
Покажете?

В стартовом сообщении вам предложили не резать строку на слова руками, а получить список слов в list: TStringList одним единственным вызовом
ExtractStrings([';', ',','.','?','!',':',' '], [' '], PChar(s), list);
а затем добавить в Memo1 те самые строчки: номер + ' слово ' + количество + 'символов', пробежав по готовому списку слов в list.
При этом слова у вас от list[0] до list[list.Count-1], а их длины, очевидно, Length(list[i]).

Показывайте уже, что там у вас в коде на самом деле, как объявлено то самое загадочное s.
Нет, оно наверняка у вас есть где-то там, вот только из-за одноименной локальной переменной s: String вот то ваше двумерное s внутри TForm1.Button1Click не видно (см. область видимости переменных).

Еще лучше -- привести заодно и задание целиком, чтоб уж не оставалось сомнений никаких.

Добавлено через 8 минут
Ну или если вопрос все-таки был, почему s[i,1]:=нечто приводит к сообщению об ошибке, то достаточно внутреннюю s переименовать как-то иначе.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  s: array [1..10,1..10] of Integer; { глобальный массив s }
 
procedure t1;
var
  s: String; { локальная переменная s }
begin
  {вот тут массив s был бы доступен, но по имени его не достать}
  {поскольку s означает локальную переменную (она "ближе") и из-за нее глобальная s не видна }
end;
 
procedure t2;
var
  ts: String;
begin
  {вот тут глобальный массив s доступен по имени }
end;
1
0 / 0 / 0
Регистрация: 02.11.2021
Сообщений: 10
06.11.2021, 13:59  [ТС]
Благодарю,
пока попробую сделать цикл for i := 0 to list.Count-1 do

Добавлено через 1 минуту
Благодарю,
попробую сделать в цикле for i := 0 to list.Count-1 do
может быть сегодня получится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.11.2021, 13:59
Помогаю со студенческими работами здесь

Как присвоить переменной типа string значение из textBox1?
Почему не работает данный код: string reg_FIO = textBox1-&gt;Text; ? Заранее спасибо.

Как присвоить переменной типа String значение argv[0]?
Как присвоить переменной типа String значение argv? Заранее спасибо =)

Как присвоить переменной типа string значение из файла
Название файла неизвестно, задается пользователем в командой строке при вызове программы. Т.е. Допусти, что мы присвоили переменной ...

Из XML считывать ключ/значение в List<string, string>
Привет, друзья. Помогите разобраться. Ничего полезного в интернете не нашел.. Нужно из XML попарно вывести ключ/значение в List. Фрагмент...

Метод Симпсона - попытка присвоить значение integer переменной типа real
Как исправить ошибку? В строке N2:= n/2; пишет попытка присвоить значение integer переменной типа real. Не могу понять что не так? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru