0 / 0 / 0
Регистрация: 02.01.2018
Сообщений: 33
1

Перевод из Pascal в СИ

04.07.2018, 17:21. Показов 2547. Ответов 9
Метки нет (Все метки)

Прошу помочь в переводе программы из Pascal в СИ:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
var
  a,b,x,y,h,r,c,d,e,s,s1 : real;
  i,n : longint;
  bool : boolean;
 
  Function F(x:real):real;
  begin
    if x>2*r then begin F:=c; exit; end;
    if x>0 then begin F:=-sqrt(sqr(R)-sqr(x-r)); exit; end;
    if x<-2*r then begin F:=-d; exit; end;
    if x<=0 then F:=sqrt(sqr(R)-sqr(x+r));
  end;
 
Begin
  repeat
    write('Input r,c,d : '); readln(r,c,d);
    bool:=(r>0)and(c>0)and(d>0);
    if not bool then writeln('wse poloviteln. ese raz.');
  until bool;
  repeat
    write('Input a,b : '); readln(a,b);
    bool:=b>a;
    if not bool then writeln('b dolvno bytx bolse. ese raz.');
  until bool;
  repeat
    write('Input e : '); readln(e);
    bool:=(e>0.00009)and(e<0.1);
    if not bool then writeln('e=[0.0001 .. 0.9] ese raz.');
  until bool;
 
  n:=2; s:=0;
  repeat
    s1:=s;
    h:=(b-a)/n; s:=0; x:=a;
    for i:=1 to n do begin
      s:=s+f(x); x:=x+h;
    end;
    s:=s*h;
  {  writeln('n=',n:8,'  I= ',s:0:6); }
    n:=n*2;
  until abs(s1-s)<e;
  writeln('diapason ',a:0:2,' po ',b:0:2,'   I= ',s:0:6);
  readln;
End.
Возникают трудности с буленовскими переменными, не понимаю как их применить в Си в этом случае.

Добавлено через 2 минуты
Пытался сделать что то подобное
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <stdio.h>
#include <conio.h>
#include <stdbool.h>
 
int Input (void) {
    
    int a, b, x, y, h,F, r, c, d, e, s, s1;
    long int i, n;
    
    float x;
 
    int FunctionF(int x); 
        
    
    
    {
        if (x > 2 * r) {
            F = c; 
        }
        if (x > 0) {
            F = -sqrt(sqr(r) - sqr(x - r)); 
        }
        if (x < -2 * r) {
            F = -d; 
        }
        if (x <= 0) {
            F = sqrt(sqr(r) - sqr(x + r));
        }
        int Process();
        
        {
            bool t = 0;
        do
        {
            printf("Input r,c,d: ");
            scanf("%d %d %d", &r, &c, &d);
            if bool=((r>0) && (c>0) && (d>0);
            if (bool != 1) printf("wse poloviteln. ese raz.");
        } 
        while (bool != 1);
 
        {   
            do {
            printf("Input a,b : "); scanf(a, b);
            bool = b > a;
        }while  bool ! {
            printf("b dolvno bytx bolse. ese raz.");
        }
        while boolean; }
 
        {   
            do {
                printf("Input e :"); scanf(e);
                bool = (e > 0.00009) & (e < 0.1);
            } while bool ! {
                printf("e=[0.0001 .. 0.9] ese raz.");
            }
            while boolean; }
 
        n = 2; s = 0;
        
        {   do {
                s1 = s;
                h = (b - a) / n; s = 0; x = a;
            }while (int i = 1; i < n; i++) {
                s = s + f(x); x = x + h;
            }
            s = s * h;
            n = n * 2;
            while abs(s1 - s) < e; }
        {
            printf("diapason" a:0 : 2, " po ", b : 0 : 2, " I= ", s : 0 : 6); scanf();
    }
 
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.07.2018, 17:21
Ответы с готовыми решениями:

Перевод программы с Turbo Pascal на Pascal ABC.NET
написала программу в паскаль турбо на рабочем компьютере. перенесла в паскаль авсNet так как дома...

Перевод программы с turbo pascal на Pascal ABC
Есть программа, которая строит треугольник Серпинского методом хаоса, но она конфликтует с графикой...

Перевод из Pascal в C++
Перевод из Pascal в C++ Здравствуйте, помогите пожалуйста с переводом, сам нисколько не знаю...

Перевод из Pascal в C#
Пожалуйста переведите var x:integer; a,y:real; begin write('Введите коэффициент а=');...

9
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
04.07.2018, 18:18 2
Лучший ответ Сообщение было отмечено Unkown47 как решение

Решение

во-первых, я бы избавился от глобальных переменных и в функцию F передавал бы те переменные, которые используются внутри нее
C
1
2
3
4
5
6
7
8
9
10
11
double F(double x, double c, double r, double d)
{
   if(x > r * 2)
      return c;
   if(x > 0)
      return -sqrt( sqr(r) - sqr(x - r) );
   if(x < -2 * r)
      return -d;
   else
      return sqrt( sqr(r) - sqr(x + r) );
}
Далее особо ничего не меняя
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
int main(void)
{
  double r, c, d; // первые числа для ввода
  double a, b;   // вторые числа для ввода
  double e;       // третье число для ввода
 
  double x, y, h, s1 =1.1, s = 0.; // переменные для вычислений
  int       i, n =2;
 
  bool bInput = false;
  while(bInput == false)
  {
     printf("Введите три действительных положительных числа, разделенных пробелами r, c, d: ");
     scanf("%f %f %f", &r, &c, &d);
     if( (bInput = (r>0) && (c>0) && (d>0) ) == false) 
         printf("Все числа должны быть положительные!!!\n");
   }
 
   bInput = false;
   while(bInput == false)
   {
      printf("Введите два действительных числа через пробел. Первое должно быть меньше второго:");
      scanf("%f %f", &a, &b);
      if( (bInput = (b >a)) == false) 
         printf("Второе число должно быть больше первого!!!\n");
   }
 
   while(bInput == false)
   {
      // определись с диапазоном, так как проверка идет (e>0.00009)and(e<0.1), 
      // а запрос на диапазон 'e=[0.0001 .. 0.9]'
      printf("Введите действительное число в диапазоне [0.00009..0.1](точность вычисления):");
      scanf("%f", &e);
      if( (bInput = (e > 0.00009) && (e < 0.1) == false) 
         printf("Введено неверное число!!!\n");
   }
   
   while(abs(s1 - s) > e)
   {
      s1 = s;
      h = (b - a) / n;
      s = 0;
      x = a;
      for(i = 0; i < n; i++)
      {
         s += F(x, c, r, d);
         x += h;
      }
      s *= h;  // эта строчка мне непонятна. Похоже, что она лишняя
      printf("n=%d  I=%f\n", n, s);
      n *= 2;
   }
   printf("Диапазон %f по %f     I=%f\n", a, b, s);
}
1
0 / 0 / 0
Регистрация: 02.01.2018
Сообщений: 33
04.07.2018, 19:27  [ТС] 3
Благодарю за ответ, но не могли бы вы расписать используемые библиотеки и каким компилятором пользовались?
0
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
05.07.2018, 07:34 4
Библиотеки стандартные и компилятором можно пользоваться любым, но требуется включить заголовочные файлы
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Для функций prinf и scanf #include <stdio.h>
// для функций sqrt, abs, sqr #include <math.h>
// функцию abs лучше заменить на fabs, a функцию sqr на pow
// В общем виде будет так
//----------------------------------------------------
#include <stdio.h>
#include <math.h>
//----------------------------------------------------
double F(double x, double c, double r, double d)
{
   if(x > r * 2)
      return c;
   if(x > 0)
      return -sqrt( pow(r, 2) - pow(x - r, 2) );
   if(x < -2 * r)
      return -d;
   else
      return sqrt( pow(r, 2) - pow(x + r, 2) );
}
//----------------------------------------------------
int main(void)
{
  double r, c, d; // первые числа для ввода
  double a, b;   // вторые числа для ввода
  double e;       // третье число для ввода
 
  double x, y, h, s1 =1.1, s = 0.; // переменные для вычислений
  int       i, n =2;
 
  bool bInput = false;
  while(bInput == false)
  {
     printf("Введите три действительных положительных числа, разделенных пробелами r, c, d: ");
     scanf("%f %f %f", &r, &c, &d);
     if( (bInput = (r>0) && (c>0) && (d>0) ) == false) 
         printf("Все числа должны быть положительные!!!\n");
   }
 
   bInput = false;
   while(bInput == false)
   {
      printf("Введите два действительных числа через пробел. Первое должно быть меньше второго:");
      scanf("%f %f", &a, &b);
      if( (bInput = (b >a)) == false) 
         printf("Второе число должно быть больше первого!!!\n");
   }
 
   bInput = false;
   while(bInput == false)
   {
      // определись с диапазоном, так как проверка идет (e>0.00009)and(e<0.1), 
      // а запрос на диапазон 'e=[0.0001 .. 0.9]'
      printf("Введите действительное число в диапазоне [0.00009..0.1](точность вычисления):");
      scanf("%f", &e);
      if( (bInput = (e > 0.00009) && (e < 0.1) == false) 
         printf("Введено неверное число!!!\n");
   }
   
   while(fabs(s1 - s) > e)
   {
      s1 = s;
      h = (b - a) / n;
      s = 0;
      x = a;
      for(i = 0; i < n; i++)
      {
         s += F(x, c, r, d);
         x += h;
      }
      s *= h;  // эта строчка мне непонятна. Похоже, что она лишняя
      printf("n=%d  I=%f\n", n, s);
      n *= 2;
   }
   printf("Диапазон %f по %f     I=%f\n", a, b, s);
}
1
0 / 0 / 0
Регистрация: 02.01.2018
Сообщений: 33
05.07.2018, 15:25  [ТС] 5
Ну для того чтобы компилятор си читал bInput нужно прописать библиотеку #include <stdbool.h>, правда программа не работает и цыклица после ввода первых трёх переменных. Пробовал менять типы с double на int(тщетно ) и так и не понял почему после каждого условия ставится false, если при вводе удовл. условию значений должно быть true, возможна ли тут ошибка?
0
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
05.07.2018, 19:16 6
Выложи пожалуйстта свой код
0
0 / 0 / 0
Регистрация: 02.01.2018
Сообщений: 33
05.07.2018, 19:22  [ТС] 7
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <stdbool.h>
#include <stdlib.h>
#include < math.h > 
#include <locale.h>
 
double F(double x, double c, double r, double d)
{
    if (x > r * 2)
        return c;
    if (x > 0)
        return -sqrt(pow(r, 2) - pow(x - r, 2));
    if (x < -2 * r)
        return -d;
    else
        return sqrt(pow(r, 2) - pow(x + r, 2));
}
//----------------------------------------------------
int main(void)
{
    setlocale(LC_ALL, "Rus");
    double r, c, d; 
    double a, b;   
    double e;       
 
    double x, y, h, s1 = 1.1, s = 0.; 
    int       i, n = 2;
 
    bool bInput = false;
    while (bInput == false)
    {
        printf("Введите три действительных положительных числа, разделенных пробелами r, c, d: ");
        scanf("%f %f %f", &r, &c, &d);
        if ((bInput = (r>0) && (c>0) && (d>0)) == false)
            printf("Все числа должны быть положительные!!!\n");
    }
 
    bInput = false;
    while (bInput == false)
    {
        printf("Введите два действительных числа через пробел. Первое должно быть меньше второго:");
        scanf("%f %f", &a, &b);
        if ((bInput = (b >a)) == false)
            printf("Второе число должно быть больше первого!!!\n");
    }
 
    bInput = false;
    while (bInput == false)
    {
        
        printf("Введите действительное число в диапазоне [0.0..1.0](точность вычисления):");
        scanf("%f", &e);
        if ((bInput = (e > 1.0) && (e < 0.0)) == false)
            printf("Введено неверное число!!!\n");
    }
 
    while (fabs(s1 - s) < e)
    {
        s1 = s;
        h = (b - a) / n;
        s = 0;
        x = a;
        for (i = 1; i < n; i++)
        {
            s += F(x, c, r, d);
            x += h;
        }
        s *= h;
        printf("n=%d  I=%f\n", n, s);
        n *= 2;
    }
    printf("Диапазон %f по %f     I=%f\n", a, b, s);
}
0
0 / 0 / 0
Регистрация: 02.01.2018
Сообщений: 33
05.07.2018, 19:36  [ТС] 8
если ввести например там 0.2 0.5 и 0.2, то вот, так же пробовал вводить в компилятор Pelles выдаёт вот такие ошибки: (скрин2)
Миниатюры
Перевод из Pascal в СИ   Перевод из Pascal в СИ  
0
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
05.07.2018, 20:07 9
Лучший ответ Сообщение было отмечено Unkown47 как решение

Решение

все верно. только замените везде %f на %lf, так как вводим числа типа double, то есть везде будет вместо scanf("%f %f %f", &r, &c, &d) scanf("%lf %lf %lf", &r, &c, &d)
Еще последнее условие при вводе точности неверное: заменить на if ((bInput = (e < 1.0) && (e > 0.0)) == false)

И скорее всего вводите данные неправильно. Есть разница между функцией printf и scanf
printf выводит в формате 1.2
используя scanf при вводе действительных чисел надо использовать не точку, а запятую, то есть число должно представляться в виде 1,2

Добавлено через 7 минут
scanf не проверяет ввод. Для контроля ввода используй код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
{
    double r, c, d;
    double a, b;
    double e;
 
    double x, h, s1 = 1.1, s = 0.;
    int       i, n = 2;
 
    bool bInput = false;
    while (bInput == false)
    {
        printf("Введите три действительных положительных числа, разделенных пробелами r, c, d: ");
        scanf("%lf %lf %lf", &r, &c, &d);
        printf("Введено:  %lf %lf %lf\n", r, c ,d);
        if ((bInput = (r>0) && (c>0) && (d>0)) == false)
            printf("Все числа должны быть положительные!!!\n");
    }
 
    bInput = false;
    while (bInput == false)
    {
        printf("Введите два действительных числа через пробел. Первое должно быть меньше второго:");
        scanf("%lf %lf", &a, &b);
        printf("Введено:  %lf %lf\n", a, b);
        if ((bInput = (b >a)) == false)
            printf("Второе число должно быть больше первого!!!\n");
    }
 
    bInput = false;
    while (bInput == false)
    {
 
        printf("Введите действительное число в диапазоне [0.0..1.0](точность вычисления):");
        scanf("%lf", &e);
        printf("Введено:  %lf\n", e);
        if ((bInput = (e < 1.0) && (e > 0.0)) == false)
            printf("Введено неверное число!!!\n");
    }
 
    while (fabs(s1 - s) < e)
    {
        s1 = s;
        h = (b - a) / n;
        s = 0;
        x = a;
        for (i = 1; i < n; i++)
        {
            s += F(x, c, r, d);
            x += h;
        }
        s *= h;
        printf("n=%d  I=%lf\n", n, s);
        n *= 2;
    }
    printf("Диапазон %lf по %lf     I=%lf\n", a, b, s);
}
1
0 / 0 / 0
Регистрация: 02.01.2018
Сообщений: 33
05.07.2018, 20:32  [ТС] 10
Да теперь работает, даже интеграл правильно считает), благодарю за выделенное мне время
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2018, 20:32
Помогаю со студенческими работами здесь

перевод с Pascal на C++
Const Max=1000; Eps=0.00001; Type Para=record X: integer;

Перевод из Pascal в C#
Переведите если не сложно, пожалуйста var a: array of integer; n, m, i, j, k, k_min, i_max,...

Перевод из Pascal в С++
Можно пожалуйста перевести в С++ и сделать ее рандомной. Еще у меня не получается вывести на...

Перевод из pascal в С
Program pr4_1; uses crt; var firstmaxpos, lastminpos, n, i :integer; x,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru