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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2012, 22:45   #11
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

хочу сделать как Вы говорите, но опять не выходит..

вот, что начал писать..
Код:
int main()
{

        char text[1500];  //--основная строка
        char ctext[1500]; //---копия основной строки
        char t2[1500];  //--строка с удаленными  пробелами
        char *ch;
        char *m;
        int i, j=0,c=0;

        cout<<"Vvedite ryadok"<<endl;
        cin.getline(text,1500);
        cout<<endl;

        //--удаление пробелов
        for(i=0; i<1500; i++){

                if(text[i]!=' ' || (text[i]==' ' && text[i+1]!=' ')){
                        t2[j++]=text[i];
                        cout<<t2;
                }
                if(text[i]=='\0'){break;}
        }

        
        //--вывод результатов
        cout<<endl<<"Samoe bolshoe slovo - "<<m<<endl;
        cout<<endl<<"Kol-vo slov - "<<c<<endl;

        getch();
        return 0;
}
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 05.04.2012, 23:11   #12
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

цикл не до 1500(ты наврятли с таким текстом работаешь и вводишь его=)), а до strlen(text) попробуй)
monolit111 вне форума Ответить с цитированием
Старый 06.04.2012, 10:51   #13
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

asmars, вот не мучайся.
Код:
#include <stdio.h>
#include <ctype.h>

// Подсчёт кол-во слов 
size_t count_words(const char* s) {
   size_t n = 0u;
   int k = 0;
   do {
	   if(isalpha(*s)) 
              k = 1;
	   else {
              if(k)
                n++;
              k = 0;
	   }
   } while(*s++);
   return n;
}

// Нахождение самого длинного слова
char*  maxlen_word(char* d, const char* s) {
   const char* p;
   char* t = d;
   int k = 0, n = 0;
   do {
	   if(isalpha(*s)) 
               k++;
           else {
               if(k > 0) {
                 if(k > n) {
                     n = k;
                     p = s - k;
                 }
               }
               k = 0;
         }
   } while(*s++);
   while(n--)
         *d++ = *p++;
   *d = '\0';
   return t;
}

// Удаление повторяющего указанного символа
char* ch_delete_one(char* s, char c) {
    char* a, *b;
    for(a = s, b = s; *b = *a; *a++) {
         if(*a == c && *(a + 1) == c)
             continue;
         *b++;
    }
    return s;
}


int main(void) {
   char s[] = "Hello    world, ask. [multimedia]   The      Car-Volvo.";
   char buf[32] = {'\0'}; 

   printf("count words: %u\n", count_words(s));
   printf("maxlength word: %s\n", maxlen_word(buf, s));

   printf("src string: %s\n", s);
   printf("dst string: %s\n", ch_delete_one(s, ' '));

   getchar();
   return 0;
}
Nuklon вне форума Ответить с цитированием
Старый 06.04.2012, 16:10   #14
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Nuklon, большое спасибо Вам!
Вы знаете, я не хочу Вас оскорбить, но Ваш код не решил моей проблемы. Т.к. мне нужно разобраться в этом, а не просто скопировать чужой код. Если бы я хотел просто сдать лабу, я бы нашел код скопировал его и сдал.
Я еще раз говорю Вам спасибо.

И если можно поясните ф-цию:
Код:
// Удаление повторяющего указанного символа
char* ch_delete_one(char* s, char c) {
    char* a, *b;
    for(a = s, b = s; *b = *a; *a++) {
         if(*a == c && *(a + 1) == c)
             continue;
         *b++;
    }
    return s;
}
как я понял:
в ф-цию передается два параметра, первый - сама строка, второй - символ, который надо удалить.
после чего создается два указателя *а и *b.
а вот условие цикла не понимаю и условия if'a.
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 06.04.2012, 23:02   #15
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

Вот, рабочий ко))Нормально измененная и исправленная твоя программа)
2 варианта(модификации) удаления пробела, о как))Оставь какой то один, какой больше нравится
Код:
int main()
{
    char text[1500];  //--основная строка
    char t2[1500];  //--строка с удаленными  пробелами
    char *ch;
    char *m;
    int i, j=0,c=0;

    cout<<"Vvedite ryadok"<<endl;
    cin.getline(text,1500);
    cout<<endl;

    //--удаление пробелов
    //1.без вспомогательной строки(прям в исходной)
    for(i=0; i<1500; i++)
    {
        if(text[i]!=' ' || (text[i]==' ' && text[i-1]!=' '))
        {
            text[j++]=text[i];
        }
        if(text[i]=='\0') break;
    }
    cout<<"Bez probelov:\n"<<text<<endl;
    //.......................конец 1.................
    //2.или так, со вспомогательной
    for(i=0; i<1500; i++)
    {
        if(text[i]!=' ' || (text[i]==' ' && text[i-1]!=' '))
        {
            t2[j++]=text[i];
        }
        if(text[i]=='\0') break;
    }

    cout<<"Bez probelov:\n"<<t2<<endl;
    strcpy(text, t2);//теперь и text без пробелов
    
    //.......................конец 2.................
    //создадим копию и с ней будем работать(строка изменяется ведь,
    //а ее нам наверное нужно сохранить)
    char tmp_text[1500];
    strcpy(tmp_text, text);

    ch=strtok(tmp_text," ");
    m=new char;
    m[0]='\0';
    while(ch!=NULL)
    {
        if(strlen(ch)>strlen(m))
        {
            m=new char[strlen(ch)+1];
            strcpy(m,ch);
        }
        ch=strtok(NULL, " ");
        c++;
    }
    //--вывод результатов
    cout<<"Bez probelov:\n"<<text<<endl;
    cout<<endl<<"Samoe bolshoe slovo - "<<m<<endl;
    cout<<endl<<"Kol-vo slov - "<<c<<endl;
    return 0;
}
ЗЫ
Специально проверил, все работало))
Удачи)
monolit111 вне форума Ответить с цитированием
Старый 07.04.2012, 00:19   #16
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

круто) спасибо Вам, monolit111!
обязательно разберу Ваш код)

еще интересно код Nuklon'a разобрать!
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 07.04.2012, 09:58   #17
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

for(a = s, b = s; *b = *a; *a++) {
if(*a == c && *(a + 1) == c)
continue;
*b++;
}
return s;

Нет ничего проще))
Сначала а и b указывают на одну строку(исходную, в кот-й удалять символ с), цикл до тех пор, пока всю строку не просмотрим(ведь присваивание и результат возвращает, а когда дойдет до '/0', произойдет присваивание и вернется 0-цикл закончится), а
Код:
*a++
Это аналог индексирования(т.е. мы перебираем все элементы строки, и а указывает последовательно на каждый из них)

С if'ом:
это аналог первому варианту, который описал я, только немного иными словами, скажем так))
Т.е. если текущий и предыдущий символы равны тому, который в случае повторения нужно удалить, то указатель в b не двигается(этот символ "игнорируется", т.е. своеобразное удаление), и переходим к следующей итерации...
Иначе указатель в b передвигается вперед, и в условии цикла происходит присваивание(оно и так происходит, но т.к. символы равны, то ничего существенно не меняется)

Последний раз редактировалось monolit111; 07.04.2012 в 10:00.
monolit111 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
strtok Matr1x Общие вопросы C/C++ 5 18.02.2012 20:34
strtok Lotles Общие вопросы C/C++ 4 21.12.2011 21:04
Работа с матрицами (норма матрицы, работа со строками) Neitrosha Помощь студентам 1 26.11.2010 20:19
strtok... Joe_Tribbiani Общие вопросы C/C++ 0 02.05.2010 15:52
си. strtok. RZMTZM Общие вопросы C/C++ 2 05.01.2010 12:59