Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
1

6-я глава книги "Фундаментальные алгоритмы C++" Роберта Седжвика

30.05.2012, 01:42. Просмотров 2504. Ответов 29
Метки нет (Все метки)

Разбираю 6-ю главу книги Роберт Седжвик: Фундаментальные алгоритмы C++. Части 1-4
Расматриваются простые методы сортировки, любых типов данных.
http://www.proklondike.com/books/cpp/sedzhvik_fundamental_algo1_4.html

В листингах 6.1-6.5 представлены методы сортировок, а в листингах 6.6-6.10 преставлена клиентская программа для любых типов данных типа Item.
В общем переписал вроде все правильно но выдает несколько ошибок типо:
" error LNK2019: unresolved external symbol "void __cdecl show<struct record>(struct record * const,int,int)" (??$show@Urecord@@@@YAXQAUrecord@@HH@Z) referenced in function _main c:\Users\Toha\documents\visual studio 2010\Projects\RobertSedjvik2\RobertSedjvik2\MainDriver.obj"

MainDriver.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdlib.h>
#include <iostream>
#include "Array.h"
#include "exch.h"
#include "Item.h"
using namespace std;
 
void main(int argc, char *argv[])
 
{ int N = atoi(argv[1]), sw = atoi (argv[2]);
 
 
    Item *a = new Item[N];
    if (sw) rand(a, N); else scan(a,N);
    sort(a, 0, N-1);
    show(a, 0, N-1);
}
OrgfunckArray.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <stdlib.h>
#include "Array.h"
template <class Item>
void rand(Item a[], int N)
{ for (int i=0; i<N; i++) rand(a[i]);}
template <class Item>
 void scan(Item a[], int &N)
 { for (int i=0; i <N; i++)
    if (!scan(a[i])) break;
 N =i;
 
 }
 template <class Item>
 void show (Item a[],int l, int r)
 {for (int i=l; i<=r; i++)
 show(a[i]);
 cout << endl;
 }
 template <class Item>
 void sort(Item a[], int l, int r){
     for (int i=l; i<r; i++){
         int f=0;
         for(int j=r; j>i; j--)
             f+=compexch(a[j-1], a[j]);
         for(int j=i+2;j<=r;j++)
             f+=compexch(a[j-1], a[j]);
         if (f==0)break;
     }
 }
exchange.cpp
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <stdlib.h>
template <class Item>
void exch (Item &A, Item &B)
{Item t = A; A= B; B=t;}
template <class Item>
 int compexch (Item &A,Item &B)
 { if (B < A) {exch(A, B); return 1;}else return 0; }
Itemcpp.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
#include<stdlib.h>
#include "Item.h"
using namespace std;
int operator<(const Item& A, const Item& B)
{return A.key< B.key;}
int scan (Item& x)
{  
return (cin>>x.key>>x.info) !=0;}
void rand(Item& x)
{x.key = 1000*(1.0*rand()/100);
x.info=1.0 *rand()/100;}
void show (const Item x)
{cout <<x.key<<" "<<x.info<<endl; }
Array.h
C++
1
2
3
4
5
6
7
8
template <class Item>
void rand(Item a[], int N);
template <class Item>
void scan(Item a[], int &N);
template <class Item>
void show(Item a[], int l, int r);
template <class Item>
void sort (Item a[], int l, int r);
exch.h
C++
1
2
3
4
template <class Item>
void exch (Item &A, Item &B);
template <class Item>
 int compexch (Item &A,Item &B);
Item.h
C++
1
2
3
4
5
6
typedef struct record { int key; float info;} Item;
int operator <(const Item&, const Item&);
int scan(Item&);
void rand (Item&);
void show (const Item&);
using namespace std;
Подскажите пожалуйсто что не так?????? очень надо разобратся как это работает, и вообще... У меня экзамен в воскресенье.
Зы: Если что не так, я все исправлю, мы люди не месные и тп ).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2012, 01:42
Ответы с готовыми решениями:

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания"
Создать класс Книга поля: название книги,количество страниц,год издания...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить...

Книги по С++ (что читать после книги Дейтела "Как программировать на С++")
Добрый день господа!!! Я от можно сказать дочитываю Дейтела &quot;Как...

Книги Седжвика
вечер добрый есть ли существенная разница между этими книгами? 1)...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов),...

29
Avazart
Эксперт С++
7723 / 5632 / 549
Регистрация: 10.12.2010
Сообщений: 25,402
Записей в блоге: 17
30.05.2012, 01:51 2
C++
1
2
3
4
5
6
template <class Item>
void show (Item a[],int l, int r)
{
for (int i=l; i<=r; i++) show(a[i],/*??? , ???*/); // а где остальные два параметра show ???
cout << endl;
}
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
30.05.2012, 01:55  [ТС] 3
show Это перегружиная функция смотрите внимательно, или откройте книгу.
0
Avazart
Эксперт С++
7723 / 5632 / 549
Регистрация: 10.12.2010
Сообщений: 25,402
Записей в блоге: 17
30.05.2012, 02:01 4
А не чего что "части" шаблона по разным файлам разкиданы ?
Где потерялась реализация всего этого ?
C++
1
2
3
4
5
6
7
8
9
//Array.h
template <class Item>
void rand(Item a[], int N);
template <class Item>
void scan(Item a[], int &N);
template <class Item>
void show(Item a[], int l, int r);
template <class Item>
void sort (Item a[], int l, int r);
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
30.05.2012, 02:06  [ТС] 5
А какая разница? Хедер файлы всеравно всегда в мэйне в верху компелируются.
В общем я все сделал как по книге в этом то и вопрос.

Добавлено через 1 минуту
OrgfunckArray.cpp
0
Avazart
Эксперт С++
7723 / 5632 / 549
Регистрация: 10.12.2010
Сообщений: 25,402
Записей в блоге: 17
30.05.2012, 02:07 6
Мэей видит Аррэй(обьявление) но не видит OrgfunckArray.cpp( реализацию )

Если пишишь шаблоны пиши их целиком в одном h-файле.
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
30.05.2012, 02:22  [ТС] 7
Допустим действительно так, как сделать так чтоб он видел OrgfunckArray.cpp в этом то и смысл!!
и появилась одна новая ошибка
error C2065: 'i' : undeclared identifier c:\users\toha\documents\visual studio 2010\projects\robertsedjvik2\robertsedjvik2\array.h 19
Всего одна ошибка.
Зы: Я закоментил содержание Array.h и скопирывал в Array.h содержание OrgfunckArray.cpp , а потом закоментил содержимое OrgfunckArray.cpp, остался один Array.h с функциями, но это не грамотно в хедер файле функции описывать.
0
Avazart
Эксперт С++
7723 / 5632 / 549
Регистрация: 10.12.2010
Сообщений: 25,402
Записей в блоге: 17
30.05.2012, 02:28 8
но это не грамотно в хедер файле функции описывать.
Грамотно если это шаблоны...

Закинь содержимое OrgfunckArray.cpp в Array.h.
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
30.05.2012, 02:30  [ТС] 9
В общем все равно не то я понял почему оно не видет "i" но это не главное опять таже ошибка что в первом сообщении , только иих на две меньше

Добавлено через 57 секунд
Я закинул уже
0
Avazart
Эксперт С++
7723 / 5632 / 549
Регистрация: 10.12.2010
Сообщений: 25,402
Записей в блоге: 17
30.05.2012, 02:35 10
И теперь возможно Array не видит перегруженную show в Itemcpp.cpp

Добавлено через 2 минуты
И чесно говоря я поражаюсь как это все неудобно офорлено...
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
30.05.2012, 02:35  [ТС] 11
В том то и смысл чтоб это все работало в разных файлах, именно так это обьясняется у Роберта Седжвика. Хочется сделать по разным файлам, А хедер файлы это интерфейсы для "высокоуровневых функций" как написано в книге. Допустим Array.h для обработки массивов.
Item.h для задания типа данных. и тд.
0
Avazart
Эксперт С++
7723 / 5632 / 549
Регистрация: 10.12.2010
Сообщений: 25,402
Записей в блоге: 17
30.05.2012, 02:37 12
exchange.cpp нужно всунуть по той же причине в exchange.h
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
30.05.2012, 02:48  [ТС] 13
Это не реально возвращать все в h файлы, я и сам знаю что оно будет работать(уже делал) , важно сделать его в разных файлах, для этого и пришел искать ответы на форуме. Это нужно сделать как в Книге!!! Или пояснить почему там не правильно!! Если Все перенести в Хедер файлы то оно откомпелируется но будет фатал эрор.... в первой строке мэйна.

Да уж печально!!! Спасибо за попытку.
0
Avazart
Эксперт С++
7723 / 5632 / 549
Регистрация: 10.12.2010
Сообщений: 25,402
Записей в блоге: 17
30.05.2012, 03:06 14
Ты ошибаешься.

Вот такая же ошибка как у тебя
Шаблоны. Хеш-функция
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
30.05.2012, 03:07  [ТС] 15
Цитата Сообщение от Avazart Посмотреть сообщение
Ты ошибаешься.
Пожалуйста(исли ты, что то шариш) очень прошу, открой книгу, ссылку я кинул в первом сообщении пункт 6.7 ! Мне просто нет смысла читать её дальше если у меня не заработает этот код!! Я очень хочу ошибатся, но мне надо понять что не так???? В книге расписано именно так, эти методы сортировок мне нужно использовать в других программах.....
0
Avazart
Эксперт С++
7723 / 5632 / 549
Регистрация: 10.12.2010
Сообщений: 25,402
Записей в блоге: 17
30.05.2012, 03:22 16
Это особенность шаблонов на большенстве компиляторов нельзя размещать объявление шаблонов и их реализацию в разных файлах - они должны быть в одном файле
1
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
30.05.2012, 03:23  [ТС] 17
ЛАдно хорошо переделаю, прогу, чтоб работала, и еще один вопрос по этому же коду. Функция мэйн получает параметры
C++
1
2
3
void main(int argc, char *argv[])
 
{ int N = atoi(argv[1]), sw = atoi (argv[2]);
и их сразу использует, где оно должно брать эти параметры?? И для чего таким образом обьявляется мэйн, по крайней мере в книге (этой-же ) всегда так пишится..
0
Avazart
Эксперт С++
7723 / 5632 / 549
Регистрация: 10.12.2010
Сообщений: 25,402
Записей в блоге: 17
30.05.2012, 03:27 18
int argc - количество аргументов
char *argv[] массив аргументов

Это параметры которые надо передать... точнее которые принимает твоя прога в командной строке.

Т.е например если у тебя винда выполняешь команду cmd потом пишиш имя твоей проги и через пробел перечисляешь параметры.
Запускается прога сразу с какими- то данными и выводит результат
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
30.05.2012, 03:33  [ТС] 19
Цитата Сообщение от Avazart Посмотреть сообщение
int argc - количество аргументов
char *argv[] массив аргументов

Это параметры которые надо передать твоей проге в командной строке.
А как это сделать (у меня 2010 студия) Она у меня нече не спрашивает, или это какбы ключи, параметры после запуска ЕХЕ файла? типо *.ехе -2 -34, 45
Но все равно как при компиляции передать эти аргументы в мейн?
0
Avazart
Эксперт С++
7723 / 5632 / 549
Регистрация: 10.12.2010
Сообщений: 25,402
Записей в блоге: 17
30.05.2012, 03:39 20
При компиляции нет, после компиляции ( если не выдаст ошибку) можно через cmd экзешник запустить.

А вообще можно переделать в
C++
1
2
3
4
5
6
7
8
9
int main() // int вместо void обычно пишут
{ 
int N; 
int sw; 
cin>>N;
cin>>sw;
//...
return 0;
}
1
30.05.2012, 03:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2012, 03:39

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование)
Разработать программу с использованием наследования классов, реализующую...

Седжвик Р. - Фундаментальные алгоритмы на C++. Объясните лемму
Большая просьба ко всем, кто читал или читает эту книгу помочь мне.(я читаю 3-ю...

Ответы к упражнениям из книги Сэджвика "Фундаментальные алгоритмы на С++" части 1-4
Привет! Читаю данную книгу, в конце каждой главы имеются упражнения, но нет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru