3 / 3 / 2
Регистрация: 10.09.2013
Сообщений: 210
1

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

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

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

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

Заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2014, 17:32
Ответы с готовыми решениями:

Найти в массиве трехзначные числа, сумма которых равна k
Привет. Программа компилируется, но не работает :( предполагаю, что возможно массив также...

Поиск числа в символьном массиве
Вводим строку символов, где есть и числа, и буквы, далее из этой строки нужно найти максимальное...

Найти количество слов в символьном массиве
дано: х (100), найти количество слов в символьном массиве. Очень прошу помогите...!!!

Найти количество отрицательных элементов в символьном массиве
Пользователь вводит элементы символьного массива. Вводит цифры. Отрицательные и положительные.

17
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
15.06.2014, 17:38 2
Строка в файле: ыва афы а 214 павыф п 234 аы875аф

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

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

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

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

Так что я до сих пор не представляю, что надо делать дальше -_- Те три условия понятны, но как их реализовать я всё ещё не понимаю.
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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 ;
}
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
15.06.2014, 18:45 11
Нам давали только массивы, циклы и функции. И работать я умею только с арифметичесими типами.
char и есть арифметический тип со знаком. Символы идут в том же порядке как и в алфавите ('a'+1=='b'). Проверка того что символ - цифра осуществляется предельно тупо - C>='0'&&C<='9'.
1
3 / 3 / 2
Регистрация: 10.09.2013
Сообщений: 210
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;}
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
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 использованы без инициализации. В остальном должно работать.
1
3 / 3 / 2
Регистрация: 10.09.2013
Сообщений: 210
15.06.2014, 21:17  [ТС] 14
А, точно, совсем забыл про размерность массива. Спасибо.
А вот почему преинкремент? Определение я помню, но почему здесь именно они, а не постинкремент?
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
15.06.2014, 21:28 15
Постинкремент увеличивает значение переменной (одна ячейка памяти) и возвращает ее изначальное значение (вторая ячейка памяти). Преинкремент увеличивает переменную и возвращает ее новое значение (одна ячейка памяти). То есть, логически работает чуточку проще.

После того как компилятор выполнит оптимизацию разницы скорее всего не будет никакой, так что замена выполнена чисто для психологического комфорта.
1
3 / 3 / 2
Регистрация: 10.09.2013
Сообщений: 210
15.06.2014, 22:05  [ТС] 16
И снова благодарю
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
16.06.2014, 09:21 17
Цитата Сообщение от Renji Посмотреть сообщение
for(;s[i]>='0'&&s[i]<='9'&&i<размер_массива;++i)
* * ++snum;
кстати это же неверно по-моему!
надо условие выхода за границу ставить вперед, до проверки "на цифру".
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
16.06.2014, 13:31 18
Да, действительно, косяк.
0
16.06.2014, 13:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2014, 13:31
Помогаю со студенческими работами здесь

В символьном массиве найти наиболее часто встречающееся значение
В символьном массиве найти наиболее часто встречающееся значение. Вывести это значение и все его...

Найти в заданном одномерном символьном массиве нечётный палиндром наибольшей длины
Дан одномерный символьный массив. Найти в нем нечетный палиндром наибольшей длины. Любой элемент...

Найти все трехзначные числа равные среднему арифметическому цифр данного числа
Дано трехзначное число. Найти все трехзначные числа равные среднему арифметическому цифр данного...

Найти все трехзначные числа,определив функцию, позволяющую распознавать простые числа
1)Найти все трехзначные числа,определив функцию, позволяющую распозновать простые числа. ...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru