В Dev-C++ код не работает - C (СИ)
Формулировка задачи:
Здравствуйте! Помогите пожалуйста c кодом, в консоле всё идёт, но работу надо сдавать в Dev-c++, но в Dev-C++ код не работает.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#define n 15
static const char* filename = "statistic.dat";
struct information {
char user[32];
int array[n];
int iterations;
};
// функция сортировки
void sort(int* array, int* it) {
int i, j;
for(i = n - 1; i >= 1; i--) {
for(j = 0; j < i; j++) {
if(array[j] > array[j+1]) {
int foo = array[j];
array[j] = array[j+1];
array[j+1] = foo;
// инкрементируем счетчик
(*it)++;
}
}
}
}
// фнкция сравнения для qsort()
int compar(const void* a, const void* b) {
struct information* _1 = (struct information*)a;
struct information* _2 = (struct information*)b;
return _1->iterations < _2->iterations;
}
int main() {
int i;
struct information info;
info.iterations = 0;
// инициализируем члены структуры нужными значениями
printf("Введите имя\n");
scanf("%s", info.user);
printf("Bedute 15 elemeHtoB macuBa\n");
for(i = 0; i < n; i++) {
printf("mass[%d] = ", i);
scanf("%d", &info.array[i]);
}
printf("\n");
// функция сортировки
sort(info.array, &info.iterations);
for(i = 0; i < n; i++) {
printf("%4d ", info.array[i]);
}
printf("\n");
// открываем файл для чтения предыдущей статистики
FILE* file = fopen(filename, "rb");
// если такого файла не существует, значит статистики нет
if ( !file ) {
// создаем
file = fopen(filename, "wb");
// если создать не удалось, значит ошибка
if ( !file ) {
// сообщаем
fprintf(stderr, "can`t create file!");
// возвращаем ошибку
return 1;
}
// если файл создался - записываем в него первую структуру
// записываем
fwrite(&info, sizeof(struct information), 1, file);
// закрываем файл
fclose(file);
// выходим
return 0;
} else {
// предыдущая статистика существует
// определяем размер файла чтоб узнать сколько структур в него записано
// это нам нужно чтоб знать сколько памяти выделять
struct stat fileinfo;
fstat(fileno(file), &fileinfo);
// размер файла
int file_size = fileinfo.st_size;
// кол-во структур в файле
int structs = file_size/sizeof(struct information);
// выделяем память
struct information* structs_arr = (struct information*)malloc(sizeof(struct information)*(structs+1));
// считываем из файла предыдущие структуры
for ( i = 0; i < structs; ++i ) {
fread(&structs_arr[i], sizeof(struct information), 1, file);
}
// закрываем файл
fclose(file);
// добавляем нашу структуру
memcpy(&structs_arr[structs], &info, sizeof(struct information));
// сортируем
qsort(structs_arr, structs+1, sizeof(struct information), compar);
// открываем файл для записи
file = fopen(filename, "wb");
// если не удалось -
if ( !file ) {
// освобождаем память
free(structs_arr);
// сообщаем
printf("can`t open file for writing");
// выходим
return 1;
}
// записываем
for ( i = 0; i < structs+1; ++i ) {
fwrite(&structs_arr[i], sizeof(struct information), 1, file);
}
// освобождаем память
free(structs_arr);
// закрываем файл
fclose(file);
}
return 0;
}Решение задачи: «В Dev-C++ код не работает»
textual
Листинг программы
// функция сортировки
void sort(int* array, int* it) {
int i, j;
for(i = n - 1; i >= 1; i--) {
for(j = 0; j < i; j++) {
if(array[j] > array[j+1]) {
int foo = array[j];
array[j] = array[j+1];
array[j+1] = foo;
// инкрементируем счетчик
(*it)++;
}
}
}
}
Объяснение кода листинга программы
- Объявлены две переменные типа int: i и j. Они будут использоваться в цикле
- Начало цикла for для перебора элементов массива. Первый параметр - это n-1, второй параметр - это i. Значение n-1 будет использоваться в качестве верхней границы для цикла, а i будет уменьшаться на 1 на каждой итерации.
- Внутри цикла for объявлен второй цикл for для перебора элементов от 0 до i-1. Он будет использоваться для сравнения элементов массива и их последующей перестановки при необходимости.
- Если элемент array[j] больше элемента array[j+1], то выполняется следующий код:
- Создается переменная типа int с именем foo, которая получает значение элемента array[j].
- Значение элемента array[j] заменяется значением элемента array[j+1].
- Значение элемента array[j+1] заменяется значением переменной foo.
- Увеличивается значение счетчика (*it) на 1. Это означает, что элемент был перемещен, и счетчик должен быть увеличен на 1, чтобы отразить новую позицию элемента.
- По завершении внутреннего цикла for, цикл for для перебора элементов массива продолжается до тех пор, пока i больше или равно 1.
- Если внутреннего цикла for не произошло ни одного перемещения (то есть, счетчик не увеличился), это означает, что массив уже отсортирован, и функция сортировки может быть завершена.
- В конце функции sort вызывается деструктор для освобождения памяти, выделенной для указателя it. Это необходимо, потому что указатель it был выделен в куче, и его необходимо освободить, когда он больше не нужен.
- Функция sort возвращает void, что означает, что она не возвращает никакого значения.