Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2012, 10:09   #11
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

А теперь рассмотрим, как более правильно подходить к разработке программ.

1) Разрабатываем и тестируем каждую функцию отдельно. У вас одна функция any.

Пишем для неё тесты в файле. При этом учитываем различные комбинации. Причём,
чем больше комбинаций входных данных, тем лучше.

Записываем в файле "input.txt" входные данные и ожидаемый результат:

input.txt
Цитата:
aaa
bbb
-1

aab
bcc
2

aba
ccb
1
После отработки теста, в файле "output.txt" будет следующее:
Цитата:
aaa
bbb
-1 -1

aab
bcc
2 2

aba
ccb
1 1
main.c
Код:
#include <stdio.h>

#define BSIZE 1000

int any(char s1[],char s2[]);

int main()
{
    int expected;
    char s1[BSIZE], s2[BSIZE];

    char *outfilename = "output.txt";
    FILE *ofp = fopen(outfilename, "w");

    char *infilename = "input.txt";
    FILE *ifp = fopen(infilename, "r");

    if (ifp == NULL) {
        fprintf(stderr, "Error: cannot open file \"%s\"\n", infilename);
        return 1;
    }

    while (fscanf(ifp, "%s%s%d", s1, s2, &expected) != EOF) {
        fprintf(ofp, "%s\n", s1);
        fprintf(ofp, "%s\n", s2);
        fprintf(ofp, "%d   %d\n\n", expected, any(s1, s2));
    }

    printf("Completed. See file \"%s\"\n", outfilename);

    fclose(ifp);
    fclose(ofp);
    return 0;
}

int any(char s1[],char s2[])
{
    int k=1,i=0,j=0;
    while ((k>0) && (s1[i]!='\0'))
    {
        while ((s2[j]!='\0') && (k>0))
        {
            if (s1[i]==s2[j])
            {
                k=0;
            }
            j++;
        }
        j = 0;
        ++i;

    }
    if (k==0)
        return (i-1);
    else
        return -1;
}
2) Созданный нами тест будет служить нам долго. К примеру, вы вдруг
захотели изменить вашу функцию, так как придумали более красивый,
короткий алгоритм. Теперь наш тест работает на нас. Мы можем быть
спокойны, что не внесли какие-то очень серьёзные ошибки. А если у нас
тест учитывает абсолютно все комбинации входных данных (такое редко
возможно), то мы будем уверенны на 100%, что не внесли никаких
ошибок.

P.S. Приучайте себя писать тесты для доказательства правильной работы
основного функционала. В дальнейшем вам не придётся тратить на это
много времени (как в начале). Привычка - сильная штука. Главное,
вырабатывать у себя правильные привычки, а не вредные!

Последний раз редактировалось 8Observer8; 10.06.2012 в 10:12.
8Observer8 вне форума Ответить с цитированием
Старый 10.06.2012, 11:02   #12
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Что было бы если бы вы в самом начале написали тестовый проект для функции any()?

Из за вашей первой ошибки, функция any() никогда бы не возвратилась.
Нужно это предусмотреть в тестовом проекте, использовав timeout. Если
вам это интересно, то я напишу, как это сделать. Но на первых парах
можно и без timeout'a. И так понятно, когда программа (точнее
исследуемая функция) уходит в бесконечный цикл. Пока этот момент
(с бесконечным циклом) пропустим.

Следующий вариант вашей программы - это тот в котором мы забыли
сбрасывать j:
Код:
int any(char s1[],char s2[])
{
    int k=1,i=0,j=0;
    while ((k>0) && (s1[i]!='\0'))
    {
        while ((s2[j]!='\0') && (k>0))
        {
            if (s1[i]==s2[j])
            {
                k=0;
            }
            j++;
        }
        ++i;

    }
    if (k==0)
        return (i-1);
    else
        return -1;
}
Результаты теста будут такими:

output.txt
Цитата:
aaa
bbb
-1 -1

aab
bcc
2 -1

aba
ccb
1 -1
И наконец последнее, протестируем код, который предложил Stilet:

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
	char *s="abcdefgh";
	char *d="sufew";
	int i=0;bool b=false;
	for(;!b && s[i];i++)for(int k=0;!b && d[k];k++)b=s[i]==d[k];
	i=(b)?i:-1;
	printf("%d",i);getchar();
К сожалению, функция any() не прошла тестирование:
Код:
int any(char s1[], char s2[])
{
    int i=0;int b=0, k;
    for(;!b && s1[i];i++)for(k=0;!b && s2[k];k++)b=s1[i]==s2[k];
    return i=(b)?i:-1;
}
Результаты теста:

output.txt
Цитата:
aaa
bbb
-1 -1

aab
bcc
2 3

aba
ccb
1 2
P.S. Я вам продемонстрировал, что набор тестов - это очень полезный инструмент. Написание
тестового проекта отнимает не так уж и много времени, а об его эффективности судите сами.

P.S.S. Вы можете добавлять тестовые варианты в файл "input.txt", при этом ничего не меняя в
программе. В тестовом проекте также можно предусмотреть возможность автоматической
генерации тестовых данных.

Последний раз редактировалось 8Observer8; 10.06.2012 в 11:19. Причина: P.S.S
8Observer8 вне форума Ответить с цитированием
Старый 10.06.2012, 16:59   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не прошла тестирование:
Чем это не прошла??
Я показываю позицию символа не по Сишному, а с единицы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.06.2012, 19:29   #14
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Чем это не прошла??
Я показываю позицию символа не по Сишному, а с единицы.
Код:
return (i-1);
Автор темы выбрал позицию с нуля. Это требование ваш код не
выполнил.

Chelovekpredel, я бы на вашем месте использовал код
Stilet'a. Он понятнее и логичнее, чем ваш:

Код:
int any(char s1[], char s2[])
{
    int i, b, k;

    i = 0, b = 0;
    for(; !b && s1[i]; i++) {
        for(k = 0; !b && s2[k]; k++) {
            b = s1[i] == s2[k];
        }
    }

    return i = (b) ? (i-1) : -1;
}
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с написанием программы.. super3994 Общие вопросы C/C++ 1 16.11.2011 22:36
Проблема с написанием программы PashkaRus Помощь студентам 3 07.06.2011 11:44
Проблема с написанием программы в Паскале alexchromets Помощь студентам 0 27.02.2011 16:48
проблема с написанием многомодульной программы серг Общие вопросы C/C++ 16 18.03.2010 22:11