Есть программа, сортирующая слова в алфавитном порядке методом пузырька (BubbleSort). Считка и запись в текстовые файлы, их там три: 1й-исходный, 2й-промежуточный, и 3й-отсортированный. Все хорошо но никак не могу присобачить порядковые номера к каждой строчке..так чтобы во втором файле получилось! 1 шла 2 собака 3 по 4 роялю а в третем соответственно.. 3 по 4 роялю 2 собака 1 шла Код (Text): #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; } Очень буду благодарен если подскажете как реализовать!..
нужно при сравнении исключить номера из строк. Грубый пример, если номер строки имеет только один символ (и после него один пробел): Код (Text): if (strcmp(a[j-1] + 2,a[j] + 2)>0){
да хоть так!.. Код (Text): if (strcmp(a[j-1] + 5,a[j] + 5)>0){ трабл в том, что не могу записать в файл нумерацию!.. ничего лучше в голову не приходит.. Код (Text): void save(char **a,FILE *f){ int j,i=0; while(a[i]!=NULL){ fputs(a[i++],f); for (j=0; j<1000; j++) fputs(S[j],f); fputs("\n",f); }
Можно в первых двух байтах строки хранить порядковое число, которое задается при парсинге строк в первый раз, а потом делать сравнение уже со смещением + 2. типа того: Код (Text): #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] + 2,a[j] + 2)>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){ fprintf(f, "%d %s\n", *((short*)(a[i])), a[i] + 2); i++; } } int main(){ int size =10000; // размер массива слов (массива указателей на char) int str_size =512; // размер одной строки char **ar = new char*[size]; // выделяем память под массив указателей int i; for(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] + 2),token); *((short*)(ar[i])) = i + 1; 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; return 0; }
мы уже сместили на 2 в начале кода так что лучше записать так .. Код (Text): fprintf(f, "%d %s\n", *((short*)(a[i])), a[i]); ..но записывает нумерацию соотвеццно в байтовом виде!..
а ты попробуй запустить с a + 2 посмотри, что делает с ключами.. а потом с моим!.. Код (Text): #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; } 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", *((int*)(a[i])), a[i]); 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],token); 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(); } отож!..
Я вижу в твоем коде что ты выводишь первые 4 байта строки как число, а потом строку. Причем в тех самых 4 байтах лежит начало строки, ибо больше ничего ты туда не кладешь. В результате получается: 2.txt 14740472 шла -522064143 собака 61167 по -335548688 роялю 3.txt 61167 по 14740472 шла -522064143 собака -335548688 роялю если брать мою программу, без каких-либо изменений, выходит следующее: 2.txt 1 шла 2 собака 3 по 4 роялю 3.txt 3 по 4 роялю 2 собака 1 шла А теперь напрашивается вопрос: ты мой код вообще тестил? И если тестил то чего тебе в нем не нравится?
кому интересно..сортировка слов методом простых вставок=).. еще раз всем спасибо!.. Код (Text): #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; } //********************************************************************* //*****************************INSERT SORT **************************** //********************************************************************* void InsertSort(char **a,int razm) { int i, j; char* x; SetConsoleTitle("**********************INSERTSORT*********************"); for ( i=0; i < razm; i++) { // цикл проходов, i - номер прохода x=a[i]; for ( j=i-1; j>=0 &&(strcmp( a[j]+2, x+2)>0); j--) a[j+1] = a[j]; // сдвигаем элемент направо, пока не дошли // место найдено, вставить элемент a[j+1] = 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); InsertSort (ar,i); // Сортируем f = fopen("3.txt","w"); save(ar,f); fclose(f); cout<<"Нажмите для окончания ENTER!"; getchar(); } и еще..Кнут жжот!..