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

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

Войти
Регистрация
Восстановить пароль
 
Монтгомери
3 / 3 / 0
Регистрация: 10.09.2013
Сообщений: 116
#1

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

15.06.2014, 17:32. Просмотров 570. Ответов 17
Метки нет (Все метки)

Дали задание на практике.
В нём надо прочесть из файла символьный массив и найти количество трёхзначных чисел в нём. Если количество нечётно - вывести на экран массив в обратном порядке.
И в этом нахождении трёхзначных чисел основная проблема: я даже не представляю, как это делать. Нам такое не читали, а задание дали.

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

Заранее спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bend3r
148 / 135 / 18
Регистрация: 29.07.2012
Сообщений: 709
15.06.2014, 17:38     Найти в символьном массиве трёхзначные числа #2
Строка в файле: ыва афы а 214 павыф п 234 аы875аф

Действие 1: Разбейте строку на слова
Действие 2: Создайте процедуру проверки каждого слова, в C++ есть такие функции как isDigit.
Действие 3: Далее уже нужные вам условия(подсчет, и т.п)
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
1757 / 1184 / 275
Регистрация: 05.06.2014
Сообщений: 3,413
15.06.2014, 17:56     Найти в символьном массиве трёхзначные числа #4
Монтгомери, вот метод, которой проверяет является ли число трехзначным
bool check_number(int number){return number>=100&&number<=999;}
Впрочем, ТС надо было текст анализировать.
Кто-нибудь, хоть подайте идею, как это сделать.
Универсальный ответ на вопрос "как что-то найти и/или заменить в тексте" - регулярные выражения. Теперь и в стандартной библиотеке!
Монтгомери
3 / 3 / 0
Регистрация: 10.09.2013
Сообщений: 116
15.06.2014, 18:11  [ТС]     Найти в символьном массиве трёхзначные числа #5
Т.е. только разбивать на слова? В если входной массив выглядит, к примеру, так: fasd224a54dasd5764s ? На этот случай есть варианты?
Я пробовал посимвольно проверять, но что-то фантазия у меня буксовала, и я так и не придумал, как это осуществить.

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

Добавлено через 14 минут
Я нашёл только strtok, но массив идёт "сплошняком", без каких-либо разделителей, так что strtok не подошёл.
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";
}
Монтгомери
3 / 3 / 0
Регистрация: 10.09.2013
Сообщений: 116
15.06.2014, 18:21  [ТС]     Найти в символьном массиве трёхзначные числа #7
Эмм... А можете объяснить, как это работает?
Renji
1757 / 1184 / 275
Регистрация: 05.06.2014
Сообщений: 3,413
15.06.2014, 18:21     Найти в символьном массиве трёхзначные числа #8
В если входной массив выглядит, к примеру, так: fasd224a54dasd5764s ?
Найти все последовательности символов удовлетворяющие следующим условиям:
1) Начало последовательности совпадает с началом массива ИЛИ последовательности предшествует символ не являющийся цифрой.
2) Последовательность включает в себя три цифры.
3) Конец последовательности совпадает с концом массива ИЛИ за последовательностью идет символ не являющийся цифрой.

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

Так что я до сих пор не представляю, что надо делать дальше -_- Те три условия понятны, но как их реализовать я всё ещё не понимаю.
Croessmah
Модератор
Эксперт CЭксперт С++
12731 / 7191 / 802
Регистрация: 27.09.2012
Сообщений: 17,738
Записей в блоге: 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
1757 / 1184 / 275
Регистрация: 05.06.2014
Сообщений: 3,413
15.06.2014, 18:45     Найти в символьном массиве трёхзначные числа #11
Нам давали только массивы, циклы и функции. И работать я умею только с арифметичесими типами.
char и есть арифметический тип со знаком. Символы идут в том же порядке как и в алфавите ('a'+1=='b'). Проверка того что символ - цифра осуществляется предельно тупо - C>='0'&&C<='9'.
Монтгомери
3 / 3 / 0
Регистрация: 10.09.2013
Сообщений: 116
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
1757 / 1184 / 275
Регистрация: 05.06.2014
Сообщений: 3,413
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 использованы без инициализации. В остальном должно работать.
Монтгомери
3 / 3 / 0
Регистрация: 10.09.2013
Сообщений: 116
15.06.2014, 21:17  [ТС]     Найти в символьном массиве трёхзначные числа #14
А, точно, совсем забыл про размерность массива. Спасибо.
А вот почему преинкремент? Определение я помню, но почему здесь именно они, а не постинкремент?
Renji
1757 / 1184 / 275
Регистрация: 05.06.2014
Сообщений: 3,413
15.06.2014, 21:28     Найти в символьном массиве трёхзначные числа #15
Постинкремент увеличивает значение переменной (одна ячейка памяти) и возвращает ее изначальное значение (вторая ячейка памяти). Преинкремент увеличивает переменную и возвращает ее новое значение (одна ячейка памяти). То есть, логически работает чуточку проще.

После того как компилятор выполнит оптимизацию разницы скорее всего не будет никакой, так что замена выполнена чисто для психологического комфорта.
Монтгомери
3 / 3 / 0
Регистрация: 10.09.2013
Сообщений: 116
15.06.2014, 22:05  [ТС]     Найти в символьном массиве трёхзначные числа #16
И снова благодарю
SlavaSSU
215 / 160 / 45
Регистрация: 17.07.2012
Сообщений: 587
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++ Вывод в символьном массиве в обратном порядке
C++ Найти в заданном одномерном символьном массиве нечётный палиндром наибольшей длины
C++ В заданном символьном массиве найти слова, в которых первая буква слова встречается в нём ещё 1 раз

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

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

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