PDA

View Full Version : معادل های gotoxy و clrscr و.... در ++Visual C



ICEMAN
پنج شنبه 04 بهمن 1386, 12:10 عصر
توابعی که توی TC هست و رو چطور میشه توی VS استفاده کرد .
یا معادلشون یکی از دوستان هم در مورد کاراکتر های رنگی پرسیده بود که اونم توی VS اجرا نشد

ممنون

Nima_NF
پنج شنبه 04 بهمن 1386, 12:43 عصر
ماهیت کنسول تحت ویندوز با برنامه های تحت Dos بسیار متفاوت است (جدا شدن گرافیک به شکل سابق از آن) و انتظار نباید داشته باشید که همه آن امکانات قدیمی (و در حال حاضر کم کاربرد و شاید هم بی کاربرد ) فراهم باشد ، در هر حال امکاناتی که ویندوز در اختیار شما قرار می دهد در فایل Wincon.h :
لیست توابع کنسولی مایکروسافت (http://msdn2.microsoft.com/en-us/library/ms682073%28VS.85%29.aspx)

ضمنا کتابخانه هایی هم (غیر استاندارد) نوشته شده اند که این کار ها را برای کنسول ویندوز انجام می دهند ، مانند کتابخانه ConLib جستجو کنید ، پیدا خواهید کرد.

emad_67
پنج شنبه 04 بهمن 1386, 17:08 عصر
برای gotoxy این تابع رو به برنامه اضافه کن:


#include <windows.h>
void gotoxy(int x,int y)
{
HANDLE hConsole = GetStdHandle ( STD_OUTPUT_HANDLE );
if (INVALID_HANDLE_VALUE != hConsole)
{
COORD pos = {x, y};
SetConsoleCursorPosition( hConsole, pos );
}
}
بعد هم مختصات رو بهش بده.
برای clrscr هم هدر فایل stdlib.h رو در برنامه اضافه کن و جایی که میخوای صفحه پاک بشه این دستورو بنویس:


system("cls");
البته ممکنه توی لینکی که آقا نیما هم دادن موجود باشه ولی چک نکردم.

radium
دوشنبه 05 فروردین 1387, 10:59 صبح
سلام من از تابع gotoxy که گذاشتید استفاده کردم ولی هر بار با اینکه مقدار ورودی هاشو تغییر میدم ولی مکان نما به همون مکان اولش بر میگرده. لطفا راهنمایی کنید.




#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <windows.h>
using std::cout;
using std::cin;
void gotoxy(int x,int y)
{
HANDLE hConsole = GetStdHandle ( STD_OUTPUT_HANDLE );
if (INVALID_HANDLE_VALUE != hConsole)
{
COORD pos = {10, 10};
SetConsoleCursorPosition( hConsole, pos );
}
}
void main()
{
int i=0,j=0;
while(getch()!='0')
{
gotoxy(i,j);
cout<<"#";
i++;
j++;
}
}

Nima_NF
دوشنبه 05 فروردین 1387, 14:09 عصر
سلام من از تابع gotoxy که گذاشتید استفاده کردم ولی هر بار با اینکه مقدار ورودی هاشو تغییر میدم ولی مکان نما به همون مکان اولش بر میگرده. لطفا راهنمایی کنید.


تابع gotoxy ذکر شده در فوق اشتباه کوچکی دارد و مقادیر x و y جایگزین نشده اند ، به این شکل استفاده کنید:



void gotoxy(int x,int y)
{
COORD pos;
HANDLE hConsole = GetStdHandle ( STD_OUTPUT_HANDLE );

if (INVALID_HANDLE_VALUE != hConsole)
{
pos.X = x;
pos.Y = y;

SetConsoleCursorPosition( hConsole, pos );
}
}

ضمنا تابع main خود را به این شکل بنویسید ، زیرا getch به صورت قبل کارکتر وارد شده را از بین می برد:



void main()
{
int i=0,j=0;
char ch;

do
{
ch = getch();
gotoxy(i,j);
cout<<'#';
i++;
j++;

} while( ch!='0' );
}

ضمنا دوستانی هم که علاقه مند به یادگیری API های ویندوز برای برنامه های کنسول هستند به صفحه زیر مراجعه کنند (بخش دوم) که دارای آموزش های بسیار خوبی برای پیاده سازی تمامی موارد مشابه کنسول می باشد:
http://www.adrianxw.dk/SoftwareSite/index.html

radium
سه شنبه 06 فروردین 1387, 13:19 عصر
مرسی نیمای عزیز. من توی برنامم مجبور بودم مکان نما رو به جاهای مختلفی ببرم. شما کمک بزرگی به من کردید. از راهنماییتونم ممنونم.

radium
دوشنبه 12 فروردین 1387, 23:56 عصر
برای clrscr هم هدر فایل stdlib.h رو در برنامه اضافه کن و جایی که میخوای صفحه پاک بشه این دستورو بنویس:
[code]
system("cls");


من از دستور بالا برای پاک کردن صفحه استفاده کردم ولی صفحه رو پاک نمیکنه.
لطفا راهنمایی کنید. هر چی گشتم مطلبی پیدا نکردم.
یه سوال دیگه هم دارم سورس برنامه هایی که توی محیط توربو سی نوشتم رو وقتی توی ویژوال سی پلاس پلاس کپی میکنم. این پیام خطا رو میده.
fatal error C1010: unexpected end of file while looking for precompiled header directive
در ضمن دستورایی مثل clrscr و غیره رو پاک کردم و مربوط به این دستورا نیست.
دوستان لطفا راهنمایی کنید.

emad_67
سه شنبه 13 فروردین 1387, 15:12 عصر
من از دستور بالا برای پاک کردن صفحه استفاده کردم ولی صفحه رو پاک نمیکنه.
در صورتی که مثلا با cout یه رشته ای رو چاپ میکنی و بعد میخوای صفحه رو پاک کنی به این شکل بنویس:


void main()
{
cout<<"c++"<<flush;
system("cls");

}

یعنی بعد cout دستور flush رو بزار تا بافر خروجی خالی بشه در غیر این صورت صفحه پاک نمیشه. به جای flush میتونی از endl هم استفاده کنی فقط فرقش اینه کهendl هم بافر رو خالی میکنه و هم کرسر رو می بره خط بعد ولی در flush فقط بافر خالی میشه.

ICEMAN
سه شنبه 13 فروردین 1387, 18:20 عصر
با دستور سsystem() وقتی کار میکنی اگه Firewall مثلا ZoneAlarm روی سیستمش نصب باشه
پیام میده و ...
با توابع کنسولی Microsoft نمیشه کاری کرد

hoax3r
سه شنبه 13 فروردین 1387, 19:02 عصر
اگه با کامپایلر Pelles C کار کرده باشین تابعی مشابه clrscr با همین نام داره که با API‌ها درست شده
API‌ هایی که توش استفاده شده اینا هستن:



CreateFile
GetConsoleScreenBufferInfo
FillConsoleOutputCharacter
FillConsoleOutputAttribute
SetConsoleCursorPosition


برای اطلاعات بیشتر هم بهتره به سایت ماکروسافت مراجعه کنید

شاد باشید

radium
پنج شنبه 15 فروردین 1387, 19:02 عصر
void clrscr()
{
HANDLE hndl = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hndl, &csbi);
DWORD written;
DWORD N = csbi.dwSize.X * csbi.dwCursorPosition.Y +
csbi.dwCursorPosition.X + 1;
COORD curhome = {0,0};
FillConsoleOutputCharacter(hndl, ' ', N, curhome, &written);
csbi.srWindow.Bottom -= csbi.srWindow.Top;
csbi.srWindow.Top = 0;
SetConsoleWindowInfo(hndl, TRUE, &csbi.srWindow);
SetConsoleCursorPosition(hndl, curhome);
}

برای اینکه صفحه رو پاک کنم مجبور شدم از این تابع استفاده کنم.
هیچ فایر والی هم روی سیستمم نصب نیست. ولی اون روشا که دوستان نوشتن جواب نداد.

Nima_NF
سه شنبه 04 فروردین 1388, 00:30 صبح
دوستی درخواست کردند معادل دستور wherey و wherex برای دریافت موقعیت کنونی کرسر را نیز قرار دهم:




#include <iostream>
#include <windows.h>


short Wherex()
{
HANDLE hStd;
CONSOLE_SCREEN_BUFFER_INFO screenBufferInfo;

hStd = GetStdHandle(STD_OUTPUT_HANDLE);

if (! GetConsoleScreenBufferInfo(hStd, &screenBufferInfo))
printf("GetConsoleScreenBufferInfo (%d)\n", GetLastError());

return (short)screenBufferInfo.dwCursorPosition.X;
}

short Wherey()
{
HANDLE hStd;
CONSOLE_SCREEN_BUFFER_INFO screenBufferInfo;

hStd = GetStdHandle(STD_OUTPUT_HANDLE);

if (! GetConsoleScreenBufferInfo(hStd, &screenBufferInfo))
printf("GetConsoleScreenBufferInfo (%d)\n", GetLastError());

return (short)screenBufferInfo.dwCursorPosition.Y;
}

البته پیشنهاد می شود به جای این کار یک تابع نوشته شود و دو متغیر x و y به صورت ارجاع به تابع داده شود:



void Wherexy(short* x, short* y)
{
HANDLE hStd;
CONSOLE_SCREEN_BUFFER_INFO screenBufferInfo;

hStd = GetStdHandle(STD_OUTPUT_HANDLE);

if (! GetConsoleScreenBufferInfo(hStd, &screenBufferInfo))
printf("GetConsoleScreenBufferInfo (%d)\n", GetLastError());

*x = screenBufferInfo.dwCursorPosition.X;
*y = screenBufferInfo.dwCursorPosition.Y;
}

و سپس به این شکل بخوانید:



short x1;
short y1;

Wherexy(&x1, &y1);

javadyousefi
چهارشنبه 05 فروردین 1388, 16:51 عصر
gotoxy



void gotoxy(int x,int y)
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_H ANDLE),coord);
}


clrscr



void clrscr()
{
COORD coordScreen={0,0};
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi;
DWORD dwConSize;
HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleScreenBufferInfo(hConsole,&csbi);
dwConSize=csbi.dwSize.X * csbi.dwSize.Y;
FillConsoleOutputCharacter(hConsole,TEXT(''),dwCon Size,coordScreen,&cCharsWritten);
SetConsoleCursorPosition(hConsole,coordScreen);
}

leopard
پنج شنبه 24 اردیبهشت 1388, 21:21 عصر
میخواستم ببینم این COORD و HANDLE چی هستند ...
بعد کار این تابع چیه و چطوری تو این تابع استفاده میشن؟؟ SetConsoleCursorPosition

Keyhan Clever
پنج شنبه 24 اردیبهشت 1388, 21:31 عصر
دستتون درد نکنه خیلی بدرد بخوره
میشه یکم تغییر جزیی بهش بدی و متناسب با برنامه بهترش کنی
واقعا ممنون

hitman2004
جمعه 03 اردیبهشت 1389, 14:22 عصر
سلام
من برنامه زير رو در محيط visual C++‎‎ براي الگوريتم dijkstra (مسير يابي) نوشتم. اما از دستور clrsrc ايراد ميگيره و پيغام ميده : error C2065: 'clrscr' : undeclared identifier
دستور cout<<"C++‎‎?"<<flush رو جيگزين clrcrs كردم و ديگه اشكال نگرفت اما برنامه درست كار نكرد.
بار اول مسير رو درست حساب مي كنه اما دفعه هاي بعد يا جواب غلط ميشه يا اجرا نميشه!
ممنون ميشم اگه اين برنامه رو امتحان كنيد و مشكلش رو بگيد.
يه مثال كوچيك: تعداد نقاط 4
تعداد يال (edge) ها 4
بعد وارد كنيد

1 2 10 2 4 10 1 3 10 3 4 9
و بعد مسير مورد نظر رو بزنيد مثلا 4 1
بعد مسير رو نشون ميده و اگر yes بزنيد و يه مسير ديگه مثل 3 1 رو بزنيد برنامه جواب نمي ده!

hitman2004
جمعه 03 اردیبهشت 1389, 14:36 عصر
كدهاي برنامه :


#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include <conio.h>
int g[1000][1000],visit[1000],d[1000],p[1000];
int v,e;
int min=100000;

void creategraph()
{
int a,b,i,j,w;
printf("Enter the number of vertices : ");
scanf("%d",&v);
printf("\nEnter number of edges : ");
scanf("%d",&e);
for(i=1;i<=v;i++)
for(j=1;j<=v;j++)
g[i][j]=0;
for(i=1;i<=v;i++)
{
visit[i]=0;
d[i]=min;
}
for(i=1;i<=e;i++)
{
printf("\nEnter edges and weight : ");
scanf("%d %d %d",&a,&b,&w);
g[a][b]=g[b][a]=w;
}
}

void dijkstra()
{
int src,des,c,i,dc,l,x;
printf("\nEnter source and destination : ");
scanf("%d %d",&src,&des);
c=src;
d[src]=0;
visit[src]=1;
dc=d[c];

while(visit[des]!=1)
{
for(i=1;i<=v;i++)
{
if(g[c][i]!=0)
if(visit[i]==0)
if(d[i]>g[c][i]+dc)
{
d[i]=g[c][i]+dc;
p[i]=c;
}
}
min=10000;
for(i=1;i<=v;i++)
{
if(visit[i]==0)
if(d[i]<min)
{
min=d[i];
c=i;
}
}
dc=d[c];
visit[c]=1;
}
printf("\nShortest distance from %d to %d ",src, des);
printf("%d",d[des]);
printf("\nPath=\n");
l=des;
do
{
x=p[l];
printf("\nVertex %d is connected to %d\n ",l,x);
l=x;

}while(l!=src);

}

void main()
{
char ch,ci;
clrscr();// bejaie dastoore clrscr in dastoor ro jaigozin kardam : cout<<"C++‎?"<<flush;


do
{ creategraph();

do{
dijkstra();
printf("IF WANT TO CONTINUE WITH SAME DATA PRESS Y : ");
fflush(stdin);
scanf("%c",&ci);
}while(ci=='y');
printf("\nDo u wish to continue : ");
fflush(stdin);
scanf("%c",&ch);
} while(ch!='n');
}

sajjadrad
دوشنبه 13 اردیبهشت 1389, 23:51 عصر
برای clrscr میتونید از تابع زیر استفاده کنید:


void clrscr()
{
system("cls");
}

unknown.unforgiven
چهارشنبه 23 تیر 1389, 12:48 عصر
سلام
من برنامه زير رو در محيط visual C++‎‎‎‎ براي الگوريتم dijkstra (مسير يابي) نوشتم. اما از دستور clrsrc ايراد ميگيره و پيغام ميده : error C2065: 'clrscr' : undeclared identifier
دستور cout<<"C++‎‎‎‎?"<<flush رو جيگزين clrcrs كردم و ديگه اشكال نگرفت اما برنامه درست كار نكرد.
بار اول مسير رو درست حساب مي كنه اما دفعه هاي بعد يا جواب غلط ميشه يا اجرا نميشه!
ممنون ميشم اگه اين برنامه رو امتحان كنيد و مشكلش رو بگيد.
يه مثال كوچيك: تعداد نقاط 4
تعداد يال (edge) ها 4
بعد وارد كنيد

1 2 10 2 4 10 1 3 10 3 4 9
و بعد مسير مورد نظر رو بزنيد مثلا 4 1
بعد مسير رو نشون ميده و اگر yes بزنيد و يه مسير ديگه مثل 3 1 رو بزنيد برنامه جواب نمي ده!

خب لابد تابع clrscr رو اول برنامه تعریف نکردی، اگه تعریفش بکنی مشکلت حل میشه. برنامه ای که نوشتی نفهمیدم میخواد چی کار بکنه؟:متفکر: اگه توضیح بیشتری بدی شاید بتونم کمکت کنم

agshed
شنبه 25 آذر 1391, 17:03 عصر
سلام من با microsoft visual studio کار می کنم چطور می شه توی این این برنامه کار گرافیکی کرد .

msh1992
پنج شنبه 09 خرداد 1392, 12:22 عصر
سلام کسی میدونه معادل graphics.h در ++visual c چیه؟

behnam.shami
پنج شنبه 04 دی 1393, 21:23 عصر
:تشویق:خدا خاندانت رو رحمت بکنه:بوس:
هی میگم چرا این برنامه کامپایل نمیشه:گریه:
دهنم سرویس شده بود

ODEAX.CPP
سه شنبه 15 مرداد 1398, 05:32 صبح
[QUOTE=ICEMAN;455294]توابعی که توی TC هست و رو چطور میشه توی VS استفاده کرد .
یا معادلشون یکی از دوستان هم در مورد کاراکتر های رنگی پرسیده بود که اونم توی VS اجرا نشد

تا جایی که من میدونم راهای زیادی هست یکیش اینه
برای gotoxy
printf("\x1b[5;20H");
که 5 میبره خط پنج و 20 هم x هست
برای تغییر رنگ هم بجای 5 شماره رنگو بنویسید مثلا فک کنم 32 زرده بجای h هم m بنویسید اگه خواستید پس زمینه هم داشته باشید بجای 20 چهل استفاده کنید که مشکیه