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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2012, 16:16   #1
guzel20
Пользователь
 
Аватар для guzel20
 
Регистрация: 05.12.2012
Сообщений: 25
По умолчанию Перевод кода из Pascal в C++

Добрый вечер. Помогите перевести код из Pascal в C++.
Срочно. Заранее спасибо

Код:
function encode(s:string):string;
var i, j : integer;
    newS:string;
begin
  i := 1;
  while i <= length(s) do
  begin
    j := i;
    while (s[i] = s[j + 1]) do inc(j);
    if (j - i = 0) or (j - i = 1) or (j - i = 2) then
    begin
      newS := newS + s[i];
      if (s[i] = '0') then newS := newS + '0';
      inc(i);
    end else
    begin
      newS := newS + inttostr(j - i + 1) + s[i];
      inc(i, j - i + 1);
    end;
  end;
  result:= newS;
end;
 
function decode(s: string): string;
var i, j, c: integer;
    newS: string;
    dp: string;
begin
i := 1;
while i <= length(s) do
  begin
    j:=i;
    while s[j] in ['0' .. '9'] do inc(j);
    if j - i > 0 then
    begin
      dp := copy(s, i, j - i);
      for c := 1 to strtoint(dp) do newS := newS + s[j];
      delete(s, i, j - i + 1);
    end else
    begin
      newS := newS + s[i];
      inc(i);
    end;
  end;
  result := newS;
end;

Последний раз редактировалось guzel20; 05.12.2012 в 16:18.
guzel20 вне форума Ответить с цитированием
Старый 05.12.2012, 16:24   #2
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,672
По умолчанию

Потрудитесь для начала:
"begin" = "{"
"end" = "}"
":=" = "="
Благими намерениями устлана дорога на programmersforum.ru
MihalNik вне форума Ответить с цитированием
Старый 05.12.2012, 16:28   #3
guzel20
Пользователь
 
Аватар для guzel20
 
Регистрация: 05.12.2012
Сообщений: 25
По умолчанию

Я не настолько глупа
Первую функцию я перевела так:

Код:
string* encode(string* s) {
	int j, i = 1;
	string* s; 
	string* newS;
	string* result;
	while (i <= strlen(s)) {
		j = i;
		while (s[i] == s[j + 1]) {
			j++;
		}
		if (((j - i) == 0) or ((j - i) == 1) or ((j - i) == 2)) {
			newS = newS + s[i];
			if (s[i] == '0') {
				newS = newS + '0';
			}
      			i++;
		} else {
			int k = j - i + 1;
			newS = newS + k + s[i];
			i += j - i + 1;
		}
	}
	result = newS;
}
Но в ней есть ошибки и она не компилируется.
Помогите, пожалуйста.
guzel20 вне форума Ответить с цитированием
Старый 05.12.2012, 16:30   #4
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,672
По умолчанию

А сообщения компилятора?
Благими намерениями устлана дорога на programmersforum.ru
MihalNik вне форума Ответить с цитированием
Старый 05.12.2012, 16:32   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Код:
//function encode(s:string):string;
std::string encode(std::string s){
//var i, j : integer;
  int i, j; 
//    newS:string;
  std::string newS;
//begin
//  i := 1;
  i = 0;
//  while i <= length(s) do
  while(i < s.length()){
//  begin
//    j := i;
    j = i;
//    while (s[i] = s[j + 1]) do inc(j);
    while(s[i] == s[j+1]) ++j;
//    if (j - i = 0) or (j - i = 1) or (j - i = 2) then
    if(j-i==0 || j-i==1 || j-i==2){
//    begin
//      newS := newS + s[i];
      newS = newS + s[i];
//      if (s[i] = '0') then newS := newS + '0';
      if(s[i] == '0') newS = newS + '0';
//      inc(i);
      ++i;
//    end else
    } else {
//    begin
//      newS := newS + inttostr(j - i + 1) + s[i];
      std::stringstream num;
      num << j-i+1;
      newS = newS + num.str() + s[i];
//      inc(i, j - i + 1);
      i += j-i+1;
//    end;
    }
//  end;
  }
//  result:= newS;
  return newS;
//end;
}
Abstraction вне форума Ответить с цитированием
Старый 05.12.2012, 16:32   #6
guzel20
Пользователь
 
Аватар для guzel20
 
Регистрация: 05.12.2012
Сообщений: 25
По умолчанию

Он ругается на if. Т.е. на эту строчку
Код:
if (((j - i) == 0) or ((j - i) == 1) or ((j - i) == 2))
Вроде со скобками не напутала. Не пойму где ошибка.

Спасибо большое, Abstraction
Но ваша программа тоже не компилируется.
Ругается на эти строчки, что используется неопределенный класс.
Код:
std::stringstream num;
num << j-i+1;
newS = newS + num.str() + s[i];
Я поняла
В if забыла заменить "or" на "||"
Код:
if (((j - i) == 0) || ((j - i) == 1) || ((j - i) == 2))
Теперь у меня другой вопрос.
Как мне из этой функции возвратить строку?

Вот код программы:
Код:
char* encode(char* s) {
	int j, i = 1;
	char* newS;
	char* result;
	while (i <= strlen(s)) {
		j = i;
		while (s[i] == s[j + 1]) {
			j++;
		}
		if (((j - i) == 0) || ((j - i) == 1) || ((j - i) == 2)) {
			newS = newS + s[i];
			if (s[i] == '0') {
				newS = newS + '0';
			}
      			i++;
		} else {
			int k = j - i + 1;
			newS = newS + k + s[i];
			i += j - i + 1;
		}
	}
	result = newS;
}
В ней осталась одна ошибка - это нет возвращаемого значения.
Если писать
Код:
return result;
То она всё равно ругается

Последний раз редактировалось Stilet; 28.11.2013 в 17:59.
guzel20 вне форума Ответить с цитированием
Старый 05.12.2012, 16:52   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Ругается на эти строчки, что используется неопределенный класс.
#include <sstream>

Нельзя таким образом использовать тип char*. С ним конструкции вида
Код:
newS = newS + s[i];
работать будут, но совсем не так, как Вы ожидаете.

Последний раз редактировалось Stilet; 28.11.2013 в 18:00.
Abstraction вне форума Ответить с цитированием
Старый 05.12.2012, 16:55   #8
guzel20
Пользователь
 
Аватар для guzel20
 
Регистрация: 05.12.2012
Сообщений: 25
По умолчанию

Большое спасибо!

А не поможете мне ещё со второй функцией?
guzel20 вне форума Ответить с цитированием
Старый 05.12.2012, 17:01   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Код:
while s[j] in ['0' .. '9']
эквивалентно
Код:
while('0'<=s[j] && s[j]<='9')
Аналог delete - std::string::erase. Аналог copy - std::string::substr.
Abstraction вне форума Ответить с цитированием
Старый 05.12.2012, 17:15   #10
guzel20
Пользователь
 
Аватар для guzel20
 
Регистрация: 05.12.2012
Сообщений: 25
По умолчанию

Что-то у меня не получается разобраться со этими строчками
Код:
dp := copy(s, i, j - i);
for c := 1 to strtoint(dp) do newS := newS + s[j];
delete(s, i, j - i + 1);

Последний раз редактировалось guzel20; 05.12.2012 в 17:21.
guzel20 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод кода с Pascal на C++ n3250sasha C++ Builder 1 04.11.2012 16:19
Перевод кода из Pascal в C++ Kerragin Помощь студентам 5 13.12.2011 07:54
Перевод кода с Java на Pascal Warfvare Помощь студентам 4 19.06.2010 08:38
Перевод кода из Pascal в Object Pascal zemskov77 Общие вопросы Delphi 1 03.01.2009 09:37