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

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

Войти
Регистрация
Восстановить пароль
 
Rusl_v
13 / 12 / 1
Регистрация: 22.12.2010
Сообщений: 67
#1

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

05.01.2011, 20:45. Просмотров 642. Ответов 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
//******Начало******
#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++
)Значение литерала 7.0Е-3 2)Логическая ошибка (ошибка реализации алгоритма) Выберите по крайней мере один ответ: пропуск ; ...

Вопросы от новичка по C++ - C++
1)В С++ можно делить с остатком только вещественные числа? К примеру: int a,b; float c; Если 5 поделить на 4 ,то получим 1 без...

Вопросы от новичка. - C++
Всем доброго времени суток, уважаемые форумчане. Мне 12 лет. Собираюсь серьезно изучать C++. Пока работала в средах LogoWriter (понятие...

ВОПРОС НОВИЧКА - C++
Просьба скорректировать мой мозг... Visual c++ и просто с++ это же разные языки? и если да, то как в visual studio мне программировать на...

Вопрос новичка - C++
Вот есть у меня исходики программы. как мне текст преобразовать в формы, т.е. без компилирования уже в прогамму. у меня borland c++ angl

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Devioso
4 / 4 / 1
Регистрация: 13.12.2009
Сообщений: 60
05.01.2011, 21:37     Проверьте решение новичка:) #2
Как мне кажется, в коде есть лишние сточки кода, которые можно убрать.
Escapable
54 / 54 / 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
216 / 129 / 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
13 / 12 / 1
Регистрация: 22.12.2010
Сообщений: 67
05.01.2011, 21:56  [ТС]     Проверьте решение новичка:) #5
Спасибо за ответ.
Да, за библиотеки я в курсе, просто это тренировочный файл,я иногда там использую функции,рандом, и т.д.
Что то понял конечно,а что то нет,я ещё до размеров не дошёл и некоторые инструкции мне непонятны.
Спасибо за ответ,по поже вернусь к нему.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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
54 / 54 / 1
Регистрация: 09.11.2010
Сообщений: 120
05.01.2011, 22:12     Проверьте решение новичка:) #7
x1Mike7x, по ссылке, ответ же вроде неверный. В массиве же две точки, а в ответе одна. Попробовал применить ваш измененный код для ввода значений с клавиатуры, так вот там я встречаюсь с бесконечным циклом.


Rusl_v, ваш первый вариант верный, просто вводите не больше одного символа =)
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
05.01.2011, 22:16     Проверьте решение новичка:) #8
Цитата Сообщение от Escapable Посмотреть сообщение
Rusl_v, ваш первый вариант верный, просто вводите не больше одного символа =)
Я привел вариант, в котором можно вводить хоть один, хоть 100 символов, и программа будет работать правильно
Escapable
54 / 54 / 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
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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
216 / 129 / 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     Проверьте решение новичка:)
Еще ссылки по теме:

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

Книги по c++ для новичка - C++
Подскажите книги по c++ для новичка Знаний в програмировании нет

Учебник для новичка по с++? - C++
Извините возможно за очередную тему с этим вопросом... но я не как не могу найти в нете книгу для меня... везде идет разговор совершенно не...

Отличия в C++11 для новичка - C++
Недавно увидел что в 2011 был принят какой-то новый стандарт языка програмирования C++(C++11).Я сам сейчас изучаю этот язык по &quot;C++ Вводный...

STL для новичка! - C++
Здравствуйте! подскажите пожалуйста мне, дураку(только начал изучать STL) ответ на такой вопрос! что нужно подставить в 19 строку? ...


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

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


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

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