Ответы пользователя по тегу C++
  • Как правильно сделать условие для прохождения символом по спирали в матрице?

    Sergomen
    @Sergomen Автор вопроса
    Просто делай добро и оно вернётся
    Хоть и решил но кажется по-дибильному.

    Суть в том что создается матрица в которую сначала записываются '*' по спирали начиная снизу-слева и на каждом повороте вместо '*' записывается '1' и в конце заполнения запоминается координаты последней '*'.

    Потом происходит почти то же самое но с отличием в том что теперь '*' выводится по координатам на экране начиная с этих последних координат; когда ячейка матрицы == '1' делается поворот

    #include <stdio.h>
    #include <windows.h>
    #include <unistd.h>
    
    void gotoxy(int x, int y){
        COORD c;
        c.X = x;
        c.Y = y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
    }
    
    void dir_next_1(int &row_dir, int &col_dir){
    	// если впаво то вверх
    	if (row_dir == 1 && col_dir == 0) {
    	    row_dir = 0; col_dir = -1;
    	}
    	// если вверх то влево
    	else if (row_dir == 0 && col_dir == -1) {
    	    row_dir = -1; col_dir = 0;
    	}
    	// если влево то вниз
    	else if (row_dir == -1 && col_dir == 0){
    	    row_dir = 0; col_dir = 1;
    	}
    	// иначе вправо
    	else{
    	    row_dir = 1; col_dir = 0;
    	}
    }
    
    void dir_next_2(int &row_dir, int &col_dir){
    	// если вверх то вправо
    	if (row_dir == 0 && col_dir == -1) {
    		row_dir = 1; col_dir = 0;  
    	}
    	// если вправо то вниз
    	else if  (row_dir == 1 && col_dir == 0)  {
    		row_dir = 0; col_dir = 1;
    	}
    	// если вниз то влево
    	else if (row_dir == 0 && col_dir == 1){
    	    row_dir = -1; col_dir = 0;
    	}
    	// иначе вверх
    	else{
    	    row_dir = 0; col_dir = -1;
    	}
    }
    
    void worker(bool next,char matrix[][24], int ROWS, int COLS, int &visited, int row, int col, int &row_dir, int &col_dir, int &end_row, int &end_col){
    	while (visited < ROWS * COLS) {
    	    visited++;
    	    int next_row = row + row_dir;
    	    int next_col = col + col_dir;
    	    if(next){
    	    	gotoxy(row,col);
    	    	printf("*");
    	    	usleep(1000);
    	    	if (matrix[row][col] == '1')
    	    		dir_next_1(row_dir, col_dir);
    	    	matrix[row][col] = '*';
    	    }
    	    else{
    	    	matrix[row][col] = '*';
    	    	if (next_row < 0 || next_row >= ROWS || next_col < 0 || next_col >= COLS || matrix[next_row][next_col] != ' ' ) {
    	    		matrix[row][col] = '1';
    	    		dir_next_2(row_dir, col_dir);
    	    	}
    	    }
    	    row += row_dir;
    	    col += col_dir;
    	    if (!(visited < ROWS * COLS)){
    	    	matrix[row][col+1]  = '*';
    	    	end_row = row;
    	    	end_col = col+1;
    	    }
    	}
    }
    
    
    int main() {
        system("cls");
        const int ROWS = 80;
        const int COLS = 24;
        char matrix[ROWS][COLS];
    
        int row = 0;
        int col = COLS - 1;
        int row_dir = 0; // 1 - вправо, -1 - влево, 0 - никуда
        int col_dir = -1; // 1 - вниз,   -1 - вверх, 0 - никуда
        int visited = 0;
        
        // заполнение матрицы пробелами 
        for (int i = 0; i < ROWS; i++)
            for (int j = 0; j < COLS; j++)
                matrix[i][j] = ' ';
    
        int end_row = 0;
        int end_col = 0;
    
        worker(false, matrix, ROWS, COLS, visited, row, col, row_dir, col_dir, end_row, end_col);
        
        row = end_row;
        col = end_col;
        visited = 0;
        row_dir = 1; // вправо
        col_dir = 0; // никуда
        worker(true, matrix, ROWS, COLS, visited, row, col, row_dir, col_dir, end_row, end_col);
        return 0;
    }
    Ответ написан
    Комментировать
  • Как нарисовать дерево, выбирая направление ветвей?

    Sergomen
    @Sergomen
    Просто делай добро и оно вернётся
    Вотъ)
    61b92980cc4d2102149926.png
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main(){
        string v = "\\/", s = " |"; // v - ветка, s - ствол
        vector <string> all; // все дерево
        int q; // запрос цифры
       	int prevQ; // предыдущий запрос
        int posV = 0, posS = 0, posA = 0; // позиция ветки, ствола, ветки+ствола
        int step = 2; // шаг изменения позиции
        string spacesV = "", spacesS = ""; // пробелы ветки, ствола
        while(true){ // цикл повторяется бесконечно
        	cin >> q; // спрашиваем цифру у пользователя
        	if (q == 1){ // если цыфра 1
        		if (prevQ == 2)  // если предыдущая цыфра была 2
        			posV--; // уменьшаем позицию ветки на 1
    			posV -= step; // уменшаем позицию ветки steр (в этом случае на 2 )
        		posS+=step; // увеличиваем на step позицию ствола
        		prevQ = 1; // записываем что эта цифра была 1
        	}
        	if (q == 2){ // если цифра 2
        		if (prevQ == 1) // если предыдщая цифра была 1
        			posV++; // увеличиваем позицию ветки на 1
        		posV += step; // увеличиваем позицию ветки на step
        		prevQ = 2; // записываем что это была цифра 2
        	}
        	if (q == 3) // если цифра 3
        		break; // выходим из цикла
        	system("cls"); // очистка экрана
    		spacesV = ""; // пробелы перед веткой очищаются
    		spacesS = ""; // и перед стволом тоже
        	for(int i = 0; i < posS + posV; i++) // цикл который увеличивает количество 
        		spacesV +=" "; // пробелов ветки на posS+posV
        	for(int i = 0; i < posS; i++) // цикл что увеличивет количество 
        		spacesS +=" "; // пробелов ствола на posS
        	
        	all.push_back(spacesV + v); // добавляем в вектор пробелы веток + ветку
        	if(q == 1) // если цифра 1
    			for(int i = 0; i < all.size(); i++) // каждому элементу масива веток
    				all[i] = "  " + all[i]; // добавляем два пробела
    
        	for(int i = all.size()-1; i >= 0; i--) // выводим в обратном порядке
    			cout << all[i] << endl; // все элементы массива
        	cout << spacesS << s << endl; // выводим пробелы ствола и сам ствол
        }
    	return 0;
    }

    если надо то могу полностю объяснить.
    p.s. спасибо за идею для лабы)
    Ответ написан
    3 комментария
  • Расчет количества в задаче?

    Sergomen
    @Sergomen
    Просто делай добро и оно вернётся
    int one = 100; // -- количество грам в 1 единице -
    int gramm = 540; // -- количество грамов -
    float count = (float)gramm / (float)one; // -- количество единиц -
    Ответ написан
    3 комментария
  • Как вывести кирилицу в консоль?

    Sergomen
    @Sergomen
    Просто делай добро и оно вернётся
    Во-первых: установи notepad++ открой файл и во вкладке "кодировка" нажми "превратить в ANSII" и сохрани файл.

    Во-вторых(можешь попробовать но врятли сработает, но тогда не выполняй то что написано выше): если у тебя файл кодирования в utf-8 то кодовая страница кодировки utf-8 cmd не 1251 а 65001 (кстати ,я не проверял будет ли нормально показыватся utf-8 при system("chcp 65001") )

    В-третьих: это ещё может быть из-за шрифта который используется в cmd(многих знакомых спасало), если кликнуть пкм по верхней рамки окна и нажать "значения по умолчанию" в одной из вкладок можно сменить шрифт.
    Ответ написан
    2 комментария
  • Что за ошибка "ld.exe cannot find -lbgi" и как ее исправить?

    Sergomen
    @Sergomen
    Просто делай добро и оно вернётся
    Ответ написан
    Комментировать
  • Как задать матрицу на C++?

    Sergomen
    @Sergomen
    Просто делай добро и оно вернётся
    // потрібні бібліотеки:
    #include <iomanip>
    #include <cstdlib>
    #include <ctime>
    //....
    srand(time(0));
    int A[3][3]; // матриця 3 на 3
    /* матриці задаються двомірними масивами */
    //заповнення рандомом
    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 3; j++){
             A[i][j] = rand() % 100 + 1; // 100 максимум, 1 - мінімум
             cout << setw(3) << A[i][j] << " ";
             if(j >= 3 -1){
                  cout << endl;
             }
        }
    }
    Ответ написан
    Комментировать