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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 621, средняя оценка - 4.99
Kimel
15 / 16 / 0
Регистрация: 01.02.2012
Сообщений: 182
#1

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

01.02.2012, 17:47. Просмотров 87537. Ответов 289
Метки нет (Все метки)

Хотя я и начинающий с++-шник. Хочу помочь другим людям. Здесь я буду выкладывать всё что мне удалось решить. В моих решениях будет много хедеров, делал я это в 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;
}
Это конец второй главы, третюю сделаю позже если будет нужна
 Комментарий модератора 
Пост обновлен по просьбе ТС
12
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2012, 17:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" (C++):

Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" - C++
Мне надо решение упражнений из книги Р. Лафоре &quot;Объектно-ориентированное программирование в С++&quot;. Хотя бы какая-то часть

Ищу ответы на задания из книги Лафоре Р. "Объектно-ориентированное программирование в С++" 4 издание. - C++
Дошел до 10 главы, из каждой главы делал все 12 заданий, хочу проверить правильно ли я их делал. И еще нужны ответы на вопросы которые идут...

Объектно-ориентированное приложение: "Эмулятор банкомата" - C++
Доброго времени всем! я начал изучать С++ И хотел бы спросить вашей помощи в этом нелёгком труде. Дело в том, что мне нужно сделать...

Разобраться в примерх к книге Лафоре "Обьектно-ориентированое программирование в С++" - C++
Всем доброго времени суток кто читает эту тему. Сегодня, изучая С++ по книге Лафоре &quot;Обьектно-ориентированое программирование в С++&quot; 4-е...

Объектно-ориентированное программирование - C++
Помогите мне отредактировать программу...У меня есть исходники..Склеить нужно.... Класс Данные класса Методы ...

Объектно-ориентированное программирование в С++ ? - C++
Книга Р. Лафоре - Объектно-ориентированное программирование в С++ как вам ?

289
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");
}
0
reisal78
В поисках работы, СПб
663 / 576 / 136
Регистрация: 28.04.2013
Сообщений: 1,644
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;
}
0
MbICJIuTeJIb_u3
KeM6Pug}I{a
49 / 49 / 2
Регистрация: 23.08.2013
Сообщений: 202
25.08.2013, 02:31 #78
Тут только Лафоре? Или от дейтлов тоже можно выкладывать ?
0
reisal78
В поисках работы, СПб
663 / 576 / 136
Регистрация: 28.04.2013
Сообщений: 1,644
25.08.2013, 14:22 #79
Лучше будет создать отдельную тему, тут и так уже громоздко становится )
0
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");
}
0
MacInsider
4 / 4 / 0
Регистрация: 09.08.2013
Сообщений: 30
26.08.2013, 19:37 #81
Глава 15, упражнение 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
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <set>
 
using namespace std;
const int MAX = 5;
 
int main() 
{
    setlocale(LC_CTYPE,"Russian");
 
    int arr1[MAX] = {2, 4, 6, 8, 10};
    int arr2[MAX] = {1, 3, 5, 7, 9};
    set<int> iSet(arr2, arr2 + 5);
 
    vector<int> iVect;
    vector<int>::iterator iter;
    merge(arr1, arr1 + 5, iSet.begin(), iSet.end(), back_inserter(iVect));
    iter = iVect.begin();
 
    while(iter != iVect.end())
        cout << *(iter++) << " ";
    cout << endl;
 
    system("pause");
    return 0;
}
Глава 15, упражнение 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
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
const int MAX = 10;
 
int main() 
{
    setlocale(LC_CTYPE,"Russian");
    
    vector<int> iVect;
    vector<int>::iterator iter;
    vector<int>::reverse_iterator it;
 
    for(int i = 1; i < MAX; i++)
        iVect.push_back(i);
    
    cout << "Before swap: ";
    for(iter = iVect.begin(); iter != iVect.end(); iter++)
        cout << *(iter) << " ";
    cout << endl;
 
    cout << "After swap: ";
    for(it = iVect.rbegin(); it != iVect.rend(); it++)
        cout << *(it) << " ";
    cout << endl;
 
    system("pause");
    return 0;
}
0
Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
27.08.2013, 14:16 #82
Упражнение 15-06

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
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "");
    int arr[]={15, 7, 12, 32, 7, 8, 7, 12}, temp;
    vector<int> iList;
    /*
    for(int j=0; j<10; j++)
        iList.push_back(j+1);
        */
    for(int j=0; j<8; j++)
        iList.push_back(arr[j]);
    vector<int>::iterator iter=iList.begin();
    cout <<"До замены: ";
    while(iter!=iList.end())
        cout <<*iter++ <<" ";
    iter=iList.begin();
    vector<int>::reverse_iterator riter=iList.rbegin();
    while(*iter!=*riter){
        //swap(*iter++, *riter);
        temp=*iter;
        *iter++=*riter;
        *riter=temp;
        if(*iter==*riter)
            break;
        ++riter;
    }
    cout <<"\nПосле замены: ";
    for(iter=iList.begin(); iter!=iList.end();)
        cout <<*iter++ <<" ";
    cout <<endl;
    system("pause");
    return 0;
}
0
kickupduster
4 / 4 / 1
Регистрация: 04.08.2013
Сообщений: 20
27.08.2013, 20:14 #83
У кого-нибудь есть решение 9-го Упражнения 11-й Главы про скачки?
0
Lurgee
Сообщений: n/a
01.09.2013, 16:02 #84
Не обнаружил решения 12 упр. 10 главы. Не знаю уж, нужно ли будет кому-то, ибо к указателям особенно не относится, да и все в там довольно сумбурно описано, но мало ли.
Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
 
float fmem[20];
int fmem_top=0;
int pmem[20];
 
class Float
{int addr;
 
public:
Float(float f)
{fmem[fmem_top]=f; pmem[fmem_top]=fmem_top; addr=fmem_top;  fmem_top++;}
 
~Float()
{}
 
int& operator &()
{return addr;}
};
 
 
class ptrFloat
{int paddr;
 
public:
ptrFloat(int a):paddr(a)
{}
 
~ptrFloat()
{}
 
float& operator* () const
{return fmem[pmem[paddr]];}
 
};
 
 
int main()
{Float var1 =1.2;
Float var2 =3.4;
ptrFloat ptr1 =&var1;
ptrFloat ptr2 =&var2;
cout<<"*ptr1= "<<*ptr1;
cout<<"\n*ptr2= "<<*ptr2;
*ptr1=5.6;
*ptr2=7.8;
cout<<"\n*ptr1= "<<*ptr1;
cout<<"\n*ptr2= "<<*ptr2;
    _getch();
}
kickupduster
4 / 4 / 1
Регистрация: 04.08.2013
Сообщений: 20
02.09.2013, 17:38 #85
Цитата Сообщение от MacInsider Посмотреть сообщение
Я хотел спросить у всех, есть ли у кого то решение 1 задания (проекта) из главы 13
Если интересно, то вот мой вариант решения Глава 13. Задание 1
verylong.h
Кликните здесь для просмотра всего текста
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
// verylong.h
// описатель класса сверхбольших целых чисел
#include <iostream>
#include <string.h>            //для strlen()и т. п.
#include <stdlib.h>            //для ltoa()
using namespace std;
 
const int SZ = 1000;           //максимальное число разрядов
 
class verylong
  {
  private:
      bool minus;
      char vlstr[SZ];            //число как строка
      int vlen;                  //длина строки verylong
      verylong multdigit(const int) const; //прототипы
      verylong mult10(const verylong) const;// скрытых функций
  public:
    verylong() : vlen(0)       //конструктор без аргументов
      { vlstr[0]='0'; vlstr[1]='\0'; minus = false;}
    verylong(const char s[SZ]) //конструктор (1 аргумент)
      {                        //для строки
          strcpy(vlstr, s); 
          vlen=strlen(s);
          minus = false;
      } 
    verylong(const unsigned long n) //конструктор (1 арг.)
      {                             //для long int
      ltoa(n, vlstr, 10);           //перевести в строку
      strrev(vlstr);                //перевернуть ее
      vlen=strlen(vlstr);           //найти длину
      minus = false;
      } 
    void putvl() const;              //вывести число
    void getvl();       //получить число от пользователя
    verylong operator + (const verylong); //сложить числа
    verylong operator * (const verylong); //умножить
    verylong operator - (const verylong);
    verylong operator / (const verylong);
    verylong operator ++ (int);
    bool operator == (const verylong) const;
    bool operator < (const verylong) const;
    bool operator > (const verylong) const;
    bool operator >= (const verylong) const;
    bool operator <= (const verylong) const;
    bool operator != (const verylong) const;
    friend verylong abs(const verylong&);
  };
verylong.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
// verylong.cpp
// реализация обработки данных типа verylong
#include "verylong.h"        //заголовочный файл для verylong
//---------------------------------------------------------
void verylong::putvl() const //вывод на экран verylong
  {
  char temp[SZ];
  strcpy(temp,vlstr);        //создать копию
  if (minus == true)
  {
      temp[vlen] = '-';
      temp[vlen+1] = '\0';
  }
  cout << strrev(temp) << endl;      //перевернуть копию
  }                          //и вывести ее
//---------------------------------------------------------
void verylong::getvl()       //получить сверхбольшое число от
                             //пользователя
  {
    cin >> vlstr;              //получить строку от пользователя
    vlen = strlen(vlstr);      //найти ее длину
    strrev(vlstr);             //перевернуть ее
    if (vlstr[vlen-1] == '-') 
    {
        vlstr[vlen-1] = '\0';
        minus = true;
        vlen -= 1;
    }
  }
//---------------------------------------------------------
verylong verylong::operator + (const verylong v)
                             //сложение
  {
      if (minus == true && v.minus == false) return abs(v) - abs(*this);
      if (minus == false && v.minus == true) return abs(*this) - abs(v);
  char temp[SZ];
  int j;
  int maxlen = (vlen > v.vlen) ? vlen : v.vlen; //найти самое длинное число
  int carry = 0;             //установить в 1, если сумма >= 10
  for(j = 0; j<maxlen; j++)  //и так для каждой позиции
    {
    int d1 = (j > vlen-1)  ? 0 : vlstr[j]-'0';    //получить
                                                  //разряд
    int d2 = (j > v.vlen-1) ? 0 : v.vlstr[j]-'0'; //и еще
    int digitsum = d1 + d2 + carry;  //сложить разряды
    if( digitsum >= 10 )             //если перенос, то
      { digitsum -= 10; carry=1; }   //увеличить сумму на 10
    else                     //установить перенос в 1
      carry = 0;             //иначе перенос = 0
    temp[j] = digitsum+'0';  //вставить символ в строку
    }
  if(carry==1)               //если перенос в конце,
    temp[j++] = '1';         //последняя цифра = 1
  temp[j] = '\0';            //поставить ограничитель строки
  if (minus == true && v.minus == true) 
  {
      verylong t(temp); 
      t.minus = true; 
      return t;
  }
  return verylong(temp);     //вернуть временный verylong
  }
//---------------------------------------------------------
verylong verylong::operator - (const verylong v)
{
    if (minus == true && v.minus == false) return *this = *this + v;
    if (minus == false && v.minus == true) return abs(*this) + abs(v);
    char temp[SZ];
    int j;
    int maxlen = (vlen > v.vlen) ? vlen : v.vlen;  //найти самое длинное число
  int carry = 0;             //установить в 1, если сумма >= 10
  for(j = 0; j<maxlen; j++)  //и так для каждой позиции
    {
    int d1 = (j > vlen-1)  ? 0 : vlstr[j]-'0';    //получить
                                                  //разряд
    int d2 = (j > v.vlen-1) ? 0 : v.vlstr[j]-'0'; //и еще
    int digitsum; //сложить разряды
    (*this < v)? digitsum = d2 - d1 - carry : digitsum = d1 - d2 - carry;  
    if( digitsum < 0 )               //если перенос, то
      { digitsum += 10; carry=1; }   //увеличить сумму на 10
    else                     //установить перенос в 1
      carry = 0;             //иначе перенос = 0
    temp[j] = digitsum+'0';  //вставить символ в строку
    }
  temp[j] = '\0';  
  for(int i=j-1; i>0; i--)
  {
      if (temp[i] == '0') temp[i] = '\0';
      else break;
  }
  if (*this < v) 
  {
       verylong t(temp);
       t.minus = true;
       return t;
  }
  return verylong(temp);     //вернуть временный verylong
}
//---------------------------------------------------------
verylong verylong::operator * (const verylong v)//умножение
  {                                             //сверхбольших чисел
  verylong pprod;            //произведение одного разряда
  verylong tempsum;          //текущая сумма
  for(int j=0; j<v.vlen; j++)//для каждого разряда аргумента
    {
    int digit = v.vlstr[j]-'0'; //получить разряд
    pprod = multdigit(digit);   //умножить текущий на него
    for(int k=0; k<j; k++)      //умножить результат на
      pprod = mult10(pprod);    //  степень 10-ти
    tempsum = tempsum + pprod;  //прибавить произведение к
                                //текущей сумме
    }
  if (minus == true || v.minus == true) tempsum.minus = true;
  if (minus == true && v.minus == true) tempsum.minus = false;
  return tempsum;               //вернуть полученную текущую сумму
  }
//---------------------------------------------------------
bool verylong::operator == (const verylong v) const
{return (vlen == v.vlen && strcmp(vlstr,v.vlstr) == 0 && ((minus == true && v.minus == true) || (minus == false && v.minus == false)))? true: false;}
//---------------------------------------------------------
bool verylong::operator < (const verylong v) const
{
 
    if (((vlen < v.vlen) && (minus == false && v.minus == false)) || (minus == true && v.minus == false)) return true;
    if ((vlen > v.vlen) && (minus == true && v.minus == true)) return true;
    if (vlen == v.vlen)
    {
        if (minus == false && v.minus == true) return false;
        char *str1 = new char[vlen], *str2 = new char[v.vlen];
        strcpy(str1,vlstr); strcpy(str2,v.vlstr);
        strrev(str1); strrev(str2);
        if (strcmp(str1, str2) > 0 && (minus == true && v.minus == true)) return true;
        if (strcmp(str1, str2) < 0 && (minus != true && v.minus != true)) return true;
    }
    return false;
}
//---------------------------------------------------------
bool verylong::operator > (const verylong v) const
{
    verylong t(vlstr);
    t.minus = minus;
    return (!(t < v) && !(t == v))? true: false;
}
//---------------------------------------------------------
bool verylong::operator <= (const verylong v) const
{
    verylong t(vlstr);
    t.minus = minus;
    return (t < v || t == v)? true: false;
}
//---------------------------------------------------------
bool verylong::operator >= (const verylong v) const
{
    verylong t(vlstr);
    t.minus = minus;
    return (t > v || t == v)? true: false;
}
//---------------------------------------------------------
bool verylong::operator != (const verylong v) const
{
    verylong t(vlstr);
    t.minus = minus;
    return (!(t == v))? true: false;
}
//---------------------------------------------------------
verylong verylong::operator ++ (int)
{return *this = *this + 1;}
//---------------------------------------------------------
verylong abs(const verylong &v)
{
    verylong t;
    t = v;
    t.minus = false;
    return t;
}
//---------------------------------------------------------
verylong verylong::operator / (const verylong v) //целочисленное деление
{
    char *str_v = new char[vlen]; //временная строка
    strcpy(str_v,vlstr); strrev(str_v); //переворачиваем ее в нормальный вид
    verylong b, rez, vltemp, null;
    null.vlen = 1; 
    b = abs(v); //значение по модулю
    if (b == null) {cerr << "ОШИБКА!!! Деление на ноль!!!" << endl; return null;}
    if (abs(*this) < b) return null; //если делимое меньше делителя - возвращаем ноль
    for(int i=0, n=0; i<vlen;) //перебираем разряды делимого
    {
        while(vltemp < b) //берем разряды делимого
        {                 //пока не получим число большее делителя
            if (i >= vlen) return rez; 
            int d = str_v[i]-'0'; //берем разряд
            if (d == 0 && vltemp == null) rez = mult10(rez); //сносим нули при необходимости
            else vltemp = mult10(vltemp) + d; //формируем число 
            i++;
        }
        if (vltemp >= b) //если получили такое число
        {
            while(vltemp >= b) //уменшаем его
            {                  //пока остаток не станет меньше делителя
                vltemp = vltemp - b; 
                n++; //считаем значение разряда
            }
            rez = mult10(rez) + n; //формируем результат
            n = 0; //зануляем значение разряда
        }          //и повторяем цикл пока не пройдем весь велитель
    }
    if (minus == true || v.minus == true) rez.minus = true; //учитываем знаки исходных данных
    if (minus == true && v.minus == true) rez.minus = false;
    return rez;
}
//---------------------------------------------------------
verylong verylong::mult10(const verylong v) const //умножение аргумента 
                                                  //на 10
  {                
  char temp[SZ];
  for(int j=v.vlen-1; j>=0; j--)//сдвинуться на один разряд
    temp[j+1] = v.vlstr[j];     //выше
  temp[0] = '0';                //обнулить самый младший разряд
  temp[v.vlen+1] = '\0';        //поставить ограничитель строки
  return verylong(temp);        //вернуть результат
  }
//---------------------------------------------------------
verylong verylong::multdigit(const int d2) const
  {                          //умножение числа на
  char temp[SZ];             //аргумент (цифру)
  int j, carry = 0;
  for(j = 0; j<vlen; j++)    //для каждого разряда
    {              //  в этом сверхбольшом
    int d1 = vlstr[j]-'0';   //получить значение разряда
    int digitprod = d1 * d2; //умножить на цифру
    digitprod += carry;      //добавить старый перенос
    if( digitprod >= 10 )    //если возник новый перенос,
      {
      carry = digitprod/10;  //переносу присвоить //значение старшего разряда
      digitprod -= carry*10; //результату - младшего
      }
    else
      carry = 0;             //иначе перенос = 0
    temp[j] = digitprod+'0'; //вставить символ в строку
    }
  if(carry != 0)             //если на конце перенос,
    temp[j++] = carry+'0';   //это последний разряд
  temp[j] = '\0';            //поставить ограничитель
  return verylong(temp);     //вернуть сверхбольшое число
  }
main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "verylong.h"    //заголовочный файл verylong
int main()
  {
      setlocale(0,"rus");
      verylong *a, *b, *r; //объекты класса
      while(true){
      a = new verylong; b = new verylong; r = new verylong;
      cout << "Введите число: "; a->getvl(); //ввод данных
      cout << "Введите число: "; b->getvl();
      *r = *a + *b;
      cout << "Результат: "; r->putvl();
      *r = *a - *b;
      cout << "Результат: "; r->putvl();
      *r = *a * *b;
      cout << "Результат: "; r->putvl();
      *r = *a / *b;
      cout << "Результат: "; r->putvl();
      delete a,b,r;} //вывод на экран
  system("pause");
  return 0;
  }
2
Purcell
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
04.09.2013, 01:24 #86
Глава 5. Задание 2.
В ответах у самого Лафоре решение этого задания не предусматривает возможность возведения в степень с отрицательным показателем. Поэтому я немного дополнил функцию.

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
// 02.cpp
// функция возведения в степень
 
# include <iostream>
 
using namespace std;
// объявление функции; по умолчанию второй аргумент равен 2
double power(double base, int exponent = 2);
int main()
{
    double base;    // основание степени
    int exponent;   // показатель степени
    char ch;        // выбор пользователя
    cout << "Введите число: ";
    cin >> base;
    cout << "Будете возводить его в степень с показателем, отличным от 2? (y/n) ";
    cin >> ch;
    if (ch == 'y')
    {
        cout << "Введите показатель степени: ";
        cin >> exponent;
        cout << "Результат: " << power(base, exponent) << endl;
    }
    else
    {
        cout << "Результат: " << power(base) << endl;
    }
    return 0;
}
//--------------------------------------------------------------------
// определение функции
double power(double b, int e)
{
    double result = 1.0;  // начинаем с 1.0
    if (e >= 0)           // степень с положительным или нулевым
    {                     // показателем
        for (int i = 0; i < e; i++)
        {
            result *= b;
        }
    }
    else                  // степень с отрицательным показателем
    {
        e = 0 - e;
        for (int i = 0; i < e; i++)
        {
            result *= b;
        }
        result = 1 / result;
    }
    return result;
}
0
xypc
10 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 65
06.09.2013, 19:10 #87
Я так понял, что никто кроме меня не заметил, что третья задача во второй главе решена неправильно, да? Как бы в условии было задано, что использовать нужно константу(!)
0
kickupduster
4 / 4 / 1
Регистрация: 04.08.2013
Сообщений: 20
07.09.2013, 11:13 #88
Цитата Сообщение от xypc Посмотреть сообщение
Я так понял, что никто кроме меня не заметил, что третья задача во второй главе решена неправильно, да? Как бы в условии было задано, что использовать нужно константу(!)
Не драматизируй!) Это не критично, есть проблемы куда серьезней этой
0
Рики
6 / 6 / 1
Регистрация: 27.02.2013
Сообщений: 23
02.10.2013, 07:40 #89
Глава 11

Задание 11.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
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
#include <iostream>
using namespace std;
const int LEN = 80;
////////////////////////////////////////////////////////////////////////////////
class publication
{
   private:
       char name[LEN]; 
       float price;
   public:
    virtual void getdata ()
      {
            cout<<"\nВведите имя: ";  cin>>name; 
            cout<<"Введите цену: "; cin>>price; 
      } 
    virtual void putdata ()
      {
            cout<<"\n Название: "<<name;   
            cout<<"\n Цена: "<<price; 
      } 
    virtual bool isOverersize()=0;
};
////////////////////////////////////////////////////////////////////////////////
class book: public publication
{
   private:
       int pages; 
   public:
    void getdata ()
      {
            publication::getdata();
            cout<<"Введите количество страниц: ";  cin>>pages; 
      } 
    void putdata ()
      {
            publication::putdata();
            cout<<"\n Количество страниц: "<<pages;   
      }
    virtual bool isOverersize()
      {return (pages>800)? true : false;}
};
////////////////////////////////////////////////////////////////////////////////
class type: public publication
{
   private:
       float min; 
   public:
    void getdata ()
      {
            publication::getdata();
            cout<<"Введите длительность аудиозаписи в минутах: ";  cin>>min; 
      } 
    void putdata ()
      {
            publication::putdata();
            cout<<"\n Общая длительность в минутах: "<<min;   
      } 
    virtual bool isOverersize()
      {return (min>90)? true : false;}
};
////////////////////////////////////////////////////////////////////////////////
int main()
{
setlocale (LC_ALL, "russian");
publication* pointer[100];
int n = 0;
char choice;
do {
    cout<<"Книга (b) или запись (r)?  ";
    cin>>choice;
    if (choice=='b')
        pointer[n]=new book;
    else
        pointer[n]=new type;
    pointer[n++]->getdata();
    cout<<"Продолжить ввод (y/n)? ";
    cin>>choice;
    } while (choice=='y');
for (int j=0; j<n; j++)
    {
    pointer[j]->putdata ();
    if(pointer[j]->isOverersize ())
        cout<<"Превышение размера! ";
    }
system("Pause");
return 0;
}

Задание 11.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
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
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <process.h>
using namespace std;
static const int MAX = 26;
/////////////////////////////////////////////////////////////
class bMoney
{
  private:
    double longMoney;
  public:
    char chMoney[MAX];
    bMoney ():longMoney(0.0) // конструктор
      {chMoney[0]='$';}
    bMoney (double chislo) // конструктор
      {longMoney=chislo;}
 
    void getMoney ()
        {
            cout << "Введите денежную сумму" << endl;
            cin >> longMoney;
        }
    double vozvrat ()
        {
            return longMoney;
        }
    double mstold ( char []);
 
    bMoney operator+ (bMoney m2)
        {return bMoney (longMoney + m2.longMoney);}
 
    bMoney operator- (bMoney m2)
        {return bMoney (longMoney - m2.longMoney);}
 
    bMoney operator* (double d2)
        {return bMoney (longMoney * d2);}
 
    friend bMoney operator* (bMoney m1, bMoney m2)
        {return bMoney (m1.longMoney * m2.longMoney);}
 
    friend bMoney operator/ (bMoney m1, bMoney m2)
        {return bMoney (m1.longMoney / m2.longMoney);}
 
    void display ( )const
      {
           cout<<fixed<<setprecision(2)<<"$"<<longMoney << endl; 
      }           
};
/////////////////////////////////////////////////////////////
int main ( )
{
  setlocale (LC_ALL, "russian");
  bMoney m1, m2, m3, m4, m5, m6, m7, m8, m9;
  double d1;
  char answer = 'y';
  while (answer!='n')
  {
    //cout << "Введите количество изделий." << endl;
    //cin >> d1;
    d1 = 10;
    m1 = 200;
    m2 = 10;
    m3 = m1 + m2;
    m4 = m1 - m2;
    m5 = m1 * d1;
    m6 = m1 / m2;
    m7 = m1 / d1;
    m8 = 5.5 * m2;
    m9 = 500 / m1;
 
    m3.display();
    m4.display();
    m5.display();
    m6.display();
    m7.display();
    m8.display();
    m9.display();
 
    cout << "Продолжить ввод?" << endl;
    cin >> answer;
 
  } 
  system("pause");
  return 0;
}

Задание 11.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
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <process.h>
#include <math.h> 
using namespace std;
static const int MAX = 26;
/////////////////////////////////////////////////////////////
class bMoney
{
  private:
    double longMoney;
  public:
    char chMoney[MAX];
    bMoney ():longMoney(0.0) // конструктор
      {chMoney[0]='$';}
    bMoney (double chislo) // конструктор
      {longMoney=chislo;}
 
    void getMoney ()
        {
            cout << "Введите денежную сумму" << endl;
            cin >> longMoney;
            
        }
    double vozvrat ()
        {
            return longMoney;
        }
    double mstold ( char []);
 
    bMoney operator+ (bMoney m2)
        {return bMoney (longMoney + m2.longMoney);}
 
    bMoney operator- (bMoney m2)
        {return bMoney (longMoney - m2.longMoney);}
 
    bMoney operator* (double d2)
        {return bMoney (longMoney * d2);}
 
    friend bMoney operator* (bMoney m1, bMoney m2)
        {return bMoney (m1.longMoney * m2.longMoney);}
 
    friend bMoney operator/ (bMoney m1, bMoney m2)
        {return bMoney (m1.longMoney / m2.longMoney);}
 
    void display ()
      {
           cout<<fixed<<setprecision(2)<<"$"<<longMoney << endl; 
      }           
    bMoney round();
};
//--------------------------------------------------------------------
    bMoney bMoney::round ()
    {
        double fractpart, intpart;
        fractpart = modf(longMoney, &intpart);
        if (fractpart<0.5)
            longMoney = intpart;
        else longMoney = intpart+1;
        return bMoney(longMoney);
            
 
    }
/////////////////////////////////////////////////////////////
int main ( )
{
  setlocale (LC_ALL, "russian");
  bMoney m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11;
  double d1;
  char answer = 'y';
  while (answer!='n')
  {
    d1 = 10;
    m1 = 200.45;
    m2 = 10.55;
    m3 = m1 + m2;
    m4 = m1 - m2;
    m5 = m1 * d1;
    m6 = m1 / m2;
    m7 = m1 / d1;
    m8 = 5.5 * m2;
    m9 = 500 / m1;
    m10 = m1.round();
    m11 = m2.round();
    
    m3.display();
    m4.display();
    m5.display();
    m6.display();
    m7.display();
    m8.display();
    m9.display();
    m10.display();
    m11.display();
 
    cout << "Продолжить ввод?" << endl;
    cin >> answer;
 
  } 
  system("pause");
  return 0;
}

Задание 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
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
// parse.cpp
#include <iostream>
#include <cstring>                   //for strlen(), etc
#include <stdlib.h> 
using namespace std;
const int LEN = 80;    //length of expressions, in characters
const int MAX = 40;    //size of stack
////////////////////////////////////////////////////////////////
  class Token                      // Абстрактный базовый класс
    {
    public:
      virtual void showOperNumber()=0; // чистая виртуальная
      virtual char getOperator()=0;             // функция
      virtual float getNumber()=0; 
 
      
    };
////////////////////////////////////////////////////////////////
  class Operator : public Token
    {
    private:
      char oper;             // Операторы +, –, *, /
    public:
      Operator(char c): oper(c)      // конструктор устанавливает значение
        {}
      void showOperNumber()    // получить значение
        {cout<<oper<<endl; }
      virtual float getNumber()
        { return 0.f; }
      char getOperator()
        {return oper;}
     
    };
////////////////////////////////////////////////////////////////
  class Number : public Token
    {
    private:
      float fnum;            // число
    public:
      Number(float f): fnum(f)         // конструктор устанавливает значение
         {}
      void showOperNumber()     // получить значение
        {cout<<fnum<<endl;}
      float getNumber()
        {return fnum;}
      virtual char getOperator()
        { return 0.f; }
    };
////////////////////////////////////////////////////////////////////
class Stack
   {
   private:
      Token* atoken[100];    //содержит типы Operator* и Number*                  
      int top;                       //number of top of stack
   public:
      Stack()                        //constructor
         { top = 0; }
      void push(Token* var)            //put char on stack
         { atoken[++top] = var; }
      Token* pop()                     //take char off stack
         { return atoken[top--]; }
      int gettop()                   //get top of stack
         { return top; }
   };
////////////////////////////////////////////////////////////////
class express
{
    private:
        Stack s;
        char* pStr;
        int len;
    public:
        express (char* ptr)
        {
            pStr=ptr;
            len =strlen(pStr);
        }
        void parse ();     // разбор выражения
        float solve ();      // получение результата
};
//--------------------------------------------------------------
void express::parse()
{
    char chifra [LEN];    //символы из строки
    float lastval;        // последнее значение
    char lastop;          // последний оператор
    Number* ptrN;
    Operator* ptrO;
    float n;
    char Ch;  
    int j=0;
     
 
    for(j; j<len; j++)          //для всех символов в строке
    {
        if (pStr[j]>='0' && pStr[j]<='9' || pStr[j]==',')
        {
            int i=0;
            while (pStr[j]>='0' && pStr[j]<='9' || pStr[j]==',')  // получаем число 
            {
                chifra [i]=pStr[j];
                j++; i++;
            }
            j--;
            chifra [i]='\0';
            n = atof(chifra);
            ptrN = new Number(n);
            s.push(ptrN);                                       // заносим  в стек
        }
        else if(pStr[j]=='+' || pStr[j]=='-' || pStr[j]=='*' || pStr[j]=='/')
        {
            Ch = pStr[j];
            if (s.gettop()==1)                                    // если это первый оператор, то помещаем в стек
            {
                ptrO = new Operator(Ch);
                s.push(ptrO);   
            }
            else
            {
                lastval=s.pop()->getNumber();                //получение предыдущего числа
                lastop=s.pop()->getOperator();              //получение предыдущего оператора
                // если это * или / , а предыдущий был + или -, то
                if( (pStr[j]=='*' || pStr[j]=='/') && (lastop=='+' || lastop=='-') )
                {
                    ptrO = new Operator(lastop);   //отменяем последние два взятия из стека
                    s.push(ptrO);   
                    ptrN = new Number(lastval);
                    s.push(ptrN);   
               }
               else                     //помещаем в стек текущий оператор 
               {
               switch(lastop)        
                  {                  
                  case '+': ptrN = new Number(s.pop()->getNumber() + lastval); s.push(ptrN); break;
                  case '-': ptrN = new Number(s.pop()->getNumber() - lastval); s.push(ptrN); break;
                  case '*': ptrN = new Number(s.pop()->getNumber() * lastval); s.push(ptrN); break;
                  case '/': ptrN = new Number(s.pop()->getNumber() / lastval); s.push(ptrN); break;
                  default:  cout << "\nUnknown oper"; exit(1);
                  }  
               }  
            ptrO = new Operator(pStr[j]);
            s.push(ptrO);              //помещаем в стек текущий оператор 
            }  
         }  
   
      else                           //что-то левое
         { cout << "\nUnknown input character"; exit(1); }
   }
}
//-------------------------------------------------------------
float express::solve ()  //убираем данные из стека
{
    float lastval;              
    while(s.gettop() > 1)
      {
      lastval = s.pop()->getNumber();               //предыдущее значение 
      Number* ptrN;
      switch( s.pop()->getOperator() )              //получение предыдущего оператора
         {                           //do operation, push answer
         case '+': ptrN = new Number(s.pop()->getNumber() + lastval); s.push(ptrN); break;
         case '-': ptrN = new Number(s.pop()->getNumber() - lastval); s.push(ptrN); break;
         case '*': ptrN = new Number(s.pop()->getNumber() * lastval); s.push(ptrN); break;
         case '/': ptrN = new Number(s.pop()->getNumber() / lastval); s.push(ptrN); break;
         default:  cout << "\nUnknown operator"; exit(1);
         }  
      }  
   return float (s.pop()->getNumber());//последний оператор в стеке это результат
}
////////////////////////////////////////////////////////////////
 
int main()
   {
   setlocale (LC_ALL, "russian");
   char ans;            // 'д' или 'н'
   //char stroka [LEN]="12,05+13,05+14,05*2";                          //char from input string
   char stroka [LEN];
   cout << "\nВведите арифметическое выражение в виде 2+3*4/3-2"
          "\nЧисла должны быть из одной цифры"
          "\nНе используйте пробелы и скобки";
 
   do
   {
       cout << "\nВыражение: ";
       cin >> stroka;                          // вводим строку
       express* eptr = new express (stroka);
       eptr->parse();
       cout <<"\nРезультат: "
           << eptr->solve();
       delete eptr;
       cout << "Еще одно выражение (y/n)? ";
    cin >> ans;
   }
   while ( ans == 'y' );
   system("pause");
   return 0;
   }

Задание 11.9
Пояснения
Кликните здесь для просмотра всего текста
Своеобразное задание. Возникли проблемы при запуске исходника horse. пилагаю к заданию рабочее на visual studio 2012 решение Horse.7z
По хорошему, как думаю я, нужно было сделать два наследственных класса comhorse и comtrack. Дальше, перегрузить конструктор comtrack, дабы он использовал comhorse, а затем переделать функцию run(). и прикрепить к ней horse_tick. К сожалению, я не смог справиться с переопределением конструктора в классе comtrack. Поэтому, просто переделал все заново (без наследования) и запустил работающий пример с ведущей лошадью. Надеюсь, этот файл кому-то поможет. С удовольствием посмотрю на сделанное, как надо, решение этой задачи.

Кликните здесь для просмотра всего текста
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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "stdafx.h"
#include "msoftcon.h"
using namespace std;
const int CPF = 5;
const int maxHorses = 7;
///////////////////////////////////////////////////////////
//class track;
/////////////////////////////////////////////////////////////
//class horse
//{
//  protected:
//    const track* ptrTrack;
//    const int horse_number;
//    float finish_time;
//    float distance_run;
//  public:
//    horse ( const int n, const track* ptrT ) : 
//      horse_number ( n ),
//      ptrTrack ( ptrT ),
//      distance_run ( 0.0 )
//      { }
//    ~horse ( )
//      { }
//    void display_horse ( const float elapsed_time );
//};
//
/////////////////////////////////////////////////////////////
//class track
//{
//  protected:
//    horse* hArray [ maxHorses ];
//    int total_horses;
//    int horse_count;
//    const float track_length;
//    float elapsed_time;
//  public:
//  track();
//    track ( float lenT, int nH );
//    ~track ( );
//    void display_track ( );
//    void run ( );
//    float get_track_len ( ) const;
//};
////-----------------------------------------------------------
//void horse::display_horse ( float elapsed_time )
//{
//  set_cursor_pos ( 1 + int ( distance_run * CPF ), 2 + horse_number * 2 );
//  set_color ( static_cast<color>( cBLUE + horse_number ) );
//  char horse_char = '0' + static_cast<char>( horse_number );
//  _putch ( ' ' );    // выводит на экран символы
//  _putch ( '\xDB' ); 
//  _putch ( horse_char ); 
//  _putch ( '\xDB' );
//  if ( distance_run < ptrTrack->get_track_len ( ) + 1.0 / CPF )
//  {       //работает пока пробег!=длинне трека
//    if ( rand ( ) % 3 )  //в диапазоне от 0 до 3
//      distance_run += 0.2F;//если совпадает, лошадь продвигается на 0.2
//    finish_time = elapsed_time;  //учитывает время потраченное лошадью на забег
//  }
//  else
//  {
//    int mins = int ( finish_time ) / 60;
//    int secs = int ( finish_time ) - mins * 60;
//    cout << " Time = " << mins << ":" << secs;
//  }
//}
////-----------------------------------------------------------
//track::track ( float lenT, int nH ) : // добавляет в массив лошади
//  track_length ( lenT ),
//  total_horses ( nH ),
//  horse_count ( 0 ),
//  elapsed_time ( 0.0 )
//{
//  init_graphics ( );
//  total_horses = ( total_horses > maxHorses ) ? maxHorses : total_horses; //проверка на количество лошадей
//  for ( int j = 0; j < total_horses; j++ )
//    hArray [ j ] = new horse ( horse_count++, this );
//
//  time_t aTime;
//  srand ( static_cast<unsigned>( time ( &aTime ) ) );  //генерирует псевдослучайные числа в зависимости от времени
//  display_track ( );                                   //начинает рисовать трек
//}
////-----------------------------------------------------------
//track::~track ( )
//{
//  for ( int j = 0; j < total_horses; j++ )
//    delete hArray [ j ];
//}
////-----------------------------------------------------------
//void track::display_track ( ) //отображает вертикальные полоски
//{
//  clear_screen ( );           //очищает консоль
//
//  for ( int f = 0; f <= track_length; f++ )  //рисует вертикальную полосоку 
//    for ( int r = 1; r <= total_horses * 2 + 1; r++ ) //в зависимости от 
//    {                                                 //количества лошадей   
//      set_cursor_pos ( f * CPF + 5, r );
//      if ( f == 0 || f == track_length )
//        cout << '\xDE';  //толстые полоски
//      else
//        cout << '\xB3';  //тонкие полоски
//    }
//}
////-----------------------------------------------------------
//void track::run ( )      //перемещает лошади по экрану
//{                        //и отображает 
//  while ( !_kbhit ( ) )  //цикл будет выполняться, пока не нажата клавиша клавиатуры
//  {
//    elapsed_time += 1.75; //затраченное время
//
//    for ( int j = 0; j < total_horses; j++ )
//  {
//      hArray [ j ]->display_horse ( elapsed_time );
//  }
//    wait ( 500 ); //после прорисовки лошадей ждет 500 
//  }
//  _getch ( );   //возвращает очередной символ, считанный с консоли, но не выводит этот сим*вол на экран
//  cout << endl;
//}
////-----------------------------------------------------------
//float track::get_track_len ( ) const
//  { return track_length; }
////-----------------------------------------------------------
//float horse::get_distance_run ( )
//      { return distance_run; }
///////////////////////////////////////////////////////////
//Наследуемые классы
///////////////////////////////////////////////////////////
class comtrack;
///////////////////////////////////////////////////////////
class comhorse
{
    private:
        const comtrack* ptrcTrack;
        const int horse_number;
        float finish_time;
        float distance_run;
    public:
        comhorse (const int n, const /*track* ptrT*/ comtrack* ptrcT):
        horse_number ( n ),
        ptrcTrack ( ptrcT ),
        distance_run ( 0.0 )
            {}
        void horse_tick ();
        float get_distance_run()
        {return distance_run;}
        void display_comhorse ( const float elapsed_time );
};
///////////////////////////////////////////////////////////
class comtrack
{
    private:
        comhorse* hArray [ maxHorses ];
        int total_horses;
        int horse_count;
        const float track_length;
        float elapsed_time;
    public:
        //comtrack();
        comtrack(float lenT, int nH):
        track_length ( lenT ),
        total_horses ( nH ),
        horse_count ( 0 ),
        elapsed_time ( 0.0 )
        {
            init_graphics ( );
            total_horses = ( total_horses > maxHorses ) ? maxHorses : total_horses; //проверка на количество лошадей
            for ( int j = 0; j < total_horses; j++ )
                hArray [ j ] = new comhorse ( horse_count++, this );
            time_t aTime;
            srand ( static_cast<unsigned>( time ( &aTime ) ) );  //генерирует псевдослучайные числа в зависимости от времени
            display_comtrack ( );                                   //начинает рисовать трек
        }
        ~comtrack ( )
        {}
        void comrun ( );
        void display_comtrack ( );
        float get_comtrack_len ( ) const;
        //friend void horse_tick ( int, comhorse*  );
};
//-----------------------------------------------------------
void comhorse::display_comhorse ( float elapsed_time )
{
  set_cursor_pos ( 1 + int ( distance_run * CPF ), 2 + horse_number * 2 );
  set_color ( static_cast<color>( cBLUE + horse_number ) );
  char horse_char = '0' + static_cast<char>( horse_number );
  _putch ( ' ' );    // выводит на экран символы
  _putch ( '\xDB' ); 
  _putch ( horse_char ); 
  _putch ( '\xDB' );
  if ( distance_run < ptrcTrack->get_comtrack_len ( ) + 1.0 / CPF )
  {       //работает пока пробег!=длинне трека
    if ( rand ( ) % 3 )  //в диапазоне от 0 до 3
      distance_run += 0.2F;//если совпадает, лошадь продвигается на 0.2
    finish_time = elapsed_time;  //учитывает время потраченное лошадью на забег
  }
  else
  {
    int mins = int ( finish_time ) / 60;
    int secs = int ( finish_time ) - mins * 60;
    cout << " Time = " << mins << ":" << secs;
  }
}
//-----------------------------------------------------------
void comtrack::display_comtrack ( ) //отображает вертикальные полоски
{
  clear_screen ( );           //очищает консоль
 
  for ( int f = 0; f <= track_length; f++ )  //рисует вертикальную полосоку 
    for ( int r = 1; r <= total_horses * 2 + 1; r++ ) //в зависимости от 
    {                                                 //количества лошадей   
      set_cursor_pos ( f * CPF + 5, r );
      if ( f == 0 || f == track_length )
        cout << '\xDE';  //толстые полоски
      else
        cout << '\xB3';  //тонкие полоски
    }
}
//-----------------------------------------------------------
float comtrack::get_comtrack_len ( ) const
  { return track_length; }
//-----------------------------------------------------------
void comtrack::comrun ( )      //перемещает лошади по экрану
{                        //и отображает 
   while ( !_kbhit ( ) )  //цикл будет выполняться, пока не нажата клавиша клавиатуры
  {
    elapsed_time += 1.75; //затраченное время
 
    for ( int j = 0; j < total_horses; j++ )
    {
      int z = 0;
      hArray [ j ]->display_comhorse ( elapsed_time );
      if ( hArray [ j ]->get_distance_run() > track_length / 2.01 &&
           hArray [ j ]->get_distance_run() < track_length / 1.9  )
            for ( int k = 0;  k <total_horses; k++)
            {
                if (hArray [ j ]->get_distance_run() >= hArray [ k ]->get_distance_run())
                {
                    z++;
                    if (z==total_horses)
                        hArray [ j ]->horse_tick ();
                }
            }   
    }
    wait ( 500 ); //после прорисовки лошадей ждет 500 
  }
  _getch ( );   //возвращает очередной символ, считанный с консоли, но не выводит этот сим*вол на экран
  cout << endl;
}
///////////////////////////////////////////////////////////
void comhorse::horse_tick ()
{
    set_cursor_pos ( 1 + int ( distance_run * CPF ), 2 + horse_number * 2 );
    set_color ( static_cast<color>( cBLUE + horse_number ) );
    char horse_char = '0' + static_cast<char>( horse_number );
    distance_run += 0.35F;//если совпадает, лошадь продвигается на 0.2
    _putch ( '   ' );    // выводит на экран символы
    _putch ( '\xDB' ); 
    _putch ( horse_char ); 
    _putch ( '\xDB' );
}
///////////////////////////////////////////////////////////
 
int main ( )
{
  //setlocale (LC_ALL, "russian");
  float length;
  int total;
 
  cout << "\nVvedite dlinnu distancii (ot 1 do 12): ";
  cin >> length;
  //length = 5;
  cout << "\nVvesite kolichestvo loshadei (ot 1 do 7): ";
  cin >> total;
  //total = 3;
  comtrack theTrack ( length, total );
  theTrack.comrun ( );
 
  system("Pause");
  return 0;
}

Задание 11.10
Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
struct link   // один элемент списка
{
  int data;   // некоторые данные
  link* next; // указатель на следующую структуру
};
///////////////////////////////////////////////////////////
class linklist // список
{
  private:
    link* first;
  public:
    linklist ( )            // конструктор без параметров
      { first = NULL; }     // первого элемента пока нет
    ~linklist();
    void additem ( int d ); // добавление элемента
    void display ( );       // показ данных
    void operator = (linklist& ); //оператор присваивания
    linklist(linklist&);          //оператор копирования
};
///////////////////////////////////////////////////////////
void linklist::additem ( int d ) // добавление элемента
{
  link* newlink = new link;      // выделяем память
  newlink->data = d;             // запоминаем данные
  newlink->next = first;         // запоминаем значение first
  first = newlink;               // first теперь указывает на новый элемент
}
///////////////////////////////////////////////////////////
void linklist::display ( )
{
  link* current = first;           // начинаем с первого элемента
  while( current )                 // пока есть данные
  {
    cout << current->data << endl; // печатаем данные
    current = current->next;       // двигаемся к следующему элементу
  }
}
///////////////////////////////////////////////////////////
linklist::~linklist()
    {
        link*current =first;   //установить указатель на первый элемент
        while(current !=NULL ) //выход по достижении последнего элемента
        {
            link*temp =current;  //сохранить указатель на данный элемент
            current =current->next;  //получить ссылку на следующую ссылку
            cout<<"Удаляем"<<endl;
            delete temp;               //удалить эту ссылку
      }
    }
///////////////////////////////////////////////////////////
void linklist::operator = (linklist& l1) //оператор присваивания
{
    link*current =l1.first;   //установить указатель на первый элемент
    while(current !=NULL ) //выход по достижении последнего элемента
        {
            link* newlink = new link;
            newlink->data = current->data;  //сохранить указатель на данный элемент
            newlink->next =first;
            first = newlink;
            current =current->next;  //получить ссылку на следующую ссылку
        }
    cout<<"Оператор присваивания.";
}
///////////////////////////////////////////////////////////
linklist::linklist(linklist& l1)
{
    first = NULL;
    link*current =l1.first;   //установить указатель на первый элемент
    while(current !=NULL ) //выход по достижении последнего элемента
        {
            link* newlink = new link;
            newlink->data = current->data;  //сохранить указатель на данный элемент
            newlink->next =first;
            first = newlink;
            current =current->next;  //получить ссылку на следующую ссылку
        }
      cout<<"Оператор копирования.";
}
 
///////////////////////////////////////////////////////////
int main ( )
{
  setlocale (LC_ALL, "russian");
  linklist* li = new linklist;       // создаем переменную-список
  linklist* list2 = new linklist;
 
  li->additem ( 25 ); // добавляем туда несколько чисел
  li->additem ( 36 );
  li->additem ( 49 );
  li->additem ( 64 );
 
  *list2 = *li; 
  linklist list3 (*li) ;                      // для указателей операторы не перегрузишь, с шаблонами или без них... 
                      // в общем, указатели так и так разыменовывать, 
                      //а для класса можно перегрузить почти любые операторы. 
  delete  li;     
  //li->display ( );    // показываем список
  list2->display ( );    // показываем список
  list3.display ( );    // показываем список
  cout<<"Завершение программы.";
  system("pause");
  return 0;
}

Задание 11.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
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
198
199
200
201
202
203
204
205
206
207
208
209
210
// parse.cpp
#include <iostream>
#include <cstring>                   //for strlen(), etc
#include <stdlib.h> 
#include <math.h> 
using namespace std;
const int LEN = 80;    //length of expressions, in characters
const int MAX = 40;    //size of stack
////////////////////////////////////////////////////////////////
  class Token                      // Абстрактный базовый класс
    {
    public:
      virtual void showOperNumber()=0; // чистая виртуальная
      virtual char getOperator()=0;             // функция
      virtual float getNumber()=0; 
 
      
    };
////////////////////////////////////////////////////////////////
  class Operator : public Token
    {
    private:
      char oper;             // Операторы +, –, *, /
    public:
      Operator(char c): oper(c)      // конструктор устанавливает значение
        {}
      void showOperNumber()    // получить значение
        {cout<<oper<<endl; }
      virtual float getNumber()
        { return 0.f; }
      char getOperator()
        {return oper;}
     
    };
////////////////////////////////////////////////////////////////
  class Number : public Token
    {
    private:
      float fnum;            // число
    public:
      Number(float f): fnum(f)         // конструктор устанавливает значение
         {}
      void showOperNumber()     // получить значение
        {cout<<fnum<<endl;}
      float getNumber()
        {return fnum;}
      virtual char getOperator()
        { return 0.f; }
    };
////////////////////////////////////////////////////////////////////
class Stack
   {
   private:
      Token* atoken[100];    //содержит типы Operator* и Number*                  
      int top;                       //number of top of stack
   public:
      Stack()                        //constructor
         { top = 0; }
      void push(Token* var)            //put char on stack
         { atoken[++top] = var; }
      Token* pop()                     //take char off stack
         { return atoken[top--]; }
      int gettop()                   //get top of stack
         { return top; }
   };
////////////////////////////////////////////////////////////////
class express
{
    private:
        Stack s;
        char* pStr;
        int len;
    public:
        express (char* ptr)
        {
            pStr=ptr;
            len =strlen(pStr);
        }
        void parse ();     // разбор выражения
        float solve ();      // получение результата
        double round (double);
};
//--------------------------------------------------------------------
double express::round (double n)
    {
        double fractpart, intpart;
        fractpart = modf(n, &intpart);
        if (fractpart<0.5)
            n = intpart;
        else n = intpart+1;
        return n;
            
 
    }
//--------------------------------------------------------------
void express::parse()
{
    char chifra [LEN];    //символы из строки
    float lastval;        // последнее значение
    char lastop;          // последний оператор
    Number* ptrN;
    Operator* ptrO;
    float n;
    char Ch;  
    int j=0;
     
 
    for(j; j<len; j++)          //для всех символов в строке
    {
        if (pStr[j]>='0' && pStr[j]<='9' || pStr[j]==',')
        {
            int i=0;
            while (pStr[j]>='0' && pStr[j]<='9' || pStr[j]==',')  // получаем число 
            {
                chifra [i]=pStr[j];
                j++; i++;
            }
            j--;
            chifra [i]='\0';
            n = round(atof(chifra));
            ptrN = new Number(n);
            s.push(ptrN);                                       // заносим  в стек
        }
        else if(pStr[j]=='+' || pStr[j]=='-' || pStr[j]=='*' || pStr[j]=='/')
        {
            Ch = pStr[j];
            if (s.gettop()==1)                                    // если это первый оператор, то помещаем в стек
            {
                ptrO = new Operator(Ch);
                s.push(ptrO);   
            }
            else
            {
                lastval=s.pop()->getNumber();                //получение предыдущего числа
                lastop=s.pop()->getOperator();              //получение предыдущего оператора
                // если это * или / , а предыдущий был + или -, то
                if( (pStr[j]=='*' || pStr[j]=='/') && (lastop=='+' || lastop=='-') )
                {
                    ptrO = new Operator(lastop);   //отменяем последние два взятия из стека
                    s.push(ptrO);   
                    ptrN = new Number(lastval);
                    s.push(ptrN);   
               }
               else                     //помещаем в стек текущий оператор 
               {
               switch(lastop)        
                  {                  
                  case '+': ptrN = new Number(s.pop()->getNumber() + lastval); s.push(ptrN); break;
                  case '-': ptrN = new Number(s.pop()->getNumber() - lastval); s.push(ptrN); break;
                  case '*': ptrN = new Number(s.pop()->getNumber() * lastval); s.push(ptrN); break;
                  case '/': ptrN = new Number(s.pop()->getNumber() / lastval); s.push(ptrN); break;
                  default:  cout << "\nUnknown oper"; exit(1);
                  }  
               }  
            ptrO = new Operator(pStr[j]);
            s.push(ptrO);              //помещаем в стек текущий оператор 
            }  
         }  
   
      else                           //что-то левое
         { cout << "\nUnknown input character"; exit(1); }
   }
}
//-------------------------------------------------------------
float express::solve ()  //убираем данные из стека
{
    float lastval;              
    while(s.gettop() > 1)
      {
      lastval = s.pop()->getNumber();               //предыдущее значение 
      Number* ptrN;
      switch( s.pop()->getOperator() )              //получение предыдущего оператора
         {                           //do operation, push answer
         case '+': ptrN = new Number(s.pop()->getNumber() + lastval); s.push(ptrN); break;
         case '-': ptrN = new Number(s.pop()->getNumber() - lastval); s.push(ptrN); break;
         case '*': ptrN = new Number(s.pop()->getNumber() * lastval); s.push(ptrN); break;
         case '/': ptrN = new Number(s.pop()->getNumber() / lastval); s.push(ptrN); break;
         default:  cout << "\nUnknown operator"; exit(1);
         }  
      }  
   return float (s.pop()->getNumber());//последний оператор в стеке это результат
}
////////////////////////////////////////////////////////////////
 
int main()
   {
   setlocale (LC_ALL, "russian");
   char ans;            // 'д' или 'н'
   //char stroka [LEN]="12,05+13,05+14,05*2";                          //char from input string
   char stroka [LEN];
   cout << "\nВведите арифметическое выражение в виде 2+3*4/3-2"
          "\nЧисла должны быть из одной цифры"
          "\nНе используйте пробелы и скобки";
 
   do
   {
       cout << "\nВыражение: ";
       cin >> stroka;                          // вводим строку
       express* eptr = new express (stroka);
       eptr->parse();
       cout <<"\nРезультат: "
           << eptr->solve();
       delete eptr;
       cout << "Еще одно выражение (y/n)? ";
    cin >> ans;
   }
   while ( ans == 'y' );
   system("pause");
   return 0;
   }
1
MA4ETE44
11 / 1 / 1
Регистрация: 06.08.2012
Сообщений: 17
15.10.2013, 12:13 #90
парни, а решения к 3 главе есть? идет 2ая потом сразу 4ая, или я чего то не увидел
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2013, 12:13
Привет! Вот еще темы с ответами:

Объектно ориентированное программирование - C++
Нужно решить задачи. Помогите кому это не сложно, очень нужно. Вот задачи: 1) Создание и редактирование классов. Нужно создать класс...

Объектно-ориентированное программирование - C++
Составить описание класса одномерных массивов строк, каждая строка которых задается длиной и указателем на выделенную для нее память....

Объектно-ориентированное программирование - C++
На основе объектного подхода создать программу которая рассчитывает значения степенных функций y=sqr(x), корень 3, 4, 5 степеней. В...

Объектно ориентированное программирование. - C++
Нужно решить задачи. Помогите кому это не сложно, очень нужно. Вот задачи: 1) Создание и редактирование классов. Нужно создать класс...


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

Или воспользуйтесь поиском по форуму:
90
Yandex
Объявления
15.10.2013, 12:13
Ответ Создать тему
Опции темы

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