Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Напечатать самое длинное слово в строке 
V
    Опции темы
Алексей
Дата 29.6.2006, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 19.6.2006

Репутация: нет
Всего: нет



Здравствуйте.
Помогите, пожалуйста, найти ошибку.
Дана строка, в ней слова разделены запятыми, последняя точка. Напечатать самое длинное слово.
Я делал без учета пробелов. Т.е. "ффф,фф,фффффф,фф,ф."
Функция возвращает, что попало.

Код

char*lonword(char*str1)
{
  char *st=str1, *st1;
  int n,k;
  n=0; k=0;
  while(*st  && *st!='.')
  {
    if(*st==',')
      {
        if(k<n)
          {
            k=n; //размер слова
            st1=st-n; //ставим указатель на начало слова
            n=0;

          }
        st++;
      }
    n++;
    st++;
  }
  char* str=new char[k+1];
  strncpy(str,st1,k);


  return (str);

}


Заранее спасибо.
С уважением. 
PM MAIL   Вверх
MAKCim
Дата 29.6.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



лучше так
Код

char* find(const char* string)
{
    char* ptr, *beg=NULL, *end=NULL;
    size_t max_length=0;
    while ((ptr=strtok(string,",."))!=NULL)
    {
        if (ptr-string>max_length) 
        {
            max_length=ptr-string;
            beg=string;
            end=ptr;
        }
        string=ptr+1;
    }
    char* result=(char*) malloc(sizeof(char)*(end-beg+1));
    strncpy(result,beg,end-beg);
    *(result+(end-beg))='\0';
    return result;
}
 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Xatch
Дата 29.6.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.6.2006

Репутация: нет
Всего: нет



Могу скинуть прогу, реализованную на Borland C 3

выглядит так:

#include <stdio.h>
  main()
            {
           char str[79];
               char nac, kon, lmax, i, k, n;
               i=k=lmax=n=0;
               printf("введи строку:\n");
                  while((str[n++]=getchar())!='\n');
                     for(i=0;i<n;i++)
                        {
                            if(str[i] !=' ' && str[i] !=' ' && str[i] != '\n')
                               k++;
                           else
                              {
                                if(lmax<k)
                                  {
                                      lmax=k;kon=i;
                                  }
                               k=0;
                             }
                      }
               nac=kon-lmax;
               kon-=1;
               for(i=nac;i<=kon;i++)
               printf("%c", str[i]);
               printf("\n");
               printf("%d %d %d \n", nac, kon, lmax);
            }

сам понимаешь, здесь слова отделены пробелами.

а вот так можно на паскале:

program ww111;                                                                                     
{ Определить самое короткое и самое длинное
       слово в строке введённой с клавиатуры }
uses crt;
var i,l,min,max,p1,p2,j:longint;a,b:string;                                        
    t1:array[1..60]of string;
    t2:array[1..60]of longint;
 begin
  clrscr;textcolor(11);
   write('введите текст: ');readln(a);
   l:=length(a)+1;a[l]:=' ';
   for i:=1 to l do
    if a[i]=' ' then begin
                      inc(j);t1[j]:=b;
              t2[j]:=length(b);b:='';
             end
            else b:=b+a[i];
    max:=t2[1];min:=t2[1];p1:=1;p2:=1;
   for i:=1 to j do
    begin
     if max<t2[i] then begin max:=t2[i];p1:=i; end;
     if min>t2[i] then begin min:=t2[i];p2:=i; end;
    end;
   writeln('самое длинное слово: ',t1[p1]);
   writeln('самое короткое слово: ',t1[p2]);
   textcolor(13);write('P.S.');
   writeln(' Если слово не выведено на печать, то вы ');
   write(' поставили несколько подряд идущих пробелов!');
  readln;
 end.

Извини если не в тему, но думаю разобраться здесь можно... 
PM MAIL   Вверх
HMLd
Дата 30.6.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: 1
Всего: 0



Я сделал так:
Код

#include <stdio.h>

const int MAX = 20;                                    // Максимальная длина слова
int LongWord (FILE*, char*);

int main ()
{
   FILE* in = fopen ("input.txt", "r");
   FILE* out = fopen ("output.txt", "w");

   char word[MAX];                                     // Текущее слово
   char tmp[MAX];                                       // Следующее слово в файле
   for (register short i = 0; i < MAX; i++)
    word[i] = tmp[i] = '\0';
   int old_size = LongWord (in, word);       // Размер текущего слова
   while (!feof (in))
   {
    int new_size = LongWord (in, tmp);  // Размер следующего слова в файле
        if (new_size && new_size > old_size)
        {
               for (register short i = 0; i < new_size; i++)
          word[i] = tmp[i];
                old_size = new_size;
         }
   }
   for (register short i = 0; i < old_size; i++)
    fprintf (out, "%c", word[i]);
   _fcloseall ();
   return 0;
}

int LongWord (FILE* in, char* rhs)
{
    for (register short i = 0; rhs[i] != '\0'; i++)
    rhs[i] = '\0';
    register short i = 0;
    char ch = getc (in);
        while (ch != ',' && ch != '.' && ch != EOF)
        {
            rhs[i] = ch;
            i++;
            ch = getc (in);
        }
         return i;
}


smile 
PM MAIL   Вверх
Алексей
Дата 30.6.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 19.6.2006

Репутация: нет
Всего: нет



А разве компилятор операцию str[i] не выполняет дольше, чем *(str+i)?
Все таки, на сколько мне известно, стилем C++  является второй вариант.
Поэтому я и пытался сделать с помощью указателей.

MAKCim, Ваш вариант, конечно, лучше, но программу я эту пишу по просьбе одного студента, завалившего экзамен. Ему не поверят, что это он писал. Я пытался переделать Ваш вариант Xatch, но опять получил кучу ошибок.  smile 
 
PM MAIL   Вверх
MAKCim
Дата 30.6.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Ему не поверят, что это он писал.

Тут же вроде нет ничего сверхестественного
Цитата

А разве компилятор операцию str[i] не выполняет дольше, чем *(str+i)?

по-моему для указателей компилятор str[i] разворачивает в *(str+i)
поэтому, имхо, да 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Rockie
Дата 30.6.2006, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Алексей @  29.6.2006,  20:16 Найти цитируемый пост)
Дана строка, в ней слова разделены запятыми, последняя точка. Напечатать самое длинное слово.


чтож, выложу и я свою версию =)

Код
#include <iostream>
#include <conio>

using namespace std;

int main(void)
{ char * buff = new char[81];     // temp buff
  char * word = new char[81];     // our word
  char str[] = "text,text2.revolution,cat,doggy,krokodilegreen,yighhhhhhhhhhx.";

  word = strtok(str, ",.");        // first word

  while(1)
 {  buff = strtok(NULL, ",.");     // next
    if(buff==NULL) break;          // if the end of string
    if(strlen(buff)>strlen(word))  // if buff is bigger, word will be buff now
       strcpy(word,buff);
 }

   if(word[strlen(word)-1] == '.') word[strlen(word)-1]='\0';  // if word is last
   cout<<word<<'\n';
   getch();

   delete [] buff;
   delete [] word;

   return 0;
}
 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Rockie
Дата 30.6.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Алексей @  30.6.2006,  16:03 Найти цитируемый пост)
А разве компилятор операцию str[i] не выполняет дольше, чем *(str+i)?
Все таки, на сколько мне известно, стилем C++  является второй вариант.


Алексей, возможно это будет быстрее. но скорость - не единственный критерий оценки программы. imho прирост в скорости применительно к данной лабе будет абсолютно незаметен.  зато *(str+i) намного труднее читается чем str[i].

 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
HMLd
Дата 30.6.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: 1
Всего: 0



Rockie
Полностью согласен... А тем более если тот студент экзамен завлил, то str[i] IMHO лучше smile
 
PM MAIL   Вверх
Алексей
Дата 30.6.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 19.6.2006

Репутация: нет
Всего: нет



Цитата

Тут же вроде нет ничего сверхестественного

У меня на руках его лекции. Вернее ксерокс лекций его одногруппницы  smile 
Они кроме функций strlen, strcpy, strcmp и strcat ничего больше не учили. (Как можно С++ за семестр выучить?!)
Вряд ли они поверят, что он ради экзамена полез по справочникам.

Цитата

А тем более если тот студент экзамен завлил, то str[i] IMHO лучше 

А если преподаватель рекомендовал с помощью указателей? В его положении не хорошо спорить.  smile 

Поэтому я и пытаюсь сделать с помощью указателей и с вышеупомянутыми функциями. smile
 
PM MAIL   Вверх
Алексей
Дата 30.6.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 19.6.2006

Репутация: нет
Всего: нет



Ну вот я ошибку нашел!
Код

char*lonword(char*str1)
{
  char *st=str1, *st1;
  int n,k;
  n=0; k=0;
  while(*st)
  {
    if(*st==',' || *st=='.')
      {
        if(k<n)
          {
            k=n; //ðàçìåð ñëîâà
            st1=st-n; //ñòàâèì óêàçàòåëü íà íà÷àëî ñëîâà


          }
        st++;   n=0;
      }
    n++;
    st++;
  }
  char* str=new char[k+1];
  strncpy(str,st1,k);


  return (str);

}



n=0 ни туда воткнул! smile 

Код, конечно, корявый, но для него сойдет.
Теперь объясните мне, почему это в С++ 3.1 работает, а в 6-м Билдере нет. 
В Билдере оно к распечатанному слову добавляет какие-то символы. 
PM MAIL   Вверх
Rockie
Дата 30.6.2006, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Алексей @  30.6.2006,  19:33 Найти цитируемый пост)
Они кроме функций strlen, strcpy, strcmp и strcat ничего больше не учили. (Как можно С++ за семестр выучить?!)

лично меня все учили нажимать F1 и Ctrl+F1. или там где твой друг учится пользуются только теми функциями что в тетрадке?
Цитата(Алексей @  30.6.2006,  19:33 Найти цитируемый пост)
 (Как можно С++ за семестр выучить?!)

а его и не надо выучить. нужно понимать где что лежит (жать F1). imho
Цитата(Алексей @  30.6.2006,  19:33 Найти цитируемый пост)
А если преподаватель рекомендовал с помощью указателей? В его положении не хорошо спорить.   

так об этом нужно черным по русскому написать в задании. кстати str[i] это тоже указатели. [] - это разыменование.

Цитата(Алексей @  30.6.2006,  20:42 Найти цитируемый пост)
Код, конечно, корявый, но для него сойдет.
Теперь объясните мне, почему это в С++ 3.1 работает, а в 6-м Билдере нет.

как тебе кажется эти предложения звучат в связке? 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Xenon
Дата 30.6.2006, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



[] - Это немного больше, чем разыменование smile 


--------------------
user posted image  
PM MAIL   Вверх
MAKCim
Дата 1.7.2006, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Они кроме функций strlen, strcpy, strcmp и strcat ничего больше не учили. (Как можно С++ за семестр выучить?!)

вообще это мало к С++ относится  smile  скорее С
Цитата

А если преподаватель рекомендовал с помощью указателей? В его положении не хорошо спорить. 

Оба варианта - с указателями, просто с [] более читабельный вариант!
Цитата

а его и не надо выучить. нужно понимать где что лежит (жать F1). imho

базис должен быть
 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Алексей
Дата 1.7.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 19.6.2006

Репутация: нет
Всего: нет



Цитата

как тебе кажется эти предложения звучат в связке?  

А Вы разницу между "корявый" и "неработающий" чувствуете?

Цитата

лично меня все учили нажимать F1 и Ctrl+F1. или там где твой друг учится пользуются только теми функциями что в тетрадке?


А какая разница между справочником и F1?  smile Мой друг учится по системе российского образования, а там, как известно, для сдачи экзамена того, что в тетрадке достаточно!  smile 
Ему бы вообще дохлой троечки хватило!
 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0995 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.