Отправляет email-рассылки с помощью сервиса Sendsay

[prg] переписать с паскаля на си.

Здравствуйте.
Помогите переписать программу с паскаля на си.

код:
function Find(const S, P : String) : Integer;
var
i, j : Integer;
begin
Result := 0;
if Length(P) > Length(S) then Exit;
for i := 1 to Length(S) - Length(P) + 1 do
for j := 1 to Length(P) do
if P[j] <> S[i+j-1] then Break
else if j = Length(P) then
begin
Result := i;
Exit;
end;
end;

Заранее спасибо за ответ.

Ответить   Wed, 22 May 2013 15:53:53 +0700 (#2749051)

 

Ответы:

Приветствую всех.

Формулируйте точнее: вам нужен эквивалент на C или дословный перевод?
Если эквивалент, то это будет приблизительно так:

int find (const char* where, const char *what)
{
const char *here = strstr(where,what);
return (here ? (here-where+1) : 0);
}

Ответить   "i_chay" Thu, 23 May 2013 07:47:15 +0300 (#2749634)

 

Здравствуйте.
23.05.2013 11:47, "i_chay" пишет:

эквивалент.

А если без использования strstr()?

Ответить   Thu, 23 May 2013 19:51:22 +0700 (#2751171)

 

Приветствую всех.

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

Успехов. Анатолий.

Ответить   "i_chay" Fri, 24 May 2013 07:04:19 +0300 (#2751650)

 

здравствуйте.
24.05.2013 11:04, "i_chay" пишет:

Прошу не судить строго.

int find (char *s, char *sub)
/* ичем sub в s */
{
int i, j;
if (strlen(sub) > strlen(s))
{
printf("error\n");
}
for (i =0; i <=strlen(s) -strlen(sub) +1; ++i)
{
for (j =0; j < strlen(sub); ++j)
{
if (sub[j] !=s[i +j])
{
return 0;
}
else
{
if (j ==strlen(sub))
{
return i;
}
}
}
}
}

Ответить   Fri, 24 May 2013 21:32:35 +0700 (#2752191)

 

Приветствую всех.

В принципе, вы движитесь в правильном направлении. Но после дословного перевода
все-таки кое-что надо подправить с учётом возможностей и специфики языка C (а
также избавиться от некоторых неудачных моментов исходного варианта).

Параметры функции можно обозначить как константные: во-первых, если вы ненароком
внутри функции измените содержимое строк, то компилятор предупредит вас о запрете
на такие операции. Во-вторых, константные параметры дают понять тому, кто будет
использовать вашу функцию, что вы гарантируете ему неизменность параметров.
В итоге сигнатура функции будет такой:
int find( const char *s, const char *sub)

Обратите внимание, что после печати сообщения об ошибке выполнение функции продолжится,
а вам необходимо выйти из функции.
Кроме того, ситуация, когда искомая строка длиннее, чем строка, в которой осуществляется
поиск, не является ошибочной (по крайней мере, с точки зрения функции find),
поэтому сообщение об ошибке тут излишне. Вам просто нужно вернуть ноль, как признак
неудачного поиска.

Обратите внимание, что в предыдущем фрагменте кода вы уже вычисляли длины строки
и подстроки (вызывали функции strlen(s) и strlen(sub)). Вызов функции в любом
языке программирования -- это одно из самых затратных действий, поэтому если
возможно, то количество вызовов функций желательно минимизировать, например,
сохраняя результаты их работы в локальных переменных.
Кроме того, в языке Паскаль определение длины строки - это быстрая операция,
а в языке C -- медленная. Это связано с форматом представления строк в этих языках.
В последующем коде у вас еще дважды встречаются вызовы strlen(sub), без которых
вполне можно обойтись, если принять во внимание, что в языке C конец строки можно
определить по нулевому байту.
То есть вместо
for (j=0; j<strlen(sub); j++)
можно написать
for(j=0; sub[j]!=0; j++)
...

Ваша функция должна возвращать целое (int), а у вас перед последней закрывающей
фигурной скобкой отсутствует элемент return с возвращаемым значением.

Успехов. Анатолий.

Ответить   "i_chay" Fri, 24 May 2013 20:20:53 +0300 (#2752272)