IPB

Здравствуйте, гость ( Вход | Регистрация )

> Помогите пожалуйсто исправить программу, Помогите пожалуйсто исправить программу
Гость_aligatr-kil_*
сообщение Dec 25 2007, 21:32
Сообщение #1





Guests






Помогите пожалуйсто исправить программу : Удалите из слова все буквы, совпадающие с последней буквой.
Код
#include <iostream.h>
#include <stdio.h>
#include <conio.h>

void main ()
{
  int i;
  int j;
  char str[100];

  cin>>str[i];

  char sym = str[strlen(str)-1];//запомнили последний
  for( int i = 0; i < strlen(str); i++)
    if( str[i] == sym )// находими нужный символ
      for( int j = i; j < strlen(str)-1; j++)
        str[i] = str[i+1];//сдвигаем хвост
  cout << str[i];
  getch();
}
Вернуться к началу страницы
 
+Цитировать сообщение
 
Создать новую тему
Ответов (1 - 9)
SiMM
сообщение Dec 25 2007, 22:33
Сообщение #2


PAUK-NET.RU TEAM
Иконка группы

Группа: Admin
Сообщений: 4,715
Регистрация: 11.7.2005
Из: ЮЗР
Пользователь №: 3



Цитата(aligatr-kil @ Dec 25 2007, 21:32) *
str[i] = str[i+1];//сдвигаем хвост
Вернуться к началу страницы
 
+Цитировать сообщение
Гость_Ireul_*
сообщение Dec 27 2007, 02:21
Сообщение #3





Guests






Типичная ошибка для чайника - сдвигая массив ты "перепрыгиваешь" по i одну букву, так как она из i+1 перемещается в i, а в следующей итерации цикла ты уже увеличиваешь i, и когда у тебя встречается пара целевых букв для сдвига - одну ты пропустишь.

Как вариант - --i; каждый раз как выполняешь сдвиг.
Маленькое дополнение - сдвигать гораздо удобнее при помощи вызова strcpy(str+i,str+i+1);

ЗЫ ты вообще щачем удаляешь что-то из целевой строки? Ты же выводишь посимвольно, так и выводи символ если он не совпал и выводи если совпал, а строку вообще трогать незачем.
Вернуться к началу страницы
 
+Цитировать сообщение
Shasta Dam
сообщение Dec 27 2007, 20:08
Сообщение #4


Продвинутый пользователь
***

Группа: Posters
Сообщений: 183
Регистрация: 29.6.2007
Из: Moscow-Чебоксары-Auckland
Пользователь №: 7,397



Цитата(Ireul @ Dec 27 2007, 02:21) *
Типичная ошибка для чайника - сдвигая массив ты "перепрыгиваешь" по i одну букву, так как она из i+1 перемещается в i, а в следующей итерации цикла ты уже увеличиваешь i, и когда у тебя встречается пара целевых букв для сдвига - одну ты пропустишь.

Как вариант - --i; каждый раз как выполняешь сдвиг.
Маленькое дополнение - сдвигать гораздо удобнее при помощи вызова strcpy(str+i,str+i+1);

ЗЫ ты вообще щачем удаляешь что-то из целевой строки? Ты же выводишь посимвольно, так и выводи символ если он не совпал и выводи если совпал, а строку вообще трогать незачем.

ппц ты слепой!

Код
for( int j = i; j < strlen(str)-1; j++)
str[i] = str[i+1];//сдвигаем хвост

SiMM уже заметил. У тебя цикл по j!
Вернуться к началу страницы
 
+Цитировать сообщение
Amp
сообщение Dec 27 2007, 23:04
Сообщение #5


Мега постер
Иконка группы

Группа: Local moder
Сообщений: 1,712
Регистрация: 21.8.2006
Пользователь №: 1,269



Мои две копейки - в коде разбираться не хочу, но беглый осмотр говорит о том, что gcc вообще не соберет данную программу.


--------------------
irc-капец

#КартинкА#
Вернуться к началу страницы
 
+Цитировать сообщение
Гость_Ireul_*
сообщение Dec 28 2007, 04:21
Сообщение #6





Guests






Цитата(Shasta Dam @ Dec 27 2007, 20:08) *
ппц ты слепой!

Код
for( int j = i; j < strlen(str)-1; j++)
str[i] = str[i+1];//сдвигаем хвост

SiMM уже заметил. У тебя цикл по j!


Даже с циклом по j всё равно сохраняется та ошибка, не говоря уже о том что правильный сдвиг, при котором данные цикл отпадает, был приведён в моём посте.
Вернуться к началу страницы
 
+Цитировать сообщение
SiMM
сообщение Dec 28 2007, 08:52
Сообщение #7


PAUK-NET.RU TEAM
Иконка группы

Группа: Admin
Сообщений: 4,715
Регистрация: 11.7.2005
Из: ЮЗР
Пользователь №: 3



Цитата(Ireul @ Dec 28 2007, 04:21) *
Даже с циклом по j всё равно сохраняется та ошибка
Какая - та?
Алгоритм, конечно, не ахти (одного цикла без строковых функций достаточно) и не лишён недостатка (выводится только один, последний символ). Ну и код был нифига не отформатирован.
Вернуться к началу страницы
 
+Цитировать сообщение
Гость_Smacker_*
сообщение Dec 29 2007, 11:49
Сообщение #8





Guests






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

Код
#include <iostream>
using namespace std;

void main ()
{
    char str[100];
    cin>>str;

    char sym = str[strlen(str)-1];
    for( unsigned int i = 0; i < strlen(str); i++)
    {
        if( str[i] == sym )
        {
            unsigned int j = i;
            for(; j < strlen(str)-1; j++)
            {
                str[j] = str[j+1];
            }
            str[j] = 0;
        }
    }
    cout << str;
}
Вернуться к началу страницы
 
+Цитировать сообщение
Гость_aligatr-kil_*
сообщение Jan 7 2008, 01:24
Сообщение #9





Guests






спасибо всем большое !!!

Сообщение отредактировал Gobbs - Jan 7 2008, 13:38
Вернуться к началу страницы
 
+Цитировать сообщение
Гость_Snowm@n_*
сообщение Jan 31 2008, 11:01
Сообщение #10





Guests






Цитата(Smacker @ Dec 29 2007, 11:49) *
Ну, я конечно не уверен, что авторская задумка была именно такая, но если расставить фигурные скобки и исправить индексирование во втором цикле, то в принципе вырисовывается нечто работоспособное:

Код
#include <iostream>
using namespace std;

void main ()
{
    char str[100];
    cin>>str;

    char sym = str[strlen(str)-1];
    for( unsigned int i = 0; i < strlen(str); i++)
    {
        if( str[i] == sym )
        {
            unsigned int j = i;
            for(; j < strlen(str)-1; j++)
            {
                str[j] = str[j+1];
            }
            str[j] = 0;
        }
    }
    cout << str;
}
Не работает, ибо не удаляет вторую из двух подряд идущих букв, которые нужно удалить smile.gif Либо заменить if на while либо поставить --i после if(...){...}.
p.s. Вариант, претендующий на оптимальность
Код
#include <iostream.h>
#include <string.h>
void main(){
char str[100];
cin>>str;
int l=strlen(str);
char c=str[l-1];
int i=-1;
while (str[++i]!=c);
int j=i;
for (;i<l-1;++i) if (str[i]!=c) str[j++]=str[i];
str[j]=0;
cout<<str<<endl;
}

Вернуться к началу страницы
 
+Цитировать сообщение

ОтветитьСоздать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 29th April 2024 - 18:57