Программисты!!! ПОМОГИТЕ ДОДЕЛАТЬ ПРОГУ!
Создана: 23 Ноября 2006 Чтв 22:38:28.
Раздел: "Нужна помощь"
Сообщений в теме: 10, просмотров: 2698
-
Вот задание:
Дана последовательность, содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 строчных латинских букв; между соседними словами – запятая, за последним словом точка. Напечатать все слова в алфавитном порядке разделенные пробелами без запятых.
Вот то, что я написал, все работет, только нужно упорядочить слова не только по первой букве!
Т.е.
Вводим: abc,aab,aaa.
Должно вывести: aaa aab abc
Помогите дописать эту сортировку!
Вот исходник:
Код#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <cstdio>
using std::endl;
using std::cout;
using std::cin;
int main( )
{
char str[181], *word[30], *temp;
long Counter = 0, CharCounter = 0, WordCounter = 0;
cout << "Enter string:";
/* get string */
cin.getline( str, 181 );
/* if not tour then exit */
if( !strstr( str, "." ) )
return 0;
/* counter word and counter symbol's in word */
while( str[Counter] != '.' )
{
if( str[Counter] >= 'a' && str[Counter] <= 'z' ) /* islower( str[Counter] ) - can his use */
{
++CharCounter;
if( CharCounter > 5 )
return 0;
} else if( str[Counter] == ',' )
{
++WordCounter;
if( WordCounter > 30 )
return 0;
CharCounter = 0;
} else
{
return 0;
}
++Counter;
}
str[Counter] = 0;
Counter = 0;
/* get word */
word[Counter] = strtok( str, "," );
while( word[Counter] != 0 )
{
++Counter;
word[Counter] = strtok( 0, "," );
}
/* bouble sort */
for( int i=0;i<Counter-1;i++ )
for( int j=0;j<Counter-1;j++ )
{
if( *word[j] > *word[j+1] )
{
temp = word[j];
word[j] = word[j+1];
word[j+1] = temp;
}
}
/* output string */
for( int i=0;i<Counter;i++ )
cout << word[i] << ' ';
cout << endl;
cin.get();
return 0;
} -
не навижу си :))) а так пог бы, да не знаю как :)
-> а ты не пробывал дать это где ни будь, там где это ну жуть как надоело всем, на том же форуме прогеров :)
сейчас скопирую твой запрос и кину туда, гдя и иногда бываю :)
\ тут либой мотёрый прогер отпинает меня :) \ -
Vector писал :не навижу си :))) а так пог бы, да не знаю как :)
-> а ты не пробывал дать это где ни будь, там где это ну жуть как надоело всем, на том же форуме прогеров :)
сейчас скопирую твой запрос и кину туда, гдя и иногда бываю :)
\ тут либой мотёрый прогер отпинает меня :) \
Огромное СПАСИБО, МУЖИК! Я знал, что здесь мне всегда помогут! Я уже просил помочь на одном форуме прогеров, да там даже никто не ответил, Мудачье! Я уже сам доделал прогу, но все равно спасибо... -
-
-
-
Привет.
Вектрировать могу, но я уже всё сказал - ищи там где я иногда бываю \выделять не буду кто лучще кто хуже, просто там был и буду\
-> как обещал, вот, что там написали. \прости я Си так и не успел пробить, если бы знал помогбы (но мне думается ести в том же янексе набрать твой запрос, то вывалится куча всего)\
ОТВЕТЫ ->>
1)
Может не стоило так извращаться?
#inсludе <set>
#inсludе <string>
#inсludе <iostream>
#inсludе <algorithm>
int main(void)
{
std::string str;
std::set<std::string> strs;
char ch;
while(std::cin.get(ch) && ch != '.') {
if (',' == ch) {
strs.insert(str);
str.clear();
}
else str.push_back(ch);
}
if (!str.empty()) strs.insert(str);
std::copy(strs.begin(), strs.end(), std::ostream_iterator<std::string>(std::cout, " "));
}
2)
Лениво писать текст программы :(
Могу только советы раздать
1. Можно просто написать using namespace std и не мучиться каждый раз для потока писать std.
2. Я бы просто использовал массив строк char word[30][5], т.е. 30 строк по пять символов, ваще не знаю как у тебя паботает, просто объявил 30 указателей, должно глючить :).
3. Ну а сравнивать строки можно двумя способами: простой strcmp наверно неподходит, второй вариант просто перебирать символы
int cmp(char *str1, char * str2){
int i;
for(i = 0; i <= 4, str1[i] != stt2[i]; i++);
if(str1[i] == stt2[i]) return 0;
if(str1[i] < stt2[i]) return -1;
return 1;
}
3)
Малень обшибся, правильно вот так
for(i = 0; i <= 3, str1[i] != stt2[i]; i++)
Видимо с утра я еще не проснулся :)
Правильный вариант
int cmp(char *str1, char * str2){
int i;
for(i = 0; i <= 3, str1[i] == stt2[i]; i++);
if(str1[i] == stt2[i]) return 0;
if(str1[i] < stt2[i]) return -1;
return 1;
}
:) всё просто до безобразия :)
Агент Vector - чем смог помог.
\прости\ -
ну что? тишина. во те ещё :)
***
Как вариант:
#inсludе <iostream>
#inсludе <string>
#inсludе <algorithm>
#inсludе <functional>
#inсludе <vector>
#inсludе <boost/tokenizer.hpp>
int _tmain(int argc, _TCHAR* argv[])
{
std::string str;
char ch;
while (std::cin.get(ch) && ch != '.') str += ch;
boost::tokenizer<> tok(str);
std::vector<std::string> words(tok.begin(), tok.end());
std::sort(words.begin(), words.end(), std::less<std::string>( ) );
std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, " "));
return 0;
}
***
:))) ржут те кто всё знает :))) -
Vector писал :ну что? тишина. во те ещё :)
***
Как вариант:
#inсludе <iostream>
#inсludе <string>
#inсludе <algorithm>
#inсludе <functional>
#inсludе <vector>
#inсludе <boost/tokenizer.hpp>
int _tmain(int argc, _TCHAR* argv[])
{
std::string str;
char ch;
while (std::cin.get(ch) && ch != '.') str += ch;
boost::tokenizer<> tok(str);
std::vector<std::string> words(tok.begin(), tok.end());
std::sort(words.begin(), words.end(), std::less<std::string>( ) );
std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, " "));
return 0;
}
***
:))) ржут те кто всё знает :)))
Еще раз тебе СПАСИБО!!!! Побольше бы таких людей! -
Привет Топтыжка \там где я иногда бываю (да на кубани это :))) на сатике у мня всё вылажено, честно там луче по этому шарить, но это не важно? мне не трудно туда-сюда переправлять да и самому, что то 1*познавать\
поступила одна информация
-> приверим :) если фуфло подкидаваешь, то 2*пробел сломаю :)))) Спасибо.
- Да не за что. Правда, тебе понадобится библиотека boost .
-> а что этот boost редкость? и скока это тодда весит конечно можно найти, ну раз уж ты вазвался то ГОВАРИ!!! :)
- Весит метров 10. Но его еще нужно будет скомпилить, а скомпиленный он весит больше гига. Проще воспользоваться вариантом который был до этого, если нет буста.
-> понятно, что только у меня нет :) надо поискать ну не найду тогда в госте приеду :))) спасибо
-=-=-=-=-=-=-=-=-=-=-
1*познаватьпоеснение
C++ так и не познал, но так хотел, просто интересно и так для "сэба" пару "букв" изучал на (bas, pas,) - как Doc ver (басика я впервые на Z80 увидал :)))) так и объектно орентир (VisualБарсик & Дельфин), ПШП, Ява (только мне почему то хочетс назавать Джава :))) и один знакомай так же, а все остальные - ЯВА! ЯЯЯ-В-ААА!!! ВИТЁЁЁК!!! ЯЯВВАА!!! ... джава *и бежать :)))*, но сейчас уже стал привыкать , фортран видел (как увидел у знакомой так больше и не видел ) года 4 назад примерно, ну и конечно asm - это самоя великая штука!!!. Не мои слова >>> [/i]Всё меняется, языки появляются и пропадают, а ассемблер не кто не отменял и не отменят :) Си так же видел, стандартное -> "Hello Word!" и всё :) Но всё это пустота ведь сам то я болда :)
Так что удачи!!!
2*пробел сломаю (он шутку понял, так как видел это)
(copy)
Чайник: - Яжеговарилпробелнеработает!!! -(
Программист: Пиши_через_подчеркивание.
Программист 1С: ГлавноеЧтоБыШифтРаботал!"
Программист Delphi: Не.Шифт.А.Точка!
Программист С++: Ламеры->Млин->Всему->Учить->Надо!
Линуксоид: да<tab>уж<tab>ну<tab>у<tab>вас<tab>и<tab>проблемы
Программист Lisp: (да(эт(вообще)старая(тема)))
Прохраммист Х++: doInsertSpase(Яжеговарилпробелнеработает!!! -(,Я,же,говарил,пробел,не,работает!!! -();
.
Пополните?
$$Наверное$так$на$PHP$будет
VB&наверное&будет&так
Насчет С++ не согласен!!! Глупо будет выглядеть код, если оборачивать пробелами оператор "->"
—-
Боюсь предположить, что получится на ASM при отсутствии пробела ))
на C/C++ :)
"пробел\x20не\x20работет"
<phrase><word>Нынче</word><word>другие</word><word>тенденции</word></phrase>
....
КрУТымПАрНЯмпрОбеЛНенУЖен!!!
ВотПРОБЕЛтакПРОБЕЛнадоПРОБЕЛ:)
...
V -> :) ДаДаАвотМнеЗаЭтоГдеТоПредупреждение:)яЯчтоИправдуНаписатьНеЛьзя:)))
\Удачи/