В 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, что означает, что она не возвращает никакого значения.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д