Ошибка при сортировке подсчетом - C (СИ)
Формулировка задачи:
Всем привет . Я студент и не давно на теории алгоритмов задали лабу что сводилась к алгоритмам сортировки, один из тех что мне попался - алгоритм сортировки подсчетом . Проблема в том что программа которую я написал РАБОТАЕТ , однако примерно раз на 5 она безбожно вылетает на этой злополучной сортировке .Толком не могу понять почему это происходит , буду признателен ,если поможете , прежде чем прочитаете код ,оговорюсь сразу , нам сказали сделать отдельными процедурами ввод , сортировку и вывод каждого массива , по этому я использую костыль в виде txt файла .
#include <stdio.h> #include <locale.h> #include <stdlib.h> #include <time.h> int _A; int _B; int MakeItRandom(int range_min ,int range_max ); void SizeOfArray_A(void);//Задание размера массива А void Array_A_I(int NOE );//Ввод массива А void Array_A_S(int NOE );//Сортировка массива А void Array_A_O(int NOE);//Вывод массива А void SizeOfArray_B(void);//Задание размера массива B void Array_B_I(int NOE );//Ввод массива B void Array_B_S(int NOE );//Сортировка массива B void Array_B_O(int NOE);//Вывод массива B void SizeOfArray_C(void);//Задание размера массива С void Array_C_I( int A_NOE,int B_NOE,int NOE );//Обьеденине элентвов массивов А и В (Массив С) void Array_C_O(int NOE);//Вывод массива С //Перечисление элементов массивов А И В (Массив D) //Вывод массива D //Разность массивов А И В (Массив E) //Вывод массива Е //Симметризированая разность массивов А И В (Массив F) //Вывод массива F main() { setlocale(LC_ALL,"UA"); srand(time(NULL)); SizeOfArray_A(); SizeOfArray_B(); SizeOfArray_C(); _getch(); } void SizeOfArray_A(void) { again:; printf("Введите количество элементов массивов А (от 20 до 100) : "); int NOE ;//(абрт-NumberOfElement) scanf("%i",&NOE); if(NOE>19&&NOE<101) { Array_A_I(NOE); } else { printf("Ошибка ввода массива,попробуйте ещё раз , размер массива не должен быть меньше 20 и не привышать 100\n"); goto again; } } void Array_A_I(int NOE ) { int A[NOE]; FILE *Array_A_BS = fopen("Array_A_BS.txt","w");//Создание файла для записи массива А до сортировки for(int i=0 ;i<NOE;i++) { A[i] = MakeItRandom(-51,101); fprintf(Array_A_BS,"%i ",A[i]); } fclose(Array_A_BS); Array_A_S(NOE); } void Array_A_S(int NOE )//Сортировка массива А пузырьком { int A[NOE]; int i=0; int STV; FILE *Array_A_BS = fopen("Array_A_BS.txt","r");//Создание файла для чтения массива А для сортировки if (Array_A_S!=NULL)//Проверка на существование файла { while (i!=NOE)// цикл выполняется пока i не достигает значению NOE { fscanf(Array_A_BS,"%i",&A[i]); i++; } fclose(Array_A_BS); for (i=0;i<NOE;i++) { for(int j=0 ;j<NOE;j++) { if(A[j] > A[j+1]) { STV = A[j]; // A[j] = A[j+1]; A[j+1] = STV; } } } FILE *Array_A_AS = fopen("Array_A_AS.txt","w");//Запись в файл отсартированого массива for (i=0;i<NOE;i++) { fprintf(Array_A_AS,"%i ",A[i]); } fclose(Array_A_AS); Array_A_O(NOE); } else printf("Ошибка файл не найден !"); } void Array_A_O(int NOE) { int A[NOE]; _A=NOE; FILE *Array_A_AS = fopen("Array_A_AS.txt","r"); if (Array_A_S!=NULL) { printf("Вывод массива А после сортировки пузырьком : \n"); for(int i = 0;i<NOE;i++) { fscanf(Array_A_AS,"%i ",&A[i] ); printf("A[%i]= %4i \n",i,A[i]); fclose(Array_A_AS); } } else printf("Ошибка файкла Array_A_AS.txt не существует ! "); } void SizeOfArray_B(void) { again:; printf("Введите количество элементов массивов B (от 20 до 100) : "); int NOE ;//NumberOfElement scanf("%i",&NOE); if(NOE>19&&NOE<101) { Array_B_I(NOE); } else { printf("Ошибка ввода массива,попробуйте ещё раз , размер массива не должен быть меньше 20 и не привышать 100 !\n"); goto again; } } void Array_B_I(int NOE ) { int B[NOE]; FILE *Array_B_BS = fopen("Array_B_BS.txt","w");//Создание файла для записи массива B до сортировки for(int i=0 ;i<NOE;i++) { B[i] = MakeItRandom(-51,101); fprintf(Array_B_BS,"%i ",B[i]); } fclose(Array_B_BS); Array_B_S(NOE); } void Array_B_S(int NOE )//Cортировка подсчетом массива B { int B[NOE]; int i=0; int STV; FILE *Array_B_BS = fopen("Array_B_BS.txt","r");//Создание файла для чтения массива B для сортировки while (i!=NOE)// цикл выполняется пока i не достигает значению NOE ,так из процедуры в процедуру я перекидую массивы { fscanf(Array_B_BS,"%i",&B[i]); i++; } fclose(Array_B_BS); int count; int B_C[151];//содержит в себе числа все возможные числа что может принять массив B int B_S[151];//содержит в себе количество каждого встреч каждого элемента массива B int value ; int j; printf("\n"); for(j = 0,value=-50; j<151 ;j++,value++ ) { B_C[j]=value; count = 0; for(i = 0 ; i < NOE ; i++ ) { if(B_C[j]==B[i])count ++; } B_S[j]=count; } FILE *Array_B_AS = fopen("Array_B_AS.txt","w");//Запись в файл отсартированого массива for(j=0,i=0; j<151 ; j++,i++) { while(B_S[i]>0) { B[j]=B_C[j]; B_S[i]--; fprintf(Array_B_AS,"%i ",B[j]); } } fclose(Array_B_AS); Array_B_O(NOE); } void Array_B_O(int NOE) { int B[NOE]; _B=NOE; FILE *Array_B_AS = fopen("Array_B_AS.txt","r"); if(Array_B_AS !=NULL) { printf("Вывод отсортированного подсчетом массива B : \n"); for(int i = 0;i<NOE;i++) { fscanf(Array_B_AS,"%i ",&B[i] ); printf("B[%i]= %4i \n",i,B[i]); } fclose(Array_B_AS); } else printf("Ошибка файл не найден !"); } void SizeOfArray_C() { FILE *Array_A = fopen("Array_A_AS.txt","r"); FILE *Array_B = fopen("Array_B_AS.txt","r"); int C[_A+_B]; int i ; for(i=0;i<_A+_B;i++){ if(i<_A) fscanf(Array_A,"%i ",&C[i]); else fscanf(Array_B,"%i ",&C[i]); printf("\n %i",C[i]); } } int MakeItRandom(int range_min ,int range_max )//работает на промежутке от и до не включая { int STV = (double)rand() / (RAND_MAX + 1) * (range_max - range_min)+ range_min;//STV-SaveThisValue return STV; }
Решение задачи: «Ошибка при сортировке подсчетом»
textual
Листинг программы
void Array_B_S(int NOE )//Cортировка подсчетом массива B { int B[NOE]; int i; int STV; FILE *Array_B_BS = fopen("Array_B_BS.txt","r");//файл для чтения массива B для сортировки for (i=0;i<NOE;i++)// цикл выполняется пока i не достигает значению NOE ,так из процедуры в процедуру я перекидую массивы { fscanf(Array_B_BS,"%i",&B[i]); } fclose(Array_B_BS); int count; int value ; int j; FILE *Array_B_AS = fopen("Array_B_AS.txt","w");//Запись в файл отсартированого массива for(j = 0,value=-50; j<151 ;j++,value++ ) { for(i = 0 ; i < NOE ; i++ ) { if(value==B[i]) { fprintf(Array_B_AS,"%i ",B[i]); } } } fclose(Array_B_AS); Array_B_O(NOE); }
Объяснение кода листинга программы
В этом коде реализована сортировка массива B подсчетом.
- В начале функции объявляется переменная типа int с именем NOE, которая представляет собой размер массива B.
- Затем объявляется массив B типа int, размером NOE.
- Далее, открывается файл
Array_B_BS.txt
для чтения массива B. - Происходит цикл, в котором считываются значения элементов массива B и сохраняются в соответствующих элементах массива B.
- После чтения всех элементов массива B, файл
Array_B_BS.txt
закрывается. - Затем открывается файл
Array_B_AS.txt
для записи отсортированного массива B. - Происходит два вложенных цикла: внешний цикл выполняется 151 раз (от 0 до 150), а внутренний цикл выполняется NOE раз (от 0 до NOE-1).
- Если значение переменной value (которая изменяется от -50 до 49) совпадает со значением одного из элементов массива B, то это значение записывается в файл
Array_B_AS.txt
. - После завершения внутреннего цикла, значение переменной value увеличивается на 1.
- После завершения внешнего цикла, файл
Array_B_AS.txt
закрывается. - Затем вызывается функция Array_B_O(NOE), которая, скорее всего, выполняет дополнительные операции с отсортированным массивом B.
- В конце функции, значение переменной NOE возвращается в вызывающую функцию или операционную систему.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д