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

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

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

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

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

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

Задание:В символьной строке удалить самое длинное слово с использованием указателей, не допускается использование библиотек работы с символьными строками, не допускается использование библиотек работы с символьными строками.
Вот рабочий код, помогите, пожалуйста, его доработать, чтобы он работал с указателями, заранее спасибо
Код:
# 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 в 20:18.
Степан Рыльцын вне форума Ответить с цитированием
Старый 16.09.2019, 16:34   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так вопрос-то какой?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.09.2019, 20:17   #3
Степан Рыльцын
 
Регистрация: 16.09.2019
Сообщений: 5
По умолчанию

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

и? что не получается?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.09.2019, 22:56   #5
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

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

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

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

Сделать по типу этого(только тут удаляется слово, которое заканчивается на 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, 11:03   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Степан Рыльцын Посмотреть сообщение
программа выдаёт мне адрес, а не удаляет самое длинное слово.
так и где этот код?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.09.2019, 12:02   #9
Степан Рыльцын
 
Регистрация: 16.09.2019
Сообщений: 5
По умолчанию

Код:
# 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, 12:29   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

так при сравнении тоже * нужен, чтобы не адреса сравнивать.
Но вообще тут бессмысленная фигня какая-то и вряд ли от вас это хотели, какой смысл тут делать эти два числа указателями? (еще и указывающими непонятно на что, вы не выделили для них память)
Разберитесь для начала хоть что первый код делал, counter это просто счетчик для длины текущего слова, а max — длина самого длинного слова. Зачем вы их пытаетесь в символы превратить?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

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


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



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