7.7 массив

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем LapEV, 16 апр 2010.

  1. TopicStarter Overlay
    LapEV
    Offline

    LapEV

    Регистрация:
    24 ноя 2009
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Подскажите, пожалуйста, как в одномерном массиве подсчитать количество одинаковых элементов? допустим: массив 123221112 сколько будет "2",сколько "3"?
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    СтрЧислоВхождений(<СтрИсточник>,<СтрПодстрока>)
    Назначение:
    Возвращает число вхождений строки шаблона поиска в строку поиска.
    Параметры:
    <СтрИсточник> - строка в которой ищем (место поиска);
    <СтрПодстрока> - строка которую ищем (шаблон поиска).
    Код:
    МассивСтр="123221112";
    СтрЧислоВхождений(МассивСтр,"3");
    //вернет 1
    СтрЧислоВхождений(МассивСтр,"2");
    //вернет 4
    
    
  3. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Обратите внимание, что это операции для работы со строковыми переменными. Я подозреваю, что массив заполнен отнюдь не символами.
  4. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Думаю, тут надо подробнее.... Имхо массивы в семерке - извращение.

    От куда и что такое этот массив?
  5. dedalx7
    Offline

    dedalx7 Опытный в 1С

    Регистрация:
    20 май 2009
    Сообщения:
    97
    Симпатии:
    0
    Баллы:
    26
    Ненормальные вроде меня - обожающие многомерные массивы - могут сделать следующее:

    Код:
    Перем Массив[100];
    
    Процедура Подсчет()
    
    ТабСлужебная = СоздатьОбъект("ТаблицаЗначений");
    ТабСлужебная.НоваяКолонка("Значение");
    ТабСлужебная.НоваяКолонка("КвоВхождений", "Число", 3, 0);
    
    Для Индекс = 1 По 100 Цикл
    
    СтрТаб = ПолучитьПустоеЗначение();
    
    Если ТабСлужебная.НайтиЗначение(Массив[Индекс],СтрТаб,"Значение") = 1 Тогда
    ТабСлужебная.НайтиСтрокуПоНомеру(СтрТаб);
    Иначе
    ТабСлужебная.НоваяСтрока();
    ТабСлужебная.Значение = Массив[Индекс];
    ТабСлужебная.КвоВхождений = 0;
    КонецЕсли;                        
    
    ТабСлужебная.КвоВхождений = ТабСлужебная.КвоВхождений + 1;
    
    КонецЦикла;                                               
    КонецПроцедуры
    
    Таким образом мы получаем отличную таблицу, из которой удобно брать статистику.
  6. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Ну тогда специально для "ненормальных" :unsure:

    Код:
    Перем Массив[100];
    
    Процедура Подсчет()
    
    Значения = СоздатьОбъект("СписокЗначений");
    
    Для Индекс = 1 По 100 Цикл
    
    Если ПустоеЗначение(Массив[Индекс]) = 0 Тогда
    Значения.Установить(Массив[Индекс], 1 + Значения.Получить(Массив[Индекс]));
    КонецЕсли;
    
    КонецЦикла;                                               
    КонецПроцедуры
    
  7. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    массив в 7 это действительно извращение..) тем более что с виду это не "многомерный" массив, а одномерный)
    одномерный массив для 7 это Список значений ;)
  8. dedalx7
    Offline

    dedalx7 Опытный в 1С

    Регистрация:
    20 май 2009
    Сообщения:
    97
    Симпатии:
    0
    Баллы:
    26
    Под "многомерным" я имел ввиду Таблицу Значений. Если зреть в корень - это усовершенствованый двухмерный массив. А если вложить одну в другую получиться и трех- и четырехмерный... Последний я, правда, никогда не рисковал создавать.
  9. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    А я делал. Очень удобно, при условии понимания что делаешь.
  10. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    ммм.. 3х-мерный это СЗ в ТЗ, 4х - ТЗ в ТЗ...)
  11. dedalx7
    Offline

    dedalx7 Опытный в 1С

    Регистрация:
    20 май 2009
    Сообщения:
    97
    Симпатии:
    0
    Баллы:
    26
    Мдя, был неправ. Переклинило что-то.

    Оказывается я тоже ;) Действительно удобно.
  12. Alekto86
    Offline

    Alekto86

    Регистрация:
    29 ноя 2010
    Сообщения:
    1
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте. Помогите пожалуйста. Есть задачка. Дан одномерный числовой массив, нужно его перестроить так, чтобы сначала шли отрицательные числа, нули и положительные. Менять порядок следования внутри отрицательных чисел, нулей и положительных нельзя. Очень хотелось бы реализовать это через массив, но он у меня не заполняется.
    Код:
    Перем Массив[30];
    Процедура ОбработкаПроведения() 
    
    Значения = СоздатьОбъект("СписокЗначений");
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 цикл
    Значения.ДобавитьЗначение(Темпиратура);
    КонецЦикла;            
    
    Для Индекс = 1 По 30 Цикл
    Массив[Индекс]=Массив[30];       
    Если ПустоеЗначение(Массив[30]) = 0 Тогда
    Значения.Установить(Массив[30], 1 + Значения.Получить(Массив[30]));
    КонецЕсли;
    
    КонецЦикла;    
    КонецПроцедуры
    
    Что я не так делаю??? :angry:
  13. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    вообще непонятно.. что это?
    откуда данные в массив попадают?

    Код:
    Процедура Вар()
    Значения = СоздатьОбъект("СписокЗначений");
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 цикл
    Значения.ДобавитьЗначение(Темпиратура);
    КонецЦикла;
    Значения.Сортировать();
    КонецПроцедуры
    
    Процедура ВарКривойБезСортировки()
    ЗначенияНуль = СоздатьОбъект("СписокЗначений");
    ЗначенияПлюс = СоздатьОбъект("СписокЗначений");
    Значения = СоздатьОбъект("СписокЗначений");
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 цикл
    Если Температура>0 Тогда
    ЗначенияПлюс.ДобавитьЗначение(Температура);
    ИначеЕсли Температура=0 Тогда
    ЗначенияНуль.ДобавитьЗначение(Температура);
    Иначе
    Значения.ДобавитьЗначение(Температура);
    КонецЕсли;
    КонецЦикла;
    Для i = 1 По ЗначенияНуль.РазмерСписка() Цикл
    Значения.ДобавитьЗначение(ЗначенияНуль.ПолучитьЗначение(i));
    КонецЦикла;
    Для i = 1 По ЗначенияПлюс.РазмерСписка() Цикл
    Значения.ДобавитьЗначение(ЗначенияПлюс.ПолучитьЗначение(i));
    КонецЦикла;	
    КонецПроцедуры
    
    а "массивами" мыслить сложнова-то.. :(
  14. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Я думаю, делать надо по такому алгоритму: Создаете новый массив, пробегаете по массиву три раза, на первом прогоне переписываете в новый массив отрицательные, на втором нулевые и на третьем положительные. Можно обойтись и двумя прогонами, если схитрить и считать что нулевые значения все равно в каком порядке ставить, тогда на первом прогоне считаем количество нулевых элементов и после первого прогона их добавляем в массив.
  15. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    Код:
    Процедура ВарКривойМассивБезСортировки()
    Перем Массив[30];
    i = 0;
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 цикл
    Если Температура<0 Тогда
    i = i + 1;
    Массив[i]  = Температура;
    КонецЕсли;
    КонецЦикла;
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 цикл
    ИначеЕсли Температура=0 Тогда
    i = i + 1;
    Массив[i]  = Температура;
    КонецЕсли;
    КонецЦикла;
    ВыбратьСтроки();
    Пока ПолучитьСтроку()>0 цикл
    ИначеЕсли Температура>0 Тогда
    i = i + 1;
    Массив[i]  = Температура;
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
    
    
    как-то так.. хотя три цикла - это плохо
  16. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    ну, и, пожалуй, такой вариант..

    Код:
    Процедура ВарСОднимЦикломИТЗ()
    oVT = CreateObject("ValueTable");
    oVT.InsertCollumn("Value");
    oVT.InsertCollumn("NumStr");
    oVT.InsertCollumn("SortMark");
    SelectLines();
    While GetLine() = 1 Do
    oVT.NewLine();
    oVT.Value = Температура;
    oVT.NumStr = LineNum;
    oVT.SortMark = ?(Температура>0,3,?(Температура=0,2,1));
    EndDo;
    oVT.Sort("SortMark,NumStr");
    oList = CreateObject("ValueList");
    oVT.Unload(oList,,1);
    КонецПроцедуры    
    
    
  17. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Все.
    Сложно сказать, что делает приведенный кусок кода? От куда он?

Поделиться этой страницей