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

Проверьте решение новичка:) - C++

Восстановить пароль Регистрация
 
Rusl_v
 Аватар для Rusl_v
13 / 12 / 1
Регистрация: 22.12.2010
Сообщений: 67
05.01.2011, 20:45     Проверьте решение новичка:) #1
Напишите программу,которая считывает с клавиатуры символы до тех пор,пока не будет введен символ $.Организуйте в программе подсчёт количества введённых точек.Результаты подсчёта должны выводиться по окончании выполнения программы.

Доброго времени суток уважаемые!
Долго думал как подсчитать точки,не получалось,хотел уже создавать тему "помогите",но решил чуток побороться и вот результат:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//******Начало******
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <cmath>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{   
    char x;
    int y=0;
    do {
    cout<<"Vvedite simvol:";
    cin>>x;
    if (x=='.'){
        y++;
    }
    }
    while (x!='$');
    cout<<"Kolichestvo vvedenix tochek="<<y<<"\n";
    system("pause");
    return 0;
}
//******Конец******
Хорошим тоном написан код или слишком замудрил?.И ещё вопрос,когда я ввожу не один символ а к примеру 2 и более,выводиться 2 и более строки Vvedite simvol,как решить эту проблему,как сделать так чтобы cin считывал первый символ а остальные игнорил или как нибудь другим методом.
P.S.Пожалуйста подсказки на Си++ выкладывайте,чтоб я не запутался.Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2011, 20:45     Проверьте решение новичка:)
Посмотрите здесь:

проверьте решение C++
C++ вопросы новичка
Вопрос новичка C++
C++ Вопросы от новичка по C++
C++ Вопросы от новичка.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Devioso
4 / 4 / 1
Регистрация: 13.12.2009
Сообщений: 60
05.01.2011, 21:37     Проверьте решение новичка:) #2
Как мне кажется, в коде есть лишние сточки кода, которые можно убрать.
Escapable
53 / 53 / 1
Регистрация: 09.11.2010
Сообщений: 120
05.01.2011, 21:39     Проверьте решение новичка:) #3
Rusl_v, это происходит из-за того, что объявленная переменная "x" не имеет размера, т.е. отсутствуют квадратные скобки после "x"
C++
1
char x[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()
{
    char x[10];
    int y = 0;
 
    do {
        cout<<"Type a num:";
        cin>>x;
        if (x == '.') y++;
    } while (x!='$');
 
    cout<<"Sign '.' was typed = "<<y<< " times." << "\n";
 
return 0;
}
то она работать вовсе не будет. А если так
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()
{
        char x[10];
        int y = 0;
 
        do {
                cout<<"Type a num:";
                cin>>x;
                if (x == ".") y++; //  заметь, что вместо одинарных ковычек(' '), 
        } while (x!="$");          // прописаны двойные(" ")
 
        cout<<"Sign '.' was typed = "<<y<< " times." << "\n";
 
return 0;
}
то она войдет в бесконечный цикл "ввода" но при этом, если вводить больше одного знака, она не будет отображать строку "Type a num: ".

Так что первый вариант, в данном случае, самый подходящий.

Мой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
int main()
{
    char x[10], wrong[] = "$", right[] = ".";
    int i = 0;
    
    do {
        cout << "Type a num: ";
        cin >> x;
        if(!strcmp(right, x)) i++;
 
    } while (strcmp(wrong, x));
 
    cout << "Sign '.' was typed " << i  << " times." << endl;
    
return 0;
}
PS Сам новичек, если я где-то не прав, прошу поправить.
PSS И да, у вас подключено слишком много ненужных библиотек.
x1Mike7x
 Аватар для x1Mike7x
214 / 127 / 6
Регистрация: 06.11.2010
Сообщений: 234
05.01.2011, 21:51     Проверьте решение новичка:) #4
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()
{
        char x[]="dfr.c$f.";
        int i = 0, y = 0;
 
        do 
        {
                if (x[i++] == '.') 
                      y++;
        } while (x[i]!='$');
 
        cout<<"Sign '.' was typed = "<<y<< " times." << "\n";
 
return 0;
}
Вот-так работает.
Ошибка не в кавычках, а в том, что не был задан элемент массива, то есть по сути x!='$' - это проверка, является ли адрес строки х равен коду символа доллара.

http://codepad.org/UkokVRjF
Rusl_v
 Аватар для Rusl_v
13 / 12 / 1
Регистрация: 22.12.2010
Сообщений: 67
05.01.2011, 21:56  [ТС]     Проверьте решение новичка:) #5
Спасибо за ответ.
Да, за библиотеки я в курсе, просто это тренировочный файл,я иногда там использую функции,рандом, и т.д.
Что то понял конечно,а что то нет,я ещё до размеров не дошёл и некоторые инструкции мне непонятны.
Спасибо за ответ,по поже вернусь к нему.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
05.01.2011, 22:09     Проверьте решение новичка:) #6
Escapable, использовать для сравнения не отдельные символы, а строки - по меньшей мере странно.
Вот так проще (и правильней), ИМХО:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main()
{
    char c;
    size_t cnt = 0;
    std::cout << "Input characters here:" << std::endl;
    while((c = std::cin.get()) != '$')
        if(c == '.')
            ++cnt;
            
    std::cout << "The number of dots: " << cnt << std::endl;
    return 0;
}
Escapable
53 / 53 / 1
Регистрация: 09.11.2010
Сообщений: 120
05.01.2011, 22:12     Проверьте решение новичка:) #7
x1Mike7x, по ссылке, ответ же вроде неверный. В массиве же две точки, а в ответе одна. Попробовал применить ваш измененный код для ввода значений с клавиатуры, так вот там я встречаюсь с бесконечным циклом.


Rusl_v, ваш первый вариант верный, просто вводите не больше одного символа =)
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
05.01.2011, 22:16     Проверьте решение новичка:) #8
Цитата Сообщение от Escapable Посмотреть сообщение
Rusl_v, ваш первый вариант верный, просто вводите не больше одного символа =)
Я привел вариант, в котором можно вводить хоть один, хоть 100 символов, и программа будет работать правильно
Escapable
53 / 53 / 1
Регистрация: 09.11.2010
Сообщений: 120
05.01.2011, 22:21     Проверьте решение новичка:) #9
Nameless One, ну как я говорил ранее, только учусь . Например для меня не знаком тип
C++
1
size_t
А эта строка
C++
1
std::cin.get()
эквивалента строке
C++
1
gets_s(); // using namespace std
??
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
05.01.2011, 22:29     Проверьте решение новичка:) #10
Цитата Сообщение от Escapable Посмотреть сообщение
Nameless One, ну как я говорил ранее, только учусь . Например для меня не знаком тип
C++
1
size_t
Это беззнаковый целый тип, обычно эквивалентный unsigned int (но необязательно)
Цитата Сообщение от Escapable
А эта строка
C++
1
std::cin.get()
эквивалента строке
C++
1
gets_s(); // using namespace std
??
А вот функцию gets_s я сам впервые вижу, скорее всего это очередная "безопасная" микрософтовская версия функции gets языка C (gets действительно не рекомендуют использовать, вместо нее лучше использовать fgets, так как gets_s скорее всего не переносима)

cin.get используется для того, чтобы вытащить из потока отдельный символ. Подробнее здесь
x1Mike7x
 Аватар для x1Mike7x
214 / 127 / 6
Регистрация: 06.11.2010
Сообщений: 234
05.01.2011, 22:30     Проверьте решение новичка:) #11
Цитата Сообщение от Escapable Посмотреть сообщение
x1Mike7x, по ссылке, ответ же вроде неверный. В массиве же две точки, а в ответе одна. Попробовал применить ваш измененный код для ввода значений с клавиатуры, так вот там я встречаюсь с бесконечным циклом.
Вторая точка находится за знаком доллара, то есть она уже не учитывается.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2011, 22:37     Проверьте решение новичка:)
Еще ссылки по теме:

Компилятор для новичка C++
ВОПРОС НОВИЧКА C++
Проверьте решение на ошибки и недочеты C++

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

Или воспользуйтесь поиском по форуму:
Escapable
53 / 53 / 1
Регистрация: 09.11.2010
Сообщений: 120
05.01.2011, 22:37     Проверьте решение новичка:) #12
Nameless One, да, вы правы, компилятор меня вежливо попросил добавить "_s" при попытке использовать "gets".


x1Mike7x, точно, не заметил. Но к сожалению это не отменяет второй проблемы.
Yandex
Объявления
05.01.2011, 22:37     Проверьте решение новичка:)
Ответ Создать тему
Опции темы

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