IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Требуется превести две программы (http://www.imho.ws/showthread.php?t=86553)

Polygon_w 29.05.2005 08:52

Требуется превести две программы
 
Необходимо перевести две программы с паскаля на си++.

Код:

const
  dx = 30; dy = 2; xn = 90; xk = 300; yn = 4; yk = 16;
var
  x, y, z: real;

function f(x,y:real):real;
begin
  f:=(exp((2/3)*ln(pi))+(ln((exp(3)*ln(y))-1)))/(exp((exp(1)-1))*(ln(x)));
end;

begin
  x:=xn;
  y:=yn;
  writeln(' x    y      z');
  writeln('-----------------');
  repeat
    z:=f(x,y);
    writeln( x:1:1, ' ':3, y:1:1, ' ':3, z:5:3);
    x:=x+dx;
    y:=y+dy;
  until (x>xk)and(y>yk);
  readln;
end.

У меня получилось
Код:

int dx=30, dy=2, xn=90, xk=300, yn=4, yk=16;
float x, y, z;
char other;

float func(float x, float y)
{
    return exp((2/3)*LnXP1(3.1451))+(LnXP1((exp(3)*LnXP1(y))-1))/(exp((exp(1)-1))*(LnXP1(x)));
}

int main(int argc, char* argv[])
{
    x=xn;
    y=yn;
    printf("x    y    z\n");
    printf("_____________\n");
    do
        z = func(x, y);
        cout << x, y, z;
        x = x + dx;
        y = y + dy;
    while ((x > xk) && (y > yk));
    scanf("%d", other);
    return 0;
}

Сие творение не работает как надо. Помогите разобраца. Скорее всего с циклом что-то не то, но не могу понять что именно.

ЕЖ 29.05.2005 12:33

В паскале UNTIL означает ПОКЕ НЕ, а в си WHILE - это просто ПОКА. Т.е. тебе нужно просто сделать отрицание условия в while.
Код:

while (x<=xk || y<=yk)

Polygon_w 29.05.2005 13:03

В таком случае оно зацикливается и печатает число 90 бесконечно.(

ЕЖ 29.05.2005 13:23

Чего то у тебя конкретно глючит. Не может оно зацикливаться!
Кроме того, не вижу у тебя блоковых скобок в цикле {} между do и while.
Ещё очень некрасиво смешиваешь С и С++ вывод (printf и cout).
И отформатируй вывод результатов хотябы так:
Код:

cout << x << " " << y << " " << z;
Программу проверял на Borland C++, всё точно работает.

Polygon_w 29.05.2005 19:01

Гым, спасибо, заработало. Смешение стилей произошло из-за пока нечеткого знания ообоих языков, но стремлюсь к этому.

И еще одну, последнюю программу помогите перевести
Код:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  s,tmp: string;
  i, predl, slov, slovk: integer;
begin

  readln(s);
  s:=s+' ';
  tmp:='';
  i:=0;
  predl:=0;
  slov:=0;slovk:=0;
  while i<>length(s) do
  begin
    inc(i);
    case s[i] of
      '.','!': if s[i+1]=' ' then
              begin
                inc(predl);
                if slovk<slov then slovk:=slov;
                slov:=0;
              end;
      ' ': inc(slov);
    end;
  end;
  if predl>slovk then s:='>' else s:='<';
  if predl=slovk then s:='=';
  writeln('otdelnih predlosenii ',predl,s,slovk,' slov v samom bolsom predlosenii');
  readln;
end.

Код:

/*
 * Определяет чего в строке больше: отдельных предложений
 * или слов в самомо большом предложежнии. Самое большое придложение
 * определеяется по кол-ву отельных слов, а не символов.
 */

AnsiString s, tmp;
int i, predl, slov, slovk;

int main(int argc, char* argv[])
{
    scanf("%d", s);
  // s = "asdsd s dad as dad a d";
    s = s + " ";
    tmp = "";
    i = 0;
    predl = 0;
    slov = 0;
    slovk = 0;

    while (i != s.Length())
    {
        i = i++;
        switch (s[i])
        {
              case '.', ',', '!':
              {
                  if (s[i + 1] == ' ')
                  {
                      predl = predl++;
                      if (slovk < slov){slovk = slov;}
                      slov = 0;
                  }
                  break;
              };
              case ' ':
                  {
                      slov = slov++;
                      break;
                  }
        }
    }

    if (predl > slovk){s = ">";}
    else s = "<";

    if (predl = slovk) s = "=";

    cout << "otdelnih predlozheniy\n", predl, s, slovk, " slov v samom bolshm predlozhenii";

    return 0;
}

В такой переаботки значения predl, s, slovk вапще не выводятся. Немогу понять из-за чего, проде бы все правильно.(

Trotil 29.05.2005 19:50

Цитата:

AnsiString s, tmp;
Это из какой библиотеки?

Polygon_w 29.05.2005 20:38

Цитата:

Сообщение от Trotil
Это из какой библиотеки?

В моем случае из dstring.h, компилятор от борланда.

Vellion 31.05.2005 12:02

Первое строка малость не так считываеться в С, если уж scanf''ом то так scanf("%s", s.c_str());

Второе cout тоже малость не так работает, ему вроде нельзя через запятую переменные задавать, пиши вот так :
cout << "otdelnih predlozheniy\n" << predl << s << slovk << " slov v samom bolshm predlozhenii";

А вообще scanf(), на сколько я помню, строку считает только до пробела Можно еще так считывать cin << s; но тоже строка только до пробела считаться будет
Используй лучше gets(s.c_str());


Часовой пояс GMT +4, время: 09:16.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.