Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строки в С++ аналоги Pascal'евским функциям 
V
    Опции темы
Sanek123
Дата 25.4.2009, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Помогите пожалуйста перевести пару строк с Pascal на C++. Должны же быть какието аналоги или как поступить. Строки требующие изменения закоментированы.
Код

#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int main(int argc, char *argv[])
{

typedef 
string T;

T A[900];
T p;
string S;
int i,j,k,n,min,max,len;

{
    
S="ais cool beer soft hard deep trend loock boss var kolt spirt ficha fuck fox";
cout<<S<<endl;

//len=strlen(S);

i=0;
j=0;
k=1;

  for (i=1;i<=len;i++)
      {
      if (S[i]==' ') //& (i == len) 
         {
         j=j+1;
         //A[j]=Copy(S,k,i-k+byte(i = len));
         k=i+1;
         }
      }

n=j;
j=0;
i=0;

for (i=1;i<=n/2;i++)
    {
    if (A[i]>A[i+1]) 
       {
       min=i+1;
       max=i;
       }
    else
      {
      min=i;
      max=i+1;
      }

  for (j=i+2;j<=n-i+1;j++)
      {
      if (A[j]>A[max]) 
         {
         max=j;
         }
      else
         {
         if (A[j]<A[min]) 
         {
         min=j;
         }

         p=A[i];
         A[i]=A[min];
         A[min]=p;
    
         if (max==i) 
            {
            max=min;
            p=A[n-i+1];
            A[n-i+1]=A[max];
            A[max]=p;
            }
        }

}

  for (i=1;i<=n;i++)
  {
    cout<<A[i]<<" ";
  }

}    
    system("PAUSE");
    return EXIT_SUCCESS;

}



--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
azesmcar
Дата 25.4.2009, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

//len=strlen(S);

Код

len = S.size();


Цитата

//& (i == len) 

не понял о чем речь..
Код

      if (S[i]==' ' && i == len) 

может это?

Цитата

//A[j]=Copy(S,k,i-k+byte(i = len));

S.substr думаю справится
PM   Вверх
mes
Дата 26.4.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вот внес поправки вначало с комментами,
остальное привести в порядок думаю сами сможете
Код

// вместо using namespace более желательным будет использовать префикс std::
// хотя для простых задач  и так пойдет

int main(int argc, char *argv[])
{
// не объявляйте переменные до тех пор пока они действительно не понадобится.
std::string Arr[900]; // не желательно использовать в названиях переменных слова состоящие только из заглавных букв, даже одной                         

std::string Str="ais coo... ";
std::cout<<Str<<endl; 
unsigned len=Str.length(); // stlen () и др. - для си строк (char *); а у std::string есть методы для этого, похоже как у TAnsiString

  for (unsigned i=0; i<len;i++) // индексы начинаются с 0, а не с 1 как у паскаля.
                               // поэтому i=0 и i< len, а не i<=len
                               // переменные цикла желательно объявлять вннутри цикла
  {
      if (Str[i]==' ') //& (i == len) // это условие проверяется в цикле, а логический AND будет &&, а не &
     {
         //переменные k, j в этой части не нужны, их можно выразить посредством i.

         //A[j]=Copy(S,k,i-k+byte(i = len)); // что должно тут скопироваться я не понял, напишите словами
// ..  


Это сообщение отредактировал(а) mes - 26.4.2009, 12:35


--------------------
PM MAIL WWW   Вверх
Sanek123
Дата 26.4.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Благодарю Вас за помощь!
Цитата

//A[j]=Copy(S,k,i-k+byte(i = len)); // что должно тут скопироваться я не понял, напишите словами

функция Copy в Pascal возвращает подстроку выбранную из строки S, начиная с элемента с порядковым номером k и длинной (подстроки) - i.
substr что-то не катит, может какая lib нужна.
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
mes
Дата 26.4.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Sanek123 @  26.4.2009,  11:27 Найти цитируемый пост)
из строки S, начиная с элемента с порядковым номером k и длинной (подстроки) - i.

ну и с какого по какой он должен скопировать при длине строки 10 и i == 6 ?

Добавлено через 59 секунд
Цитата(Sanek123 @  26.4.2009,  11:27 Найти цитируемый пост)
substr что-то не катит

http://www.cplusplus.com/reference/string/string/substr/


--------------------
PM MAIL WWW   Вверх
Sanek123
Дата 26.4.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Ребята, подрихтовал код, компилятор не ругается, но и алгоритм не работает. Прогу писал на паскале - работало, на си не идет. Задача - сортировка слов в строке, а получается выкидывает туже строку без сортировки. Может я что-то упустил или мои задатки Pascal'евца мешат си-продвиженю. Если не трудно, подскажите - что не так.
Код

#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int main()
{

typedef 
string T;

T A[900];
T p;
string S;
int i,j,k,n,min,max,len;

{
    
S="ais cool beer soft hard deep trend loock boss var kolt spirt ficha fuck fox";
cout<<S<<endl;

unsigned len=S.length();

i=0;
j=0;
k=0;

  for (i=0;i<=len;i++)
      {
      if (S[i]==' ' || i == len) 
         {
         j=j+1;
         A[j]= S.substr (k,i-k);
         cout<<A[j]<<" ";
         k=i+1;
         }
      }

n=j;
j=0;
i=0;

for (i=1;i<=n/2;i++)
    {
    if (A[i]>A[i+1]) 
       {
       min=i+1;
       max=i;
       }
    else
      {
      min=i;
      max=i+1;
      }

  for (j=i+2;j<=n-i+1;j++)
      {
      if (A[j]>A[max]) 
         {
         max=j;
         }
      else
         {
         if (A[j]<A[min]) 
         {
         min=j;
         }

         p=A[i];
         A[i]=A[min];
         A[min]=p;
    
         if (max==i) 
            {
            max=min;
            p=A[n-i+1];
            A[n-i+1]=A[max];
            A[max]=p;
            }
        }

}

cout<<" "<<endl;

  for (i=0;i<=n;i++)
  {
  cout<<A[i]<<" ";
  }

}  }  
    system("PAUSE");
    return EXIT_SUCCESS;

}


--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
azesmcar
Дата 26.4.2009, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Sanek123

Код не смотрел честно говоря, но уверен что эта проблема есть smile она есть у всех кто переходит с Паскаля на Си.
В С++ массив начинается с 0, в паскале с 1. Исправь - дальше посмотрим smile
PM   Вверх
Sanek123
Дата 26.4.2009, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Блин - просто невнимательность
Код

#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int main()
{

typedef 
string T;

T A[900];
T p;
string S;
int i,j,k,n,min,max,len;

{
    
S="ais cool beer soft hard deep trend loock boss var kolt spirt ficha fuck fox";
cout<<S<<endl;

unsigned len=S.length();

i=0;
j=0;
k=0;

  for (i=0;i<=len;i++)
      {
      if (S[i]==' ' || i == len) 
         {
         j=j+1;
         A[j]= S.substr (k,i-k);
         cout<<A[j]<<" ";
         k=i+1;
         }
      }

n=j;
j=0;
i=0;

for (i=1;i<=n/2;i++)
    {
    if (A[i]>A[i+1]) 
       {
       min=i+1;
       max=i;
       }
    else
      {
      min=i;
      max=i+1;
      }

  for (j=i+2;j<=n-i+1;j++)
      {
      if (A[j]>A[max]) 
         {
         max=j;
         }
      else
         {
         if (A[j]<A[min]) 
         {
         min=j;
         }

         p=A[i];
         A[i]=A[min];
         A[min]=p;
    
         if (max==i) 
            {
            max=min;
            p=A[n-i+1];
            A[n-i+1]=A[max];
            A[max]=p;
            }
        }

}} // Здесь оператор должен закрыться

cout<<" "<<endl;

  for (i=0;i<=n;i++)
  {
  cout<<A[i]<<" ";
  }

}   // А здесь он закрывался раньше 
    system("PAUSE");
    return EXIT_SUCCESS;

}

--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
mes
Дата 26.4.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Sanek123 @  26.4.2009,  15:44 Найти цитируемый пост)
  for (i=0;i<=n;i++)


если бы переменная цикла была бы объевлена внутри, а не снаружи
типа for (int i=0;..) то тогда изменение этой переменной внутри одного цикла, не отражался бы на другом.
однако Вы не обратили внимание на данный Вам совет, чем и доставили себе лишние минуты удовольствия при поиске глюка smile

Цитата(Sanek123 @  26.4.2009,  14:55 Найти цитируемый пост)
Задача - сортировка слов в строке, а получается выкидывает туже строку без сортировки.

на cpp эта задача решается гораздо легче, чем Вы написали. 

Это сообщение отредактировал(а) mes - 26.4.2009, 18:53


--------------------
PM MAIL WWW   Вверх
mes
Дата 27.4.2009, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Код

#include <iostream>
#include <vector>

int main()
{

    std::string str =...; // строка
    const char * sep = " ,"; // набор разделителей слов строки


    std::vector<std::string>  words; // массив слов

    for (size_t word_begin=0, word_end=0; ; ) // цикл разбиения строки на слова
    {
        word_begin = str.find_first_not_of  (sep,word_end);
        if (word_begin == std::string::npos) break;

        word_end = str.find_first_of (sep,word_begin);
        if (word_end != std::string::npos)  words.push_back(str.substr(word_begin, word_end-word_begin));
        else { words.push_back(str.substr(word_begin)); break; }
    }

    std::sort (words.begin(), words.end()); // сортировка слов

    for (size_t i=0; i<words.size();++i) // вывод всех слов в цикле
    std::cout << words[i]<< " ";

    system ("pause");
    return(0);
}



--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0609 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.