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

Найти в символьном массиве трёхзначные числа - C++

Восстановить пароль Регистрация
 
Монтгомери
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 112
15.06.2014, 17:32     Найти в символьном массиве трёхзначные числа #1
Дали задание на практике.
В нём надо прочесть из файла символьный массив и найти количество трёхзначных чисел в нём. Если количество нечётно - вывести на экран массив в обратном порядке.
И в этом нахождении трёхзначных чисел основная проблема: я даже не представляю, как это делать. Нам такое не читали, а задание дали.

Кто-нибудь, хоть подайте идею, как это сделать.

Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2014, 17:32     Найти в символьном массиве трёхзначные числа
Посмотрите здесь:

Сосчитать кол-во строк в символьном массиве C++
C++ Найти все трёхзначные числа
Найти все трёхзначные числа C++
C++ Найти количество слов в символьном массиве
C++ Проверка строк в двухмерном символьном массиве
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bend3r
 Аватар для Bend3r
142 / 129 / 17
Регистрация: 29.07.2012
Сообщений: 681
15.06.2014, 17:38     Найти в символьном массиве трёхзначные числа #2
Строка в файле: ыва афы а 214 павыф п 234 аы875аф

Действие 1: Разбейте строку на слова
Действие 2: Создайте процедуру проверки каждого слова, в C++ есть такие функции как isDigit.
Действие 3: Далее уже нужные вам условия(подсчет, и т.п)
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
15.06.2014, 17:39     Найти в символьном массиве трёхзначные числа #3
Монтгомери, вот метод, которой проверяет является ли число трехзначным
C++
1
2
3
4
5
6
7
8
9
bool check_number(int number)
{
    size_t count(0);
    while(number!=0){
        number/=10;
        count++;
    }
    return count == 3;
}
но перед этим разбейте строку на слова, и если слово является числом, проверяйте
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
15.06.2014, 17:56     Найти в символьном массиве трёхзначные числа #4
Монтгомери, вот метод, которой проверяет является ли число трехзначным
bool check_number(int number){return number>=100&&number<=999;}
Впрочем, ТС надо было текст анализировать.
Кто-нибудь, хоть подайте идею, как это сделать.
Универсальный ответ на вопрос "как что-то найти и/или заменить в тексте" - регулярные выражения. Теперь и в стандартной библиотеке!
Монтгомери
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 112
15.06.2014, 18:11  [ТС]     Найти в символьном массиве трёхзначные числа #5
Т.е. только разбивать на слова? В если входной массив выглядит, к примеру, так: fasd224a54dasd5764s ? На этот случай есть варианты?
Я пробовал посимвольно проверять, но что-то фантазия у меня буксовала, и я так и не придумал, как это осуществить.

Тогда следующий вопрос: как разделить строку на слова?

Добавлено через 14 минут
Я нашёл только strtok, но массив идёт "сплошняком", без каких-либо разделителей, так что strtok не подошёл.
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
15.06.2014, 18:16     Найти в символьном массиве трёхзначные числа #6
Монтгомери, вот пример, программа разбивает строку на слова
C++
1
2
3
4
5
6
7
8
9
10
#include<iostream>
#include<string>
#include<sstream>
int main()
{
    std::string str= "word1 word2",word;
    std::stringstream s(str);
    while(s>>word)
        std::cout<<word<<"\n";
}
Монтгомери
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 112
15.06.2014, 18:21  [ТС]     Найти в символьном массиве трёхзначные числа #7
Эмм... А можете объяснить, как это работает?
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
15.06.2014, 18:21     Найти в символьном массиве трёхзначные числа #8
В если входной массив выглядит, к примеру, так: fasd224a54dasd5764s ?
Найти все последовательности символов удовлетворяющие следующим условиям:
1) Начало последовательности совпадает с началом массива ИЛИ последовательности предшествует символ не являющийся цифрой.
2) Последовательность включает в себя три цифры.
3) Конец последовательности совпадает с концом массива ИЛИ за последовательностью идет символ не являющийся цифрой.

Дальше сами справитесь? И выучите регулярные выражения. Тогда ответ выше будет очевиден.
Монтгомери
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 112
15.06.2014, 18:34  [ТС]     Найти в символьном массиве трёхзначные числа #9
Я впервые услышал о регулярных выражениях сейчас от вас. А типы char и string нам вообще дали в духе "есть такие вот зверушки", но что с ними делать так и не сказали. И тут вдруг практика с заданиями, которые мы и не могли решить, используя прочитанный нам на лекциях материал.
Нам давали только массивы, циклы и функции. И работать я умею только с арифметичесими типами.

Так что я до сих пор не представляю, что надо делать дальше -_- Те три условия понятны, но как их реализовать я всё ещё не понимаю.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11835 / 6814 / 769
Регистрация: 27.09.2012
Сообщений: 16,891
Записей в блоге: 2
Завершенные тесты: 1
15.06.2014, 18:41     Найти в символьном массиве трёхзначные числа #10
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
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <cctype>
 
 
bool is_digit ( char x )
{
   return isdigit ( x ) ;
}
bool is_not_digit ( char x )
{
   return !isdigit ( x ) ;
}
 
 
int main ( )
{
   std::string str = "fasd224a54dasd5764s" ;
   std::vector < std::string > vec ;
   for (
        std::string::const_iterator it = std::find_if(str.begin(),str.end(),is_digit) ,
        itEnd = str.end() ;
        it != itEnd ;
        it = std::find_if(it,itEnd,is_digit)
       ) {
      std::string::const_iterator itTemp = std::find_if(it,itEnd, is_not_digit ) ;
     if ( std::distance (it,itTemp) == 3 )
         vec.push_back(std::string(it,itTemp)) ;
      it=itTemp ;
   }
   for ( std::vector < std::string >::const_iterator it = vec.begin() , itEnd = vec.end() ; it!=itEnd ; ++it )
      std::cout << *it << std::endl ;
}
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
15.06.2014, 18:45     Найти в символьном массиве трёхзначные числа #11
Нам давали только массивы, циклы и функции. И работать я умею только с арифметичесими типами.
char и есть арифметический тип со знаком. Символы идут в том же порядке как и в алфавите ('a'+1=='b'). Проверка того что символ - цифра осуществляется предельно тупо - C>='0'&&C<='9'.
Монтгомери
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 112
15.06.2014, 19:26  [ТС]     Найти в символьном массиве трёхзначные числа #12
А такой вариант будет работать?:

C++
1
2
3
4
5
6
7
8
9
10
11
char *s; 
int three-digit_numbers /*кол-во трёхзначных чисел*/, snum /*сумма цифр числа*/ 
// ввод массива 
for(i=0;/*сюда надо узнать размерность массива*/;i++) 
{if(s[i]>='1'&&s[i]<='9') //находим цифру, с неё начинаем проверять 
while(s[i]>='0'&&s[i]<='9') 
{snum++; i++;}; 
/* i++ чтобы переходить на следующий виток внутреннего цикла, 
а потом, во внешнем цикле, пропустить все элементы, проверенные во внутреннем */ 
if(snum==3) three-digit_numbers++; 
snum=0;}
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
15.06.2014, 19:39     Найти в символьном массиве трёхзначные числа #13
Не
C++
1
2
while(s[i]>='0'&&s[i]<='9') 
{snum++; i++;};
а
C++
1
2
for(;s[i]>='0'&&s[i]<='9'&&i<размер_массива;++i)
    ++snum;
Плюс three-digit_numbers и snum использованы без инициализации. В остальном должно работать.
Монтгомери
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 112
15.06.2014, 21:17  [ТС]     Найти в символьном массиве трёхзначные числа #14
А, точно, совсем забыл про размерность массива. Спасибо.
А вот почему преинкремент? Определение я помню, но почему здесь именно они, а не постинкремент?
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
15.06.2014, 21:28     Найти в символьном массиве трёхзначные числа #15
Постинкремент увеличивает значение переменной (одна ячейка памяти) и возвращает ее изначальное значение (вторая ячейка памяти). Преинкремент увеличивает переменную и возвращает ее новое значение (одна ячейка памяти). То есть, логически работает чуточку проще.

После того как компилятор выполнит оптимизацию разницы скорее всего не будет никакой, так что замена выполнена чисто для психологического комфорта.
Монтгомери
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 112
15.06.2014, 22:05  [ТС]     Найти в символьном массиве трёхзначные числа #16
И снова благодарю
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
16.06.2014, 09:21     Найти в символьном массиве трёхзначные числа #17
Цитата Сообщение от Renji Посмотреть сообщение
for(;s[i]>='0'&&s[i]<='9'&&i<размер_массива;++i)
* * ++snum;
кстати это же неверно по-моему!
надо условие выхода за границу ставить вперед, до проверки "на цифру".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2014, 13:31     Найти в символьном массиве трёхзначные числа
Еще ссылки по теме:

Поиск числа в символьном массиве C++
C++ Найти все простые трёхзначные числа
C++ Подсчет количества пробелов в символьном массиве

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

Или воспользуйтесь поиском по форуму:
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
16.06.2014, 13:31     Найти в символьном массиве трёхзначные числа #18
Да, действительно, косяк.
Yandex
Объявления
16.06.2014, 13:31     Найти в символьном массиве трёхзначные числа
Ответ Создать тему
Опции темы

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