Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сортировка пузырьком!
Форум программистов > Системное программирование > C, С++ и С Builder > C и С++ FAQ
chipset
Есть программа, сортирующая слова в алфавитном пиорядке методом пузырька (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;

}


Очень буду благодарен если подскажете как реализовать!..
gamecreator
Цитата(chipset @ 10:02:2008, 21:48 ) *
                x=a[j-1];
                a[j-1]=a[j];
                a[j]=x;

ты знаком с strcpy?
chipset
ну знаком..а што ты этим хотел сказать?..
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
gamecreator
по-моему корректнее будет поменять местами содержания строк, а не издеваться над указателями.
зы. и к чему ты продублировал код?
Pasha
Для: gamecreator
Корректнее и быстрее поменять местами указатели..
Для: chipset
Хочешь сохранять еще и номера строк - заведи структуру 2-х элементов - номера строки и указателя на содержимое. и сортируй не массив указателей на строчки, а массив структур.
chipset
спасибо ребята..учел и исправил..кому интересно вот код..

#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();
    }
MonitoR2
А разве метод максимального не быстрее, там хотябы сразу первый "крайний"находится на первой же внутренней петле. Конечно, сортируя 5 букавок ничего существенного, а вот если там структуры ........ штук 45 тыс .. :-)

Если будет нужен код на с/с++ или VB, пишите a_a_puchnin@mail.ru
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.