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

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

Войти
Регистрация
Восстановить пароль
 
 
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
#1

Вопрос о строке - C++

21.09.2010, 17:18. Просмотров 1063. Ответов 21
Метки нет (Все метки)

Добрый день!
Вводится строка и передаётся как параметр.
При использовании следующего кода:
C++
1
2
3
4
5
6
7
while(str)
    {    
        if (*str == '+')
            break;
        *(str++);
        i++;
    }
проверка будет идти от начала (т.е. указатель будет стоять в начале строки)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2010, 17:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос о строке (C++):

Вопрос по массивав, "институтский" вопрос. - C++
Готовлюсь к летней сессии по программированию. С++ Есть такая вот задачка (привожу как есть) В документации подобного не...

Найти все цифры в строке. каждую цифру напечатать в отдельной строке - C++
Помогите пожалуйста

Найти число пробелов в строке и заменить их на номер по порядку в исходной строке - C++
Задание: Во введенной пользователем строке найти число пробелов и заменить все пробелы на их номер по порядкув исходной строке. Например...

Работа с массивами. Поиск наименьшего числа в строке и наибольшего в строке - C++
Добрый вечер. Надо найти наименьшее число в строке и наибольшее в столбце. Примерно вот так должно искать. потом надо собрать новый...

В каждой строке матрицы найти и вывести минимальный элемент и его номер в строке - C++
/*Дана матрица А. В каждой строке матрицы найти и вывести минимальный элемент и его номер в строке. Вывести полученную матрицу.*/ ...

В строке заменить каждый символ «!» числом, равным индексу этого символа в строке - C++
В заданной строке заменить каждый символ «!» числом, равным индексу этого символа в строке. Сделал просто замену символа на любой ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
21.09.2010, 23:53  [ТС] #16
Странно, работает, но при вставке strcpy() getline() виснет.
Про танцы: это так сказать центровка
C++
1
2
3
4
5
6
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
 
#include "omNum.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
// lr1.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
 
 
int main(int argc, char* argv[])
{
    char str [80];
 
    cout.width(strlen("Examples of expressions:")/2 + 40);
    cout<<"Examples of expressions:"<<endl;
    cout.width(strlen("2+3i")/2 + 40);
    cout<<"2+3i"<<endl;
    cout.width(strlen("2") + 40);
    cout<<2<<endl; 
    cout.width(strlen("0i")/2 + 40);
    cout<<"0i"<<endl;
    cout.width(strlen("2-1i")/2 + 40);
    cout<<"2-1i"<<endl;
    
    cout<<"Enter the 1st expression: ";
    cin.getline(str,79);
    ComNum num_1(str);
 
    cout<<"Enter the 2d expression: ";
    cin.getline(str,79);
    ComNum num_2(str);
 
    ComNum o;
 
    o = num_1 + num_2;
    o.Show();
 
    o = num_1 - num_2;
    o.Show();
 
    o = num_1 * num_2;
    o.Show();
 
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class ComNum  
{
    double Im, Rl;
    int len;
public:
    ComNum()
    {
        Im = 0.0;
        Rl = 0.0;
    }
    ComNum(char[]);
    virtual ~ComNum() {}
    ComNum operator+(ComNum&);
    ComNum operator-(ComNum&);
    ComNum operator*(ComNum&);
    void Show();
};
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
// omNum.cpp: implementation of the ComNum class.
//
//////////////////////////////////////////////////////////////////////
 
#include "stdafx.h"
#include "omNum.h"
 
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
 
ComNum::ComNum(char str[])
{
    len = strlen(str) - 1;
    int i = 0, k = 0;
    bool flag = true;
    char *s;
    
    ////////////exceptions////////////
    try
    {
        while (isdigit(*(str+i)) || *(str+i) == 'i' || *(str+i) == '-' || *(str+i) == '+')
            i++;
        if (i != len+1 || !str)
            throw 0;
    }
    catch(int)
    {
        MessageBox(HWND_DESKTOP,"You've entered a wrong expression!","Attention!",MB_OK|MB_ICONERROR);
        exit(1);    
    }
 
    i = 0;
    while(str[i] != '\0')
    {    
        if (str[i] == '+')
            break;
        else 
            if(str[i] == '-')    
            {
                flag = false;
                break;
            }
        str[i];
        i++;
    }
 
    ///not full-fledged number///
    if((unsigned)i == strlen(str)) // number consists from either im or real part
    {
        i = 0;
        do
        {
            if (str[k] == 'i')
                break;
            *(str+k);
            i++;
        }while(str[k++] != '\0');
 
        if((unsigned)i != strlen(str)) // number consits only from im part
            Rl = 0.0; 
        else
            Im = 0.0; // number consits only from real part
    
    
        if (Rl == 0.0)
        {
             s = new char [k+1];
             if (!s)
             {
                 MessageBox(HWND_DESKTOP, "Memory allocation error!", "Warning!", MB_OK|MB_ICONERROR);
                 exit(1);
             }
 
            for (i = 0; i < k+1; i++)
                s[i] = str[i];
            if (!flag)
                Im = -atof(s);
 
            delete [] s;
        }
        else
            Rl = atof(str);
    }
    /////////////////////////////
 
 
 
    ///full-fledged number///
    k = 0;
 
    for (i = len; i >= 0; i--)
    {
        if (str[i-1] == '+' || str[i-1] == '-')
        {
            int tmp = i;
            s = new char [len-i]; // len - 1 -> 'i' - eliminated 
            if (!s)
             {
                 MessageBox(HWND_DESKTOP, "Memory allocation error!", "Warning!", MB_OK|MB_ICONERROR);
                 exit(1);
             }
            
            while (str[i] != 'i')
                s [k++] = str[i++];
            if (!flag)
                Im = -atof(s);
            else
                Im = atof(s);
            delete [] s;
 
            s = new char [tmp];
            if (!s)
             {
                 MessageBox(HWND_DESKTOP, "Memory allocation error!", "Warning!", MB_OK|MB_ICONERROR);
                 exit(1);
             }
            for (i = 0; i < tmp; i++)
                s [i] = str[i];
            Rl = atof(s);
            delete [] s;
        }
    }
    ///////////////////////// 
}
 
ComNum ComNum::operator +(ComNum& ob)
{
    ComNum tmp;
 
    tmp.Rl = Rl + ob.Rl;
    tmp.Im = Im + ob.Im;
    
    return tmp;
}
 
ComNum ComNum::operator -(ComNum& ob)
{
    ComNum tmp;
 
    tmp.Rl = Rl - ob.Rl;
    tmp.Im = Im - ob.Im;
    
    return tmp;
}
 
ComNum ComNum::operator *(ComNum& ob)
{
    ComNum tmp;
    
    tmp.Rl = Rl*ob.Rl - Im*ob.Im;
    tmp.Im = Rl*ob.Im + ob.Rl*Im;
    
    return tmp;
}
 
void ComNum::Show()
{
    cout<<"Result of chosen operation: "<<Rl<<" + "<<Im<<"i"<<endl;
}
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,602
22.09.2010, 09:29 #17
Цитата Сообщение от alexsvk Посмотреть сообщение
C++
1
2
3
4
ComNum::ComNum(char str[])
{
...
}
Вы, профессор, воля Ваша, что-то нескладное сочинили. Оно может и умно', да уж больно непонятно...
(с) М. Булгаков.
Как-то там у Вас не просто всё... Приведите пример входных данных и результатов действий с ними. Кстати, примеров классов комплексных чисел на форуме много. Вот совсем недавно было: Структур комплексных чисел
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
22.09.2010, 21:10  [ТС] #18
Цитата Сообщение от easybudda Посмотреть сообщение
(с) М. Булгаков.
Как-то там у Вас не просто всё... Приведите пример входных данных и результатов действий с ними. Кстати, примеров классов комплексных чисел на форуме много. Вот совсем недавно было: Структур комплексных чисел
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
int main(int argc, char* argv[])
{
    char str [80];
    char s [80];
    unsigned int action;
    int ch = 0;
    ComNum o;
 
    cout.width(strlen("Examples of the expressions:")/2 + 40);
    cout<<"Examples of expressions:"<<endl;
    cout.width(strlen("2+3i")/2 + 40);
    cout<<"2+3i"<<endl;
    cout.width(strlen("2") + 40);
    cout<<2<<endl; 
    cout.width(strlen("0i")/2 + 40);
    cout<<"0i"<<endl;
    cout.width(strlen("2-1i")/2 + 40);
    cout<<"2-1i"<<endl;
    
    cout<<"Enter the 1st expression: ";
    cin.getline(str,79);
    ComNum num_1(str);
    
    strcpy(s,str);
 
    cout<<"Enter the 2d expression: ";
    cin.getline(str,79);
    ComNum num_2(str);
 
    while(!ch)
    {
        system("cls");
        cout<<"\nOperations:\n";
        cout<<"Summing up - 1\n";
        cout<<"Distracting - 2\n";
        cout<<"Multiplying - 3\n: ";
        cin>>action;
 
        switch(action)
        {
        case 1:
            cout<<"First expression: "<<s<<endl<<"Second expression: "<<str<<endl;
            o = num_1 + num_2;
            o.Show();         
            ch = 1;
            break;
        case 2:
            cout<<"First expression: "<<s<<endl<<"Second expression: "<<str<<endl;
            o = num_1 - num_2;
            o.Show();
            ch = 1;
            break;
        case 3:
            cout<<"First expression: "<<s<<endl<<"Second expression: "<<str<<endl;
            o = num_1 * num_2;
            o.Show();
            ch = 1;
            break;
 
        default:
            MessageBox(NULL,"Enter 1, 2 or 3!","Attention!",MB_OK|MB_ICONINFORMATION);
            break;
        }
        
        cout<<"2 - continue, any key - exit\n";
        cin>>ch;
        if (ch != 2)
            exit(1);
        else
            ch = 0;
    }
 
    return 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
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
ComNum::ComNum(char str[])
{
    len = strlen(str) - 1;
    int i = 0, k = 0;
    bool flag = true;
    char *s;
    
    ////////////exceptions////////////
    try
    {
        while (isdigit(*(str+i)) || *(str+i) == 'i' || *(str+i) == '-' || *(str+i) == '+')
            i++;
        if (i != len+1 || !str)
            throw 0;
    }
    catch(int)
    {
        MessageBox(HWND_DESKTOP,"You've entered a wrong expression!","Attention!",MB_OK|MB_ICONERROR);
        exit(1);    
    }
 
    i = 0;
    while(str[i] != '\0')
    {    
        if (str[i] == '+')
            break;
        else 
            if(str[i] == '-')    
            {
                flag = false;
                break;
            }
        str[i];
        i++;
    }
 
    ///not full-fledged number///
    if((unsigned)i == strlen(str)) // number consists from either im or real part
    {
        i = 0;
        do
        {
            if (str[k] == 'i')
                break;
            i++;
        }while(str[k++] != '\0');
 
        if((unsigned)--i != strlen(str)) // number consits only from im part
            Rl = 0.0; 
        else
            Im = 0.0; // number consits only from real part
    
    
        if (Rl == 0.0)
        {
             s = new char [k+1];
             if (!s)
             {
                 MessageBox(HWND_DESKTOP, "Memory allocation error!", "Warning!", MB_OK|MB_ICONERROR);
                 exit(1);
             }
 
            for (i = 0; i < k+1; i++)
                s[i] = str[i];
            if (!flag)
                Im = -atof(s);
            else 
                Im = atof(s);
 
            delete [] s;
        }
        else
            Rl = atof(str);
    }
    /////////////////////////////
 
 
 
    ///full-fledged number///
    k = 0;
 
    for (i = len; i >= 0; i--)
    {
        if (str[i-1] == '+' || str[i-1] == '-')
        {
            int tmp = i;
            s = new char [len-i]; // len - 1 -> 'i' - eliminated 
            if (!s)
             {
                 MessageBox(HWND_DESKTOP, "Memory allocation error!", "Warning!", MB_OK|MB_ICONERROR);
                 exit(1);
             }
            
            while (str[i] != 'i')
                s [k++] = str[i++];
            if (!flag)
                Im = -atof(s);
            else
                Im = atof(s);
            delete [] s;
 
            s = new char [tmp];
            if (!s)
             {
                 MessageBox(HWND_DESKTOP, "Memory allocation error!", "Warning!", MB_OK|MB_ICONERROR);
                 exit(1);
             }
            for (i = 0; i < tmp; i++)
                s [i] = str[i];
            Rl = atof(s);
            delete [] s;
        }
    }
    ///////////////////////// 
}
 
ComNum ComNum::operator +(ComNum& ob)
{
    ComNum tmp;
 
    tmp.Rl = Rl + ob.Rl;
    tmp.Im = Im + ob.Im;
    
    return tmp;
}
 
ComNum ComNum::operator -(ComNum& ob)
{
    ComNum tmp;
 
    tmp.Rl = Rl - ob.Rl;
    tmp.Im = Im - ob.Im;
    
    return tmp;
}
Вопрос о строке

Вопрос о строке

Прочитал указанную в ссылке тему. Да, всё отлично, но в этой программе пользователь может вводить ,так сказать, "сразу". Думаю, что это более изысканный вариант ввода комплексного числа. Согласен, код не можно, а нужно упростить
Но всё же, всё работает, кроме одной маленькой "заразы". В main() есть следующий фрагмент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
       
.........
 default:
            MessageBox(NULL,"Enter 1, 2 or 3!","Attention!",MB_OK|MB_ICONINFORMATION);
            break;
        }
        
        cout<<"2 - continue, any key - exit\n";
        cin>>ch;
        if (ch != 2)
            exit(1);
        else
            ch = 0;
    }
 
    return 0;
После работы "default" выводится строка "2 - continue, any key - exit", но пропускаются операторы, следующие после неё. Как этого избежать? p.s. пробовал cout<<flush;
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,602
22.09.2010, 21:54 #19
Цитата Сообщение от alexsvk Посмотреть сообщение
но пропускаются операторы, следующие после неё. Как этого избежать? p.s. пробовал cout<<flush;
неправильно пробовали.
C++
1
2
3
4
5
...
cout << "2 - continue, any key - exit\n";
cin.ignore(1024, '\n');
cin >> ch;
...
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
23.09.2010, 00:16  [ТС] #20
Цитата Сообщение от easybudda Посмотреть сообщение
неправильно пробовали.
C++
1
2
3
4
5
...
cout << "2 - continue, any key - exit\n";
cin.ignore(1024, '\n');
cin >> ch;
...
Почему 1024 раза пропустить Enter?
Да, и ещё, вставил эту инструкцию, но после вывода MessageBox() - выход.
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,602
23.09.2010, 01:51 #21
Цитата Сообщение от alexsvk Посмотреть сообщение
Почему 1024 раза пропустить Enter?
Ну а в руководстве-то что пишут? На самом деле было бы правильнее
C++
1
2
3
4
5
#include <iostream>
#include <limits>
...
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
...
Цитата Сообщение от alexsvk Посмотреть сообщение
Да, и ещё, вставил эту инструкцию, но после вывода MessageBox() - выход.
опять что-то не так делаете...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <limits>
#include <windows.h>
 
int main(){
    int val;
    char ch;
    std::cout << "Enter first number: ";
    std::cin >> val;
 
    MessageBoxA(NULL, "Enter some letter", "AHTUNG!", MB_OK);
    std::cout << "> ";
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cin >> ch;
    std::cout << "Number is " << val << "\tLetter is " << ch << std::endl;
 
    return 0;
}
Вопрос о строке
Название: ahtung.png
Просмотров: 31

Размер: 2.6 Кб
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
23.09.2010, 13:59  [ТС] #22
C++
1
2
3
4
5
6
7
8
    cout<<"2 - continue, any key - exit\n";
        cin.ignore(1024, '\n');
        cin>>ch;
        if (ch != 2)
            exit(1);
        else
            ch = 0;
    }
Всё, как Вы сказали. Но после нажатия OK в сообщении программа идёт на выход без ввода ch
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2010, 13:59
Привет! Вот еще темы с ответами:

В заданной строке определить количество слов (в строке может содержаться несколько пробелов подряд). - C++
В заданной строке определить количество слов (в строке может содержаться несколько пробелов подряд).

Поменять местами наибольший элемент в первой строке матрицы с наименьшим элементом в третьей строке - C++
В двумерном массив заменить местами наибольший элемент в первой строчке с наименьшим элементом в третьем

Дан двумерный массив. найти количество элементов в каждой строке, меньших диагонального в этой строке - C++
1.Сформировать квадратную матрицу 000001 000020 000300 0n-10000 n00000 2.Дан двумерный массив. найти количество элементов в...

Написать програму которая заменяет все Enter и Tab в строке str1 на сымволи '\n' и '\t' в строке str2. - C++
а если не сложно то можно функцию


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

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

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