Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись чисел через тире или запятую, например 1 - 4, 6, 7, 10 - 15, 22 - 25 
:(
    Опции темы
avatara
Дата 22.11.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.5.2004

Репутация: нет
Всего: нет



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

Например есть массив чисел:
1, 2, 3, 4, 6, 7, 10, 11, 12, 13, 14, 15, 22, 23, 24, 25, 27, 29, 40, 41

В строку необходимо вывести:
1 - 4, 6, 7, 10 - 15, 22 - 25, 27, 29, 40, 41

Заранее благодарен, Алексей
PM MAIL   Вверх
LostSoul
Дата 22.11.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 26.5.2007

Репутация: нет
Всего: нет



itoa(Val,m_Buf,10) поможет преобразовать в строку, а потоместь уже у стринга  или сстринга есть оператор +=
PM MAIL   Вверх
Greeen
Дата 22.11.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 7
Всего: 18



Код

int array[] = { 1, 2, 3, 4, 6, 7, 10, 11, 12, 13, 14, 15, 22, 23, 24, 25, 27, 29, 40, 41 };
std::ofstream file("c:\\1.txt");
file << array[0] << '-' << array[3] << ',' << array[5] << ... // и так далее
file.close();



--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
avatara
Дата 22.11.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.5.2004

Репутация: нет
Всего: нет



Наверно я немного не так объяснил.  
Сами числа заранее неизвестны. 
и такой вариант:
Код

cout << array[0] << '-' << array[3] << ',' << array[5] << ... // и так далее

не пройдет.
Есть массив, который заполняется  любыми неповторяющимися числами.
Далее этот массив сортируется. 
И если, допустим, идут подряд числа "1,2,3,4",  то записываются как "1 - 4" (с 1 по 4)
те, которые на попадают в диапазон, записываются просто через запятую и так далее.

Еще один пример, на всякий случай
Есть EditBox1, EditBox2, ListBox, Button1, Button2
В EditBox1 вы вводите число и по нажатию Button1 число добавляется в ListBox 
и так много раз (числа все разные) 1, 2, 4, 3, 7, 6, 12, 14, 13, 10, 11, 15 и т.д. (и необязательно такие числа, могут быть совершенно другие в пределах unsigned int)
потом в ListBox числа сортируются и по нажатию Button2 в EditBox2 выводится уже запись следующего вида: 1 - 4, 6, 7, 10 - 15, 22 - 25, 27, 29, 40, 41

Вот и интересует, как осуществить проверку и подстановкутире и запятых там где это надо.
Спасибо.
PM MAIL   Вверх
ano360
Дата 22.11.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

Репутация: нет
Всего: нет



Помоему все просто:
Берёшь первое число массива-вставляешь в строку,если след число равно пред+1 и не fl-вставляешь тире и fl =труе
еспи след число равн пред+1 и fl ничего не делаешь,

если число не равно пред + 1 и fl вставляешь пред число,запятую и число,fl=false
Если число неравно пред+1 и не fl тогд запятую и число


--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
avatara
Дата 22.11.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.5.2004

Репутация: нет
Всего: нет



Проверьте пожалуйста:
Код

            m_str = " ";
    int kol;
    kol = m_list.GetCount();
    bool flag = FALSE;
    int prev, next;
    CString textprev, textnext, tempprev, tempnext;
    m_list.GetText(0, m_str);
    for (int i = 0; i < kol; i++)
    {
        m_list.GetText(i, textprev);
        m_list.GetText(i+1, textnext);
        prev = atoi(textprev);
        next = atoi(textnext);
        if (next == prev + 1 && flag == FALSE)
        {
            m_str = m_str + '-';
            flag = TRUE;
        } 
        else if (next == prev + 1 && flag == TRUE)
        {

        }
        else if (next != prev +1 && flag == TRUE)
        {
            tempprev.Format("%i", prev);
            tempnext.Format("%i", next);
            m_str = m_str + tempprev + ',' + tempnext;
            flag = FALSE;
        }
        else if (next != prev +1 && flag == FALSE)
        {
            tempnext.Format("%i", next);
            m_str = m_str + ',' + tempnext;
        }
        
    }

Программа вылетает с сообщением 
Debug  Assertion filed!
Programm: .......
File: ......../atlsimpstr.h
Line: 790


Expression nLength >= 0

Это сообщение отредактировал(а) avatara - 22.11.2007, 18:15
PM MAIL   Вверх
ASSERT
Дата 23.11.2007, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.10.2007

Репутация: нет
Всего: нет



avatara, это называется объединение - поиск:

Сортируем массив;
В цикле перебираем все элементы, пользуясь след формулой сравнения форматируем строку как нужно:

ЕСЛИ последующий член массива  равен предыдущий + 1 - объединяем его с предыдущим
( записываем в отдельный массив или другую структуру данных, назовем его ОБЪЕДИНЕНИЕ )
ИНАЧЕ 
 {
  выводим на экран первый и последний член ОБЪЕДИНЕНИЯ ( если он один, то, естественно, только    первый );
  очищаем объединение и продолжаем в том же духе далее
}

Если не получится реализовать - спрашивай, напишу в коде 
PM MAIL ICQ   Вверх
avatara
Дата 23.11.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.5.2004

Репутация: нет
Всего: нет



Хотелось бы реализацию кода, не могу понять.  
Тут еще одна проблема. Если в самом конце списка идут допустим ...... 22, 23, 24, 25, 26
То не будет ли  Ошибкой условие -  Следущее == Предыдущее +1 
ведь после числа 26 уже нет других чисел (конец массива)
Тогда в каких пределах производить цикл:
от 0_го_элемента или от 1_го_элемента
и до
 Кол_во_элементов -1 или Кол_во_элементов


PM MAIL   Вверх
ASSERT
Дата 23.11.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.10.2007

Репутация: нет
Всего: нет



Код


void main()
{  
  int array[] = { 1, 2, 3, 4, 5, 6, 7, 9, 10, 15, 21, 22, 23, 25, 27, 28, 29, 30, 31, 33, 35, 36, 37, 38 };
  int size = sizeof( array ) / sizeof( int ); // размер массива
  
  int first = array[0], last = array[0];

  char *buff = new char[ 10 ]; // сюда форматируем временную строку
  char *outstr = new char[size * 2];// буфер для конечной строки
  outstr[0] = '\0';

  for( int i = 1; i < size; ++i  )// главный цикл
  {
    if( array[i] == array[i - 1] + 1 )
    {
      last = array[i];
    }
    else
    {
      if( first != last )
        sprintf( buff, "%d - %d, ", first, last );
      else
        sprintf( buff, "%d, ", first );
      
      strcat( outstr, buff );

      first = array[i];
      last = array[i];
    }
  }
  printf( "%s\n", outstr );  
  delete[] buff;
  delete[] outstr;
  system( "pause" );
}



Обрати внимание, что главный цикл начинается с 1 , а не с 0.

От массива с ОБЪЕДИНЕНИЕМ ушел, ввел две переменные first и last - так будет лучше.

И вообще, может, кто-нибудь предложит лучше ;))

Это сообщение отредактировал(а) ASSERT - 23.11.2007, 18:54
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0768 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.