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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [c++]строки, прога на строки 
:(
    Опции темы
girlsbest
Дата 9.11.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вот такая задача....Примечание. При написании программ  использовать нуль–терминированные строки и работать только с типом char *. Длина каждой строки не превосходит 300 символов. Словом, входящим в состав строки, назовём непрерывную последовательность символов, ограниченную символами–разделителями, началом и концом строки. Символы, относящиеся к разделителям, определяет пользователь, если иное не сказано в условии задачи. Если решить задачу невозможно, программа должна выдать соответствующее сообшение.
1.    Строка состоит не менее чем из двух слов. Преобразовать её по следующему правилу: найти первое из самых длинных и последнее из самых коротких слов и  поменять их местами. Количество пробелов между словами должно остаться таким же, как и в исходной строке. Задачу решить без использования дополнительных строк.  smile  не очень понимаю как работать со строками...как  правильно ввести и вывести. 

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


Зима близко
**


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

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



Цитата(girlsbest @  9.11.2008,  15:10 Найти цитируемый пост)
найти первое из самых длинных и последнее из самых коротких слов и  поменять их местами.

Что означает "из самых длинных" или "из самых коротких"?

Например есть строка(написаны длины слов).

[4] [5] [6] [7] [1] [2] [3]

Какие слова здесь надо переставить?


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
girlsbest
Дата 9.11.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ну я так поняла что [5] и [3] нужно поменять местами

Добавлено через 9 минут и 24 секунды
или [7][1]...думаю. что для начала хватит просто самое короткое и длинное
PM MAIL   Вверх
girlsbest
Дата 9.11.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include<iostream>
#include<string>
using namespace std;
const char* fyn_max(const char *a) 
{ 
    const char *res; //указатель на максимальное слово
    const char *beg; //начало текущего слова
    int maxLen = 0;
    int curLen = 0;
    for(res = a, beg = a; ; a++) { 
         if ( (*a == ' ') || (*a == '\0') ) { 
            if (curLen > maxLen) {
                maxLen = curLen; 
                res = beg; 
            }
            curLen = 0;
            beg = a + 1;
            if ( *a == '\0')
                break;
        } else { 
            curLen++; 
        } 
    } 
    return res; 
}
const char* fyn_min(const char *a) 
{ 
    const char *res_min; //указатель на максимальное слово
    const char *beg_min; //начало текущего слова
    int maxLen_min = 0;
    int curLen_min = 0;
    for(res_min = a; beg_min = a; a++) 
    { 
         if ( (*a == ' ') || (*a == '\0') ) { 
            if (maxLen_min > curLen_min ) {
                 maxLen_min= curLen_min; 
                 beg_min=res_min; 
            }
            maxLen_min = 0;
            beg_min = a + 1;
            if ( *a == '\0')
                break;
        } else { 
            maxLen_min++; 
        } 
    } 
    return res_min; 
}
int main()
{
    const char *res;
    const char *res_min;
    char a[300];
    cin.get(a,299);
res=fyn_max(a);
res_min=fyn_min(a);
    cout<<res<<endl;
    cout<<res_min<<endl;
    system("pause");
    return 0;
}


у меня что-то такое получается, но тут правильно находит максимально длинное слово, а вместо короткого пишет всю строку...и я не знаю как их местами поменять...в строке
PM MAIL   Вверх
IKM2007
Дата 10.11.2008, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


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

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



часть кода.
Код

#include <iostream>
#include <cstring>
using namespace std;
bool search(int *str,int index1,int index2,int item)
{
for(int i=index1;i<=index2;i++)
    if(str[i]==item)
        return true;
return false;
}
void sort(int *str,int n)
{
int i,j,temp;
for(i=1;i<n;i++)
    for(j=0;j<n-i;j++)
        if(str[j]>str[j+1])
        {
            temp=str[j];
            str[j]=str[j+1];
            str[j+1]=temp;
        }

}
void main()
{
char *str=new char[300], *p, temp;//str-строка
int **a=new int *[3],i,j,k;//а-двухмерный массив int-ов, где в первом ряду
                            //хранится длина соответствующего слова, во втором ряду-индекс
                            //начала слова, в третьем ряду-индекс конца слова

for(j=0;j<150;j++)
a[j]=new int[298];

cin.getline(str,300,'\n');//вводим строку
//разбиваем на слова и записываем длину и индексы каждого слова в двухмерный массив a
p=strtok(str," ");
a[0][0]=(int)strlen(p);
a[0][1]=0;
j=a[0][2]=a[0][0]-1;
for(i=1;p=strtok(NULL," ");i++)
{
    a[i][0]=(int)strlen(p);
    a[i][1]=j+2;
    j+=a[i][0]+1;
    a[i][2]=j;
}

int s_m=i,*mas=new int [s_m];//создаем массив, где количество ячеек равно количеству слов
                            //и записиваем длины слов в массив
for(i=0;i<s_m;i++)
mas[i]=a[i][0];

sort(mas,s_m);//сортируем массив

for(k=1,i=1,temp=mas[0];i<s_m;i++)//считаем количество не равных по длине слов
{
    if(mas[i]==temp)
        continue;
    k++;
    temp=mas[i];
}

int *koef=new int[k];//создаем массив koef, где записаны длины слов без повторении

koef[0]=mas[0];

for(j=0,i=1,temp=mas[0];i<s_m;i++)
{
    if(mas[i]==temp)
        continue;
    temp=mas[i];
    koef[++j]=mas[i];
}

int x1,x2;//x1 и x2 номера слов в исходном массиве, где x1 первый из самых длинных слов, а 
        //x2 последний из самых коротких слов

for(i=0;a[i]>0;i++)
    if(search(koef,(int)(k+1)/2,k-1,a[i][0]))
    {
        x1=i;
        break;
    }

for(i=s_m-1;a[i]>0;i--)
    if(search(koef,0,(int)k/2-1,a[i][0]))
    {
        x2=i;
        break;
    }

cout<<x1<<" "<<x2<<endl;//печатаем x1 и x2

//теперь у нас есть индексы и длины слов, которые мы должны переставить
}

После этого можем переставить слова с помощью переменной char. А это сделаем так. Возьмем интервал (x1->index1,x2->index2). Переставим символы с начала первого слова в начало второго слова, пока не кончится первое или второе слово. Переставим остаток слова циклический, то есть переставим посимвольно и на каждом шаге выполним сдвиг в соответствующую сторону.
(сейчас нет времени, если не справишся, может завтра напишу).

Это сообщение отредактировал(а) IKM2007 - 10.11.2008, 22:33


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
IKM2007
Дата 10.11.2008, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


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

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



Цитата(girlsbest @  9.11.2008,  15:10 Найти цитируемый пост)
только с типом char *.

Обана, а я не правильно понял. Понял, что надо работать только с типом char, а не char*, и нельзя использовать другие строки кроме исходного. По-этому так сложно получилось.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
girlsbest
Дата 14.11.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



и как переставлять....хм..просто это для меня самое сложное
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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