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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2008, 20:16   #1
Sota
Let's keep talking
Форумчанин Подтвердите свой е-майл
 
Аватар для Sota
 
Регистрация: 02.07.2007
Сообщений: 217
По умолчанию Обмен местами)

Доброго времени суток.
Хочу попросить помощи в написании алгоритма, который меняет содержимое массива таким образом: он меняет местами каждые два слова не затрагивая при этом знаки препинания и пробелы.
Заранее спасибо.
Лучше С++, чем ++С...
Sota вне форума Ответить с цитированием
Старый 21.02.2008, 20:36   #2
alexx777
Пользователь
 
Регистрация: 20.02.2008
Сообщений: 75
По умолчанию

Массива чего? Можно подробнее.
alexx777 вне форума Ответить с цитированием
Старый 21.02.2008, 20:52   #3
Sota
Let's keep talking
Форумчанин Подтвердите свой е-майл
 
Аватар для Sota
 
Регистрация: 02.07.2007
Сообщений: 217
По умолчанию

Да я вообщем задачу решаю. Вот типа такая:
Написать программу, которая считывает текст из файла и выводит его на экран, меняя местами каждые два соседних слова.
Примечание: предложения содержат не более 256 символов.
Лучше С++, чем ++С...
Sota вне форума Ответить с цитированием
Старый 21.02.2008, 21:27   #4
alexx777
Пользователь
 
Регистрация: 20.02.2008
Сообщений: 75
По умолчанию

Можно, например, разбить текст на подстроки и сохранить их в векторе. Подстроки формировать по такому правилу: каждая подстрока должна либо содержать буквы (значит подстрока является словом), либо не содержать их (подстрока не является словом и содержит знаки препинания). Напримр:

public: virtual void exit(int x);

Разбиваем как:

|public|: |virtual| |void| |exit|(|int| |x|);|

После можно поменять слова местами:

virtual: public exit void(x int);
alexx777 вне форума Ответить с цитированием
Старый 21.02.2008, 21:30   #5
Sota
Let's keep talking
Форумчанин Подтвердите свой е-майл
 
Аватар для Sota
 
Регистрация: 02.07.2007
Сообщений: 217
По умолчанию

Я в С++ новичок. Можешь привести листинг кода проги, если не трудно? Заранее спасибо...
Лучше С++, чем ++С...
Sota вне форума Ответить с цитированием
Старый 21.02.2008, 21:37   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Sota, посмотрите вот эту ветку, чтобы еще раз не писать
http://programmersforum.ru/showthread.php?t=13439
Указатели местами переставите и всё.
B_N вне форума Ответить с цитированием
Старый 21.02.2008, 22:02   #7
alexx777
Пользователь
 
Регистрация: 20.02.2008
Сообщений: 75
По умолчанию

Вот код:
Код:
#include <iostream>
using std::cout;
#include <fstream>
using std::ifstream;
#include <vector>
using std::vector;
#include <string>
using std::string;
#include <conio.h>

// Функция проверяет, является ли символ ch буквой
// (Работает только с английскими буквами).
bool is_letter(char ch);

int main(){
 // Читаем текст из файла.
 ifstream ifs("input.dat");
 string str;
 char c;
 while((c=ifs.get())!=EOF){
  str += c;
 }
 // Разбиваем текст на подстроки.
 vector<string> vec;
 string elem;
 for(int i=0;i<str.length();i++){
  char ch = str[i];
  if(is_letter(ch)){
   if(((i-1)>=0)&&(!is_letter(str[i-1]))){
    vec.push_back(elem);
    elem = string(1, ch);
   }else elem+=ch;
  }else{
   if(((i-1)>=0)&&(is_letter(str[i-1]))){
    vec.push_back(elem);
    elem = string(1, ch);
   }else elem+=ch;
  }
 }
 vec.push_back(elem);
 // Меняем местами парные слова, не трогая знаки препинания.
 string toReplace;
 int replacePos;
 for(int i=0;i<vec.size();i++){
  if(is_letter(vec[i][0])){
   if(toReplace.size()==0){
    toReplace = vec[i];
    replacePos = i;
   }else{
    string temp = vec[i];
    vec[i] = toReplace;
    vec[replacePos] = temp;
    toReplace = string();
   }
  }
 }
 // Выводим числа в консоль.
 for(int i=0;i<vec.size();i++){
  cout << vec[i];
 }
 // Чтобы консоль не закрылась после вывода результатов ожидаем
 // нажатие клавиши.
 getch();
 return 0;
}

bool is_letter(char ch){
 return (ch>='a')&&(ch<='z');
}
У меня работает.
alexx777 вне форума Ответить с цитированием
Старый 22.02.2008, 18:32   #8
Sota
Let's keep talking
Форумчанин Подтвердите свой е-майл
 
Аватар для Sota
 
Регистрация: 02.07.2007
Сообщений: 217
По умолчанию

Огромное спасибо всем за помощь.
Лучше С++, чем ++С...
Sota вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как поменять строки местами? ar. Microsoft Office Word 1 05.09.2008 11:36
поменять местами столбцы veter_s_morya SQL, базы данных 4 29.06.2008 13:36
Обмен скриптами tanos JavaScript, Ajax 1 28.01.2008 22:18
Обмен ICQ Умелец Свободное общение 3 15.09.2007 12:03