Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Строки в С++ аналоги Pascal'евским функциям


Автор: Sanek123 25.4.2009, 22:23
Помогите пожалуйста перевести пару строк с 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;

}



Автор: azesmcar 25.4.2009, 22:48
Цитата

//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 думаю справится

Автор: mes 26.4.2009, 11:02
вот внес поправки вначало с комментами,
остальное привести в порядок думаю сами сможете
Код

// вместо 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)); // что должно тут скопироваться я не понял, напишите словами
// ..  

Автор: Sanek123 26.4.2009, 12:27
Благодарю Вас за помощь!
Цитата

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

функция Copy в Pascal возвращает подстроку выбранную из строки S, начиная с элемента с порядковым номером k и длинной (подстроки) - i.
substr что-то не катит, может какая lib нужна.

Автор: mes 26.4.2009, 12:31
Цитата(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/

Автор: Sanek123 26.4.2009, 15:55
Ребята, подрихтовал код, компилятор не ругается, но и алгоритм не работает. Прогу писал на паскале - работало, на си не идет. Задача - сортировка слов в строке, а получается выкидывает туже строку без сортировки. Может я что-то упустил или мои задатки 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;

}


Автор: azesmcar 26.4.2009, 16:01
Sanek123

Код не смотрел честно говоря, но уверен что эта проблема есть smile она есть у всех кто переходит с Паскаля на Си.
В С++ массив начинается с 0, в паскале с 1. Исправь - дальше посмотрим smile

Автор: Sanek123 26.4.2009, 16:44
Блин - просто невнимательность
Код

#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;

}

Автор: mes 26.4.2009, 18:52
Цитата(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 27.4.2009, 02:45
Код

#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);
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)