Форум программистов, компьютерный форум CyberForum.ru

Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 621, средняя оценка - 4.99
Kimel
15 / 15 / 0
Регистрация: 01.02.2012
Сообщений: 182
01.02.2012, 17:47     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #1
Хотя я и начинающий с++-шник. Хочу помочь другим людям. Здесь я буду выкладывать всё что мне удалось решить. В моих решениях будет много хедеров, делал я это в Dev C++. Ос Win 7 64 bit.

Начнём со второй главы:
Упражнение 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream> 
 
using namespace std;
 
int main()
{
   setlocale(0,"Rus");
   float gallons, cufeet;
 
   cout << "Введите количество галоннов: \n";
   cin >> gallons;
   cufeet = gallons / 7.481;
   cout << "Еквивалент в футах = " << cufeet << endl;
    
   return 0;
}

Упражнение 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main()
{
   setlocale(0,"Rus");
   
    cout << 1990 << setw(8) << 135 << endl
           << 1991 << setw(8) << 7290 << endl 
           << 1992 << setw(8) << 11300 << endl
           << 1993 << setw(8) << 16200 << endl;
  
   return 0;
}

Упражнение 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    int var = 10;
 
    cout << var << endl;      
    var *= 2;                 
    cout << var-- << endl;    
    cout << var << endl;      
    return 0;
}

Упражнение 4
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    cout<<"\nУ лукоморья дуб срубили\nКота на мясо порубили \nА по неведанным дорожкам\nШагали черти в босоножках\n"; 
    return 0;
}

Упражнение 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream> 
#include <ctype.h>
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    char ch;
    cin >> ch;
    cout << islower(ch);  // При вводе строчной буквы будет 2 при прописной 0. Но есть нюанс, поддерживаються только англ буквы 
    return 0;
}


Упражнение 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
 
    float a,b,c,d,f;
    cout << "Введите кол-во доларов"<<endl;
    cin >> f;
    b=f/1.487;
    c=f/0.172;
    a=f/0.584;
    d=f/0.00955;
    cout << f <<"доларов = "<< b<<" фунтов стерлинга"<<endl;
    cout << f <<"доларов = "<< c<<" франков"<<endl;
    cout << f <<"доларов = "<< a<<" немецких марок"<<endl;
    cout << f <<"доларов = "<< d<<" японских йен"<<endl;
    return 0;
}

Упражнение 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    double f,c;
    cout << "Введите количество градусов по Цельсию"<<endl;
    cin >> c;
    f=c*1.8+32;
    cout <<setprecision(3)<< f << " градусов по Фаренгейту "<< endl; // Регуляция кол-во символов после запятой
    return 0;
}

Упражнение 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    long pop1=2425785, pop2=47, pop3=9761;       
 
    cout << setfill('.') <<setw(8) << "LOCATION" << setw(12) // Обратите внимание на одинарные кавычки
           << "POPULATION" << endl
           <<setw(8) << "Portcity" << setw(12) << pop1 << endl
           << setw(8) << "Hightown" << setw(12) << pop2 << endl
           << setw(8) << "Lowville" << setw(12) << pop3 << endl;
    return 0;
}

Упражнение 9

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    char dummychar;
    double a,b,c,d,e,f;
    cout << "Введите а и b"<< endl;
    cin >>a>>dummychar>>b;
    cout << "Введите c и d"<<endl;
    cin >>c>>dummychar>>d;
    cout <<(b*c)+(d*a)<<dummychar<<(b*d)<<endl;
 
    return 0;
}

Упражнение 10 (Намучился с этой задачей)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    float a,b,c,f;
    cout << "Введите количество фунтов"<<endl;
    cin >> a;
    cout << "Введите количество шиллингов"<<endl;
    cin >> b;
    cout << "Введите количество пенсов"<<endl;
    cin >> c;
    f = a+(b+c/12)/20;
    cout << "Количество фунтов = " << f << endl;
    return 0;
}

Упражнение 11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main() 
{
     setlocale(0,"Rus");
     cout << setiosflags(ios::left) <<setw(15) << "Фамилия"<< setw(15)<< "Имя"<<setw(15) << "Адресс"<<setw(15)<< "Город"<<endl
            <<setw(15)<< "Иванов"<<setw(15)<<"Петя"<<setw(15)<<"Кленовая 16"<<setw(10)<<"Москва"<<endl
            <<setw(15)<< "Иванов"<<setw(15)<<"Петя"<<setw(15)<<"Кленовая 16"<<setw(10)<<"Москва"<<endl
            <<setw(15)<< "Иванов"<<setw(15)<<"Петя"<<setw(15)<<"Кленовая 16"<<setw(10)<<"Москва"<<endl;
    return 0;
}

Упражнение 12 (это самая геморная программа на разработку которой ушло больше дня)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream> 
 
using namespace std;
 
int main() 
{
setlocale(0,"Rus");
float a,b,z;
int c,k;
cout << "Введите кол-во футов " << endl;
cin >> a;
c = static_cast<int>(a);
b = a - c;
b *= 20;
k = static_cast<int>(b);
z = b - k;
z = z*12;
z = static_cast<int>(z);
k = static_cast<int>(k);
cout << c <<"."<< k <<"."<< z << endl;
return 0;
}
Это конец второй главы, третюю сделаю позже если будет нужна
 Комментарий модератора 
Пост обновлен по просьбе ТС
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2012, 17:47     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Посмотрите здесь:

Объектно-ориентированное программирование C++
C++ Объектно-ориентированное программирование
C++ Объектно ориентированное программирование
Ищу ответы на задания из книги Лафоре Р. "Объектно-ориентированное программирование в С++" 4 издание. C++
C++ Объектно-ориентированное программирование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
maxann
0 / 0 / 0
Регистрация: 01.07.2013
Сообщений: 5
01.07.2013, 21:55     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #61
Господа начинающие подскажите пожалуйста . или направьте в нужном направлении. 10 задача второй главы. там надо не только фунты показать но и пенсы. перевести шиллинги в фунты и остаток добавить к пенсам проблем нет, но как показать правильно пенсы ? никак ничего в голову не приходит.

Добавлено через 1 час 0 минут
сам себе отвечу.
получилось как то так. проверьте пожалуйста
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
#include <iostream>
#include <conio.h>
using namespace std;
int main ()
{
 int fynt;
 int shiling;
 int pens;
 int a;
 int b;
 int c;
 int d;
 int e;
 cout << "vvedite kollichestvo fyntov : " ;
 cin >> fynt;
 cout << "vvedite kollichestvo shilingov : ";
 cin >> shiling;
 cout << "vvedite kollichestvo pensov : ";
 cin >> pens;
 a = shiling*12 ;
 b = a + pens;
 c = b/100;
 d = b - c*100; 
 e = c + fynt;
 cout << "fyntov : " << e << endl;
 cout << "pensov : " << d << endl;
getch();
return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Valentina
66 / 66 / 3
Регистрация: 13.05.2012
Сообщений: 130
09.07.2013, 19:43     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #62
Глава 10 Упражнение №5
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE,"rus");
    void addarrays(float*,float*, float*,int);
    const int n=5;
    float a3[n];
    float a1[n]={2.2,5.5,8.6,9.1,7.2};
    float a2[n]={3.3,5.9,6.5,4.4,8.2};
    addarrays(a1,a2,a3,n);
for(int i=0;i<n;i++)
        cout<<*(a3+i)<<endl;
system("pause");
return 0;
}
void addarrays(float* a,float* b, float* c,int n)
{
    for(int i=0;i<n;i++)
        *(c+i)=*(a+i)+*(b+i);
    
}

Глава 10 Упражнение №6
Кликните здесь для просмотра всего текста
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
31
32
33
#include<iostream>
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE,"rus");
int compstr(char* , char * );
    char*s="А вдома лучше";
    char*s1="Кот ходит по квартире";
    char*s2="Сегодня на ужин омлет";
 int a=compstr(s,s1);
 cout<<a<<endl;
 a=compstr(s1,s);
 cout<<a<<endl;
 a=compstr(s1,s1);
 cout<<a<<endl;
 
system("pause");
return 0;
}
int compstr(char*a, char *b)
{
    if(*a<*b)
        return -1;
    else 
        if(*a>*b)
        return 1;
    else
        if(*a==*b)
        return 0;
 
 
}

Глава 10 Упражнение №7
Кликните здесь для просмотра всего текста
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// persort.cpp
// сортировка объектов через массив указателей на них
#include <iostream>
#include <string>
using namespace std;
///////////////////////////////////////////////////////////
class person            // некоторый человек
{
  protected:
    string name;        // имя
    float salary;
  public:
    void setData ( )    // установка имени
      { cout << "Введите имя: "<<endl;
        cin >> name; 
        cout<<"Введите оклад: "<<endl;
        cin>>salary;
    }
    void printData ( )  // показ имени
      { 
          cout << endl <<"Имя: "<< name; 
          cout<<endl<<"Оклад: "<<salary;
 
    }
    string getName ( )  // получение имени
      { return name; }
    float getSalary ( )  // получение имени
      { return salary; }
 
};
///////////////////////////////////////////////////////////
int main ( )
{
    setlocale(LC_CTYPE,"rus");
  void salsort ( person**, int ); // прототип функции
  person* persPtr [ 100 ];      // массив указателей на person
  int n = 0;                    // количество элементов в массиве
  char choice;                  // переменная для ввода символа
 
  do
  {
    persPtr [ n ] = new person;       // создаем новый объект
    persPtr [ n ]->setData ( );       // вводим имя
    n++;                              // увеличиваем количество
    cout << "Продолжаем ввод (d/н)?"; // спрашиваем, закончен ли ввод
    cin >> choice;
  }
  while ( choice == 'd' );
 
  cout << "\nНеотсортированный список:";
  for ( int j = 0; j < n; j++ ) // покажем неотсортированный список
      persPtr [ j ]->printData ( );
 
  salsort ( persPtr, n );         // отсортируем указатели
 
  cout << "\nОтсортированный список:";
  for (int  j = 0; j < n; j++ )     // покажем отсортированный список
      persPtr [ j ]->printData ( );
  cout << endl;
 
  system("pause");
  return 0;
}
///////////////////////////////////////////////////////////
void salsort ( person** pp, int n )
{
  
  int j, k;                          // переменные для циклов
 
  for ( j = 0; j < n- 1; j++ )      // внешний цикл
    for ( k = j + 1; k < n; k++ )    // внутренний цикл
    if( (*(pp+j))->getSalary ( ) > (*(pp+k))->getSalary ( ) ) // если первая строка больше второй,
  {
    person* tempptr = *(pp+j); // меняем их местами
    *(pp+j) = *(pp+k);
    *(pp+k) = tempptr;
  }
}


Добавлено через 3 минуты
Глава 10 Упражнение №8
Кликните здесь для просмотра всего текста
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// linklist.cpp
// список
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
struct link   // один элемент списка
{
  int data;   // некоторые данные
  link* next; // указатель на следующую структуру
};
///////////////////////////////////////////////////////////
class linklist // список
{
  private:
    link* first;
    link* last;
  public:
    linklist ( )            // конструктор без параметров
      { first=last = NULL; }     // первого элемента пока нет
    ~linklist()
    {
        link* current=NULL;
        link* next=first;
        while(next)
        {
            current=next;
            next=next->next;
            
            delete current;
        }
        
    }
    void additem ( int d ); // добавление элемента
    void display ( );       // показ данных
};
///////////////////////////////////////////////////////////
void linklist::additem ( int d ) // добавление элемента
{
    link* newlink = new link; // выделяем память
    newlink->next=NULL;
    newlink->data=d;
    if(first==NULL) 
    {
        first=newlink;
        last=newlink;}
    else
    {
        last->next=newlink;
        last=newlink;
    }
  
  
}
///////////////////////////////////////////////////////////
void linklist::display ( )
{
  link* current = first;           // начинаем с первого элемента
  while( current )                 // пока есть данные
  {
    cout << current->data << endl; // печатаем данные
    current = current->next;       // двигаемся к следующему элементу
  }
}
///////////////////////////////////////////////////////////
int main ( )
{
  linklist li;       // создаем переменную-список
 
  li.additem ( 25 ); // добавляем туда несколько чисел
  li.additem ( 36 );
  li.additem ( 49 );
  li.additem ( 64 );
 
  li.display ( );    // показываем список
system("pause");
  return 0;
}

Глава 10 Упражнение №9
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
int main ( )
{
    const int n=10;
    int a0[n]={0,10,20,30,40,50,60,70,80,90};
    int a1[n]={0,10,20,30,40,50,60,70,80,90};
    int a2[n]={0,10,20,30,40,50,60,70,80,90};
    int a3[n]={0,10,20,30,40,50,60,70,80,90};
    int a4[n]={0,10,20,30,40,50,60,70,80,90};
    int a5[n]={0,10,20,30,40,50,60,70,80,90};
    int a6[n]={0,10,20,30,40,50,60,70,80,90};
    int a7[n]={0,10,20,30,40,50,60,70,80,90};
    int a8[n]={0,10,20,30,40,50,60,70,80,90};
    int a9[n]={0,10,20,30,40,50,60,70,80,90};
    int* ap[n]={a0,a1,a2,a3,a4,a5,a6,a7,a8,a9};
    for(int j=0;j<10;j++)
        for(int k=0;k<10;k++)
            cout<<ap[j][k]<<endl;
system("pause");
  return 0;
}

Глава 10 Упражнение №10
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int main ( )
{
    const int n=10;
    int* ap[n];
    for(int j=0;j<n;j++)
        *(ap+j)=new int[n];
    for(int j=0;j<10;j++)
        for(int k=0;k<10;k++)
            *(*(ap+j)+k)=k*10;
    for(int j=0;j<10;j++)
        for(int k=0;k<10;k++)
            cout<<*(*(ap+j)+k)<<endl;
system("pause");
  return 0;
}

Глава 10 Упражнение №11
Кликните здесь для просмотра всего текста
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
using namespace std;
 
class Massiv
{
private:
 
    int* ap;
    int n;
    int m;
public:
    Massiv(int n_=100, int m_=10): n(n_),m(m_)
    {
    ap=new int[n];
    setValue();
    }
    void setValue()
    {
    for(int k=0;k<n;)
     for(int i=0;i<m;i++)
        *(ap+k++)=i*m;
    }
 
    int& operator[] (int i)
    {
        return ap[i];
    }
    void show(){
for(int i=0;i<n;i++) 
cout<<*(ap+i)<<endl;
    cout<<endl;
}
 
 
 
};
 
int main ( )
{
 
    Massiv m;
    m.show();
system("pause");
  return 0;
}
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
09.07.2013, 20:17     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #63
Цитата Сообщение от Valentina Посмотреть сообщение
Глава 10 Упражнение №9
потом, как будет время, свои решения скину- сравните с моим 10-9)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using namespace std;
const int MAX=10;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int  a0[MAX], a1[MAX], a2[MAX], a3[MAX], a4[MAX],
        a5[MAX], a6[MAX], a7[MAX], a8[MAX], a9[MAX];
    int* ap[MAX]={a0, a1, a2, a3, a4, a5, a6, a7, a8, a9};
    for(int j=0; j<MAX; j++){
        for(int k=0; k<MAX; k++){
            *(*(ap+j)+k)=k*10;
        }
    }
    for(int j=0; j<MAX; j++){
        for(int k=0; k<MAX; k++){
            cout <<*(*(ap+j)+k) <<" ";
        }
        cout <<endl;
    }
    system("pause");
    return 0;
}
Valentina
66 / 66 / 3
Регистрация: 13.05.2012
Сообщений: 130
09.07.2013, 20:29     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #64
да согласна не учла,так меньше лишнего кода , подобный алгоритм у меня в упражнении 10
Darkender
0 / 0 / 0
Регистрация: 22.02.2013
Сообщений: 2
10.07.2013, 17:26     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #65
Цитата Сообщение от maxann Посмотреть сообщение
Господа начинающие подскажите пожалуйста . или направьте в нужном направлении. 10 задача второй главы. там надо не только фунты показать но и пенсы. перевести шиллинги в фунты и остаток добавить к пенсам проблем нет, но как показать правильно пенсы ? никак ничего в голову не приходит.
я решил данную задачу следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    setlocale(0, "Rus");
    int funt, shil, pens;
    float dfunt;
    cout <<"Введите количество фунтов: " ;
    cin >>funt;
    cout <<"Введите количество шиллингов: " ;
    cin >>shil;
    cout <<"Введите количество пенсов: " ;
    cin >>pens;
    dfunt=funt+((shil*12.0+pens)/240.0);
    cout <<"Десятичных фунтов: ";
    printf("%.2f\n", dfunt);
    return 0;
}
MacInsider
4 / 4 / 0
Регистрация: 09.08.2013
Сообщений: 30
09.08.2013, 10:39     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #66
Вот моё решение 11 задания из главы 8 (Перегрузка операций)

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include "stdafx.h"
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////////////////////
class sterling
{
    private:
        long pounds;
        int shilling;
        int pense;
    public:
        // конструктор без параметров
        sterling() : pounds(0), shilling(0), pense(0)
        { }
        // конструктор с одним аргументом
        sterling(double decfunt)
        {
            pounds = (long) decfunt;
            shilling = (int) ((decfunt - pounds) * 20);
            pense = (int) ((((decfunt - pounds) * 20) - shilling) * 12);
        }
        // конструктор с тремя аргументами
        sterling(long f, int s, int p) : pounds(f), shilling(s), pense(p)
        { }
        // методы 
        //--------------------------------------
        // получения значений от пользователя
        void getSterling()
        {
            cout << "Введите фунты: "; cin >> pounds;
            cout << "Введите шиллингы: "; cin >> shilling;
            cout << "Введите пенсы: "; cin >> pense;
        }
        // вывод значений на экран
        void putSterling() const
        {
            cout << pounds << "." << shilling << "." << pense;
        }
        // перегруженные операции
        //--------------------------------------
        // операция сложения
        sterling operator + (sterling st2);
        // операция вычитания
        sterling operator - (sterling st2);
        // операция умножения
        sterling operator * (sterling st2);
        // операция деления на sterling
        sterling operator / (sterling st2);
        // операция деления на double
        sterling operator / (double st2);
        // операция double для преобразования к типу double
        operator double()
        {
            return (pounds * 240 + shilling * 12 + pense) / 240.0;
        }
};
//--------------------------------------------------------------------
sterling sterling :: operator + (sterling st2)
{
    return sterling(double(sterling(pounds, shilling, pense)) + double(st2));
}
//--------------------------------------------------------------------
sterling sterling :: operator - (sterling st2)
{
    return sterling(double(sterling(pounds, shilling, pense)) - double(st2));
}
//--------------------------------------------------------------------
sterling sterling :: operator * (sterling st2)
{
    return sterling(double(sterling(pounds, shilling, pense)) * double(st2));
}
//--------------------------------------------------------------------
sterling sterling :: operator / (sterling st2)
{
    return sterling(double(sterling(pounds, shilling, pense)) / double(st2));
}
//--------------------------------------------------------------------
sterling sterling :: operator / (double st2)
{
    return sterling(double(sterling(pounds, shilling, pense)) / st2);
}
//--------------------------------------------------------------------
void line()
{
    for(int i = 0; i < 22; i++)
        cout << "--";
    cout << endl;
}
//////////////////////////////////////////////////////////////////////
int main() 
{
    setlocale(LC_ALL,"");
    
    sterling st, st1, st2;
 
    cout << "Введите первую сумму: " << endl; st1.getSterling();
    line();
    cout << "Введите вторую сумму: " << endl; st2.getSterling();
 
    double d = 1.234;
 
    cout << endl << "Операции: " << endl;
    line();
 
    st = st1 + st2; cout << "Сумма: ";
    st1.putSterling(); cout << " + "; st2.putSterling(); cout << " = "; st.putSterling(); cout << endl;
    line();
 
    st = st1 - st2; cout << "Вычисление: ";
    st1.putSterling(); cout << " - "; st2.putSterling(); cout << " = "; st.putSterling(); cout << endl;
    line();
 
    st = st1 * st2; cout << "Умножение: ";
    st1.putSterling(); cout << " * "; st2.putSterling(); cout << " = "; st.putSterling(); cout << endl;
    line();
 
    st = st1 / st2; cout << "Деление: ";
    st1.putSterling(); cout << " / "; st2.putSterling(); cout << " = "; st.putSterling(); cout << endl;
    line();
 
    st = st1 / d; cout << "Деление на double: ";
    st1.putSterling(); cout << " / "; cout << d << " = "; st.putSterling(); cout << endl;
    line();
 
    system("pause");
    return 0;
}
позже скину все свои решения до главы 9.

Добавлено через 10 часов 7 минут
8 Глава, задание 12:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "stdafx.h"
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////////////////////////////////
class sterling
{
    private:
        long pounds;
        int shilling;
        int pense;
    public:
        // констуктор без аргументов
        sterling() : pounds(0), shilling(0), pense(0)
        { }
        // конструктор с одним аргументом
        sterling(double decfunt)
        {
            pounds = (long) decfunt;
            shilling = (int) ((decfunt - pounds) * 20);
            pense = (int) ((((decfunt - pounds) * 20) - shilling) * 12);
        }
        // конструктор с тремя аргументами
        sterling(long f, int s, int p) : pounds(f), shilling(s), pense(p)
        { }
        //доступ до поля pounds
        long getPounds() const
        {
            return pounds;
        }
        //доступ до поля shilling
        int getShilling() const
        {
            return shilling;
        }
        //доступ до поля pense
        int getPense() const
        {
            return pense;
        }
        // методы 
        //--------------------------------------
        // получения значений от пользователя
        void getSterling()
        {
            cout << "Введите фунты: "; cin >> pounds;
            cout << "Введите шиллингы: "; cin >> shilling;
            cout << "Введите пенсы: "; cin >> pense;
        }
        // вывод значений на экран
        void putSterling() const
        {
            cout << pounds << "." << shilling << "." << pense;
        }
 
};
//////////////////////////////////////////////////////////////////////
class bMoney
{
    private:
        long double money;
    public:
        //конструктор без аргументов
        bMoney() : money(0.0) 
        { }
        //конструктор с одним аргументом
        bMoney(long double m) : money(m)
        { }
        // преобразование bMoney в long double
        operator long double()
        {
            return money;
        }
        //вывод bMoney на экран
        void showMoney()
        {
            cout << money << endl;
        }
        //преобразование sterling в bMoney
        bMoney(sterling st)
        {
            long funts = st.getPounds();
            int shill = st.getShilling();
            int pens = st.getPense();
            money = ((funts * 240 + shill * 12 + pens) / 240.0) * 50; //50 - один фунт
        }
 
};
//--------------------------------------------------------------------
void line()
{
    for(int i = 0; i < 22; i++)
        cout << "--";
}
///////////////////////////////////////////////////////////////////////
int main() 
{
    setlocale(LC_ALL,"");
    
    sterling st;
    cout << "Введите сумму (фунты, шиллингы и пенсы): " << endl;
    st.getSterling();
    bMoney bmoney(123.321);
    line();
    
    cout << endl << "\nВходящие данные: ";
    cout << "\nsterling:  "; st.putSterling();
    cout << "\nbMoney:    "; bmoney.showMoney();
    cout << endl;
    line();
 
    cout << "\nПреобразование sterling и bMoney: ";
    bMoney sterlingToBmoney = bmoney;   
    sterlingToBmoney.showMoney();
    line();
 
    cout << "\nПреобразование bMoney в sterling: ";
    sterling bMoneyToSterling = bmoney;
    bMoneyToSterling.putSterling();
    cout << endl;
    line();
    cout << endl << endl;;
 
    system("pause");
    return 0;
}
Рики
6 / 6 / 1
Регистрация: 27.02.2013
Сообщений: 23
10.08.2013, 03:40     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #67
Подумал, что функция должна сравнивать каждый символ в строке, а не только первый. Вот что получилось
Глава 10 Упражнение №6
Кликните здесь для просмотра всего текста
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
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
int main ( )
{
  setlocale (LC_ALL, "russian");
  int compstr (char*, char*);
  char* st1  = "Киевс";
  char* st2  = "Киева";
  char* st3  = "Киев";
  char* st4  = "Киев";
  char* st5  = "Абвгд";
  char* st6  = "Дждк";
  int k1 = compstr (st1, st2);
  int k2 = compstr (st3, st4);
  int k3 = compstr (st5, st6);
 
  cout<<k1<<endl;
  cout<<k2<<endl;
  cout<<k3<<endl;
  system("pause");
  return 0;
}
///////////////////////////////////////////////////////////
int compstr (char* s1, char* s2)
    {
        while (*s1!='\0'|| *s2!='\0')
            if (*s1>*s2)
                return  1;
            else if (*s1<*s2)
                return -1;
            else if (*s1==*s2)
                while (*s1==*s2 && (*s1!='\0'|| *s2!='\0'))
                    {
                        *s1++;*s2++;
                        if (*s1>*s2)
                            return  1;
                        else if (*s1<*s2)
                            return -1;
                    }
                return 0;
    }
kickupduster
 Аватар для kickupduster
4 / 4 / 1
Регистрация: 04.08.2013
Сообщений: 20
14.08.2013, 23:04     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #68
Глава 9. Упражнение №11
Решение в соответствии с заданием
Кликните здесь для просмотра всего текста
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class Stack
{
  protected:              // Замечание: использовать private нельзя
    static const int  MAX = 10;     // размер стека
    int st[ MAX ];        // данные, хранящиеся в стеке
    int top;              // индекс последнего элемента в стеке
  public:
    Stack ( )            // конструктор
      { top = -1; }
    void push ( int var ) // помещение числа в стек
      { st[ ++top ] = var; }
    int pop ( )           // извлечение числа из стека
      { return st[ top-- ]; }
};
///////////////////////////////////////////////////////////
class Stack2 : public Stack
{
  public:
    void push ( int var )      // помещение числа в стек
      {
        if  (top >= (MAX-1))  // если стек полон, то ошибка
          { cout << "\nОшибка: стек полон"; system("pause"); exit ( 1 ); }
        Stack::push ( var );   // вызов функции push класса Stack
      }
    int pop ( )                // извлечение числа из стека
      {
        if ( top < 0 )         // если стек пуст, то ошибка
          { cout << "\nОшибка: стек пуст\n"; system("pause"); exit ( 1 ); }
        return Stack::pop ( ); // вызов функции pop класса Stack
      }
};
///////////////////////////////////////////////////////////
struct pairr //структура хранящая пару значений
    {int x, y;};
class pairStack: public Stack2 
{
private:
    pairr k; // переменная типа pair
public:
    void push(pairr k) //помещаем в стек пару чисел 
    {Stack2::push(k.x); Stack2::push(k.y);}
    pairr pop() //извлекаем из стека пару чисел
    {
        k.y = Stack2::pop(); 
        k.x = Stack2::pop();
        return k; //возвращаем значение типа pair
    }
};
void main()
{
    setlocale(0,"rus"); //русские символы в консоле
    pairStack s; //создание объекта класса pairStack
    pairr p1 = {5,9}, p2 = {1,6}, p3 = {9,14}, temp; 
    s.push(p1); //помещаем в стек пару {5,9}
    s.push(p2); //помещаем в стек пару {1,6}
    s.push(p3); //помещаем в стек пару {9,14}
    temp = s.pop(); //извлекаем из стека пару {9,14}
    temp = s.pop(); //извлекаем из стека пару {1,6}
    cout << "x=" << temp.x << ", y=" << temp.y << endl; //вывод на печать пары {1,6}
    temp = s.pop(); //извлекаем из стека пару {5,9}
    cout << "x=" << temp.x << ", y=" << temp.y << endl; //вывод на печать пары {1,6}
    temp = s.pop(); //ошибка!!! стек пуст
    system("pause"); //задержка экрана   
}
MacInsider
4 / 4 / 0
Регистрация: 09.08.2013
Сообщений: 30
16.08.2013, 13:44     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #69
Сегодня с утра еще сделал 4 задания глава 12.
Вот смотрите:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main() 
{
    setlocale(LC_CTYPE,"Russian");
    
    string name;
    string lastName;
    string patronymic;
    unsigned long number;
 
    int n = 0;
    char ans;
 
    ofstream outfile("PERSONS.TXT");
 
    do{
    
        cout << "Введите имя: "; cin >> name;
        cout << "Введите фамилию: "; cin >> lastName;
        cout << "Введите отчество: "; cin >> patronymic;
        cout << "Введите номер: "; cin >> number;
        
        outfile << name
                << ' '
                << lastName
                << ' '
                << patronymic
                << ' '
                << number;              
 
        cout << "Продолжить (y/n)? ";
        cin >> ans;
        n++;
    }while(ans != 'n');
        
    cout << "Файл записан\n";
    outfile.close();
 
    ifstream infile("PERSONS.TXT");
    cout << "Люди: " << endl; 
 
    while(!infile.eof())
    {
        infile >> name >> lastName >> patronymic >> number;
        cout << name << ", " << lastName << ", " << patronymic << ", " << number << endl;
    }
    
    cout << endl;
 
    system("pause");
    return 0;
}
Добавлено через 43 минуты
Задание 5, глава 12:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "stdafx.h"
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////
class time
{
    private:
        int hours;
        int minutes;
        int seconds;
    public:
        // конструктор без аргументов
        time() : hours(0), minutes(0), seconds(0)
        { }
        // конструктор с тремя аргументами
        time(int h, int m, int s) : hours(h), minutes(m), seconds(s)
        { }
        
        // ввод времени
        void get_time()
        {
            cout << "   Введите часы: "; cin >> hours;
        
            if(cin.good())
            {
                cin.ignore(4, '\n');
                if(hours > 23 || hours < 0)
                {
                    cout << "Значение часов должно быть между 0 и 23!" << endl;
                    cout << "   Введите часы: "; cin >> hours;
                }
            }
            
            cout << "   Введите минуты: "; cin >> minutes;
            if(cin.good())
            {
                cin.ignore(4, '\n');
                if(minutes > 59 || minutes < 0)
                {
                    cout << "Неправильно введены минуты. Желаемый диапазон от 0 до 59!" << endl;
                    cout << "   Введите минуты: "; cin >> minutes;
                }
            }
 
            cout << "   Введите секунды: "; cin >> seconds;
            if(cin.good())
            {
                cin.ignore(4, '\n');
                if(seconds > 59 || seconds < 0)
                {
                    cout << "Неправильно введены секунды. Желаемый диапазон от 0 до 59!" << endl;
                    cout << "   Введите секунды: "; cin >> seconds;
                }
            }           
        }
 
        // вывод времени
        void put_time() const
        {
            cout << "\n   Время = ";
            if(hours < 10)
                cout << "0";
            cout << hours << ":";
            if(minutes < 10)
                cout << "0";
            cout << minutes << ":";
            if(seconds < 10)
                cout << "0";
            cout << seconds << endl;
        }
};
///////////////////////////////////////////////////////
int main() 
{
    setlocale(LC_CTYPE,"Russian");
    
    time thetime;
    char ans;
 
    do{
        thetime.get_time();
        thetime.put_time();
        
        cout << "Продолжить (y/n)? ";
        cin >> ans;
        cout << endl;
    }while(ans != 'n');
 
    system("pause");
    return 0;
}
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.08.2013, 17:50     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #70
MacInsider, Молодец. Я если не будет получатся буду в твои решения подглядывать.
MacInsider
4 / 4 / 0
Регистрация: 09.08.2013
Сообщений: 30
17.08.2013, 21:41     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #71
Цитата Сообщение от ninja2 Посмотреть сообщение
MacInsider, Молодец. Я если не будет получатся буду в твои решения подглядывать.
Очень приятно!!!

Я хотел спросить у всех, есть ли у кого то решение 1 задания (проекта) из главы 13
Purcell
 Аватар для Purcell
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
19.08.2013, 02:04     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #72
Цитата Сообщение от Kins Посмотреть сообщение
Глава 4 Упражнение №5
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    int dd, mm, yy;
char ch;
////////////////////////////////////
struct date
{
    int day;
    int mon;
    int year;
};
///////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (LC_ALL, "");
    cout <<"Введите дату потипу: dd/mm/yyyy ";
    cin >>dd >>ch >>mm >>ch >>yy;
    date a1 ={dd, mm, yy};
    cout <<a1.day <<ch <<a1.mon <<ch <<a1.year <<endl;
    system ("pause");


Добавлено через 1 минуту
[/CPP][/SPOILER]
Не сочтите моё замечание за занудство=) Но что выдаст данное решение, если пользователь введёт "89/701/-2013"? Вот мой вариант, учитывающий реальное количество дней в месяце и так далее вплоть до количества дней в феврале в високосных годах.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// 05.cpp
// ввод даты и её вывод с использованием структур
 
# include <iostream>
 
using namespace std;
///////////////////////////////////////////////
struct date
{
    int day;
    int month;
    int year;
};
///////////////////////////////////////////////
int main()
{
    date userdate; // дата, введённая пользователем
 
    do             // пока пользователь не введёт корректный год
    {
        do         // пока пользователь не введёт корректный месяц
        {
            do     // пока пользователь не введёт корректный день месяца
            {
                cout << "Введите день месяца: ";
                cin >> userdate.day;
                if (userdate.day > 31)
                {
                    cout << "Ошибка! Дней в месяце не может быть больше 31." << endl;
                }
                if (userdate.day < 1)
                {
                    cout << "Ошибка! День не может быть нулём и ";
                    cout << "быть отрицательным числом." << endl;
                }
            }
            while (userdate.day < 1 || userdate.day > 31);
            cout << "Введите номер месяца: ";
            cin >> userdate.month;
            if (userdate.month > 12)
            {
                cout << "Ошибка! В году не может больше 12 месяцев." << endl;
            }
            if (userdate.month < 1)
            {
                cout << "Ошибка! Месяц не может быть нулём или ";
                cout << "отрицательным числом." << endl;
            }
            if ((userdate.month == 4 && userdate.day == 31) ||
                (userdate.month == 6 && userdate.day == 31) ||
                (userdate.month == 9 && userdate.day == 31) ||
                (userdate.month == 11 && userdate.day == 31))
            {
                cout << "Ошибка! В выбранном вами месяце не может быть";
                cout << " 31 день" << endl;
            }
            if (userdate.month == 2 && userdate.day > 29)
            {
                cout << "Ошибка! В феврале не может быть больше 29 дней" << endl;
            }
        }
        while (userdate.month < 1 || userdate.month > 12 ||
              (userdate.month == 4 && userdate.day == 31) ||
              (userdate.month == 6 && userdate.day == 31) ||
              (userdate.month == 9 && userdate.day == 31) ||
              (userdate.month == 11 && userdate.day == 31) ||
              (userdate.month == 2 && userdate.day > 29));
        cout << "Введите год: ";
        cin >> userdate.year;
        if (userdate.year < 0)
        {
            cout << "Ошибка! Год не может быть меньше нуля: слишком давно";
            cout << " это было=)" << endl;
        }
        if (((userdate.year % 4 != 0 && userdate.year % 100 != 0) ||
            (userdate.year % 400 != 0)) && userdate.month == 2 &&
            userdate.day == 29)
        {
            cout << "Ошибка! Вы ввели не високосный год, а у вас ";
            cout << "выбран февраль и 29-е число" << endl;
        }
    }
    while (userdate.year < 0 || (((userdate.year % 4 != 0 &&
           userdate.year % 400 != 0) || userdate.year % 400 != 0) &&
           userdate.month == 2 && userdate.day == 29));
 
    cout << "Ваша дата: " << userdate.day << "." << userdate.month << "."
    << userdate.year << endl;
    return 0;
}
Мой 2-й вариант: всё то же самое с теми же циклами, но они не вложены друг в друга, а идут друг за другом.
MacInsider
4 / 4 / 0
Регистрация: 09.08.2013
Сообщений: 30
20.08.2013, 17:30     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #73
Глава 14, упражнение 4:

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 "stdafx.h"
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////
template <class type>
void swaps(type& a, type& b)
{
    type temp = a;
    a = b;
    b = temp;
}
///////////////////////////////////////////////////////
int main() 
{
    setlocale(LC_CTYPE,"Russian");
    
    int Int1 = 1, Int2 = 2;
    float Float1 = 1.0F, Float2 = 2.0F;
    char Char1 = 1, Char2 = 2;
 
    cout << "int: " << Int1 << " <> " << Int2 << " --> ";
    swaps(Int1, Int2); cout << Int1 << ", " << Int2
         << endl << "float: " << Float1 << " <> " << Float2 << " --> ";
    swaps(Float1, Float2); cout << Float1 << ", " << Float2
         << endl << "char: " << (int)Char1 << " <> " << (int)Char2 << " --> ";
    swaps(Char1, Char2); cout << (int)Char1 << ", " << (int)Char2 << endl << endl;
 
    system("pause");
    return 0;
}
Добавлено через 18 минут
Глава 14, упражнение 5:

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
31
#include "stdafx.h"
#include <iostream>
using namespace std;
const int MAX = 5;
///////////////////////////////////////////////////////
template <class type>
type amax(type mas[], int size)
{
    type max = mas[0];
    for(int i = 0; i < size; i++)
        if(max < mas[i])
            max = mas[i];
    return max;
}
///////////////////////////////////////////////////////
int main() 
{
    setlocale(LC_CTYPE,"Russian");
    
    int intMas[MAX] = {5, 15, 10, 27, 9};
    float floatMas[MAX] = {7.0, 2.0, 30.0, 330.0, 24.0};
    char charMas[MAX] = {1, 3, 2, 5, -1};
 
    cout << "Максимальный элемент intMas = " << amax(intMas, MAX) << endl
         << "Максимальный элемент floatMas = " << amax(floatMas, MAX) << endl
         << "Максимальный элемент charMas = " << (int)amax(charMas, MAX) << endl
         << endl;
 
    system("pause");
    return 0;
}
kickupduster
 Аватар для kickupduster
4 / 4 / 1
Регистрация: 04.08.2013
Сообщений: 20
20.08.2013, 17:34     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #74
Цитата Сообщение от Valentina Посмотреть сообщение
Глава 10 Упражнение №6
Кликните здесь для просмотра всего текста
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
31
32
33
#include<iostream>
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE,"rus");
int compstr(char* , char * );
    char*s="А вдома лучше";
    char*s1="Кот ходит по квартире";
    char*s2="Сегодня на ужин омлет";
 int a=compstr(s,s1);
 cout<<a<<endl;
 a=compstr(s1,s);
 cout<<a<<endl;
 a=compstr(s1,s1);
 cout<<a<<endl;
 
system("pause");
return 0;
}
int compstr(char*a, char *b)
{
    if(*a<*b)
        return -1;
    else 
        if(*a>*b)
        return 1;
    else
        if(*a==*b)
        return 0;
 
 
}
Исправил функцию compstr. Нужно использовать указатели на строки и инкремировать их в цикле для перехода на следующий символ, что-бы проверить всю строку.
Глава 10 Упражнение №6
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <Windows.h>
#include <cstring>
using namespace std;
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int compstr(char*, char*);
    char* s1 = "Строка номеа", *s2 = "Строка яомер";
    int rez = compstr(s1,s2);
    cout << "rez=" << rez << endl;
    system("pause");
}
int compstr(char* s1, char* s2)
{
    char *ss1 = s1, *ss2 = s2; //указатели на строки
    for(int i=0; i<((strlen(s1) >= strlen(s2))? strlen(s1): strlen(s2)); i++)
    {
        if (*ss1 < *ss2) return -1;
        if (*ss1 > *ss2) return 1;
        ss1++; ss2++; //перейти к следующему символу
    }
    return 0;
}
MacInsider
4 / 4 / 0
Регистрация: 09.08.2013
Сообщений: 30
20.08.2013, 20:08     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #75
Глава 14, упражнение 6:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "stdafx.h"
#include <iostream>
using namespace std;
const int LIMIT = 100;    // размер массива
///////////////////////////////////////////////////////
template <class type>
class safearray
{
    private:
        type arr[LIMIT];
    public:
        type& operator[](int n)
        {
            if(n < 0 || n >= LIMIT)
            {
                cout << "\nОшибочный индекс!"; exit(1);
            }
            return arr[n];
        }
};
///////////////////////////////////////////////////////
int main() 
{
    setlocale(LC_CTYPE,"Russian");
    
    safearray<int> sa1;
    // задаем значения элементов
    for(int j = 0; j < LIMIT; j++)
        sa1[j] = j * 10;    
    // показываем элементы
    for(int j = 0; j < LIMIT; j++)
    {
        int temp = sa1[j];  
        cout << "Элемент " << j << " равен " << temp << endl;
    }
 
    safearray<float> sa2;
    // задаем значения элементов
    for(int j = 0; j < LIMIT; j++)
        sa2[j] = j * 0.2;    
    // показываем элементы
    for(int j = 0; j < LIMIT; j++)
    {
        float temp = sa2[j];  
        cout << "Элемент " << j << " равен " << temp << endl;
    }
 
    system("pause");
    return 0;
}
Добавлено через 1 час 6 минут
Глава 14, упражнение 7:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#include "stdafx.h"
#include <iostream>
#include <process.h> // for exit();
using namespace std;
////////////////////////////////////////////////////////////////////
template <class type>
class fraction
{
  private:
      type chis;
      type znam;    
  public:
      // конструктор без аргументов
      fraction() : chis(0), znam(0)
      { }
      // конструктор с двумя аргументами
      fraction(type c, type z) : chis(c), znam(z) 
      { }
      // получения значений от пользователя
      void get()
      {
          cin >> chis >> znam;
          if((chis == 0) || (znam == 0))
              exit(1);
      }
      // вывод значений на экран
      void show(char tp)
      {
          if(tp = 'c')
              cout << int(chis) << " / " << int(znam) << endl;
          else
              cout << chis << " / " << znam << endl;
      }
      //-------------------------------------------------------------
      // метод выбора операции
      //-------------------------------------------------------------
      fraction operation(fraction dr1, fraction dr2, char op, char tp)
      {
          fraction dr;
          switch(op)
          {
            case '+' : 
            {
                dr = dr1 + dr2;
                cout << "\nСумма дробей: "; 
                dr.show(tp);
            }break;
            case '-' :
            {
                dr = dr1 - dr2;
                cout << "\nРазность дробей: ";
                dr.show(tp);
            }break;
            case '*' : 
            {
                dr = dr1 * dr2;
                cout << "\nПроизведение дробей: ";
                dr.show(tp);
            }break;
            case '/' : 
            {
                if(tp = 'c')
                    cout << "Деление больших чисел невозможно!" << endl;
                else
                {
                    dr = dr1 / dr2;
                    cout << "\nДеление дробей: ";
                    dr.show(tp);
                }
            }break;
            default : cout << 0; break;
          }
          return dr;
      }
      //-------------------------------------------------------------
      // перегружання операция сложения
      //-------------------------------------------------------------
      fraction operator + (fraction dr2)
      {
          type ch = chis * dr2.znam + znam * dr2.chis;
          type zn = znam * dr2.znam;
          lowterms(ch, zn);
          return fraction(ch, zn);
      }
      //-------------------------------------------------------------
      // перегружання операция вычитания
      //-------------------------------------------------------------
      fraction operator - (fraction dr2)
      {
          type ch = chis * dr2.znam - znam * dr2.chis;
          type zn = znam * dr2.znam;
          lowterms(ch, zn);
          return fraction(ch, zn);
      }
      //-------------------------------------------------------------
      // перегружання операция умножения
      //-------------------------------------------------------------
      fraction operator * (fraction dr2)
      {
          type ch = chis * dr2.chis;
          type zn = znam * dr2.znam;
          lowterms(ch, zn);
          return fraction(ch, zn);
      }
      //-------------------------------------------------------------
      // перегружання операция деления
      //-------------------------------------------------------------
      fraction operator / (fraction dr2)
      {
          type ch = chis * dr2.znam;
          type zn = znam * dr2.chis;
          lowterms(ch, zn);
          return fraction(ch, zn);
      }
      //-------------------------------------------------------------
      // сокращение дробей
      //-------------------------------------------------------------
      void lowterms(type& chis, type& znam)
      {
          type tnum, tden, temp, gcd;
          tnum = labs(chis);
          tden = labs(znam);
 
          while(tnum != 0)
          {
              if(tnum < tden)
              {
                  temp = tnum;
                  tnum = tden;
                  tden = temp;
              }
              tnum -= tden;
          }
 
          gcd = tden;
          chis /= gcd;
          znam /= gcd;
      }
};
//////////////////////////////////////////////////////////////////////
int main() 
{
    setlocale(LC_CTYPE,"Russian");
    
    char type, oper, ans;   
 
    do{
        cout << "Выберите тип данных: \n's' - short \n'i' - int \n'l' - long \n'c' - char" << endl;
        cin >> type;
        switch(type)
        {
            case 's' :
            {
                fraction<short> dr, dr1, dr2;
                cout << "   Введите первую дробь, операцию и вторую дробь: ";
                dr1.get();
                cin >> oper;
                dr2.get();
                dr.operation(dr1, dr2, oper, type);
            }break;
            case 'i' :
            {
                fraction<int> dr, dr1, dr2;
                cout << "   Введите первую дробь, операцию и вторую дробь: ";
                dr1.get();
                cin >> oper;
                dr2.get();
                dr.operation(dr1, dr2, oper, type);
            }break;
            case 'l' :
            {
                fraction<long> dr, dr1, dr2;
                cout << "   Введите первую дробь, операцию и вторую дробь: ";
                dr1.get();
                cin >> oper;
                dr2.get();
                dr.operation(dr1, dr2, oper, type);
            }break;
            case 'c' :
            {
                fraction<char> dr, dr1, dr2;
                cout << "   Введите первую дробь, операцию и вторую дробь: ";
                dr1.get();
                cin >> oper;
                dr2.get();
                dr.operation(dr1, dr2, oper, type);
            }break;
            default : cout << "   Нету такой команды!" << endl;
        }
 
        cout << "\nЖелаете продолжить (y/n)? ";
        cin >> ans;
    }while(ans != 'n');   
 
    system("pause");
    return 0;
}
kickupduster
 Аватар для kickupduster
4 / 4 / 1
Регистрация: 04.08.2013
Сообщений: 20
22.08.2013, 16:51     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #76
У кого есть решение 11-го упражнения 10-й Главы? Не могу понять как его сделать

Добавлено через 3 часа 26 минут
Цитата Сообщение от kickupduster Посмотреть сообщение
У кого есть решение 11-го упражнения 10-й Главы? Не могу понять как его сделать
Сам разобрался
Глава 10. Упражнение 11
Кликните здесь для просмотра всего текста
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
31
32
33
34
35
#include <iostream>
#include <iomanip>
using namespace std;
const int N = 10;
class Array
{
private:
    int* ap[N];
public:
    Array()
    {
        for(int i=0; i<N; i++)
            *(ap+i) = new int [N];
    }
    void setValue()
    {
        for(int i=0; i<N; i++)
            for(int j=0; j<N; j++)
                *(*(ap+i)+j) = i;
    }
    int& operator[](int n)
    {
       int i = n/10, j = n%10;
       return *(*(ap+i)+j);
    }
};
void main()
{
    Array arr;
    arr.setValue();
    for(int i=0, t=1; i<N*10; i++, t++)
    {cout << setw(3) << arr[i]; if (t == 10) {t=0; cout << endl;}} //много лишнего для красивого вывода
    cout << endl;
    system("pause");
}
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
24.08.2013, 17:34     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #77
Мой вариант решения Глава 7, упражнение 7.
7. Одним из недостатков С++ является отсутствие для бизнес-программ встроенного типа для денежных значений, такого, как $173 698 001,32. Такой денежный тип должен иметь возможность для хранения числа с фиксированной десятичной точкой точностью около 17 знаков, которого было бы достаточно для хранения национального долга в долларах и центах. К счастью, встроенный тип С++ long double имеет точность 19 цифр, поэтому мы можем использовать его как базисный для класса money, даже используя плавающую точку. Однако нам нужно будет добавить возможность ввода и вывода денежных значений с предшествующим им знаком доллара и разделенными запятыми группы по 3 числа; так проще читать большие числа. Первым делом при разработке такого класса напишем метод mstold(), который принимает денежную строку, то есть стоку, представляющую собой некоторое количество денег типа «$1,234,567,890,123.99» в качестве аргумента и возвращает эквивалентное ее значению число типа long double.
Вам нужно будет обработать денежную строку как массив символов и, просматривая ее символ за символом, скопировать из нее только цифры (0-9) и десятичную точку в другую строку. Игнорируя все остальное, включая знак $ и запятые. Затем вы можете использовать библиотечную функцию _atold() (заметим, что здесь название функции начинается с символа подчеркивания – заголовочные файлы STDLIB.H или MATH.H) для преобразования новой строки к числу типа long double. Предполагаем, что денежно значение не может быть отрицательным. Напишите функцию main() для проверки метода mstiod(), которая несколько раз получает денежную строку от пользователя и выводит соответствующее число типа long double.
Кликните здесь для просмотра всего текста

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <sstream> // нужен для stringstream
#include <string>
 
using namespace std;
 
class money
{
public:
    money()
    {}
    void getMoney()
    {
        getline(cin, strMoney);
    }
    double mstiod(); 
 
private:
    string strMoney; // строка получаемая от пользователя
    long double dblMoney; // То что должно получиться на выходе ) 
};
 
 
int main()
{setlocale (LC_ALL,"");
 
money Mon;
 
cout << "Введите сумму: ";
Mon.getMoney();
cout << Mon.mstiod() + 100 << endl; // проверка сложением =) 
 
 
    
return 0;
}
double money::mstiod()
{   unsigned int tmp(0);
    tmp = strMoney.find_first_not_of("1234567890."); //ищу номер символа которого не может быть в типе long double..
 
    while (tmp < strMoney.size() ) //повторяю до тех пор, пока ненужные мне символы не закончаться
        {
            strMoney.erase(tmp, 1); // и удалаю его...
            tmp = strMoney.find_first_not_of("1234567890."); // и опять ищу =)
        }
    //Функция _atold() рекомендрванная в книге не работает. Вот такой вариант вполне рабочий.
    stringstream tmpstr(strMoney);
    tmpstr >> dblMoney;
    return dblMoney;
}
MbICJIuTeJIb_u3
KeM6Pug}I{a
49 / 49 / 2
Регистрация: 23.08.2013
Сообщений: 202
25.08.2013, 02:31     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #78
Тут только Лафоре? Или от дейтлов тоже можно выкладывать ?
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
25.08.2013, 14:22     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #79
Лучше будет создать отдельную тему, тут и так уже громоздко становится )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2013, 23:25     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Еще ссылки по теме:

Объектно-ориентированное программирование C++
Разобраться в примерх к книге Лафоре "Обьектно-ориентированое программирование в С++" C++
C++ Объектно-ориентированное приложение: "Эмулятор банкомата"

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

Или воспользуйтесь поиском по форуму:
kickupduster
 Аватар для kickupduster
4 / 4 / 1
Регистрация: 04.08.2013
Сообщений: 20
25.08.2013, 23:25     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #80
Мой вариант решения 12-го Упражнения 7-й Главы.
Не нашел рабочих функций для работы с типом long doble, использовал просто double. разница не большая.
Глава 7. Упражнение 12
Кликните здесь для просмотра всего текста
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
const int MAX = 50;
//прототипы функций-----------------------------------------------------------------------
double mstod(char[]); //функция перевода денежной строки в double
void reversit(char[]); //функция переворота строки
//----------------------------------------------------------------------------------------
class bMoney
{
private:
    double money;
public:
    bMoney(): money(0.0)
    {}
    bMoney(char s[])
    {money = mstod(s);}
    void getmoney()
    {
        cout << "Введите денежную сумму в формате \"$xxx,xxx,xxx.xx\":" << endl;
        char strM[MAX];
        cin >> strM;
        money = mstod(strM);
    }
    void madd(bMoney m1, bMoney m2)
    {money = m1.money + m2.money;}
    void putmoney();
};
//----------------------------------------------------------------------------------------
double mstod(char str[])
{
    char temp[MAX];
    int k=0;
    for(int i=0; i<strlen(str); i++)
    {
        if (str[i] != '$' && str[i] != ',') { if (str[i] == '.') temp[k++] = ',';
                                              else temp[k++] = str[i];}
    }
    temp[k] = '\0';
    return atof(temp); //не нашел рабочей функции для перевода в long double
}
//----------------------------------------------------------------------------------------
void bMoney::putmoney()
{
    char temp[MAX], strMoney[MAX];
    _gcvt(money, 20, temp); //переводит значение money в строку temp
    int len = strlen(temp);
    int i,k=0,j=0,f=0;
    //в случае если введено целое число
    //строка будет дополнена нулями после точки
    if (temp[len-1] == ',') {temp[len] = '0'; temp[len+1] = '0';}
    else if (temp[len-2] == ',') temp[len] = '0';
    for(i=strlen(temp)-1; i>=0; i--)  //формируем новую строку в обратном порядке
    {
        if (temp[i-2] == ',') f = 1;  //оставляем 2 знака после запятой
        if (j == 3 && k > 3) {strMoney[k++] = ','; j=0;} //расставляем запятые после знака "." через каждые три цифры
        if (temp[i] == ',') {strMoney[k++] = '.'; j=0;}  //замменяем запятую на точку
        else if (f == 1) {strMoney[k++] = temp[i]; j++;} //копируем цифры 
    }
    strMoney[k] = '$';
    strMoney[k+1] = '\0';
    reversit(strMoney);  //преобразуем строку в нормальный вид
    cout << strMoney << endl;  
}
//-----------------------------------------------------------------------------------------
void reversit(char s[])  //функция переворота строки
{
    int len =strlen(s);        //найти длину строки
    for(int j=0; j<len/2; j++) //поменять все
    {                          //символы из первой половины
      char temp = s[j];        //на символы
      s[j] = s[len-j-1];     //из второй половины
      s[len-j-1] = temp;
    }
}
//-----------------------------------------------------------------------------------------
void main()
{
    setlocale(0,"rus");
    bMoney m1("$1,234,567,890,123.99"); //используем конструктор с одним параметром
    cout << "Денежная строка: ";
    m1.putmoney();
    bMoney m2 , m;  //используем конструктор без параметров
    m2.getmoney();
    m.madd(m1,m2); //сумма строк m1 и m2
    cout << "Результат сложения двух денежных сумм: ";
    m.putmoney(); //вывод результата
    system("pause");
}
Yandex
Объявления
25.08.2013, 23:25     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Ответ Создать тему
Опции темы

Текущее время: 23:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru