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

Вылавливание(или как это ещё назвать?:) буквы из строки - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Stonerider
 Аватар для Stonerider
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 17
15.03.2013, 01:56     Вылавливание(или как это ещё назвать?:) буквы из строки #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
26
27
28
29
30
31
32
33
#include <stdio.h>;
#include <conio.h>;
#include <iostream>;
#include <math.h>;
using namespace std;
int triangle(int,int,int);
main()
{float a,b,c,p,s;
int i;
      cout <<"Enter sides of triangle"<<endl;
      cin.clear();
      cin >>a>>b>>c;
      i=(a+b>c)&&(b+c>a)&&(a+c>b);
      cin.sync();
      if(i) { cout<<"Triangle exists"<<endl;
      p=(a+b+c)/2;
      s=sqrt(p*(p-a)*(p-b)*(p-c));
      cout <<"P="<<a+b+c<<endl;
      cout <<"S="<<s<<endl;
      cout <<"h(a)="<<2*s/a<<endl;
      cout <<"h(b)="<<2*s/b<<endl;
      cout <<"h(c)="<<2*s/c<<endl;
      cout <<"m(a)="<<sqrt(2*b*b+2*c*c-a*a)/2<<endl;
      cout <<"m(b)="<<sqrt(2*a*a+2*c*c-b*b)/2<<endl;
      cout <<"m(c)="<<sqrt(2*b*b+2*a*a-c*c)/2<<endl;
      cout <<"B(a)="<<(2/(b+c))*sqrt(b*c*p*(p-a))<<endl;
      cout <<"B(b)="<<(2/(a+c))*sqrt(a*c*p*(p-b))<<endl;
      cout <<"B(c)="<<(2/(a+b))*sqrt(a*b*p*(p-c))<<endl;
      }
      else cout <<"Triangle not exists"<<endl;
   getch();
   return(0);
      }
при вводе чисел, если ввести после 3-его числа букву- то всё-равно всё считает, хотя и не должно, так вот, как мне выловить последнюю букву? надеюсь, я понятно обьяснил))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 01:56     Вылавливание(или как это ещё назвать?:) буквы из строки
Посмотрите здесь:

Дан текст. Выяснить или есть он индетификатором. Индетификатор - это последовательность букв и цифр, которые начинаются с буквы. C++
Обмен опытом или как бы это сделали бы Вы!! C++
C++ Как проверить число это или нет (Dev C++)????
C++ При вводе в строку цифр буквы выдается сообщение «Это не цифра».как?
C++ Xor или что-то ещё?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.03.2013, 02:13     Вылавливание(или как это ещё назвать?:) буквы из строки #2
C++
1
2
3
4
5
6
7
8
9
cout << "Enter sides of triangle" << endl;
while (true)
{
    cin >> a >> b >> c;
    if (cin.peek() == '\n') break;
    cin.clear();
    while (cin.get() != '\n'); 
    cout <<"Enter sides of triangle"<<endl;
}
Stonerider
 Аватар для Stonerider
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 17
15.03.2013, 02:39  [ТС]     Вылавливание(или как это ещё назвать?:) буквы из строки #3
спасибо большое, но я не совсем понимаю, что делают
C++
1
(cin.peek() == '\n') ;
и
C++
1
(cin.get() != '\n')
если не сложно, не мог бы ты описать в 2-х словах?)

Добавлено через 19 минут
Блин, я так понял, тут редактировать сообщения нельзя?) ну ладно, напишу новое) я вот+- разобрался, вот только не понял, почему используем peek, если заменить его на get, то ничего не изменится?)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.03.2013, 02:45     Вылавливание(или как это ещё назвать?:) буквы из строки #4
Цитата Сообщение от Stonerider Посмотреть сообщение
(cin.peek() == '\n') ;
Смотрит следующий символ в потоке, не извлекая его.

Добавлено через 33 секунды
Цитата Сообщение от Stonerider Посмотреть сообщение
(cin.get() != '\n')
Очищает поток после ошибки.

Добавлено через 2 минуты
Цитата Сообщение от Stonerider Посмотреть сообщение
если заменить его на get, то ничего не изменится?
По идее, нет. Даже может и лучше.

Добавлено через 1 минуту
Часто это '\n', который остаётся после рабоы cin >> , дальше в коде проблемы создаёт (не в этом коде).
Stonerider
 Аватар для Stonerider
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 17
15.03.2013, 02:47  [ТС]     Вылавливание(или как это ещё назвать?:) буквы из строки #5
Спасибо ещё раз, заменил- разницы вообще никакой вот почти всё понял, только вот сам механизм проверки ещё не до конца понял... то есть он проверяет совпадает ли строка, которая была введена в cin с той, что считало?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.03.2013, 03:04     Вылавливание(или как это ещё назвать?:) буквы из строки #6
Тут не строки вводятся, а числа. cin >> ждёт ввода числа ( в данном слуыае трёх, чем то разделённых). Считывает одно число до (напрмер, пробела), второе, третье. Третье он будет считывать, пока не встретится или пробельный символ (в том числе и '\n'), или не цифра. Потом в коде проверка: что после третьего числа в потоке осталось. cin.get() извлекает это что-то. Если там '\n' (попадает в поток после нажатия Enter), то значит всё правильно и происходит выход из цикла. Если там не '\n', а, например, буква (или пробел), то сбрасывается флаг ошибки (на всякий случай, может и не быть), чтобы поток заработал, очищается поток от лишнего, и переход к новому вводу.
Stonerider
 Аватар для Stonerider
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 17
15.03.2013, 03:07  [ТС]     Вылавливание(или как это ещё назвать?:) буквы из строки #7
Что бы я без тебя делал?) ещё раз спасибо и за код, и ещё больше благодарности- за понятное объяснение! удачи и спокойной ночи)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.03.2013, 03:11     Вылавливание(или как это ещё назвать?:) буквы из строки #8
Ещё можно проверку так сделать:
C++
1
if (cin.peek() == '\n' || cin.peek() == ' ' || cin.peek() == '\t') break;
Чтобы ввод считался правильным, если за последним числом пробельный символ. Но это решает программист, что ему нужно, так и делает.
Stonerider
 Аватар для Stonerider
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 17
22.03.2013, 01:15  [ТС]     Вылавливание(или как это ещё назвать?:) буквы из строки #9
Что бы не создавать новую тему, хочу спросить здесь:
Как просмотреть, что выдаёт строка while (cin.get() != '\n'); при вводе 12r7 например? (препод дал такое задание)
насколько я понял- нужно юзать брикпоинты, но я не понимаю, что именно делать (у меня код блокс, ставлю брикпоинт на эту строку и программа всё так же работает, без никаких остановок или ещё чего-то)...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.03.2013, 03:01     Вылавливание(или как это ещё назвать?:) буквы из строки #10
Если так написать, то можно увидеть:
C++
1
while ((n = cin.get()) != '\n') cout << (char)n << endl;
Добавлено через 4 минуты
По поводу Code::Blocks - только это: Code::Blocks мульки с дебагом
Stonerider
 Аватар для Stonerider
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 17
22.03.2013, 03:17  [ТС]     Вылавливание(или как это ещё назвать?:) буквы из строки #11
alsav22, неа, ничего не происходит, программа всё так же выполняется, даже пустая строка не появляется...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2013, 18:00     Вылавливание(или как это ещё назвать?:) буквы из строки
Еще ссылки по теме:

Можно ли это назвать пузырьковой сортировкой? C++
почему чтобы корректно отображались русские буквы в консоли, мало изменить кодировку, а надо ещё и шрифт менять? C++
C++ Простые числа, или как это работает?

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.03.2013, 18:00     Вылавливание(или как это ещё назвать?:) буквы из строки #12
Цитата Сообщение от Stonerider Посмотреть сообщение
alsav22, неа, ничего не происходит, программа всё так же выполняется, даже пустая строка не появляется...
Это про Code::Blocks или про что?
Yandex
Объявления
22.03.2013, 18:00     Вылавливание(или как это ещё назвать?:) буквы из строки
Ответ Создать тему
Опции темы

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