Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Необходимо реализовать тестирование функции

Ответить
Настройки темы
C/C++ - Необходимо реализовать тестирование функции

Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всем доброго времени суток! Столкнулся с проблемой - не удается провести тестирование функции в программе. Сама программа все тесты успешно прошла, эти тесты останутся за кадром. Функция 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;
}
Если будет возможно - хотелось бы увидеть решение хотя бы одного теста, или какую-нибудь идею, потому что я не знаю, как это сделать. Заранее благодарю.

Отправлено: 22:42, 12-06-2020

 


Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Необходимо реализовать тестирование функции

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Необходимо реализовать задачу с расчётом хеша в директориях и сохранением в фаил. DjBoBo Скриптовые языки администрирования Windows 23 20-12-2013 13:07
тестирование ira Хочу все знать 2 23-10-2009 17:55
помогите реализовать diga Флейм 4 28-03-2009 14:07
VPN - Необходимо реализовать подключение Site-to-site extremal Сетевые технологии 6 25-03-2008 14:56




 
Переход