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

Скромный вопрос - C++

Восстановить пароль Регистрация
 
 
Gothic Angelos
 Аватар для Gothic Angelos
1 / 1 / 0
Регистрация: 29.05.2010
Сообщений: 140
20.05.2011, 22:42     Скромный вопрос #1
Подскажите пожалуйста, как можно в строке содержащей буквы и цифры определить количество цифр?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2011, 22:42     Скромный вопрос
Посмотрите здесь:

C++ Вопрос
C++ Вопрос по if, else?
C++ Вопрос по массивав, "институтский" вопрос.
C++ Вопрос по #if
Вопрос C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
20.05.2011, 22:48     Скромный вопрос #2
Посчитать?
SS_47
21 / 21 / 1
Регистрация: 12.07.2010
Сообщений: 27
20.05.2011, 22:48     Скромный вопрос #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    string s = "dasdlashda783dhnsaiufts7gsdbvsdt89sdfhds8";
    int i = 0;
    int result = 0;
 
    while(s[i]!= '\0')
    {
        if(s[i] > '0' && s[i] < '9') result++;
        i++;
    }
 
    cout << result;
 
}
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
20.05.2011, 22:50     Скромный вопрос #4
C
1
2
3
4
5
char str[] = "asd67f76s", *p = str;
size_t cnt = 0;
for(; *p; ++p)
  if(isdigit(*p))
    ++cnt;
C++
1
2
std::string str("fsd676sdf76");
size_t cnt = std::count_if(str.begin(), str.end(), isdigit);
Gothic Angelos
 Аватар для Gothic Angelos
1 / 1 / 0
Регистрация: 29.05.2010
Сообщений: 140
20.05.2011, 22:53  [ТС]     Скромный вопрос #5
Спасибо, алгоритм в целом понятен, благодарю за помощь, осталось сделать это в рекурсивном варианте
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
20.05.2011, 22:57     Скромный вопрос #6
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main(int argc, char *argv[]) {
  char string[] = "this is 1st string with 4 digits. Only 2 more. 1 left.";
  char *symbol;
  size_t digits = 0;
  for (symbol = string; *symbol != '\0'; ++symbol)
    if (*symbol >= '0' && *symbol <= '9')
      ++digits;
  printf("String:\n%s\nDigits: %d\n", string, digits);
  
  return 0;
}
Добавлено через 4 минуты
Цитата Сообщение от Gothic Angelos Посмотреть сообщение
осталось сделать это в рекурсивном варианте
А вот СРАЗУ, в первом посту, сказать, что хочется рекурсию сложно было? Рекурсивный алгоритм для данной задачи будет не очень хорошей идеей.

C
1
2
3
4
5
6
7
8
9
10
11
size_t CountDigits(char *string) {
  if (*string == '\0') return 0;
  return ((*string >= '0' && *string <= '9') ? 1 : 0) + CountDigits(string + 1);
}
 
int main(int argc, char *argv[]) {
  char string[] = "this is 1st string with 4 digits. Only 2 more. 1 left.";
  printf("%d\n", CountDigits(string));
 
  return 0;
}
Gothic Angelos
 Аватар для Gothic Angelos
1 / 1 / 0
Регистрация: 29.05.2010
Сообщений: 140
20.05.2011, 22:59  [ТС]     Скромный вопрос #7
Насколько я понимаю рекурсия это когда нет цикла и функция ссылается сама на себя,а тут чтото не то

Добавлено через 1 минуту
Цитата Сообщение от lemegeton Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main(int argc, char *argv[]) {
  char string[] = "this is 1st string with 4 digits. Only 2 more. 1 left.";
  char *symbol;
  size_t digits = 0;
  for (symbol = string; *symbol != '\0'; ++symbol)
    if (*symbol >= '0' && *symbol <= '9')
      ++digits;
  printf("String:\n%s\nDigits: %d\n", string, digits);
  
  return 0;
}
Добавлено через 4 минуты

А вот СРАЗУ, в первом посту, сказать, что хочется рекурсию сложно было? Рекурсивный алгоритм для данной задачи будет не очень хорошей идеей.

C
1
2
3
4
5
6
7
8
9
10
11
size_t CountDigits(char *string) {
  if (*string == '\0') return 0;
  return ((*string >= '0' && *string <= '9') ? 1 : 0) + CountDigits(string + 1);
}
 
int main(int argc, char *argv[]) {
  char string[] = "this is 1st string with 4 digits. Only 2 more. 1 left.";
  printf("%d\n", CountDigits(string));
 
  return 0;
}
ну условия задачи не я выбираю к сожалению)
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
20.05.2011, 23:00     Скромный вопрос #8
Внимательней.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.05.2011, 23:00     Скромный вопрос #9
Gothic Angelos, Ну вообще-то вполне нормальная рекурсия. Как следует код посмотрите
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
20.05.2011, 23:01     Скромный вопрос #10
Цитата Сообщение от Gothic Angelos Посмотреть сообщение
Насколько я понимаю рекурсия это когда нет цикла и функция ссылается сама на себя,а тут что-то не то

ну условия задачи не я выбираю к сожалению)
Как раз в последнем варианте - все то, что надо.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
20.05.2011, 23:01     Скромный вопрос #11
Цитата Сообщение от Gothic Angelos Посмотреть сообщение
ну условия задачи не я выбираю к сожалению)
... и к моменту написания поста условия задачи еще не до конца известны?
Gothic Angelos
 Аватар для Gothic Angelos
1 / 1 / 0
Регистрация: 29.05.2010
Сообщений: 140
20.05.2011, 23:02  [ТС]     Скромный вопрос #12
size_t CountDigits(char *string) {
if (*string == '\0') return 0;
return ((*string >= '0' && *string <= '9') ? 1 : 0) + CountDigits(string + 1);
}

пока пытаюсь вникнуть в эту часть кода
? 1 : 0) + CountDigits(string + 1); эта часть мне пока не ясна
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.05.2011, 23:08     Скромный вопрос #13
Gothic Angelos, Ну учебник в руки че могу сказать.

тернарный оператор если условие истино - будет 1 если ложно 0, затем вызываем рекурсивно функцию для следующего символа (складывая с 1 или 0 возвращаемое значение).

Чтобы познать рекурсию нужно познать рекурсию ©
Gothic Angelos
 Аватар для Gothic Angelos
1 / 1 / 0
Регистрация: 29.05.2010
Сообщений: 140
20.05.2011, 23:10  [ТС]     Скромный вопрос #14
Просто нас ещё не успели обучить таким хитрым приёмам...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.05.2011, 23:11     Скромный вопрос #15
Gothic Angelos, Главное в программировании самообучение. Попробуйте.
Gothic Angelos
 Аватар для Gothic Angelos
1 / 1 / 0
Регистрация: 29.05.2010
Сообщений: 140
20.05.2011, 23:43  [ТС]     Скромный вопрос #16
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<iostream.h>
#include<fstream.h>
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void ToFile();
void FromFile ();
int C4ET(char a[81],int p);
void main ()
 
{
clrscr();
char a[81];
int p;
ToFile();
 
FromFile();
C4ET(a,p);
getch();
}
void ToFile()
{
char a[81];
ofstream OUT;
OUT.open("D:/text.cpp");
if (OUT.fail())
{
cout<<"file ne otkrilca!\n";
exit(1);
}
cout<<"vvecti text:\n";
do
{
gets(a);
OUT<<a<<endl;
}
while (getch()!='0');
OUT.close();
}
void FromFile ()
{
char a[81];
ifstream Input;
Input.open("D:/text.cpp");
if (Input.fail())
{
cout<<"file ne otkrilca!\n";
exit(1);
}
 Input.close();
 }
int C4ET(char a[81],int p)
{
p=0;
 
if ( a[81]!= '0' && a[81]!='9')
return 0;
else
p++;
return (C4ET (a,p));
 
 
}
вот мой код, моё задание: "Написать рекурсивную функцию подсчёта количества цифр в текстовом файле"
в последней функции с названием C4ET пытался чтото делать, скажите как лучше поправить?
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
20.05.2011, 23:53     Скромный вопрос #17
Это уже третий вариант задания.

Добавлено через 37 секунд
Цитата Сообщение от Gothic Angelos Посмотреть сообщение
скажите как лучше поправить?
Лучше не решать данную задачу при помощи рекурсии. Стек быстро кончится.
Gothic Angelos
 Аватар для Gothic Angelos
1 / 1 / 0
Регистрация: 29.05.2010
Сообщений: 140
20.05.2011, 23:54  [ТС]     Скромный вопрос #18
Ну задание у меня такое, так что пусть алгоритм не рационален, но нужно сделать именно так
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
20.05.2011, 23:57     Скромный вопрос #19
Да ты уже третий раз меняешь задание.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>
 
size_t CountDigits(FILE *file) {
  if (feof(file))
    return 0;
  char symbol = fgetc(file);
  return ((symbol >= '0' && symbol <= '9') ? 1 : 0) + CountDigits(file);
}
 
int main(int argc, char *argv[]) {
  FILE *file = fopen("tutor169.c", "r"); // <- тут имя файла поменяй
  printf("%d\n", CountDigits(file));
  fclose(file);
  return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2011, 00:33     Скромный вопрос
Еще ссылки по теме:

C++ вопрос
C++ Вопрос
C++ Вопрос по C++

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

Или воспользуйтесь поиском по форуму:
Gothic Angelos
 Аватар для Gothic Angelos
1 / 1 / 0
Регистрация: 29.05.2010
Сообщений: 140
21.05.2011, 00:33  [ТС]     Скромный вопрос #20
Ну сначала я хотел просто разобраться с алгоритмом, потом заморочился на рекурсии

Добавлено через 8 минут
Я выше написал код, в котором последняя функция должна считать количество цифр среди букв, которые мы задали с клавиатуры и поместили в файл....я прошу отредактировать последнюю функцию, чтобы она выполняла поставленную задачу
Yandex
Объявления
21.05.2011, 00:33     Скромный вопрос
Ответ Создать тему
Опции темы

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