IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> надо перевести програму с паскаля на с++, перевел но чего то не работает
maksimla
сообщение 29.03.2010 16:24
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


вот на паскале
program stat;

uses crt;

var side: array [1..4] of real;
    t0,tn:array[1..30,1..30] of real;
    iv:integer;
    procedure input;
     var cnt :integer;
     begin
     clrscr;
     writeln;
     write('In how ');
     readln(iv);
     for cnt:=1 to 4 do
     begin
     write('temperature ',cnt,' side?');
     readln(side[cnt]);
     end
     end;
     
     procedure calc;
     var eps:real;
     cnt1,cnt2:integer;
     abb :boolean;

      procedure setmat0;
       var tm:real;
           cnt1,cnt2:integer;
           
        begin
        iv:=iv+1;
        tm:=(side[1]+side[2]+side[3]+side[4])/4;
         for cnt1 :=2 to iv-1 do
          begin
           t0[cnt1,1]:=side[1];
           t0[iv,cnt1]:=side[2];
           t0[cnt1,iv]:=side[3];
           t0[1,cnt1]:=side[4];
           end;
           t0[1,1]:=(side[1]+side[4])/2;
           t0[iv,1]:=(side[1]+side[2])/2;
           t0[iv,iv]:=(side[2]+side[3])/2;
           t0[1,iv]:=(side[3]+side[4])/2;
           for cnt1:=2 to iv-1 do
           for cnt2:=2 to iv-1 do
           t0[cnt1,cnt2]:=tm;
           end;

           procedure setmatn;
           var cnt1,cnt2:integer;
           
           begin tn:=t0 end;
           
           begin
           fillchar(t0[1,1],5400,chr($00));
           setmat0;
           setmatn;
           repeat
           eps:=0.1;
           abb:=true;
           for cnt1:=2 to iv-1 do
           for cnt2:=2 to iv-1 do
           begin
           t0[cnt1,cnt2]:=(tn[cnt1+1,cnt2]+tn[cnt1-1,cnt2]+tn[cnt1,cnt2+1]+tn[cnt1,cnt2-1])/4;
           if abs(t0[cnt1,cnt2]-tn[cnt1,cnt2])> eps then abb:=false;
           end;
           setmatn
           until abb
           end;
           
           procedure output;
           var cnt1,cnt2:integer;
           begin
           writeln;
           cnt2:=iv;
           repeat
           for cnt1:=1 to iv do
           write(int(t0[cnt1,cnt2]+0.5):6:0);
           cnt2:=cnt2-1;
           writeln;
           writeln;
           until (cnt2<1)
           end;
begin
 input;
 calc;
 output;
 
  Readln;
end.


вот на visual с++ 6.0
#include <iostream>
#include <cmath>
using namespace std;

#define   min   4
#define   max   30
int iv;
double eps;
int cnt1,cnt2;
bool abb;
double side[min];
double tn[max][max]; 
double t0[max][max];
void input();
void calc();
void setmat0();
void setmatn();
void output();

int main()
{ 

	input();
	calc();
	output();
	return 0;
}

void input()
{
	cout << "In how many sub-intervals shall a side be subdivided ?" ;
	cin  >> iv;
	for (int cnt=1; cnt<4; cnt++)
	{   
		cout << " Temperature of the "<< cnt << ".side?";
         cin >> side[cnt] ;

	}
};

void calc()

{ 
    t0[1][1]=5400;
	setmat0();
	setmatn();
    do 
	{
	eps=0.1;
    abb= true;
     for (cnt1=1; cnt1<iv-1; cnt1++)
               for (cnt2=1; cnt2<iv-1; cnt2++)
			   {
                 t0 [cnt1  ] [cnt2  ]   = (
				 tn [cnt1+1] [cnt2  ]   +
				 tn [cnt1-1] [cnt2  ]   +
				 tn [cnt1  ] [cnt2+1]   +
				 tn [cnt1  ] [cnt2-1]     )  /4;
                 if (abs(t0[cnt1,cnt2]-tn[cnt1,cnt2]) > eps)  abb=false;
			   }
			   setmatn();}
    while (abb);
}

	void setmat0()
	//======================
    { 
	int cnt1,cnt2;
	double tm;
	 iv++;
     tm= (side[1]+side[2]+side[3]+side[4])/4;
       for (cnt1=1; cnt1<iv-1; cnt1++)
	   {    
		   t0[cnt1] [1]=side[1];
           t0[iv] [cnt1]=side[2];
           t0[cnt1] [iv]=side[3];
           t0[1] [cnt1]=side[4];
	   }

           t0[1] [1]=(side[1]+side[4])/2;
           t0[iv] [1]=(side[1]+side[2])/2;
           t0[iv] [iv]=(side[2]+side[3])/2;
           t0[1] [iv]=(side[3]+side[4])/2;
            for (cnt1=1; cnt1<iv-1; cnt1++)
               for (cnt2=1; cnt2<iv-1; cnt2++)
                 t0[cnt1][cnt2]=tm;
         void cetmatn();
	}

void setmatn()
{
   for (cnt1=1; cnt1<iv-1; cnt1++)
               for (cnt2=1; cnt2<iv-1; cnt2++)
                 tn[cnt1][cnt2]=t0[cnt1][cnt2];
}



void output()
{
	int cnt1,cnt2;
	cnt2=iv;
		for (cnt1=0; cnt2<1; cnt1++)
		cout << (t0[cnt1] [cnt2]) +0.5 ;
cnt2=cnt2-1;
}

c++ я изучаю только 2 с половиной месяца


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 10)
volvo
сообщение 29.03.2010 16:49
Сообщение #2


Гость






И не будет работать. Вечная проблема при переходе Паскаль -> C. Индексы массивов в Паскале начинаются с любого значения, как задашь. А в С - всегда с 0. А у тебя нулевой индекс нигде не упоминается. Значит, задаешь ты как минимум на одно значение в массиве меньше. Вот тебе и сбой.

Что программа делать-то должна?
 К началу страницы 
+ Ответить 
maksimla
сообщение 29.03.2010 17:08
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


Цитата(volvo @ 29.03.2010 16:49) *

И не будет работать. Вечная проблема при переходе Паскаль -> C. Индексы массивов в Паскале начинаются с любого значения, как задашь. А в С - всегда с 0. А у тебя нулевой индекс нигде не упоминается. Значит, задаешь ты как минимум на одно значение в массиве меньше. Вот тебе и сбой.

Что программа делать-то должна?

Сейчас скачаю еще visual c++ 6.0
и исправлю парочку ошибок то заметил ошибки

а что делать программа должна я беспонятия на паскале код написан норм и работает но я непонел что программа делает и учитель несказал


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
maksimla
сообщение 29.03.2010 19:09
Сообщение #4


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


#include <iostream>
#include <cmath>
using namespace std;

#define   min   4
#define   max   30
int iv;
double eps;
int cnt1,cnt2;
bool abb;
double side[min];
double tn[max][max]; 
double t0[max][max];
void input();
void calc();
void setmat0();
void setmatn();
void output();

int main()
{ 

	input();
	calc();
	output();
	return 0;
}

void input()
{
	cout << "In how many sub-intervals shall a side be subdivided ?" ;
	cin  >> iv;
	for (int cnt=1; cnt<5; cnt++)
	{   
		cout << " Temperature of the "<< cnt << ".side?";
         cin >> side[cnt] ;

	}
};

void calc()

{ 
    t0[1][1]=5400;
	setmat0();
	setmatn();
    do 
	{
	eps=0.1;
    abb= true;
     for (cnt1=0; cnt1<iv-1; cnt1++)
               for (cnt2=0; cnt2<iv-1; cnt2++)
			   {
                 t0 [cnt1  ] [cnt2  ]   = (
				 tn [cnt1+1] [cnt2  ]   +
				 tn [cnt1-1] [cnt2  ]   +
				 tn [cnt1  ] [cnt2+1]   +
				 tn [cnt1  ] [cnt2-1]     )  /4;
                 if (abs(t0[cnt1,cnt2]-tn[cnt1,cnt2]) > eps)  abb=false;
			   }
			   setmatn();}
    while (abb);
}

	void setmat0()
	//======================
    { 
	int cnt1,cnt2;
	double tm;
	 iv++;
     tm= (side[1]+side[2]+side[3]+side[4])/4;
       for (cnt1=1; cnt1<iv-1; cnt1++)
	   {    
		   t0[cnt1] [1]=side[1];
           t0[iv] [cnt1]=side[2];
           t0[cnt1] [iv]=side[3];
           t0[1] [cnt1]=side[4];
	   }

           t0[1] [1]=(side[1]+side[4])/2;
           t0[iv] [1]=(side[1]+side[2])/2;
           t0[iv] [iv]=(side[2]+side[3])/2;
           t0[1] [iv]=(side[3]+side[4])/2;
            for (cnt1=1; cnt1<iv-1; cnt1++)
               for (cnt2=1; cnt2<iv-1; cnt2++)
                 t0[cnt1][cnt2]=tm;
         void cetmatn();
	}

void setmatn()
{
   for (cnt1=1; cnt1<iv-1; cnt1++)
               for (cnt2=1; cnt2<iv-1; cnt2++)
                 tn[cnt1][cnt2]=t0[cnt1][cnt2];
}



void output()
{
	int cnt1,cnt2;
	cnt2=iv;
	do
	{
		for (cnt1=0; cnt1<iv; cnt1++)
		cout << (t0[cnt1] [cnt2]) +0.5;// тут ощибка  в паскале write(int(t0[cnt1,cnt2]+0.5):6:0);

		cnt2=cnt2-1;
	}
	while (cnt2<1);
}
 

все больше ошибок нету а как на с++ эту строчку сделать?

Сообщение отредактировано: maksimla - 29.03.2010 19:22


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Client
сообщение 29.03.2010 19:26
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


write(int(t0[cnt1,cnt2]+0.5):6:0);
Если это для представления как целого числа, то
cout << (int)  ( (t0[cnt1] [cnt2]) +0.5);
можно так
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
maksimla
сообщение 29.03.2010 19:49
Сообщение #6


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


всеровно какаято ошибка есть немогу исправить помогите


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
maksimla
сообщение 29.03.2010 20:09
Сообщение #7


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


в последней процедуре надо чтобы пару раз выводило а у меня только 1 раз


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Client
сообщение 29.03.2010 20:56
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


repeat
           for cnt1:=1 to iv do
           write(int(t0[cnt1,cnt2]+0.5):6:0);
           cnt2:=cnt2-1;
           writeln;
           writeln;
until (cnt2<1)
В паскале цикл закончится когда условие будет ИСТИНА.
do
	{
		for (cnt1=0; cnt1<iv; cnt1++)
		cout << (t0[cnt1] [cnt2]) +0.5;// тут ощибка  в паскале write(int(t0[cnt1,cnt2]+0.5):6:0);

		cnt2=cnt2-1;
	}
while (cnt2<1);
В С цикл выполняется пока условие ИСТИНА
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Client
сообщение 29.03.2010 21:27
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Цитата
а что делать программа должна я беспонятия
Испытания показывают, что програама распределяет числа так, что сумма элементов одинаковая над и под главной дигональю.
fillchar(t0[1,1],5400,chr($00));
Эм... совсем не понял что это. Процедура для заполнения памяти одним элементом, где количество байт определяется 2 параметром, он тут аж 5400.
void calc()

{ 
    t0[1][1]=5400;
    ...
Это подобие fillchar ?
for (cnt2=0; cnt2<iv-1; cnt2++)

for cnt1 :=2 to iv-1 do

В паскале на 1 итерацию будет больше.
В паскалевской версии сделай хорошие отступы, а то совсем не понятно что к чему. И вынеси вложенные процедуры, в них все работа с глабальным массивом.
Пока все smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
maksimla
сообщение 30.03.2010 12:30
Сообщение #10


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


ясно вот програма на с++ но чегото резултат несовпадает с паскалевской
#include <iostream>
#include <cmath>
using namespace std;

#define   min   4
#define   max   30
int iv;
double eps;
int cnt1,cnt2;
bool abb;
double side[min];
double tn[max][max];
double t0[max][max];
void input();
void calc();
void setmat0();
void setmatn();
void output();

int main()
{

    input();
    calc();
    output();
    return 0;
}

void input()
{
    cout << "In how many sub-intervals shall a side be subdivided ?" ;
    cin  >> iv;
    for (int cnt=1; cnt<5; cnt++)
    {  
        cout << " Temperature of the "<< cnt << ".side?";
         cin >> side[cnt] ;

    }
};

void calc()

{
    t0[1][1]=5400;
    setmat0();
    setmatn();
    do
    {
    eps=0.1;
    abb= true;
     for (cnt1=0; cnt1<iv; cnt1++)
               for (cnt2=0; cnt2<iv-1; cnt2++)
               {
                 t0 [cnt1  ] [cnt2  ]   = (
                 tn [cnt1+1] [cnt2  ]   +
                 tn [cnt1-1] [cnt2  ]   +
                 tn [cnt1  ] [cnt2+1]   +
                 tn [cnt1  ] [cnt2-1]     )  /4;
                 if (abs(t0[cnt1,cnt2]-tn[cnt1,cnt2]) > eps)  abb=false;
               }
               setmatn();}
    while (abb);
}

    void setmat0()
    //======================
    {
    int cnt1,cnt2;
    double tm;
     iv++;
     tm= (side[1]+side[2]+side[3]+side[4])/4;
       for (cnt1=1; cnt1<iv; cnt1++)
       {   
           t0[cnt1] [1]=side[1];
           t0[iv] [cnt1]=side[2];
           t0[cnt1] [iv]=side[3];
           t0[1] [cnt1]=side[4];
       }

           t0[1] [1]=(side[1]+side[4])/2;
           t0[iv] [1]=(side[1]+side[2])/2;
           t0[iv] [iv]=(side[2]+side[3])/2;
           t0[1] [iv]=(side[3]+side[4])/2;
            for (cnt1=1; cnt1<iv; cnt1++)
               for (cnt2=1; cnt2<iv; cnt2++)
                 t0[cnt1][cnt2]=tm;
         void cetmatn();
    }

void setmatn()
{
   for (cnt1=1; cnt1<iv; cnt1++)
               for (cnt2=1; cnt2<iv-1; cnt2++)
                 tn[cnt1][cnt2]=t0[cnt1][cnt2];
}



void output()
{
    int cnt1,cnt2;
    cnt2=iv;
    do
    {
        for (cnt1=1; cnt1<iv+1; cnt1++)
            cout << (int)  ( (t0[cnt1] [cnt2]) +0.5) <<"  ";
        cnt2=cnt2-1;
        cout<<endl;
        cout<<endl;
    }
    while (cnt2+1>1);
}


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 30.03.2010 12:52
Сообщение #11


Гость






Цитата
а что делать программа должна я беспонятия на паскале код написан норм и работает но я непонел что программа делает и учитель несказал
"Какая интересная жизнь у людей..." (С) К/ф "Не бойся, я с тобой".

Это что получается? Что программа делает - не знаем, но надо перевести ее на С? А смысл этого действия в чем? Ничему новому ты не научишься, просто подставлять другой синтаксис - это не программирование. Чему ты научишься при подобных "переводах"?

Вот так программа работает абсолютно так же, как и Паскалевская:
#include <iostream>
#include <cmath>

using namespace std;

int iv;
double side[4];
double t0[30][30] = {0};
double tn[30][30] = {0};

void input()
{
    cout << "\nIn how? ";
    cin >> iv;
    for(int cnt = 0; cnt < 4; ++cnt)
    {
        cout << "temperature of " << cnt + 1 << " side? ";
        cin >> side[cnt];
    }
}


void setmat0()
{
    iv = iv + 1;
    double tm = (side[0]+side[1]+side[2]+side[3]) / 4.0;
    for(int cnt1 = 1; cnt1 < iv - 1; ++cnt1)
    {
        t0[cnt1][0] = side[0];
        t0[iv - 1][cnt1] = side[1];
        t0[cnt1][iv - 1] = side[2];
        t0[0][cnt1] = side[3];
    }
    t0[0][0] = (side[0]+side[3])/2;
    t0[iv - 1][0] = (side[0]+side[1])/2;
    t0[iv - 1][iv - 1] = (side[1]+side[2])/2;
    t0[0][iv - 1] = (side[2]+side[3])/2;

    for(int cnt1 = 1; cnt1 < iv-1; ++cnt1)
    {
        for(int cnt2 = 1; cnt2 < iv-1; ++cnt2)
        {
            t0[cnt1][cnt2] = tm;
        }
    }
}

void setmatn()
{
    for(int i = 0; i < 30; i++)
        for(int j = 0; j < 30; j++)
            tn[i][j] = t0[i][j];
}

void calc()
{
    setmat0();
    setmatn();

    bool abb;
    do
    {
        double eps = 0.1;
        abb = true;
        for(int cnt1 = 1; cnt1 < iv-1; ++cnt1)
        {
            for(int cnt2 = 1; cnt2 < iv-1; ++cnt2)
            {
                t0[cnt1][cnt2] = (tn[cnt1+1][cnt2]+tn[cnt1-1][cnt2]+tn[cnt1][cnt2+1]+tn[cnt1][cnt2-1])/4;
                if(fabs(t0[cnt1][cnt2] - tn[cnt1][cnt2]) > eps) abb = false;
            }
        }
        setmatn();
    }
    while(!abb);
}

void output()
{
    cout << "\n";
    int cnt2 = iv;
    do
    {
        for(int cnt1 = 0; cnt1 < iv; ++cnt1)
        {
            cout << (int)(t0[cnt1][cnt2 - 1] + 0.5) << "\t";
        }
        cnt2 -= 1;
        cout << "\n\n";
    }
    while(cnt2 >= 1);
}

int main()
{
    input();
    calc();
    output();

    return 0;
}

Результат и там и там - одинаковый:

In how 5
temperature 1 side?4
temperature 2 side?7
temperature 3 side?8
temperature 4 side?2

5 8 8 8 8 8

2 5 6 7 7 7

2 4 5 6 6 7

2 4 5 5 6 7

2 3 4 5 5 7

3 4 4 4 4 6

 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 30.07.2025 22:34
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"