Necromancer IT
30 subscribers
196 photos
1 video
38 files
18 links
Библиотека из набросков кода разных тематик.

Админ: @KostRs

Сайт-визитка Palma - https://palmaluv.github.io/palma.github.io

Чат - https://t.me/+U8YZeTKdpnKxEG8t
Download Telegram
Всем хай спустя почти год.. Я поступил на нужную специальность и все же начал учиться. ВУЗ конечно не из лучших но и не нереально плохой. Но есть но. Мы учим СИ. Он по сути умер но мы обязаны его изучать и использование некоторого функционала оттуда обязательно. Я время от времени буду присылать сюда свой код. Недавно изучал массивы и пытался выполнять некоторые действия с ними. Все вроде бы проучилось. Потому я и решил это сделать. Да и неудобно что пропал настолько😅
Потому такие дела. Постараюсь проявлять хоть какой-то актив, и видя то что я делаю, думаю смогу помочь всм в вопросах касающихся того что я знаю, если таковы будут. А на повестке дня, как я уже говорил массивы. В коде будет их создание, вывод, сортировка пузырьком, нахождение четных элементов массива, их количества и рандомный выбор чисел. Все действия которые выполняются описалы в функции вывода(printf). Код рабочий и проверить его работу запросто можно при помощи Visual Studio или других компиляторов. Когда пытаюсь что-то сделать на телефоне использую Dcoder, вполне калссное приложение. Итак, вот код:

#include <cmath>
#include <math.h>
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <cstdlib>
const int N = 11; //постоянная переменная которая =11
using namespace std; // языки ON

int main(){
int i, j, a, b, min = N, max = 0, remn_t = 0, remn = 0, mass[11] = {0}, mass_j[11] = {0}; //введение глобальных переменных
setlocale(LC_ALL, "Russian"); //русский on
srand(time(NULL)); // +рандом

printf("Элементы массива:\t");
for (i = 0; i < N; i = i + 1) {
mass[i] = rand()%N;
printf("%i\t", mass[i]);
} //создал массив благодаря рандому. Числа от 0 до 10, их всего 10


for (j = 0; j < N; j = j + 1) {
mass_j[j] = j;
} //массив для перебора. Числа от 1 до 10, тоесть все возможные в нашем массиве

printf("\n\nМассив без повторений:\t");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (mass_j[i] == mass[j]) {
printf("%i\t", mass_j[i]);
break;
}
}
} //провера на повторение

printf("\n\nЧетные элементы:\t");
for (i = 0; i < N; i = i++) {
if (mass[i] % 2 == 0 && mass[i] != 0) { //проверка на четность каждого числа и вывод в конце
remn = remn + 1; //кол-во
printf("%i\t", mass[i]);
}
}
printf("\n\nКоличество четных элементов: %i\t", remn);

printf("\n\nЭлементы кратные 3:\t");
for (i = 0; i < N; i = i + 1) {

if (mass[i]%3 == 0 && mass[i] != 0) {
remn_t = remn_t + 1;
printf("%i\t", mass[i]);
}
}
printf("\n\nКоличество элементов кратных 3: %i\t", remn_t); //цикл подобный проверке на четность

printf("\n\nСортировка массива: \t");
for (int i = N - 1; i >= 0; i--) {
b = 1;
for (int j = 0; j < i; j++) {
if (mass[j + 1] < mass[j]) {
a = mass[j];
mass[j] = mass[j + 1];
mass[j + 1] = a;
b = 0;
}
}
if (b == 1) {
break;
} //сортировка пузырьком путем проверки того больше ли след элемент массива. Если нет то номер первого элемента на 1 больше. Сам не до конца пока понял как работает

}
for (int i = 0; i < N; i++) {
printf("%i\t", mass[i]);
} //вывод результата сортировки

printf("\n\nсортировка массива без повторений:\t");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (mass_j[i] == mass[j]) {
printf("%i\t", mass_j[i]);
break;
}
}
} //убираем повторения чисел

printf("\n\nРазность наибольшего и наименьшего элемента: "); //если бы не было сортировки
for (i = 0; i < N; i++) {
if (mass[i] < min) {
min = mass[i];
}
if (mass[i] > max) {
max = mass[i];
}
} //тут собственно проверяется каждый элемент и если какой-то другой меньше или больше его то он становится, соответственно миримумом или максимумом
int res = max - min;
printf("\t%i - наибольший, \t%i - наименьший, \t%i - разница \n", max, min, res); //сам вывод
return(0);
}


Благодарствую за внимания, вот то что я хотел сказать сегодня. Пока что буду изучать все по программе,
Немного дискретной математики в студию.

#include<iostream>
#include<time.h>
#include<stdio.h>
#include<cstdlib>
#include<string.h>

using namespace std;

int main() {
srand(time(NULL));
int a, b, c, d, e, num, len;
char str[100];
num = 0;
while (num < 20) {
for (int i = 0; i < 8; i++) {
a = 97 + rand() % 4;
str[i] = a;
}
b = 3 + rand() % 8;
str[b] = '\0';
c = 0;
d = 0;
e = 0;
len = strlen(str);
if (*(str + len - 1) == 'c' && *(str + (len - 2)) == 'b') {
for (int i = 0; i < len; i++) {
if (*(str + i) == 'a') {
c++;
}
if (*(str + i) == 'a'){
d++;
if (*(str + i + 1) != 'b') {
d--;
}
}
if (*(str + i) == 'b') {
e++;
if (*(str + i + 1) != 'a') {
e--;
}
}
}
}
if (c == 2 && d == 0 && e == 0) {
printf("%s\n", str);
num++;
}
}
}

Этот код был нужен мне для создания букв в определенном количестве для нахождения возможных комбинаций букв по заданным правилам(Содержит ровно два символа «а», заканчивается на
«bс» и символы «а» и «b» не стоят рядом).
Состоит он из:
1) Создание переменных и символьного массива. Число 100 появилось из-за формата юникод, который Дает символам номера. Например a = 97, b = 98, c = 99. Именно эти символы и соответствующие им цифры я взял в пример ТК в коде используются они. При этом рандомное количество символов будет пустым.
2) Проверка условия через перебор всех элементов массива. Точно не пойму зачем нужны звездочки. Точно знаю что если использовать 2 "тела" кода(Н: int main) то переменные никак не могут взаимодействовать. Но если использовать * то с определенными переменными это сделать можно.
Тут я проверяю два ли а в массиве, не стоят ли рядом а и b. При этом я постарался сделать малое количество переменных и если соответствий с тем что не надо нет то переменная будет 0.
3) Проверяю выполнились ли необходимые для меня условия и вывожу массив.

Цикл повторится столько раз сколько нужно и все работает правильно. Но тут нет уборки повторений и мне это не очень нравится. Но в принципе можно было создать динамический массив из имеющихся массивов и добавлять к нему все полученные, удовлетворяющие условия массивы и каждый раз находя необходимый массив проверять нет ли такого же. В теории думаю это возможно но в данный момент на это нет времени. если знаете зачем тут была необходима * скажите пожалуйста. И будет интересно посмотреть если кто-то сделает код в котором не будет повторов. Такие дела на данный момент. В ближайшее время буду делать графики и я откровенно был в шоке что в консоли можно что-то нарисовать попиксельно. Вы его здесь увидите как только я его осилю
(PS: ничего не понял, разберусь потом)
Небольшой пост по функциям в С++

#include<cmath>
#include<iostream>

double a(double x) {
double a1 = 3 * x - 2 * pow(cos(x), 3);
printf("%f\n", a1);
return a1;
}

double b(double x) {
double b1 = log10(x) + 2 * exp(x);
printf("%f\n", b1);
return b1;
}

double c(double x) {
double c1 = pow(x, 1 / 3) + 4 * x - 1;
printf("%f\n", c1);
return c1;
}

double h(double a1, double b1) {
double h1 = 3 * pow(a1, 2) + 4 * b1 - 8;
printf("%f\n", h1);
return h1;
}

int main() {
double a1, b1, c1, h1, x = 0.3;
printf("a = ");
a1 = a(x);
printf("\nb = ");
b1 = b(x);
printf("\nc = ");
c1 = c(x);
printf("\nh = ");
h1 = h(a1, b1);
}

Итак, не смотрите в начале ни на что кроме main, это самое важное. Функции не выполняются до тех пор пока мы не вызовем их через него. Что мы видим? Для начала создаются переменные которые примут значения функций и, собственно, икс, значение которого неизменно, можно это изменить при помощи cin/scanf. Позже мы вызываем функцию и выбираем какие значения мы в нее передаем. То есть у меня для a1 b1 и c1 это х, для h1 это значения из предыдущих функций. По условию.
В самих же функциях мы должны в скобках указать тип аргумента. В моем случае это double x/a1,b1 и ту переменную которую функция возвращает(return).
Но что мы видим в конце? То есть почему я создал переменные a1, b1, c1 и h1? Дело в том что те a1, b1, c1 и h1 которые возвращаются с функций являются локальными, фактически у нас есть по две каждой из этих переменных. Те которые есть в мейн, передались и использовались и те, которые возвратились. Нам обязательно нужно присваивать переменным результаты функции. Результат если мы просто их вызовем будет, но он будет не правильным, почему точно не скажу.
За последнее время я начал учиться писать максимально компактный код, результат которого должен определенно, как минимум меня удовлетворять. При этом стоит не терпеть ни одного восклицательного знака. Часто, хоть програма и работает, но результат получается не правильным, потому стоит придираться к себе, не подключать лишние библиотеки, не создавать лишние переменные, писать красивый и понятный код и, конечно же писать комментарии к своему коду.
Позже разберу небольшой код по указателям. Не уверен когда это будет но это точно будет.
Всем всего хорошего)
#include <iostream>

using namespace std;

int main() {
setlocale(LC_ALL,"Russian");
system("chcp 1251"); // настраиваем кодировку консоли, она не хотела нормально выводить русский

int str_len = 1000, space = 0, num = 0, spacecord[40], bufL = 0, end = 0;
char* str = new char[str_len];

std::cout << "Введите предложение: " << std::endl;
std::cin.getline(str, str_len);

int lenW = strlen(str);
char *bufer = new char[str_len];

for (int i = 0; i < lenW; i++) {

if (str[i] == ' ') {
spacecord[space] = i;
space++;

if (space == 1) {
end = i;
}
}
}

int wordend = lenW;

for (int i = space; i > 0; i--) {
int wordbegin = spacecord[i - 1];

for (int j = 0; j < lenW; j++) {

if (wordend > j && j >= wordbegin) {
bufer[bufL] = str[j];
bufL++;
}
}

wordend = spacecord[i-1];
}

bufer[bufL] = ' ';
bufL++;

for (int i = 0; i <= end; i++) {
bufer[bufL] = str[i];
bufL++;
}

cout << "\n";

for (int i = 1; i < lenW + 1; i++) {
cout << bufer[i];
}

return 0;
}



Добрый вечер, у меня есть код и я давно не появлялся, сейчас мы его разберем. Этот код переставляет слова в обратном порядке. Если вкратце мы находим пробелы, имеем 2 буквенных массива, и благодаря бегункам которые определяют начало и конец слова мы копируем каждое слово, вставляем его для конечного результата и ставим пробел по некоторым причинам. А теперь поконкретнее:
Подрубаем локализацию и основную библиотеку, создаем переменные для определения максимального размера предложения и максимального количества пробелов. По желанию можно хоть 10к, зависит от оперативки и там и там поставить(spacecord, str_len(Учим инглиш)). Далее у нас идет переменная которая является счетчиком количества пробелов(num), создаем переменную bufL, для чего скажу потом. После чего создаем динамический массив с максимальной длинной которую мы задали.
Потом просим человека ввести предложение и даем такую возможность, при помощи getline пихаем данные в массив(для более детальной инфы об этой штуке гуглим справочники), находим длину массива при помощи str_len и помещаем эту инфу в переменную, создаем буфер в котором мы получим конечный результат. Дальше веселее.
А дальше у нас идет цикл который определяет координаты пробелов. Мы помещаем значение "i" благодаря которому мы перерываем весь массив в ячейку массива с кордами и идем от 0 до последнего пробела, попутно у нас щелкает счетчик, потом это пригодится.
Итак один из трех циклов позади, перед вторым мы создаем переменную которая будет кордами конца предложения и будем использовать ее в цикле. Точнее в двух. Итак, что же этот крокодил из себя представляет. Тут мы определяем слово благодаря пробелам, находим начало слова, просто благодаря тому что берем последний пробел, кстати цикл идет на уменьшение, тоесть мы берем пробелы с конца. Переменная wordbegin - логично что начало слова. Потом у нас идет второй цикл. В нем мы каждый раз будем проверять относится ли элемент того что ввел пользователем тому слову которое мы ищем, напоминаю, постоянно проверяем с конца. После нахождения соответствий пихаем слово в наш буфер, проверка номера элементов происходит при помощи bufL, которую мы каждый раз увеличиваем и таким образом все вводится правильно.
Далее мы ставим пробел в конце нашего буфера, ведь никто не ставит пробел в конце предложения(Это наш маленький секрет) и увеличиваем bufL на 1.
Предпоследним циклом мы вставляем последнее слово. И тут нам пригодилась переменная end. Мы просто берем отчет от 0 до пробела и вставляем это в конец нашего массива.
В самом конце просто выводим посимвольно, используя длину строки. Если не использовать то может добавлять и раскидывать символы.

Можно еще выделиться умом и сообразительностью и вместо вывода пихнуть функцию. Например:

print(lenW, bufer);

Тогда сверху прописываем:

char print(int lenW, char* bufer) {

cout << "\n";

for (int i = 1; i < lenW + 1; i++) {
cout << bufer[i];
}
return 0;
}
#include <iostream>
#include <thread>
#include <windows.h>

using namespace std;

void func() {
HWND hwnd = GetConsoleWindow();
HDC hdc = GetDC(hwnd);
int a = 1;
double y;
for (double x = -500; x < 500; x = x + 0.001) {
if (a * pow(x, 3) > 0) {
y = a * pow(x, 3);
SetPixel(hdc, sqrt(a * pow(x, 3)), x + 200, RGB(255, 0, 0));
}
else {
SetPixel(hdc, sqrt(abs(a * pow(x, 3))), x + 200, RGB(0, 255, 0));
y = a * pow(x, 3);
}
if (x == 499) {
cin.get();
}
}
}

int main () {
setlocale(LC_ALL, "ru");

thread thread_func(func);
thread_func.join();
cin.ignore();
return 0;
}
#include <iostream>
#include <thread>
#include <mutex>
#include <windows.h>

std::mutex f_mutex;

HWND hwnd = GetConsoleWindow();
HDC hdc = GetDC(hwnd);
int a = 1;

using namespace std;

void func1(double x) {
f_mutex.lock();
double y;
y = a * pow(x, 3);
SetPixel(hdc, sqrt(a * pow(x, 3)), x + 200, RGB(255, 0, 0));
y = 0;
f_mutex.unlock();
}

void func2(double x) {
f_mutex.lock();
double y;
y = a * pow(x, 3);
SetPixel(hdc, sqrt(abs(a * pow(x, 3))), x + 200, RGB(0, 255, 0));
y = 0;
f_mutex.unlock();
}

void consumer() {
for (double x = -50; x < 50; x = x + 0.001) {
if (a * pow(x, 3) > 0) {
std::thread f(func1, std::ref(x));
f.join();
}
else {
std::thread f2(func2, std::ref(x));
f2.join();
}
if (x == 499) {
cin.get();
}
}

}

int main() {
std::thread create(consumer);
create.join();
return 0;
}
Добрый вечер. Решил все же залить чтото стоящее из того что написал и сделать разбор. В этот раз разбор будет в коментах кода. Вкратце - змейка в консоли личного приготовления. Планирую оптимизацию и улучшение кода проекта Со временем. Инновации так же разберу. Вот код

#include <iostream>
#include <windows.h> // Библиотека винды
#include <conio.h> // Символьная библиотека для kbhit

enum move_sides { // Более простое определение направления движения
MOVE_UP,
MOVE_DOWN,
MOVE_RIGHT,
MOVE_LEFT,
MOVE_STOP
} direction;

const int map_size = 20; // Эта строка и дальше глобальные переменные использующиеся во всех функциях

int head[1][2];
int body[map_size * map_size][2];
bool game_over = false;
int fruit_cord[1][2];
int lenth_snake;

void fruit_generation() { // Генерация фрукта при помощи рандомайзера и повторная попытка генерации после совпадения с телом или головой
again:
fruit_cord[0][0] = rand() % map_size + 1;
fruit_cord[0][1] = rand() % map_size + 1;
for (int i = 0; i < lenth_snake; i++) {
if (fruit_cord[0][0] == body[i][0] && fruit_cord[0][1] == body[i][1] fruit_cord[0][0] == head[i][0] && fruit_cord[0][1] == head[i][1]) {
goto again;
}
}
}

void preset() { // Сбросил сюда начальные параметры для удобства и их инициализацию
fruit_generation();
head[0][0] = map_size / 2;
head[0][1] = head[0][0];
direction = MOVE_STOP;
lenth_snake = 0;
}

void input() { // kbhit - проверка факта нажатия клавиши getch - берем символ который нажали и при помощи кейсов меняем сторону движения(условно)
if (_kbhit()) {
switch (_getch()) {
case 'w':
direction = MOVE_UP;
break;

case 's':
direction = MOVE_DOWN;
break;

case 'a':
direction = MOVE_LEFT;
break;

case 'd':
direction = MOVE_RIGHT;
break;
}
}
}

void logic() {
bool ismoved = false;
int iteration = lenth_snake;

if (head[0][0] == fruit_cord[0][0] && head[0][1] == fruit_cord[0][1]) { //Если съеден фрукт(корды головы == корды фрукта)
fruit_generation();
if (lenth_snake == 0) {
body[lenth_snake][0] = head[0][0]; body[lenth_snake][1] = head[0][1]; // Если элемент первый то присваиваем корды головы
}
else {
body[lenth_snake][0] = body[lenth_snake - 1][0]; body[lenth_snake][1] = body[lenth_snake - 1][1]; // Если не первый присваиваем корды последнего элемента
}
ismoved = true;
lenth_snake++;
}

if (ismoved == true) {
iteration--;
}

for (int i = iteration; i >= 0; i--) { // Логика движения
if (lenth_snake >= 1 && i == 0) {
body[0][0] = head[0][0]; body[0][1] = head[0][1];
}
if (i > 0) {
body[i][0] = body[i - 1][0]; body[i][1] = body[i - 1][1];
}
}

switch (direction) // Фактическая смена кордов головы для передвижения
{
case MOVE_UP:
head[0][1]--;
break;
case MOVE_DOWN:
head[0][1]++;
break;
case MOVE_RIGHT:
head[0][0]++;
break;
case MOVE_LEFT:
head[0][0]--;
break;
}
for (int i = iteration; i >= 0; i--) { // Проверка не врезалась ли голова в тело
if (body[i][0] == head[0][0] && body[i][1] == head[0][1]) {
game_over = true;
}
}
if (head[0][0] > map_size head[0][0] < 0 head[0][1] > map_size head[0][1] < 0) { // Проверка не врезалась ли голова в стену
game_over = true;
}
}

void drаw() { // Расстановка символов если совпали корды головы то голова, если корды тела то тело, если ничего то пробел
for (int i = 0; i < map_size + 2; i++) {
for (int j = 0; j < map_size + 2; j++) {
3
#include <iostream>
#include <winsock2.h> // тот самый носок
#include <iostream>
#include <cstdlib>
#pragma comment (lib, "ws2_32.lib") // надо загуглить
#pragma warning(disable: 4996)

int main() {
WSAData wsadata; //подрубаем структуру носка
WORD DLLVersion = MAKEWORD(2, 1); // Запрашивание второй версии носка
//WSAStartup(DLLVersion, &wsadata); // Подруб структуры и версии носка
if (WSAStartup(DLLVersion, &wsadata) != 0) { // чек подключен ли носок
std::cout << "Error of setup sock" << std::endl;
exit(1);
}
SOCKADDR_IN addr; // Адрес носка
addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Хранит айпишник сети
addr.sin_port = htons(1111); // подключаемся к определенному порту компа для передачи данных, главное чтобы он не был занят
addr.sin_family = AF_INET; // семейство протоколов инета
SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL); // создание сокета, что такое сокет можно загуглить. это слово еще используется в характеристиках процов
bind(sListen, (SOCKADDR*)&addr, sizeof(addr));// привязка адреса к сокету
listen(sListen, SOMAXCONN);// Прослушка порта в ожидании подключения клиента
SOCKET newConnection;//Сокет для удержания связи с клиентом
int InaddrSize = sizeof(&addr);
newConnection = accept(sListen, (SOCKADDR*)&addr, &InaddrSize); // разрешение соединения с клиентом
// addr можно использовать для доступа к серверу по айпи
if (newConnection == 0) { // Проверка соединения
std::cout << "Error of connection" << std::endl;
}
else {
std::cout << "Connection of client successful" << std::endl;
}
char m[256] = "Server sent message to client";
send(newConnection, m, sizeof(m), NULL);// отправка переменной с данными
system("pause");
return 0;
}