• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Задачи: Треуг. и прямая, работа с симв. в строках, опред. полиндромов

  • Автор темы valis
  • Дата начала
Статус
Закрыто для дальнейших ответов.
V

valis

Здравствуйте,нужна помощь в задачах
Задача 153. Даны треугольник и прямая. Определить пересекает ли прямая контур треугольника.
Это полное условие задачи,слегка некорректно,насколько я понимаю вводятся координаты вершин треугольника и двух точек на прямой .

Задача 25. Написать и протестировать функцию STRP(str1, str2), которая определяет, встретился ли в строке str1 какой-нибудь символ str2. Функция должна возвращать номер позиции превого символа строки str1, совпадающего с каким-либо символом строки str2, или –1, если совпадений нет.

Задача 45 . Если в командной строке опции – x – n <образец>, то необходимо распечатать те строки введнного текста с их номерами, в которых указанный образец найден, а при указании опций – x <образец> распечатать те же строки, только без номеров.
Задача 58. Из введенного текста распечатать только те слова, которые симметричны (RADAR, ANNA), либо в которых буквы упорядочены в порядке, обратном алфавитному (TOK, ZONA).

Привет,Денис ;)
 
D

DarkKnight

Ладно... Давай глянем....
Задача 153. Даны треугольник и прямая. Определить пересекает ли прямая контур треугольника.
Это полное условие задачи,слегка некорректно,насколько я понимаю вводятся координаты вершин треугольника и двух точек на прямой .
Вот тут не понятно, толи прямая - действительно прямая, то ли это все же отрезок (линия).... Как сам считаешь???? Алгоритмы просто разные будут....

Добавлено:
C++:
/*
Задача 25. Написать и протестировать функцию STRP(str1, str2), которая определяет, встретился ли в строке str1 какой-нибудь символ str2. 
Функция должна возвращать номер позиции превого символа строки str1, совпадающего с каким-либо символом строки str2, или –1, если совпадений нет.
*/
#include <iostream>

using namespace std;

//Функция STRP str1 - строка, str2- массив символов 
int STRP (char *str1, char *str2)
{
int Result = -1; //Присвоим результату -1

for (int i = 0; i < strlen(str1); i++) //Обходим каждый символ строки str1
for (int j = 0; j < strlen(str2); j++) //Вложеным циклом обходим каждый символ str2
if (str1[i] == str2[j]) //Проверяем совпадения символов
return i; //Если совпадение найдено, то вернем i - это позиция символа который нашли в строке str1
return Result;
}

void main(void)
{
setlocale(LC_ALL,".1251"); //Переведем локаль в код. страницу .1251
char Str[256]={0}; //Наша искомая строка
char SubStr[128] = {0}; //Наша субстрока, включает в себя символы которые будем искать в Str;
cout << "Введите строку : ";
cin.getline(Str,255); //Получим строку, подстра*цензура*ся от переполнения
cout << "Введите субстроку : ";
cin.getline(SubStr,127); //Получим субстроку
cout << endl;
int Result = STRP(Str,SubStr); //В результат вернем значение функции
if (Result != -1) //Если Result Не равен -1, то символ найден
cout <<"Символ найден, позиция = " << Result << endl; //Выведим его позицию
else cout <<"Строка ни содержит символов субстроки" << endl; //Иначе выведим что ничего не нашли

system("pause"); //Задержка

}
 

Вложения

  • vasya2.jpg
    vasya2.jpg
    15,6 КБ · Просмотры: 332
D

DarkKnight

Задача 45 . Если в командной строке опции – x – n <образец>, то необходимо распечатать те строки введнного текста с их номерами, в которых указанный образец найден, а при указании опций – x <образец> распечатать те же строки, только без номеров.
C++:
/*
Задача 45 . Если в командной строке опции – x – n <образец>, то необходимо распечатать те строки введнного текста с их номерами,
в которых указанный образец найден, а при указании опций – x <образец> распечатать те же строки, только без номеров.
*/
#include <iostream>

using namespace std;

void main(int argc, char *argv[])
{
setlocale(LC_ALL,".1251"); //Установим локаль
bool flagX = false; //Флаг вхождения параметра х
bool flagN = false; //Флаг вхождения параметра n
char Temp[128] = {0}; //Наш образец

//Обойдем параметры командной строки с первого, нулевой нам не инетересен
for (int i = 1; i<argc; i++)
{
if (strcmp("-x", argv[i]) == 0) //Если найдем -х, то выставим флаг
flagX = true;
else if (strcmp("-n", argv[i]) == 0) //Если найдем -n, то выставим флаг
flagN = true;
else strncpy(Temp,argv[i],127); //Если что то другое то это наш образец
}

if (!flagX) //Если флаг x не выставлен, то вооще выйдем
{
cout << "Ошибка: Не верный ввод параметров" << endl;
return; //Выйдим из программы
}
char Arr[500][500]; //Массив строк (макс. 500 строк)

cout<< "Введите строки (окончание ввода - пустая строка) : " << endl;
int cnt = -1; //счетчик строк -1 потому как используем do/while
do
{
cnt++; //Увеличим счетчик
cin.getline(Arr[cnt],499); //Прочтем строку
} while (strlen(Arr[cnt]) > 0); //Пока длина строки > 0 (т.е. строка не пустая), будем читать строки

//Теперь поищим образец
for (int i = 0; i< cnt; i++) //Обойдем все строки
if (strstr(Arr[i],Temp)) //Если найдена субстрока, то strstr вернет не NULL
{
if (flagN) //Проверим, если указан флаг -n
{
cout << i << ".) "; //То выведим номер строки (нумерация от нуля)
}
cout << Arr[i] << endl; //И выведим саму строку
}
}
 

Вложения

  • vasya3.jpg
    vasya3.jpg
    25,8 КБ · Просмотры: 455
D

DarkKnight

Задача 58. Из введенного текста распечатать только те слова, которые симметричны (RADAR, ANNA), либо в которых буквы упорядочены в порядке, обратном алфавитному (TOK, ZONA).
C++:
/*
Задача 58. Из введенного текста распечатать только те слова, которые симметричны (RADAR, ANNA), 
либо в которых буквы упорядочены в порядке, обратном алфавитному (TOK, ZONA).
*/
#include <iostream>

using namespace std;

void main(void)
{
setlocale(LC_ALL,".1251"); //Установим локаль
char Words[500][128]; //Массив слов... Макс. слов 500, макс. длина слова 127+ завершающий нулевой символ \0

cout << "Введите слова через пробел (Завершение ввода '-') : " << endl;
//Тут можно сделать очень красиво через строковый поток, но что бы мозг не засорять мы это упустим
int cnt = -1; //Счетчик строк (как и в прошлой задачи)
//Зная что cin по умолчанию отсекает пробелы (считает завершение ввода), то воспользуемся этой его особенностью
do
{
cnt++; //Увеличим счетчик
cin>>Words[cnt]; //Получим слово
} while (Words[cnt][0] != '-'); //Если встретили слово "-" завершим ввод

//Ну теперь к заданию
cout << endl << "Слова удовл. условию : " << endl;
//обойдем все слова
for (int i = 0; i< cnt; i++)
{
bool alpha = true; // Флаг по-алфавитному порядку (предположим от противного), мол что слово упорядочено по алф. порядку
bool iver = true; //Флаг Симметричности (опять же от противного)
//Ну а теперь все это дело проверим 
//сначало алфавитный порядок
for (int j = 1; j < strlen(Words[i]); j++) //Обойдем посимвольно слово
{
if (Words[i][j] > Words[i][j-1]) //Если вдруг текущая буква > предыдущей, то порядок не обратный алфавитному, наше утверждение ошибочно
{
alpha = false; //Обнулим флаг
break; //Покинем цикл
}
}
//Теперь инверсию
for (int j = 0; j<(strlen(Words[i])/2); j++) //Обойдем посимвольно с первого символа по номер символа = целочисленному делению длины слова на 2
{
if (Words[i][j] != Words[i][strlen(Words[i])-1-j]) //Если буквы инверсирования (1 - конец), (2 - конец-1), (3 - конец-2) не равны, то опять же наше 
//Утверждение было ошибочно
{
iver = false; //Обнулим флаг
break; //Покинем цикл
}
}
if (iver || alpha) //Если хотя бы один из флагов true, то нужно вывести слово
{
cout << Words[i] << endl;
}
}


}
 

Вложения

  • vasya4.jpg
    vasya4.jpg
    22,4 КБ · Просмотры: 255
D

DarkKnight

Задача 153. Даны треугольник и прямая. Определить пересекает ли прямая контур треугольника.
Это полное условие задачи,слегка некорректно,насколько я понимаю вводятся координаты вершин треугольника и двух точек на прямой .
C++:
/*
Задача 153. Даны треугольник и прямая. Определить пересекает ли прямая контур треугольника.
Это полное условие задачи,слегка некорректно,насколько я понимаю вводятся координаты вершин треугольника и двух точек на прямой .
*/
#include <iostream>

using namespace std;

//Для удобства введем структуры
struct POINT
{
double x; // проектция точки на ось x
double y; //Проекция точки на ось y
};

//Структура прямая y = kx+b
struct LINE
{
double k; //Коэффициент k
double b; //Коэффициент b
};

//Структура треугольник
struct TRIO
{
POINT Versh[3]; //Массив точек(вершин треугольника
};

//Опеределить не пересекает ли прямая треугольник можно узнав находятся ли все точки по одну сторону от прямой
//Вычислить это можно приведя из уравнения прямой, функцию F(x,y) = kx+b - y;
//Значение функции может быть положительное - если точка лежит с права от прямой, отрицательное если точка лежит слева от прямой
//и равное 0, если точка принадлежит прямой
//В случае с треугольником: если значение функции во всех точка треугольника(вершинах) имеет один знак (+/-), то прямая не пересекает треугольник
//Иначе прямая пересекает трекугольник 

//Функция определения положения точки относительно прямой
double Funct (POINT point, LINE line) //point - точка по отношению которой ведется вычисление, line - уравнение прямой
{
return (line.k * point.x + line.b - point.y);
}

//Для удобства введем функцию проверки пересечения треугольника
bool BreakTrio (TRIO A, LINE line)
{
bool leftpos = true;
bool rightpos = true;
//Обойдем все точки треугольника
for (int i =0; i<3; i++)
{
double FunctRes = Funct(A.Versh[i], line);
if (FunctRes == 0) //Если значение функции 0, то вершина лежит в прямой (пересечение контура) 
return true; //Сразу выйдем со значением true - пересекает
if (FunctRes > 0) //Если точка лежит с права от прямой
leftpos = false; //То выставим leftpos - в false
else rightpos = false; //Иначе выставим rightpos - в false
}
//Теперь сравним rightpos и leftpos , если хотя бы одно значение из них осталось true, то пересечения нет, иначе есть пересечение
if (leftpos || rightpos)
return false;
else return true;
}

void main (void)
{
setlocale(LC_ALL,".1251"); //Подключим локаль
TRIO trio; //Наш треугольник
LINE line; //Наша прямая

//Ввод данных
cout << "Введите прямую вида y=kx + b :" << endl;
cout << "Введите коэффециент k = ";
cin >> line.k;
cout << "Введите коэффециент b = ";
cin >> line.b;
cout << endl << "Введите вершины прямогульника :" << endl;
for (int i = 0; i<3; i++)
{
cout << "Введите вершину #" << i <<" x y(через пробел): ";
cin>> trio.Versh[i].x >> trio.Versh[i].y;
}
//Определение пересечения контура прямоугольника
if (BreakTrio(trio,line))
cout << "Контур треугольника пересекается прямой y = " << (line.k) << "x + " << (line.b) << endl;
else
cout << "Контур треугольника НЕ пересекается прямой y = " << (line.k) << "x + " << (line.b) << endl;
}
 

Вложения

  • vas1.jpg
    vas1.jpg
    27,4 КБ · Просмотры: 510
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!