Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка при реализации меню, ошибка при реализации меню 
:(
    Опции темы
555shiro
Дата 18.12.2010, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 3.1.2010

Репутация: нет
Всего: нет



 Всем привет !
Необходимо организовать меню для этой программы,а у меня при выводе функции выдаёт ошибку....... 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();
}
//-------------------------------
 

PM MAIL   Вверх
Чoо
Дата 18.12.2010, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



потому что 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

Это сообщение отредактировал(а) Чoо - 18.12.2010, 12:21


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
555shiro
Дата 18.12.2010, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 3.1.2010

Репутация: нет
Всего: нет



Цитата(Ч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++)


Это сообщение отредактировал(а) 555shiro - 18.12.2010, 13:03
PM MAIL   Вверх
Чoо
Дата 18.12.2010, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Код

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;
  }
}

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


Это сообщение отредактировал(а) Чoо - 18.12.2010, 17:31


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
555shiro
Дата 19.12.2010, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 3.1.2010

Репутация: нет
Всего: нет



Цитата(Ч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):

PM MAIL   Вверх
Чoо
Дата 19.12.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



после свитча не нужно двоеточие.  это я опечатался

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

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


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.