PDA

View Full Version : سوال: مشكل در تبديل كاراكتر به int



samaram
پنج شنبه 19 دی 1387, 17:25 عصر
دارم برنامه ي جمع دو عدد 20 رقمي كه اون ها رو بصورت رشته از كاربر گرفتم رو مي نويسم. توي تابعي كه مي خوام تك به تك عناصر آرايه ي كاراكتري رو به int تبديل كنم. اينم كدي كه براش نوشتم:


void convert(char st1[],char st2[],int num1[],int num2[])
{
int p=20;
for(int i=strlen(st1);i>=0;i--)
{
num1[i]=atoi(st1[i]);
p--;
}
printf("num1 is: %d",num1);
}

اما توي خط 5 با اين خطا مواجه مي شم:



can not convert "int" to "const char*"


چجوري مي تونم اين خطا رو برطرف كنم و اون عنصر آرايه رو به عدد تبديل كنم؟ برنامه ي نوشته شده ي اين سوال رو نداريد؟

مهرنوش_66
پنج شنبه 19 دی 1387, 17:48 عصر
سلام
اگه منظور شما اینه که یه کاراکتر رو به کد اسکی معادلش تبدیل کنی باید از ' ' استفاده کنی و قسمت کاراکتر رو داخل علامت بذاری
توی قسمت for تابعatoi()رو بین دو تا علامت بذار

emad_67
پنج شنبه 19 دی 1387, 18:30 عصر
اما توي خط 5 با اين خطا مواجه مي شم:
تابع atoi در پارامترش یک char * دریافت میکنه، اما در بالا شما داری یک کاراکتر میفرستی. کاراکتر ها هم به صورت کد اسکی هستند، یعنی مثلا وقتی کاراکتر 0 در یک خونه آرایه هست مثل اینه که کد اسکی 48 اون ذخیره شده. برای همین میگه که int نمیتونی بفرستی.
اما برای حلش باید آدرس اونو بفرستی به تابع:


num1[i]=atoi(&st1[i]);

یا اینکه هر خونه رو از 48 کم کنی که معادل عددی اون کاراکتر میشه:


num1[i]=st1[i]-48;

samaram
جمعه 20 دی 1387, 07:30 صبح
ممنون. دو سوال ديگه دارم:
1- ببينيد اين برنامه ايه كه من براي گرفتن دو عدد 20 رقمي بصورت رشته اي و تبديل به عدد نوشتم:


# include <stdio.h>
# include <conio.h>
# include <string.h>
# include <stdlib.h>
void read(char st1[],char st2[]);
void convert(char st1[],char st2[],int num1[],int num2[]);
void main(){
clrscr();
char st1[20]={""},st2[20]={""};
int num1[20]={0},num2[20]={0};
read(st1,st2);
convert(st1,st2,num1,num2);
getch();
}
//----------------
void read(char st1[],char st2[])
{
printf("please enter number 1: ");
gets(st1);
printf("please enter number 2: ");
gets(st2);
}
//---------------------
void convert(char st1[],char st2[],int num1[],int num2[])
{
int p=20;
for(int i=strlen(st1);i>=0;i--)
{
num1[p]=(st1[i]-48);
p--;
}
p=20;
for(i=strlen(st2);i>=0;i--)
{
num2[p]=(st2[i]-48);
p--;
}

for(i=0;i<20;i++)
printf("%d",num1[i]);
printf("\n");
for(i=0;i<20;i++)
printf("%d",num2[i]);

}


حالا مشكل توي تابع convert هستش. به اين شكل كه وقتي كدهامو trace مي كنم ميبينم توي اون خط اول دستور داخل for يعني:


num1[p]=(st1[i]-48);

يه دفعه st2 كه اصلا هيچ تغييري در اين حلقه روش داده نشده يه مقدار ناشناخته مي گيره و طبيعتا در ادامه و توي for دوم محاسبه ها مشكل دار ميشه. مي خوام ببينم چرا اينطور ميشه؟ اخه توي حلقه ي اول كه تغييري روي st2 انجام نميشه.

2- مي خوام يه برنامه بنويسم كه مثلا تعداد دفعات تكرار يك كاراكتر رو بشماره. راهي كه دارم يانه كه يه آرايه ي 93 عنصري بگيرم و از 65 تا 93 رو تعداد تكرارهاي كاراكتري كه كداسكيش معادل اون خونه است بذارم. اما نمي دونم چطوري بايد موقع خوندن كاراكتر از ورودي اونو توي اون خونه ي آرايه ي معادل كد اسكيش بريزم. يعني نمي دونم چطور ميشه من كد اسكي كاراكتر رو بدست بيارم و بعد بريزمش توي اون خونه

obscure
جمعه 20 دی 1387, 09:54 صبح
ممنون. دو سوال ديگه دارم:
1- ببينيد اين برنامه ايه كه من براي گرفتن دو عدد 20 رقمي بصورت رشته اي و تبديل به عدد نوشتم:


# include <stdio.h>
# include <conio.h>
# include <string.h>
# include <stdlib.h>
void read(char st1[],char st2[]);
void convert(char st1[],char st2[],int num1[],int num2[]);
void main(){
clrscr();
char st1[20]={""},st2[20]={""};
int num1[20]={0},num2[20]={0};
read(st1,st2);
convert(st1,st2,num1,num2);
getch();
}
//----------------
void read(char st1[],char st2[])
{
printf("please enter number 1: ");
gets(st1);
printf("please enter number 2: ");
gets(st2);
}
//---------------------
void convert(char st1[],char st2[],int num1[],int num2[])
{
int p=20;
for(int i=strlen(st1);i>=0;i--)
{
num1[p]=(st1[i]-48);
p--;
}
p=20;
for(i=strlen(st2);i>=0;i--)
{
num2[p]=(st2[i]-48);
p--;
}

for(i=0;i<20;i++)
printf("%d",num1[i]);
printf("\n");
for(i=0;i<20;i++)
printf("%d",num2[i]);

}


حالا مشكل توي تابع convert هستش. به اين شكل كه وقتي كدهامو trace مي كنم ميبينم توي اون خط اول دستور داخل for يعني:


num1[p]=(st1[i]-48);

يه دفعه st2 كه اصلا هيچ تغييري در اين حلقه روش داده نشده يه مقدار ناشناخته مي گيره و طبيعتا در ادامه و توي for دوم محاسبه ها مشكل دار ميشه. مي خوام ببينم چرا اينطور ميشه؟ اخه توي حلقه ي اول كه تغييري روي st2 انجام نميشه.

2- مي خوام يه برنامه بنويسم كه مثلا تعداد دفعات تكرار يك كاراكتر رو بشماره. راهي كه دارم يانه كه يه آرايه ي 93 عنصري بگيرم و از 65 تا 93 رو تعداد تكرارهاي كاراكتري كه كداسكيش معادل اون خونه است بذارم. اما نمي دونم چطوري بايد موقع خوندن كاراكتر از ورودي اونو توي اون خونه ي آرايه ي معادل كد اسكيش بريزم. يعني نمي دونم چطور ميشه من كد اسكي كاراكتر رو بدست بيارم و بعد بريزمش توي اون خونه
توی برنامه اولت این st2 نیست که یه مقدار ناشناخته میگیره بلکه num1 , num2 هست که مشکل داره...شما موقع مقدار اولیه دادن به این دوتا آرایه باید از حلقه for استفاده کنی..
این جوری که شما نوشتی فقط خانه بیستم این آرایه برابر صفر می شه و بقیه خونه مقدار نا مشخص میگیرن..در ضمن اون حلقه آخرتم مشکل داره...مثلا وقتی یه عدد 3 رقمی میگیری دلیل نداره که 20 تا خونه آرایه رو چاپ کنی...به نظرم اونجا هم میزدی:

for(i=0;i<strlen(st1);i++)
printf("%d",num1[i]);
خیلی بهتر بود...:چشمک:
درباره برنامه دومت برای نوشتن همچین چیزی راههای خیلی بهتری هست به نظرم...
ولی اگه اصرار داری به این روش باشه بهتره همه خونه های آرایه رو مقدار اولیه صفر بدی..بعد
توی رشته به هر کاراکتری که رسیدی خونه معادل کد اسکیشو +1 بدی...

samaram
جمعه 20 دی 1387, 11:08 صبح
num1 و num2 رو به اين صورت كه شما گفتين هم مقداردهي اوليه كردم اما هيچ فرقي نكرد. شما اگه كدهاي منو كپي كنيد و trace كنيد مي بينيد كه همون اتفاقي كه بالا گفتم براي st2 پيش مياد.
در مورد برنامه ي دوم هم اولا من راه هاي بهتري بلد نيستم. مي تونيد راهنماييم كنيد؟ ثانيا ايني كه فرمودين رو مي دونم. اما نمي دونم چجوري بگم "اين كاراكتر روي توي خونه اي بريز كه معادل كد اسكيشه"!
خداي من كلي اعصابم خورده. سرما هم خوردم و حوصله تمركز ندارم. اين دو برنامه رو هم بايد تا سر شب آماده كنم. شما لينكي از نوشته شده اش رو سراغ نداريد؟

Saeed_m_Farid
جمعه 20 دی 1387, 11:20 صبح
num1 و num2 رو به اين صورت كه شما گفتين هم مقداردهي اوليه كردم اما هيچ فرقي نكرد. شما اگه كدهاي منو كپي كنيد و trace كنيد مي بينيد كه همون اتفاقي كه بالا گفتم براي st2 پيش مياد.
در مورد برنامه ي دوم هم اولا من راه هاي بهتري بلد نيستم. مي تونيد راهنماييم كنيد؟ ثانيا ايني كه فرمودين رو مي دونم. اما نمي دونم چجوري بگم "اين كاراكتر روي توي خونه اي بريز كه معادل كد اسكيشه"!
خداي من كلي اعصابم خورده. اين دو برنامه رو بايد تا سر شب آماده كنم. شما لينكي از نوشته شده اش رو سراغ نداريد؟
سلام دوست عزيز
نميدونم چرا تو دوره هاي مختلف سوالا همه عين هم ميشن مثلا يكي دو هفته پيش همه داشتن درمورد چندجمله ايها صحبت ميكردن و الان دارن در مورد اعداد بزرگ و عمليات ...
بازم آدم احساس ميكنه همه همكلاسي هستيد يا اشل درسي مشابهي دارين و سوالها در مورد پروژه هاتونه‌: بهرصورت شايد not my business
تو تاپيك خونه بغلي! ؛ بنده يه تابع واسه دوستي در اين مورد كه شما دارين صحبت ميكنين گذاشتم و تو اين تاپيك چون دوستان داشتن راهنمايي ميكردن بنده تو بحث شما دخالت نكردم اگه ميخواين ميتونين اينو ببينيد : http://www.barnamenevis.org/forum/showpost.php?p=661905&postcount=4 (بند 5 رو مطالعه كنيد.)

با تشكر.

obscure
جمعه 20 دی 1387, 12:06 عصر
واسه برنامه اول یه سر به اون لینکی که دوست قبلی گذاشتن بزنید...
یه برنامه واستون نوشتم که یه رشته رو از ورودی می گیره و هر کاراکترش رو میریزه تو یه خونه آرایه با شماره کد اسکی اون کاراکتر...وتعداد تکرار رو میشماره..امیدوارم بدردتون بخوره..همونجوری که خواسته بودین نوشتم..

#include<conio.h>
#include<iostream.h>
#include<string.h>
int main()
{
char ch[20];
int a[93];
for(int i=0;i<93;i++)
a[i]=0;
cin>>ch;
for(i=0;i<strlen(ch);i++)
{
for(int j=65;j<=90;j++)
{
if(ch[i]==j)
a[ch[i]] += 1;
}
}
for(i=0;i<93;i++)
{
if(a[i]!=0)
cout<<a[i]<<"\n";
}
getch();
return 0;
}

samaram
جمعه 20 دی 1387, 14:31 عصر
واسه برنامه اول یه سر به اون لینکی که دوست قبلی گذاشتن بزنید...
یه برنامه واستون نوشتم که یه رشته رو از ورودی می گیره و هر کاراکترش رو میریزه تو یه خونه آرایه با شماره کد اسکی اون کاراکتر...وتعداد تکرار رو میشماره..امیدوارم بدردتون بخوره..همونجوری که خواسته بودین نوشتم..

#include<conio.h>
#include<iostream.h>
#include<string.h>
int main()
{
char ch[20];
int a[93];
for(int i=0;i<93;i++)
a[i]=0;
cin>>ch;
for(i=0;i<strlen(ch);i++)
{
for(int j=65;j<=90;j++)
{
if(ch[i]==j)
a[ch[i]] += 1;
}
}
for(i=0;i<93;i++)
{
if(a[i]!=0)
cout<<a[i]<<"\n";
}
getch();
return 0;
}

يه دنيا از لطفتون ممنون. كلي ذوق زده شدم اما وقتي اجراش كردم كمي تو ذوقم خورد. برنامه خروجي نداد! كدها رو هم كه يه بررسي كردم ديدم قسمتي براي اينكه مثلا بگه كاراكتر فلان اينقدر تكرار شده نبود. يعني مثلا براي رشته ي "samaram" خروجي بده: s:1 a:2 m:2 r:1

در مورد برنامه ي اولم هم از دوست عزيز saeid_m_farid تشكر مي كنم اما راستش خيلي دوست دارم همين برنامه اي كه خودم نوشتم رو به يه جايي برسونم. در مورد اروري كه گفتم پيش مياد نمي تونيد راهنماييم كنيد؟

obscure
جمعه 20 دی 1387, 14:59 عصر
يه دنيا از لطفتون ممنون. كلي ذوق زده شدم اما وقتي اجراش كردم كمي تو ذوقم خورد. برنامه خروجي نداد! كدها رو هم كه يه بررسي كردم ديدم قسمتي براي اينكه مثلا بگه كاراكتر فلان اينقدر تكرار شده نبود. يعني مثلا براي رشته ي "samaram" خروجي بده: s:1 a:2 m:2 r:1

در مورد برنامه ي اولم هم از دوست عزيز saeid_m_farid تشكر مي كنم اما راستش خيلي دوست دارم همين برنامه اي كه خودم نوشتم رو به يه جايي برسونم. در مورد اروري كه گفتم پيش مياد نمي تونيد راهنماييم كنيد؟

این برنامه واسه کد اسکی های 65 تا 90 درست شده یعنی کاراکتر های حروف بزرگ....
فکر کردم وقتی خودتون نوشتید تا 93 منظورتون حروف بزرگ بوده دیگه...
اگه می خواین واسه حروف کوچیک هم کار کنه یه تغییر کوچیک تو اعداد بدین درست میشه.
اگه تو این برنامه وارد کنید SAMARAM خروجی میده :
3
2
1
1
که یعنی 3 تا A و 2 تا M و 1 S و 1 R وجود داره...
واسه درست کردن شکل خروجیش هم زحمتش پای خودتون...
پ.ن:کد اسکی حروف کوچیک از 97 تا 122 هست.

Saeed_m_Farid
جمعه 20 دی 1387, 16:49 عصر
يه دفعه st2 كه اصلا هيچ تغييري در اين حلقه روش داده نشده يه مقدار ناشناخته مي گيره و طبيعتا در ادامه و توي for دوم محاسبه ها مشكل دار ميشه. مي خوام ببينم چرا اينطور ميشه؟ اخه توي حلقه ي اول كه تغييري روي st2 انجام نميشه.


void convert(char st1[],char st2[],int num1[],int num2[])



اولا لازم نيست همه كارها رو تو تابع convert انجام بدين(هر دو تا رشته رو هم همونجا هم تبديل كنيد و هم پرينت)

ثانيا وقتي ورودي رو معمولي پاس بدين به تابع مقادير پس از خروج از تابع برميگردن به حالت اول درست ترش يعني تابع به چشم متغير محلي به ورودي ها نگاه ميكنه و تغييرات شما باطل ميشن

ثالثا يكمي كدتون رو بهينه كنيد (همه چي رو عدد ثابت 20 ندين! شايد لازم باشه 20 تغيير كنه) من چند تا رو عوض كردم ولي به قول دوستمون بقيه اش با خودتون :

//---------------------------------------------------------------------------

void read(char st1[],char st2[]);
int* convert(char st1[], int len);
//---------------------------------------------------------------------------

void read(char st1[],char st2[])
{
printf("please enter number 1: ");
gets(st1);
printf("please enter number 2: ");
gets(st2);
}
//---------------------------------------------------------------------------

int* convert(char st1[], int len)
{
int *num=(int*)malloc(sizeof(int)* len);
for(int i=strlen(st1)-1;i>=0;i--)
num[i]=st1[i]-48;
return num;
}
//---------------------------------------------------------------------------

int main()
{
clrscr();
char st1[20]={""},st2[20]={""};
int *num1={0}, *num2={0};
unsigned int i = 0;
read(st1,st2);
num1 = convert(st1, strlen(st1));
num2 = convert(st2, strlen(st2));
for(i=0;i<strlen(st1);i++)
printf("%d, ",num1[i]);
printf("\n");
for(i=0;i<strlen(st2);i++)
printf("%d, ",num2[i]);
getch();
return 0;
}
//---------------------------------------------------------------------------