Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2009, 22:36   #1
forsaken66
Куды бечь?
Форумчанин
 
Аватар для forsaken66
 
Регистрация: 05.10.2009
Сообщений: 104
По умолчанию Динам. массивы (странная проблема)

Задача: Удалить из массива все отрицательные элементы, все элементы, большие данного числа n. И изменить размерность массива.

Код:
#include "stdafx.h"
#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "time.h"
using namespace std;
int main()
{
 int *a,x=0,i=0,j=0,s=0,m=0;
 int *b,n=0;
 srand(time(NULL));
 cout<<"Vvedite razmer massiva- ";
 cin>>x;
 cout<<endl;
 a=new int[x];
 for (i=0;i<x;i++)
  {
   a[i]=rand()%50-20;
   cout<<a[i]<<" ";
  }
 cout<<endl<<endl<<"Vvedite chislo n- ";
 cin>>n;
 cout<<endl<<endl;
//----тут начинаем обрабатывать массив----
 for (i=0;i<x;i++)
  {
   if (a[i]<0 || a[i]>n) // !!! здесь проблема !!!
       {
     	for (j=i;j<x;j++)
	       a[j]=a[j+1];
	    i--; s++;
       }
  }
 //--переписываем-обработанный-массив-в промежуточный-массив--------
 m=x-s; //кол-во элементов нового массива
 b=new int[m];
 for (n=0;n<m;n++)
     b[n]=a[n];
 //----пересоздаем массив А(изм размерности)---
 //----и записываем туда данные----------------
 delete []a;
 a=new int[m];
  for (n=0;n<m;n++)
     a[n]=b[n];
 //------выводим на экран результаты-----------
 cout<<"Itogovuu massiv- "; 
 for (i=0;i<m;i++)
   cout<<a[i]<<" ";
 delete[]a;
 delete[]b;
_getch();
return 0;
}
не работает. НО! вся неясность в том что если в условие
if (a[i]<0 || a[i]>n) мы перепишем
if (a[i]>0 || a[i]>n) то все работает! я ничего не понимаю! Подскажите где я ляпнул?
Не хватало всего одного байта. Да-да, того самого, что из восьми бит состоит.
forsaken66 вне форума Ответить с цитированием
Старый 16.11.2009, 22:45   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Возможно, компилятор оптимизирует выражение каким-то хитрым образом, и поэтому возникает такой эффект
Кстати, вот i-- в for лучше не делать
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 16.11.2009, 22:54   #3
forsaken66
Куды бечь?
Форумчанин
 
Аватар для forsaken66
 
Регистрация: 05.10.2009
Сообщений: 104
По умолчанию

переписал цикл вот так

Код:
 i=0;
 while (i!=x)
  {
   if (a[i]<0 || a[i]>n)
       {
     	for (j=i;j<x;j++)
		{
	       a[j]=a[j+1];
		}
	    i--; s++;
       }
   i++;
  }
ничего не поменялось. теряюсь в догадках

ну, по идее должно же работать!
Не хватало всего одного байта. Да-да, того самого, что из восьми бит состоит.

Последний раз редактировалось forsaken66; 16.11.2009 в 22:57.
forsaken66 вне форума Ответить с цитированием
Старый 16.11.2009, 23:01   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Незнаю в чем дело, честно говоря лень читать, но я бы написал цикл так, может сработает:
Код:
for(i = 0; i < x; i++)
{
  if((a[i] < 0) || (a[i] > n))
  {
    for(j = i; j < x; j++)
    {
      a[j] = a[j + 1];
    }
    s++;
  }
}
И еще момент, не понятна цель, и выражение "n) то все работает! " тогда зачем что-то еще делать ? иначе, что именно за проблема ? Ошибка ? Покажите текст ошибки ?
BOBAH13 вне форума Ответить с цитированием
Старый 16.11.2009, 23:09   #5
forsaken66
Куды бечь?
Форумчанин
 
Аватар для forsaken66
 
Регистрация: 05.10.2009
Сообщений: 104
По умолчанию

BOBAH13, если меняем знак с "больше нуля" на "меньше нуля"(как положено по условию задачи) то тогда программа просто виснет. не выводит итоговый массив. а твой цикл не сработает если в исходном массиве есть два или больше идущих следом отрицательных числа.
Не хватало всего одного байта. Да-да, того самого, что из восьми бит состоит.
forsaken66 вне форума Ответить с цитированием
Старый 16.11.2009, 23:16   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Тю ну я ваш цикл просто переписал, там места для меня чуждые были написаны а так вроде должно работать, пишу прямо здесь, так что:
Код:
for(int i = 0; i < x;)
{
  if((a[i] < 0) || (a[i] > n))
  {
    for(int j = i; j < x; j++)
    {
      a[j] = a[j + 1];
    }
    x--;
  }
  else
  {
    i++;
  }
}
Ну как так я уже просто отрубатся начинаю, так что извените если не то
BOBAH13 вне форума Ответить с цитированием
Старый 16.11.2009, 23:29   #7
forsaken66
Куды бечь?
Форумчанин
 
Аватар для forsaken66
 
Регистрация: 05.10.2009
Сообщений: 104
По умолчанию

Нет, напротив, спасибо за помощь) но все равно не работает
Не хватало всего одного байта. Да-да, того самого, что из восьми бит состоит.
forsaken66 вне форума Ответить с цитированием
Старый 16.11.2009, 23:32   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от forsaken66 Посмотреть сообщение
Нет, напротив, спасибо за помощь) но все равно не работает
да вроде логика в алгоритме верная, что не работает то ? Отрицательные и больше N остаются ? после моего цикла, проверьте массив на их наличие, + я там x уменьшал, это как бы размерность массива, так что дальше именно этот x и использовать надо. Конкретней пожалуйста, что не получается то.

p.s. не заставляйте открывать студию

Edit:
Не могу понять, а зачем массив "a" вы после обработки (цикла) пересоздаете ? Зачем ? После моего цикла, там просто от 0 до x пройтись и все.

Edit:
pu4koff - правы, еще посмотрел, но "дъявол" переманил на свою сторону, и сказал что последний элемент массива это его размер надо идти отдыхать, оффтоп
все, я не в теме на сегодня какие то советы дурные даю, извените еще раз

Последний раз редактировалось BOBAH13; 16.11.2009 в 23:42.
BOBAH13 вне форума Ответить с цитированием
Старый 16.11.2009, 23:37   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Код:
for(int j = i; j < x; j++)
тут всёже наверно надо
Код:
for(int j = i; j < x - 1; j++)
а то там дальше:
Код:
a[j] = a[j + 1];
BOBAH13, ему по заданию нужно " изменить размерность массива."
Хотя а то новый создавать не нужно. Просто:
Код:
 ...
 delete []a;
 a = b;
 ...
И массивы через memcpy быстрее и короче копировать:
Код:
memcpy(b, a, x*sizeof(int));

Последний раз редактировалось pu4koff; 16.11.2009 в 23:43.
pu4koff вне форума Ответить с цитированием
Старый 16.11.2009, 23:46   #10
forsaken66
Куды бечь?
Форумчанин
 
Аватар для forsaken66
 
Регистрация: 05.10.2009
Сообщений: 104
По умолчанию

pu4koff, я вас понял. но этот цикл неправильный. зачем уменьшать х ? диапазон прохода тогда сокращается с двух сторон. с конца и с i-го элемента.

Код:
for(int i = 0; i < x;)
{
  if((a[i] < 0) || (a[i] > n))
  {
    for(int j = i; j < x-1; j++)
    {
      a[j] = a[j + 1];
    }
    x--;
  }
  else
  {
    i++;
  }
вот этот цикл работает.

Код:
 while (i!=x)
  {
    if (a[i]<0 || a[i]>n)
       {
     	cout<<a[i]<<" ";
		   for (j=i;j<x;j++)
		     {
	           a[j]=a[j+1];
		      }
	    i--; s++;
       }
   i++;
  }
да и не в цикле собственно проблема. если Вы скопипастите программу и запустите Вы все увидите. тут я после проверки условия пытаюсь вывести отрицательный элемент. выводит (с зависанием) кучу одинаковых чисел: -33686019
Не хватало всего одного байта. Да-да, того самого, что из восьми бит состоит.

Последний раз редактировалось forsaken66; 16.11.2009 в 23:49.
forsaken66 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странная проблема с Timer'ом .Phoenix Общие вопросы Delphi 4 19.09.2009 19:58
связка MySQL+PHP5 - странная проблема SwiP SQL, базы данных 2 06.04.2009 23:25
snmp+php странная проблема baarseek PHP 6 19.02.2009 14:02
Странная проблема с floating-point Niello Общие вопросы C/C++ 0 08.10.2008 14:30
Странная проблема при сложении double. Помогите разобраться. ivank Общие вопросы C/C++ 2 23.09.2008 13:04