понедельник, 25 августа 2008 г.

глава 8 упражнение 6


Сделайте шаблонную функцию maxn(), которая принимает в качестве аргумента массив элементов типа Т и целое число, представляющее собой количество элементов в массиве, и которая возвращает элемент с наибольшим значением в этом массиве.
Проверьте ее в программе, которая использует шаблон данной функции с массивом из шести значений типа int и с массивом из четырех значений типа double.
Программа также должна включать специализацию, которая использует в качестве аргумента массив указателей на char и число указателей в качестве второго аргумента и которая возвращает адрес самой длинной строки. Если имеется более одной строки наибольшей длины, функция возвращает адрес первой из них. Выполнить проверку специализации на примере массива, состоящего из пяти указателей на строки.



#include <iostream.h>
#include <stdlib.h>
#include <cstring>

const int it = 5;
template <typename T> T maxn (T Arr[], int k);
template <> int maxn (char * , int );
int main()
{

int iArr [6] = {11, 12, 43, 24, 55, 45};
double dArr [4] = {32.4, 12.5, 34.7, 124.67};
char * chArr [it] =
{
"mellelele",
"Niggggaaaa1",
"6bIgJIgEP",
"Niggggaaaa2",
"g-koder"
};
cout << " massiv iArr iz 6 zna4enij tipa INT : " << endl;
cout << " massiv dArr iz 4 zna4enij tipa DOUBLE : " << endl;
cout << " massiv chArr iz 5 zna4enij tipa CHAR* : " << endl;
cout << "naibolshij element iz massiva iArr : " << maxn(iArr, 6) << endl;
cout << "naibolshij element iz massiva dArr : " << maxn(dArr, 4) << endl;
cout << "naibolshij element iz massiva chArr : " << maxn(chArr, it) << endl;

system("PAUSE");
return 0;
}
template <typename T> T maxn (T Arr[], int k)
{
T temp = 0;
for (int i = 0; i<k; i++)
if (temp < Arr[i])
temp = Arr[i];
return temp;
}
template <>int maxn (char * ukChar[], int k)
{
int temp =0;
int tmp = 0;
for (int i = 0; i<k; i++)
{
if (tmp < strlen(ukChar[i]))
{
tmp = strlen(ukChar[i]);
temp = &ukChar[i];
}
cout << ukChar[i] << endl;

};
return temp;
}

глава 8 упражнение 5

Создайте шаблон функции mах5(), которая использует в качестве своего аргумента массив из пяти элементов типа Т и возвращает наибольший элемент этого массива. (Поскольку размер массива фиксирован, эту операцию можно выполнять в жестко заданном цикле, а не использовать соответствующий аргумент.)

Проверьте его в программе, которая использует массив, состоящий из 5 значений типа 5 int, и массив, содержащий 5 значений double.



#include <iostream.h>
#include <stdlib.h>

template <typename T> T max5 (T Arr[]);
template <typename V> void show (V Arr[]);
int main()
{

int iArr [5] = {11, 12, 43, 24, 55};
double dArr [5] = {32.4, 12.5, 34.7, 124.67, 65.45};
cout << " massiv iArr iz 5 zna4enij tipa INT : ";
show (iArr);
cout << " massiv dArr iz 5 zna4enij tipa DOUBLE : ";
show (dArr);
cout << "naibolshij element iz massiva iArr : " << max5(iArr) << endl;
cout << "naibolshij element iz massiva dArr : " << max5(dArr) << endl;

system("PAUSE");
return 0;
}

template <typename T> T max5 (T Arr[])
{
T temp = 0;
for (int i = 0; i<5; i++)
if (temp < Arr[i])
temp = Arr[i];
return temp;
}

template <typename V> void show (V Arr[])
{
for (int i = 0; i < 5; i++)
cout << " " << Arr[i];
cout << endl;
}

глава 8 упражнение 4

Задан заголовочный файл:



const int Len = 40;
struct golf {
char fullname[Len];
int handicap;
};
// функция требует от пользователя сообщить ей имя и гандикап и присваивает элементам g
// введенные значения - возвращает 1, если введено имя, и 0, если введена пустая строка

int setgolf(golf & g) ;
// Функция вводит в структуру golf полученное имя и гандикап переданные
// значения используются как аргументы функции
void setgolf(golf & g, const char * name, int hc) ;
// функция устанавливает новое значение гандикапа
void handicap (golf & g, int hc) ;
// функция отображает содержимое структуры golf
void showgolf(const golf & g) ;

Скомпилируйте несколько программ на базе этого заголовочного файла. Один файл с именем golf.cpp должен обеспечить подходящие определения функций, которые будут соответствовать прототипам, содержащимся в заголовке файла. Второй файл должен содержать main() и обеспечивать реализацию всех свойств прототипированных функций. Например, цикл должен потребовать ввода массива структур golf и прекращать ввод, когда массив будет заполнен, либо когда вместо имени игрока в гольф пользователь вводит пустую строку. Чтобы получить доступ к структуре golf, функция main() должна использовать только прототипированные функции. -----------------------------------------------------------------------------------------------------


golf.h




// golf.h
const int Len = 40;
struct golf {
char fullname[Len];
int handicap;
};
int setgolf(golf & g) ;
void setgolf(golf & g, const char * name, int hc) ;
void handicap (golf & g, int hc) ;
void showgolf(const golf & g) ;


up.8-4-1.cpp




//up.8-4-1.cpp
#include <iostream.h>
#include <cstring>
#include "golf.h"

int setgolf(golf & g)
{
cout << "Vvedite imja igroka : ";
cin.getline(g.fullname, Len);
cout << "Vvedite handicap : ";
cin >> g.handicap;
cin.get();
if (strlen(g.fullname) != 0)
return 1;
else return 0;
}

void setgolf(golf & g, const char * name, int hc)
{
strcpy(g.fullname, name);
g.handicap = hc;
}

void handicap (golf & g, int hc)
{
g.handicap = hc;
}

void showgolf(const golf & g)
{
cout << "name: " << g.fullname << " handicap: " << g.handicap << endl;
}


up.8-4-2.cpp




//up.8-4-2
#include <iostream.h>
#include <cstring>
#include "golf.h"

const int f = 4;
void main ()
{
int nomer,ihc ;
char chName[Len], ch[5];

golf players[f];
cout << " SNACHALA VVEDITE DANNYE O IGROKAX " << endl;
for (int i = 0; i < f; i++)
{
cout << "igrok #" << i+1 << endl;
if (setgolf(players[i])== 0)
break;
}
cout << "\n\nvyberite nuzhnoe dejstvie\n";
cout << "a)izmenit' dannye b)izmenit' tol'ko handicap\n";
cout << "c)posmotret' vse q)quit\n";
cout << " dannye o igrokax\n\n";
while (cin.getline(ch, 5))
{
if (ch[0]== 'q') // если q то выход
{
cout <<"Bye!\n";
break;
}
if (strlen(ch) == 1) // проверка ввода лишь одного символа
switch (ch[0])
{
case 'a' : cout << "Izmenit' dannye igroka pod nomerom #: ";
(cin >> nomer).get();
cout << "name: ";
cin.getline (chName, Len);
cout << "handicap: ";
(cin >> ihc).get();
setgolf(players[nomer-1], chName, ihc);
break;
case 'b' : cout << "Izmenit' handicap igroka pod nomerom #: ";
(cin >> nomer).get();
cout << "handicap: ";
(cin >> ihc).get();
handicap(players[nomer-1], ihc);
break;
case 'c' : for (nomer=0; nomer<f; nomer++)
showgolf(players[nomer]);
break;

default : cout << "vy vveli ne vernyj simvol, povtorite vvod\n";
}
else cout << "vy vveli neskolko simvolov, povtorite vvod\n";
}
}

глава 8 упражнение 3

Ниже представлен каркас программы. Довершите написание программы, составив соответствующие функции и прототипы. Обратите внимание на то, что в программе должны быть две функции show(), каждая из них использует аргументы, заданные по умолчанию. Используйте спецификатор const там, где считаете нужным. Обратите также внимание на тот факт, что set() должна использовать new в целях выделения достаточного пространства памяти для хранения заданной строки. Используемые здесь методы аналогичны методам, применяемым при задании и реализации классов. (Возможно, вам придется поменять имена файлов заголсвков и удалить директивы using, что зависит от используемого компилятора.)



#include <iostream />
using namespace std;
#include <cstring /> // для вызова strlen(), strcpy()
struct stringy {
char * str; // указывает иа строку
int ct; // длина строки (не содержит '\0')
};

// прототипы set() , show() , and show() попадают сюда

int main ()
{
stringy beany;
char testing[] = "Reality isn't what wit used to be.";
set(beany, testing); // первым аргументом является ссылка,
// выделяет пространство для хранения копии testing,
// использует элемент str строки beany как указатель на
//новый блок, копирует testing в новый блок и присваивается
//значение элементу ct строки beany
show(beany); // печатает элемент типа строка один раз
show(beany, 2); // печатает элемент типа строка дважды
testing[0] = 'D';
testing[1] = 'u' ;
show(testing); // печатает сроку testing один раз
show(testing, 3) ; // печатает строку testing три раза
show("Done!");
return 0 ;
}

MAIN.CPP



#include <iostream.h>
#include <stdlib.h>
using namespace std;
#include <cstring>

struct stringy {
char * str;
int ct;
};

void set (stringy & struc, char tezt[]);
void show (stringy & sys, int n = 1);
void show (const char * str, int n = 1);

int main ()
{
stringy beany;
char testing[] = "Reality isn't what wit used to be.";
set(beany, testing);
show(beany);
show(beany, 2);
testing[0] = 'D';
testing[1] = 'u' ;
show(testing);
show(testing, 3) ;
show("Done!");
system("PAUSE");
return 0 ;
}

void set (stringy & struc, char tezt[])
{
struc.ct = strlen(tezt);
struc.str = new char[struc.ct+1];
strcpy (struc.str, tezt);
}

void show (stringy & sys, int n)
{
cout << "pechat' elementa tipa stroka : "<< n << " raz" << endl;
for ( int i = 0; i<n; i++)
cout << " i: " << sys.str << endl;
}

void show (const char * str, int n)
{
cout << "pechat' stroki TESTING : "<< n << " raz" << endl;
for ( int i = 0; i<n; i++)
cout << " i: " <<str << endl;
}


глава 8 упражнение 2

Структура CandyBar содержит три элемента. Первый элемент содержит фирменное название конфеты. Второй элемент содержит вес (который может принимать дробное значение) конфеты, а третий элемент представляет число калорий (целое значение) в конфете. Напишите программу, использующую функцию, у которой в качестве аргументов выступает ссылка на структуру CandyBar, указатель на char, переменная типа double и переменная типа int и которая использует три последние величины для задания значений соответствующих элементов структуры. Три последних аргумента по умолчанию должны иметь значения "Millennium Munch" 2.85 и 350. Кроме того, программа должна использовать функцию, в качестве аргумента которой выступает ссылка на CandyBar и которая отображает содержимое этой структуры. Используйте спецификатор const там, где считаете нужным.




#include <iostream.h>
#include <stdlib.h>
#include <cstring>

const int size = 17;
struct CandyBar{
char name[size];
double ves;
int kal;
};

void cukerka(CandyBar & konfeta, const char gy[17] = "Millennium Munch",const double d= 2.85,const int i = 350);
void show(const CandyBar & konfeta);

void main ()
{
CandyBar marmeladki;
cukerka(marmeladki);
show (marmeladki);

system("PAUSE");
}

void cukerka(CandyBar & konfeta, const char * nama, const double dVal, const int iVal)
{
strcpy(konfeta.name, nama);
konfeta.ves = dVal;
konfeta.kal = iVal;
}
void show(const CandyBar & konfeta)
{
cout << konfeta.name << endl;
cout << konfeta.ves << endl;
cout << konfeta.kal << endl;
}

глава 8 упражнение 1

Создайте функцию, которая, если задан один аргумент, а именно адрес строки, выводит эту строку один раз. Однако если задан второй аргумент типа int, не равный нулю, то эта функция выводит строку столько раз, сколько было осуществлено вызовов этой функции к моменту ее данного вызова. (Обратите внимание на тот факт, что количество выводимых строк не равно значению второго аргумента, оно равно числу вызовов функции к моменту последнего вызова.) Согласен, это не слишком полезная функция, но практика заставит вас применить некоторые из методов, рассмотренных в данной главе. Воспользуйтесь этой функцией в простой программе, которая способна показать, как эта функция работает.




#include <iostream.h>
#include <stdlib.h>

void func (const char * stroka);
void func (const char * stroka, int k);
int i = 0;
const int arsize = 6;

void main ()
{
char loo[arsize] = "Hello";
func (loo); // 1
func (loo); // 2
func (loo); // 3
func (loo, 5);
system("PAUSE");
}
void func (const char * stroka)
{
cout << stroka << endl;
i++;
}
void func (const char * stroka, int k)
{
if (k != 0)
{
cout << "funkcija budet vyzvana " << i << " raza" << endl;
for (int n = 0; n < i; n++)
cout << n+1 << ": " << stroka << endl;
}
else
cout << "funkcija v zhope " << endl;
}