Отсортировать массив, записанный в файле, методом Шелла (программа вылетает) - 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;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с файлами и генерации случайных чисел
- Определяем размер массива N=100
- Инициализируем генератор случайных чисел с помощью функции srand(time(NULL))
- Создаем файл для записи массива с помощью функции fopen(
C://out.dat,wb+) - Если файл не удалось открыть, выводим сообщение об ошибке
- Записываем размер массива в файл с помощью функции 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)
- Сортируем массив методом Шелла (вложенные циклы)
- Выводим отсортированный массив на экран с помощью функции printf(
Sorted array:\n) и цикла for - Закрываем файл с помощью функции fclose(file)
- Возвращаем 0, что означает успешное выполнение программы