Сортировка строк файла метод пузырька - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Вот код, который сортирует числа из файла numbers.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;
}
Помогите его переделать, чтобы можно было сортировать строки из файла strings.txt.

Решение задачи: «Сортировка строк файла метод пузырька»

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);
}

Объяснение кода листинга программы

Код считывает строки из файла, сохраняет их в массиве строк и сортирует этот массив методом пузырька.

  1. В начале подключаются необходимые библиотеки: stdio.h, stdlib.h и string.h.
  2. Определяются константы: имя файла для чтения (INPUT_FILE_NAME), размер каждой строки в файле (MAX_ROW_SIZE) и начальное количество строк в массиве (INIT_ROWS_NUMBER).
  3. Создаются переменные для работы с файлом и массивом:
    • fin - указатель на файл для чтения;
    • rows - указатель на массив указателей на строки;
    • current - текущая считываемая строка;
    • count - количество уже считаных строк;
    • reserved - количество выделенных строк в массиве.
  4. Проверяется корректность открытия файла. Если файл не может быть открыт, выводится сообщение об ошибке и программа завершается.
  5. Массив rows инициализируется с помощью malloc(). Если выделение памяти не удалось, выводится сообщение об ошибке, закрывается файл и программа завершается.
  6. Создается цикл для считывания строк из файла до тех пор, пока не достигнут конец файла.
  7. Если количество строк в массиве достигло резервного значения, то массив расширяется с помощью realloc(). Если расширение массива не удалось, выводится сообщение об ошибке, закрывается файл и программа завершается.
  8. Каждая считанная строка сохраняется в массиве. Выделяется память под строку и сама строка копируется в выделенную память.
  9. После считывания всех строк проверяется корректность работы с файлом (ferror() и fclose()). Если были ошибки, выводится сообщение об ошибке и программа завершается.
  10. Выводится сообщение Unsorted: и все строки массива.
  11. Создается вложенный цикл для сортировки массива методом пузырька.
  12. Если текущая строка больше следующей, то они меняются местами.
  13. После завершения вложенного цикла выводится сообщение Sorted: и все строки массива.
  14. Все строки массива освобождаются с помощью free().
  15. Программа завершается с помощью exit().

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5
Похожие ответы