Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > ошибка при реализации меню


Автор: 555shiro 18.12.2010, 12:02
 Всем привет !
Необходимо организовать меню для этой программы,а у меня при выводе функции выдаёт ошибку....... smile 
Код

#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
class vector
{
        private:
        int *mas;   //  массив  
        int low;        // нижняя граница
        int high;     // верхняя граница
        public:
        vector();                         //   конструктор
        vector(int low, int high);                  //     конструктор с настройкой границ
        ~vector();                          //  деструктор
        int Add(vector *v);     //   сложить 2 вектора
        int Sub(vector *v);    //    вычесть 2 вектора
        void Mul(int k);          //  умножить вектор на число
        void Div(int k);                //   поделить вектор на число
        int &operator[](int k);              //  обращение к элементу
        void VyvodElem(int index);    //  вывод одного элемента ветора
        void VyvodVector(void);   //  вывод всего элемента вектора
};
vector::vector()
{        low= 0;
        high= 100;
        mas= (int*)malloc((high-low+1)*4);
}
vector::vector(int low, int high)
{
        this->low= low;
        this->high= high;
        mas= (int*)malloc((high-low+1)*4);
}
vector::~vector()
{
        free(mas);
}
int vector::Add(vector *v)        // описание функции
{
        if ((low==v->low)&&(high==v->high))
        {
                for (int i=0; i<=high-low; i++)
                mas[i]+= v->mas[i];
                return 0;
        }
        return 1;
}
void vector::Mul(int k)
{
        for (int i=0; i<=high-low; i++)
                mas[i]*= k;
}
void vector::Div(int k)
{
        for (int i=0; i<=high-low; i++)
                mas[i]/= k;
}
int vector::Sub(vector *v)
{
        if ((low==v->low)&&(high==v->high))
        {
                for (int i=low; i<=high; i++)
                mas[i]-= v->mas[i];
                return 0;
        }
        return 1;
}
int &vector::operator[](int index)
{
        if ((index>=low)&&(index<=high))
        {
                return mas[index-low];
        }
        throw "error";
}
void vector::VyvodElem(int index)
{
        if ((index>=low)&&(index<=high))
        {
                printf("%d", mas[index-low]);
        }
        else
        printf("Worng index");
}
void vector::VyvodVector(void)
{
        for (int i=0; i<=high-low; i++)
                printf("%d ", mas[i]);
        printf("\n");
}
 
void main()
{
        vector v(10, 20);
 
        for(int i=10; i<=20; i++)
                v[i]= i;
 
        v.VyvodVector();
        v.Mul(10);
        v.VyvodVector();
        v.Div(5);
        v.VyvodVector();
 
 // здесь начинается меню........
 
       int n;
 
        cout<<"MENU:"<<endl;
        cout<<"0-exit"<<endl;
        cout<<"1-slogit 2 vectora"<<endl;
        cout<<"2-vichest 2 vectora"<<endl;
        cout<<"3-ymnogit vector na chislo"<<endl;
        cout<<"4-delit vector na chislo"<<endl;
        cout<<"5-vivod odnogo elementa "<<endl;
        cout<<"6-vivod vsego elementa"<<endl;
        cin>>n;
 
         for(int i=0;i<100;i++)
       if(n==1)
      {
      cout<<Add();   // сложение 2 векторов....здесь выдаёт ошибку...почему ?
      }
 
         if(n==0)
     {
      exit(1);
      }
        getch();
}
//-------------------------------
 

Автор: Чoо 18.12.2010, 12:07
потому что add - функция-член класса. Может вызываться только объектом этого класса

Добавлено @ 12:13
ну и в качестве параметра надо передать указатель на объект.
далее:
меню записать можно было и такsmile :
Код

        cout<<"MENU:\n"
                "0-exit\n"
                "1-slogit 2 vectora\n"
                "2-vichest 2 vectora\n"
                "3-ymnogit vector na chislo\n"
                "4-delit vector na chislo\n"
                "5-vivod odnogo elementa\n"
                "6-vivod vsego elementa\n";
        cin>>n;

как что работает - я не смотрел.

Добавлено @ 12:14
класс не ваш, наверное? smile

Добавлено @ 12:20
при аткой реализации меню, если введем 1, то произойдет сложение вектора 100 раз, если любйю другое значение, цикл пройдет тоже 100 раз, но ни че сделано не будет. Если введем ноль, так же цикл 100 раз, птом exit(1). вопщем меню неработоспособное user posted image

Автор: 555shiro 18.12.2010, 12:51
Цитата(Чoо @ 18.12.2010,  12:07)
потому что add - функция-член класса. Может вызываться только объектом этого класса

Добавлено @ 12:13
ну и в качестве параметра надо передать указатель на объект.
далее:
меню записать можно было и такsmile :
Код

        cout<<"MENU:\n"
                "0-exit\n"
                "1-slogit 2 vectora\n"
                "2-vichest 2 vectora\n"
                "3-ymnogit vector na chislo\n"
                "4-delit vector na chislo\n"
                "5-vivod odnogo elementa\n"
                "6-vivod vsego elementa\n";
        cin>>n;

как что работает - я не смотрел.

Добавлено @ 12:14
класс не ваш, наверное? smile

Добавлено @ 12:20
при аткой реализации меню, если введем 1, то произойдет сложение вектора 100 раз, если любйю другое значение, цикл пройдет тоже 100 раз, но ни че сделано не будет. Если введем ноль, так же цикл 100 раз, птом exit(1). вопщем меню неработоспособное user posted image


значит нужно выводить функци так...

Код

cout<<vector(*v);   //


всё равно выдаёт ошибку...

а  если изаеню цикл..тогда же будет 1 раз  складывать вектор
 
Код

for(int i=0;i<2;i++)

Автор: Чoо 18.12.2010, 17:30
Код

int vector::Add(vector *v)        // описание функции
{
        if ((low==v->low)&&(high==v->high))
        {
                for (int i=0; i<=high-low; i++)
                mas[i]+= v->mas[i];
                return 0;
        }
        return 1;
}

возвращает 1, если сложение не удалось, возращает 0, если удалось (вообще как-то не логичноsmile ). вопщем я бы переделал наоборот:
Код

int vector::Add(vector *v)        // описание функции
{
        if ((low==v->low)&&(high==v->high))
        {
                for (int i=0; i<=high-low; i++)
                mas[i]+= v->mas[i];
                return 1;
        }
        return 0;
}

далее. Что вы хотите добиться кодом:

Цитата(555shiro @  18.12.2010,  12:51 Найти цитируемый пост)
    
cout<<vector(*v);   //

?
даже если бы так получилось, но это не получится, смысла выводить на консоль единицу или ноль - ни какого.
Поэтому сложение двух объектов типа vector надо бы сделать так:
Код

/*...*/
vector a(10,10), b(10,10);
/*здесь заполняем их, не привожу код, и атк все ясно*/
/*...*/
/*собственно сложение*/
if(a.Add(&b))
  /*выводим например новое содержимое массива или просто сообщаем успешно, или не успешно*/
  cout << "Операция сложения выполнена\n";
else
  cout << "Операция сложения не выполнена\n";


Цитата(555shiro @  18.12.2010,  12:51 Найти цитируемый пост)
а  если изаеню цикл..тогда же будет 1 раз  складывать вектор

а почему бы тогда не сделать:
Код

for(;;)
{
  cin >> n;
  switch(n):{
    case 0: /*действия*/; break;
    case 1: /*действия*/; break;
    case 2: /*действия*/; break;
    case 3: /*действия*/; break;
    case 4: /*действия*/; break;
    case 5: /*действия*/; break;
    case 6: /*действия*/; break;
  }
}

и тогда будет делать столько, сколько надо.

Автор: 555shiro 19.12.2010, 16:13
Цитата(Чoо @  18.12.2010,  17:30 Найти цитируемый пост)
for(;;){  cin >> n;  switch(n):{    case 0: /*действия*/; break;    case 1: /*действия*/; break;    case 2: /*действия*/; break;    case 3: /*действия*/; break;    case 4: /*действия*/; break;    case 5: /*действия*/; break;    case 6: /*действия*/; break;  }}


Надеюсь я правильно понял ...

Код

#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
class vector
{
        private:
        int *mas;   //  массив  
        int low;        // нижняя граница
        int high;     // верхняя граница
        public:
        vector();                         //   конструктор
        vector(int low, int high);                  //     конструктор с настройкой границ
        ~vector();                          //  деструктор
        int Add(vector *v);     //   сложить 2 вектора
        int Sub(vector *v);    //    вычесть 2 вектора
        void Mul(int k);          //  умножить вектор на число
        void Div(int k);                //   поделить вектор на число
        int &operator[](int k);              //  обращение к элементу
        void VyvodElem(int index);    //  вывод одного элемента ветора
        void VyvodVector(void);   //  вывод всего элемента вектора
};
vector::vector()
{        low= 0;
        high= 100;
        mas= (int*)malloc((high-low+1)*4);
}
vector::vector(int low, int high)
{
        this->low= low;
        this->high= high;
        mas= (int*)malloc((high-low+1)*4);
}
vector::~vector()
{
        free(mas);
}
int vector::Add(vector *v)        // описание функции
{
        if ((low==v->low)&&(high==v->high))
        {
                for (int i=0; i<=high-low; i++)
                mas[i]+= v->mas[i];
                return 1;
        }
        return 0;
}

void vector::Mul(int k)
{
        for (int i=0; i<=high-low; i++)
                mas[i]*= k;
}
void vector::Div(int k)
{
        for (int i=0; i<=high-low; i++)
                mas[i]/= k;
}
int vector::Sub(vector *v)
{
        if ((low==v->low)&&(high==v->high))
        {
                for (int i=low; i<=high; i++)
                mas[i]-= v->mas[i];
                return 0;
        }
        return 1;
}
int &vector::operator[](int index)
{
        if ((index>=low)&&(index<=high))
        {
                return mas[index-low];
        }
        throw "error";
}
void vector::VyvodElem(int index)
{
        if ((index>=low)&&(index<=high))
        {
                printf("%d", mas[index-low]);
        }
        else
        printf("Worng index");
}
void vector::VyvodVector(void)
{
        for (int i=0; i<=high-low; i++)
                printf("%d ", mas[i]);
        printf("\n");
}

void main()
{
        vector v(10, 20);
         vector a(10,10), b(10,10);

          for(int i=10; i<=20; i++)   /*здесь заполняем */
         v[i]= a[i]+b[i];       /*собственно сложение*/

        if(a.Add(&b))        /*выводим например новое содержимое массива или просто сообщаем успешно, или не успешно*/
            {
            cout << "Операция сложения выполнена\n";
             }
  else
{
 cout << "Операция сложения не выполнена\n";
 }
     v.VyvodVector();
        v.Mul(10);
        v.VyvodVector();
        v.Div(5);
        v.VyvodVector();

 // здесь начинается меню........
       int n;
        cout<<"MENU:"<<endl;
       for(;;)
{
  cin >> n;
  switch(n):
  {
    case 0: /*выход*/; break;
    case 1: /*сложение 2 векторов*/; break;
    case 2: /*действия*/; break;
    case 3: /*действия*/; break;
    case 4: /*действия*/; break;
    case 5: /*действия*/; break;
    case 6: /*действия*/; break;
  }
}
        getch();
}
//-------------------------------


Но в этом месте выдаёт ошибку....
Код

 switch(n):

Автор: Чoо 19.12.2010, 16:25
после свитча не нужно двоеточие.  это я опечатался

Добавлено через 34 секунды
вы читайте ошибки компиляции.

Добавлено через 1 минуту и 57 секунд
и меню выводить надо перед циклом, а то непонятно, что программма от нас хочет. 
а там где /*действия*/ напишите свою реализацию

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