Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 16.09.2019, 17:31   #1
Степан Рыльцын
Новичок
Джуниор
 
Регистрация: 16.09.2019
Сообщений: 5
Репутация: 10
По умолчанию Указатели(Си)

Задание:В символьной строке удалить самое длинное слово с использованием указателей, не допускается использование библиотек работы с символьными строками, не допускается использование библиотек работы с символьными строками.
Вот рабочий код, помогите, пожалуйста, его доработать, чтобы он работал с указателями, заранее спасибо
Код:
# include <stdio.h>
# define LEN 1000
void main(void)
{
	char line[LEN];
	int i = 0;
	int start;
	int counter = 0;
	int max = 0;
	gets(line);
	while (line[i] != '\0') // поиск максимальной длины слова и его начала
	{
		if ((line[i] != ' ') && (line[i] != '.') && (line[i] != ','))
		{
			counter++;
			if (counter > max)
			{
				max = counter;
				start = i - max + 1;
			}
		}
		else
			counter = 0;
		i++;
	}
	i = start;
	while (i < (LEN - max)) //перезапись
	{
		line[i] = line[i + max];
		i++;
	}
	puts(line);
}
______________________
Используйте тег [CODE] (кнопка [CODE] в форме сообщения) при вставке кода на форум. Подробнее в FAQ

Последний раз редактировалось Степан Рыльцын; 16.09.2019 в 21:18.
Степан Рыльцын вне форума   Ответить с цитированием
Старый 16.09.2019, 17:34   #2
Alex11223
Модератор
Заслуженный модератор
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,267
Репутация: 3739

icq: 512-765
skype: alexp.frl
По умолчанию

Так вопрос-то какой?
Alex11223 на форуме   Ответить с цитированием
Старый 16.09.2019, 21:17   #3
Степан Рыльцын
Новичок
Джуниор
 
Регистрация: 16.09.2019
Сообщений: 5
Репутация: 10
По умолчанию

Суть программы остаётся той же, только нужно переделать её с использованием указателей
Степан Рыльцын вне форума   Ответить с цитированием
Старый 16.09.2019, 21:38   #4
Alex11223
Модератор
Заслуженный модератор
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,267
Репутация: 3739

icq: 512-765
skype: alexp.frl
По умолчанию

и? что не получается?
Alex11223 на форуме   Ответить с цитированием
Старый 16.09.2019, 23:56   #5
Desc
Developer
ФорумчанинФорумчанин
 
Аватар для Desc
 
Регистрация: 21.11.2007
Адрес: Ukraine
Сообщений: 215
Репутация: 51
По умолчанию

Такой примитив-чик подойдет?
Код:
//while (line[i] != '\0') // поиск максимальной длины слова и его начала
  while (line[i] != '0') // поиск максимальной длины слова и его начала
  {
    int *ptr=&i;//указатель на переменную line[i]
    if ((ptr[i] != ' ') && (ptr[i] != '.') && (ptr[i] != ','))
Чтиво >>Что такое указатели<< ссылка

Последний раз редактировалось Desc; 17.09.2019 в 01:41.
Desc вне форума   Ответить с цитированием
Старый 17.09.2019, 11:48   #6
Степан Рыльцын
Новичок
Джуниор
 
Регистрация: 16.09.2019
Сообщений: 5
Репутация: 10
По умолчанию

Не получается то, что, если я использую указатели, то программа выдаёт мне адрес, а не удаляет самое длинное слово.
Степан Рыльцын вне форума   Ответить с цитированием
Старый 17.09.2019, 12:01   #7
Степан Рыльцын
Новичок
Джуниор
 
Регистрация: 16.09.2019
Сообщений: 5
Репутация: 10
По умолчанию

Сделать по типу этого(только тут удаляется слово, которое заканчивается на 2 одинаковых буквы), из первого кода преобразован второй :
Первый код:
Код:
#include <stdio.h> // определение символических констант
 #define YES  1 
#define NO   0 
#define MAXLINE 1000 
void process_line( char buffer[] ); 
int main( void ) 
{ 
 char line[MAXLINE]; 
 gets( line );  
 process_line( line ); 
 puts( line ); 
 return 0; 
} 
void process_line( char buffer[] ) 
{  
char c;  // текущий символ 
 int prev_c;  // предыдущий символ  
int flag; // признак слова 
 int found; // индикатор того, что искомый признак  в слове обнаружен
  int i;  // позиция текущего символа исходной  cтроки 
 int pos;  // позиция текущего символа  результирующей строки 
 int start; // позиция начала слова 
 int j;  // начальные присваивания (инициализация) 
 flag = NO; 
 found = NO; 
 prev_c = ' '; 
 start = 0; 
 i = 0; 
 pos = 0; 
 // цикл чтения символов из строки  do 
 {   c = buffer[i]; // взять текущий символ из       // буфера 
  if( c == ' ' || c == '.' || c == ',' ||  c == '\n' || c == '\0') 
  {    // найден разделитель   
 if( flag == YES ) 
  {     // это первый разделить после слова  проверить, обнаружен ли в слове  искомый признак    
 if( found == NO )   
  {      // слово не подлежит удалению оно копируется в результирующую  строку     
 for( j = start; j < i; j++ ) 
 buffer[pos++] = buffer[j];  
  } 
  } 
   flag = NO; 
   buffer[pos++] = c; 
  } 
  else 
  {    // найдена буква  
  if( flag == NO )    
 start = i; //запомнить позицию начала слова проверка совпадения текущего и предыдущего символов    // (обнаружение искомого признака в слове)    
if( prev_c == c ) 
  found = YES; 
   else 
    found = NO; 
   flag = YES; 
  } 
  prev_c = c; 
  i++; 
 } 
 while( c != '\0' );  
}
Второй код:
Код:
#include <stdio.h> // определение символических констант
#define YES  1 
#define NO   0 
#define MAXLINE 1000 
void process_line( char buffer[] );  
int main( void ) 
{ 
 char line[MAXLINE]; 
 gets( line );  
 process_line( line ); 
 puts( line ); 
 return 0; 
} 
void process_line( char buffer[] ) 
{  char c;  // текущий символ
  int prev_c;  // предыдущий символ  
int flag; // признак слова  
int found; // индикатор того, что искомый признак  в слове обнаружен  
char *in_ptr; // указатель на текущий символ  входной строки  
char *out_ptr;   // указатель на текущий символ выходной строки  
char *word_ptr; // указатель на начало слова 
 // начальные присваивания (инициализация) 
 flag = NO; 
 found = NO; 
 prev_c = ' '; 
 word_ptr = buffer; 
 in_ptr   = buffer; 
 out_ptr  = buffer; 
 // цикл чтения символов из строки  do 
 { 
  c = *in_ptr; // взять текущий символ из буфера 
  if( c == ' ' || c == '.' || c == ',' ||  c == '\n' || c == '\0') 
  {    // найден разделитель    
if( flag == YES ) 
   {     // это первый разделить после слова проверить, обнаружен ли в слове искомый признак     
if( found == NO )  
    {      // слово не подлежит удалению оно копируется в результирующую строку      
while( word_ptr < in_ptr ) 
      *out_ptr++ = *word_ptr++;  
    } 
   } 
   flag = NO; 
   *out_ptr++ = c; 
  } 
  else 
  {    // найдена буква 
   if( flag == NO ) 
    word_ptr = in_ptr; // запомнить адрес начала слова 
// проверка совпадения текущего и предыдущего символов(обнаружение искомого признака в слове)    if( prev_c == c ) 
    found = YES; 
   else 
    found = NO; 
   flag = YES; 
  } 
  prev_c = c;  
 in_ptr++;  продвинуть вперёд указатель на текущий символ  
} 
 while( c != '\0' );  
}
Степан Рыльцын вне форума   Ответить с цитированием
Старый 17.09.2019, 12:03   #8
Alex11223
Модератор
Заслуженный модератор
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,267
Репутация: 3739

icq: 512-765
skype: alexp.frl
По умолчанию

Цитата:
Сообщение от Степан Рыльцын Посмотреть сообщение
программа выдаёт мне адрес, а не удаляет самое длинное слово.
так и где этот код?
Alex11223 на форуме   Ответить с цитированием
Старый 17.09.2019, 13:02   #9
Степан Рыльцын
Новичок
Джуниор
 
Регистрация: 16.09.2019
Сообщений: 5
Репутация: 10
По умолчанию

Код:
# include <stdio.h>
# define LEN 1000
void main(void)
{
	char line[LEN];
	int i = 0;
	int start;
	char *counter = 0;
	char *max = 0;
	gets(line);
	while (line[i] != '\0') // поиск максимальной длины слова и его начала
	{
		if ((line[i] != ' ') && (line[i] != '.') && (line[i] != ','))
		{
			*counter++;
			if (counter > max)
			{
				max = counter;
				start = i - *max + 1;
			}
		}
		else
			counter = 0;
		i++;
	}
	i = start;
	while (i < (LEN - *max)) //перезапись
	{
		line[i] = line[i + *max];
		i++;
	}
	puts(line);
}
Степан Рыльцын вне форума   Ответить с цитированием
Старый 17.09.2019, 13:29   #10
Alex11223
Модератор
Заслуженный модератор
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,267
Репутация: 3739

icq: 512-765
skype: alexp.frl
По умолчанию

так при сравнении тоже * нужен, чтобы не адреса сравнивать.
Но вообще тут бессмысленная фигня какая-то и вряд ли от вас это хотели, какой смысл тут делать эти два числа указателями? (еще и указывающими непонятно на что, вы не выделили для них память)
Разберитесь для начала хоть что первый код делал, counter это просто счетчик для длины текущего слова, а max — длина самого длинного слова. Зачем вы их пытаетесь в символы превратить?

Последний раз редактировалось Alex11223; 17.09.2019 в 13:34.
Alex11223 на форуме   Ответить с цитированием
Ответ

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели - надо начальную букву в слове сделать большой используя указатели FerrariF70 Общие вопросы C/C++ 13 08.09.2017 05:28
Указатели vrtp Общие вопросы C/C++ 6 08.11.2011 01:33
Указатели С++ MarihuanaP Помощь студентам 1 09.02.2010 18:06
указатели Артэс Общие вопросы C/C++ 11 07.02.2010 17:47
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39


10:53.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.