Как найти сумму кодов слова

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
#include <stdio.h>
#include <string.h>
 
int sum_symbols (char *);
void reverse_word (char *, int);
 
int main (void) {
    char word[] = "Hello";          // заданное слово
 
    int sum = sum_symbols(word);    // находим сумму кодов символов слова
    printf("sum = %dn", sum);      // выводим сумму на экран
 
    if (sum % 2 == 0) {             // если сумма четная
        reverse_word(word, strlen(word));   // переворачиваем слово
        puts(word);                         // выводим его на экран
    }
    return 0;                       // конец программы
} 
// -------------------------------------------------------------
int sum_symbols (char *word) {
    int sum = 0;
    for (char *a = word; *a != ''; a++)
        sum += *a;
    return sum;
}
// -------------------------------------------------------------
void reverse_word (char *word, int size) {
    char tmp;
    for (int i = 0, k = size-1; i < k; ++i, --k)
        tmp = word[i],
        word[i] = word[k],
        word[k] = tmp;
}
// -------------------------------------------------------------

Алгоритм

  1. Берете строку и подготавливайте ее

    1.1 строку надо оттримировать(убрать мульти пробелы, пробелы в начале строки и в ее конце)

    1.2 выкосить все знаки пунктуации (.,/-/* и тд)

    1.3 сдампить в контейнер по словам (разбить на лексемы)

Дальше вариантов много — вот 2, что первые пришли в голову

  1. Перебирая элементы контейнера, применить к первому символу слова

    2.1 проверку на первый элемент через find в векторе с гласными буквами, если она там нашлась — то начиниется с гласной, если не — то нет)

    2.2 регулярку rgx{«[aeiouyAEIOUY]»}; если проверка не прошла (просто гласных меньше — меньше регулярка)))) ), то через std::accumulate(std::begin(word), std::end(word), 0) посчитать сумму кодов символов данного слова и все это прибавить к накопительной сумме)

Вот пример кода

#include <iostream>
#include <string>
#include <iterator>
#include <numeric>
#include <regex>
#include <cctype>


static std::regex rgx{"[aeiouyAEIOUY]"};


std::string trim(std::string str, bool multi_space = true) {

    auto trim_left_it{std::find_if(std::begin(str), std::end(str), [](char ch){return !std::isspace(ch);})};
    str.erase(std::begin(str), trim_left_it);

    auto trim_right_it{std::find_if(std::rbegin(str), std::rend(str), [](char ch){return !std::isspace(ch);})};
    str.erase(trim_right_it.base(), std::end(str));

    if (multi_space) {
        std::string res;
        std::unique_copy(std::begin(str), std::end(str),
                        std::back_insert_iterator<std::string>(res),
                        [](char a,char b){ return isspace(a) && isspace(b);});
        return res;
    }

    return str;
}


std::string ClearPunctuationMarks(std::string str) {

    str.erase(std::remove_if(std::begin(str), std::end(str), ispunct), std::end(str));

    return str;
}


std::vector<std::string> split_str(const std::string& str) {

    std::vector<std::string> tokens;
    std::size_t prev = 0, pos = 0;

    do {
        pos = str.find(' ', prev);
        if (pos == std::string::npos) {
            pos = str.length();
        }
        std::string token = str.substr(prev, pos-prev);
        if (!token.empty()) {
            tokens.push_back(token);
        }
        prev = pos + 1;
    } while (pos < str.length() && prev < str.length());

    return tokens;
}


uint64_t SumOfStartVowelsWord(std::string line) {

    uint64_t ret{0};

    auto v_word{split_str(line)};

    for (auto word : v_word) {
        if (!std::regex_match(word.substr(0,1), rgx)) {
            ret += std::accumulate(std::begin(word), std::end(word), 0);
        }
    }

    return ret;
}


uint64_t SumOfStartVowelsWord2(std::string line) {

    uint64_t ret{0};

    auto v_word{split_str(line)};

    std::vector<char> v_char{'a', 'e', 'i', 'o', 'u', 'y', 'A', 'E', 'I', 'O', 'U', 'Y'};

    for (auto word : v_word) {
        if (std::find(std::begin(v_char), std::end(v_char), word[1]) != std::end(v_char)) {
            ret += std::accumulate(std::begin(word), std::end(word), 0);
        }
    }

    return ret;
}


int main() {

    std::string line{"test, Abs! efg"};

    auto count{SumOfStartVowelsWord(ClearPunctuationMarks(trim(line)))};

    std::cout << count << std::endl;

    auto count2{SumOfStartVowelsWord2(ClearPunctuationMarks(trim(line)))};

    std::cout << count2 << std::endl;

    return 0;
}

Формулировка задачи:

Коды букв имеют значения: A-1, B-2, C-3, D-4, E-5, F-6, G-7, H-8, I-9, J-10, K-11, L-12, M-13, N-14, O-15, P-16, Q-17, R-18, S-19, T-20, U-21, V-22, W-23, X-24, Y-25, Z-26.
Заранее спасибо!

Код к задаче: «Посчитать сумму кодов букв, составляющих данное слово. Коды букв заданы»

textual

Uses crt;
Var A:array['A'..'Z'] of integer; s:string; i,j,sum:integer; c:char;
Begin
ClrScr; Write('Input word:'); Readln(s); j:=0; sum:=0;
For c:='A' to 'Z' do            {в массив с символьными индексами заносим коды букв}
 Begin
  inc(j);                            {увеличиваем значение кода на 1}
  A[c]:=j;
 End;
For i:=1 to length(s) do         {проходим по слову}
 For c:='A' to 'Z' do                {проходим по массиву}
  If s[i]=c then sum:=sum+A[c];   {если буква из слова и индекс совпадают, берём элемент соответствующий данному индексу}
Writeln(sum);
Readln;
End.

Полезно ли:

8   голосов , оценка 4.500 из 5

Задание 4 (раньше №5) ЕГЭ по информатике:

По каналу связи передаются шифрованные сообщения, содержащие только пять букв: А, Б, В, Г, Д. Для передачи используется неравномерный двоичный код. Для букв А, Б и В используются кодовые слова 101000, 111100, 000 соответственно.

Укажите минимальную сумму длин кодовых слов для букв Г и Д, при которой код будет удовлетворять условию Фано.

✍ Решение:
 

Ответ: 5


Задание 4 (раньше №5) ЕГЭ по информатике:

По каналу связи передаются шифрованные сообщения, содержащие только пять букв: А, Б, В, Г, Д, Е, Ж.. Для передачи используется неравномерный двоичный код. Для букв А, Б, В и Г используются кодовые слова 0001000, 100, ООН, 111 соответственно.

Укажите минимальную сумму длин кодовых слов для букв Д, Е и Ж, при которой код будет удовлетворять условию Фано.

✍ Решение:
 

Ответ: 8


���������������� �� Visual Basic, VB .NET � VBA

�������� �������

��� �������� ���������� ���� �������� � ��������
«����������� ���� — ����»
�� ������� � ����������� ��� �����������.

�� ������ ����� �������� ������� ��������
� �������� ��������.


 

�������
2009

 

 1

01.12.2009

06:38:04
09:30:22

 2

02.12.2009

08:12:28
09:30:20

 3

03.12.2009

07:33:51
09:30:37

 4

04.12.2009

05:59:33
08:30:28

 5

 6

 7

07.12.2009

08:30:26
10:34:07

 8

08.12.2009

09:33:04
10:15:14

 9

09.12.2009

08:36:08
12:53:35

10

10.12.2009

05:19:28
08:30:24

11

11.12.2009

08:32:49
09:32:39

12

13

14

14.12.2009

06:39:46
09:31:03

15

15.12.2009

09:32:16
10:34:38

16

16.12.2009

06:43:54
09:31:57

17

17.12.2009

09:10:37
09:33:14

18

18.12.2009

07:42:01
08:30:26

19

20

21

21.12.2009

08:25:35
09:32:16

22

22.12.2009

05:43:09
08:33:16

23

24

25

26

27

28

29

30

31

�����



BiT

����������

0 �����������

0 �� ������

  • �������
  • ����������


 
��� �������
 

��������� ����� ����� ���� ��������

��������� ����� ����� ���� ��������

2009-12-08 07:00 ���������

��������� ����� ����� ���� ��������

Private Sub Form_Load()
Dim sum As Integer, txt As String
txt = «� ��� ���-��� ������� � Visual Basic!»
For i = 1 To Len(txt)
sum = sum + Asc(Mid(txt, i, 1))
Next
MsgBox «����� ����� �������� — » & sum
End Sub


� ���������

     

Понравилась статья? Поделить с друзьями:
  • Дагестан как найти жилье
  • Майнкрафт как найти заброшенную шахту команда
  • Как найти все книги в магике
  • Как найти приличный сайт знакомств
  • Как найти плотность пласта