PDA

View Full Version : مبتدی: یه تیکه از کد سوالات acm



luke2020
شنبه 05 دی 1394, 19:05 عصر
تو این سوال اول کاربر عددی وارد میکنه بعد به تعداد اون عدد صفت میگیره و صفت رو یکی ارتقا میده مثلا slow » میشه slower و slower اگه ورودی باشه میشه slowest.
حالا مشکل من اینه که وقتی از کاربر صفتی رو میگیره تعداد حروفش رو مشخص کنه و چک کنه حرفه آخر و ما قبل آخر چیه و اونا رو تبدیل کنه
تا اینجا پیش رفتم#include <iostream>#include <string>
using namespace std;
int main()
{
////////////////////input
int a,b,n,i;
char c[100];
cout<<"insert number of adjective : " ;
cin>>a;
for(b=0;b<a;b++)
{
cin>>c;
n = sizeof(c);


cout<<n<<endl;
/////////////////////////processing
if(c[n]=='r')
{
cout<<"ok";
}
/////////////////////////output
cout<<c<<endl;
}

}
در ضمن من اینجا از string استفاده کردم ولی نباید استفاده کنم لطفا روشی غیر از string بگین

Poores
شنبه 05 دی 1394, 21:26 عصر
سلام
شما غیر از استفاده از آرایه کارکتر یا string راه دیگه ای ندارید! به هرحال ورودی شما یه سری رشته هستند نمیتونید که مثلا با عدد کار کنین که!

چک کردن دو حرف آخر هم کار خاصی نداره! البته من سوال رو نمیدونم شاید حالت خاص داشته باشه مثلا یک صفتی وجود داشته باشه که به خودی خودش با "er" تموم بشه و مثلا صفت ارتقا یافتش بشه erer اون موقع فرق میکنه کلا !

و اما یک مورد "sizeof" تابعی هست که سایز یک متغیر رو از نظر فضای اشغالی در حافظه برمی گردونه
مثلا اگر یک متغیر از نوع int داشته باشیم به اسم a ،

sizeof(a);

مقدار چهار (4بایت) رو بر میگرداند."

برای بدست آوردن طور یک رشته از نوع آرایه کارکتر به این صورت عمل میکنیم :


int i = 0;
for(i=0;i<c[i]!= '\0' ; i++);


و درنهایت مقدار i برابر با طول رشته خواهد بود.

نکته دوم برای چک کردن دو کارکتر آخر به این صورت عمل میکنیم :

if(c[i-1] == 'r' && c[i-2] == 'e')
// ارتقاء صفت!

(به i-1 و i-2 دقت کنید.)

luke2020
یک شنبه 06 دی 1394, 09:01 صبح
ممنون
ولی 2 تا چیز اول اینکه این کد که برای تبدیل r به st کار نمیکنی مشکلش کجاست
if(c[i-1] == 'r' && c[i-2] == 'e')
{
c[i-1]='st';
cout<<c;
}

و 2 اینکه میشه در باره ی کد زیر که نوشتید توضیح بدید
منظورم نحوه کارش این for چه چیزی رو چک میکنه
for(i=0;i<c[i]!= '\0' ; i++)

Poores
یک شنبه 06 دی 1394, 11:14 صبح
ممنون
ولی 2 تا چیز اول اینکه این کد که برای تبدیل r به st کار نمیکنی مشکلش کجاست
if(c[i-1] == 'r' && c[i-2] == 'e')
{
c[i-1]='st';
cout<<c;
}

و 2 اینکه میشه در باره ی کد زیر که نوشتید توضیح بدید
منظورم نحوه کارش این for چه چیزی رو چک میکنه
for(i=0;i<c[i]!= '\0' ; i++)

درمورد سوال اول :
خوب شما باید فرق بین رشته و کارکتر رو بدونید ، رشته مجموعه ای از کارکتر هاست ، برای مثال 'a' یک کارکتر و "aa" یک رشته هست. (چون از دو کارکتر تشکیل شده)
در اکثر زبان های برنامه نویسی از جمله c و c++ برای نشان دادن کارکتر ، کارکتر رو داخل ' میزارن مثل همین 'e' و 'r' داخل شرط if ، و رشته رو هم داخل " (مثلا همین "st").

و اما در مورد خط سوم کدی که قرار دادین ،

c[i-1] = 'st;

دو اشکال وجود داره اول اینکه "st" رشتست پس باید داخل " باشه نه ' ، دوم اینکه c[i-1]0 نشان دهنده یک کارکتر هست و شما نمیتوانید یک رشته رو داخل یک کارکتر قرار دهید.
پس مثل شرط if باید هر کارکتر رو جدا مقدار دهی کنید :

c[i-1] = 't';
c[i-2] = 's';


در مورد سوال دوم :
کار با رشته ها در C++ به دو صورت انجام میگیره ،
1)آرایه کارکتر
2)String

حالا اینجا ما از آرایه کارکتر استفاده کردیم و باید اینو بدونیم که در آرایه کارکتر وقتی یک رشته دریافت میکنیم ، (مثلا رشته "Hello" رو داخل آرایه C میریزیم) آخرین کارکتری که در این آرایه قرار میگیره 'o' خواهد بود ، اما ظرفیت آرایه ما طبق تعریف 100 کارکتر هست ، C++ به صورت خودکار کارکتر \0 یا نال رو داخل خانه بعدی میریزه تا بفهمه دقیقا تا کجای آرایه توسط رشته ما پر شده
http://www.cplusplus.com/doc/tutorial/ntcs/c_strings2.png
پس حلقه ای که نوشتیم از ابتدا آرایه کارکتر پیمایش میکنه و تا وقتی به نال (\0) نرسیده متوقف نمیشه ، مقدار i که از حلقه خارج میشه برابر با آدرس خونه نال هست . پس به همین دلیله که برای چک کردن دو کارکتر آخر از i-1 و i-2 استفاده کردیم

luke2020
یک شنبه 06 دی 1394, 18:48 عصر
ممنون
یه سوال دیگه اینکه میخام داده های آرایه c رو بریزم تو d
d=c نشد
d[100]=c[100 نشد

zero_ox
یک شنبه 06 دی 1394, 20:32 عصر
شما می تونید به این صورت عمل کنید .

// Example program
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
const char *c="www.barnamenevis.org";
const char *d;
d=c;
cout<<d<<endl;

char a[17]="barnamenevis.org";
char b[17];
char e[10];

strcpy(b,a);
cout<<b<<endl;
//or
strncpy(e,c,3);
cout<<e;
}


با تابع strncpy می تونید سایزی رو که می خوای کپی کنید فرقی با strcpy نداره.