Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33

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

11.04.2013, 18:26. Показов 1490. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.04.2013, 18:26
Ответы с готовыми решениями:

Сформировать массив из сумм цифр соответствующих элементов исходного массива
Помогите пожалуйста решить данную задачу: Сформировать одномерный массив, каждый элемент которого равен сумме цифр соответствующего...

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

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

14
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 18:30
Почему не получается преобразовать char в int?
0
 Аватар для GetVariable
164 / 120 / 46
Регистрация: 17.03.2013
Сообщений: 284
11.04.2013, 18:31
зря вы так трудились с проверками

http://www.cplusplus.com/reference/cctype/
2
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
11.04.2013, 18:40  [ТС]
Хех, я подозревал что должны быть какие-то встроенные функции -)
Спасибо, я упрощу код, но проблема с преобразованием остается
C++
1
text123[k] += atoi(symb);
0
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 18:46
что мешает написать
C++
1
2
3
char a;
int b;
b=int(a);
??????
0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
11.04.2013, 20:12  [ТС]
зря вы так трудились с проверками
А может и не зря.
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
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 20:47
Цитата Сообщение от EvengarS Посмотреть сообщение
какие-то цифры выдает, но не то что должно.
Конечно не те. Знаете что такое ASCII? Что бы получать то,что Вам надо, необходимо вычитать код нуля.

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

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

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


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

Добавлено через 21 секунду
Windows
0
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 23:55
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.04.2013, 23:55
Помогаю со студенческими работами здесь

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

Получить массив результатов умножения на 5 цифровых слов в ListBox
Вот такая задача: . Получить массив результатов умножения на 5 цифровых слов в ListBox . Я решила найти хотя бы первое цифровое слово ...

Распечатать слова из первой строки, если они имеются во второй, найти сумму цифровых слов
Сначала набираем текст в строку а затем ввести строку В. Распечатать слова из первой строки, если они имеются во второй, найти сумму...

Найти все трехзначные числа, представимые в виде сумм факториалов своих цифр (найти ошибку)
Найти все трехзначные числа, представимые в виде сумм факториалов своих цифр. using System; using System.Collections.Generic; ...

Составить массив сумм цифр элементов (из готового кода Pascal в C)
Доброго времени суток форумчане, преподаватель в институте задал, задачу которую раньше в Pascal писал, а у нас заочка жесткая времени на...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru