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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ambiguous call to overloaded function http://www.cyberforum.ru/cpp-beginners/thread16470.html
При использовании sqrt (да и других мат. функций(sin, cos, pow...) ) выдает ошибку, где говорится о неоднозначности. Скажем: cout<<sqrt(4); выдает: error C2668: 'sqrt' : ambiguous call to overloaded function 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(581): could be 'long double sqrt(long double)' 1> c:\program files\microsoft visual studio...
C++ Ощибка в коде Подскажите, пожалуйста что неправельно в этом коде #include <iostream.h> int chet(int, int); main() { int a,b,S; cout<<"a: "; cin>>a; http://www.cyberforum.ru/cpp-beginners/thread16469.html
C++ Программа для расчёта по двум формулам
Помогите пожалуйста решить задание, срочно надо!: напишите программу для расчёта по двум формулам. предварительно подготовьте тестовые примеры по второй формуле с помощью калькулятора (результат вычисления по первой формуле должен совпадать со второй). z1=(в числителе)sin2альфа+sin5альфа-sin3альфа (в знаменателе) cosАльфа-cos3альфа+cos5альфа z2=tg3альфа Кто чем может помогите пожалуйста!:'(
C++ Win32 Project
Подскажите, как из проекта Win32 запустить фаил .vbs? Пробовал запускать в Win32 батник, который запускает .vbs, но появляющаяся консолька-- это не то, надо бы так, что-бы напрямую.
C++ Передача динамического массива в функцию http://www.cyberforum.ru/cpp-beginners/thread16426.html
У меня задача передать в функцию в качестве параметра динамический 2-хмерный массив и получить результат. Тупо возвращать как результат указатель он почему-то не хочет. Кто что может что-нить подсказать?
C++ Помогите найти книги! Ув.программисты . я тут много читал и люди приводят пример книг с которых лучше начать (Стивен Прат. "Язык программирования С. Лекции и упражнения" )(В.В. Подбельский, С.С. Фомин "Программирование на языке Си". Москва. "Финансы и статистика" - 2003 г.).Так вот - я не могу найти где их скачать.очень прошу - помогите с сылками или дайте ссылки на что-то аналогичное.заранее спасибо. подробнее

Показать сообщение отдельно
mell
0 / 0 / 0
Регистрация: 25.10.2008
Сообщений: 9

Не совпадение индексов пользовательского массива и массива по умолчанию - 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];
}
Надо еще вродебы в конструкторах както сдвинуть или в функция, но я уже в отчаянии. так как ничгео не получается.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 15:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru