Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
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
|
|
![]() |
|
|
11:02:2008, 16:27
|
|
Гуру ![]() ![]() ![]() Группа: Достойный программист Сообщений: 301 Регистрация: 3:11:2007 Пользователь №: 13 517 Репутация: 0
|
|
|
Сообщение
#2
|
|
|
|
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
|
|
|
|
11:02:2008, 20:40
|
|
Гуру ![]() ![]() ![]() Группа: Достойный программист Сообщений: 301 Регистрация: 3:11:2007 Пользователь №: 13 517 Репутация: 0
|
по-моему корректнее будет поменять местами содержания строк, а не издеваться над указателями.
зы. и к чему ты продублировал код? |
|
Сообщение
#4
|
|
|
|
11:02:2008, 21:21
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 200 Регистрация: 17:05:2006 Из: Минск Пользователь №: 4 257 Специализация: .NET Репутация: 27
|
Для: gamecreator
Корректнее и быстрее поменять местами указатели.. Для: chipset Хочешь сохранять еще и номера строк - заведи структуру 2-х элементов - номера строки и указателя на содержимое. и сортируй не массив указателей на строчки, а массив структур. |
|
Сообщение
#5
|
|
|
|
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
|
|
|
|
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
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 08:25 |