2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Функция с char
Сообщение02.10.2013, 20:23 


20/10/12
235
Здравствуйте, уважаемые посетители форума! И это снова я, и идет 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 


05/09/12
2587
Ваша функция HidePalindromes принимает в качестве параметра массив символов (вместо того, что надо по хорошему), а возвращает один символ, который вы успешно печатаете.
ЗЫ перед тем, как мучать форум еще десятком тем, подобных предыдущим трем вашим темам, изучите букварь по С - книжку Керригана Риччи, и желательно досконально. Иначе и следующие месяцы "изучения С" также пройдут впустую.

 Профиль  
                  
 
 Re: Функция с char
Сообщение02.10.2013, 20:58 
Заслуженный участник


27/04/09
28128
Я бы вам посоветовал переписать это в несколько функций — одна разбивает строку на слова, другая проверяет палиндромность слова, и уже в маленьких функциях разбираться с типами. Если всё собирать в одну громадную функцию, то не только за типами, за смыслом не уследишь! Потому функции в языках программирования и появились, а потом — всякие варианты ООП и прочие штуки.

При этом совершенно необязательно выделенные слова хранить как строки — можно хранить индексы начала и конца, или индекс начала и длину, или индекс начала и 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 


05/09/12
2587
Структуры - это конечно хорошо, но указатели тоже стоит изучить.

код: [ скачать ] [ спрятать ]
Используется синтаксис 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 


20/10/12
235
Ivana, попытаюсь осознать. Сейчас как раз начал изучать указатели.

 Профиль  
                  
 
 Re: Функция с char
Сообщение03.11.2013, 23:15 


05/09/12
2587
shukshin, лучше поздно, чем ни разу. Месяц прошел, что там. Приведенный мной код весьма тривиален и к тому же снабжен комментариями. А Керригана-Ричи надо не только открывать, а вдумчиво и с пониманием читать. Начиная с того, что передавать в качестве параметра в функцию, а что лучше не передавать.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

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


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group