Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Сортировка пузырьком!
chipset
Вставить ник
сообщение 10:02:2008, 19:48
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 6
Регистрация: 10:02:2008
Пользователь №: 15 274



Репутация: - 0 +


Есть программа, сортирующая слова в алфавитном пиорядке методом пузырька (BubbleSort). Считка и запись в текстовые файлы, их там три: 1й-исходный, 2й-промежуточный, и 3й-отсортированный. Все хорошо но никак не могу присобачить порядковые номера к каждой строчке..так чтобы во втором файле получилось!

1 шла
2 собака
3 по
4 роялю

а в третем соответственно..

3 по
4 роялю
2 собака
1 шла


Код
$this_var =


#include <iostream>
#include <windows.h>
#include <cstring>
using namespace std;

// сортировка пузырьком
void bubbleSort(char **a,int size) {
    int i, j;
    char* x;

    for( i=0; i < size; i++) {            // i - номер прохода
        for( j = size-1; j > i; j-- ) {     // внутренний цикл прохода
            if (strcmp(a[j-1],a[j])>0){
                x=a[j-1];
                a[j-1]=a[j];
                a[j]=x;
            }
        }
    }
}

// Сохранение массива слов
void save(char **a,FILE *f){
    int i=0;
    // пока не встретим NULL пишем в файл
    while(a[i]!=NULL){
        fputs(a[i++],f);
        fputs("\n",f);
    }
}

void main(){
    int size =10000; // размер массива слов (массива указателей на char)
    int str_size =512; // размер одной строки
    char **ar = new char*[size]; // выделяем память под массив указателей
    for(int i=0;i<size;i++) // заполняем массив NULL_указателями
        ar[i] = NULL;// Изначально массив пустой
FILE *f = fopen("1.txt","r"); // открываем исходный файл
    i=0;
    char buf[128]; // под строку
    char *token; // вспомагательн для strtok в каждый укахатель адрес след ликсемы слаживать
    char sep[] =  " -,.!)(?:\ t\n\" "; // разделители
// пока не конец файла и не предел массива строк запоминаем строки в массив строк
    while(!feof(f) && i<size){
        fgets(buf,128,f);
        token = strtok(buf,sep);

        while(token!=NULL){// если нет след слова то 0 выход
            ar[i] = new char[54];
            strcpy(ar[i],token);
            i++;
            token = strtok(NULL,sep);
        }
        }

    


fclose(f); // закрываем исходный файл

f = fopen("2.txt","w");
    save(ar,f);
    fclose(f);

    bubbleSort (ar,i); // Сортируем
f = fopen("3.txt","w");
    save(ar,f);
    fclose(f);

// освобождаем память
    for(i=0;i<size;i++)
        delete ar[i];

    delete [] ar;

}


Очень буду благодарен если подскажете как реализовать!..
Подняться вверх 
 
Сообщение #1
 
Новая тема 
Ответов (1 - 6)
gamecreator
Вставить ник
сообщение 11:02:2008, 16:27
Цитата Ответить 


Гуру
***

Группа: Достойный программист
Сообщений: 301
Регистрация: 3:11:2007
Пользователь №: 13 517



Репутация: - 0 +


Цитата(chipset @ 10:02:2008, 21:48 ) *
Код
                x=a[j-1];
                a[j-1]=a[j];
                a[j]=x;

ты знаком с strcpy?
Подняться вверх 
 
Сообщение #2
chipset
Вставить ник
сообщение 11:02:2008, 17:24
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 6
Регистрация: 10:02:2008
Пользователь №: 15 274



Репутация: - 0 +


ну знаком..а што ты этим хотел сказать?..
Код
x=a[j-1];
a[j-1]=a[j];
a[j]=x;


Сообщение отредактировал chipset - 11:02:2008, 17:27
Подняться вверх 
 
Сообщение #3
gamecreator
Вставить ник
сообщение 11:02:2008, 20:40
Цитата Ответить 


Гуру
***

Группа: Достойный программист
Сообщений: 301
Регистрация: 3:11:2007
Пользователь №: 13 517



Репутация: - 0 +


по-моему корректнее будет поменять местами содержания строк, а не издеваться над указателями.
зы. и к чему ты продублировал код?
Подняться вверх 
 
Сообщение #4
Pasha
Вставить ник
сообщение 11:02:2008, 21:21
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 200
Регистрация: 17:05:2006
Из: Минск
Пользователь №: 4 257
Специализация: .NET



Репутация: - 27 +


Для: gamecreator
Корректнее и быстрее поменять местами указатели..
Для: chipset
Хочешь сохранять еще и номера строк - заведи структуру 2-х элементов - номера строки и указателя на содержимое. и сортируй не массив указателей на строчки, а массив структур.
Подняться вверх 
 
Сообщение #5
chipset
Вставить ник
сообщение 20:02:2008, 18:14
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 6
Регистрация: 10:02:2008
Пользователь №: 15 274



Репутация: - 0 +


спасибо ребята..учел и исправил..кому интересно вот код..

Код
#include <iostream>
#include <windows.h>
#include <cstring>
using namespace std;
       ostream &operator<<(ostream &obj, char *strWin)
{
    char strDos[255];
    CharToOem(strWin,strDos);
    obj.write(strDos,strlen(strDos));
    return obj;
}

//*********************************************************************
//*****************************BUBBLE SORT ****************************
//*********************************************************************
void bubbleSort(char **a,int razm) {
    int i, j;
    char* x;

        SetConsoleTitle("**************************Bubblesort**************************");

    for( i=0; i < razm; i++) {            // i - номер прохода
        for( j = razm-1; j > i; j-- ) {     // внутренний цикл прохода
            if (strcmp(a[j-1] + 2,a[j] + 2)>0){
                x=a[j-1];
                a[j-1]=a[j];
                a[j]=x;}}}}
// Сохранение массива слов
void save(char **a,FILE *f){
    int j,i=0;
        char S[255];
    while(a[i]!=NULL){
        fprintf(f, "%d %s\n", *((short*)(a[i])), a[i]+2);
        i++;
    }
}

void main(){
    int razm =10000; // размер массива слов (массива указателей на char)
    int str_razm =512; // размер одной строки
    char **ar = new char*[razm];
    for(int i=0;i<razm;i++)
        ar[i] = NULL;
FILE *f = fopen("1.txt","r");
    int i=0;
    char buf[128]; // под строку
    char *token; // вспомагательн для strtok в каждый указатель адрес след ликсемы слаживать
    char other[] =  " -,.!)(?:\ t\n\" "; // разделители
// пока не конец файла и не предел массива строк запоминаем строки в массив строк
    while(!feof(f) && i<razm){
        fgets(buf,128,f);
        token = strtok(buf,other);

        while(token!=NULL){// если нет след слова то 0 выход
            ar[i] = new char[54];
            strcpy(ar[i]+2,token);
                        *((short*)(ar[i])) = i + 1;
            i++;
            token = strtok(NULL,other);
        }
        }

fclose(f);

f = fopen("2.txt","w");
    save(ar,f);
    fclose(f);
    bubbleSort (ar,i); // Сортируем
f = fopen("3.txt","w");
    save(ar,f);
    fclose(f);

    cout<<"Нажмите для окончания ENTER!";
    getchar();
    }
Подняться вверх 
 
Сообщение #6
MonitoR2
Вставить ник
сообщение 9:05:2008, 11:04
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 4
Регистрация: 25:05:2007
Пользователь №: 11 046
Специализация: начинающий програмист. Владею VisualBasic ,С



Репутация: - 0 +


А разве метод максимального не быстрее, там хотябы сразу первый "крайний"находится на первой же внутренней петле. Конечно, сортируя 5 букавок ничего существенного, а вот если там структуры ........ штук 45 тыс .. :-)

Если будет нужен код на с/с++ или VB, пишите a_a_puchnin@mail.ru

Сообщение отредактировал MonitoR2 - 9:05:2008, 11:32
Подняться вверх 
 
Сообщение #7


Быстрый ответ  Ответить  Новая тема 

> Быстрый ответ
Полужирный
Курсив
Подчеркнутый
Вставить изображение
Смайлики
Цитата
Код
 
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись
   

 

RSS Текстовая версия Сейчас: 17:05:2008 - 08:25
с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net