Сортировка строк файла метод пузырька - C (СИ)
Формулировка задачи:
Вот код, который сортирует числа из файла numbers.txt методом пузырька :
Помогите его переделать, чтобы можно было сортировать строки из файла strings.txt.
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <math.h> #include <conio.h> int main(void) { int j,i,n,q; int *x=NULL; FILE *f=NULL; f=fopen("C:\\...\\numbers.txt","r"); if(!f) { printf("Cannot open\n"); return -2; } if(fscanf(f,"%d",&n)!=1) { printf("Cannot read\n"); return -1; } printf("n=%d\n\n",n); x=(int *)malloc(n*sizeof(int)); for(i=1;i<=n;i++) { if(fscanf(f,"%d",&x[i])!=1) { printf("Kol-vo elementov ne ravno n!\n"); return 1; } } for(i=1;i<=n;i++) printf("x[%d]=%d\n",i,x[i]); printf("\n"); for(i=1;i<=n;i++) for(j=1;j<=n-1;j++) if(x[j]>x[j+1]) { q=x[j]; x[j]=x[j+1]; x[j+1]=q; } for(i=1;i<=n;i++) { printf("x[%d]=%d\n",i,x[i]); } getch(); return 0; }
Решение задачи: «Сортировка строк файла метод пузырька»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #define INPUT_FILE_NAME "strings.txt" #define MAX_ROW_SIZE (1024) #define INIT_ROWS_NUMBER (32) int main(void) { FILE * fin; char ** rows, current[MAX_ROW_SIZE]; int i, j, count, reserved; if ( ! ( fin = fopen(INPUT_FILE_NAME, "r") ) ) { perror("fopen"); exit(1); } if ( ! ( rows = malloc(sizeof(char*) * INIT_ROWS_NUMBER) ) ) { perror("malloc"); if ( fclose(fin) ) perror("fclose"); exit(1); } reserved = INIT_ROWS_NUMBER; count = 0; while ( fgets(current, MAX_ROW_SIZE, fin) ) { if ( count == reserved ) { if ( ! ( rows = realloc(rows, sizeof(char*) * (reserved + INIT_ROWS_NUMBER)) ) ) { perror("realloc"); if ( fclose(fin) ) perror("fclose"); exit(1); } reserved += INIT_ROWS_NUMBER; } if ( ! ( rows[count] = malloc(strlen(current) + 1) ) ) { perror("malloc"); if ( fclose(fin) ) perror("fclose"); exit(1); } strcpy(rows[count++], current); } if ( ferror(fin) || fclose(fin) ) { perror("IOError"); exit(1); } printf("Unsorted:\n"); for ( i = 0; i < count; ++i ) printf("%s", rows[i]); for ( i = 0; i < count - 1; ++i ) { for ( j = i + 1; j < count; ++j ) { if ( strcmp(rows[j], rows[i]) < 0 ) { char * tmp = rows[i]; rows[i] = rows[j]; rows[j] = tmp; } } } system("pause"); printf("\n\nSorted:\n"); for ( i = 0; i < count; ++i ) printf("%s", rows[i]); system("pause"); for ( i = 0; i < count; ++i ) free(rows[i]); free(rows); exit(0); }
Объяснение кода листинга программы
Код считывает строки из файла, сохраняет их в массиве строк и сортирует этот массив методом пузырька.
- В начале подключаются необходимые библиотеки: stdio.h, stdlib.h и string.h.
- Определяются константы: имя файла для чтения (INPUT_FILE_NAME), размер каждой строки в файле (MAX_ROW_SIZE) и начальное количество строк в массиве (INIT_ROWS_NUMBER).
- Создаются переменные для работы с файлом и массивом:
- fin - указатель на файл для чтения;
- rows - указатель на массив указателей на строки;
- current - текущая считываемая строка;
- count - количество уже считаных строк;
- reserved - количество выделенных строк в массиве.
- Проверяется корректность открытия файла. Если файл не может быть открыт, выводится сообщение об ошибке и программа завершается.
- Массив rows инициализируется с помощью malloc(). Если выделение памяти не удалось, выводится сообщение об ошибке, закрывается файл и программа завершается.
- Создается цикл для считывания строк из файла до тех пор, пока не достигнут конец файла.
- Если количество строк в массиве достигло резервного значения, то массив расширяется с помощью realloc(). Если расширение массива не удалось, выводится сообщение об ошибке, закрывается файл и программа завершается.
- Каждая считанная строка сохраняется в массиве. Выделяется память под строку и сама строка копируется в выделенную память.
- После считывания всех строк проверяется корректность работы с файлом (ferror() и fclose()). Если были ошибки, выводится сообщение об ошибке и программа завершается.
- Выводится сообщение
Unsorted:
и все строки массива. - Создается вложенный цикл для сортировки массива методом пузырька.
- Если текущая строка больше следующей, то они меняются местами.
- После завершения вложенного цикла выводится сообщение
Sorted:
и все строки массива. - Все строки массива освобождаются с помощью free().
- Программа завершается с помощью exit().
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д