Показать полную графическую версию : Перевод процедуры с Pascal на C++
Snake750
30-03-2009, 17:03
Получается я могу использовать процедуру floor() в виде замены trunc() ????/
void w_p()
{int i,j,h,l,k;
long int c_max;
k=0;
for (i=1;i<=Na;i++)
{
h=i*3+4;
for (j=1;j<=Nb;j++)
{
l=j*(n1+1)+n2-5;
gotoxy(l,h);
cout<<setw(n1)<<" ";
if (p[i][j]>0)
{
k++;
Print(l-floor(log(p[i][j])/log(10))+5,h,p[i][j]);
}
else if (p[i][j]==0)
{
Print(l+n1-2,h,p[i][j]);
k++;
}}}
//while (a_b=true)
{k++;}
if (k>Na+Nb-1) PrintS(40,1,"k > n+m-1");
}
Ошибка на этот раз такая
Error 1 error C2668: 'log' : ambiguous call to overloaded function
Error 2 error C2668: 'log' : ambiguous call to overloaded function
Получается я могу использовать процедуру floor() в виде замены trunc() ????/ »
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
#include <iomanip.h>
using std::setprecision;
using std::setiosflags;
int _tmain(int argc, _TCHAR* argv[])
{
double num = 15.748;
cout<<setiosflags(ios::fixed)
<<setprecision(0);
system("cls");
cout<<floor(num);
getch();
return 0;
}
//---------------------------------------------------------
Ошибка на этот раз такая »Прилагайте код целиком, а не кусками.
По второму коду ничего не могу сказать, так как не пойму, что эта функция делает? Можно ли рядом с кодом писать краткое назначение функции и делать код читабельнее ставя отступы между блоками? Хотя бы вот так.
void w_p()
{
int i, j, h, l, k;
long int c_max;
k = 0;
for(i = 1; i <= Na; i++){
h = i * 3 + 4;
for(j = 1; j <= Nb; j++){
l = j * (n1 + 1) + n2 - 5;
gotoxy(l, h);
cout<<setw(n1)<<" ";
if(p[i][j] > 0){
k++;
Print(l - floor(log(p[i][j]) / log(10)) + 5, h, p[i][j]);
}
else if(p[i][j] == 0){
Print(l + n1 - 2, h, p[i][j]);
k++;
}
}
}
while (a_b=true){
k++;
}
if(k > Na + Nb - 1)
PrintS(40, 1, "k > n + m - 1");
}
//-----------------
Snake750
30-03-2009, 18:27
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.h>
#include <windows.h>
#include <math.h>
#include <iomanip>
using namespace std;
const
int N=6;
int n1=7;
int n2=7;
long int Sa=0;
long int Sb=0;
typedef long int predpr[N];
typedef long int rasp[N][N];
predpr A,B,alfa,betta,B_d,x;
rasp c,p;
int ik;
long int f,f0,x_min;
unsigned char Nt,x_p,r,r_min,ki,kj,Na,Nb,h,l,i,j;
char d;
unsigned char u[N*N];
void gotoxy(int x, int y)// Аналог функции gotoxy в Паскале
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void Nul(predpr a)
{unsigned char i;
{for (i=1;i<=N;i++)
a[i]=0;
}}
void PrintS(int x,int y, char s[30])
{gotoxy(x,y);
printf("%s",s);
}
void Print(int x,int y,int a )
{gotoxy(x,y);
printf("%d",a);
}
void Tabl()
{system("cls");
h=6+Na*3;
l=14+Nb*7;
gotoxy(1,3);
for (i=1;i<=Na+1;i++)
{gotoxy(1,i*3+2);
}
for (i=1;i<=Na;i++)
{gotoxy(5,i*3+3);
cout<<"A"<<i;
}
for (i=1;i<=Nb;i++)
{gotoxy(i*(n1+1)+n2-2,3);
cout<<"B"<<i;
}
l=Nb*(n1+1)+n2+3;
h=Na*3+6;
PrintS(4,3,"\\Bj");
PrintS(4,4,"Ai\\");
PrintS(l,4,"Ui");
PrintS(3,h," Vj");
}
long int FF()
{int i,j;
long int f;
f=0;
for (i=1;i<=Na;i++)
for (j=1;i<=Nb;j++)
if (p[i][j]>0)
f=f+c[i][j]*p[i][j];
i++;
j++;
gotoxy(65,Nt+2);
cout<<"F"<<Nt<<"="<<f;
return f;
}
int kkk(unsigned char ki,unsigned char kj)
{int i,j;
int k,k_min;
bool b;
b=1;
for (i=1;i<=Na;i++)
for (j=1;i<=Nb;j++)
if (p[i][j]==-1)
{k=(c[i][j]-alfa[i]-betta[j]);
if (b==true)
{b=false;
ki=i;
kj=j;
k_min=k;
} else if (k<k_min)
{k_min=k;
ki=k;
kj=j;
}}
return k_min;
}
void w_p()
{int i,j,h,l,k;
long int c_max;
k=0;
for (i=1;i<=Na;i++)
{
h=i*3+4;
for (j=1;j<=Nb;j++)
{
l=j*(n1+1)+n2-5;
gotoxy(l,h);
cout<<setw(n1)<<" ";
if (p[i][j]>0)
{
k++;
Print(l-floor(log(p[i][j])/log(10))+5,h,p[i][j]);
}
else if (p[i][j]==0)
{
Print(l+n1-2,h,p[i][j]);
k++;
}}}
//while (a_b=true)
{k++;}
if (k>Na+Nb-1) PrintS(40,1,"k > n+m-1");
}
int _tmain(int argc, _TCHAR* argv[])
{
system("cls");
getch();
return 0;
}
вот весь код
на счет функции w_p то она выводит план распределения транспортной задачи
Snake750
30-03-2009, 18:45
эту же функцию можно посмотреть в исходном коде на паскале который я выкладывал выше
вот весь код »Не знаю, не знаю, на этом этапе всё компилируется без ошибок. Возможно потому, что функции ни откуда не вызываются и не используются.
...
int _tmain(int argc, _TCHAR* argv[])
{
// Где-то здесь должны вызываться ваши функции
system("cls");
getch();
return 0;
}
..
floor(log(p[i][j]) / log(10))
замени на :
floor(log((double)p[i][j]) / log(10.0))
Snake750
30-03-2009, 20:50
// tzmp.cpp : Defines the entry point for the console application.
//
// transportnaya.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <stdlib.h>
//#include <dos.h>
#include <conio.h>
#include <windows.h>
#include <math.h>
#include <iomanip>
using namespace std;
const
int N=6;
int n1=7;
int n2=7;
long int Sa=0;
long int Sb=0;
typedef long int predpr[N];
typedef long int rasp[N][N];
predpr A,B,alfa,betta,B_d,x;
rasp c,p;
int ik;
long int f,f0,x_min,Sp;
unsigned char Nt,x_p,r,r_min,ki,kj,Na,Nb,h,l,i,j;
char d;
unsigned char u[N*N];
void gotoxy(int x, int y)// Аналог функции gotoxy в Паскале
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void Nul(predpr a)
{unsigned char i;
{for (i=1;i<=N;i++)
a[i]=0;
}}
void PrintS(int x,int y, char s[30])
{gotoxy(x,y);
printf("%s",s);
}
void Print(int x,int y,int a )
{gotoxy(x,y);
printf("%d",a);
}
void Tabl()
{system("cls");
h=6+Na*3;
l=14+Nb*7;
gotoxy(1,3);
for (i=1;i<=Na+1;i++)
{gotoxy(1,i*3+2);
}
for (i=1;i<=Na;i++)
{gotoxy(5,i*3+3);
cout<<"A"<<i;
}
for (i=1;i<=Nb;i++)
{gotoxy(i*(n1+1)+n2-2,3);
cout<<"B"<<i;
}
l=Nb*(n1+1)+n2+3;
h=Na*3+6;
PrintS(4,3,"\\Bj");
PrintS(4,4,"Ai\\");
PrintS(l,4,"Ui");
PrintS(3,h," Vj");
}
long int FF()
{int i,j;
long int f;
f=0;
for (i=1;i<=Na;i++)
for (j=1;i<=Nb;j++)
if (p[i][j]>0)
f=f+c[i][j]*p[i][j];
i++;
j++;
gotoxy(65,Nt+2);
cout<<"F"<<Nt<<"="<<f;
return f;
}
int kkk(unsigned char ki,unsigned char kj)
{int i,j;
int k,k_min;
bool b;
b=1;
for (i=1;i<=Na;i++)
for (j=1;i<=Nb;j++)
if (p[i][j]==-1)
{k=(c[i][j]-alfa[i]-betta[j]);
if (b==true)
{b=false;
ki=i;
kj=j;
k_min=k;
} else if (k<k_min)
{k_min=k;
ki=k;
kj=j;
}}
return k_min;
}
void w_p()
{int i,j,h,l,k;
long int c_max;
k=0;
for (i=1;i<=Na;i++)
{
h=i*3+4;
for (j=1;j<=Nb;j++)
{
l=j*(n1+1)+n2-5;
gotoxy(l,h);
cout<<setw(n1)<<" ";
if (p[i][j]>0)
{
k++;
Print(l-floor(log((double)p[i][j])/log(10.0))+5,h,p[i][j]);
}
else if (p[i][j]==0)
{
Print(l+n1-2,h,p[i][j]);
k++;
}}}
//while (a_b=true)
{k++;}
if (k>Na+Nb-1) PrintS(40,1,"k > n+m-1");
}
void W_W(predpr a,unsigned char b,char c)
{int i,l,m;
for (i=1;i<=b;i++)
{gotoxy(32,1);
system("cls");
cout<<c<<i<<'= ';
//Rid(a[i],n1);
switch (c)
{case 'A':{gotoxy(n2-floor(log((double)a[i])/log(10.0)),i*3+4);break;}
case 'B': {gotoxy(n2+i*(n1+1)-floor(log((double)a[i])/log(10.0)),4);break;}
}
cout<<a[i];
}}
/*void div_mod(unsigned char c,unsigned char a,b)
{
b=fmod(c,Nb);
a=div(c,Nb+1);
if (b==0)
{
b=Nb;
a--;
}}*/
void Rek(unsigned char Xi,unsigned char Yi,bool z, unsigned char c)
{
unsigned char i,j;
z=false;
switch (c)
{case 1:{for (i=1;i<=Na;i++) if (i!=Xi) if (p[i][Yi]>-1)
{u[(Xi-1)*Nb+Yi]=(ki-1)*Nb+kj;
z=!z;
exit;
}break;}
case 2:{ for (i=1;i<=Nb;i++) if (i!=Yi) if (p[Xi][i]>-1)
{if (u[(Xi-1)*Nb+i]==0)
{u[(Xi-1)*Nb+Yi]=(Xi-1)*Nb+i;
c=1;
//Rek(Xi,i,z,c);
if (z=true) exit;
}else if ((Xi==ki) && (i=kj))
{u[(Xi-1)*Nb+Yi]=(ki-1)*Nb+kj;
z=!z;
exit;
}}u[(Xi-1)*Nb+Yi]=0;
c=fmod(c,2)+1;}
break;}}
void kontur()
{unsigned char i,j,k,mi,mj,l;
bool z;
long int p_m;
for (i=1;i<=N*N) u[i]=0;
l=1;
//Rek(ki,kj,z,l);
i=ki; j=kj;
k=u[(i-1)*Nb+j];
//div_mod(k,i,j);
mi=i; mj=j; l=1;
while
{l++;
k=u[(i-1)*Nb+j];
//div_mod(k,i,j);
if (fmod(l,2)==1)
if (p[i][j]<p[mi][mj])
{
mi=i; mj=j;
}}
do ((i==ki) && (j==kj));
i=ki; j=kj; l=0;
p_m=p[mi][mj];
while
{
if (fmod(l,2)==0)
{
//inc(p[i,j],p_m);
} else
{
//dec(p[i,j],p_m);
}
if (l==0) p[i][j]++;
k=u[(i-1)*Nb+j];
//div_mod(k,i,j);
l++;}
do ((i==ki) && (j==kj));
p[mi][mj]=-1;
}
/*void Pauza()
{char d;
//d:=ReadKey;
gotoxy(40,1);
system("cls");
}*/
int _tmain(int argc, _TCHAR* argv[])
{Nul(alfa); Nul(betta);
Nt=1;
system("cls");
while
{ cout<<"Postavshiki:";
scanf("%c",&Na);
cout<<"Potrebiteli: ";
scanf("%c",&Nb);}
do ((Na>1) && (Na<=N-1) && (Nb>1) && (Nb<=N-1));
Tabl();
PrintS(1,1,"Kol-vo tovara:");
W_W(A,Na,'A');
W_W(B,Nb,'B');
gotoxy(1,1);
system("cls");
cout<<"Stoimost peremozki:";
for (i=1;i<=Na;i++)
for (j=1;j<=Nb;j++)
{
gotoxy(29,1);
system("cls");
cout<<"A"<<i<<" - B"<<j<," ";
//Rid(c[i][j],5);
Print((n1+1)*j+n2-4,i*3+3,c[i][j]);
}
gotoxy(1,1);
system("cls");
for (i=1;i<=Na;i++) Sa=Sa+A[i];
for (i=1;i<=Nb;i++) Sb=Sb+B[i];
if (Sa!=Sb){
//d:=ReadKey;
if (Sa>Sb)
{
Nb++;
B[Nb]=Sa-Sb;
for (i=1;i<=Na;i++) c[i][Nb]=0;
} else {
Na++;
A[Na]=Sb-Sa;
for (i=1;i<=Nb;i++) c[Na][i]=0;
}
Tabl;
for (i=1;i<=Na;i++)
for (j=1;j<=Nb;j++) Print((n1+1)*j+n2-4,i*3+3,c[i][j]);
for (i=1;i<=Na;i++)
Print(n2-floor(log((double)A[i])/log(10.0)),i*3+4,A[i]);
for (i=1;i<=Nb;i++)
Print(n2+i*(n1+1)-floor(log((double)B[i])/log(10.0)),4,B[i]);
}
for (i=1;i<=Nb;i++) B_d[i]=B[i];
for (i=1;i<=Na;i++)
{
for (j=1;j<=Nb;j++) x[j]=j;
for (j=1;j<=Nb-1;j++) {
x_min=c[i][x[j]];
r_min=j;
for (r=j+1;r<=Nb;r++)
if ((x_min>c[i][x[r]]) || ( (x_min=c[i][x[r]]) && (B[x[r]]>b[x[r_min]]) ))
}
x_min=c[i][x[r]];
r_min=r;
}
x_p=x[r_min];
x[r_min]=x[j];
x[j]=x_p;
}
Sp=0;
for (j=1;j<=Nb;j++)
p[i][x[j]]=B_d[x[j]];
if p[i][x[j]]>A[i]-Sp p[i][x[j]]=A[i]-Sp;
//inc(Sp,p[i,x[j]]);
//dec(B_d[x[j]],p[i,x[j]]);
}
for (i=1;i<=Na;i++)
for (j=1;j<=Nb;j++) if (p[i][j]==0) p[i][j]=-1;
W_p;
f=FF; f0=F;
while (a_b==true)
for (i=1;i<=Na;i++) Print(l+1,i*3+3,alfa[i]);
for (i=1;i<=Nb;i++) Print(i*(n1+1)+n2-4,h,betta[i]);
Pauza;
while kkk(ki,kj)<0
{
kontur;
pauza;
for (i:=1;i<=Na;i++)
for (j:=1;j<=Nb;j++) PrintS((n1+1)*j+n2-1,i*3+3,' ');
Nt++;
gotoxy(1,1);
//Write('??????? N',Nt);
W_p;
f0=f; f=FF;
if (a_b==true) goto l1;
for (i:=1;i<=Na;i++) db Print(l+1,i*3+3,alfa[i]);
for (i:=1;i<=Nb;i++) Print(i*(n1+1)+n2-4,h,betta[i]);
Pauza;
}
for (i:=1;i<=Na;i++)
for (j:=1;j<=Nb;j++) if (p[i][j]==-1)
{
h=i*3+4;
l=j*(n1+1)+n2-5;
gotoxy(l,h);
cout<<setw(n1)<<' ';
gotoxy(40,1);
//l1:d:=ReadKey;
}
getch();
return 0;
}
посмотрите код.у меня выдает ошибку на каждую скобочку.может у меня что со средой не так
А можно вывод ошибки, где что... И какая среда разработки?
Snake750
30-03-2009, 21:02
microsoft visual studio 2008
может у меня что со средой не так »Всё нормально со средой, у меня не меньше ошибок. "Причешите код", разделите функции комментариями:
// Функция делает то-то и то-то., расставьте отступы.
Значит, красным я исправил на готовый вариант, зелёным непонятные моменты. В общем ошибок много, я не все исправил.
..
long int p_m;
for (i = 1; i<= N*N; i++) u[i]=0;
l=1;
...
...
while // Нет условия в цикле
{l++;
...
...
pauza;
for (i:=1;i<=Na;i++) // неправильное объявление в С++. 'i = 1'
for (j:=1;j<=Nb;j++) // неправильное объявление в С++. 'j = 1'
// последующие объявления с такой же ошибкой, заменить на 'i = 1' и 'j = 1'
...
...
if ((x_min>c[i][x[r]]) || ( (x_min=c[i][x[r]]) && (B[x[r]]>b[x[r_min]]) ))
} // Почему закрыта скобка, когда есть 'if'
...
Alan85, Там не от среды, там просто ошибки синтаксиса. Сишный вперемешку с Паскалем.
Эх какое знакомое чувство дискомфорта и автоматом набирающий i:= вместо i= , if (i=5) вместо if (i==5) и так далее. Конфортнее в делфях все же так и осталось
Snake750
30-03-2009, 22:40
Procedure div_mod(c:byte; var a,b:byte);
Begin
b:=c mod Nb; a:=c div Nb +1;
if b=0 then begin
b:=Nb; dec(a);
end;
End;
Переведите плз на с++.у меня че то не получаеться
Пишу в слепую без компилятора если что поправте:
void div_mod(char c, char& a, char& b);
{
b=c % Nb;
a=c / Nb +1;
if (!b) { b=Nb; a--; }
}
if b=0 then begin »
if (!b) { b=Nb; a--; } »Оператор '!' - вроде бы оператор отрицания. А нужно оператор сравнения. Мне кажется, что должно быть так:
...
if(b == 0)
...
P.S. На истине не настаиваю, так как Pascal не владею.
if (!b) ... \\если b>0 то даст отрицание "истины" - то есть "лож", а если b=0 то даст отрицание "лжи" - истину. значит это \\эквивалентно
if (b==0) \\ так как 0 есть лож в c и с++
Snake750
31-03-2009, 17:43
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <math.h>
#include <iomanip>
//using namespace std;
unsigned char Nt,x_p,r,r_min,ki,kj,Na,Nb,h,l,i,j;
......
int _tmain(int argc, _TCHAR* argv[])
{Nul(alfa);
Nul(betta);
Nt=1;
system("cls");
do
std::cout << "Postavshiki:";
std::cin >> Na;
std::cout << "Potrebiteli:";
std::cin >> Nb;
while ((Na>1) && (Na<=N-1) && (Nb>1) && (Nb<=N-1));
Tabl;
getch();
return 0;
}
Error 13 error C2061: syntax error : identifier 'cin'
что это за ошибка.библиотеки вроде все подключены.ошибка вылазит только в цикле??
Error 13 error C2061: syntax error : identifier 'cin' »
убери // в строчке:
//using namespace std;
Snake750
31-03-2009, 19:09
пробовал,не катит.а если убрать цикл то все работает
а ну тогда убери std:: , если не поможет то убери std:: и #include <iostream> замени на #include <iostream.h>
Snake750
31-03-2009, 21:32
Вы меня не так поняли.библиотеки <iostream.h> у меня вообще нет.а сами процедуры ввода(cin>> и scanf) у меня работают=> библиотеки впорядке.компилятор выдает ошибку только при попытке использовать данные операторы в цикле do..while
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.