PDA

View Full Version : سوال: تغییر جهت خروجی



Kamiarn
پنج شنبه 27 فروردین 1388, 00:27 صبح
سلام، سوال من اینه

ما الان یه تقویم داریم که با CPP نوشته شده و خروجی اون به اینصورته


S Y D S C P J
1 2 3 4 5 6

و الی آخر

حالا میخوایم خروجی این تقویم رو برعکس کنیم. یعنی راست به چپ، چون این تقویم قراره سالهای شمسی رو نمایش بده.

به این صورت


J P C S D Y S
6 5 4 3 2 1


راه حل شما چیه؟
(اینجا خروجی دوم درست نمایش داده نمیشه، یکم روز شنبه هست اولی از سمت راست)

Kamiarn
جمعه 28 فروردین 1388, 19:04 عصر
کدی که من نوشتم اینه


#include "iostream.h"
#include "conio.h"
int main()
{
int n,k,g,f,l;

cout << "Enter first day of year: "; //وارد کردن روز اول سال
cin >> n;
cout << "Enter year number : "; //وارد کردن شماره سال
cin >> g;
cout << endl;

if (g%33==1 || g%33==5 || g%33==9 || g%33==13 || g%33==17 || g%33==22 || g%33==26 || g%33==30) //محاسبه سال کبیسه
cout << "Year is Kabiseh" << endl << endl;
else
cout << "Year is not Kabiseh" << endl << endl;

for (int j=1;j<=12;j++) //حلقه چاپ 12 ماه
{
if (j>=1 && j<=6)
k=31;
else if (j>=6 && j<=11)
k=30;
else if (g%33==1 || g%33==5 || g%33==9 || g%33==13 || g%33==17 || g%33==22 || g%33==26 || g%33==30)
k=30;
else
k=29;

cout << "Sh Ye Do Se Ch Pa Jo\n"; //چاپ 7 روز هفته

for (int i=1;i<=n-1;i++) //حلقه چاپ فضاهای خالی
cout << " " << " " << " ";

for (int i=1;i<=k-1;i++) //حلقه چاپ روزها
{
cout.width(2);
cout << i << " ";
n++;

if (n==8)
{
n=1;
cout << endl;
}
}
cout << endl << endl;
}
getch();
}

Kamiarn
یک شنبه 30 فروردین 1388, 11:41 صبح
:متفکر: آیا کسی نیست که پاسخ این سوال را بداند؟

Nima_NF
یک شنبه 30 فروردین 1388, 13:59 عصر
برای این کار از gotoxy استفاده کنید(در++ turboC یا معادل آن در کامپایلرهای جدید)، در فروم جستجو کنید مثال های زیادی هست.

Kamiarn
یک شنبه 30 فروردین 1388, 22:28 عصر
من که متوجه نشدم، در مورد این دستور فقط مثالهای تغییر مکان نشانگر رو تونستم پیدا کنم که به کار من نمیاد.
از Code Blocks استفاده میکنم و کامپایلر GCC

Nima_NF
دوشنبه 31 فروردین 1388, 01:27 صبح
شما می خواهید به جای اینکه از سمت راست به چپ کارکتر ها را چاپ کنید از خانه مثلا 6 به سمت چپ رسم کنید؟ یعنی برعکس چیزی که می خواهید چاپ کنید...

اگر منظورتان همین هست، یک راه این است که از معادل تابع gotoxy استفاده کنید، و در هر مرحله از حلقه for ، از مکان انتهایی X در همان خط حرف را بنویسید.

برنامه شما به شکل زیر باید تغییر کند تا همه چیز بر عکس رسم شود (تغییرات با Add this مشخص شده اند ):



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


using namespace std;

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 );
}
}


int main( )
{


int i,j; // Add this
int n,k,g,f,l;

int lines = 5; // Add this

cout << "Enter first day of year: "; //وارد کردن روز اول سال
cin >> n;
cout << "Enter year number : "; //وارد کردن شماره سال
cin >> g;
cout << endl;

if (g%33==1 || g%33==5 || g%33==9 || g%33==13 || g%33==17 || g%33==22 || g%33==26 || g%33==30) //محاسبه سال کبیسه
cout << "Year is Kabiseh" << endl << endl;
else
cout << "Year is not Kabiseh" << endl << endl;

for ( j=1;j<=12;j++) //حلقه چاپ 12 ماه

{
if (j>=1 && j<=6)
k=31;
else if (j>=6 && j<=11)
k=30;
else if (g%33==1 || g%33==5 || g%33==9 || g%33==13 || g%33==17 || g%33==22 || g%33==26 || g%33==30)
k=30;
else
k=29;

lines+=2; // Add this
cout << "Sh Ye Do Se Ch Pa Jo\n"; //چاپ 7 روز هفته

for ( i=1;i<=n-1;i++) //حلقه چاپ فضاهای خالی
{
cout << " " << " " << " ";
}

for ( i=1;i<=k-1;i++) //حلقه چاپ روزها
{
int X = ((7- n)* 2) + 6 - (n-1) ; // Add this

gotoxy(X, lines); // Add this
cout << i ; // remove this: << " ";
n++;

if (n==8)
{
lines++ ; // Add this
n=1;
cout << endl;
}

}

lines+=2; // Add this
cout << endl << endl;
}

getch();
return 0;
}

- در فوق x را از انتها محاسبه می کنیم و در gotoxy قرار می دهیم. یعنی شماره روز * 2 به علاوه تعداد فضاهای خالی ما بین این 7روز. به این شکل عدد X بدست می آید.
مثلا روز 7 باید به جای روز 1 چاپ شود یا روز 5 به جای روز 3 و .. . اعداد را در همان فرمول قرار دهید تا متوجه شوید.

- از انجایی که از gotoxy استفاده می کنید باید مقدار Y را هم بدانید، پس به همین دلیل هرجایی که از endl یا \n استفاده کردید باید یک واحد به متغیر lines اضافه کنید تا شماره Y خط کنونی را بدانید. (x و y از 0 شروع می شوند)

- روزهای هفته را به جای اینکه پشت سر هم بنویسید در یک آرایه ای از رشته ها قرار دهید، سپس به راحتی حلقه for را بر عکس کنید تا Sh Ye و .. را برعکس چاپ کند.

- تذکر: اگر از gcc در نسخه ویندوز استفاده می کنید windows.h در آن وجود دارد. در غیر صورت برای سایر سیستم عامل ها معادل gotoxy را با توابع کنسولی همان پلتفرم بنویسید یا پیدا کنید.

Kamiarn
جمعه 04 اردیبهشت 1388, 23:40 عصر
int X = ((7-n)* 2) + 6 - (n-1) ;
توی این خط چرا باید عدد حاصل منهای n-1 بشه؟ و چرا در صورت نبودش ترتیب چاپ بهم میخوره؟

Nima_NF
شنبه 05 اردیبهشت 1388, 01:13 صبح
چون در gotoxy مکان x از صفر شروع می شود و n که از ورودی دریافت می کنید از 1.
وقتی n یا همان روز 1 هست اولین نقطه X هم صفر باید باشد.(که ما 6 را از حاصل آن کم کی کنیم تا برعکس راست به چپ شود)