Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
mell
0 / 0 / 0
Регистрация: 25.10.2008
Сообщений: 9
#1

Не совпадение индексов пользовательского массива и массива по умолчанию - C++

22.11.2008, 10:19. Просмотров 453. Ответов 0
Метки нет (Все метки)

Вообщем вот программа
Код
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

class Massiv
{
 public:
	 Massiv (int levii,int pravii);
	 Massiv (Massiv const &);
	 ~Massiv(void);

	 void vvod();
	 void vivod();

	 Massiv umnojenie(int);
	 Massiv delenie(int);
	 void poelementnaya_operaciya();

	 Massiv slojenie_elementami(Massiv);
	 Massiv vi4itanie_elementami(Massiv);
	 Massiv vi4itanie_elementami_obratnoe(Massiv);

	 int& operator[](int);
 private:
	 int *temp;
	 int  right;
	 int   left;
};
//*************************************************************************
Massiv :: Massiv(Massiv const &m)
{
 int i;
 right=m.right;
 left=m.left;
 temp=new int[right-left+1];
 for (i=left; i<=right; i++)
 {
 temp[i]=m.temp[i];
 }
}

Massiv :: Massiv (int levii, int pravii)
{
 left=levii;
 right=pravii;
 temp=new int[right-left+1];
 for (int i=left; i<=right; i++)
 temp[i]=0;
}

Massiv :: ~Massiv()
{
 delete []temp;
}

int&Massiv :: operator[](int nol)
{
 if (nol>=left && nol<=right);
 return temp[nol];
}
//*************************************************************************
void Massiv :: vvod()
{
 cout<<"Zapolnyaite massiv: "<<endl;
 for (int i=left; i<=right; i++)
  {
    cin>>temp[i];
  }
}

void Massiv :: vivod()
{
 cout<<"Resultat: ";
 for (int i=left; i<=right; i++)
  {
   cout<<temp[i]<<"\t ";
  };
}
//*************************************************************************
Massiv Massiv :: umnojenie (int skalyar)
{
 Massiv result(left, right);
 for (int i=left; i<=right; i++)
 {
  result[i]=temp[i]*skalyar;
 }
 return result;
}

Massiv Massiv :: delenie (int skalyar)
{
 Massiv result(left, right);
 for (int i=left; i<=right; i++)
 {
  result[i]=temp[i]/skalyar;
 }
 return result;
}

void Massiv :: poelementnaya_operaciya()
{
 int i;
 cout<<"Vvedite indeks massiva: ";
 cin>>i;
 if (i>=left && i<=right)
 cout<<"\n"<<"Zna4enie indeksa: "<<temp[i];
 else
 cout<<"Net takogo indeksa";
}
//*************************************************************************
Massiv Massiv :: slojenie_elementami(Massiv temp1)
{
 Massiv result(left, right);
 for (int i=left; i<=right; i++)
 result[i]=this->temp[i]+temp1[i];
 return result;
}

Massiv Massiv :: vi4itanie_elementami(Massiv temp1)
{
 Massiv result(left, right);
 for (int i=left; i<=right; i++)
 result[i]=this->temp[i]-temp1[i];
 return result;
}

Massiv Massiv :: vi4itanie_elementami_obratnoe(Massiv temp1)
{
 Massiv result(left, right);
 for (int i=left; i<=right; i++)
 result[i]=temp1[i]-this->temp[i];
 return result;
}
//*************************************************************************
main()
{
 clrscr();
 int kol1, kol2, kol3, kol4, skalyar, menu;
 char pod_menu;
 cout<<"Vibor deistviya:"<<endl<<endl
     <<"Odnomernii massiv: 1"<<endl
     <<"Dvumernii  massiv: 2"<<endl
     <<"Vihod            : 0"<<endl;
     cin>>menu;

 switch(menu)
{
 case 1:
	 cout<<"Vvedite indeks na4ala massiva:"<<endl;
	 cin>>kol1;
	 cout<<"Vvedite indeks konca massiva:"<<endl;
	 cin>>kol2;
	 Massiv dos1(kol1,kol2);
	 dos1.vvod();
	 cout<<"\nUmnojenie na skalyar          - a"<<endl
	     <<"Delenie na skalyar            - b"<<endl
	     <<"Obrashenie k elementu i vivod - c"<<endl;
	 cin>>pod_menu;

	 switch(pod_menu)
       {
	 case 'a':
		   cout<<"Vvedite skalyar: ";
		   cin>>skalyar;
		   dos1.umnojenie(skalyar).vivod();
		   break;

	 case 'b':
		   cout<<"Vvedite skalyar: ";
		   cin>>skalyar;
		   dos1.delenie(skalyar).vivod();

		   break;
	 case 'c':
		   dos1.poelementnaya_operaciya();
		   break;
       } break;

 case 2:
	 cout<<"Vvedite indeks na4ala massiva 1: ";
	 cin>>kol1;
	 cout<<"Vvedite indeks konca  massiva 1: ";
	 cin>>kol2;
	 cout<<"Vvedite indeks na4ala massiva 2: ";
	 cin>>kol3;
	 cout<<"Vvedite indeks konca  massiva 2: ";
	 cin>>kol4;
         cout<<endl;
	 if (kol1!=kol3 || kol2!=kol4)
	 {
	  cout<<"Oshibka, indeksi massivov ne sovpadaut.";
	  break;
	 }
	 
	 Massiv dos21(kol1,kol2), dos22(kol3,kol4);

	 cout<<"Zapolnyaem massiv 1"<<endl;
	 dos21.vvod();
	 cout<<"Zapolnyaem massiv 2"<<endl;
	 dos22.vvod();


	 cout<<"\nMassiv 1: ";
	 dos21.vivod();
	 cout<<"\nMassiv 2: ";
	 dos22.vivod();

	 cout<<"\n\nPoelementnoe slojenie            - a"<<endl
	     <<"Poelementnoe vi4itanie           - b"<<endl
	     <<"Poelementnoe vi4itanie(obratnoe) - c"<<endl;
	 cin>>pod_menu;

	 switch(pod_menu)
       {
	 case 'a':
		   dos21.slojenie_elementami(dos22).vivod();
		   break;
	 case 'b':
		   dos21.vi4itanie_elementami(dos22).vivod();
		   break;
	 case 'c':
		   dos21.vi4itanie_elementami_obratnoe(dos22).vivod();
		   break;
       } break;
 case 0: break;               
}
 getch();
 return 0;
}
Для одномерного массива может умножать или делить этот массив на число и выводить элемент по индексу, для двумерного может вычитать первы массив из второго, второй из первого или складывать их.
И значит здесь пользовательский массив задается с произвольными границами и нормально работает, а массив
temp[i]
массив по умолчанию, и индексируется от от нуля до размера массива, в нашем случае от нуля до right - left +1
Отсюда вот такие результаты программы:
Код
Vibor deistviya:
Odnomernii massiv: 1
Dvumernii  massiv: 2
Vihod            : 0
2
Vvedite indeks na4ala massiva 1: 0
Vvedite indeks konca  massiva 1: 5
Vvedite indeks na4ala massiva 2: 0
Vvedite indeks konca  massiva 2: 5

Zapolnyaem massiv 1
Zapolnyaite massiv:
1
1
1
1
1
1
Zapolnyaem massiv 2
Zapolnyaite massiv:
2
2
2
2
2
2

Massiv 1: Resultat: 1    1       1       1       1       1
Massiv 2: Resultat: 2    2       2       2       2       2

Poelementnoe slojenie            - a
Poelementnoe vi4itanie           - b
Poelementnoe vi4itanie(obratnoe) - c
a
Resultat: 3      3       3       3       3       3
Все как видим работает нормально, но если задать индексы скажем от -3 до -1, происходит ошибка
Код
Vibor deistviya:
Odnomernii massiv: 1
Dvumernii  massiv: 2
Vihod            : 0
2
Vvedite indeks na4ala massiva 1: -3
Vvedite indeks konca  massiva 1: -1
Vvedite indeks na4ala massiva 2: -3
Vvedite indeks konca  massiva 2: -1

Zapolnyaem massiv 1
Zapolnyaite massiv:
3
3
3
Zapolnyaem massiv 2
Zapolnyaite massiv:
3
3
3

Massiv 1: Resultat: 3    3       3
Massiv 2: Resultat: 3    3       3

Poelementnoe slojenie            - a
Poelementnoe vi4itanie           - b
Poelementnoe vi4itanie(obratnoe) - c
a
Resultat: 0      6       6
Вообщем надо както уровнять индексы массивов, мне сказали сделать в перегрузке скобочек вот это, но всероено почемуто не работает:
int&Massiv :: operator[](int nol)
{
if (nol>=left && nol<=right);
return temp[nol-left];
}
Надо еще вродебы в конструкторах както сдвинуть или в функция, но я уже в отчаянии. так как ничгео не получается.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2008, 10:19     Не совпадение индексов пользовательского массива и массива по умолчанию
Посмотрите здесь:

Вывод индексов массива C++
C++ Использование массива индексов при сортировке
Быстрая сортировка для массива обьектов пользовательского класса C++
Список на базе массива индексов C++
Посчитать сумму индексов массива с++ C++
C++: Вывод индексов отсортированных чисел массива C++
Вывод первоначальных индексов массива C++
Возврат индексов двумерного массива C++
Вывод индексов массива C++
Реализовать сортировку массива объектов пользовательского типа по заданному полю (структуры) C++
Найти наименьший элемент массива объектов пользовательского типа C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 17:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru