Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Последовательность чисел (http://forum.oszone.net/showthread.php?t=96954)

denver-312 28-12-2007 11:10 705539

Последовательность чисел
 
Помогите пожалуйста!
Есть программа, которая реализует работу с последовательностью чисел. Вводим 10 чисел - она формирует
их по возростанию. Но нужно ещё, кроме этого составить новую последовательность, выкинув из неё
самое минимальное и самое максимальное число. Как это сделать?


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

void main(void)
{
int n[10];
int i;
float min, max;
float*a;
printf ("\n 10:");
scanf("%d" , &n);
a=(float*)calloc(n,sizeof(float));

for(i=0; i<n;i++)
{
scanf("%f" ,&a[i]);
}
min=a[0]; max=a[0];
for(i=1; i<n;i++)
}
if(min>a[i]) min=a[i];
if(max<a[i]) max=a[i];
}
printf ("min=%.1f" ,min);
printf ("max=%1f" ,max);
getch ();
free (a);
}


Заранее спасибо!

Busla 28-12-2007 18:33 705816

программа выполняет несколько иную задачу :)

5pliT 31-12-2007 10:59 706872

Что-то чепуха написана у вас в коде :)
Делается это просто в два шага:
1. Сортируется.
2. Убирается первый и последний элементы.

Код:

#include <stdio.h>
#include <conio.h>
#define N 10

void sort(int in[], int a=0, int b=N){
    int i,j,mode;
    if (a>=b) return;
    for (i=a,j=b,mode=1;i<j;mode>0?j--:i++)
          if (in[i] > in[j]) {
            in[i]^=in[j]^=in[i]^=in[j];
            mode=-mode;
          }
    sort(in,a,i-1);
    sort(in,i+1,b);
}

int main() {
      int i,*x=new int[N];
      for (i=0;i<N;i++)  scanf("%d",&x[i]);
      sort(x); //сортируем
      for (i=1;i<N-1;i++) { //убираем первый и последний элементы
          x[i-1]=x[i];
          printf("%d ",x[i-1]);
      }
      getch();
      return 0; 
}


Drongo 31-12-2007 17:56 706957

5pliT,
Цитата:

Цитата 5pliT
in[i]^=in[j]^=in[i]^=in[j]; »

Можешь объяснить что делает этот оператор?!

5pliT 01-01-2008 12:10 707086

Это алгоритм обмена значений переменных.
Примерно тоже самое:
int temp=in[i];
in[i]=in[j];
in[j]=temp;

Drongo 01-01-2008 18:09 707222

Цитата:

Цитата 5pliT
int temp »

Прошу прощения за назойливость, но я не понял, какая из переменных выступает в роли - temp? Вроде ж две переменные
Код:

in[i] ^=  in[j]
Можешь подробнее объяснить?!
Принцип пузырьковой сортировки

5pliT 02-01-2008 07:48 707466

Здесь нет третей переменной, поэтому я и использовал этот алгоритм.
Можно расписать его как последовательность операций:
in[i]=in[i]^in[j];
in[j]=in[j]^in[i];
in[i]=in[i]^in[j];
^ - это xor (математики называют эту операцию "исключающее ИЛИ" или "сумма по модулю 2" или "кольцевая сумма")
0^0=0
0^1=1
1^0=1
1^1=0

например a=5,b=7;
a=101
b=111
a=a xor b
a=101 xor 111=010=2
b=b xor a
b=111 xor 010=101=5=a (первоначальное)
a=a xor b
a=010 xor 101=111=7=b (первоначальное)


Алгоритм пузырьковой сортировки заключается в последовательном (начиная с разных концов массива) сравнении всех элементов друг с другом. Если нужная последовательность не сохраняется, то элементы меняются местами.

Здесь я использовал рекурсивный алгоритм быстрой сортировки. Он заключается в последовательном выборе элемента (обычно который называют медианой или опорным элементом). Затем элементы упорядочиваются относительно него, тоесть все меньшие в одну сторону, все большие в другую. Затем для каждой из частей (левой и правой) рекурсивно запускается тотже алгоритм. Тоесть опять выбирается медиана и массив разделяется на две части. Алгоритм этот достаточно быстрый и запись его на Си очень локанична.

Drongo 02-01-2008 20:54 707789

5pliT,
Я почему спрашивал, просто эту операцию ещё не изучал
Цитата:

Цитата 5pliT
^ - это xor »

Огромнейшее Спасибо, что подробно объяснил, и отнёсся с пониманием!


Время: 11:41.

Время: 11:41.
© OSzone.net 2001-