توابعی که توی TC هست و رو چطور میشه توی VS استفاده کرد .
یا معادلشون یکی از دوستان هم در مورد کاراکتر های رنگی پرسیده بود که اونم توی VS اجرا نشد
ممنون
توابعی که توی TC هست و رو چطور میشه توی VS استفاده کرد .
یا معادلشون یکی از دوستان هم در مورد کاراکتر های رنگی پرسیده بود که اونم توی VS اجرا نشد
ممنون
ماهیت کنسول تحت ویندوز با برنامه های تحت Dos بسیار متفاوت است (جدا شدن گرافیک به شکل سابق از آن) و انتظار نباید داشته باشید که همه آن امکانات قدیمی (و در حال حاضر کم کاربرد و شاید هم بی کاربرد ) فراهم باشد ، در هر حال امکاناتی که ویندوز در اختیار شما قرار می دهد در فایل Wincon.h :
لیست توابع کنسولی مایکروسافت
ضمنا کتابخانه هایی هم (غیر استاندارد) نوشته شده اند که این کار ها را برای کنسول ویندوز انجام می دهند ، مانند کتابخانه ConLib جستجو کنید ، پیدا خواهید کرد.
برای 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");
آخرین ویرایش به وسیله emad_67 : یک شنبه 08 اردیبهشت 1387 در 11:05 صبح دلیل: اشتباه در کد
سلام من از تابع 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:01 عصر
تابع 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
مرسی نیمای عزیز. من توی برنامم مجبور بودم مکان نما رو به جاهای مختلفی ببرم. شما کمک بزرگی به من کردید. از راهنماییتونم ممنونم.
برای clrscr هم هدر فایل stdlib.h رو در برنامه اضافه کن و جایی که میخوای صفحه پاک بشه این دستورو بنویس:
[code]
system("cls");
من از دستور بالا برای پاک کردن صفحه استفاده کردم ولی صفحه رو پاک نمیکنه.
لطفا راهنمایی کنید. هر چی گشتم مطلبی پیدا نکردم.
یه سوال دیگه هم دارم سورس برنامه هایی که توی محیط توربو سی نوشتم رو وقتی توی ویژوال سی پلاس پلاس کپی میکنم. این پیام خطا رو میده.
fatal error C1010: unexpected end of file while looking for precompiled header directive
در ضمن دستورایی مثل clrscr و غیره رو پاک کردم و مربوط به این دستورا نیست.
دوستان لطفا راهنمایی کنید.
در صورتی که مثلا با cout یه رشته ای رو چاپ میکنی و بعد میخوای صفحه رو پاک کنی به این شکل بنویس:من از دستور بالا برای پاک کردن صفحه استفاده کردم ولی صفحه رو پاک نمیکنه.
void main()
{
cout<<"C++"<<flush;
system("cls");
}
یعنی بعد cout دستور flush رو بزار تا بافر خروجی خالی بشه در غیر این صورت صفحه پاک نمیشه. به جای flush میتونی از endl هم استفاده کنی فقط فرقش اینه کهendl هم بافر رو خالی میکنه و هم کرسر رو می بره خط بعد ولی در flush فقط بافر خالی میشه.
با دستور سsystem() وقتی کار میکنی اگه Firewall مثلا ZoneAlarm روی سیستمش نصب باشه
پیام میده و ...
با توابع کنسولی Microsoft نمیشه کاری کرد
اگه با کامپایلر Pelles C کار کرده باشین تابعی مشابه clrscr با همین نام داره که با APIها درست شده
API هایی که توش استفاده شده اینا هستن:
CreateFile
GetConsoleScreenBufferInfo
FillConsoleOutputCharacter
FillConsoleOutputAttribute
SetConsoleCursorPosition
برای اطلاعات بیشتر هم بهتره به سایت ماکروسافت مراجعه کنید
شاد باشید
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 : جمعه 16 فروردین 1387 در 00:05 صبح دلیل: لطفا کدها را داخل تگ کد قرار دهید
دوستی درخواست کردند معادل دستور 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);
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);
}
میخواستم ببینم این COORD و HANDLE چی هستند ...
بعد کار این تابع چیه و چطوری تو این تابع استفاده میشن؟؟ SetConsoleCursorPosition
دستتون درد نکنه خیلی بدرد بخوره
میشه یکم تغییر جزیی بهش بدی و متناسب با برنامه بهترش کنی
واقعا ممنون
سلام
من برنامه زير رو در محيط 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:33 عصر
كدهاي برنامه :
#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');
}
برای clrscr میتونید از تابع زیر استفاده کنید:
void clrscr()
{
system("cls");
}
سلام من با microsoft visual studio کار می کنم چطور می شه توی این این برنامه کار گرافیکی کرد .
سلام کسی میدونه معادل graphics.h در ++visual c چیه؟
خدا خاندانت رو رحمت بکنه
هی میگم چرا این برنامه کامپایل نمیشه
دهنم سرویس شده بود
[QUOTE=ICEMAN;455294]توابعی که توی TC هست و رو چطور میشه توی VS استفاده کرد .
یا معادلشون یکی از دوستان هم در مورد کاراکتر های رنگی پرسیده بود که اونم توی VS اجرا نشد
تا جایی که من میدونم راهای زیادی هست یکیش اینه
برای gotoxy
printf("\x1b[5;20H");
که 5 میبره خط پنج و 20 هم x هست
برای تغییر رنگ هم بجای 5 شماره رنگو بنویسید مثلا فک کنم 32 زرده بجای h هم m بنویسید اگه خواستید پس زمینه هم داشته باشید بجای 20 چهل استفاده کنید که مشکیه