# Native Code > برنامه نویسی با C > برنامه نویسی با زبان C و ++C >  معادل های gotoxy و clrscr و.... در ++Visual C

## ICEMAN

توابعی که توی TC هست و رو چطور میشه توی VS استفاده کرد .
یا معادلشون یکی از دوستان هم در مورد کاراکتر های رنگی پرسیده بود که اونم توی VS اجرا نشد 

ممنون

----------


## Nima_NF

ماهیت کنسول تحت ویندوز با برنامه های تحت Dos بسیار متفاوت است (جدا شدن گرافیک به شکل سابق از آن) و انتظار نباید داشته باشید که همه آن امکانات قدیمی (و در حال حاضر کم کاربرد و شاید هم بی کاربرد ) فراهم باشد ، در هر حال امکاناتی که ویندوز در اختیار شما قرار می دهد در فایل Wincon.h :
لیست توابع کنسولی مایکروسافت

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

----------


## emad_67

برای 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

سلام من از تابع 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

> سلام من از تابع 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

مرسی نیمای عزیز. من توی برنامم مجبور بودم مکان نما رو به جاهای مختلفی ببرم. شما کمک بزرگی به من کردید. از راهنماییتونم ممنونم.

----------


## radium

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


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

----------


## emad_67

> من از دستور بالا برای پاک کردن صفحه استفاده کردم  ولی صفحه رو پاک نمیکنه.


در صورتی که مثلا با cout یه رشته ای رو چاپ میکنی و بعد میخوای صفحه رو پاک کنی به این شکل بنویس:

void main()
{
    cout<<"C++‎"<<flush;
    system("cls");
    
}

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

----------


## ICEMAN

با دستور سsystem() وقتی کار میکنی اگه Firewall مثلا ZoneAlarm روی سیستمش نصب باشه
پیام میده و ...
با توابع *کنسولی Microsoft* نمیشه کاری کرد

----------


## hoax3r

اگه با کامپایلر Pelles C کار کرده باشین تابعی مشابه clrscr با همین نام داره که با API‌ها درست شده
API‌ هایی که توش استفاده شده اینا هستن:


CreateFile
GetConsoleScreenBufferInfo
FillConsoleOutputCharacter
FillConsoleOutputAttribute
SetConsoleCursorPosition


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

شاد باشید

----------


## radium

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

دوستی درخواست کردند معادل دستور 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

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

میخواستم ببینم این COORD و HANDLE چی هستند ...
بعد کار این تابع چیه  و  چطوری تو این تابع استفاده میشن؟؟ SetConsoleCursorPosition

----------


## Keyhan Clever

دستتون درد نکنه خیلی بدرد بخوره
میشه یکم تغییر جزیی بهش بدی و متناسب با برنامه بهترش کنی
واقعا ممنون

----------


## hitman2004

سلام
من برنامه زير رو در محيط 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

كدهاي برنامه :

	#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

برای clrscr میتونید از تابع زیر استفاده کنید:

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

----------


## unknown.unforgiven

> سلام
> من برنامه زير رو در محيط 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

سلام من با microsoft visual studio کار می کنم چطور می شه توی این این برنامه کار گرافیکی کرد .

----------


## msh1992

سلام کسی میدونه معادل graphics.h در ++visual c چیه؟

----------


## behnam.shami

:تشویق: خدا خاندانت رو رحمت بکنه :بوس: 
هی میگم چرا این برنامه کامپایل نمیشه :گریه: 
دهنم سرویس شده بود

----------


## ODEAX.CPP

[QUOTE=ICEMAN;455294]توابعی که توی TC هست و رو چطور میشه توی VS استفاده کرد .
یا معادلشون یکی از دوستان هم در مورد کاراکتر های رنگی پرسیده بود که اونم توی VS اجرا نشد 

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

----------

