Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 63, средняя оценка - 4.73
chulkov-93
1 / 1 / 0
Регистрация: 19.11.2010
Сообщений: 10
#1

Построить ломаную по заданным вершинам - C++

23.08.2011, 10:46. Просмотров 8857. Ответов 40

Помогите решить несколько задач по Си:

1.Дан файл f, компоненты которого являются целыми числами. Найти:количество квадратов нечетных чисел среди компонент.

2.Дан текстовый файл f. Записать в перевернутом виде строки файла f в файл g. Порядок строк в файле g должен быть обратным по оношению к порядку строк исходного файла.

3.Построить ломаную по заданным вершинам. Вершины указываются с клавиатуры (см. задачу 900).

задача 900:При работе с графическим изображением часто возникает необходимость выбрать одну или несколько точек экрана. Так, например, для того чтобы построить отрезок, следует задать два его конца, для построения окружности можно задать ее центр и любую точку на окружности и т. д. Для указывания требуемой точки обычно используют курсор. Курсор может иметь одну, из следующих конфигураций:
а) Перекрестье (рис. 95, а). Указываемая точка-это точка пересечения двух прямых.
б) Крестик (рис. 95,6). Указываемая точка-это точка пересечения двух коротких отрезков.
в) Стрелка (рис. 95, б). Указываемая точка-это точка, в которую помещается острие стрелки.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2011, 10:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Построить ломаную по заданным вершинам (C++):

Дано n точек на плоскости, за время n*logn построить (n-1)-звенную ломаную - C++
Дано n точек на плоскости, заданных своими декартовыми координатами. За время n*logn построить (n-1)-звенную не пересекающую себя ломаную,...

За время n logn построить (n-1)звенную не пресекающую себя ломаную проходящую через все точки - C++
Дано n точек на плоскости заданных своими декартовыми координатами. За время n logn построить (n-1)звенную не пресекающую себя ломаную...

По заданным ребрам построить дерево - C++
в общем, задача такова: Даны ребра как на картинке (обозначил римской цифрой один исходные). Нужно построить дерево, как на картинке. ...

Построить прямоугольник по двум заданным точкам - C++
Построить прямоугольник по двум заданным точкам: левому верхнему и правому нижнему углам. Обе точки указываются с клавиатуры, а именно:...

Code::Blocks Построить 3 графика по заданным уравнениям - C++
Заранее спасибо откликнувшимся. // Требовалось решить задачу Коши ур-ием Даламбера. Задачу решил, получил 3 ур-ия, для которых...

Построить вектор, имеющий с заданным углом -45 градусов - C++
помогите пожалуйста сделать задачу в с++ построить вектор имеющий с заданным угол -45 градусов спасибо

40
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
23.08.2011, 16:03 #31
Цитата Сообщение от Deviaphan Посмотреть сообщение
x87 и старше
x87 не процессор
Но я в курсе современного состояния дел, спасибо. А так же в курсе, что кроме настольных ПК есть ещё и микроконтроллеры всякие, и сигнальники без FPU...

Добавлено через 40 минут
Цитата Сообщение от Olga_ Посмотреть сообщение
А если абстрагироваться от аппаратуры, вот Вы каким бы методом проверяли?
Да вот чёрт знает. Если возможность есть, то аппаратное бы использовал, наверное, а если нет...
Методов-то хороших как-то не очень видно. Попробовал бы методом Ньютона, ну вон Герона ещё можно, хотя как-то не кажется удачным, ну и своё что-нибудь попытался бы изобрести. Дня два
0
chulkov-93
1 / 1 / 0
Регистрация: 19.11.2010
Сообщений: 10
23.08.2011, 16:04  [ТС] #32
Юра, предпочтение Си. Строить по точкам с клавиатуры в консоле. Большое спасибо=))
0
-=ЮрА=-
Заблокирован
Автор FAQ
23.08.2011, 16:10 #33
Цитата Сообщение от chulkov-93 Посмотреть сообщение
Юра, предпочтение Си. Строить по точкам с клавиатуры в консоле. Большое спасибо=))
- принял в работу, ближе к вечеру выложу исходник!До связи...
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.08.2011, 16:11 #34
Цитата Сообщение от grizlik78 Посмотреть сообщение
x87 не процессор
сопроцессор. А в более старших моделях уже интегрировано (если не ошибаюсь.)
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
24.08.2011, 03:05 #35
Цитата Сообщение от grizlik78 Посмотреть сообщение
ну вон Герона ещё можно, хотя как-то не кажется удачным
А вообще-то я тут подумал... Вроде очень даже ничего методом Герона получается.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int is_square_of_odd(int a)
{
    int x = 1, b = a;
    if (a % 8 != 1)
        return 0;
 
    while (b > 3)
    {
        b /= 4;
        x <<= 1;
    }
 
    while (abs(a - x*x) >= 2*x)
        x = (x + a/x) / 2;
 
    return a == x*x || a == (x-1)*(x-1);
}
Возможно выражение в цикле и в возврате можно упростить, но и так уже довольно неплохо.

Добавлено через 9 часов 36 минут
Цитата Сообщение от grizlik78 Посмотреть сообщение
Попробовал бы методом Ньютона, ну вон Герона ещё можно
Забавно то, что итерационная формула Герона это, похоже, и есть итерационный метод Ньютона
На моих компьютерах этот метод работает в среднем в 2 раза медленней, чем с использованием sqrt(). Зато не используется арифметика с плавающей точкой. Ещё бы и без деления обойтись. Эх...
Ну и на всякий случай вариант с sqrt(), хотя он и банальный.
C
1
2
3
4
5
6
7
8
9
int is_square_of_odd(int a)
{
    int x;
    if (a % 8 != 1)
        return 0;
 
    x = sqrt(a);
    return a == x*x;
}
1
-=ЮрА=-
Заблокирован
Автор FAQ
24.08.2011, 03:16 #36
chulkov-93 , консоль готова, пока выкладываю скриншот, а код уж завтра(всем кто хочет его сейчас посмотреть пока скажу нет (код нужно привести в божеский вид, т.к. там комент на коменте - кодил в поте лица)
1
Миниатюры
Построить ломаную по заданным вершинам  
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.08.2011, 06:10 #37
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ещё бы и без деления обойтись. Эх.
Деление на 2 и 4 это сдвиги вправо на 1 и 2 бита соответственно. %8 эквивалентен &7.
0
chulkov-93
1 / 1 / 0
Регистрация: 19.11.2010
Сообщений: 10
24.08.2011, 10:15  [ТС] #38
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
chulkov-93 , консоль готова, пока выкладываю скриншот, а код уж завтра(всем кто хочет его сейчас посмотреть пока скажу нет (код нужно привести в божеский вид, т.к. там комент на коменте - кодил в поте лица)
Огромное вам спасибо=)))
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
24.08.2011, 11:39 #39
Цитата Сообщение от Deviaphan Посмотреть сообщение
Деление на 2 и 4 это сдвиги вправо на 1 и 2 бита соответственно. %8 эквивалентен &7.
Спасибо, но я, конечно же, имел в виду деление на x. Всё остальное компилятор умеет заменять.
0
-=ЮрА=-
Заблокирован
Автор FAQ
24.08.2011, 13:32 #40
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Итак, выкладываю код (т.к отлов мыши в консоли - довольно непростое дело, то функцию getMouseClick запихнул в DLL выкладываю также скомпилированные и работоспособные MClick.exp
MClick.lib и MClick.DLL - они должны быть в папке проекта!!!). С графикой намного легче, поэтому запихивать в DLL не стал, думаю суть задания была научиться по координатам щелчка стоить линию, а не вникать в суть доступа к потоку консоли STD_INPUT и STD_OUTPUT!Если же есть особое желание создать MClick.DLL, то советую раскопать использование следующих функций
C++
1
2
SetConsoleMode
ReadConsoleInput
и данных в структуре
C++
1
MOUSE_EVENT_RECORD

Пара слов о функции масштабирования координат щелчка - имей в виду что координаты щелчка идут как текстовые коодинаты консоли, т.е напрямую зависят от разрешения экрана и некоторых настроек в системе, поэтому для перевода в привычные координаты нужно вводить масштабные коэффициенты - это
i
C++
1
2
3
4
5
nt nROWS = 25;
    int nCOLS = 80;
 
    double CX = (pRECT.right - pRECT.left)/nCOLS;
    double CY = (pRECT.bottom - pRECT.top)/nROWS;
И не забыть сдвинуть мышь на величину заголовка окна и ширину его раниц, на сим желаю приятного использования данного приложения!
C++
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <windows.h>
#include <stdio.h>
 
#define IMPORT __declspec (dllimport)
#pragma comment(lib,"MClick.lib") //Подключаем MClick.lib
//Функция импортируемая из DLL
IMPORT DWORD getMouseClick(HANDLE hSTD_IN, COORD &POS); 
//Возвращаемые значения POS - координаты щелчка мыши
//(в символьных координатах консоли - это ВАЖНО!)
//DWORD reurn :
//FROM_LEFT_1ST_BUTTON_PRESSED - 1-слева кнопка (ЛЕВАЯ)
//FROM_LEFT_2ND_BUTTON_PRESSED - 2-слева кнопка (СРЕДНЯЯ, если есть)
//FROM_LEFT_3RD_BUTTON_PRESSED - 3-слева кнопка (доп кнопка 1, если есть)
//FROM_LEFT_4TH_BUTTON_PRESSED - 4-слева кнопка (доп кнопка 2, если есть)
//RIGHTMOST_BUTTON_PRESSED     - правая кнопка  (ПРАВАЯ)   
 
#define RED RGB(255,0,0)
#define GRN RGB(0,255,0)
#define BLU RGB(0,0,255)
 
#define BLK RGB(0,0,0)
#define WHT RGB(255,255,255)
 
HPEN getPen(int iPEN_STYLE, int iPEN_SIZE, int iCOLORREF);
BOOL SetPoint(HDC hDC, HPEN hPen, COORD PNT);
BOOL PlotLine(HDC hDC, HPEN hPen, COORD BGN, COORD END);
 
COORD setCordScale(COORD POS, RECT pRECT);
 
int main()
{
    SetConsoleOutputCP(1251);
    HWND   hWnd     = GetForegroundWindow();
    HANDLE hSTD_IN  = GetStdHandle(STD_INPUT_HANDLE);
    HANDLE hSTD_OUT = GetStdHandle(STD_OUTPUT_HANDLE);
 
    HPEN    LPEN = getPen(PS_SOLID, 2, RED);
    HPEN    PPEN = getPen(PS_SOLID, 3, WHT);
    RECT    pRECT= {0};
    COORD   POS  = {0};
    DWORD   dwCLICK = NULL;
    GetWindowRect(hWnd,&pRECT);
    COORD   BGN  = setCordScale(POS,pRECT);
    HDC hDC = GetWindowDC(hWnd);
    if(hDC)
    {
        SetBkMode(hDC,TRANSPARENT);//Можно и не устанавливать єтот режим, но с ним ярче
        SetPoint (hDC, PPEN, BGN);
        do
        {
            GetWindowRect(hWnd,&pRECT);
            if((dwCLICK = getMouseClick(hSTD_IN,POS)) == RIGHTMOST_BUTTON_PRESSED)
            {
                //Очистка экрана
                ShowWindow(hWnd,SW_HIDE);
                PlotLine(hDC, LPEN, BGN,  BGN);
                ShowWindow(hWnd,SW_SHOW);
            }
            POS = setCordScale(POS,pRECT);
            PlotLine(hDC, LPEN, BGN,  POS);
            SetPoint(hDC, PPEN, BGN = POS);
        }
        while(dwCLICK != FROM_LEFT_2ND_BUTTON_PRESSED);
    }
    system("pause");
    return 0;
}
 
HPEN getPen(int iPEN_STYLE, int iPEN_SIZE, int iCOLORREF)
{
    return CreatePen(iPEN_STYLE, iPEN_SIZE, iCOLORREF);
}
 
BOOL SetPoint(HDC hDC, HPEN hPen, COORD PNT)
{
    EXTLOGPEN pINFO;
    GetObject(hPen,sizeof(EXTLOGPEN),&pINFO);
    SelectObject(hDC,hPen);
    return Ellipse
    (
        hDC,
        PNT.X - pINFO.elpWidth,
        PNT.Y + pINFO.elpWidth, 
        PNT.X + pINFO.elpWidth,
        PNT.Y - pINFO.elpWidth
    );
}
 
BOOL PlotLine(HDC hDC, HPEN hPen, COORD BGN, COORD END)
{
    SelectObject(hDC,hPen);
    MoveToEx(hDC,BGN.X,BGN.Y,NULL);
    return LineTo(  hDC,END.X,END.Y);
}
 
COORD setCordScale(COORD POS, RECT pRECT)
{
    if(POS.X == 0)
        POS.X = 1;
    if(POS.Y == 0)
        POS.Y = 1;
 
    int nROWS = 25;
    int nCOLS = 80;
 
    double CX = (pRECT.right - pRECT.left)/nCOLS;
    double CY = (pRECT.bottom - pRECT.top)/nROWS;
 
    //При текстовом режиме(text mode) экран  делится  на  ячейки
    //(80  или 40 колонок в ширину и 25 строк в высоту)
    POS.X *= CX;
    POS.Y *= CY;
 
    int xBORDER = GetSystemMetrics(SM_CXBORDER);//Ширина границы окна
    int yBORDER = GetSystemMetrics(SM_CYMENU);  //Высота заголовка окна ~= высоте строк меню
    int xDRAG   = GetSystemMetrics(SM_CXDRAG);  //Число пикселей на гориз дрожение мыши
    int yDRAG   = GetSystemMetrics(SM_CYDRAG);  //Число пикселей на вертик дрожение мыши
 
    POS.X += xBORDER + xDRAG;//Ширина границы окна + число пикселей на дрожение мыши
    POS.Y += yBORDER + yDRAG;
    return POS;
}
PS:Если есть необходимость очистить экран от линии щелков, то жмём правую клавишу мыши...
6
Миниатюры
Построить ломаную по заданным вершинам  
Вложения
Тип файла: rar console_mouse_project.rar (28.6 Кб, 282 просмотров)
sereja322
3 / 3 / 0
Регистрация: 10.03.2015
Сообщений: 65
20.06.2015, 01:05 #41
Недавно делал похожее приложение (чтоб определяло координаты курсора в консоли) совсем уж извращенным методом: С помощью функции SetWindowPos() прилепил окно в определённую точку, считывал координаты относительно экрана и переводил их в консольные
0
20.06.2015, 01:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2015, 01:05
Привет! Вот еще темы с ответами:

Написать условие: Можно ли по заданным координатам построить трапецию? - C++
... в 72 строке ЗЫ Я весь код скинул т.к. возможно понадобится остальное. Заранее благодарю Вас! :) #include&lt;iostream&gt; ...

Матрицы. По трём заданным матрицам А, В и С построить матрицу Х того же размера - C++
По трём заданным матрицам А(m,m), В(m,m) и С(m,m) построить матрицу Х того же размера, каждый элемент которой вычисляется по формуле xi j...

Определить, можно ли из отрезков, длины которых равны заданным числам, построить прямоугольник - C++
Заданы 4 вещественных числа. Определить, можно ли из отрезков, длины которых равны заданным числам, построить прямоугольник помогите...

Построить матрицу В такого же размера, как А, элементы которой обладают заданным свойством - C++
Построить матрицу В такого же размера, как А, элементы которой обладают следующим свойством: элемент В равен максимальному из элементов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru