Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Junior
Статус: Не в сети
Регистрация: 18.06.2020
Всем доброго времени суток! Столкнулся с проблемой - не удается провести тестирование функции в программе. Сама программа все тесты успешно прошла, эти тесты останутся за кадром. Функция distanceBetweenWords должна пройти такие тесты: является ли текст пустым, находятся ли слова на одной строке текста, находятся ли они на разных строках и являются ли одинаковым словами. Я прошу прощения - нет никаких идей, как это реализовать и потому прошу помочь: может быть, идеей - какой код реализовать и в какой участок функции его вписать; может быть, какими-нибудь материалами, но хотелось бы увидеть хотя бы частичный способ решения задачи. Перепробовал все, что знаю.

Прикрепляю код(функция находится на 209 строке):


Код:
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <ctype.h>
#include <iostream>
#include <regex>

//Основные функции
//Функция для поиска расстояния между словами, заданными своими позициями
int distanceBetweenWords(const char text[20][81], int count, const int locationWord1[2], const int locationWord2[2]);
//Функция поиска слова в строке
int searchWord(const char str[81], const char word[21]);

int main()
{
    //Объявление переменных
    char word1[21]; // первое слово
    char word2[21]; // второе слово
    char text[20][81]; //строковый массив с текстом
    int length_between_words = 0; //текущее расстояние между искомыми словами
    int min_length_between_words = 81; //минимальное расстояние между искомыми словами
    int M; //количество строк
    int locationWord1[2]; //индекс первого слова
    int locationWord2[2]; //индекс второго слова
    bool flagWord1 = false; //флаг наличия первого слова в тексте
    bool flagWord2 = false; //флаг наличия второго слова в тексте
    int* ptr = &locationWord1[1]; // указатель на прошлое вхождение первого слова
    int* ptr2 = &locationWord2[1];// указатель на прошлое вхождение второго слова
    int mass1[81][2]; // все позиции первого слова
    int mass2[81][2]; // все позиции второго слова
    int f = 0, g = 0; // счётчики
    bool inter1 = true;//флаг наличия первого слова в строке
    bool inter2 = true;//флаг наличия второго слова в строке
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    //Ввести первое слово
    gets_s(word1);

    //Ввести второе слово
    gets_s(word2);

    //Ввести количество строк
    scanf("%d", &M);

    //Проверка правильности введенных данных
    if (M > 20 || M < 1)
    {
        error_printf("The number of rows exceeds the specified value");
        return 0;
    }

    gets_s(text[0]); // КОСТЫЛЬ!

    //Ввести текст
    input_printf("\nEnter the text:\n");
    for (int t = 0; t < M; t++)
    {
        gets_s(text[t]);
    }
    //Поиск слов
        //Поиск первого слова
    for (int t = 0; t < M; t++)
    {

        if (inter1 == false)
            inter1 = true;
        if (strcmp(text[t], ""))
        {
            locationWord1[1] = searchWord(text[t], word1);

            if (locationWord1[1] > -1) // если слово найдено
            {
                flagWord1 = true; //флаг наличия первого слова
                locationWord1[0] = t; //индекс строки
                mass1[f][0] = locationWord1[1];
                mass1[f][1] = locationWord1[0];
                f++;

                // поиск остальных вхождений слова в строке
                while (inter1)
                {
                    locationWord1[1] = searchWord(text[t] + *(ptr)+1, word1) + (*ptr) + 1;

                    if ((locationWord1[1] - mass1[f - 1][0]) == 0)
                    {
                        inter1 = false;
                    }
                    else if (locationWord1[1] > -1)
                    {
                        mass1[f][0] = locationWord1[1];
                        mass1[f][1] = locationWord1[0];
                        f++;

                    }

                }
            }
        }



    }

    // поиск второго слова
    for (int t = 0; t < M; t++)
    {
        if (inter2 == false)
            inter2 = true;
        if (strcmp(text[t], ""))
        {
            locationWord2[1] = searchWord(text[t], word2);

            if (locationWord2[1] > -1) // если слово найдено
            {
                flagWord2 = true; //флаг наличия первого слова
                locationWord2[0] = t; //индекс строки
                mass2[g][0] = locationWord2[1];
                mass2[g][1] = locationWord2[0];
                g++;

                // поиск остальных вхождений слова в строке
                while (inter2)
                {
                    locationWord2[1] = searchWord(text[t] + *(ptr2)+1, word2) + (*ptr2) + 1;

                    if ((locationWord2[1] - mass2[g - 1][0]) == 0)
                    {
                        inter2 = false;
                    }
                    else if (locationWord2[1] > -1)
                    {
                        mass2[g][0] = locationWord2[1];
                        mass2[g][1] = locationWord2[0];
                        g++;

                    }

                }
            }
        }

    }


    //Поиск минимального расстояния
     // если оба слова найдены
    if (flagWord1 == true && flagWord2 == true)
    {
        for (int i = 0; i < f; i++)
        {
            for (int j = 0; j < g; j++)
            {
                locationWord1[1] = mass1[i][0];
                locationWord1[0] = mass1[i][1];
                locationWord2[1] = mass2[j][0];
                locationWord2[0] = mass2[j][1];

                // переход к последнему вхождению слова
                if ((locationWord1[0] < locationWord2[0]) || (locationWord1[1] < locationWord2[1]) && ((locationWord1[0] < locationWord2[0]) || (locationWord1[0] == locationWord2[0])))
                {
                    locationWord1[1] = locationWord1[1] + strlen(word1) + 1;
                }
                else
                {
                    locationWord2[1] = locationWord2[1] + strlen(word2) + 1;
                    // меняем местами
                    int noYou = locationWord1[1]; // вспомогательная переменная
                    locationWord1[1] = locationWord2[1];
                    locationWord2[1] = noYou;
                    noYou = locationWord1[0];
                    locationWord1[0] = locationWord2[0];
                    locationWord2[0] = noYou;
                }
                //поиск расстояния
                length_between_words = distanceBetweenWords(text, M, locationWord1, locationWord2);
                //проверка является ли рассотяние минимальным
                if (length_between_words < min_length_between_words && ((locationWord1[0] != locationWord2[0] || locationWord1[1] != locationWord2[1]) || length_between_words > 0))
                {
                    if (length_between_words > 0)
                        min_length_between_words = length_between_words;
                }
            }
        }
    }

    //Вывести расстояние между словами, если заданное слово найдено
    if (min_length_between_words > 0 && min_length_between_words != 81)
    {
        printf("%d", min_length_between_words);
    }
    else
    {
        printf("-1");
    }

    return 0;
}



//Функция для поиска расстояния между словами, заданными своими позициями
int distanceBetweenWords(const char text[20][81], int count, const int locationWord1[2], const int locationWord2[2])
/*
Входные данные:
text – исходный текст
count – кол-во строк текста
locationWord1, locationWord2 – позиции слов, между которыми определяется расстояние:
locationWord1[0], locationWord2[0] – индексы строк текста,
locationWord1[1], locationWord2[1] – индексы символов в строках

Выходные данные:
возвращаемое значение - кол-во символов между словами
*/

{

    int G; //временная переменная, которая запоминает размер строк
    int length_between_words = 0; //расстояние между двумя заданными словами
    bool text_is_void = false;
   

    //Поиск расстояния между двумя заданными словами
   

    if (locationWord1[0] != locationWord2[0])// Если слова на разных строках
    {
        for (int t = 0; t < count; t++)
        {
            if (!strlen(text[t]))
                text_is_void = true;

           
                if (t == locationWord1[0]) //Если слово находится на текущей строке
                {
                    if (locationWord1[1] == strlen(text[t]) + 1) // Если слово находится в конце строки
                    {
                        t++; //переход к следующей строке, так как текущую мы нашли
                    }
                    else
                    {
                        G = strlen(text[t]); //запомнить размер строки
                        length_between_words += (G - locationWord1[1]) + 1; //прибавить размер строки
                        t++; //переход к следующей строке, так как текущую мы нашли
                    }
                    //Пока не дойдем до следующего слова складывать длину строк
                    while (t != locationWord2[0] && t <= count && locationWord1[0] != locationWord2[0])
                    {
                        G = strlen(text[t]); //запомнить размер строки
                        length_between_words += G + 1; //прибавить размер строки
                        t++; //перейти к следующей строке
                    }
                    if (t == locationWord2[0])// если второе слово в заданной строке
                    {
                        int i = 0;
                        while (i != locationWord2[1])// Пока не дойдёт до первого вхождения второго слова
                        {
                            length_between_words++;
                            i++;
                        }
                    }
                }
           
        }
    }
    if (locationWord1[0] == locationWord2[0]) // Если слова на одной строке
    {
        length_between_words = locationWord2[1] - locationWord1[1];
    }
    length_between_words++;
    return length_between_words; //вернуть расстояние
}



//Функция поиска слова в строке
int searchWord(const char str[81], const char word[21])
/*
Входные данные:
str – исходная строка
word – искомое  слово

Выходные данные:
возвращаемое значение - индекс первого вхождения искомого слова в строку; возвращает -1, если слово не найдено
*/
{

    const char* arrow; //Указатель на текст
    arrow = str;
    int j = 0; // счётчик

    if (strcmp(arrow, ""))
    {    //Если слово первое в строке
        for (int i = 0; i < strlen(word); i++)
        {
            if (arrow[i] == word[i])
            {
                j++;
            }
        }

       

        if (j == strlen(word) && !isalpha(*(arrow + strlen(word))))// если слово нашлось
        {
            return 0;
        }
        else
        {     // поиск слова в строке
            do
            {
                arrow++;
                arrow = strstr(arrow, word); // Нахождение первого вхождения слова

                if (arrow == NULL) //Если строка закончилась
                {
                    return -1;
                }
                //Проверка неявляется ли слово частью другого
                if (!isalpha(*(arrow - 1)) && !isalpha(*(arrow + strlen(word))))
                {
                    return arrow - str;
                }

                if (arrow != NULL) // Переход на следующую позицию
                {
                    arrow++;
                }

            } while (arrow != NULL); // Пока строка не закончится
        }
    }
    else
        return -1;
}


Если будет возможно - хотелось бы увидеть решение хотя бы одного теста, или какую-нибудь идею, потому что я не знаю, как это сделать. Заранее благодарю.



Партнер
 

Заблокирован
Заблокирован
Статус: Не в сети
Регистрация: 14.10.2024
Квестер писал(а):
Прикрепляю код(функция находится на 209 строке):
Если будет возможно - хотелось бы увидеть решение хотя бы одного теста, или какую-нибудь идею, потому что я не знаю, как это сделать. Заранее благодарю.


Да всё просто. Для начала определиться, какой библиотекой, фреймворком для юнит тестов будете пользоваться. Хоть бустом, хоть от Гугла или M$, в принципе неважно. Детали в мануале курятся или в примерах по образцу.
От Гугла:

#include <gtest/gtest.h>

TEST(MyTestSuitName, MyTestCaseName)
{
int actual = 1;
EXPECT_GT(actual, 0);
EXPECT_EQ(1, actual) << "Should be equal to one";
}

Или Буста:
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(MyTestCase)
{
// To simplify this example test, let's suppose we'll test 'float'.
// Some test are stupid, but all should pass.
float x = 9.5f;

BOOST_CHECK(x != 0.0f);
BOOST_CHECK_EQUAL((int)x, 9);
BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001%
}

Вызывается ваша функция и сравниваются результаты её работы с тем что ожидается. Всё просто. В примерах для простоты сравниваются значения переменной с разными ожиданиями. Думаю, идея понятно. А частности смотрятся в примерах к фреймворку или курится его мануал. :D
Для distanceBetweenWords подсовываются аргументы для которых известен правильный результат работы этой функции и сравнивается с ожиданием.
А для надежности разные варианты аргументов. Как правильные, так и неправильные. Чем больше характерных вариантов, тем надежнее проверка


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan