پاسخ سوال ماشین متنی کوئرا
در این نوشته تمرین “ماشین متنی” که در وبسایت کوئرا موجود است را برای شما کاربران عزیز حل کردهایم.
پاسخ سوال ماشین متنی کوئرا
در این سوال از شما خواسته شده است تا یک ماشین متنی کوچک با مجموعهای از قابلیتهای ساده را پیادهسازی نمایید. روال کار بدین صورت است که در آغاز کار برنامه یک رشته متنی اولیه(به طول حداکثر 1000 کاراکتر) را از ورودی دریافت میکند. در ادامه تا زمانی که دستور خروج را دریافت کند در هر نوبت کاربر درخواست یک عملیات بر روی رشته متنی میدهد. عملیاتها به شرح زیر تعریف شدهاند:

برنامه شما تنها به ازای عملیات چاپ خروجی خواهد داشت و به ازای سایر دستورات صرفاً عملیات موردنظر را برروی رشته متنی انجام میدهد. در پیادهسازی این سوال، شما باید به ازای تمامی دستورات(به جز خروج) یک تابع در نظر بگیرید و انجام عملیات توسط فراخوانی آن تابع انجام بگیرد. به عنوان نمونه امضای توابع باید به این صورت است:
void Extend( char *string, int _extendedLength);
ورودی نمونه ۱
initial string PRINT EXTEND 2 SHIFT-R 3 PRINT PUT 3 o REVERSE SHRINK 2 PRINT EXIT
خروجی نمونه ۱
initial string g**initial strin nirts laitinio
ورودی نمونه ۲
Test PRINT SHRINK 20 PRINT EXTEND 2 PRINT EXIT
خروجی نمونه ۲
Test **
حل سوال ماشین متنی
using namespace std;
void ShiftLeft(string &str, int cnt)
{
int n = str.length();
if(n == 0)
return;
string newstr = "";
cnt %= n;
for(int i=0; i<n; i++)
newstr += str[(i+cnt+n)%n];
str = newstr;
}
void ShiftRight(string &str, int cnt)
{
int n = str.length();
if(n == 0)
return;
string newstr = "";
cnt %= n;
for(int i=0; i<n; i++)
newstr += str[(i-cnt+n)%n];
str = newstr;
}
void Extend(string &str, int cnt)
{
for(int i=0; i<cnt; i++)
str += '*';
}
void Shrink(string &str, int cnt)
{
if(cnt >= str.length())
str = "";
else
str = str.substr(0, (int)str.length()-cnt);
}
void Reverse(string &str)
{
reverse(str.begin(), str.end());
}
void Put(string &str, int i, char c)
{
if(i > str.length()) return;
str[i-1] = c;
}
void Print(string str)
{
cout << str << endl;
}
int main()
{
string order, str="";
getline(cin, str);
cin >> order;
while(order != "EXIT")
{
//cout << order << endl;
//cout << str << endl;
if(order == "SHIFT-R" || order == "SHIFT-L")
{
int cnt;
cin >> cnt;
if(order[6] == 'L')
ShiftLeft(str, cnt);
else
ShiftRight(str, cnt);
}
else if(order == "EXTEND")
{
int cnt;
cin >> cnt;
Extend(str, cnt);
}
else if(order == "SHRINK")
{
int cnt;
cin >> cnt;
Shrink(str, cnt);
}
else if(order == "REVERSE")
{
Reverse(str);
}
else if(order == "PUT")
{
int i;
char c;
cin >> i >> c;
Put(str, i, c);
}
else if(order == "PRINT")
{
Print(str);
}
cin >> order;
}
return 0;
}
منبع سوال: وبسایت کوئرا
اگر روش حل بهتری برای “تمرین ماشین متنی” دارید برای ما ارسال کنید تا با نام خودتان به اشتراک بگذاریم. اگر سوال خاصی را مدنظر دارید در بخش نظرات برای ما ارسال کنید تا حل آن سوال را در الویت محتوای سایت بگذاریم.



















استفاده از reverse آماده خیلی کد رو کوتاه کرده
موفق باشین
این دقیقا همون ساختار توابعیه که توی صورت سوال خواسته بود
موفق باشین
من وقتی اینو حل کردم، توی Shiftها هی اشتباه ایندکس میگرفتم 😅
موفق باشین
به نظرم استفاده از substr برای Shrink خیلی تمیزه
موفق باشین
خیلی مرتب همه توابع رو جدا کردی
موفق باشین