Автор: chipset 10:02:2008, 19:48
Есть программа, сортирующая слова в алфавитном пиорядке методом пузырька (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 11:02:2008, 16:27
Цитата(chipset @ 10:02:2008, 21:48 )

Код
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
ты знаком с strcpy?
Автор: chipset 11:02:2008, 17:24
ну знаком..а што ты этим хотел сказать?..
Код
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
Автор: gamecreator 11:02:2008, 20:40
по-моему корректнее будет поменять местами содержания строк, а не издеваться над указателями.
зы. и к чему ты продублировал код?
Автор: Pasha 11:02:2008, 21:21
Для: gamecreator
Корректнее и быстрее поменять местами указатели..
Для: chipset
Хочешь сохранять еще и номера строк - заведи структуру 2-х элементов - номера строки и указателя на содержимое. и сортируй не массив указателей на строчки, а массив структур.
Автор: chipset 20:02:2008, 18:14
спасибо ребята..учел и исправил..кому интересно вот код..
Код
#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 9:05:2008, 11:04
А разве метод максимального не быстрее, там хотябы сразу первый "крайний"находится на первой же внутренней петле. Конечно, сортируя 5 букавок ничего существенного, а вот если там структуры ........ штук 45 тыс .. :-)
Если будет нужен код на с/с++ или VB, пишите a_a_puchnin@mail.ru