C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Работа со строками, найти самое длинное слово
Anium
Отправлено: 09.11.2006, 16:35


Ученик-кочегар

Группа: Участник
Сообщений: 16



Написал прогу, но она работает неправильно... Требуется найти самое длинное и короткое слово введённое в консоли пользователем. Написал код для вывода самого длинного слова, но постоянно самым длиинным словом оказывается первое...

CODE
// Самое длинное слово
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <vcl.h>
# define ENTER 13
void main (void)
{int n=80,i,j,begin,length=0;
char ch,*txt=(char*)calloc(n,sizeof(char));
clrscr();
puts("ENTER-конец ввода");
for(i=0;(ch=getche())!=ENTER;i++)
{if(i==n-1){n+=80;txt=(char*)realloc(txt,n*sizeof(char));}
txt[i]=ch;
if(ch==' ')
{for(j=i;(txt[j-1]!=' ')&&(j>0);j--);
if(i-j>length) {length=i-j;begin=j;}
}
}txt[i]=NULL;
puts("\nСамое длинное слово:");
for(i=begin;i<length+begin;i++)
printf("%c",txt[i]);
free(txt);
getche();
}


Отредактировано Anium — 09.11.2006, 16:36
beginner
Отправлено: 09.11.2006, 17:31


Дежурный стрелочник

Группа: Участник
Сообщений: 44



Ты не проверяешь последнее слово.

После
txt[i]=NULL;
нужно бы
if((i>0)&&(txt[i-1]!=' ')
{
подсчет длины.
}

Кроме этого, вместо
for(j=i;(txt[j-1]!=' ')&&(j>0);j--);
лучше бы
for(j=i;(j>0)&&(txt[j-1]!=' ');j--);

Если ввести одну переменную lastSpPos, в которую записывать
позицию последнего пробела, то можно обойтись без цикла.
AVC
Отправлено: 09.11.2006, 17:48


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Требуется найти самое длинное слово введённое в консоли

Эх, вспомним молодость smile.gif и турбо С
CODE

#include <stdio.h>
//.......................................................
//=======================================================

void main (int arg_cou, char** arg_cnt)
{
char str [200], *cp, *lng;
int i, maxlen, curlen;
char c;

// вводим слова
for (i=0; i < (sizeof(str)-2); i++)
{ c = getchar();
  if (c == '\n') break;
  str[i] = c;
}
str [i] = ' ';
str [i+1] = 0x00;

// найти самое длинное
cp = lng = str;
maxlen = 0;
for (i=0; str[i]; i++)
{ if (str[i] == ' ') // слово кончилось
   { if (*cp == ' ')   // пробросить группу пробелов
      { cp = str+i; continue; }
     curlen = (str+i) — cp;
     if (curlen > maxlen)  // это слово длиннее ?
      { maxlen = curlen; lng = cp; }
     str[i] = 0x00;
     printf("<%s> %2d %2d\n", cp, curlen, maxlen); // отладка
     cp = str + i + 1;
   }
  else // не кончилось
   { if (*cp == ' ') cp = str + i;
   }
}

printf("Самое длинное оказалось <%s>\n", lng);
getchar();
}
//-------------------------------------------------------
Anium
Отправлено: 09.11.2006, 18:00


Ученик-кочегар

Группа: Участник
Сообщений: 16



Спасибо!
Anium
Отправлено: 07.12.2006, 11:35


Ученик-кочегар

Группа: Участник
Сообщений: 16



А можно поинтересоваться смыслом этих строчек?:

1. str [i] = ' ';
2. str [i+1] = 0x00;
3. for (i=0; i < (sizeof(str)-2); i++) // интересует роль sizeof
AVC
Отправлено: 07.12.2006, 12:29


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
А можно поинтересоваться смыслом этих строчек?:

Можно.

QUOTE
1. str [i] = ' ';

Добавляетс к вводу пробел так как алгоритм стчитает что слово всегда ограничено пробелом

QUOTE
2. str [i+1] = 0x00;

добавляет байт 0 для приведения строки к формату asciiz

QUOTE
3. for (i=0; i < (sizeof(str)-2); i++) // интересует роль sizeof

Рассчитывает размер буфера приемника дабы не выйти за границу массива.
Anium
Отправлено: 07.12.2006, 14:10


Ученик-кочегар

Группа: Участник
Сообщений: 16



QUOTE
добавляет байт 0 для приведения строки к формату asciiz

а что это за формат и зачем нужно приводить строку к этому формату?

QUOTE
Рассчитывает размер буфера приемника дабы не выйти за границу массива.

(sizeof(str)-2)

а почему именно минус 2?

Отредактировано Anium — 07.12.2006, 14:11
AVC
Отправлено: 07.12.2006, 15:13


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (Anium @ 07.12.2006, 13:10)

а что это за формат и зачем нужно приводить строку к этому формату?

строка ascii оганиченная байтом со значением 0. Предвосхищая дальнейший вопрос — 0 в конце строки нужен что бы сработало условие выхода из цикла for (i=0; str[i]; i++)
запись str[i] эквивалентна str[i] != 0

QUOTE (Anium @ 07.12.2006, 13:10)

а почему именно минус 2?

потому что str [предпоследний] = ' ' а str [последний] = 0x00
-2 резервиреут 2 байта для этих присвоений.
Anium
Отправлено: 07.12.2006, 16:06


Ученик-кочегар

Группа: Участник
Сообщений: 16



Ясно, благодарю smile.gif

Вернуться в Вопросы программирования в C++Builder