Сортировка строк файла метод пузырька - 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().