Помогите пожалуйсто исправить программу, Помогите пожалуйсто исправить программу |
Здравствуйте, гость ( Вход | Регистрация )
Помогите пожалуйсто исправить программу, Помогите пожалуйсто исправить программу |
Гость_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(); } |
|
|
Dec 25 2007, 22:33
Сообщение
#2
|
|
PAUK-NET.RU TEAM Группа: Admin Сообщений: 4,715 Регистрация: 11.7.2005 Из: ЮЗР Пользователь №: 3 |
|
|
|
Гость_Ireul_* |
Dec 27 2007, 02:21
Сообщение
#3
|
Guests |
Типичная ошибка для чайника - сдвигая массив ты "перепрыгиваешь" по i одну букву, так как она из i+1 перемещается в i, а в следующей итерации цикла ты уже увеличиваешь i, и когда у тебя встречается пара целевых букв для сдвига - одну ты пропустишь.
Как вариант - --i; каждый раз как выполняешь сдвиг. Маленькое дополнение - сдвигать гораздо удобнее при помощи вызова strcpy(str+i,str+i+1); ЗЫ ты вообще щачем удаляешь что-то из целевой строки? Ты же выводишь посимвольно, так и выводи символ если он не совпал и выводи если совпал, а строку вообще трогать незачем. |
|
|
Dec 27 2007, 20:08
Сообщение
#4
|
|
Продвинутый пользователь Группа: Posters Сообщений: 183 Регистрация: 29.6.2007 Из: Moscow-Чебоксары-Auckland Пользователь №: 7,397 |
Типичная ошибка для чайника - сдвигая массив ты "перепрыгиваешь" по 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! |
|
|
Dec 27 2007, 23:04
Сообщение
#5
|
|
Мега постер Группа: Local moder Сообщений: 1,712 Регистрация: 21.8.2006 Пользователь №: 1,269 |
Мои две копейки - в коде разбираться не хочу, но беглый осмотр говорит о том, что gcc вообще не соберет данную программу.
-------------------- |
|
|
Гость_Ireul_* |
Dec 28 2007, 04:21
Сообщение
#6
|
Guests |
ппц ты слепой! Код for( int j = i; j < strlen(str)-1; j++) str[i] = str[i+1];//сдвигаем хвост SiMM уже заметил. У тебя цикл по j! Даже с циклом по j всё равно сохраняется та ошибка, не говоря уже о том что правильный сдвиг, при котором данные цикл отпадает, был приведён в моём посте. |
|
|
Dec 28 2007, 08:52
Сообщение
#7
|
|
PAUK-NET.RU TEAM Группа: Admin Сообщений: 4,715 Регистрация: 11.7.2005 Из: ЮЗР Пользователь №: 3 |
|
|
|
Гость_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 |
Ну, я конечно не уверен, что авторская задумка была именно такая, но если расставить фигурные скобки и исправить индексирование во втором цикле, то в принципе вырисовывается нечто работоспособное: Не работает, ибо не удаляет вторую из двух подряд идущих букв, которые нужно удалить Либо заменить if на while либо поставить --i после if(...){...}.Код #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; } 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; } |
|
|
Текстовая версия | Сейчас: 29th April 2024 - 16:08 |