Форум: Форум C++Разное
Новые темы: 00
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вектор на плоскости
 
 автор: KernelPanic   (01.02.2012 в 01:08)   письмо автору
 
 

Знакомство с языком С++ прошло как-то быстро. Научились писать только консольные приложения, да и то по сложности "никакие". А тут требования резко возросли.
Задали задачу на классы:
Описать класс вектор на плоскости, содержащий координаты его начала и конца и методы вывода координат на экране и нахождения длины.
Описать производный класс, дополнительно содержащий функцию умножения вектора на число, скалярного произведения векторов и сложения двух векторов.
Предусмотреть интерфейс работы пользователя с программой на основе меню.

С чего начать?
Ранее пользовались средой devcpp, но думаю начинать программу с интерфейсом лучше в VS. Установлена Visual C++ 9.0 Express Edition.
Если писать консольное приложение - то уже продумал, что после запуска программы выводить нумерованный диалог, предложение выбрать действие, на основе введенных данных:
1) вывод координат на экран, нахождение длинны вектора.
2) умножение вектора на число
3) скалярное произведение векторов
4) сложение 2х векторов

Правильно ли я понял условия задачи?

  Ответить  
 
 автор: cheops   (01.02.2012 в 01:31)   письмо автору
 
   для: KernelPanic   (01.02.2012 в 01:08)
 

Классы чем любопытны, они позволяют так организовать код, что пока у вас не будет корректных координат, вы не сможете воспользоваться методами класса. Т.е. хорошо бы так спроектировать программу, чтобы нельзя было выбрать нахождения длины вектора, если бы пользователь явно не ввел координаты. А по мере ввода данных бы ему бы становились бы доступны остальные возможности, т.е. введен один вектор - можно скалярное умножение осуществлять и подсчет длины, введено два - становится доступным векторное умножение. В этом случае даже консольная программа становится более интуитивной.

Собственно работа с Visual Studio отличается только более мощным интерфейсом, C++ код у вас будет ровно такой же как в devcpp.

>Правильно ли я понял условия задачи?
>Предусмотреть интерфейс работы пользователя с программой на основе меню.
Если это не графическое меню :), то да, все верно.

  Ответить  
 
 автор: KernelPanic   (04.03.2012 в 18:58)   письмо автору
 
   для: cheops   (01.02.2012 в 01:31)
 

Не додумался как все это организовать. Решил остановиться на таком вот принципе: "выберите нужный пункт меню, нажмите enter" Ну и расписать чему эти пункты соответствуют 1,2,3,4.
Да! - решил все таки в консоли все это реализовать. (скажут переделываь - тогда попытаюсь интерфейс какой прикрутить).
Возникла сложность с классами - понял, что я их вообще не понимаю. И нафига в моем случае они нужны - тоже не понимаю! Просто не знаю как правильно с ними работать - описать, наследовать и т.д.
Программу в принципе - сложности написать не составило бы, если б не классы... Как раз задача из раздела "работа с классами" :(.
Может что дельное посоветуете, либо литературу какую толковую почитать?

  Ответить  
 
 автор: cheops   (05.03.2012 в 16:28)   письмо автору
 
   для: KernelPanic   (04.03.2012 в 18:58)
 

Вообще по объектно-ориентированному программированию довольно много толковой литературы, читать не перечитать. Однако, прежде чем в неё погружаться, следует уяснить одну простую вещь, что классы - это тип, а объекты - это переменные. Т.е. есть встроенные типы
int number = 5;
char str[80];
Так вот классы вам позволяют заводить свои int и char (только гораздо более сложные по поведению), а потом объявлять переменные этих типов - объекты. Все остальное - это обеспечение удобства работы с этими типами и переменными. Т.е. когда от вас требуется создать вектор, это означает что нужно создать такой тип данных, который будет позволять хранить два значения x и y. Т.е. у вас будет переменная, которая называется объектом из которой можно будет извлечь этих два значения. Два объекта-вектора можно будет сложить и результат будет давать вектор, который получается в результате сложения векторов. Два объекта-вектора можно умножить и результат будет равен векторному или скалярному произведению. Т.е. вы не пишите каждый раз строчки за строчками, а просто создаете один раз класс, а потом оперируете объектами этого класса, как будто это встроенный тип данных на вроде int, char или массивы из этих типов.

  Ответить  
 
 автор: KernelPanic   (05.03.2012 в 17:16)   письмо автору
 
   для: cheops   (05.03.2012 в 16:28)
 

Спасибо, возможно помогли осознать все это...
Проверю свои догадки, как время появится писать код.
Сложно мне языки даются :(
Думаю еще не раз отпишусь о результатах.

  Ответить  
 
 автор: cheops   (05.03.2012 в 17:33)   письмо автору
 
   для: KernelPanic   (05.03.2012 в 17:16)
 

>Сложно мне языки даются :(
Не опускайте руки, это у всех так сначала. Потом пойдет гораздо быстрее. Первая база всегда долго закладывается.

  Ответить  
 
 автор: KernelPanic   (19.05.2012 в 17:47)   письмо автору
 
   для: cheops   (05.03.2012 в 17:33)
 

Без классов примерно так получилось.

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

using namespace std;

double dlinna(double a, double b)
{
             a=sqrt(pow(b,2)+pow(a,2));
             return a;
             }
double scal(double a,double b,double e,double f)
{
       double ab;
       ab=a*e+b*f;
       return ab;
}
main()
{
    cout<<"Vvedite chislo vibrannogo puncta, najmite enter"<<endl;
    cout<<"1. dlinna vectora"<<endl<<"2. Umnojenie na chislo"<<endl<<"3. scalar proizved vectorov"<<endl<<"4. slojenie vectorov"<<endl<<"5. exit"<<endl;
      int sw;
      cin>>sw;
      
   switch(sw)
{

     case 1: //Длинна вектора A
      {
           double a,b,d;
      cout<<"Vector A="<<endl;
      cin>>a;
      cin>>b;
      d=dlinna(a,b);
      cout<<"Dlina A="<<d<<endl;
            return 0;
      }
      case 2://умножение вектора на число
      {
           double a,b,c,ca,cb;
      cout<<"Vector A="<<endl;
      cin>>a;
      cin>>b;
          cout<<"vvedite chislo"<<endl;
          cin>>c;

ca=c*a;
cb=c*b;
cout<<"Proizvedenie A na chislo="<<endl;
cout<<ca<<endl;
cout<<cb<<endl;
            return 0;
      }
      case 3:// Скалярное произведение векторов
      {
           double a,b;
      cout<<"Vector A="<<endl;
      cin>>a;
      cin>>b;
      
      cout<<"vector B="<<endl;
      double e, f;
      cin>>e;
      cin>>f;
      
      double ab;
      ab=scal(a,b,e,f);

      cout<<"proizvedenie="<<ab<<endl;
            return 0;
      }
      case 4://сложение векторов
      {
      cout<<"Vector A="<<endl;
      double a,b;
      cin>>a;
      cin>>b;
      
      cout<<"vector B="<<endl;
      double e, f;
      cin>>e;
      cin>>f;
            
      if(a==e||b==f)
      {
      double ab;
      ab=scal(a,b,e,f);
      double d,t;
      d=dlinna(a,b);//Длина вектора A
      t=dlinna(e,f);//Длина вектора B
      double alpha;
      alpha=(ab/d*t);//cos alpha м.у векторами
      cout<<"cos a="<<alpha<<endl;
      double summ;
      d=fabs(d);
      t=fabs(t);
      summ=pow(d,2)+pow(t,2)+2*d*t*alpha;
      summ=sqrt(summ);
      cout<<summ<<endl;
      }
      if(a==f||b==e)
      {
                    double ab;
      ab=scal(a,b,e,f);
      double d,t;
      d=dlinna(a,b);//Длина вектора A
      t=dlinna(e,f);//Длина вектора B
      double alpha;
      alpha=(ab/d*t);//cos alpha м.у векторами
      double summ;
      d=fabs(d);
      t=fabs(t);
      summ=sqrt(pow(d,2)+pow(t,2)-2*d*t*alpha);      
      cout<<summ<<endl;
                    }
      else
      {
          cout<<"pri zadannih coordinatah slojenie nevozmojno"<<endl;
            
            }
            return 0;
      }
      case 5:
      {
            
            return 0;
      }  
      }
}

Почему второе условие if не отрабатывает?
Входные параметры пробовал различные.

  Ответить  
 
 автор: KernelPanic   (27.05.2012 в 16:06)   письмо автору
 
   для: KernelPanic   (19.05.2012 в 17:47)
 

Так и не понял классов
фигня какая-то получается :(
#include <iostream>
#include <math.h>
 
 using namespace std;
 
 class vec1
 {
 public:

 double dlina(double a, double b){
        return a=sqrt(pow(b,2)+pow(a,2));//вычисление длинны вектора
        }
 double print(double a, double b){
        cout<<"coordinata 1="<<a<<endl;
        cout<<"coordinata 2="<<b<<endl;

        }
 };
 
 class vec2:public vec1
 {
       double cx, cy;
       public:
            double dlina(double a, double b){
        return a=sqrt(pow(b,2)+pow(a,2));//вычисление длинны вектора
        }
        double chislo(double a, double b, double ca)
        {
cx=ca*a;
cy=ca*b;
cout<<"Proizvedenie A na chislo="<<endl;
cout<<cx<<endl;
cout<<cy<<endl;
               }
              double scal(double a,double b,double e,double f)
{
       double ab;
       ab=a*e+b*f;
       return ab;
}
               

       };
 
 main()
 {
       
cout<<"Vvedite chislo vibrannogo puncta, najmite enter"<<endl;
cout<<"1. dlinna vectora"<<endl<<"2. Umnojenie na chislo"<<endl<<"3. scalar proizved vectorov"<<endl<<"4. slojenie vectorov"<<endl<<"5. exit"<<endl;

          int sw;
          cin>>sw;
          
          switch(sw)
{
               case 1: //Длинна вектора A
               {
               double a,b,d;
      cout<<"Vector A="<<endl;
      cin>>a;
      cin>>b;
            
vec1 m;

d=m.dlina(a,b);//вызывается первый метод
cout<<"Dlina A="<<d<<endl;

m.print(a,b);

 return 0;
}
case 2://умножение вектора на число
{
     double a,b,ca;
     cout<<"Vector A="<<endl;
     cin>>a;
     cin>>b;
     cout<<"Chislo="<<endl;
     cin>>ca;

     vec2 n;
     n.chislo(a,b,ca);
return 0;
 }
  case 3:// Скалярное произведение векторов
      {
           double a,b;
      cout<<"Vector A="<<endl;
      cin>>a;
      cin>>b;
      
      cout<<"vector B="<<endl;
      double e, f;
      cin>>e;
      cin>>f;
      vec2 n;
      double ab;
      ab=n.scal(a,b,e,f);

      cout<<"proizvedenie="<<ab<<endl;
            return 0;
      }
      
      case 4://сложение векторов
      {
      cout<<"Vector A="<<endl;
      double a,b;
      cin>>a;
      cin>>b;
      
      cout<<"vector B="<<endl;
      double e, f;
      cin>>e;
      cin>>f;
            
      if(a==e||b==f)
      {
      double ab;
      vec2 n;
      ab=n.scal(a,b,e,f);
      double d,t;
      d=n.dlina(a,b);//Длина вектора A
      t=n.dlina(e,f);//Длина вектора B
      double alpha;
      alpha=(ab/d*t);//cos alpha м.у векторами
      cout<<"cos a="<<alpha<<endl;
      double summ;
      d=fabs(d);
      t=fabs(t);
      summ=pow(d,2)+pow(t,2)+2*d*t*alpha;
      summ=sqrt(summ);
      cout<<summ<<endl;
      }
      if(a==f||b==e)
      {
                    double ab;
                    vec2 n;
      ab=n.scal(a,b,e,f);
      double d,t;
      d=n.dlina(a,b);//Длина вектора A
      t=n.dlina(e,f);//Длина вектора B
      double alpha;
      alpha=(ab/d*t);//cos alpha м.у векторами
      double summ;
      d=fabs(d);
      t=fabs(t);
      summ=sqrt(pow(d,2)+pow(t,2)-2*d*t*alpha);      
      cout<<summ<<endl;
                    }
      else
      {
          cout<<"pri zadannih coordinatah slojenie nevozmojno"<<endl;
            
            }
            return 0;
      }
      case 5:
      {
            
            return 0;
      }  


}
}

Почему то здесь код оставил без изменений - а по второй ветке if переходит... Чудеса да и олько.
Как сделать, чтобы второй раз нахождение длинны не писать в vec2 а обращаться к vec1 - можно ведь как-то без написания функции повторно ссылку какую-то?

  Ответить  
 
 автор: KernelPanic   (07.06.2012 в 16:19)   письмо автору
 
   для: KernelPanic   (27.05.2012 в 16:06)
 

В итоге математику подправил , немного лишнего убрал и все заработало :).
Счастью моему нет предела.
На отлично сдал.
Спасибо за советы!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования