1

(0 відповідей, залишених у C#, .NET)

Доброго дня!
Написав tg-бота на C# (консольний додаток .net8.0) з використанням Telegram.Bot, Telegram.Bots.Extensions.Polling та System.Data.Sqlite – магазин, товари зберігаються у базі даних SQLite. Також фото товарів підтягуються фізично з папки на ПК (під ОС Windows), проте за потреби можу переробити щоб фото брались з мережі.
Чи є можливість безкоштовного хостингу бота на певному сервері? Бажано з покроковою інструкцією, бо вперше цим займаюсь.
Або можливо є інший варіант щоб бот працював 24/7 (крім постійної роботи ПК)?
Буду вдячний за пояснення.

Користувач в системі лише один, права, відповідно, повні.
Тека "C:\Users\*користувач*\Pictures\*папка з фото*".

Схожа програма з використання консолі має доступ на перейменування файлів в цій папці, але WPF-додаток ні.

Код консольної проги
using System;
using System.IO;

namespace RandomNamesGenerator
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Write path to folder with files to rename (like \"C:\\Users\\*Username*\\Pictures\"):");
            string folderPath = Console.ReadLine();
            IEnumerable<string> files = Directory.EnumerateFiles(folderPath);

            Console.WriteLine("If you want to rename all files in folder, than write \"all\"");
            Console.WriteLine("If you want to rename only specific files, write file extension (like \".png\")");
            Console.WriteLine("What files do you want to rename: ");
            string fileExtension = Console.ReadLine();

            foreach (string file in files)
            {
                FileInfo fileInfo = new FileInfo(file);
                if (fileExtension == "all") {
                    string finalFileName = Path.GetRandomFileName();
                    File.Move(file, $"{folderPath}\\{finalFileName}{fileInfo.Extension}");
                }
                else if (fileInfo.Extension == fileExtension){
                    string finalFileName = Path.GetRandomFileName();
                    File.Move(file, $"{folderPath}\\{finalFileName}{fileExtension}");
                }
            }
        }
    }
}

Доброго дня! Створюю програму з використанням WPF для надання файлам у певній папці рандомних імен.
Маю проблему – при виборі папки на диску С програма видає помилку System.UnauthorizedAccessException: 'Access to the path is denied.'. З папками не на диску С все працює.
Запуск ехе-файлу від імені адміністратора не допомагає. В "app.manifest" встановлював значення <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />, теж не допомагає.
Як можна вирішити цю проблему?

Ось код програми:

Прихований текст
private void Button_Click(object sender, RoutedEventArgs e)
{
    Microsoft.Win32.OpenFolderDialog dialog = new();

    dialog.Multiselect = true;
    dialog.Title = "Select a folder";

    // Show open folder dialog box
    bool? result = dialog.ShowDialog();

    string fullPathToFolder;

    // Process open folder dialog box results
    if (result == true)
    {
        // Get the selected folder
        fullPathToFolder = dialog.FolderName;
        DirectoryInfo d = new DirectoryInfo(fullPathToFolder);
        FileInfo[] infos = d.GetFiles();
        foreach (var file in infos)
        {
            string finalFileName = Path.GetRandomFileName();
            finalFileName = Path.ChangeExtension(finalFileName, null); // Remove the extension

            string newFilePath = Path.Combine(file.DirectoryName, finalFileName + file.Extension);

            if (!File.Exists(newFilePath)) // Check if the file with the new name exists
            {
                File.Move(file.FullName, newFilePath);
            }
        }
    }
}

4

(1 відповідей, залишених у C#, .NET)

Ось посилання на зображення:
https://kept.com.ua/55hg/Знімок_екрана_ … 164902.png
https://kept.com.ua/55hh/Знімок_екрана_ … 164311.png
(сайт довго не давав надіслати фото)

5

(1 відповідей, залишених у C#, .NET)

Доброго!
Маю таку проблему з моїм додатком у WPF – DropShadowEffect навколо Border по якійсь причині поступово "нарощується" і стає занадто жирним, на вигляд не тінь, а суцільна заливка кольором:

Прихований текст

https://kept.com.ua/55hc/Знімок_екрана_2024-02-20_164311.png

Хоча по задумці має бути таке:

Прихований текст

https://kept.com.ua/55he/Знімок_екрана_2024-02-20_164902.png

Маю такий же код для Border в декількох різних вікнах, у одному з них все в порядку, в інших двох отаке "нарощування".

Ось код XAML для цього вікна:

<Window x:Class="RegistrationForm.UserPageWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:RegistrationForm"
                mc:Ignorable="d"
        xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
        Title="Додаток для користувачів" Height="450" Width="800" WindowStartupLocation="CenterScreen">
    <Grid Background="#f6f7eb">
        <Border MinWidth="100" MaxWidth="500" Margin="15" Background="White" VerticalAlignment="Center" Padding="30" CornerRadius="10">
            <Border.Effect>
                <DropShadowEffect BlurRadius="30" Color="#e94f37" ShadowDepth="0" RenderingBias="Quality"/>
            </Border.Effect>
            <StackPanel>
                <TextBlock Text="Кабінет користувача" FontSize="30" Margin="0,0,0,20" FontWeight="Bold" HorizontalAlignment="Center" />
                <ListView Name="UserList" Margin="10">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <WrapPanel>
                                <TextBlock Text="{Binding Login}" FontWeight="Bold"/>
                                <TextBlock Text=" | "/>
                                <TextBlock Text="{Binding Email}"/>
                            </WrapPanel>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackPanel>
        </Border>
    </Grid>
</Window>

6

(15 відповідей, залишених у C++)

wander написав:

Як я розумію, ви працюєте виключно з Віндою і виходити за її межі поки не збираєтесь. Якщо це так, то навіщо вам зайві присідання з utf-8? Використовуйте utf-16 напряму, це кодування Віндовс використовує, як нативне. Все, що вам потрібно це задати правильний режим та користуватись широкими символами. Наприклад:

#include <fcntl.h>
#include <io.h>
#include <windows.h>
#include <iostream>

int main()
{
    _setmode(_fileno(stdout), _O_U16TEXT);
    _setmode(_fileno(stdin), _O_U16TEXT);

    std::wcout << L"Привіт" << std::endl;
    std::wcout << L"Hello" << std::endl;
}

Так, ви будете залежати від msvc runtime, але зате жодних зайвих перетворень кодувань.

Чи не складніше цей спосіб за просто один раз прописати SetConsoleOutputCP(CP_UTF8); ?
Так буде працювати з звичайним cout і не доведеться переписувати всі рядки в програмі на wcout та L""

7

(15 відповідей, залишених у C++)

Вирішив проблему
Таки допомогло встановлення SetConsoleOutputCP(CP_UTF8); – тепер правильний вивід укр.мови як у консолі, так і у вск (разом з і, ї і т.д.)

8

(15 відповідей, залишених у C++)

Я так розумію, потрібно додати SetConsoleСP(65001) SetConsoleOutputCP(65001) чи щось інакше?

9

(15 відповідей, залишених у C++)

Щодо виводу Р в консолі, виглядає ось так:

Прихований текст

https://i.ibb.co/yy5xKVd/image.png

10

(15 відповідей, залишених у C++)

Так, на моєму ПК 65001 кодова сторінка, на іншому ПК 866
Але хіба при SetConsoleСP(1251) SetConsoleOutputCP(1251) кодування не має змінюватись?

11

(15 відповідей, залишених у C++)

reverse2500 написав:

Яка ОС ?

Windows 10

12

(15 відповідей, залишених у C++)

Доброго дня!
Маю проблему з виводом тексту українською мовою. За якоїсь причини на моєму ПК навіть без встановленої setlocale та інших команд на зміну мови – українська працює, навіть і/ї/ґ, як в вск, так і в консолі! Та якщо запускати прогу на іншому пк, то виводиться битий текст (укр не працює).
Якщо я починаю вписувати setlocale(LC_ALL, "Ukrainian") , SetConsoleСP(1251), SetConsoleOutputCP(1251) – битий текст починає виводитись навіть на моєму пк, в вск і консолі.
Пробував дописувати #pragma execution_character_set("utf-8") та setlocale(LC_ALL, "Ukrainian") – в вск укр текст є, в консолі ні (на моєму пк просто виводе одну літеру Р і все, далі при вводі будь-чого завершає програму), на інших пк битий текст.
В консолі шрифти змінював (консолас/люціда) – все одно битий текст.

Код ось такий:

Прихований текст
#include <iostream>
#include <math.h>
#include <Windows.h>
#include <fstream>
#include <string>
#include <locale>

#pragma execution_character_set("utf-8")

using namespace std; // пакет імен стд
int main()
{
    setlocale(LC_ALL, "Ukrainian");
    // * змінні
    const double pi = asin(1.0) * 2; // арксинус від одиниці це пі/2, домножую на 2 і виходить пі
    double X = 0, Y = 0, steps = 0;
    int actions = 0, direction = 0, language = 0, engMenu = 0, ukrMenu = 0, exit = 0;
    // тут всюди виставляю 0, бо без прирівняння до - працює неправильно
    // * вибір мови
    do
    {
        cout << "Which language? " << endl
             << "1. Ukrainian" << endl
             << "2. English" << endl;
        cout << "Your language: ";
        cin >> language;
        // звичайне меню у циклі ду-вайл, яке буде запитувати ввести 1 чи 2 поки не ввести 1 чи 2
        switch (language)
        {
            // * ukrMenu
        case 1:
            cout << "Що ви хочете зробити? " << endl
                 << "1. Робота з текстовим файлом" << endl
                 << "2. Робота з консоллю" << endl
                 << "3. Перегляд інструкції" << endl
                 << "4. Зміна зовнішнього вигляду консолі" << endl
                 << "5. Вихід з програми" << endl;
            cout << "Вибрано пункт: ";
            cin >> ukrMenu;

            switch (ukrMenu)
            {
            // * ukrFile
            case 1:
            {
                ifstream cin("mapa.txt");   // відкриваю файл на читання
                ofstream cout("skarb.txt"); // відкриваю файл на вивід

                if (!cin.is_open())
                {
                    cerr << "You don't have «mapa.txt»!" << endl;
                    return 1;
                }
                // якщо файлу "мапа.тхт" не існує, то видає помилку і закриває прогу
                if (!cout.is_open())
                {
                    cerr << "You don't have «scarb.txt»!" << endl;
                    return 1;
                }
                // якщо файлу "скарб.тхт" не існує, то видає помилку і закриває прогу

                cin >> actions;

                for (int i = 1; i <= actions; i++)
                {
                    cin >> direction >> steps;

                    X = X + sin(pi / 4 * (direction - 1)) * steps; 

                    Y = Y + cos(pi / 4 * (direction - 1)) * steps;
                }

                if (abs(X) < 0.001)
                    X = 0;
                if (abs(Y) < 0.001)
                    Y = 0;

                cout.precision(3); // amount of numbers after the comma
                cout << fixed << "Скарб знаходиться за координатами: " << endl
                     << X << " " << Y << endl;

                cin.close();
                cout.close();
                cout << "Координату обраховано, закриваю програму..." << endl;

                break;
            }

                // * ukrConsole
            case 2:
            {
                cout << "Введіть кількість дій: ";
                cin >> actions;
                cout << "Кількість дій: " << actions << endl;

                for (int i = 1; i <= actions; i++)
                {
                    cout << "Введіть напрямок і кількість кроків: ";
                    cin >> direction >> steps;

                    X = X + sin(pi / 4 * (direction - 1)) * steps;
                    Y = Y + cos(pi / 4 * (direction - 1)) * steps;
                }

                if (abs(X) < 0.001)
                    X = 0;
                if (abs(Y) < 0.001)
                    Y = 0;

                cout.precision(3);
                cout << "Скарб знаходиться за координатами: " << X << " " << Y << endl;
                break;
            }
                // * ukrInstruction
                // ! хотілось би зробити якісь бордери для нормальної читабельності тексту
                // ? наче зробив більш-менш
            case 3:
            {
                cout << "Інструкція:" << endl
                     << "Знайти закопаний піратами скарб просто: все, що для цього потрібно – це карта. Як відомо, пірати зазвичай малюють карти від руки і описують алгоритм знаходження скаобу так:\n«Встаньте спиною близько самотньої пальми. Пройдіть тридцять кроків у бік лісу, потім сімнадцять кроків у бік озера, ..., нарешті десять кроків в бік великого кругляка. Скарб знаходиться під ним».\nВелика частина таких вказівок просто зводиться до проходження певної кількості кроків в одному з восьми напрямків (1 - північ, 2 - північний схід, 3 - схід, 4 - південний схід, 5 - південь, 6 - південний захід, 7 - захід, 8 - північний захід). Довжина кроку в будь-якому напрямку дорівнює 1." << endl
                     << "\nПри виборі відповідного пункту меню ви зможете: " << endl
                     << "\n1. Працювати з файлами. Програма зчитує дані з файлу mapa.txt. У нього ви маєте завчасно ввести необхідні для правильної роботи програми дані у такому форматі:\nУ перший рядок вводиться кількість вказівок (число від 1 до 40), далі у певну кількість рядків, відповідно кількості вказівок, через Enter вказується напрям руху (цифру від 1 до 8) та кількість кроків у цьому напрямку (від 1 до 1000). Вказівки мають вводитись у форматі «напрям_руху [пробіл] кількість_кроків». У файлі skarb.txt ви побачите відповідь – кінцеву координату скарбу." << endl
                     << "\n2. Робота з консоллю. Працюючи за допомогою консолі, відповідно до тексту-запиту, ви вводите необхідні дані (вказівки – від 1 до 40, напрям руху – цифру від 1 до 8, кількість кроків у цьому напрямку – від 1 до 1000). Формат вводу даних – «напрям_руху [пробіл] кількість_кроків». Кінцева координата теж виводиться у консоль." << endl
                     << "\n3. Перегляд інструкції до програми. При виборі цього пункту меню ви маєте можливість прочитати інтструкцію, яка пояснить вам як правильно користуватись програмою." << endl
                     << "\n4. Зміна зовнішнього вигляду консолі. Ви маєте можливість змінити зовнішній вигляд консолі: колір фону (обираєте потрібний номер з списку), колір шрифту (обираєте потрібний номер з списку), розмір шрифту." << endl
                     << "\n5. Вихід з програми. При виборі даного пункту здійснюється вихід з програми" << endl;
                break;
            }
            case 5:
            {
                cout << "Закриваю програму..." << endl;
                //? Краще зразу закривати чи через паузу?
                system("PAUSE");
                return 0;
            }
            default:
                cout << "Просто напишіть 1, 2, 3, 4 чи 5!" << endl;
            }
            system("PAUSE");
            return 0;

        // * engMenu
        case 2:
        {
            cout << "Do you want to work with text file or with console? " << endl
                 << "1. Work with files" << endl
                 << "2. Work with the console" << endl
                 << "3. View the instructions for the program" << endl
                 << "4. Changing the appearance of the console" << endl
                 << "5. Exit the program" << endl;
            cin >> engMenu;

            switch (engMenu)
            {
            // * engFile
            case 1:
            {
                ifstream cin("mapa.txt");
                ofstream cout("skarb.txt");

                if (!cin.is_open())
                {
                    cerr << "You don't have «mapa.txt»!" << endl;
                    return 1;
                }
                // якщо файлу "мапа.тхт" не існує, то видає помилку і закриває прогу
                if (!cout.is_open())
                {
                    cerr << "You don't have «scarb.txt»!" << endl;
                    return 1;
                }
                // якщо файлу "скарб.тхт" не існує, то видає помилку і закриває прогу

                cin >> actions;

                for (int i = 1; i <= actions; i++)
                {
                    cin >> direction >> steps;

                    X = X + sin(pi / 4 * (direction - 1)) * steps;

                    Y = Y + cos(pi / 4 * (direction - 1)) * steps;
                }

                if (abs(X) < 0.001)
                    X = 0;
                if (abs(Y) < 0.001)
                    Y = 0;

                cout.precision(3); // amount of numbers after the comma
                cout << fixed << "Coordinates of treasure: " << endl
                     << X << " " << Y << endl;

                cin.close();
                cout.close();
                cout << "The coordinate is calculated, closing the program..." << endl;

                break;
            }
            // * engConsole
            case 2:
            {
                setlocale(LC_ALL, "English");
                cout << "Enter amount of actions: ";
                cin >> actions;
                cout << "Amount of actions: " << actions << endl;

                for (int i = 1; i <= actions; i++)
                {
                    cout << "Enter direction and steps: ";
                    cin >> direction >> steps;

                    X = X + sin(pi / 4 * (direction - 1)) * steps;
                    Y = Y + cos(pi / 4 * (direction - 1)) * steps;
                }

                if (abs(X) < 0.001)
                    X = 0;
                if (abs(Y) < 0.001)
                    Y = 0;

                cout.precision(3);
                cout << "Treasure: " << X << " " << Y << endl;
                break;
            }
            // * engInstruction
            case 3:
            {
                cout << "Instruction: " << endl
                     << "Finding treasure buried by pirates is simple: all you need for this is a map. As you know, pirates usually draw maps by hand and describe the algorithm for finding a treasure as follows:\n«Stand with your back near a lonely palm tree. Walk thirty paces towards the forest, then seventeen steps towards the lake, ..., finally ten steps towards the big log. The treasure is under it».\nMost of these instructions simply boil down to taking a certain number of steps in one of eight directions (1 - north, 2 - north-east, 3 - east, 4 - southeast, 5 - south, 6 - southwest, 7 - west, 8 - northwest). The length of a step in any direction is equal to 1." << endl
                     << "\nBy choosing the appropriate menu item, you can: " << endl
                     << "\n1. Work with files. The program reads data from the mapa.txt file. In it, you must enter in advance the data necessary for the correct operation of the program in the following format:\nThe number of instructions is entered in the first line (a number from 1 to 40), then in a certain number of lines, according to the number of instructions, the direction of movement (a number from 1 to 8) and the number of steps in this direction (from 1 to 1000) are indicated through Enter. Directions should be entered in the format «direction_of_movement [space] number_of_steps». In the file skarb.txt you will see the answer - the final coordinate of the treasure." << endl
                     << "\n2. Work with the console. Working with the console, in accordance with the text-request, you enter the necessary data (directions - from 1 to 40, direction of movement - a number from 1 to 8, number of steps in this direction - from 1 to 1000). The data input format is «direction_of_movement [space] number_of_steps». The final coordinate is also output to the console." << endl
                     << "\n3. View the instructions for the program. When choosing this menu item, you have the opportunity to read an instruction that will explain to you how to use the program correctly." << endl
                     << "\n4. Changing the appearance of the console. You can change the appearance of the console: background color (select the desired number from the list), font color (select the desired number from the list), font size." << endl
                     << "\n5. Exit the program. Selecting this item exits the program" << endl;
                break;
            }
    // * engExit
            case 5:
            {
                cout << "Closing the program..." << endl;
                //? Краще зразу закривати чи через паузу?
                system("PAUSE");
                return 0;
            }
                    // * engDefault
            default:
                cout << "Just print 1, 2, 3, 4 or 5!" << endl;
            }
            break;
        }
               // * just default
        default:
            cout << "Just print 1 or 2!" << endl;
        }
    } while (language != 2);
    system("PAUSE");
    return 0;
}

Є якесь вирішення цієї проблеми без танців з бубоном на кожному окремому пк чи все ж доведеться прибрати можливість зміни мови і працювати лише з англійською?(

13

(3 відповідей, залишених у C++)

koala написав:

Ви неправильно прочитали умову і вже все зробили.

Trap_o написав:

елемент якого дорівнює максимальному з елементів масивів A і B з тим самим індексом

Тобто елемент з індексом i (C[i]) має дорівнювати максимальному з A[i] та B[i]. Точно як у вас.

Якщо ж ви хочете зробити так, як ви описали, то вам треба спершу знайти максимальний елемент в обох масивах A та B, а потім, в окремому циклі, заповнити ним усі елементи масиву C.

Ну і в else можна вже не перевіряти умову. Якщо aArray[i] >= bArray[i] не виконується, то точно виконуватиметься bArray[i] >= aArray[i]. Без варіантів.

Дякую за підказку, зрозумів в чому помилка була

14

(3 відповідей, залишених у C++)

Доброго дня! Є завдання — "Дано два масиви A і B однакового розміру N. Сформувати новий масив C того ж розміру, кожен елемент якого дорівнює максимальному з елементів масивів A і B з тим самим індексом."
Як мені заповнити масив С найбільшим значеннями? Я можу виділити під кожен індекс максимальне значення з пари.
Наприклад:

A: 41 85 72 38 80 69 65 68 96 22
B: 49 67 51 61 63 87 66 24 80 83
C: 49 85 72 61 80 87 66 68 96 83

А як заповнити С лише "самим" максимальним значенням з двох масивів? У даному випадку це має бути 96. Тобто у результаті:

A: 41 85 72 38 80 69 65 68 96 22
B: 49 67 51 61 63 87 66 24 80 83
C: 96 96 96 96 96 96 96 96 96 96

Поки що код маю такий:

printf("Enter the number of elements: ");
            scanf("%d", &elementsNumber);
            int aArray[elementsNumber], bArray[elementsNumber], cArray[elementsNumber];

            for (i = 0; i < elementsNumber; i++)
            aArray[i] = rand() % 101;

            printf("\nA: ");
            for (i = 0; i < elementsNumber; i++){
            printf("%d ", aArray[i]);
        }
            for (i = 0; i < elementsNumber; i++)
            bArray[i] = rand() % 101;

            printf("\nB: ");
            for (i = 0; i < elementsNumber; i++){
            printf("%d ", bArray[i]);  
        }
        for(i = 0; i < elementsNumber; i++){
            if(aArray[i] >= bArray[i]){
                cArray[i] = aArray[i];
            }else if(bArray[i] >= aArray[i]){
                cArray[i] = bArray[i];
            }
            maxElement = cArray[0];
            if (cArray[i] > cArray[maxElement]){
                    maxElement = cArray[i];
                }   
            }
        
        printf("\nC: ");
        for (i = 0; i < elementsNumber; i++){
            printf("%d ", cArray[maxElement]);
        }

15

(5 відповідей, залишених у C)

lucas-kane написав:

У задачі нічого не говориться про генерування чисел. У вас є числова послідовність із непарних чисел. Оголошуй лічильник i=1, а далі в кожній ітерації прибавляй 2-ку.

Тобто це тоді просто буде цикл, який буде писати непарні числа вплоть до N, не як масив?

16

(5 відповідей, залишених у C)

Я розумію як це зробити з масиву вже завчасно заданої довжини і рандомних чисел — але не розумію як з масиву, довжина якого задається вже самим користувачем при вводі з клави

Доброго дня
Стоїть така задача: дано ціле число N (>0). Треба сформувати і вивести цілий масив розміру N, який містить N перших позитивних непарних чисел (1, 3, 5 і т.д.)
Взагалі, чесно кажучи, не можу зрозуміти як це реалізувати)
Варіант є хіба такий:

const int N = 10;
int main()
{
    int i, number, A[N];

    printf("Vvedite massiv A = ");
    scanf("%d ", &N);
    for (i = 0; i < N; i++)
    {
        A[i] = 0+rand()%15;
    }
    printf("Massiv:\n"); 
    for ( i = 0; i < N; i++ )
    {
        printf("%d", A[i]);
    }
    for ( i = 0; i < N; i++ )
    {
        if (A[i]%2 != 0)
        {
            printf("%d", A[i]);
        }
    }
}