суббота, 18 октября 2008 г.

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

мое кунг-фу стало быстрее и сильнее =8-)

Комплексное число состоит из двух частей: вещевещественной и мнимой. Одним из способов записи мнимнимого числа является такой: (3.0, 4.0i). Здесь 3.0 - вещественная часть, а 4.0 - мнимая. Предположим, что а = (A,Bi) и с = (C,Di). Вот некоторые операоперации, выполняемые над комплексными числами: • Сложение: а + с = (А + С, (В + D)i) • Вычитание: а - с = (А - С, (В - D)i) • Умножение: а*с = (А*С- B*D,(A*D + B*C)i) • Умножение: (х - вещественное число): х * с = (x*C,x*Di) • Поиск сопряженного числа: ~а = (A, -Bi) Определите класс, оперирующий комплексными числами, чтобы приводимая ниже программа могла воспользоваться им и получать правильные результарезультаты. Обратите внимание на то, что должна выполнятьвыполняться перегрузка операций << и >>. Многие системы уже включают поддержку комплексных чисел в заголовочном файле complex.h, поэтому воспользуйтесь файлом complex0.h, чтобы избежать проблем. Используйте ключевое слово const там, где это оправдано.

#include <iostream>
#include <cstdlib>
using namespace std;
#include "complex0.h" // чтобы избежать путаницы с файлом complex.h

int main ()
{
complex a(3.0, 4.0); // инициализация посредством (3,4i)
complex c;
cout << "Enter a complex number (q to quit):\n";
while (cin >> c)
{
cout << "c is " << c << "\n" ;
cout << "complex conjugate is " << ~c << "\n";
cout << "a + c is " << a + c << "\n";
cout << "a - c is " << a - c << "\n";
cout << "a * c is " << a * c << "\n";
cout << "2 * c is " << 2 * c << "\n";
cout << "Enter a complex number (q to quit):\n";
}
cout << "Done!\n";
system("PAUSE");
return 0;
}

Результаты выполнения программы. (Обратите внивнимание на то, что оператор cin >> с благодаря перегрузке теперь требует ввода вещественной части и мнимой части.)



Enter a complex number (q to quit) :
real: 10
imaginary: 12
с is (10,12i)
complex conjugate is (10,-12i)
a + с is (13,16i)
a - с is (13,16i)
a * с is (-18,76i)
2 * с is (20,24i)
Enter a complex number (q to quit) :
real: q
Done!

------------------------------------------------------------


complex0.h



// complex0.h - определение класса complex0
#ifndef _COMPLEX0_H_
#define _COMPLEX0_H_
class complex
{
private:
double v; // вещественное число
double m; // мнимое число

public:
complex();
complex(double a , double b);
~complex();
complex operator+(const complex & b) const;
complex operator-(const complex & b) const;
complex operator~() const;
complex operator*(double n)const;
complex operator*(const complex & b)const;
friend complex operator*(double n, const complex & b);
friend ostream & operator<<(ostream & os, const complex & b);
friend istream & operator>>(istream & is, complex & b);
};
#endif


complex0.cpp



// complex0.cpp
#include <iostream>
using namespace std;
#include "complex0.h"

complex::complex()
{
v = 0.0;
m = 0.0;
}
complex::complex(double a, double b)
{
v = a;
m = b;
}
complex::~complex()
{
}
complex complex::operator+(const complex & b) const
{
return complex(v + b.v, m + b.m);
}
complex complex::operator-(const complex & b) const
{
return complex(v - b.v, m - b.m);
}
complex complex::operator~() const
{
return complex(v, -m);
}
complex complex::operator*(double n)const
{
return complex(n * v, n * m);
}
complex complex::operator*(const complex & b)const
{
return complex((v * b.v - m * b.m), (v * b.m + m * b.v));
}
complex operator*(double n, const complex & b)
{
return (b * n);
}
ostream & operator<<(ostream & os, const complex & b)
{
os << "(" << b.v << ", " << b.m << "i)";
return os;
}
istream & operator>>(istream & is, complex & b)
{
cout << "real: ";
is >> b.v;
cout << "imaginary: ";
is >> b.m;
return is;
}

main.cpp



#include <iostream>
#include <cstdlib>
using namespace std;
#include "complex0.h" // чтобы избежать путаницы с файлом complex.h

int main ()
{
complex a(3.0, 4.0); // инициализация посредством (3,4i)
complex c;
cout << "Enter a complex number (q to quit):\n";
while (cin >> c)
{
cout << "c is " << c << "\n" ;
cout << "complex conjugate is " << ~c << "\n";
cout << "a + c is " << a + c << "\n";
cout << "a - c is " << a - c << "\n";
cout << "a * c is " << a * c << "\n";
cout << "2 * c is " << 2 * c << "\n";
cout << "Enter a complex number (q to quit):\n";
}
cout << "Done!\n";
system("PAUSE");
return 0;
}

пятница, 17 октября 2008 г.

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

Перепишите класс Stonewt таким образом, чтобы он мог перегружать операции сравнения. Напишите программу, которая объявляет массив из шести объектов класс а Stonewt и выполняет инициализацию трех первых объектов в объявлении массива. Воспользуйтесь циклом, чтобы осуществить считывание значений, используемых для присваивания остальным трем элементам массива. Далее необходимо отобразить максимальный и минимальный элементы, а также количество элементов, превышающих или равных 11 стоунам.


stonewt.h



// stonewt.h - определение класса Stonewt
#ifndef _STONEWT_H_
#define _STONEWT_H_
class Stonewt
{
private:
int stone; //всего стоунов
double pds_left; //дробное число фунтов
double pounds; //общий вес в фунтах
char mode; // f - фунты, s - стоуны
public:
Stonewt(double lbs, int stn = 0, char form = 'f'); // конструктор
Stonewt ();// конструктор, заданный по умолчанию
~Stonewt();
void f_mode(); // установить mode в 'f'
void s_mode(); // установить mode в 's'
Stonewt operator+(const Stonewt & b) const;
Stonewt operator-(const Stonewt & b) const;
Stonewt operator-() const;
Stonewt operator*(double n) const;
bool operator==(const Stonewt & b) const;
bool operator<(const Stonewt & b) const;
bool operator>(const Stonewt & b) const;
bool operator<=(const Stonewt & b) const;
bool operator>=(const Stonewt & b) const;
bool operator!=(const Stonewt & b) const;
// дружественные конструкции
friend Stonewt operator*(double n, const Stonewt & a);
friend ostream & operator<<(ostream & os, const Stonewt & v);
friend istream & operator>>(istream & is, Stonewt & v);
int st()const; // возвращает число стоунов
};
#endif

stonewt.cpp



#include <iostream>
using namespace std;
#include "stonewt.h"
const int Lbs_per_stn = 14;
Stonewt::Stonewt() // конструктор по умолчанию
{
mode = 'f';
pounds = 0.0;
pds_left = 0.0;
stone = 0;
}
Stonewt::Stonewt(double lbs, int stn, char form) // создает объект Stonewt на базе значения double
{
mode = form;
stone = int(lbs) / Lbs_per_stn + stn;
pds_left = int(lbs) % Lbs_per_stn + lbs - int(lbs) ;// целочисленное деление
pounds = stn * Lbs_per_stn +lbs;
}
Stonewt::~Stonewt() // деструктор
{
}
void Stonewt::f_mode()
{
mode = 'f';
}
void Stonewt::s_mode()
{
mode = 's';
}
Stonewt Stonewt::operator+(const Stonewt & b) const
{
return Stonewt(pounds + b.pounds);
}
Stonewt Stonewt::operator-(const Stonewt & b) const // вычитание объекта b класса Stonewnt из объекта а
{
return Stonewt(pounds - b.pounds);
}
Stonewt Stonewt::operator-() const // изменяет знак объекта Stonewnt на противоположный
{
return Stonewt(-pounds);
}
Stonewt Stonewt::operator*(double n) const // умножение Stonewnt на n
{
// v.stone = int(v.pounds) / Lbs_per_stn; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// v.pds_left = int(v.pounds) % Lbs_per_stn + v.pounds - int(v.pounds) ;

return Stonewt(n * pounds);
}
//операции сравнения
bool Stonewt::operator==(const Stonewt & b) const
{
return pounds == b.pounds;
}
bool Stonewt::operator>(const Stonewt & b) const
{
return pounds > b.pounds;
}
bool Stonewt::operator<(const Stonewt & b) const
{
return pounds < b.pounds;
}
bool Stonewt::operator>=(const Stonewt & b) const
{
return pounds >= b.pounds;
}
bool Stonewt::operator<=(const Stonewt & b) const
{
return pounds <= b.pounds;
}
bool Stonewt::operator!=(const Stonewt & b) const
{
return pounds != b.pounds;
}
// дружественные методы
Stonewt operator*(double n, const Stonewt & a) // умножает n на объект а класса Stonewnt a
{
return (a * n);
}
ostream & operator<<(ostream & os, const Stonewt & v) // отображает в фунтах, если mode является f,
{ // отображает в поундах и фунтах, если mode является s
if (v.mode == 'f')
os << "pounds = " << v.pounds << "\n";
else
if (v.mode == 's')
os << "stone = " << v.stone << ", " << "pounds = " << v.pds_left << "\n" ;
else
os << "Stonewt object mode is invalid";
return os;
}
istream & operator>>(istream & is, Stonewt & v)
{
cout << "mode s or f : ";
is >> v.mode;
if (v.mode == 's')
{
cout << "stone : ";
is >> v.stone;
cout << "pds_left : ";
is >> v.pds_left;
v.pounds = v.stone * Lbs_per_stn + v.pds_left;
}
if (v.mode == 'f')
{
cout << "pounds : ";
is >> v.pounds;
v.stone = int(v.pounds) / Lbs_per_stn;
v.pds_left = int(v.pounds) % Lbs_per_stn + v.pounds - int(v.pounds) ;
}
return is;
}
int Stonewt::st() const // возвращает число стоунов (нужно для этой конченой задачи)
{
return stone;
}

main.cpp



#include <iostream>
#include <cstdlib>
using namespace std;
#include "stonewt.h"
const int ArSize = 6;
int main()
{
Stonewt a[ArSize] =
{
Stonewt(122.4, 5, 's'),
Stonewt(200, 0, 's'),
Stonewt(80.5, 9, 's')
};
Stonewt min;
Stonewt max;
int elem = 0;
cout << "-=-=-=vvedite zna4eni9l dlja 3 objectov=-=-=-=-\n";
for (int i = 3; i < ArSize; i++)
{
cout << "object #" << i+1 << " :\n";
cin >> a[i];
}
min = max = a[0];
for (int n = 0; n < ArSize; n++)
{
if (max < a[n])
max = a[n];
else min = a[n];
if (a[n].st() >= 11)
elem++;
cout << "object #" << n << " " << a[n];
};
cout << "minimalnyi object: " << min << endl;
cout << "maximalnyi object: " << max << endl;
cout << elem << " objectov soderzhat 11 i bolshe stounov\n";
system("PAUSE");
return 0;
}

вот это говно friend istream & operator>>(istream & is, Stonewt & v); сам сделал... почти не реально, но все-таки оно так и есть =)).. Нет, это наконец-то не говно, это нормальный код (неужели свершилось)... хотяяяя...

четверг, 16 октября 2008 г.

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

это полный ппц... тупо передрал с 1ого упражнения... даже впадлу было нормальный майн напесать.. да и вротмненоги йатд, что это песдатый говнокод *lol

Внесите такие изменения в класс Stonewt, чтобы в нем содержался элемент состояния, посредством которого можно было бы установить представление объекта в стоунах, в целых или дробных значениях фунтов. Перегрузите операцию << для замены методов show_stn() и show_lbs(). Перегрузите операции сложения, вычитания и умножения таким образом, чтобы можно было складывать, вычитать и умножать значения Stonewt. Выполните тестирование полученного класса с помощью короткой программы.

stonewt.h



//определение класса Stonewt
#ifndef _STONEWT_H_
#define _STONEWT_H_
class Stonewt
{
private:
int stone; //всего стоунов
double pds_left; //дробное число фунтов
double pounds; //общий вес в фунтах
char mode; // f - фунты, s - стоуны
public:
Stonewt(double lbs = 0.0, int stn = 0, char form = 'f'); // конструктор
Stonewt ();// конструктор, заданный по умолчанию
~Stonewt();
void f_mode() ; // установить mode в 'f'
void s_mode(); // установить mode в 's'
Stonewt operator+(const Stonewt & b) const;
Stonewt operator-(const Stonewt & b) const;
Stonewt operator-() const;
Stonewt operator*(double n) const;
// дружественные конструкции
friend Stonewt operator*(double n, const Stonewt & a);
friend ostream & operator<<(ostream & os, const Stonewt & v);
};
#endif

stonewt.cpp



#include <iostream>
using namespace std;
#include "stonewt.h"
const int Lbs_per_stn = 14;
Stonewt::Stonewt() // конструктор по умолчанию
{
mode = 'f';
pounds = pds_left = 0.0;
stone = 0;
}
Stonewt::Stonewt(double lbs, int stn, char form)// создает объект Stonewt на базе значения double
{
mode = form;
stone = int(lbs) / Lbs_per_stn + stn;
pds_left = int (lbs) % Lbs_per_stn + lbs - int (lbs) ;// целочисленное деление
pounds = stn * Lbs_per_stn +lbs;
}
Stonewt::~Stonewt() // деструктор
{
}
void Stonewt::f_mode()
{
mode = 'f';
}
void Stonewt::s_mode()
{
mode = 's';
}
Stonewt Stonewt::operator+(const Stonewt & b) const
{
return Stonewt(pounds + b.pounds);
}
Stonewt Stonewt::operator-(const Stonewt & b) const // вычитание объекта b класса Stonewnt из объекта а
{
return Stonewt(pounds - b.pounds);
}
Stonewt Stonewt::operator-() const // изменяет знак объекта Stonewnt на противоположный
{
return Stonewt(-pounds);
}
Stonewt Stonewt::operator*(double n) const // умножение Stonewnt на n
{
return Stonewt(n * pounds);
}
// дружественные методы
Stonewt operator*(double n, const Stonewt & a) // умножает n на объект а класса Stonewnt a
{
return (a * n);
}
ostream & operator << (ostream & os, const Stonewt & v) // отображает в фунтах, если mode является f,
{ // отображает в поундах и фунтах, если mode является s
if (v.mode == 'f')
os << "pounds = " << v.pounds << "\n";
else
if (v.mode == 's')
os << "stone = " << v.stone << ", " << "pounds = " << v.pds_left << "\n" ;
else
os << "Stonewt object mode is invalid";
return os;
}

main.cpp



#include <iostream>
#include <cstdlib>
using namespace std;
#include "stonewt.h"
int main()
{
Stonewt vasja(234);
Stonewt gogi(250.5, 2, 's');
Stonewt vagogi(0.0, 0, 'f');

double d = 0;
cout << vasja;
cout << gogi;
vagogi = vasja + gogi;
cout << vagogi;
vagogi.s_mode();
cout << vagogi;
cout << vasja/2;
cout << gogi * 2;
cout << 2 * gogi;
system("PAUSE");
return 0;
}

среда, 15 октября 2008 г.

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

припизженей задание не придумаешь, но я сделал как сам понял =8-|) Я понял, что
нужно работать с количеством шагов (итераций.. ну с steps++ короче). Возможно
аффтар имел ввиду сравнивать сами вектора ( Vector).. ну можно было.. можно было
добавить в описание класса перегрузку больше, меньше и ровно (>, <, == )... только
вот вопрос возникает: а по какому показателю сравниваются вектора?.. короче я не
знаю = )).. да и впадлу думать...


ЗАДАНИЕ : листинг 10.13



#include <iostream>
#include <cstdlib> // прототипы функций rand () , srand()
#include <ctime> // прототип функции time()
using namespace std;
#include "vector.h"
int main()
{
srand(time(0)); //генератор случайных чисел с начальным значением
double direction;
Vector" step;
Vector result(0.0, 0.0);
unsigned long steps = 0;
double target;
double dstep;
cout << Enter target distance (q to quit): ";
while (cin >> target)
{
cout << "Enter step length: ";
if (!(cin >> dstep))
break;
while (result.magval() < target)
{
direction = rand() % 360;
step.set(dstep, direction, 'p');
result = result + step;
steps++;
}
cout << "After " << steps << " steps, the subject has the following location: \n"
cout << result << "\n";
result.polar_mode();
cout << " или\n" << result << "\n";
cout << "Average outward distance per step = << result.magval()/steps << "\n";
steps = 0 ;
result.set(0.0, 0.0);
cout << "Enter target distance (q to quit) :
}
cout << "Bye!\n";
return 0;
}


Внести изменения в листинг 10.13, чтобы представленная в нем программа, вместо
того чтобы сообщать результаты одной попытки конкретной комбинации цель-итерация,
сообщала о максимальном, минимальном и среднем числе итераций для N попыток,
где N - это целое число, задаваемое в программе пользователем.


vector.h



// vector.h - класс векторов с операцией <<, выбор режима
#ifndef _VECTOR_H_
#define _VECTOR_H_
class Vector
{
private:
double x ; // значение по горизонтали
double y; // значение по вертикали
double mag;// длина вектора
double ang;// направление вектора
char mode; // 'r' = прямоугольная 'р' = полярная

// приватные методы установки значений
void set_mag() ;
void set_ang() ;
void set_x() ;
void set_y() ;
public:
Vector();
Vector (double nl, double n2 , char form = 'r');
void set (double nl, double n2, char form = 'r');
~Vector() ;
double xval() const { return x;} // отображение значения х
double yval() const { return y;} // отображение значения y
double magval() const { return mag;} // отображение модуля
double angval() const { return ang;} // отображение угла
void polar_mode() ; // установить mode в 'р'
void rect_mode(); // установить mode в 'r'
// перегрузка операций
Vector operator+(const Vector & b) const;
Vector operator-(const Vector & b) const;
Vector operator-() const;
Vector operator*(double n) const;
// дружественные конструкции
friend Vector operator*(double n, const Vector & a);
friend ostream & operator << (ostream & os, const Vector & v);
};
#endif



vector.cpp



// vector.cpp - методы класса Vector
#include <iostream>
#include <cmath>
using namespace std;
#include "vector.h"
const double Rad_to_deg = 57.2957795130823;
// приватные методы
// вычисляет модуль по значениям х и у
void Vector::set_mag()
{
mag = sqrt(x * x + y * y);
}
void Vector::set_ang()
{
if (x == 0.0 && y == 0.0)
ang = 0.0;
else
ang = atan2(y, x);
}
void Vector::set_x() // вычисляет х по полярным координатам
{
x = mag * cos (ang);
}
void Vector::set_y() // вычисляет у по полярным координатам
{
y = mag * sin (ang);
}
// общедоступные методы
Vector::Vector() // конструктор, заданный по умолчанию
{
x = y = mag = ang = 0.0;
mode = 'r';
}
Vector::Vector(double nl, double n2, char form) // создает вектор на базе прямоугольных координат, если form является r
{ // (по умолчанию) или на базе полярных координат, если form является р
mode = form;
if (form == 'r'){
x = nl;
y = n2;
set_mag();
set_ang();
}
else if (form = 'p'){
mag = nl;
ang = n2 / Rad_to_deg;
set_x();
set_y();
}
else{
cout << "Incorrect 3rd argument to Vector () - ";
cout << "vector set to 0\n";
x = y = mag = ang = 0.0;
mode = 'r';
}
}
void Vector::set(double nl, double n2, char form) // создается вектор на базе прямоугольных координат, если form является r
{ // (по умолчанию) или на базе полярных координат, если form является p
mode = form;
if (form == 'r'){
x = nl;
y = n2;
set_mag();
set_ang();
}
else if (form == 'p'){
mag = nl;
ang = n2 / Rad_to_deg;
set_x();
set_y();
}
else{
cout << "Incorrect 3rd argument to Vector() - ";
cout << "vector set to 0 \n";
x = y = mag = ang = 0.0;
mode = 'r';
}
}
Vector::~Vector() // деструктор
{
}
void Vector::polar_mode() //устанавливает режим полярных координат
{
mode = 'p';
}
void Vector::rect_mode() //устанавливает режим прямоугольных координ
{
mode = 'r';
}
// перегрузка операции
Vector Vector::operator+(const Vector & b) const // сложение двух объектов Vector
{
return Vector(x + b.x, y + b.y);
}
Vector Vector::operator-(const Vector & b) const // вычитание объекта b класса Vector из объекта а
{
return Vector(x - b.x, y - b.y);
}
Vector Vector::operator-() const // изменяет знак объекта Vector на противоположный
{
return Vector(-x, -y);
}
Vector Vector::operator*(double n) const // умножение вектора на n
{
return Vector(n * x, n * y);
}
// дружественные методы
Vector operator*(double n, const Vector & a) // умножает n на объект а класса Vector a
{
return (a * n);
}
ostream & operator << (ostream & os, const Vector & v) // отображает прямоугольные координаты, если mode является r,
{ // отображает полярные координаты, если mode является p
if (v.mode == 'r')
os << "(x,y) = (" << v.x << ", " << v.y << ")";
else
if (v.mode == 'p')
os << "(m,a) = (" << v.mag << ", " << v.ang * Rad_to_deg << ") " ;
else
os << "Vector object mode is invalid";
return os;
}



main.cpp



#include <iostream>
#include <cstdlib> // прототипы функций rand(), srand()
#include <ctime> // прототип функции time()
using namespace std;
#include "vector.h"
int main()
{
int N = 0, Nq = 0; // число попыток итераций
srand(time(0)); //генератор случайных чисел с начальным значением
double direction;
Vector step;
Vector result (0.0, 0.0);
unsigned long steps = 0, accum = 0, max = 0, min = 0;
double target;
double dstep;
cout << "Enter kolichestvo popytok (q to quit): ";
if (cin >> N)
cout << "Enter target distance (q to quit): ";
else
{
cout << "Nevernyj vvod!\n";
system("PAUSE");
return 0;
}
while ( (cin >> target)) //(N > 0) &&
{
cout << "Enter step length: ";
if (!(cin >> dstep))
break;
while (result.magval() < target)
{
direction = rand() % 360;
step.set(dstep, direction, 'p');
result = result + step;
steps++;
}
accum = accum + steps;
if (steps > max)
max = steps;
if (min == 0)
min = steps;
else
if ( min > steps)
min = steps;
cout << "After " << steps << " steps, the subject has the following location:\n" ;
cout << result << "\n";
result.polar_mode();
cout << " or\n" << result << "\n";
cout << "Average outward distance per step = " << result.magval()/steps << "\n";
steps = 0;
result.set(0.0, 0.0);
Nq++;
if (--N > 0)
cout << "\n Enter target distance (q to quit): ";
else break;
}
cout << "\n \n \n za " << Nq << " popytok bylo sdelano " << accum << " shagov... \n";
cout << " v srednem za popytku : " << accum/Nq << " shagov\n";
cout << " maximum za popytku : " << max << " shagov\n";
cout << " minimum za popytku : " << min << " shagov\n";
cout << "Bye!\n";
system("PAUSE");
return 0;
}

четверг, 11 сентября 2008 г.

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

Мы можем дать такое описание простого списка:

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

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

void visit(void (*pf) (Item S));

В данном случае pf указывает на функцию (но не на функцию-элемент), которая принимает ссылку на аргумент Item, где Item - это тип элементов списка. Функция visit() применяет эту функцию к каждому элементу списка. Требуется также написать короткую программу, которая реализует этот проект.


spisok.h


#ifndef _SPISOK_H_
#define _SPISOK_H_
#include <iostream>
using namespace std;
struct razmer_xuja {
char name[20];
int xuj;
};
typedef razmer_xuja Item;

class Spisok {
private:
enum { MAX = 3 };
Item spis[MAX];
int top;
public:
Spisok();
bool isempty() const;
bool isfull() const;
bool add(const Item & item);
void visit (void (*pf)(Item & ));
};
#endif

spisok.cpp



#include "spisok.h"

Spisok::Spisok()
{
top = 0;
}
bool Spisok::isempty() const
{
return top == 0;
}
bool Spisok::isfull() const
{
return top == MAX;
}
bool Spisok::add(const Item & item)
{
if (top < MAX)
{
spis[top++] = item;
return true;
}
else
return false;
}
void Spisok::visit(void (*pf)(Item &))
{
int elem = 0;
cout << " vvedite nomer elementa kotoryj nuzhno posetit: " ;
cin >> elem;
cin.get();
if (elem <= top)
(*pf)(spis[elem-1]);
else cout << " takoj element ne sushestvuet... \n";
}

main.cpp



#include <iostream>
using namespace std;
#include "spisok.h"

void my_func (Item &);
int main()
{
Spisok Sp;
char c;
Item po;

cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a) dobavit v stek p)operacii nad elementom +\n";
cout << "+ q)quit +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";

while (cin >> c && toupper(c) != 'Q')
{
while (cin.get() != '\n')
continue;
if (!isalpha(c))
{
cout << '\a';
continue;
}
switch (c)
{
case 'A' :
case 'a' : if (Sp.isfull())
cout << "\n +++!!!! spisok polnyj, operacija nevozmozhna\n\n";
else
{
cout << "vvedite infu : \n";
cout << " name : ";
cin.getline(po.name, 20);
cout << " razmer xuja : ";
cin >> po.xuj;
Sp.add(po);
break;
}
case 'P' :
case 'p' : Sp.visit(my_func);
break;
default : cout << "vy vveli ne vernyj simvol, povtorite vvod\n";
}
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a) dobavit v stek p)operacii nad elementom +\n";
cout << "+ q)quit +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
}
system("PAUSE");
return 0;
}
void my_func(Item & po)
{
int v;
cout << "vvedite 1(odin) esli nuzno izmenit... inache posmotret: \n";
cin >> v;
cin.get();
if (v == 1){
cout << "vvedite name : ";\
cin.getline(po.name, 20);
cout << "vvedite razmer XU9l v sm. : ";
cin >> po.xuj;
}
else {
cout << "\n element ";
cout << "\n -name : " << po.name;
cout << "\n -razmer xuja : " << po.xuj << "\n";
}
}

прога написана уебищно, но мне впадлу ее делать, и так молодец))) -=-=-=- долго думал как так можно void visit (void (*pf)(Item &)); ... хм... однако можно

среда, 10 сентября 2008 г.

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

Класс Betelgeusean plorg обладает следующими свойствами:

• Данные

- У plorg имеется имя, содержащее не более 19 букв.
- plorg характеризуется индексом удовлетворенности (CI- contentment index), который представлен целым числом.

• Операции

- plorg начинается с имени и значения CI, равного 50.
- Значение CI может изменяться.
- plorg может отображать свое имя и CI.
- plorg по умолчанию имеет имя "Plorga".

• Сформулируйте определение класса Plorg (элементы данных и прототипы функций-элементов) который представляет plorg. Дайте определения функций-элементов. Напишите короткую программу, которая демонстрирует все свойства класса Plorg.


plorg.h



#ifndef _PLORG_H_
#define _PLORG_H_

class Plorg
{
private:
char name[19] ;
int CI;
public:
Plorg(char * co = "Plorg");
~Plorg();
void func1(int i);
void showplorg()const;
};
#endif



plorg.cpp



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

Plorg::Plorg(char * co)
{
strcpy(name, co);
CI = 50;
}
Plorg::~Plorg()
{
}

void Plorg::func1(int i)
{
CI = i;
}
void Plorg::showplorg()const
{
cout << "name :" << name << "\n";
cout << "contentment index : " << CI << "\n";
}



move.h



#include <cstdlib>
#include <cctype>
#include <iostream>
#include "plorg.h"
using namespace std;

int main()
{
char nama[19];
char c;
cout << " sosdadim class Plorg. vvedite slovo : ";

cin.getline(nama, 19);
Plorg Pl(nama);
int ci = 0;
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a) izmenit CI p)vyvesti na ekran +\n";
cout << "+ q)quit +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";

while (cin >> c && toupper(c) != 'Q')
{
while (cin.get() != '\n')
continue;
if (!isalpha(c))
{
cout << '\a';
continue;
};
switch (c)
{
case 'A' :
case 'a' : cout << "vvedite novyj CI : ";
cin >> ci;
Pl.func1(ci);
break;

case 'P' :
case 'p' : Pl.showplorg();
break;

default : cout << "vy vveli ne vernyj simvol, povtorite vvod\n";
}
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a) izmenit CI p)vyvesti na ekran +\n";
cout << "+ q)quit +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
}
system("PAUSE");
return 0;
}

опять все дерьмо.. кажеться че-то я недоделал.. имхо мало моска еще ...

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

Дан класс move.h



#ifndef _MOVE_H_
#define _MOVE_H_

//Объявление класса имеет вид:
class Move
{
private:
double x;
double y;
public:
//присваивает х, у значения a, b
Move(double a , double b );
//отображает текущие значения х, у
void showmove()const;
//данная функция присваивает х из m для переменной х из вызывающего
//объекта, чтобы получить новое х, прибавляет у из m для у вызывающего
//объекта, чтобы получить новое у, создает новый объект,
//инициализированный новыми значениями х,у, и возвращает его
Move add(const Move & m)const;
// присваивает х,у значения a, b
void reset(double a = 0, double b =0 );
};
#endif


Дайте определение функции-элемента и напишите программу, которая использует этот класс.


move.h




#ifndef _MOVE_H_
#define _MOVE_H_

class Move
{
private:
double x;
double y;
public:
Move(double a , double b );
void showmove()const;
Move add(const Move & m)const;
void reset(double a = 0, double b =0 );
};
#endif


move.cpp




#include <iostream>
#include "Move.h"
using namespace std;
Move::Move(double a , double b )
{
x = a;
y = b;
}
void Move::showmove()const
{
cout << " x = " << x ;
cout << "\n y = " << y <<"\n";
}
Move Move::add(const Move & m)const
{
return Move (m.x, (this->y+m.y));
}
void Move::reset(double a , double b)
{
x = a;
y = b;
}


main.cpp




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

int main()
{
cout << "fuck pizda Xyu\n\n\n";
Move A(1.5, 2.3);
Move B(3.4, 3.6);
cout << " move aaaaa::::: \n";
A.showmove();
cout << " move bbbbbb::::: \n";
B.showmove();
Move C = A.add(B);
cout << ".............pizdec.................\n";
cout << "new move:::::::::: \n";
C.showmove();
cout << " move aaaaa!!!!!!!!!!:::: \n";
A.reset();
A.showmove();
cout << " move bbbbbb!!!!!!!!!::::: \n";
B.reset();
B.showmove();

system("PAUSE");
return 0;
}


хмммм... неплохо-неплохо :))

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

Рассмотрите следующее определение структуры:



struct customer {
char fullname[35];
double payment;
};


Напишите программу, которая добавляет и удаляет структуры из стека, описанного в объявлении класса. Каждый раз, когда удаляется запись о заказчике, его платеж прибавляется к текущей сумме, а сама текущая сумма выводится на экран. Примечание: нужно иметь возможность сохранять класс Stack неизменным; достаточно изменить объявление typedef так, чтобы Item имел тип customer, а не тип unsigned long. __________________________________________________________________________




golf.cpp




#ifndef _STACK_H_
#define _STACK_H_

struct customer {
char fullname[35];
double payment;
};
typedef customer Item;

class Stack
{
private:
enum {Max = 10};
Item Items[Max];
int top;
public:
Stack();
bool isempty() const;
bool isfull() const;
bool push(const Item & item);
bool pop(Item & item);
};
#endif


golf.cpp




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

Stack::Stack()
{
top = 0;
}
bool Stack::isempty() const
{
return top == 0;
}
bool Stack::isfull() const
{
return top == Max;
}
bool Stack::push(const Item & item)
{
if (top < Max)
{
Items[top++] = item;
return true;
}
else
return false;
}
bool Stack::pop(Item & item)
{
if (top > 0)
{
item = Items[--top];
return true;
}
else
return false;
}


golf.cpp




#include <cstdlib>
#include <iostream>
#include <cctype>
#include "stack.h"

using namespace std;

int main()
{
Stack st;
char c;
customer po;

cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a) dobavit v stek p)udalit iz steka +\n";
cout << "+ q)quit +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";

while (cin >> c && toupper(c) != 'Q')
{
while (cin.get() != '\n')
continue;
if (!isalpha(c))
{
cout << '\a';
continue;
}
switch (c)
{
case 'A' :
case 'a' : if (st.isfull())
cout << "\n +++!!!! stack polnyj, operacija nevozmozhna\n\n";
else {
cout << "vvedite infu : \n";
cout << " fullname : ";
cin.getline(po.fullname, 35);
cout << " pay : ";
cin >> po.payment;
st.push(po);
}
break;
case 'P' :
case 'p' : if (st.isempty())
cout << "stack pustoj\n";
else {st.pop(po);
cout << "zapis : " << po.fullname << " poped \n";
};
break;
default : cout << "vy vveli ne vernyj simvol, povtorite vvod\n";
}
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a) dobavit v stek p)udalit iz steka +\n";
cout << "+ q)quit +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
}
return 0;
}


ООП ... её мать...

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

Выполните упражнение 4 из главы 8, но при этом замените программный код, приведенный там, на соответствующее объявление класса golf. Используйте конструктор с соответствующими аргументами для назначения начальных значений.


golf.h




#ifndef _GOLF_H_
#define _GOLF_H_

class Golf
{
private:
enum {Len = 40};
char fullname[Len];
int handicap;
public:
Golf();
~Golf();
int setgolf();// функция требует от пользователя сообщить ей имя и гандикап и присваивает элементам g введенные значения - возвращает 1, если введено имя, и 0, если введена пустая строка
void setgolf(const char * name, int hc);// Функция вводит в структуру golf полученное имя и гандикап переданные значения используются как аргументы функции
void hcap (int hc);// функция устанавливает новое значение гандикапа
void showgolf() ;// функция отображает содержимое
};
#endif


golf.cpp




#include <iostream>
#include <cstring>
#include "golf.h"
using namespace std;
Golf::Golf()
{
handicap = 0;
}
Golf::~Golf()
{
}
int Golf::setgolf()
{
cout << "Vvedite imja igroka : ";
cin.getline(fullname, Len);
cout << "Vvedite handicap : ";
cin >> handicap;
cin.get();
if (strlen(fullname) != 0)
return 1;
else return 0;
}

void Golf::setgolf(const char * name, int hc)
{
strcpy(fullname, name);
handicap = hc;
}

void Golf::hcap (int hc)
{
handicap = hc;
}

void Golf::showgolf()
{
cout << "name: " << fullname << " handicap: " << handicap << endl;
}


main.cpp




#include <iostream>
#include <cstring>
#include <cctype>
#include "golf.h"
using namespace std;
const int f = 4;

int main (int argc, char *argv[])
{
Golf players[f];
char c;
int nomer,ihc ;
char chName[40];

//cout << " SNACHALA VVEDITE DANNYE O IGROKAX \n";
for (int i = 0; i<f; i++)
{
cout << "igrok #" << i+1 << "\n";
if (players[i].setgolf() == 0)
break;
};
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite 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";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";

while (cin >> c && toupper(c) != 'Q')
{
while (cin.get() != '\n')
continue;
if (!isalpha(c))
{
cout << '\a';
continue;
}
switch (c)
{
case 'A' :
case 'a' : cout << "Izmenit' dannye igroka pod nomerom #: ";
(cin >>; nomer).get();
cout << "name: ";
cin.getline (chName, 40);
cout << "handicap: ";
(cin >>; ihc).get();
players[nomer-1].setgolf(chName, ihc);
break;
case 'B' :
case 'b' : cout << "Izmenit' handicap igroka pod nomerom #: ";
(cin >> nomer).get();
cout << "handicap: ";
(cin >> ihc).get();
players[nomer-1].hcap(ihc);
break;
case 'C' :
case 'c' : for (nomer=0; nomer<f; nomer++)
players[nomer].showgolf ();
break;

default : cout << "vy vveli ne vernyj simvol, povtorite vvod\n";
}
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite 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";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
}
return 0;
}

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

Дайте определение класса, представляющего банков банковский счет. Элементы данных должны содержать имя вкладчика, номер счета (использовать строку) и сальдо. Функции-элементы должны выполнять такие действия, как:
• Создание объекта и его инициализация.
• Назначение начальных значений элементам данных.
• Отображение имени вкладчика, номера счета и сальдо.
• Вклад на банковский счет суммы, заданной аргументом.
• Снятие с банковского счета суммы, заданной аргументом.
напишите короткую программу, иллюстрирующую все эти свойства.


#include < iostream >
#include < cstring >
#include < stdlib.h >
#include "bank.h"
using namespace std;
int main()
{
const int max = 20;
char n1[max];
char n2[max];
double s1 = 0.0;
char c;
Bank Mybank;
cout << "Vvedite name : ";
cin.getline(n1,max);
cout << "Vvedite nomer scheta : ";
cin.getline(n2,max);
cout << "Vvedite saldo : ";
cin >> s1;
Mybank.init(n1, n2, s1);
cout << "\a \n Vyberite dejstvie : \n" ;
cout << " a) popolnit' schet r) snjat' so scheta \n" ;
cout << " s) pokazat' vse dannye q) vyxod!! \n";
while (cin >> c && toupper(c) != 'Q')
while (cin.get() != '\n')
continue;

понедельник, 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;
}

пятница, 25 июля 2008 г.

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


Дать определение рекурсивной функции, которая принимает в качестве аргумента целое число и возвращает факториал этого аргумента.
Напоминаем, что 3 факториал, записывается как 3!, что равно 3 х 2!, при этом 0!, по определению, равен 1. В общем случае n! = n * (n - 1)!.
Проверьте это в программе, которая использует цикл для того, чтобы позволить пользователю вводить различные значения, для которых программа вычисляет факториал.



#include <iostream.h>
#include <stdlib.h>
int main()
{
int ;
double ;
system("PAUSE");
return 0;
}
void countdown(int n)
{
cout « "Counting down ..." « n « "\n";
if (n > 0)
countdown(n-1); // функция вызывает саму себя
cout « n « ": Kaboom!\n";
}

четверг, 10 июля 2008 г.

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

В королевстве Нейтронии, в которой денежной единицей является tvarp, установлены следующие ставки подоходного налога:

первые 5000 tvarp: 0%
следующие 10000 tvarp: 10%
следующие 20000 tvarp: 15%
свыше 35000: 20%

Например, кто-либо получающий 38000 tvarp должен был бы уплатить налог величиной 5000 х 0.00 + 10000 х 0.10 + 20000 х 0.15 + 3000 х 0.20, или 4600 tvarp.

Напишите программу, которая использует цикл для запроса о доходах и для отображения суммы налога. Цикл прерывается, когда пользователь вводит отрицательное число или нечисловое значение.
______________________________________________________


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

int main()
{
int summa;
const int max =4; // можно было бы просто 4, но, имхо, был бы говнокод
double nalog=0;
const int e[max] = {5000, 10000, 20000, 35000}; // значения для ставок
const double procent[max] = {0.00, 0.10, 0.15, 0.20}; //процентные ставки
int i; // для счетчика

cout << "vvedite summu : ";
while (cin >> summa && summa > 0)
{
nalog =0;
for (i=0; i<max; i++)
{
summa = summa - e[i];
if (summa>=0)
nalog = nalog + e[i]*procent[i];
else
{
nalog = nalog + (e[i]+summa)*procent[i];
break;
};
};
cout << "nalog :" << nalog << "\nvvedite summu : ";
};


system("PAUSE");
return 0;
}

________________


сам понимаю, что куй знает что, но вот так вот... Если бы я не напрегся, то созерцали бы вы ...эээээм...... даже слова такого не знаю. Долго ипался, и уже хотел все сделать через иф елсе ))

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

// Структура имен членов Order of Programmers Benevolent struct bop { char fullname[strsize]; //действительное имя char title[strsize]; //название должности char bopname[strsize]; //секретная кличка ВОР int preference; // 0 = fullname, // 1 = title, // 2 = bopname


В программе создайте небольшой массив таких структур и инициализируйте его подходящими значениями. Программа должна выполнять цикл, который позволяет пользователю выбирать различные возможности: a. отображение по имени b. отображение по должности c. отображение по тайной кличке d. отображение по привилегиям q. выход __________________________________________________________


 #include <iostream.h> #include <stdlib.h> struct bop {    char fullname [20];    char title [20];    char bopname[20];    int pref;    }; int main() {    char ch[5];    int i=0;    bop e[3] =    {       { "wimp1", "title1", "bopname1", 1},       { "Raki2", "title2", "bopname2", 0},       {"Celia3", "title3", "bopname3", 2}       }; // инициализация массива структур     cout << "Benevolent Order of Programmers Report\n";    cout << "a. display by name\n";    cout << "b. display by title\n";    cout << "c. display by bopname\n";    cout << "d. display by preference\n";    cout << "q. quit\n";     while (cin.getline(ch, 5))    {       if (ch[0]== 'q') // если q то выход       {          cout <<"Bye!\n";          break;       }    if (strlen(ch) == 1)    // проверка ввода лишь одного символа    switch (ch[0])    {       case 'a' : for (i=0;i<3;i++)                  cout << e[i].fullname << "\n";                  break;       case 'b' : for (i=0;i<3;i++)                  cout << e[i].title << "\n";                  break;       case 'c' : for (i=0;i<3;i++)                  cout << e[i].bopname << "\n" ;                  break;       case 'd' : for (i=0;i<3;i++)                   switch (e[i].pref)                  {                     case 0 : cout << e[i].fullname << "\n";                              break;                     case 1 : cout << e[i].title << "\n";                              break;                     case 2 : cout << e[i].bopname << "\n";                              break;                  };                  break;      default : cout << "vy vveli ne vernyj simvol, povtorite vvod\n";    }    else cout << "vy vveli neskolko simvolov, povtorite vvod\n"; }  system("PAUSE"); return 0; } 

______________________________


особой сложности не встретил, пол-кода взял из прошлого упражнения. Только был подзабывши как со структурами обращаться ))


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

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

Напишите заготовку программы, управляемой меню. Программа должна отображать меню, состоящее из четырех пунктов, каждый из которых помечен буквой. Если пользователь отвечает вводом буквы, отличающейся от одного из допустимых пунктов, программа должна предлагать ему ввести допустимый ответ до тех пор, пока это не будет сделано. Затем программа должна использовать переключатель для выбора простого действия, исходя из ответа пользователя. Результат выполнения программы мог бы выглядеть примерно так:


Please enter one of the following choices:
c) carnivore p) pianist
t) tree g) game

Please enter a c, p, t, or g : y
Please enter a c, p, t, or g : t
A maple is a tree.




#include <iostream.h>#include <stdlib.h>#include <cstring.h>  // для strlen()int main(){   char ch [20];   cout <<  "Please enter one of the following choices:\n";   cout << "c) carnivorne        p) pianist\n";   cout << "t) tree              g) game\n";   cout << "q) quit\n";   while (cin.getline(ch, 20))   {   if (ch[0]== 'q') // если q то выход   {      cout << "quit\n";      break;   }   if (strlen(ch) == 1)    // проверка ввода лишь одного символа   switch (ch[0])   {      case 'c' : cout <<"carnivorne\n";                 break;      case 't' : cout << "tree\n";                 break;      case 'p' : cout << "pianist\n";                 break;      case 'g' : cout << "game\n";                 break;      default : cout << "vy vveli ne vernyj simvol, povtorite vvod\n";   }   else cout <<"vy vveli neskolko simvolov, povtorite vvod\n";}system("PAUSE");return 0;}

Добавил только выход из цикла
Оч много проепался с проверкой на ввод одного символа, только потом вспомнил, что можно замереть длину строки strlen()'ом
Массив символов ограничил 20 и это значит, если ввести больше то прога завершит работу.

среда, 9 июля 2008 г.

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

Напишите программу, которая считывает до десяти значений "пожертвований" в массив значений типа double. Программа должна прерывать ввод при вводе нечислового значения. Она должна сообщать о средней величине "пожертвований", а также о том, сколько значений в массиве превышают среднее значение



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

int main()
{
double pr [10];
double accum = 0;
double sred = 0;
int c=0;
int i=0;
for (i; i<10; i++)
{
cout << " round #" << i+1 << " :";
while (!(cin >> pr[i]))
{
cin.clear();
while (cin.get() != '\n')
continue;
cout << "Please enter number : ";
}
}
for (i=0; i<10; i++)
accum += pr[i];
cout << "\n obschaja summa :" << accum << " \n";
sred = accum/i;
cout << "srednjaja summa :" << sred << " \n\n\n";
for (i=0; i<10;i++)
if (sred < pr[i])
{
c++;
cout << pr[i] << " " ;
};
cout << "takie znachenija vyshe srednego. Ix vsego : " << c <<endl;


system("PAUSE");
return 0;
}

среда, 25 июня 2008 г.

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

Разработайте структуру под названием саг, в которой хранится следующая информация об автомобиле: его марка в виде строки в символьном массиве, а также год его выпуска в виде целого числа. Напишите программу, которая запрашивает пользователя, сколько автомашин следует ввести в каталог. Затем программа должна использовать метод new для создания нового динамического массива в соответствии с указанным количеством структур саг. Далее она должна выдать приглашение на ввод со стороны пользователя марки (которая может состоять из нескольких слов) и года выпуска автомашины для каждой структуры. Следует заметить, что этот процесс требует некоторого внимания, поскольку при этом поочередно осуществляется чтение строковых и числовых данных (подробнее об этом сказано в главе 4). И наконец, программа должна отображать содержимое каждой структуры. Результат выполнения такой программы должен выглядеть следующимобразом:



How many cars do you wish to catalog? 2
Car #1:
Please enter the make: Hudson Hornet
Please enter the year made: 1952
Car #2:
Please enter the make: Kaiser
Please enter the year made: 1951
Here is your collection:
1952 Hudson Hornetu
1951 Kaiser


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

int main()
{
int n;
struct car
{
char name [20];
int year;
};

cout << "vvedite kolichestvo avto i opishite ix : ";
cin >> n; cout << "\n";

car * ps = new car [n];
int i=0;
int num = 0;


for (i;i<n;i++)
{
num = i+1;
cout << "AVTO #" << num << "\n\n";
cout << "vvedite marku avto : ";
cin.get();
cin.getline(ps[i].name,20);
cout << "\nvvedite god avto : ";
cin >> ps[i].year; cout << "\n\n";

}

cout << "\nvasha collectia: \n\n";

for (int r=0;r<n;r++)
cout << ps[r].year << " -- "<< ps[r].name << endl;

system("PAUSE");
return 0;
}

Глава 5 упражнение 4

Допустим, что читатель занимается продажей книги "C++ для начинающих" (C++ For Fools). Напишите программу, которая требует ввода объема ежемесячных продаж этой книги в течение года (в экземплярах книг, а не в денежном выражении). В этой программе должен быть использован цикл, приглашающий ввести данные продаж за каждый месяц. Для этого используется массив указателей типа char *, инициализированных для указания на строки названий месяцев года, а введенные данные сохраняются в массиве значений типа int. После этого программа должна найти сумму содержимого массива и выдать отчет об общем объеме продаж за год.



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

int main()
{
int i;
const char * month[12] =
{
"jan", "feb", "mart", "apr",
"may", "ijun", "ijul", "avgust",
"sept", "okt", "nov", "dec"
};
int cash[12];
int h = 0;
int accum = 0;
cout << "vvedite summu za kazdyj mecjac\n\n\n";
for (i=0; i<12; i++)
{
h=i+1;
cout << h << " " << month[i] << " : ";
cin >> cash[i];
cout << "\n";
}
for (i=0;i<12;i++)
{
h=i+1;
cout << month[i] << " : " << cash[i] << "\n";
accum = accum + cash[i];
}

cout << "\n\n\n summa za god : " << accum << endl;


system("PAUSE");
return 0;
}

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

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



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

int main()
{
int i=1;
int accum=0;

for ( i;i!=0; )
{
cout << "vvedite chislo (0 - KOHEL| OTTEPAL|UU\n";
cin >> i;
accum += i;
cout << "suuma ranee vvedennyx chisel ravna : " << accum << "\n";
}
system("PAUSE");
return 0;
}

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

Напишите программу, которая запрашивает ввод двух целых чисел со стороны пользователя. Затем эта программа должна выполнять расчет и выдачу суммы всех целых чисел, находящихся в пределах между двумя введенными целыми числами. При этом предполагается, что первым вводится меньшее целое число. Например, если пользователь вводит 2 и 9, тогда программа сообщает, что сумма всех целых чисел от 2 до 9 составляет 44.




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

int main()
{
int i;
int j;
int accum=0;
cout << "vvedite celye chisla\n";
cout << "pervoe chilo (menshee)\n";
cin >> i;
cout << "vtoroe chislo (bolshee)\n";
cin >> j;
for ( i;i<=j;i++)
{
accum = accum + i;
cout << i << "...............";
cout << accum << "\n";
}
system("PAUSE");
return 0;
}

вторник, 17 июня 2008 г.

Зарядка для программера

Сводка недоступна. Нажмите эту ссылку, чтобы открыть запись.

функции в затяг..

    Курю ща  функции. До этого думал, что про них знаю все )) Однако там есть очень много приколов. Стоит хорошенько вникнуть.

вторник, 10 июня 2008 г.

четвертый шаг

Все это дело было запущено на ~2года. Работая кузнецом и постоянно бухая, как-то не думалось вооще про это )) Но после моего добровольного увольнения (за пьянку )))) и смены области деятельности (админ) и место и условий проживания (поближе к дому, но зато один в хате), что бы не сходить с ума решил таки продолжить.


Но это уже был Си ++. Правда тоже тяжело, с перерывами. Сначала не мог подобрать подходящий учебничег. Несколько раз начинал, но дойдя до некоторой главы входил в ступор. Потом менял учебник, ну и т.д.


Однажды открыл С.Прата. "Язык программирования C++. Лекции и упражнения". Вот это было то что нужно. Все написано доступно и просто. В данный момент штудирую функции (хз по какому уже разу)






буцкает: Ghostface Killah - Nutmeg

шаг третий: матрица перезагрузка

    Я поступил в колледж (непонятно как) и познакомился там со Смажем. Пошли мы однажды на ночь в интернет кафе. Смаж мне показал что такое чат.ру и канал Programmers. Интересно было о че там общается народ. Интересно, но не понятно.
    Не знаю как, но именно этот канал меня подтолкнул на дальнейшее изучение кодерства, да и Смажа, походу, тоже забрало. Он тогда начал курить плюсы, а я решил попаскалить ( хотя на первом курсе я жестоко игнорил паскаль, может потому, что его преподавали).
    Тогда уже я начал потихоньку въезжать в это дело. Для меня стало больше доходить эта область знаний. Но все-ровно меня до конца не хватило )). Геймер во мне еще жил и даже не плохо себя чувствовал, да и начал увлекаться эзотерической литературкой (типо Ошо).
жизнь мне еще давала шанс встать на путь истинный )))

шаг второй: судный день

    Второй ступенью было.....хм....а что же было?
    Вроде то , что я на летних каникулах, будучи в гостях у бабушки (как обычно) записался на курс по бейсику. Нихера я кончено не понимал, что там мне говорили. Все было космическим, т.е. жопа.
но что-то я уже начал понимать, например: прогер - это чел, у которого Ктулху сожрал мосг.
    Тогда же, я приобрел свою первую шайтан-машину и мне стало не до этого. Я был геймером.

10 PRINT "GOOD BYE, WORLD!"
20 RUN

вроде так, но уже не помню

первый шаг

Первые шаги в говнокодинге я сделал еще в 6-7 классе. Мне тогда родители вместо простой денди подарили че-то типо денди, но только это было ввиде клавиатуры. Клава оказалась простой 8-битной игровой приставкой, только тюнингованая. Там был катридж, на котором был (барабанная дробь) БЕЙСИК!!!! Но он был очень урезанный, можно сказать вооще в говно. Но это было не важно - он меня заинтересовал

Сходил в библиотеку, нарыл какую-то книженцию по бейсику.... ну ,короче, это было мое первое общение с языками программирования.

В это же время в школе начиналась информатика. Старые дряхлые КОРВЕТЫ , какие-то алгоритмы (не помню их). Толи робот. толи еще какая-то хня. Но было так:
    опустить_перо
    переместить_перо
    поднять_перо
    и т.д. )))))
Что-то такого вида. Не важно что это было, но меня это не втыкало.

начало апокасипсиса

Ну вот., настал долгожданный апокалипсис. Потому что самое большое зло, которое может существовать во Вселенной - это я за компилятором
Смогут ли добрые силы меня перенаправить в другое русло? хз. Это будет видно потом. Но на ход истории уже мало кто может повлиять.

вторник, 1 января 2008 г.

G-кодер здесь...

Терь я буду здесь рассказывать вторую сторону моей жизни. Меня всегда притягивало программирование (даже не знаю почему), но я жутко ленив..
Говно блог начинался не здесь, но там где он начинался мне не понравилось.
Пожалуй, перенесу все посты сюда...