PDA

View Full Version : سوال: جدا کردن قسمتی از یک رشته



hister
پنج شنبه 16 آذر 1391, 03:29 صبح
سلام
من میخوام یه برنامه بنویسم که مثلا یه رشته مثل این رو بگیره
0022.0012.0110.0110.0120.1000
بعد تک تک اعداد 4 رقمی رو از هم جدا کنه !!!

بعد اینکه من این اعداد رو به عنوان رشته گرفتم char الان من میتونم مثلا با 0022 به عنوان یه عدد رفتار کنم و روش اعمال ریاضی انجام بدم ؟
ممنون میشم کمک کنید.
بیشتر ممیخوام رو زبان c++ باشه

H_G_G_I
پنج شنبه 16 آذر 1391, 09:35 صبح
اول از همه شما باید دونه دونه کاراکتر ها رو بررسی کنید که اگه '.' بود اون قسمت رو در یه رشته جدا کپی کنید .
بعد با تابع atoi می تونید رشته رو به int تبدیل کنید !
شما اول خودتون سعی کنید بعد اگه مشکلی تو کدتون بود بیاید تا حل کنیم !:قلب:

hister
پنج شنبه 16 آذر 1391, 14:11 عصر
من تا یه جاهایی پیش رفتم من یه رشته با طول مثلا 100 معرفی کردن به کاربر اون رشته رو وارد میکنه تو یه دستور for تک تک حروف رو چکه میکنه و با یه شرط if اگه حرف . بود 4 عدد قلیشو انتخاب میکنه !!
ولی چجوری بهش بگم که اون 4 تا عدد رو توی یه رشته جدید بریزه منظورم اینه که ما داریم تک تک رشته ها رو میریم چجوری باید بگم چهار حرف قبلی رو کنار هم بزاره ؟؟

چیزی که به فکر خودم میرسه اینه که در شروع حلقه یک متغیر برابر با مقدار کنونی شمارنده رو نگه داره هر وقط به . رسید یک رشته از اندیس 1 تا اندیس 4 ایجاد کنه اما نمیدونم چجوری بگم که رشته رو از اندیس 1 تا 4 بره !!

M.soheil
پنج شنبه 16 آذر 1391, 14:45 عصر
فکرت خوبه برو جلو!
البته میتونی به رشته کمکی بگیری و هر چی که خونده شد تا رسیدن به نقطه توی اون ریخته بشه.حالا وقتی به نقطه میرسی اون رشته کمکی شده عددت.فقط هر بار باید بعد از ذخیره کردن خالیش کنی.

H_G_G_I
پنج شنبه 16 آذر 1391, 16:06 عصر
خب وقتی نقطه رو پیدا کردی چهار تا کاراکترهای قبلی رو کپی می کنی
با for یا memcpy یا ... می تونی .
مثلا من اینو نوشتم !

void getNumbres(const char* _cstr)
{
while(*_cstr != 0)
{
if(*_cstr == '.')
{
char l_chr[5];
l_chr[4] = '\0';
//--------
//memcpy(l_chr, _cstr - 4, 4);
//--------
/////OR/////
//------
for(int i = 0; i < 4; i++)
l_chr[i] = *(_cstr - 4 + i);
//--------

std::cout << l_chr << '\n';
}
_cstr++;
}
}

البته این یه مشکل داره اینه که اخرین عدد رو نشون نمی ده چون نقطه جلووش نیست !
در ضمن اگه اعداد چها رقم نباشن مشکل میشه بهتره بهینش کنی که هر چند رقم بود بخونه !
مثلا این عدد ها رو بخونه . 123,34545,1,3434,6,567567

hister
پنج شنبه 16 آذر 1391, 16:39 عصر
من میخواستم این اعداد که مبنا 3 هستند رو به مبنای 10 ببرم که در کل برنامه اینطوری شد: (برنامه ای که در حال نوشتنش بودم برنامه ای بود که یک متن رو از کاربر میگیره به یه سری عدد مثل اعداد بالا تبدیل میکنه و واسه کاربر چاپ میکنه و توی یه قسمت هم کابر میتونه عدد ها رو وارد کنه تا متن مربوط رو ببینه)

این کد اعداد رو جدا میکنه و از مبنا 3 به مبنا 10 میبره:

#include <iostream>
#include <string>
using namespace std;

int base (int base1, int base2, long num);

int main ()
{
char word [100] = {"0022.0012.0110.0110.0120.1000"};
long adad;
cout << word;
for (int i = 0; i < 100; i++)
{
if (word [i + 4] == '.')
{
char part [5] = {word [i], word [i+1], word [i+2], word [i+3],'-1'};
part [4] = '\0';
adad = atoi (part);
cout << base (3, 10, adad)<< endl;
}
}
}


int base (int base1, int base2, long num)
{
int j=0, ibase=1;
long r, mabna=0, newnum;
newnum = num;
if (base1 <= 10 && base1 >=2 && base2 >=2 && base2 <=10)
{
while (newnum > 0)
{
r = num / ibase % 10;
mabna += r * pow(base1, j);
j++; ibase *= 10;
newnum /= 10;
}

int i=0, sum=0, r1, x;
x = mabna;

while (x != 0)
{
r1 = x % base2;
sum += r1 * pow(10, i);
i++;
x /= base2;
}
return sum;
}
}


به نظرتون تابع تبدیل مبنام چظوره ؟

hister
پنج شنبه 16 آذر 1391, 17:01 عصر
این برنامه کلیمه فقط یه مشکلی که دارم اینه که توی دستور switch تابع ها فراخوانی نمیشن نمفیفمم مشکل چیه ؟
میشه یه راهنمایی کنین ؟!!
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

int base (int base1, int base2, long num);
void create (void);
void read (void);

int main()
{
int choose;
cout << "For read enter 1"
<< "For create enter 2\n"; cin >> choose;
cout << choose << endl;

switch (choose)
{
case 1:
read();
break;
case 2:
create();
break;
default:
break;
}
}
void read (void)
{
char numbers [100];
char words [100];
long adad;
cout << "Enter your numbers for translate: " << endl;
cin.getline (numbers, 100);

for (int i = 0; i < 100, numbers [i] != '\0'; i++)
{
if (numbers [i] == '+')i++;

if (numbers [i + 4] == '.')
{
char part [5] = {numbers [i], numbers [i+1], numbers [i+2], numbers [i+3],'-1'};
part [4] = '\0';
adad = atoi (part);
adad = base (3, 10, adad);

if (adad == 1) words [i] = 'a';
if (adad == 2) words [i] = 'b';
if (adad == 3) words [i] = 'c';
if (adad == 4) words [i] = 'd';
if (adad == 5) words [i] = 'e';
if (adad == 6) words [i] = 'f';
if (adad == 7) words [i] = 'g';
if (adad == 8) words [i] = 'h';
if (adad == 9) words [i] = 'i';
if (adad == 10) words [i] = 'j';
if (adad == 11) words [i] = 'k';
if (adad == 12) words [i] = 'l';
if (adad == 13) words [i] = 'm';
if (adad == 14) words [i] = 'n';
if (adad == 15) words [i] = 'o';
if (adad == 16) words [i] = 'p';
if (adad == 17) words [i] = 'q';
if (adad == 18) words [i] = 'r';
if (adad == 19) words [i] = 's';
if (adad == 20) words [i] = 't';
if (adad == 21) words [i] = 'u';
if (adad == 22) words [i] = 'v';
if (adad == 23) words [i] = 'w';
if (adad == 24) words [i] = 'x';
if (adad == 25) words [i] = 'y';
if (adad == 26) words [i] = 'z';
if (adad == 27) words [i] = ' ';
if (adad == 28) words [i] = '\'';
if (adad == 29) words [i] = '.';
if (adad == 30) words [i] = ',';
if (adad == 31) words [i] = '!';
if (adad == 32) words [i] = '?';

cout << words [i];
}
}
}

void create (void)
{
char word[1000];
long wn[1000];
cout << "Enter your text to translate: " << endl;
cin.getline (word, 1000);

for (int i = 0; i < 1000, word [i] != '\0'; i++)
{
if (word [i] == 'A' || word [i] == 'a') wn [i] = 1;
if (word [i] == 'B' || word [i] == 'b') wn [i] = 2;
if (word [i] == 'C' || word [i] == 'c') wn [i] = 3;
if (word [i] == 'D' || word [i] == 'd') wn [i] = 4;
if (word [i] == 'E' || word [i] == 'e') wn [i] = 5;
if (word [i] == 'F' || word [i] == 'f') wn [i] = 6;
if (word [i] == 'G' || word [i] == 'g') wn [i] = 7;
if (word [i] == 'H' || word [i] == 'h') wn [i] = 8;
if (word [i] == 'I' || word [i] == 'i') wn [i] = 9;
if (word [i] == 'J' || word [i] == 'j') wn [i] = 10;
if (word [i] == 'K' || word [i] == 'k') wn [i] = 11;
if (word [i] == 'L' || word [i] == 'l') wn [i] = 12;
if (word [i] == 'M' || word [i] == 'm') wn [i] = 13;
if (word [i] == 'N' || word [i] == 'n') wn [i] = 14;
if (word [i] == 'O' || word [i] == 'o') wn [i] = 15;
if (word [i] == 'O' || word [i] == 'p') wn [i] = 16;
if (word [i] == 'Q' || word [i] == 'q') wn [i] = 17;
if (word [i] == 'R' || word [i] == 'r') wn [i] = 18;
if (word [i] == 'S' || word [i] == 's') wn [i] = 19;
if (word [i] == 'T' || word [i] == 't') wn [i] = 20;
if (word [i] == 'U' || word [i] == 'u') wn [i] = 21;
if (word [i] == 'V' || word [i] == 'v') wn [i] = 22;
if (word [i] == 'W' || word [i] == 'w') wn [i] = 23;
if (word [i] == 'X' || word [i] == 'x') wn [i] = 24;
if (word [i] == 'Y' || word [i] == 'y') wn [i] = 25;
if (word [i] == 'Z' || word [i] == 'z') wn [i] = 26;
if (word [i] == ' ' ) wn [i] = 27;
if (word [i] == '\'' ) wn [i] = 28;
if (word [i] == '.' ) wn [i] = 29;
if (word [i] == ',' ) wn [i] = 30;
if (word [i] == '!' ) wn [i] = 31;
if (word [i] == '?' ) wn [i] = 32;
long x = wn [i];

cout << setfill('0') << setw (4) << base (10, 3, x);
if (wn [i] == 27)
cout << ".+";
else
cout << ".";
}
cout << endl;
}

int base (int base1, int base2, long num)
{
int j=0, ibase=1;
long r, mabna=0, newnum;
newnum = num;
if (base1 <= 10 && base1 >=2 && base2 >=2 && base2 <=10)
{
while (newnum > 0)
{
r = num / ibase % 10;
mabna += r * pow(base1, j);
j++; ibase *= 10;
newnum /= 10;
}

int i=0, sum=0, r1, x;
x = mabna;

while (x != 0)
{
r1 = x % base2;
sum += r1 * pow(10, i);
i++;
x /= base2;
}
return sum;
}
}

MSK
پنج شنبه 16 آذر 1391, 19:38 عصر
سلام من کدتو یکم عوض کردم این شد: https://gist.github.com/4225852
حالا کامپایل میشه.
ببین همونیه که میخوای؟
البته کاملش نکردم. زحمت کامل کردنش با خودته. :لبخندساده:

hister
پنج شنبه 16 آذر 1391, 20:26 عصر
میتونی این قسمت رو بهم یه توضیح کوچیک بدی ؟
cin >> choose;
cin.ignore(1000, '\n'); //needed to make cin.getline work
// cout << choose << endl; didn't need it

متوجه نمیشم چرا لازمه !!

و این که به جز main جی دیگه ای هم تغییر لازم داشت ؟!

MSK
یک شنبه 03 دی 1391, 16:14 عصر
بابت این که دیر جواب میدم معذرت می ‌خوام.
اول در مورد cin.ignore:
عملگر cin >> کاراکتر '\n' آخر خط رو نمی خونه. یعنی همون اینتر آخر رو.
در نتیجه بعد از این cin >> اگه cin.getline کنید فقط یه خط خالی بر میگردونه که همون اینتر خط قبله.
این cin.ignore باعث میشه که همه این خط های خالی نادیده گرفته بشند.
یعنی اینکه معمولا جایی که از cin.getline استفاده می کنی، همیشه باید قبلش از این cin.ignore استفاده کنی.

بعد اگه دقت کنی من تابع read تو هم تقییر دادم. اونجا هم دوتا تقییر دادم.
اولا اینکه اون هزارتا if ای که نوشتی اصلا ایده جالبی نیست. خط ۳۶ و ۸۶ رو نگاه کن. بهمین سادگی میتونی اون if ها رو حذف کنی. فقط جای اون ۳نقطه ی خط ۳۶ بقیه حروف رو بزن. من حوسله‌ام نگرفت. همین کار رو با تابع create ات هم میتونی بکنی.
مشکل دوم هم تو خط های۴۹ و ۵۰ بود. تو مستقیم میتونستی عضو آخر رو صفر بزاری. که من اینکار رو برات کردم.

بقیه کدت رو هم با دقت نگا نکردم. اگه بازم مشکی داشت بگو تا نگا کنم.