Помощник написания кода на С++

Сайт: Информатикс
Курс: 2086 8М Информатика
Книга: Помощник написания кода на С++
Напечатано:: Гость
Дата: Пятница, 27 Июнь 2025, 19:29

1. Начало

#include<iostream>

using namespace std;

int main() {
  int a, b, c;
  cin >> a >> b >> c;
  cout << a + b + c;
  if(a > 0) {
    cout << " a > 0" << endl;
  } else {
    cout << " a <= 0" << endl;
  }
  for(int i = 0; i < 10; i++) 
    cout << i << " ";
  cout << endl;
}


2. Массивы

#include<iostream>
#include<vector>

using namespace std;

int main() {
  vector<int> data;
  int a;
  cin >> a;
  for(int i = 0; i < a; i++) {
    int b;
    cin >> b;
    data.push_back(b);
  }
}


3. Функции

#include<iostream>

int sum(int a, int b) {
  return a+b;
}

void swap(int &a, int &b) {
  a = a + b;
  b = a - b;
  a = a - b;
}

int main() {
  int a,b;
  cin >> a >> b;
  cout << sum(a,b) << " ";
  swap(a,b);
  cout << a << " " << b;
}


4. Для парсера

#include<iostream>
#include<string>

using namespace std;

int calcExp(string x);
int calcTerm(string x);
int calcElem(string x);

int calcN(string x) {
    int ans = 0;
    for(int i = 0; i < x.size(); i++) {
        ans *= 10;
        ans += x[i] - '0';
    }
    return ans;
}

int calcExp(string x) {
    int schet = 0;
    for(int i = x.size() - 1; i >= 0; i--) {
        if(x[i] == '(') schet--;
        if(x[i] == ')') schet++;
        if(x[i] == '+' and schet == 0) return calcExp(x.substr(0, i)) + calcTerm(x.substr(i+1, x.size() - i - 1));
        if(x[i] == '-' and schet == 0) return calcExp(x.substr(0, i)) - calcTerm(x.substr(i+1, x.size() - i - 1));
    //    if(x[i] == '*') return calcExp(x.substr(0, i)) * calcN(x.substr(i+1, x.size() - i - 1));
    }
    return calcTerm(x);
}

int calcTerm(string x) {
    int schet = 0;
    for(int i = x.size() - 1; i >= 0; i--) {
        if(x[i] == '(') schet--;
        if(x[i] == ')') schet++;
        if(x[i] == '*' and schet == 0) return calcTerm(x.substr(0, i)) * calcElem(x.substr(i+1, x.size() - i - 1));
    }
    return calcElem(x);
}

int calcElem(string x) {
    if(x[0] == '(') return calcExp(x.substr(1,x.size()-2));
    return calcN(x);
}

int main() {
    string input;
    cin >> input;
    cout << calcExp(input);
    return 0;
}

5. Структуры

#include<iostream>

using namespace std;

struct Name{
    int x;
    int y;
    Name(int a, int b) {
        x = a;
        y = b;
    }
    int sum() {
        return x+y;
    }
    void operator= (Name a) {
        x = a.x;
        y = a.y;
    }
};

Name operator+ (Name x, Name y) {
    return Name(x.x + y.x, x.y + y.y);
}

int main() {
    Name yet(1,2);
    yet = Name(2,3)+Name(3,4);
    cout << yet.sum() << endl;
}


6. Начало автоматов

#include<iostream>
#include<map>
#include<string>

using namespace std;

struct State{
    map<char, State*> paths;
    string name;
    bool end = false;
};

int main() {
//--------------------------------------------------
    map<char,int> data;
    data['a'] = 1;
    data['b'] = 2;
    for(auto i : data) {
        cout << i.first << " " << i.second << endl;
    }
    if(data.find('c') == data.end()) {data['c'] = 0;}
    cout << data['c'] << endl;
//--------------------------------------------------

    State begin;
    State* current = &begin;
    string str = "abaab";
    for(char i : str) {
        current = current -> paths[i];
    }
}


7. Продолжение автоматов

#include<iostream>
#include<map>
#include<string>

using namespace std;


int pust(int x, string& str);
int a(int x, string& str);
int ab(int x, string& str);
int abc(int x, string& str);
int abca(int x, string& str);
int abcab(int x, string& str);
int abcabb(int x, string& str);

int pust(int x, string& str) {
    if(x >= str.size()) {
        return -1;
    }
    if(str[x] == 'a') {
        return a(x+1, str);
    }
    return pust(x+1, str);
}
int a(int x, string& str) {
    if(x >= str.size()) {
        return -1;
    }
    if(str[x] == 'b') {
        return ab(x+1, str);
    }
    if(str[x] == 'a') {
        return a(x+1, str);
    }
    return pust(x+1,str);
}

int abcabb(int x, str) {
    return x - 5;
}

int main() {
    string input;
    cin >> input;
    int x = 0;
}


8. Алгоритм Ахо-Корасика

На примере ababb
Нам потребуются состояния всех префиксов (пустое, a, ab, aba, abab, ababb (конечное) ), расставим "очевидные" стрелки (из пустого по 'a'  в "a", из "a" по 'b' в "ab" и тд.)
Основная идея - суффикс-ссылки. Суффикс-ссылка должна вести в самый длинный нетривиальный суффикс, то есть
"a"       -> пустое,
"ab"     -> пустое,
"aba"   -> "a",
"abab" -> "ab".
Тогда имеет место следующая конструкция:
"строка-родитель" -буква-> "строка-дочь"
 суффикс-|-ссылка               суффикс-|-ссылка 
"строка-род-суф"   -буква-> "строка-суф-дочь"
Поэтому для пустой строки и первой буквы можем легко сделать переходы, а дальше сделать рекуррентно (то есть через предыдущие) : найти суффикс-ссылку, пройдя по нужной букве суффикс-ссылки родителя, и остальные буквы получить через суффикс ссылку.
Так мы получаем, что из состояния "abab" по букве 'а' нужно попасть в "aba", т.к. туда ведёт суффикс ссылка "ab" по букве 'а'

9. Сортировка Map по значениям

#include <iostream>
#include <algorithm>
#include <vector>
#include <map>

using namespace std;

bool CompareIt(pair<char, int> x, pair<char, int> y) {
    return x.second < y.second;
}

int main() {
    map<char, int> data;
    vector< pair<char, int> > a;
    int x;
    cin >> x;
    for(int i = 0; i < x; i++) {
        int y;
        cin >> y;
        data[i + 'a'] = y;
    }

    for(pair<char, int> i : data) {
        a.push_back(i);
    }

    sort(a.begin(), a.end(), CompareIt);
    sort(a.begin(), a.end(), [](pair<char, int> x, pair<char, int> y) {return x.second < y.second;});

    cout << a[1].first << " " << a[1].second;
}

10. Telegram боты

Обращение к боту происходит с помощью GET или POST запроса вида:

https://api.telegram.org/bot*токен_вашего_бота*/*название метода*?*параметр метода*=*значение*&*параметр метода*=*значение*...
К примеру: https://api.telegram.org/bot1234567890:AAAAaaA0aaAaaa0A0AAa0AaaAaaaa0aaAaa/sendMessage?chat_id=656597957&text=hello

Список всех методов есть в документации, но вам потребуются не все. Самые полезные:
1. getMe
- От сюда можно получить различную информацию о боте.
2. getUpdates?offset=*число*&timeout=*количество секунд*
- Без этого метода вы не сможете никак узнать, что вашему боту написали. Offset - номер последнего обработанного события, первый вызов можно сделать 0, но дальше вам нужно следить, какие события вы обработали, иначе сервер вам будет отправлять события, которые отправлял раньше. Timeout - количество секунд, которое сервер ждут, если нет событий. По окончанию сервер отправит пустой список событий.
3. sendMessage?chat_id=*число*&text=*текст*
- Отправляет сообщение человеку (или боту) с индентификатором chat_id с соотв. текстом.
4. https://core.telegram.org/bots/api#editmessagetext

Совершать запросы можно с помощью команды из библиотеки requests:

import requests


nachStroka = "https://api.telegram.org/bot5989105828:AAGBrnE2zfBgdy8Q5TKi3CpzVfxxn3shGsg"

def send(id, txt):
    result = requests.get(nachStroka+"/sendMessage?chat_id="+str(id)+'&text=' + txt)


#result = requests.get(nachStroka+"/sendMessage?chat_id=656597957&text=q")
offset = 0

while True:
result = requests.get(nachStroka+"/getUpdates?offset=" + str(offset) + '&timeout=100').json()
for update in result['result']:
    try:
        text = update['message']['text']
        id = update['message']['from']['id']
        if text[:6] == '/print':
            for x in text[6:].split():
                send(id,x)
    except KeyError:
        pass
    offset = update['update_id'] + 1


https://core.telegram.org/bots/api -Официальная документация, всегда в помощь.

Мой  chat_id=656597957