Ошибка при сортировке подсчетом - 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 возвращается в вызывающую функцию или операционную систему.