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

Тема в разделе "C/C++/C#", создана пользователем valis, 15 дек 2010.

Статус темы:
Закрыта.
  1. valis

    valis Гость

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

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

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

    Привет,Денис ;)
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    2valis: Вася ? ;-)))
    Щас ребенка покупаю гляну ;-)
     
  3. valis

    valis Гость

    Ну да,я ;)
     
  4. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Ладно... Давай глянем....
    Вот тут не понятно, толи прямая - действительно прямая, то ли это все же отрезок (линия).... Как сам считаешь???? Алгоритмы просто разные будут....

    Добавлено:
    Код (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
      Размер файла:
      27,6 КБ
      Просмотров:
      52
  5. valis

    valis Гость

    Cкорее прямая,это прямая. И уравнение Ax+By+C
     
  6. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (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
      Размер файла:
      45 КБ
      Просмотров:
      43
  7. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (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
      Размер файла:
      39,1 КБ
      Просмотров:
      38
  8. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (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
      Размер файла:
      48,4 КБ
      Просмотров:
      21
  9. valis

    valis Гость

    Ух Денис..Спасиибо :(
     
  10. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Да не за что Вася.... :)
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей