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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2009, 21:24   #1
pavelstraut
Пользователь
 
Регистрация: 17.07.2009
Сообщений: 91
По умолчанию не мог понять разницы))

вот этот код работает совершенно правильно
(чтобы удалить символы из символьного массива я решил убирать их за пределы массива)
Код:
#include <string.h>
#include <conio.h>
#include <iostream.h>
#include "rus.cpp"
int main()
{
    char st[80],ch;
    cin.getline(st,80);
    int ln=strlen(st);
    int i,j,count=0,k;
    for(i=0;i<ln;i++)
    for(j=i+1;j<ln;j++)
    {
       if(st[i]==st[j])
       {
        count++;
        for(k=j;k<=80+count-1;k++)
        {               
         ch=st[k];
         st[k]=st[k+1];
         st[k+1]=ch;
         }
         }
         }
cout<<st;
   getch();
   return 0;
}
а то же самое только в конце не
Код:
cout<<st;
а
Код:
for(i=0;i<ln;i++) cout<<st[i]
не верно выводит(те символы которые за пределами он их почему то вставляет сюда
если можете объясните
и еще посоветует может что-то по алгоритму
(именно символьный массив а не строка)
pavelstraut вне форума Ответить с цитированием
Старый 25.07.2009, 21:30   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
(чтобы удалить символы из символьного массива я решил убирать их за пределы массива)
А какие символы вы удаляете?
Пример работы:
Код:
dfffdds
dffds
В этом случае:
Код:
cout<<st;
строка выводится до символа конца строки. А в этом:
Код:
for(i=0;i<ln;i++) cout<<st[i]
ln символов. А так как вы эту величину в ходе работы программы не изменяете, то выведется столько же символов, сколько было в начале.

Цитата:
(именно символьный массив а не строка)
По большому счету строка и есть массив символов.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 25.07.2009, 21:31   #3
pavelstraut
Пользователь
 
Регистрация: 17.07.2009
Сообщений: 91
По умолчанию

я удаляю повторы символов
например vasya-vasy
так вот почему при выполнении через цикл он пишет мне еще и те символы которые за пределами массива ,а если всю строку то нет
pavelstraut вне форума Ответить с цитированием
Старый 25.07.2009, 21:34   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от pavelstraut
так вот почему при выполнении через цикл он пишет мне еще и те символы которые за пределами массива
Потому что вы сами их выводите.
Если у вас была строка 1234567890 (длина = 10), потом вы переместили какие-то символы, после чего она стала такой: 1234789560 (например), то при выводе десяти символов вы увидите в том числе и те, которые переместили.

Цитата:
Сообщение от pavelstraut
я удаляю повторы символов
например vasya-vasy
В таком случае программа работает некорректно (смотрите пример в предыдущем посте).
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 25.07.2009, 21:39   #5
pavelstraut
Пользователь
 
Регистрация: 17.07.2009
Сообщений: 91
По умолчанию

да,я проверил на двух примерах работало сейчас вижу не рабит
может тогда поможете с алгоритмом
pavelstraut вне форума Ответить с цитированием
Старый 25.07.2009, 21:40   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот так, например:
Код:
#include <string.h>
#include <conio.h>
#include <iostream.h>

int main()
{
    char st[80];
    int len,k,i,j;

    cin.getline(st,80);
    len = strlen(st);

    for(i=1; i<len; i++)
     {
      for(j=i-1; j>=0; j--)
       {
        if(st[j]==st[i])
         {
          --len;
          for(k=i; k<len; k++)
           st[k]=st[k+1];
          i--;
          break;
         }
       }
     }
   st[len] = 0;
   cout<<st;

   getch();
   return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 25.07.2009, 21:42   #7
pavelstraut
Пользователь
 
Регистрация: 17.07.2009
Сообщений: 91
По умолчанию

тот же вывод что и у моей программы
если три символа подряд одинаковых или два она удаляет только один почему то
pavelstraut вне форума Ответить с цитированием
Старый 25.07.2009, 21:44   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от pavelstraut
тот же вывод что и у моей программы
Уверены, что не свою программу запускаете?

Примеры работы:
Код:
asdddddddddddfd
asdf
Код:
aaaaaaaaaaaaa
a
Код:
fffdddsss
fds
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 25.07.2009, 21:48   #9
pavelstraut
Пользователь
 
Регистрация: 17.07.2009
Сообщений: 91
По умолчанию

извините не то скопировал
спасибо а не могли бы вы сказать что было неверно в моем коде
pavelstraut вне форума Ответить с цитированием
Старый 25.07.2009, 21:54   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Ну, тут, например:
Код:
for(k=j;k<=80+count-1;k++)
это не ваша память (та, что за массивом). Поэтому нехорошо туда что-то писать. Может и выкинуть.
Потом, после смещения символа нужно откатывать маркер на 1 назад, иначе идущие подряд одинаковые символы останутся.

Наверняка еще что-то, но без комментов неудобно смотреть.
Да и вообще мне сам подход не очень нравится. Как я понимаю, у вас лишние символы "всплывают" за границу массива. Но реализовано кривовато.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто поможет оптимизировать прогу, а то я уже оптимизировал как мог :) Droid Помощь студентам 7 12.05.2008 20:56
Находжение разницы годов в SQL запросе Yurk@ БД в Delphi 13 01.03.2008 09:32
как сделать что бы пользователь мог изменять пароль и вводить свой? Илюха Общие вопросы Delphi 13 05.10.2007 14:58
не могу понять... Dutchman Паскаль, Turbo Pascal, PascalABC.NET 4 14.12.2006 07:14