Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   набрал пример по книге, но он не работает (http://forum.oszone.net/showthread.php?t=178829)

котвася 22-06-2010 00:50 1439051

набрал пример по книге, но он не работает
 
программа многоцелевой сортировки использующая указатели на функции
(mvs2008)
Код:

//-------------------------------------------------------

#include <iostream>
#include <iomanip>

void bubble(int *, const int, int(*)(int,int));
int ascending(const int,const int);
int descending(const int, const int);

int main()
{
        setlocale(LC_ALL,".1251");

        const int arraySize=10;

        int order, a[arraySize]={2,3,4,5,8,12,10,89,86,45};

        std::cout<<"Введите 1 для сортировки в возрастающем порядке, \n Введите 2 для сортировки в убывающем порядке: ";
        std::cin>>order;

        std::cout<<"\nЭлементы в исходном порядке"<<std::endl;

        for(int i=0; i<arraySize; i++)
                std::cout<<std::setw(4)<<a[i];
        std::cout<<std::endl;

        if(order==1)
        {
                bubble(a,arraySize, ascending);
                std::cout<<"Элементы данных в возрастающем порядке"<<std::endl;
        }
        else
        {
                bubble(a,arraySize,descending);
                std::cout<<"Элементы данных в убывающем порядке"<<std::endl;
        }

        for(int i=0; i<arraySize; i++)
                std::cout<<std::setw(4)<<a[i];
        std::cout<<std::endl;

        system("pause");
        return 0;
}

void bobble(int *work, const int size, int (*compare)(int,int))
{
        void swap(int *, int *);

        for(int pass=1; pass<size; pass++)
                for(int count=0; count<size-1; count++)
                        if((*compare)(work[count],work[count+1]))
                                swap(&work[count], &work[count+1]);
}

void swap(int *element1Ptr, int *element2Ptr)
{
        int temp;

        temp=*element1Ptr;
        *element1Ptr=*element2Ptr;
        *element2Ptr=temp;
}
int ascending(const int a, const int b)
{
        return b<a;
}
int descending(const int a, const int b)
{
        return b>a;
}


1>------ Построение начато: проект: программа_многоцелевой_сортировки, Конфигурация: Debug Win32 ------
1>Компиляция...
1>unit.cpp
1>Компоновка...
1>unit.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl bubble(int *,int,int (__cdecl*)(int,int))" (?bubble@@YAXPAHHP6AHHH@Z@Z) в функции _main
1>C:\Documents and Settings\Admin\Мои документы\Visual Studio 2008\Projects\программа_многоцелевой_сортировки\Debug\программа_многоцелевой_сортировки.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
1>Журнал построения был сохранен в "file://c:\Documents and Settings\Admin\Мои документы\Visual Studio 2008\Projects\программа_многоцелевой_сортировки\программа_многоцелевой_сортировки\Debug\BuildLog.htm "
1>программа_многоцелевой_сортировки - ошибок 2, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

в чем ошибка?

Drongo 22-06-2010 13:15 1439292

котвася, Помню этот пример в книге Дейтелов.

Код:

void bubble(int *, const int, int(*)(int,int));
void bobble(int *work, const int size, int (*compare)(int,int))


котвася 23-06-2010 22:39 1440454

именно из нее

котвася 04-07-2010 00:01 1446794

раз тут есть знающие люди, спрошу еще один вопрос. По этой книге .
Пример снова не работает:

Код:

//FIG6_5.CPP
//Драйвер класса Time1
//ЗАМЕЧАНИЕ: компилируется вместе с TIME1.CPP

#include <iostream>
//определение абстрактного типа данных Time

class Time
{
public:
        Time();//конструктор
        void setTime(int, int, int);
        void printMilitary();
        void printStandard();
private:
        int hour;
        int minute;
        int second;
};
//Конструктор Time присваивает нулевые начальные значания каждому
//элементу данных. Обеспечивает согласованное начальное состояние
//всех объектов Time

Time::Time(){hour=minute=second=0;}

//Задание нового значения Time в виде военного времени.
//Проверка правильности значений данных. Обнуление неверных значений.
Time::setTime(int h, int m, int s)
{
        hour = (h >= 0 && h < 24) ? h : 0;
        minute = (m >= 0 && m < 60) ? m : 0;
        second = (s >= 0 && s < 60) ? s : 0;
}

//Печать времени в военном формате
void Time::printMilitary()
{
        std::cout << (hour < 10 ? "0" : "") << hour << ":"
                << (minute < 10 ? "0" : "") << minute << ":"
                << (second < 10 ? "0" : "") << second;
}
 //Печать времени в стандартном формате
void Time::printStandard()
{
        std::cout << ((hour == 0 || hour == 12) ? 12 : hour%12)
                << ":" << (minute < 10 ? "0" : "") << minute
                << ":" << (second < 10 ? "0" : "") <<second
                << (hour <12 ? "AM" : "PM");
}

//Драйвер проверки простого класса Time

int main()
{
        setlocale(LC_ALL,".1251");
        Time t;// определение зкземпляра объекта t класс Time
        std::cout<<"Начальное значение военного времени равно ";
        t.printMilitary();
        std::cout << std::endl << "Начальное значение стандартного времени равно ";
        t.printStandard();

        t.setTime(13,27,6);

        std::cout << "\n\n" << "Военное время после setTime равно ";
        t.printMilitary();
        std::cout << "\n" <<"Стандартное время после setTime равно ";
        t.printStandard();

        system("pause");
        return 0;
}

1>------ Построение начато: проект: драйвер_класса_Time, Конфигурация: Debug Win32 ------
1>Компиляция...
1>FIG6_5.cpp
1>c:\$p\mvs\{как программировать на с++}\драйвер_класса_time\драйвер_класса_time\fig6_5.cpp(29) : error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\$p\mvs\{как программировать на с++}\драйвер_класса_time\драйвер_класса_time\fig6_5.cpp(29) : error C2556: int Time::setTime(int,int,int): перегруженная функция отличается от 'void Time::setTime(int,int,int)' только возвращаемым типом
1> c:\$p\mvs\{как программировать на с++}\драйвер_класса_time\драйвер_класса_time\fig6_5.cpp(12): см. объявление 'Time::setTime'
1>c:\$p\mvs\{как программировать на с++}\драйвер_класса_time\драйвер_класса_time\fig6_5.cpp(29) : error C2371: Time::setTime: переопределение; различные базовые типы
1> c:\$p\mvs\{как программировать на с++}\драйвер_класса_time\драйвер_класса_time\fig6_5.cpp(12): см. объявление 'Time::setTime'
1>c:\$p\mvs\{как программировать на с++}\драйвер_класса_time\драйвер_класса_time\fig6_5.cpp(62) : error C2264: Time::setTime: ошибка в определении или объявлении функции; функция не вызвана
1>Журнал построения был сохранен в "file://c:\$p\mvs\{как программировать на с++}\драйвер_класса_Time\драйвер_класса_Time\Debug\BuildLog.htm"
1>драйвер_класса_Time - ошибок 4, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

О ЭВРИКА, САМ ДОКУМЕКАЛ!!

вот:
Код:

void Time::setTime(int h, int m, int s)
{
        hour = (h >= 0 && h < 24) ? h : 0;
        minute = (m >= 0 && m < 60) ? m : 0;
        second = (s >= 0 && s < 60) ? s : 0;
}


котвася 25-07-2010 16:14 1460328

Еще один пример, если можно:
Код:

//MAIN.CPP
//Перегрузка операций поместить в поток и взять из потока

#include <iostream>

#if !defined(__USING_STD_NAMES__) && defined(__cplusplus)
using namespace std;
#endif



class PhoneNumber
{
        friend ostream &operator << (ostream &, const PhoneNumber &);
        friend istream &operator >> (istream &, PhoneNumber &);
private:
        char areaCode[4];
        char exchange[4];
        char line[5];
};

ostream &operator << (ostream &output, const PhoneNumber &num)
{
        output << "(" << num.areaCode << ")"
                << num.exchange << "-" << num.line;
        return output;
}
istream &operator >> (istream &input, PhoneNumber &num)
{
        input.ignore();
        input.getline(num.areaCode, 4);
        input.ignore(2);
        input.getline(num.exchange, 4);
        input.ignore();
        input.getline(num.line, 5);
        return input;
}

int main()
{
        setlocale(LC_ALL,".1251");

        PhoneNumber phone;

        cout << "Введите номер телефона в "
                << "виде (123) 456-7890:" << endl;
        cin >> phone;

        cout << "Был введен номер телефона:" << endl << phone << endl;
        system("pause");
        return 0;
}

Пример компилируется, но не правильно работает. Не могу разобраться в чем дело. Помогите.

Drongo 25-07-2010 16:40 1460335

Цитата:

Цитата котвася
но не правильно работает »

Не могу понять, но попробуй собрать такой, я этот пример когда-то тоже набирал. :)

Код:

// ГЛАВА 8. рисунок 8.3
// перегруженные операторы, помещённые в поток
// и извлечение из потока
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;
using std::ostream;
using std::istream;

#include <iomanip>
using std::setw;

class PhoneNumber{
    friend ostream &operator<<(ostream &, const PhoneNumber &);
    friend istream &operator>>(istream &, PhoneNumber &);

private:
    char areaCode[4];    // трехцифровой код местности и нулевой символ
    char exchange[4];    // трехцифровой комутатор и нулевой символ
    char line[5];        // четырехцифровая линия и нулевой символ
 };

// перегруженная операция, помещённая в поток
// ( не может быть функцией-членом, если только нам
// не понадобилось бы активизировать её с cout<<somePhoneNumber; ).
ostream &operator<<(ostream &output, const PhoneNumber &num)
{
  output<< "("<<num.areaCode<<") "
        <<num.exchange<<"-"<<num.line;
  return output;            // разрешает вывод из потока <<a<<b<<c;
}

istream &operator>>(istream &input, PhoneNumber &num)
{
  input.ignore();              // пропуск (
  input>>setw(4)>>num.areaCode; // ввод кода местности
  input.ignore(2);              // пропуск ( и пробела
  input>>setw(4)>>num.exchange; // ввод коммутатора
  input.ignore();              // пропуск дефиса
  input>>setw(5)>>num.line;    // ввод линии
  return input;                // разрешает ввод в поток >>a>>b>>c;
}

int main()
{
  int z;
  PhoneNumber phone;      // создание объекта phone

  cout<<"  ENTER NUMBER TELEFON V FORME (123) 456-7890:\n  ";

  // cin>>phone активизирует функцию operator>>
  // путем вызова operator>>(cin, phone)
  cin>>phone;

  // cout<<phone активизирует функцию operator<<
  // путем вызова operator<<(cout, phone)
  cout<<"  BIL VVEDEN NUMBER TELEFONA:  "<<phone<<endl;

  cin>>z;
        return 0;
}
//---------------------------------------------------------------------------


котвася 25-07-2010 16:48 1460340

Ха
работает!
тему закрывать не буду, может еще какие-нибудь вопросы будут.

Drongo 25-07-2010 18:58 1460396

Цитата:

Цитата котвася
Ха
работает! »

Ещё бы :teeth: :)

котвася 25-07-2010 20:06 1460428

я был просто удивлен, когда увидел:
Код:

.....................
input>>setw(5)>>num.line;
.....................

думал что setw используют только для вывода.

Drongo 26-07-2010 11:55 1460726

котвася, Так одну ж книгу читаем, чего ж ты пропустил-то?

котвася 27-07-2010 22:38 1461810

Drongo, вроде не упоминалось про вывод.

Drongo 27-07-2010 23:18 1461835

котвася, Прочти ещё раз внимательно, я ведь откуда-то нашёл же. :) Возможно в самом листинге кода в книге...

котвася 28-07-2010 00:15 1461853

Drongo нашел, но дальше по тексту. На то время еще не дочитал :)

Drongo 28-07-2010 16:01 1462260

котвася, Отож, я примерно неделю на изучение глав и с получается так что с пятницы до воскресенья, решаю задания по книге после прочтения главы. :)

котвася 10-08-2010 22:59 1471076

Вот еще бы один пример.
Код:

//TSTACK.H
//Простой шаблон класса Stack

#ifndef TSTACK_H
#define TSTACK_H

#include <iostream>
using namespace std;

template <class T>
class Stack
{
public:
        Stack(int = 10);
        ~Stack(){delete [] stackPtr;}
        int push(const T&);
        int pop(T&);
        int isEmpty()const {return top == -1;}
        int isFull() const {return top == size - 1;}
private:
        int size;
        int top;
        T *stackPtr;
};
#endif

Код:

//TSTACK.CPP
//Определение функций-элементов класса Stack

#include "TStack.h"

template <class T>
Stack<T>::Stack(int s)
{
        size = s > 0 && s < 1000 ? s : 10;
        top = -1;
        stackPtr = new T[new];
}

template <class T>
int Stack<T>::push(const T &item)
{
        if(!isFull())
        {
                stackPtr[++top] = item;
                return 1;
        }
        return 0;
}

template <class T>
int Stack<T>::pop(T &popValue)
{
        if(!isEmpty())
        {
                popValue = stackPtr[top--];
                return 1;
        }
        return 0;
}

Код:

//MAIN.CPP


#include <iostream>
#include "TStack.h"

int main()
{
        setlocale(LC_ALL, ".1251");
        Stack<float> floatStack(5);
        float f = 1.1;
        cout << "Размещение элементов в floatStack" << endl;

        while(floatStack.push(f))
        {
                cout << f << ' ';
                f +=1.1;
        }
       
        cout << endl << "Стек заполнен. Невозможно разместить "
                << f << endl << endl
                << "Выталкивание элементов из floatStack" << endl;

        while(floatStack.pop(f))
                cout << f << ' ';

        cout << endl << "Стек пуст. Больше нечего вытолкнуть невозможно" << endl;


        Stack<int> intStack(5);
        int i = 1;
        cout << "Размещение элементов в floatStack" << endl;

        while(intStack.push(i))
        {
                cout << i << ' ';
                i++;
        }
       
        cout << endl << "Стек заполнен. Невозможно разместить "
                << i << endl << endl
                << "Выталкивание элементов из floatStack" << endl;

        while(intStack.pop(i))
                cout << i << ' ';

        cout << endl << "Стек пуст. Больше нечего вытолкнуть невозможно" << endl;
        system("pause");
        return 0;
}

А самое главное, я сначала все это пропустил и начала после прочтения выполнять задания. Выполнил, вроде все правильно, но компилятор выдает ошибки. Решил вернутся и набрать примеры, может что упустил. Но тут снова ошибки да еще и такие же как у меня. В чем причина?

1>------ Построение начато: проект: Stack, Конфигурация: Debug Win32 ------
1>Компиляция...
1>main.cpp
1>c:\$p\mvs\{как программировать на с++}\сотировка_пузырек_сlass\сотировка_пузырек_сlass\main.cpp(11) : warning C4305: инициализация: усечение из 'double' к 'float'
1>c:\$p\mvs\{как программировать на с++}\сотировка_пузырек_сlass\сотировка_пузырек_сlass\main.cpp(17) : warning C4305: +=: усечение из 'double' к 'float'
1>Создание кода...
1>Пропуск... (изменения не обнаружены)
1>TStack.cpp
1>Компоновка...
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int __thiscall Stack<int>::pop(int &)" (?pop@?$Stack@H@@QAEHAAH@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int __thiscall Stack<int>::push(int const &)" (?push@?$Stack@H@@QAEHABH@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Stack<int>::Stack<int>(int)" (??0?$Stack@H@@QAE@H@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int __thiscall Stack<float>::pop(float &)" (?pop@?$Stack@M@@QAEHAAM@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int __thiscall Stack<float>::push(float const &)" (?push@?$Stack@M@@QAEHABM@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Stack<float>::Stack<float>(int)" (??0?$Stack@M@@QAE@H@Z) в функции _main
1>C:\$p\mvs\{как программировать на с++}\Сотировка_пузырек_Сlass\Debug\Stack.exe : fatal error LNK1120: 6 неразрешенных внешних элементов
1>Журнал построения был сохранен в "file://c:\$p\mvs\{как программировать на с++}\Сотировка_пузырек_Сlass\Сотировка_пузырек_Сlass\Debug\BuildLog.htm"
1>Stack - ошибок 7, предупреждений 2
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

котвася 11-08-2010 12:40 1471358

странно но решил :)


Время: 15:50.

Время: 15:50.
© OSzone.net 2001-