Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Минимальная разность элементов


Автор: b44 24.5.2006, 17:36
проверьте пожалуйста!!!

прога должна ноходить мин разность любых элементов и выводить номера элементов с наименьшей разностью

Код

#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#define n 5
void main()
{
clrscr();
randomize();
int a[n],g,min,y;
  for (int i=0;i<n;i++)
  {
  a[i]=random(20)+1;
  cout <<a[i]<<' ';
  }
  cout<< '\n';
       min=abs(a[0]+a[1]);
       for (int s=0; s<n; s++)
       {
      for (int d=s+1; d<n; d++)
      {
      a[y]=abs(a[s]-a[d]);
      if (a[y]<min) min=a[y];
      cout<<a[y]<<' ';
      y=y+1;
      }
       }
     cout << '\n'<<min<<"-->";

     for ( int p=0; p<n; p++)
     {
      for ( int l=p+1; l<n; l++)
      {
      g=abs(a[p]-a[l]);
      if (g==min)
      cout<<p+1<<' '<<l+1<<';'<<' ';
      }
      }
getch();
}
 

Автор: mr.Anderson 24.5.2006, 17:44
Так. Разбираем по порядку.
Код

#define n 5

Привыкни это заменять на такое:
Код

const int n=5;

Дальше.
Код

void main()

Привыкни писать так:
Код

int main(void)

Затем. Ошибка в 10-й строчке:
Код

int a[n],g,min,y;

Во-первых, MIN не инициализируется. Почему? Потом в коде происходит ее сравнение с другой переменной. Если в ней нет первоначального значения, в ней "мусор". Это значит, что условие сравнения может и "пролететь". Для этого лучше дать ей значение, любое. Плюс, переменная Y лишняя, ее можно объявить прямо в цикле повторения for. Получаем следующее:
Код

int a[n],
     g,
     min=1000;

Много ошибок в циклах повтора.
Код

for (int s=0; s<n; s++)
       {
      for (int d=s+1; d<n; d++)
      {
      a[y]=abs(a[s]-a[d]);
      if (a[y]<min) min=a[y];
      cout<<a[y]<<' ';
      y=y+1;
      }
       }

Вот объясни мне, для чего здесь два цикла? Плюс с использованием тьмы ненужных переменных? Меняем на вот такое:
Код

for(int y=0; y<n; y++)
 {
  a[y]=abs(a[y]-a[y+1]);
  if (a[y]<min) min=a[y];
  cout<<a[y]<<" ";
 }

Не правда ли, так куда проще и правильней?
Код

for ( int p=0; p<n; p++)
     {
      for ( int l=1; l<n; l++)
      {
      g=abs(a[p]-a[l]);
      if (g==min)
      cout<<p+1<<' '<<l+1<<';'<<' ';      }
      }

Зачем так? Меняем на такое:
Код

for(int p=0; p<n; p++)
  for(int l=1; l<n; l++)
  {
   g=abs(a[p]-a[l]);
   if (g==min)
   cout<<a[l]<<" "<<a[l+1]<<";"<<" ";
  }


Вот. В итоге получаем следующий код:
Код

#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>

//-------------------------------------------------
int main(void)
{
 const int n=5;
 int a[n],
      g,
      min=1000;

 clrscr();
 randomize();

 for (int i=0;i<n;i++)
 {
  a[i]=random(20)+1;
  cout <<a[i]<<" ";
 }

 cout<<"\n";

 min=a[0]+a[1];

 for(int y=0; y<n; y++)
 {
  a[y]=abs(a[y]-a[y+1]);
  if (a[y]<min) min=a[y];
  cout<<a[y]<<" ";
 }

 cout<<"\n"<<min<<" --> ";

 for(int p=0; p<n; p++)
  for(int l=1; l<n; l++)
  {
   g=abs(a[p]-a[l]);
   if (g==min)
   cout<<a[l]<<" "<<a[l+1]<<";"<<" ";
  }

 getch();
}
//-------------------------------------------------
   

Автор: b44 24.5.2006, 17:59
Sim7 ты написал полную чуш!!! запусти мой код там все правильно!!! я тебе писал что разность не соседних чисел а ЛЮБЫХ!!!
у меня после компиляции выводит хер знает что!!!


короче мой код правильный за исключением некоторых помарок к которым ты привык!!! 

Автор: mr.Anderson 24.5.2006, 18:09
Не надо шуметь. Объяснять надо уметь задание как следует.
Код

#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>

//-------------------------------------------------
int main(void)
{
 const int n=5;
 int a[n],
      g,
      min=1000,
      y=0;

 clrscr();
 randomize();

 for (int i=0;i<n;i++)
 {
  a[i]=random(20)+1;
  cout <<a[i]<<" ";
 }

 cout<<"\n";

 min=a[0]+a[1];

 for (int s=0; s<n; s++)
  for (int d=s+1; d<n; d++)
  {
   a[y]=abs(a[s]-a[d]);
   if (a[y]<min) min=a[y];
   cout<<a[y]<<' ';
   y+=1;
  }
  
 cout<<"\n"<<min<<" --> ";

 for(int p=0; p<n; p++)
  for(int l=1; l<n; l++)
  {
   g=abs(a[p]-a[l]);
   if (g==min)
   cout<<p+1<<' '<<l+1<<';'<<' ';
  }

 getch();
}
//-------------------------------------------------
  

Автор: MAKCim 24.5.2006, 21:53
Код

#include <map>
#include <vector>

using std::pair;
using std::vector;

inline int abs(int i) {return i>=0 ? i: -i;}

pair<int, int> min_sub(const vector<int>& vector_)
{
    pair<int, int> pair_(-1,-1);
    int min=-1;
    for (vector<int>::const_iterator i=vector_.begin(); i!=vector_.end(); ++i)
    {
        vector<int>::const_iterator j=i;
        ++j;
        for (; j!=vector_.end(); ++j)
        {
            int temp;
            if (min==-1 || (temp=abs(*j-*i))<min)
            {
                min=temp;
                pair_.first=i-vector_.begin();
                pair_.second=j-vector_.begin();
            }
        }
    }
    return pair_;
}
 

Автор: b44 25.5.2006, 06:48
кому надо правильный код
вот он! с учетом того что номера могут быть не только соседними!


Код

#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#define n 4
void main()
{
clrscr();
randomize();
int a[n],min,g,c,v;
  for (int i=0;i<n;i++)
  {
  a[i]=random(20)+1;
  cout <<a[i]<<' ';
  }
  cout<< '\n';
       min=abs(a[0]+a[1]);
       for (int s=0; s<n; s++)
       {
     for (int d=s+1; d<n; d++)
     {
     v=abs(a[s]-a[d]);
     if (v<min) min=v;
     cout<<v<<' ';
     }
       }
    cout << '\n'<<min<<"-->";

    for ( int p=0; p<n; p++)
    {
     for ( int l=p+1; l<n; l++)
     {
     g=abs(a[p]-a[l]);
     if (g==min)
     cout<<p+1<<' '<<l+1<<';'<<' ';
     }
     }
getch();
}
 

Автор: nostromo 25.5.2006, 09:48
(В рамках небольшого флейма.)
Уважаемый b44, наиболее точная характеристика Вашему образу в этом топике, пожалуй, "воинствующее невежество". 

Если писать на C++ так, как привыкли на C, то дальше учебных программ Вы не уйдете. Основной смысл критики языка С++ состоит в том, что он слишком легко позволяет писать "плохие" программы (трудно читаемые, модифицируемые, отлаживаемые, ...). Выработать хороший стиль без помощи гуру очень трудно.

Вместо того, чтобы огрызаться, лучше поитересовались бы, чем другой подход может быть лучше Вашего. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)