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

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

Восстановить пароль Регистрация
 
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
11.04.2013, 18:26     Найти массив сумм цифр цифровых слов #1
Есть программка, которая с текстового файла посимвольно считывает текст.
Исключает знаки препинания, выводит каждое слово и его длину.
Выводит слова, которые состоят из английских букв длиной не больше 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 18:26     Найти массив сумм цифр цифровых слов
Посмотрите здесь:

Массив: Из элементов массива найти несколько сумм, из котрых в итого выбрать минимальную C++
Найти самый посещаемый кинотеатр (массив из слов) C++
C++ Найти минимум среди сумм элементов диагоналей, параллельных побочной диагонали матрицы[массив]
Найти все трехзначные числа, представимые в виде сумм кубов своих цифр C++
Ввести строку,переделать последовательности цифровых символов в числа и найти их сумму C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 18:30     Найти массив сумм цифр цифровых слов #2
Почему не получается преобразовать char в int?
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
11.04.2013, 18:31     Найти массив сумм цифр цифровых слов #3
зря вы так трудились с проверками

http://www.cplusplus.com/reference/cctype/
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
11.04.2013, 18:40  [ТС]     Найти массив сумм цифр цифровых слов #4
Хех, я подозревал что должны быть какие-то встроенные функции -)
Спасибо, я упрощу код, но проблема с преобразованием остается
C++
1
text123[k] += atoi(symb);
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);
??????
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;
}
Помогите найти ошибку, прогоните у себя какой-то документик через нее, чтоб там были цифры
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'))
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
11.04.2013, 20:54  [ТС]     Найти массив сумм цифр цифровых слов #8
metaluga145, спасибо, причесал код.
Может еще подскажете как решить такую ошибку: прога неправильно обрабатывает абзацы. Если слово в текстовом документе начинается с новой строки, то к этому слову приписывается еще энтер спереди, отчего получается не совсем корректное отображение при выводе слов на экран + длина этого слова на 1 больше реальной.
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 секунд
Я вроде бы так делал. Попробуйте. Если не поможет, поищем другой вариант.
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
11.04.2013, 22:07  [ТС]     Найти массив сумм цифр цифровых слов #10
Так не работает, не понимает оно _tfopen при таком записе, видимо там надо менять больше, чем эту строку
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 22:17     Найти массив сумм цифр цифровых слов #11
В принципе, можно просто каждый раз удалять лишние переносы, только надо посмотреть их коды в ASCII. Если вы пишете под Linux, то код переноса 10, если же под Windows, то 13+10(если ничего не напутал). Попробуйте так еще.
Возможно чуть позже я еще что-то придумаю.
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
11.04.2013, 23:16  [ТС]     Найти массив сумм цифр цифровых слов #12
А как их удалять по этому самому коду? Что-то не могу сообразить
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 23:31     Найти массив сумм цифр цифровых слов #13
EvengarS, прочитали текст, потом посимвольно проходим массив,в котором текст, если символ имеет такой код(переводим в инт и смотрим на значение), то удаляем его из массива.

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

Добавлено через 1 минуту
И какая у Вас среда?
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2013, 23:55     Найти массив сумм цифр цифровых слов
Еще ссылки по теме:

C++ Получить новый массив, состоящий из сумм цифр элементов исходного массива
Удалить из массива числа из одинаковых цифр и упорядочить в порядке убывания их сумм C++
Доказать программно, что любая последовательность сумм кубов всех цифр элемента становится постоянной C++

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

Или воспользуйтесь поиском по форуму:
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.
Yandex
Объявления
11.04.2013, 23:55     Найти массив сумм цифр цифровых слов
Ответ Создать тему
Опции темы

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