Ошибка при сортировке подсчетом - 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 подсчетом.

  1. В начале функции объявляется переменная типа int с именем NOE, которая представляет собой размер массива B.
  2. Затем объявляется массив B типа int, размером NOE.
  3. Далее, открывается файл Array_B_BS.txt для чтения массива B.
  4. Происходит цикл, в котором считываются значения элементов массива B и сохраняются в соответствующих элементах массива B.
  5. После чтения всех элементов массива B, файл Array_B_BS.txt закрывается.
  6. Затем открывается файл Array_B_AS.txt для записи отсортированного массива B.
  7. Происходит два вложенных цикла: внешний цикл выполняется 151 раз (от 0 до 150), а внутренний цикл выполняется NOE раз (от 0 до NOE-1).
  8. Если значение переменной value (которая изменяется от -50 до 49) совпадает со значением одного из элементов массива B, то это значение записывается в файл Array_B_AS.txt.
  9. После завершения внутреннего цикла, значение переменной value увеличивается на 1.
  10. После завершения внешнего цикла, файл Array_B_AS.txt закрывается.
  11. Затем вызывается функция Array_B_O(NOE), которая, скорее всего, выполняет дополнительные операции с отсортированным массивом B.
  12. В конце функции, значение переменной NOE возвращается в вызывающую функцию или операционную систему.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5
Похожие ответы