На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> сортировка по алфавиту в файле
    А число городов ограничено???

    Добавлено
    Вот код, который сортирует слова в строке по алфавиту:
    ExpandedWrap disabled
      #include<stdlib.h>
      #include<string.h>
      #include<stdio.h>
       
      void swap(char* a, char* b) /* ----- меняем местами две строки -----*/
      {
          int len = (strlen(a)>strlen(b))? strlen(a):strlen(b);// вычисление наиб. длины
          char * tmp = new char[len+1]; // хапнем пямяти
          strcpy(tmp,a);
          strcpy(a,b);
          strcpy(b,tmp);
          delete tmp;
      }
       
       
      void selectSort(char a[][10], long size) /* ----- Сортировка выбором ----- */
      {
              for(int i = 0; i <= size; i++)
                  for(int j = 0 ; j < size-i; j++)
                      if(strcmp(a[j],a[j+1])>0) // если a[j] > a[j+1] => меняем
                          swap(a[j],a[j+1]);
      }
       
      int main( void )
      {
          char words[30][10]; // тут будут находиться слова ( максимум 30 слов не длиннее 10 символов )
          char string[]="mame mama mamy"; // исходная строка...
       
          /* Просто strtok() изменяет переданную ей строку */
          char tmp[300];
          strcpy(tmp,string);
          /* --------------------------------------------- */
          
          char word_sort[300]; // тут будет строка со отсортированными по алфавиту словами
          char *word = new char[10]; // сюда будет записываться очередное слово
          int w = 0; // кол-во слов
              
          /* ----- Разбиваем строку на слова ------ */
          strcpy(words[0],strtok(tmp," "));
          while(word = strtok(NULL," "))
              strcpy(words[++w],word);
          /* -------------------------------------- */
          
          selectSort(words,w); // сортируем
       
          word_sort[0]='\0';
          
          for(int i = 0; i < w+1; i++) // склеиваем слова
          {
              strcat(word_sort,words[i]);
              strcat(word_sort," "); // добавляем пробел между словами
          }
          word_sort[strlen(word_sort)-1]='\0'; // убираем ненужный последний пробел
          
            
          printf("Ishodnaya stroka: %s\n", string);
          printf("Sortirovka : %s\n", word_sort);
          
         return 0;
      }


    Переделать думаю сможешь???? ;)
    А лучше всетаки STL юзать...
    Сообщение отредактировано: Jenizix -
      так ....а мне надо в одну строку все слова слить...не напомните...
        ExpandedWrap disabled
          #include <iostream>
          #include <conio.h>
          #include <windows.h>
          int mystrcmp(const void* ,const void*);
          void main(void){
              //читаем файл.
          HANDLE hFile=CreateFile("1.txt",GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
          if (hFile==INVALID_HANDLE_VALUE){
              std::cout << "CreateFile() error N" <<GetLastError();
              _getch();
              return;
          }
          HANDLE hFileMap = CreateFileMapping(hFile,0,PAGE_READONLY,0,0,0);
          if (hFileMap==NULL){
              std::cout << "CreateFileMapping() error N" <<GetLastError();
              _getch();
              CloseHandle(hFile);
              return;
          }
          const char* const rbuff = (char*)MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0);
          if (rbuff==NULL){
              std::cout << "MapViewOfFile() error N" <<GetLastError();
              _getch();
              CloseHandle(hFile);
              CloseHandle(hFileMap);
              return;
          }
          //!читаем файл
          //запихиваем строки в char**
          const int iFileSize=GetFileSize(hFile,0);
           
          char** SortMas=NULL;
          int SortMasLen=0;
          int sm=0;
          BOOL NoReadErrors=TRUE;
          while(1){
              int len;
                  for (len=0;;len++)  if (rbuff[sm+len]==' ' || sm+len ==iFileSize) break; // Добавь сюда свой символ разделитель.
                  if (len==0){
                      std::cout<<"bad file format";
                      NoReadErrors=FALSE;
                      break;
                  }
              SortMas=(char**)realloc(SortMas,sizeof(char*)*(++SortMasLen));
              SortMas[SortMasLen-1]=(char*)malloc(len);
              SortMas[SortMasLen-1][len]='\0';
              memcpy(SortMas[SortMasLen-1],rbuff+sm,len);
           
              if (sm+len==iFileSize) break;
              else sm+=len+1;
          }
          //!запихиваем строки в char**
          if (NoReadErrors){
              qsort(SortMas,SortMasLen,sizeof(char*),mystrcmp);
              for (int i=0;i<SortMasLen;i++){
                  std::cout << SortMas[i] << "\n";
              }
              //засовываем все в 1 строку.
              char* stroka;
              int len=0;
           
              for (int i=0;i<SortMasLen;i++){
                  len+=strlen(SortMas[i])+1;
              }
           
              stroka=(char*)malloc(len*sizeof(char));
              
              int sm=0;
              for (int i=0;i<SortMasLen;i++){
                  int curlen=strlen(SortMas[i]);
                  strcpy(stroka+sm,SortMas[i]);
                  stroka[sm+curlen]=' '; //поставь здесь свой символ разделитель.
                  sm+=curlen+1;
              }
              stroka[sm-1]='\0';
              //!засовываем все в 1 строку.
              std::cout << stroka;
          }
          UnmapViewOfFile(rbuff);
          CloseHandle(hFileMap);
          CloseHandle(hFile);
           
           
          _getch();
          }
          int mystrcmp(const void* s11,const void* s22){
          const char* s1 = (*(const char**)s11);
          const char* s2 = (*(const char**)s22);
           
          return strcmp(s1,s2);
          }


        Добавлено
        сортирует файл 1.txt , где слова записаны через пробел. Нужно стоб они были записаны через другой символ разделитель --> смотри коментарии к проге.
          ничего себе! не многовато ли?

          Добавлено
          А всё всё понял...спасибо.... :P

          Добавлено
          A чё он функции qsort не видит?она же стандартная?

          ExpandedWrap disabled
             qsort(SortMas,SortMasLen,sizeof(char*),mystrcmp);
            у меня все видит...
            воткни тогда еще
            <stdlib.h> and <search.h>
              ща... stdlib уже втыкал,...<searchпомогло....
              Я в долгу! :no: Спасибо .
                Цитата byte @
                lex Ferrum, твой код можно немного улучшить, используя конструктор, принимающий 2 итератора вместо конструктора по умолчанию. Тогда и один copy не надо использовать.

                Кстати, а как должен выглядить такой код? Если, например, так:
                ExpandedWrap disabled
                  std::set<std::string> m_Cities(std::istream_iterator<std::string>(file), std::istream_iterator<std::string>());

                То... тут существует маааааалеьнькая такая проблемка - он не сделает того, что от него ожидает программист. Внимание вопрос - почему :blink: :blink: ? (читавшие последнего Саттера - молчать!!! Дайте людям помучиться :) ).
                  Цитата Flex Ferrum @
                  Кстати, а как должен выглядить такой код? Если, например, так:

                  Ну почему же? Можно примерно так:
                  ExpandedWrap disabled
                    std::set<std::string> m_Cities((std::istream_iterator<std::string>(file)),
                    std::istream_iterator<std::string>());

                  - добавил дополнительные круглые скобки вокруг первого аргумента.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0331 ]   [ 16 queries used ]   [ Generated: 3.05.24, 09:14 GMT ]