Показать полную графическую версию : набрал пример по книге, но он не работает
программа многоцелевой сортировки использующая указатели на функции
(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 ==========
в чем ошибка?
котвася, Помню этот пример в книге Дейтелов.
void bubble(int *, const int, int(*)(int,int));
void bobble(int *work, const int size, int (*compare)(int,int))
раз тут есть знающие люди, спрошу еще один вопрос. По этой книге .
Пример снова не работает:
//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;
}
Еще один пример, если можно:
//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;
}
Пример компилируется, но не правильно работает. Не могу разобраться в чем дело. Помогите.
но не правильно работает »Не могу понять, но попробуй собрать такой, я этот пример когда-то тоже набирал. :)
// ГЛАВА 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;
}
//---------------------------------------------------------------------------
Ха
работает!
тему закрывать не буду, может еще какие-нибудь вопросы будут.
Ха
работает! »Ещё бы :teeth: :)
я был просто удивлен, когда увидел:
.....................
input>>setw(5)>>num.line;
.....................
думал что setw используют только для вывода.
котвася, Так одну ж книгу читаем, чего ж ты пропустил-то?
Drongo, вроде не упоминалось про вывод.
котвася, Прочти ещё раз внимательно, я ведь откуда-то нашёл же. :) Возможно в самом листинге кода в книге...
Drongo нашел, но дальше по тексту. На то время еще не дочитал :)
котвася, Отож, я примерно неделю на изучение глав и с получается так что с пятницы до воскресенья, решаю задания по книге после прочтения главы. :)
Вот еще бы один пример.
//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 ==========
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC