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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2010, 22:17   #1
Bl@st
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 47
По умолчанию Указатели(Си)

Здраствуйте подскажите пожалуйста!
Задание такое: В символьной строке удалить все слова, начинающиеся и заканчивающиеся на одну и ту же букву.
(Обработка строки должна быть выполнена в виде функции с использованием команд адресной арифметики.)
В задание на обработку строк я сделал так:
Код:
#include<stdio.h>

void main()
{
	char word[25],out[100];
	char c;/*текущий символ*/
	int i=0,j,i1=0;

	printf("введите строку:");

	while(c=getchar())/*выделяем слово*/
	{
		if(c!=' '&&c!='\n')
		{
			word[i]=c;
			i++;
		}
		else if(c==' '||c=='\n')
		{
			if(word[0]!=word[i-1])/*проверка*/
			{
				for(j=0;j<i;j++)
				{
					out[i1]=word[j];
					i1++;
				}
				out[i1]=' ';
				i1++;
			}
			i=0;
		}
		if(c=='\n')
		{
			out[i1]='\0';
			break;
		}
	}
	puts(out);
}
а как это сделать с указателями не совсем ясно пока что, я так понимаю нужно ввести два указателя, допустим *uk1,*uk2, сделать допустим вот так:
Код:

char word[25],out[100];
	char c;
	int i=0,j,i1=0;
	char *uk1,*uk2;

	printf("введите строку:");

	while(c=getchar())
	{
		if(c!=' '&&c!='\n')
		{
			word[i]=c;
			i++;
		}
		else if(c==' '||c=='\n')
		{
			uk1=&word[0];
			uk2=&word[i-1];
			if(*uk1!=*uk2)
смысл тогда их использовать, направьте пожалуйства на верный путь.
и я так понимаю проверка, обработка строки должна быть в отдельной функции?
Bl@st вне форума Ответить с цитированием
Старый 07.01.2010, 19:59   #2
Bl@st
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 47
По умолчанию

пока что то вот такое у меня:
Код:

void testword(char *p)
{
	char temp;/*первый символ*/
	int j=0,k;
	while(*p)
	{
		if(*p!=' ')
		{
			if(*(p-1)==' '||j==0)
			{
				temp=*p;/*записываем первый символ*/
				k=j;
			}
			else if(*(p+1)==' '||(p+1=='\0'))
			{
				if(temp==*p)
				{
					j=k;/*возвращаемся в первую позицию*/
				}
			}
		}
		j++;
	}
}
подскажите пожалуйста! халявы не ищу, чтобы кто то за меня ее написал поправьте или подскажите, что можно почитать, не до конца пока что с указателями разобрался первая программа

Последний раз редактировалось Bl@st; 07.01.2010 в 22:03.
Bl@st вне форума Ответить с цитированием
Старый 09.01.2010, 13:57   #3
Bl@st
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 47
По умолчанию

ап!!!!!!!!
Bl@st вне форума Ответить с цитированием
Старый 11.01.2010, 17:33   #4
Bl@st
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 47
По умолчанию

отпишитесь хоть кто-нибудь пожалуйста! застрял тут(
Bl@st вне форума Ответить с цитированием
Старый 12.01.2010, 01:53   #5
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Ну вот чтото вроде этого:
Код:
#include "stdafx.h"
#include <stdio.h>

void Process(char* in, char* out)
{
  char* startOfWord = in;
  char* endOfWord = in;
  char* outP = out;
  while (*endOfWord!=0)
  {
    if (*startOfWord == ' ')
    {
      *outP = *startOfWord;
      outP++;
      startOfWord++;
	  endOfWord = startOfWord;
    } else {
      if ( (*(endOfWord+1) != 0)&&(*(endOfWord+1) != ' ') )
      {
        endOfWord++;
      } else {
        if (*startOfWord == *endOfWord)  // Первая и последняя буква в слове совпадает
        {
          endOfWord++;
          startOfWord = endOfWord;
        } else {
          while (startOfWord!=endOfWord)
          {
            *outP = *startOfWord;
            outP++;
            startOfWord++;      
          }
          *outP = *startOfWord;
          outP++;
          startOfWord++;
          endOfWord++;
        }
      }
    }
  }
  *outP = 0;
}


int main(int argc, _TCHAR* argv[])
{
	char s[81];
	gets(s);
	printf("%s\n",s);
	Process(s,s);
	printf("Result=%s\n",s);
	return 0;
}
заметь что функция Process допускает как одну и туже ссылку для in и out так и разные.
и ещё одно. когда функция удалает слово она оставляет пробелы перед и после него.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 12.01.2010 в 02:00.
val_nnm вне форума Ответить с цитированием
Старый 12.01.2010, 19:26   #6
Bl@st
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 47
По умолчанию

val_nnm спасибо! а если без аргументов в главной функции? зачем они нужны? можно их убрать попроще чтобы сделать?
вот попробовал задачку эту на массивах сделать, а потом на указателях, чтобы чтобы проще было но что то не так делаю не выбает результат:
Код:
#include<stdio.h>
#include<windows.h>

int testword(char c)
{
	char word[25];
	int j,i1=0,i=0;
	char out[100];

	if(c!=' '&&c!='\n')
	{
		word[i]=c;
		i++;
	}
	else if(c==' '&&c=='\n')
	{
		if(word[0]!=word[i-1])
		{
			return true;
		}
		i=0;
		return false;
	}

}

void main()
{
	SetConsoleCP (1251);
	SetConsoleOutputCP (1251);

	char out[100];
	char word[25];
	char c;
	int i,j,i1;

	printf("enter the string:");

	while(c=getchar())
	{
		if(testword(c))
		{
			for(j=0;j<i;j++)
			{
				out[i1]=word[j];
				i1++;
			}
			i=0;
		}
	}
	puts(out);
}
Bl@st вне форума Ответить с цитированием
Старый 12.01.2010, 21:03   #7
Bl@st
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 47
По умолчанию

Код:
#include<stdio.h>
#include<windows.h>

testword(char string[])
{
	int i;
	int i1=0;
	int j=0;
	int in;
	int out;
	char d[100];
	
	for(i=0;string[i]!='\0';i++)
	{
		if(string[i-1]==' '||i==0)
		{
			in=i;
			printf("%d,%c\n",i,string[in]);
		}
		if(string[i+1]==' '||string[i+1]=='\0')
		{
			out=i;
			printf("%d,%c\n",i,string[out]);

			if(string[in]!=string[out])
			{
				for(j=in;j<out;j++)
				{
					d[i1]=string[j];
				}
				d[i1]=' ';
				i1++;
			}
		}
		printf("%s\n",d);
	}
	return 0;
}

void main()
{
	SetConsoleCP (1251);
	SetConsoleOutputCP (1251);
	
	char s[100];
	gets(s);
	printf("%s\n",s);
	testword(s);
}
подскажите где у меня тут ляп? выдает какие то иероглифы вместо слова
что то в цикле for наверно о.О блин ну должна же работать((((

Последний раз редактировалось Bl@st; 13.01.2010 в 01:02.
Bl@st вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели Mighty Помощь студентам 1 24.10.2009 18:01
Указатели olli Общие вопросы C/C++ 3 20.05.2009 19:40
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39
Указатели Mango Помощь студентам 2 09.12.2008 12:15