Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Сортировка слов в строке


Автор: goody 21.9.2008, 16:49
Помогите!! Вообщем задание- создать функцию, которая находит самое длинно слово  и возращает указатель на него, потом с ее помощью вывести слова в порядке убывания!

Функция вроде получилась ,но не понимаю как второй раз ее вызвать чтоб она первое слово игнорировала





Код

#include <stdio.h>
#include <string.h>


using namespace std;


int fyn(char *s);

int main()
{
    char str[250]=" aaaaaa bb cccccccccccc";
    int i,j;
    j=0;
    for(i=fyn(str); i<strlen(str); i++)
    {
        if(str[i]!=' ')
        {
            
            printf("%c", str[i]);
            j++;
        }
        else 
          break; // что тут должно быть? 
    }
    return 0;
}



int fyn(char *s)
{
    int x,y,z,k,l;
    y=z=0;
        
    for(x=0; x<strlen(s); x++)
    {
        
         if(x==strlen(s)-1  && y>0 )
            {
                if( y>z)
                    l=k-y+1;
                    z=y;
                y=0;
            }
        else if(s[x]!=' ')
        {
            y++;
            k=x;
        }
        else if(s[x]==' '  && y>0 )
        {
            if( y>z)
                l=k-y+1;
                z=y;
            y=0;
        }
        
        
    }
printf("\n");
return l;
}


Автор: 0xffff 21.9.2008, 17:26
Я бы предложил вот такой вариант. Только чтобы ввести строку,нужно два раза нажать Enter.(а можно сначала считать в буфер через cin.getline(), а потом преобразовать в string). Если что не понятно, спрашивай
Код

#include <iostream>
#include <string>
using namespace std;
struct str_info
{
    int begin;
    int end;
    int len;
};
int main(int argc,char **argv)
{
    
    string str;
    int k,n;
    getline(cin,str);
    int len = str.length();
    str_info *str_inf = new str_info[len];

    int pos,lastpos;
    int i;
    lastpos = 0;
    pos  = str.find(" ");
    k =0;
    while (pos != -1)
    {
        str_inf[k].begin = lastpos;
        str_inf[k].end = pos-1;
        str_inf[k].len = pos - lastpos;
        k++;
        lastpos = pos;
        lastpos++;
        pos  = str.find(" ",lastpos);
        
    }
    str_inf[k].begin = lastpos;
    str_inf[k].end = len-1;
    str_inf[k].len = str.substr(lastpos,size_t(-1)).length();
    k++;
    cout << "***BEFORE SORT***\n";
    for (i = 0; i < k; i++)
        cout << str.substr(str_inf[i].begin,str_inf[i].len) << endl;
    int j;
    str_info temp;
    for (i = 1; i < k;i++)
        for (j = 0; j <k-1;j++)
        {
            if (str_inf[j].len < str_inf[j+1].len)
            {
                temp = str_inf[j];
                str_inf[j] = str_inf[j+1];
                str_inf[j+1] = temp;
            }
        }
    cout << "\n***AFTER SORT***\n";
    for (i = 0; i < k; i++)
    {
        cout << str.substr(str_inf[i].begin,str_inf[i].len) << endl;
    }

    return 0;
}



    

Автор: goody 21.9.2008, 17:51
Вот переделал, гляньте плз 

Код

#include <stdio.h>
#include <string.h>


using namespace std;


int fyn(char *s);

int main()
{
    char str[250]="str   rttttr               r ";
    char str2[250]="0";
    strcpy(str2, str);
    int i;
    for(i=fyn(str2); i<strlen(str2); i++)
    {
        if(str2[i]!=' ')
        {
            
            printf("%c", str2[i]);
            str2[i]=' ';
        }
        else 
            i=fyn(str2+1);  // Тут нужно fyn(str2) -но консоль виснет почемуто , а так(fyn(str2+1)) все работает но пропускается 1-ый символ т.к. сдвигаю ук.
    }
    printf("\n");
    puts(str2);
    return 0;
}



int fyn(char *s)
{
    int x,y,z,k,l;
    y=z=0;
        
    for(x=0; x<strlen(s); x++)
    {
        if(s[x]==' '  && y>0 )
        {
            if( y>z)
                l=k-y+1;
                z=y;
            y=0;
        }
        
        
         else if(x==strlen(s)-1  && y>0 )
            {
                if( y>z)
                    l=k-y+1;
                    z=y;
                y=0;
            }
        else if(s[x]!=' ')
        {
            y++;
            k=x;
        }
        
        
    }
printf("\n");
return l;
}


Автор: goody 21.9.2008, 20:03
Короче нашел тут кучу недочетов, буду исправлять!

Автор: J0ker 22.9.2008, 03:00
даю алгоритм:
- функция ищет самое длинное слово, выводит его, а затем переносит (memmove) остаток строки после этого слова поверх него включая завершающий ноль и возвращает true
- если никаких слов не найдено - вернуть false
- вызывать функцию в цикле пока не вернет false

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)