Консультация № 169361
13.06.2009, 14:49
0.00 руб.
0 1 1
Здраствуйте, уважаемые программисты!
Написал прогу для сортировки массива методом прямого выбора <функ-я void sort> (находиться минимальный эл-м и меняется с первым, следующий минимальный эл-нт меняется со вторым и тд.)
По заданию нужно было предусмотреть:
подсчет контрольной суммы эл-в массива <фун-я CheckSum>
подсчет кол-ва сравнений и перестановок.

Программа работает замечательно, но если кол-во элементов (N) установить в значение 500 или выше при подсчете кол-ва сравнений программа выдает отрицательное число =(. В этом проблема.
Я понимаю что integer не работает с большими числами, но Long тоже не помогает!
Скорее всего у этой проблемы наибанальнейшее решение, но я уже голову сломал не могу понять в чем дело!
Буду очень признателен за помощь!

Приложение:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define N 500 //кол-во эл-в массива
void sort (int *x, int n); // прототип функции сортировки методом прямого выбора
void CheckSum (int *x, int n); // прототип ф-ии подсчета контрольной суммы

main ()
{
clrscr();
int x[N]; // обьявление массива x[N]
int i;
randomize ();
printf ("\n Vyvod massiva: \n");
for (i=0;i<N;i++)
{x[i]=random(99); //массив заполняется случ. Числами (до 99)
printf("%5d",x[i]);}
sort (x,N);
CheckSum (x,N);
getch();}

void sort (int *x, int n) // функция сортировки методом прямого выбора
{
int i,j,k;
int q, tmp, c, m;
c=0;
m=0;
for(i=0; i<n-1; i++)
{
q=0;
k=i;
tmp=x[i];

for(j=i+1; j<n; j++)
{
c=c+1; // Подсчет кол-ва сравнений
if(x[j]<tmp)
{
k=j;
tmp=x[ j ] ;
q=1;
} }
if (q)
{
x[k]=x[i];
x[i]=tmp;
m=m+1; // Подсчет кол-ва перестановок
} }
printf ("\n\n Sortirovka metodom pryamogo vybora: \n");
for (i=0; i<N; i++)
printf("%5d", x[i]);
printf ("\n\n Kolichestvo sravneniy = %d", c);
printf ("\n kolichestvo peresylok = %d", m);
}

void CheckSum (int *x, int n) // функция для подсчета контрольной суммы
{
int i, s;
for (s=0, i=0; i<n; i++)
s+=x[i];
printf("\n Summa elementov massiva = %3d", s);}

Обсуждение

Неизвестный
13.06.2009, 15:27
общий
это ответ
Здравствуйте, Slayder.

При компиляции средой CBuilder программа работает безупречно и при N в 50000, без артефактов. При компиляции средой Turbo C++ 3.0 результат действительно содержит отрицательные значения. Для разрешения проблемы надо:

printf ("\n\n Kolichestvo sravneniy = %d", c);
printf ("\n kolichestvo peresylok = %d", m);

printf("\n Summa elementov massiva = %3d", s);}

заменить на:

printf ("\n\n Kolichestvo sravneniy = %ld", c);
printf ("\n kolichestvo peresylok = %ld", m);

printf("\n Summa elementov massiva = %3ld", s);}

И также необходимо изменить тип локальных переменных в функциях sort и CheckSum с int на long.

С уважением, Дмитрий.
5
Огромное спасибо Дмитрий! Как я и ожидал оказалось все просто, но я б до этого не додумался )
Форма ответа