Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2018, 17:59   #1
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
Счастье Заполнение массива строкового типа

Здравствуйте!
Подскажите пожалуйста, почему выходит такая ошибка?:

Код:
               if(sequence[i] = '')then sequence[i] := inttostr(curNumber)
                        else
                           begin
                                masStr:= sequence[i]+', '+inttostr(curNumber);
                               sequence[i] := masStr;
                           end;
Изображения
Тип файла: jpg error.jpg (99.1 Кб, 159 просмотров)
Женя32 вне форума Ответить с цитированием
Старый 03.08.2018, 21:21   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

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

попробуйте выполнить рекомендованное ниже
http://www.programmersforum.ru/showp...34&postcount=4
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 03.08.2018, 22:16   #3
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
Счастье

Цитата:
Сообщение от evg_m Посмотреть сообщение
для ответа НЕТ данных
ни размера массива
ни используемого диапазона индексов

попробуйте выполнить рекомендованное ниже
http://www.programmersforum.ru/showp...34&postcount=4
Код:
const masCount = 100;
var
masStr: string;
 mas: array[1..masCount] of integer;
 sequence: array[1..masCount] of string;
........
      Inc(mas[curNumber]);
                        if(sequence[i] = '')then sequence[i] := inttostr(curNumber)
                        else
                           begin
                                masStr:= sequence[i]+', '+inttostr(curNumber);
                               sequence[i] := masStr;
                           end;
Женя32 вне форума Ответить с цитированием
Старый 04.08.2018, 02:46   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

2 Женя32
Для нормального понимания сути проблемы и для ответа на вопрос по прежнему нет данных.
northener вне форума Ответить с цитированием
Старый 04.08.2018, 15:26   #5
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
Счастье

Цитата:
Сообщение от northener Посмотреть сообщение
2 Женя32
Для нормального понимания сути проблемы и для ответа на вопрос по прежнему нет данных.
var
s: integer;
Sequence: array[1..x] of String;
.....
s:=7;
Sequence[10] = "5", как в sequence[10], к "5" добавить "7"? чтобы получилось так: sequence[10] = "5, 7".

Вот так выскакивает ошибка:
Код:
     .....
                                 sequence[i]:= sequence[i]+', '+inttostr(s); 
                       ...
Женя32 вне форума Ответить с цитированием
Старый 05.08.2018, 14:27   #6
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
Счастье

Цитата:
Сообщение от northener Посмотреть сообщение
2 Женя32
Для нормального понимания сути проблемы и для ответа на вопрос по прежнему нет данных.
В файле находятся цифры, к примеру, от 1 до 1000, записаны в разном порядке, и они повторяются: 100, 5, 410, 30, 40, 5, 320, 40, 50, 5, 512, 410 и т.д.

Задача:
Вычислить, например, какая по-счету первое и второе число "5" от начало файла. В данном примере число "5" занимает 2-е, 6-е и 10-е место от начало файла.
Вопрос, как программно определить значения?: 2-е, 6-е и 10-е .

Идея решения этой задачи:

Есть программа, которая находит какое-то число в файле, с нова возьмем за пример, число "5", ищет соответствующий номер элемента массива и увеличивает его на единицу, так мы узнаем количества каждого числа, например от, 100 до 1000. в файле может быть 121,352, 121,512,352 и т.д. Дак вот, идея вот какая:

Когда программа доходит до числа "5" или "7" и т.д., в цикле она начинает искать 5-й или 7-й элемент массива и увеличивает его на единицу.
Зная это, можно сделать следующее:

Завести массив типа string:

Код:
const masCount = 1000;
var
 mas: array[1..masCount] of integer;
 sequence: array[1..masCount] of string;
begin
И складывать туда значения из массива типа integer, естественно, предварительно пропустив через функцию IntToStr.
Т.е., как-только функция inc(); отработала, сражу же берем значение i - индекс массива mas[i], оно же найденное число, и записываем в sequence[i];

Код:
                  
             if (curNumber>0) and (curNumber<=masCount)  then
                      begin
                        Inc(mas[curNumber]);
                        if(sequence[i] = '') then sequence[i]:= inttostr(mas[i])+', ' // Если в индексе sequence[i] ничего нет, заносим содежимое индекса inttostr(mas[i]
                        else
                          begin
                           sequence[i]:= sequence[i]+inttostr(mas[i])+', '; Иначе, добавляем к тому, что содержится  sequence[i] 
                          end;
                      end

Последний раз редактировалось Женя32; 05.08.2018 в 14:30.
Женя32 вне форума Ответить с цитированием
Старый 05.08.2018, 15:26   #7
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Цитата:
Сообщение от Женя32 Посмотреть сообщение
В файле находятся цифры, к примеру, от 1 до 1000, записаны в разном порядке, и они повторяются: 100, 5, 410, 30, 40, 5, 320, 40, 50, 5, 512, 410 и т.д.

Задача:
Вычислить, например, какая по-счету первое и второе число "5" от начало файла. В данном примере число "5" занимает 2-е, 6-е и 10-е место от начало файла.
Вопрос, как программно определить значения?: 2-е, 6-е и 10-е .
Код:
const str='100, 5, 410, 30, 40, 5, 320, 40, 50, 5, 512, 410';
      n=5;
var i,k,d:integer;
    s:string;
begin
   s:='';
   k:=1;
   d:=Length(IntToStr(n));
   For i:=1 to Length(str)-d do
   begin
      If (Copy(str,i-2,d+4)=', '+IntToStr(n)+', ') or (i<3) and
         (Copy(str,i,d+2)=IntToStr(n)+', ') then
      begin
         If s<>'' then
            s:=s+', ';
         s:=s+IntToStr(k);
      end;
      If Copy(str,i,2)=', ' then
         Inc(k);
   end;
   Writeln(s);
   Readln;
end.
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]

Последний раз редактировалось newerow1989; 05.08.2018 в 15:30.
newerow1989 вне форума Ответить с цитированием
Старый 05.08.2018, 19:28   #8
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
Счастье

Цитата:
Сообщение от newerow1989 Посмотреть сообщение
Код:
const str='100, 5, 410, 30, 40, 5, 320, 40, 50, 5, 512, 410';
      n=5;
var i,k,d:integer;
    s:string;
begin
   s:='';
   k:=1;
   d:=Length(IntToStr(n));
   For i:=1 to Length(str)-d do
   begin
      If (Copy(str,i-2,d+4)=', '+IntToStr(n)+', ') or (i<3) and
         (Copy(str,i,d+2)=IntToStr(n)+', ') then
      begin
         If s<>'' then
            s:=s+', ';
         s:=s+IntToStr(k);
      end;
      If Copy(str,i,2)=', ' then
         Inc(k);
   end;
   Writeln(s);
   Readln;
end.
newerow1989, Спасибо за ответ, вы все правильно поняли, НО! n не должна быть константой, т.к. нужно вычислить позицию всех чисел.

Посмотрите вверху код, который встретив какое-то число в файле data.txt, запускает цикл перебора массива, в процессе этого цикла находит индекс по этому числу и, с помощью inc, увеличивает значение индекса на единицу, - так мы узнаем сколько раз встречается каждое число.
Чтобы узнать позицию каждого числа, относительно первого, нужно создать array of string, и когда произойдет увеличение значения какого-то элемента массива, сразу же записать номер этого индекса в другой массив, строкового типа, в такой же номер элемента массива. Так мы получаем позицию каждого числа относительно первого.
КАК УЗНАТЬ, В КАКОМ ИНДЕКСЕ ТОЛЬКО ЧТО УВЕЛИЧИЛОСЬ ЗНАЧЕНИЕ?
Код:
 if (curNumber>0) and (curNumber<=masCount)  then
                      begin
                        Inc(mas[curNumber]);
                        if(sequence[i] = '') then sequence[i]:= inttostr(mas[???])+', ' 
                        else
                          begin
                           sequence[i]:= sequence[i]+inttostr(mas[?????])+', ';
                          end;
                      end;
Женя32 вне форума Ответить с цитированием
Старый 06.08.2018, 10:20   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

что есть i ? как и где оно вычисляется? Во всех этих
Цитата:
Код:
sequence[i]
судя по стоическому молчанию оно НЕ ЗАДАНО.
то что оно было ранее использовано в качестве переменной цикла, НИКАКОЙ роли в данном куске кода не играет(никак не влияет на его значения, или даже влияет "отрицательно" (гарантирует его неправильное значение).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 06.08.2018, 10:38   #10
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
По умолчанию

Всем большое спасибо! Задача решена!!!!!!
Женя32 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ строкового типа smaiq Общие вопросы C/C++ 1 25.12.2012 18:32
Заполнение массива строк типа char. KuckaMAXHATKA Помощь студентам 3 15.02.2011 21:21
Заполнение массива типа char. KuckaMAXHATKA Общие вопросы C/C++ 1 15.02.2011 18:07
переменная строкового типа Rustamel Microsoft Office Excel 4 19.04.2010 17:53
Файлы строкового типа (ПАСКАЛЬ) sir.andrey Помощь студентам 1 09.12.2009 14:33