2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Функция с char
Сообщение02.10.2013, 20:23 
Здравствуйте, уважаемые посетители форума! И это снова я, и идет 32 день моего обучения С. Чем не повод для очередного поста в этом разделе? :D
На этот раз я прошу вашей помощи в реализации программы с функцией. Программа берет на вход строку, состоящую из слов(разделенных пробелами), среди слов возможно есть палиндромы. А выходить должна эта же строка с палиндромами, закрытыми *.
Например, на вход "тот этот ротатор торт"
на выходе - "*** этот ******* торт".
Код:
#include <stdio.h>
#include <math.h>
#include <locale.h>
#include <stdlib.h>
#include <time.h>


char HidePalindromes(char str[128])
{
   int i=0;
   int j=0;
   int len=0;
   int wlen=0;

   while(str[i]!=0)
   {
      i++;
   }
   len=i;
   i=0;
   while(str[i]!=0)
   {
      while(str[j]!=' ')
      {
            wlen++;
         j++;
        }
        j=0;

      while(str[j]!=' ')
      {   
         if(str[j]==str[wlen-j])
         {
           str[j]='*';
         }
         else
         {
          break;
         }
      }

      i++;
   }

   return str;
}
   int main(void)
{
   char in[100];
   setlocale(LC_ALL, "rus");
    gets(in);
    printf("%c",HidePalindromes(in[100]));
   return 0;
}

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

 
 
 
 Re: Функция с char
Сообщение02.10.2013, 20:44 
Ваша функция HidePalindromes принимает в качестве параметра массив символов (вместо того, что надо по хорошему), а возвращает один символ, который вы успешно печатаете.
ЗЫ перед тем, как мучать форум еще десятком тем, подобных предыдущим трем вашим темам, изучите букварь по С - книжку Керригана Риччи, и желательно досконально. Иначе и следующие месяцы "изучения С" также пройдут впустую.

 
 
 
 Re: Функция с char
Сообщение02.10.2013, 20:58 
Я бы вам посоветовал переписать это в несколько функций — одна разбивает строку на слова, другая проверяет палиндромность слова, и уже в маленьких функциях разбираться с типами. Если всё собирать в одну громадную функцию, то не только за типами, за смыслом не уследишь! Потому функции в языках программирования и появились, а потом — всякие варианты ООП и прочие штуки.

При этом совершенно необязательно выделенные слова хранить как строки — можно хранить индексы начала и конца, или индекс начала и длину, или индекс начала и 1 + индекс конца (у этого есть некоторые преимущества перед обоими предыдущими способами). Потом такой массив прозрачно обрабатывается в цикле. Можно обойтись и без массива, сделав функцию с названием типа getNextWordInfo, которая будет возвращать индексы для следующего слова и количество пробелов, которые нужно после него вывести (чтобы не считать символы вне её и не загромождать код), а когда слова кончатся, она будет возвращать что-то явно определяющее конец итерациям.

Для этого надо будет знать про структуры. Это несложно, а код был бы, по моему субъективному мнению, намного понятнее, в него не нужно было бы вчитываться и искать, всё ли там гладко состыковано. А сейчас читать код нет желания.

-- Чт окт 03, 2013 00:01:40 --

P. S. Такие простыни кода на известных языках лучше засовывать не в теги code, а в теги syntax. Для этого в поле набора сообщения есть список «Выберите язык», при выборе языка ( :shock: ) в котором соответствующий текст вставляется в сообщение автоматически.

Пример:
Используется синтаксис C
int main(void)
{
  return 1; // о нет!
}

 
 
 
 Re: Функция с char
Сообщение02.10.2013, 23:01 
Структуры - это конечно хорошо, но указатели тоже стоит изучить.

код: [ скачать ] [ спрятать ]
Используется синтаксис C
void Hide_Palindromes(char* T)
{
        char *p1 = T, *p2 = T, *p3, *p4;
        int is_palindrome;

        while (1) {
                // начало очередного слова
                while (*p1 == ' ') p1++; p2 = p1;

                // прерываем если дошли до конца строки
                if (*p1 == 0) break;

                // конец очередного слова
                while ((*p2 != ' ') && (*p2)) p2++; p2--;

                // проверяем палиндром
                is_palindrome = 1; p3 = p1; p4 = p2;
                while (p3 < p4) if (*p3++ != *p4--) {is_palindrome = 0; break;}

                // "забиваем" слово, если оно палиндром
                if (is_palindrome) while (p1 <= p2) *p1++ = '*';

                // идем на следующую позицию после текущего слова
                p1 = p2 + 1;
        }
}

 
 
 
 Re: Функция с char
Сообщение03.11.2013, 22:27 
Ivana, попытаюсь осознать. Сейчас как раз начал изучать указатели.

 
 
 
 Re: Функция с char
Сообщение03.11.2013, 23:15 
shukshin, лучше поздно, чем ни разу. Месяц прошел, что там. Приведенный мной код весьма тривиален и к тому же снабжен комментариями. А Керригана-Ричи надо не только открывать, а вдумчиво и с пониманием читать. Начиная с того, что передавать в качестве параметра в функцию, а что лучше не передавать.

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group