Отсортировать массив, записанный в файле, методом Шелла (программа вылетает) - C (СИ)

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

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

Ребят, задача такая : написать прогу, которая отсортирует массив записанный в файле (первое число кол-во элементов массива) методом Шелла, но программа просто вылетает. Что нужно исправить?
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file; 
int i, j, k, t, N;
int *A;
int mas[100];
file = fopen("C:/c/output.txt","r+"); 
  fscanf(file, "%i",  &k);   
  for (i=0; i<k; i++)
     {
     fscanf(file, "%i",  &mas[i]);
      //printf( "%i ", mas[i]);     
     }
  for(k = N/2; k > 0; k /=2)
        for(i = k; i < N; i++)
        {
            t = A[i];
            for(j = i; j>=k; j-=k)
            {
                if(t < A[j-k])
                    A[j] = A[j-k];
                else
                    break;
            }
            A[j] = t;
        }
  printf("Sorted array:\n");
    for (i = 0; i < 100; i++){
       printf("%d ", mas[i]);
    printf("\n");
}
    fclose(file); 
    free(mas);
    _getch();
    return 0;
}

Решение задачи: «Отсортировать массив, записанный в файле, методом Шелла (программа вылетает)»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100
int main(void) 
{
    srand(time(NULL));
    FILE *file; 
    int i, j, k=0, t=N;
    int *A=(int*)malloc(sizeof(int)*N);
    int mas[N];
    printf("Array:\n");
    for(int i=0; i<N; ++i)
    {
        mas[i] = rand() %(10-(-10)+1)+(-10);
        printf("%d ", mas[i]);
    }
    puts("");
    if((file = fopen("C://out.dat","wb+"))==NULL)
        printf( "The file was not opened\n" ); 
    else
    {
        fwrite(&t,sizeof(int),1,file);
        fwrite(mas,sizeof(int),N,file);//теперь в файле наш массив(бинарный) 
        rewind(file);
        fread(&k, sizeof(int), 1, file); 
        fread(A, sizeof(int), k, file);
        for(k = N/2; k > 0; k /=2)
        for(i = k; i < N; i++)
        {
            t = A[i];
            for(j = i; j>=k; j-=k)
            {
                if(t < A[j-k])
                    A[j] = A[j-k];
                else
                    break;
            }
            A[j] = t;
        }
        printf("Sorted array:\n");
        for (i = 0; i < 100; i++)
        {
            printf("%d ", A[i]);
        } 
 
    }
 
    fclose(file);
    return 0;
}

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

  1. Включаем необходимые заголовочные файлы для работы с файлами и генерации случайных чисел
  2. Определяем размер массива N=100
  3. Инициализируем генератор случайных чисел с помощью функции srand(time(NULL))
  4. Создаем файл для записи массива с помощью функции fopen(C://out.dat,wb+)
  5. Если файл не удалось открыть, выводим сообщение об ошибке
  6. Записываем размер массива в файл с помощью функции fwrite(&t,sizeof(int),1,file)
  7. Записываем сам массив в файл с помощью функции fwrite(mas,sizeof(int),N,file)
  8. Перемещаем указатель чтения в начало файла с помощью функции rewind(file)
  9. Считываем размер массива из файла с помощью функции fread(&k, sizeof(int), 1, file)
  10. Считываем сам массив из файла с помощью функции fread(A, sizeof(int), k, file)
  11. Сортируем массив методом Шелла (вложенные циклы)
  12. Выводим отсортированный массив на экран с помощью функции printf(Sorted array:\n) и цикла for
  13. Закрываем файл с помощью функции fclose(file)
  14. Возвращаем 0, что означает успешное выполнение программы

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


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

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

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