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

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

Войти
Регистрация
Восстановить пароль
 
Jack Wade
62 / 35 / 6
Регистрация: 24.02.2013
Сообщений: 250
#1

Создать метод для класса, который бы вводил через консоль строку - C++

19.03.2014, 16:33. Просмотров 302. Ответов 11
Метки нет (Все метки)

Здравствуйте!
В задании мне нужно создать метод для класса, который бы вводил через консоль строку, а второй метод-выводил её, но только чтобы выводил все слова в обратном порядке.
Как бы-задание простое...
Вот только здесь у меня возникла проблемка...
Я вывожу слова в обратном порядке таким образом, чтобы была проверка на наличие пробела, либо дошли ли мы до начала строки и в тоже время, циклическая переменная равна ли нулю, или нет.
Проблема заключается в том, что когда я ранее вводил просто 2 слова(Hello World!), мне выводило весь массив символов(не строку, даже не смотря на ограничения(ставил ограничения до тех пор, пока не был обнаружен пробел, либо не дошли по индексу до края строки):
C
1
2
3
4
//---
for (int j=i; temp[j]!=' ' || j<strlen(temp); j++)//Вот цикл, который при обнаружении пробела запускает простое отображение слова. Как видно-цикл идёт либо до встречи пробела, либо до тех пор, пока не дошли до края строки... Проблема в том, что даже при всех условиях(последний символ пробел)-этот цикл всё равно отображает все 256 символов...
//---
for (int j=i; temp[j]!=' '; j++)//А вот при таком цикле-если не поставить в конец строки пробел-то опять же, 256 символов будут на экране... А если поставить программным способом пробел в конец строки-строка расширяется, даже если после пробела поставить NULL... И, получается, надо было вводить пробел пользователю вручную, но это всё, мягко говоря...
В итоге-решил делать отдельно в цикле отображения слова проверку на выход за пределы строки:
C
1
if (j >= strlen(temp) break;//Но это, если можно так сказать, является "программным костылём"...
Мне бы, всё таки хотелось, чтобы проверка на выход за пределы строки шла именно в цикле, как дополнительное условие завершение цикла... А не проверять отдельно, и break'ать цикл...

Подскажите пожалуйста-где ошибка?

Вот код программы:

Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
 
class cl1
{
private: char temp[256];
public:
    void ReadLine()
    {
        printf("Enter string:\n");
        gets(temp);
    }
    void WriteLine()
    {
        for (int i=(strlen(temp)-1); i>=0; i--)
        {
            if ((temp[i-1]==' ' && i>0) || (temp[i]!=' ' && i == 0))
            {
                for (int j=i; temp[j]!=' '; j++)
                {
                    if (j< strlen(temp)) printf("%c", temp[j]);
                    else break;
                }
                printf(" ");
            }
        }
    }
public: cl1()
        {
            printf("Example 1\n");
        }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    cl1 Data1;
    Data1.ReadLine();
    Data1.WriteLine();
    _gettch();
    return 0;
}
P.S. Среда разработки Microsoft Visual Studio 2012
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2014, 16:33     Создать метод для класса, который бы вводил через консоль строку
Посмотрите здесь:

Как создать класс, который содержит элементы другого класса C++
Перегрузка оператора вывода на консоль для шаблонного класса C++
C++ создать метод доступа к функциям класса-наследника
Считать строку в массив символов, который является членом класса C++
Как передать функции через метод класса C++
C++ Написать метод, чтобы получить ссылку на строку - поле класса
C++ Не работает вывод двумерного массива через метод класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lpvoid
 Аватар для lpvoid
320 / 303 / 17
Регистрация: 06.03.2013
Сообщений: 869
19.03.2014, 16:43     Создать метод для класса, который бы вводил через консоль строку #2
C++
1
for (int j=i; temp[j]!=' ', j < strlen(temp); j++)
работать будет. в код не вчитывался.
Jack Wade
62 / 35 / 6
Регистрация: 24.02.2013
Сообщений: 250
19.03.2014, 16:47  [ТС]     Создать метод для класса, который бы вводил через консоль строку #3
lpvoid, да, работает, вот только есть одно но:
Теперь, из 2-х слов отображаются 3:
Последнее слово, и вся строка(если брать в пример Hello World!):
World! Hello World! - вот, что получается при использовании этого кода.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6348 / 2995 / 295
Регистрация: 04.12.2011
Сообщений: 8,033
Записей в блоге: 3
19.03.2014, 18:09     Создать метод для класса, который бы вводил через консоль строку #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include<string>
#include<vector>
 
using namespace std;
 
class Input_String{
vector<string> vec_str;
public:
void input(){
vec_str.clear();
string tmp_str;
cout << "Enter few words. The end of input is Enter and then Ctrl+Z keys combination."<<endl;
while( cin >> tmp_str ) vec_str.push_back(tmp_str);
}
 
void output(){
vector<string>::reverse_iterator it = vec_str.rbegin();
for( ; it !=  vec_str.rend(); it++) cout << *it<<" ";
}
};
 
int main()
{
Input_String obj;
obj.input();
obj.output();
cout<<endl;
system ( "pause" );
    return 0;
}
DrOffset
6818 / 4029 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
19.03.2014, 18:09     Создать метод для класса, который бы вводил через консоль строку #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от lpvoid Посмотреть сообщение
C++
1
for (int j=i; temp[j]!=' ', j < strlen(temp); j++)
Оператор запятая? Вообще-то первое условие будет всегда игнорироваться. Может быть тут лучше подойдет И?
Как-то так:
C++
1
for (int j=i; temp[j] != 0 && temp[j] != ' '; j++)
заменил проверку, чтобы не вызывать совсем не бесплатный strlen на каждой итерации цикла.
Jack Wade
62 / 35 / 6
Регистрация: 24.02.2013
Сообщений: 250
19.03.2014, 18:12  [ТС]     Создать метод для класса, который бы вводил через консоль строку #6
DrOffset, большое спасибо! Программа заработала нормально...
Вот только не пойму-почему условие ИЛИ не сработало?
Ведь-при условии ИЛИ должно проверятся 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
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
 
class cl1
{
    private: char temp[256];
    public:
            void ReadLine()
            {
                printf("Enter string:\n");
                gets(temp);
            }
            void WriteLine()
            {
                for (int i=(strlen(temp)-1); i>=0; i--)
                {
                    if ((temp[i-1]==' ' && i>0) || (temp[i]!=' ' && i == 0))
                    {
                        for (int j=i; (temp[j]!=' ' && j<strlen(temp)); j++)
                        {
                            printf("%c", temp[j]);
                        }
                        if (i-1 > 0) printf(" ");
                    }
                }
            }
    public: cl1()
            {
                printf("Example 1\n");
            }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    cl1 Data1;
    Data1.ReadLine();
    Data1.WriteLine();
    _gettch();
    return 0;
}

P.S. И да-IGPIGP, мне нужен был код именно на C, а не на C++...
DrOffset
6818 / 4029 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
19.03.2014, 18:23     Создать метод для класса, который бы вводил через консоль строку #7
Цитата Сообщение от Jack Wade Посмотреть сообщение
Вот только не пойму-почему условие ИЛИ не сработало?
Потому что оно тут не нужно Логически не нужно. Тебе надо продолжать цикл когда у тебя (НЕ КОНЕЦ СТРОКИ) И (НЕ ПРОБЕЛ). Потому ИЛИ и не подходит

Добавлено через 1 минуту
Jack Wade,
Убери ради бога strlen из условия. Это же жутко Зачем его считать на каждой итерации, длина строки же не меняется.

Добавлено через 7 минут
Цитата Сообщение от Jack Wade Посмотреть сообщение
Ведь-при условии ИЛИ должно проверятся 2 условия
Если первое условие в ИЛИ - истина, второе не проверяется. Или первое условие в И - ложь, второе так же не проверяется. Это всегда так для встроенных типов.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6348 / 2995 / 295
Регистрация: 04.12.2011
Сообщений: 8,033
Записей в блоге: 3
19.03.2014, 18:35     Создать метод для класса, который бы вводил через консоль строку #8
Цитата Сообщение от Jack Wade Посмотреть сообщение
P.S. И да-IGPIGP, мне нужен был код именно на C, а не на C++...
Дык:
Цитата Сообщение от Jack Wade Посмотреть сообщение
В задании мне нужно создать метод для класса, который бы вводил через консоль строку,
ну и есть же:
http://www.cyberforum.ru/c-beginners/
Jack Wade
62 / 35 / 6
Регистрация: 24.02.2013
Сообщений: 250
19.03.2014, 18:38  [ТС]     Создать метод для класса, который бы вводил через консоль строку #9
DrOffset, немного не понял, если честно...
Ну, вот допустим, у меня 2 условия завершения в цикле.
При использовании ИЛИ, 1 условие если true, второе не проверяется, однако, если 1 условие false, то не идёт проверки 2 условия что ли?
По моему-это должно быть как раз таки для И, т.к. И требует true для двух условий(если проверять не в цикле, а отдельно, для примера, сравнивая 2 переменные int типа):
Кликните здесь для просмотра всего текста

C
1
2
3
int x = 5;
int y = 10;
if (x == 5 && y == 10) printf("YES!");

Если же сделать так:
Кликните здесь для просмотра всего текста

C
1
2
3
int x = 5;
int y = 10;
if (x == 5 || y == 5) printf("YES!");

Выполнится printf уже при 1-й проверке(т.к. (x == 5) = true).
Так логически, цикл for идёт до тех пор, пока не встретил false:
C
1
for (int i=0; i<10; i++) {}//Как только i<10, выполнится true. Как только i>=10, выполнится false
И, если использовать ИЛИ, то, логически, выйдет следующее:
C
1
for (int i=0; i<100 || i%25!=0; i++) {}//Цикл идёт до тех пор, пока либо не дойдём до 100, либо не встретим первое число, остатком деления на 25 является 0(опять же, пока i<100 и нету числа, которое бы делилось на 25 без остатка-выполняется true в двух условиях. Однако-цикл должен завершится на i=25, т.е. 25 делится на 25 и остаток будет 0(логично же...). Т.е. когда будет встречено 25, в условии i%25 будет возвращено false, и, логически, цикл должен прекратится, т.к. ожидается false, либо от 1 либо от 2 условий...
Так можете мне объяснить механизм работы И в цикле, если он не такой, как при обычном сравнении?
Или, может быть, укажете, где я не прав...
DrOffset
6818 / 4029 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
19.03.2014, 18:47     Создать метод для класса, который бы вводил через консоль строку #10
Цитата Сообщение от Jack Wade Посмотреть сообщение
При использовании ИЛИ, 1 условие если true, второе не проверяется, однако, если 1 условие false, то не идёт проверки 2 условия что ли?
Наоборот, если первое условие - false, то выполняется проверка второго условия. Если и оно false, то результат выражения тоже false.
Ну вот смотри. На пальцах:
Я тебя спрашиваю, Яблоко или Апельсин? Ты говоришь - Яблоко. Апельсин уже не нужен. Смысл его давать? Мы выполнили условие. Другое дело, когда я спрашиваю Яблоки и Апельсин? Ты говоришь - Апельсин, но если Яблока нет, то значит я не могу их дать вместе, поэтому и Апельсин давать нет смысла.
Jack Wade
62 / 35 / 6
Регистрация: 24.02.2013
Сообщений: 250
19.03.2014, 18:49  [ТС]     Создать метод для класса, который бы вводил через консоль строку #11
DrOffset, понял!
Большое спасибо за пояснение!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2014, 19:30     Создать метод для класса, который бы вводил через консоль строку
Еще ссылки по теме:

C++ Многократный ввод класса через консоль
Создать класс Point, который имеет два закрытых члена класса (координаты) C++
C++ Не получается вызвать метод класса потомка через ссылку
Создать метод класса для заполнения массива случайными числами C++
Создание класса и использованием функции для выведения информации в консоль C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6818 / 4029 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
19.03.2014, 19:30     Создать метод для класса, который бы вводил через консоль строку #12
Jack Wade, пожалуйста . Вот небольшая иллюстрация в коде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <cstdio>
 
int testFunc(int a)
{
    printf("condition(%d)\n", a);
    return a;
}
 
int main()
{
    if(1 == testFunc(1) || 2 == testFunc(1))
    { }
    printf("-\n");
    if(2 == testFunc(1) || 2 == testFunc(2))
    { }
    printf("-\n");
    if(2 == testFunc(1) && 2 == testFunc(2))
    { }
    printf("-\n");
    if(1 == testFunc(1) && 2 == testFunc(2))
    { }
    printf("-\n");
}
В первом и третьем варианте только один вызов функции testFunc.
В первом варианте первое условие истинно, вычислять второе нет смысла, т.к. мы уже удовлетворили условию ИЛИ (выбрали первый вариант).
Во втором варианте первое условие ложно, вычислять второе также нет смысла, т.к. уже известно, что мы не удовлетворяем условию И.

Все это можно использовать для оптимизации сложных выражений. Первым условием ставя более легковесную проверку.
Yandex
Объявления
19.03.2014, 19:30     Создать метод для класса, который бы вводил через консоль строку
Ответ Создать тему
Опции темы

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