Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
#1

Найти массив сумм цифр цифровых слов - C++

11.04.2013, 18:26. Просмотров 602. Ответов 14
Метки нет (Все метки)

Есть программка, которая с текстового файла посимвольно считывает текст.
Исключает знаки препинания, выводит каждое слово и его длину.
Выводит слова, которые состоят из английских букв длиной не больше 7 символов, и заменяет все строчные буквы на заглавные.
И последнее, (то что не работает): она должна еще находить массив сумм цифр цифровых слов.
Но преобразовать char в int не получаеся. Что не так и как правильно сделать?
И вообще может быть есть другой, более лаконичный способ решить те же задачи, чем посимвольное считывание?

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
 
bool check(char symb){
if ((symb==' ') || (symb=='.') ||
    (symb==',') || (symb=='!') ||
    (symb=='?') || (symb=='(') ||
    (symb==')') || (symb==';') ||
    (symb==':')) return true;
return false;
}
 
bool checkABC(char symb){
if ((symb=='A') || (symb=='B') ||
    (symb=='C') || (symb=='D') ||
    (symb=='E') || (symb=='F') ||
    (symb=='G') || (symb=='H') ||
    (symb=='I') || (symb=='J') ||
    (symb=='K') || (symb=='L') ||
    (symb=='M') || (symb=='N') ||
    (symb=='O') || (symb=='P') ||
    (symb=='Q') || (symb=='R') ||
    (symb=='S') || (symb=='T') ||
    (symb=='U') || (symb=='V') ||
    (symb=='W') || (symb=='X') ||
    (symb=='Y') || (symb=='Z')) return true;
    return false;
}
 
bool check123(char symb){
    if ((symb=='1') ||
    (symb=='2') ||
    (symb=='3') ||
    (symb=='4') ||
    (symb=='5') ||
    (symb=='6') ||
    (symb=='7') ||
    (symb=='8') ||
    (symb=='9') ||
    (symb=='0'))
    return true;
    return false;
}
 
int main() {
    setlocale (LC_ALL, "");
    string text[100];
    string textABC[100];
    int text123[50];
    char symb;
    int i = 0;
    int j = 0;
    int k = 0;
    unsigned int t = 0;
    ifstream intext("text.txt");
        if (!intext){
            cout << "File could not be open" << endl;
        exit(1);
        }
        else{
            while (!intext.eof()){
                intext.get(symb);
                if (check(symb) == false){
                    text[i] += symb;
                    symb = toupper(symb);
                    if (checkABC(symb) == true){
                    textABC[j] += symb;
                                   }
                    if (check123(symb) == true){
                    text123[k] += atoi(symb); // вот здесь ошибка
                    t++;
                    }
                }
                else{
                    if (text[i].length() > 0){
                    cout << text[i] << " = " << text[i].length() << endl;
                    if ((text[i].length() == textABC[j].length()) && (textABC[j].length() <= 7)){
                        j++; }
                    else{
                        textABC[j] = "";}
                    if (text[i].length() == t){
                        k++;
                        t = 0;}
                    else{
                        text123[k] = 0;
                        t = 0;}
                    i++;
                    }
                }
            }
        }
    for (int n = 0; n < j; n++){
        cout << textABC[n] << endl;
    }
    for (int m = 0; m < k; m++){
        cout << textABC[m] << endl;
    }
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 18:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти массив сумм цифр цифровых слов (C++):

Получить новый массив, состоящий из сумм цифр элементов исходного массива - C++
составить схему алгоритма и программу решения задачи. Ввести массив, состоящий из 9 элементов (девять двузначных чисел) целого типа....

Найти все трехзначные числа, представимые в виде сумм кубов своих цифр - C++
Задание: организовать работу программы с помощью файлового вводв вывода. Вариант 1: найти все трехзначные числа, представимые в виде сумм...

Найти все трехзначные числа представимые в виде сумм факториалов своих цифр - C++
Есть одна интересная задачка по теории алгоритмов, с которой у меня возникли сложности. Найти все трехзначные числа, представимые в...

Найти одномерный массив В из сумм элементов каждой строки матрицы - C++
Дана Матрица А(5.4) 1)Найти одномерный массив В из сумм элементов каждой строки матрицы 2)найти максимальный элемент матрицы А в 5-ой...

Найти новый одномерный массив В из сумм элементов каждой строки матрицы А - C++
program lab4; var i,j,jmax:integer; a:array of real; b:array of real; k,max,s:real; begin for i:=1 to 5 do for j:=1 to 4 do...

Массив: Из элементов массива найти несколько сумм, из котрых в итого выбрать минимальную - C++
Ребята, такое вот условие. Это будет кусочек от другой программы... В общем, есть массив чисел. Ну, к примеру, пусть в нём будет 10...

14
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 18:30 #2
Почему не получается преобразовать char в int?
0
GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
11.04.2013, 18:31 #3
зря вы так трудились с проверками

http://www.cplusplus.com/reference/cctype/
2
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
11.04.2013, 18:40  [ТС] #4
Хех, я подозревал что должны быть какие-то встроенные функции -)
Спасибо, я упрощу код, но проблема с преобразованием остается
C++
1
text123[k] += atoi(symb);
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 18:46 #5
что мешает написать
C++
1
2
3
char a;
int b;
b=int(a);
??????
0
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
11.04.2013, 20:12  [ТС] #6
зря вы так трудились с проверками
А может и не зря.
isalnum не видит букву "я" (в чем дело?), а функции для проверки конкретно английских букв там нет.
Для цифр применил функцию оттуда

что мешает написать
Гм.. ничего наверное не мешает. Так и написал, вроде какие-то цифры выдает, но не то что должно.

Сейчас прога выглядит так:
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <ctype.h>
using namespace std;
 
bool checkABC(char symb){
if ((symb=='A') || (symb=='B') ||
    (symb=='C') || (symb=='D') ||
    (symb=='E') || (symb=='F') ||
    (symb=='G') || (symb=='H') ||
    (symb=='I') || (symb=='J') ||
    (symb=='K') || (symb=='L') ||
    (symb=='M') || (symb=='N') ||
    (symb=='O') || (symb=='P') ||
    (symb=='Q') || (symb=='R') ||
    (symb=='S') || (symb=='T') ||
    (symb=='U') || (symb=='V') ||
    (symb=='W') || (symb=='X') ||
    (symb=='Y') || (symb=='Z')) return true;
    return false;
}
 
int main() {
    setlocale (LC_ALL, "");
    string text[100];
    string textABC[100];
    int text123[50];
    char symb;
    int i = 0;
    int j = 0;
    int k = 0;
    unsigned int t = 0;
    ifstream intext("text.txt");
        if (!intext){
            cout << "File could not be open" << endl;
        exit(1);
        }
        else{
            while (!intext.eof()){
                intext.get(symb);
                if (!ispunct(symb) && !isblank(symb)){
                    text[i] += symb;
                    symb = toupper(symb);
                    if (checkABC(symb) == true){
                    textABC[j] += symb;
                    }
                    if (isdigit(symb)){
                    text123[k] += int(symb);
                    t++;
                    }
                }
                else{
                    if (text[i].length() > 0){
                    cout << text[i] << " = " << text[i].length() << endl;
                    if ((text[i].length() == textABC[j].length()) && (textABC[j].length() <= 7)){
                        j++; }
                    else{
                        textABC[j] = "";}
                    if (text[i].length() == t){
                        k++;
                        t = 0;}
                    else{
                        text123[k] = 0;
                        t = 0;}
                    i++;
                    }
                }
            }
        }
    for (int n = 0; n < j; n++){
        cout << textABC[n] << endl;
    }
    for (int m = 0; m < k; m++){
        cout << text123[m] << endl;
    }
    return 0;
}
Помогите найти ошибку, прогоните у себя какой-то документик через нее, чтоб там были цифры
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 20:47 #7
Цитата Сообщение от EvengarS Посмотреть сообщение
какие-то цифры выдает, но не то что должно.
Конечно не те. Знаете что такое ASCII? Что бы получать то,что Вам надо, необходимо вычитать код нуля.

Добавлено через 17 минут
EvengarS, кроме всего прочего, не надо так напрягаться и писать кучу ||. Можно просто написать
C++
1
if (('A' <=symb)&&(symb<='Z'))
1
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
11.04.2013, 20:54  [ТС] #8
metaluga145, спасибо, причесал код.
Может еще подскажете как решить такую ошибку: прога неправильно обрабатывает абзацы. Если слово в текстовом документе начинается с новой строки, то к этому слову приписывается еще энтер спереди, отчего получается не совсем корректное отображение при выводе слов на экран + длина этого слова на 1 больше реальной.
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 21:08 #9
EvengarS, Советую вам открывать файл не так,как вы делаете,а вот так:
C++
1
ifstream intext(_tfopen(L"text.txt", L"rb"));
Добавлено через 29 секунд
Я вроде бы так делал. Попробуйте. Если не поможет, поищем другой вариант.
0
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
11.04.2013, 22:07  [ТС] #10
Так не работает, не понимает оно _tfopen при таком записе, видимо там надо менять больше, чем эту строку
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 22:17 #11
В принципе, можно просто каждый раз удалять лишние переносы, только надо посмотреть их коды в ASCII. Если вы пишете под Linux, то код переноса 10, если же под Windows, то 13+10(если ничего не напутал). Попробуйте так еще.
Возможно чуть позже я еще что-то придумаю.
0
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
11.04.2013, 23:16  [ТС] #12
А как их удалять по этому самому коду? Что-то не могу сообразить
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 23:31 #13
EvengarS, прочитали текст, потом посимвольно проходим массив,в котором текст, если символ имеет такой код(переводим в инт и смотрим на значение), то удаляем его из массива.

Добавлено через 4 минуты
EvengarS, а Вам вообще принципиально,чтобы оно читало вместе с переносами?

Добавлено через 1 минуту
И какая у Вас среда?
0
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
11.04.2013, 23:35  [ТС] #14
Если я правильно понимаю, то это можно добавить в первое условие которое я проверяю
if (!ispunct(symb) && !isblank(symb) && int(symb)!='13+10')
только не уверен что правильно записал последнюю часть


Цитата Сообщение от metaluga145 Посмотреть сообщение
а Вам вообще принципиально,чтобы оно читало вместе с переносами?
Мне нужно вывести из текста слова и их длины, слова полностью английскими буквами длиной не больше 7 символов, и массив сумм цифровых слов. Это можно сделать как-то кроме посмвольного считывания?

Добавлено через 21 секунду
Windows
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 23:55 #15
EvengarS, я не профи,но я бы считывал все в переменную типа string(кст,заметил в коде у Вас, srting Text[100]-это массив стрингов).
C++
1
2
string buf;
intext>>buf;
Такой метод будет считывать по одной строке сразу, если несколько строк, то можно засунуть это все в цикл
C++
1
while (!intext.eof())
Добавлено через 2 минуты
Цитата Сообщение от EvengarS Посмотреть сообщение
int(symb)!='13+10'
нет, не правильно. Есть отдельный символ подачи строки, с кодом 10, и отдельный возврата коретки в начало, с кодом 13.
0
11.04.2013, 23:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2013, 23:55
Привет! Вот еще темы с ответами:

Найти минимум среди сумм элементов диагоналей, параллельных побочной диагонали матрицы[массив] - C++
Привет всем,возникла проблема с решение данной проблемы(Найти минимум среди сумм элементов диагоналей, параллельных побочной диагонали...

Функция, получает строку слов и рзделителей, а на выходе имеет массив слов из строки и количество этих слов - C++
мне нужна функция, которая во входе получает строку слов и рзделителей (&quot; &quot;, &quot;,&quot;, &quot;.&quot;, &quot;_&quot;, &quot;&quot;&quot;), а на выходе имеет массив слов из строки...

Упорядочить числа в последовательности по невозрастанию сумм цифр - C++
Даны целые числа а1, …, аn. Упорядочить числа в последовательности по невозрастанию сумм цифр, входящих в запись чисел. Входные данные...

Используя динамический массив выполнить перемещение всех цифровых символов в начало заданной строки - C++
Требуется помощь в написании следующей задачи -&gt; Ввести символьную строку. Выполнить перемещение всех цифровых сим-волов в начало...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru