با سلام
ببخشید من یک رشته مثل زیر دارم:
s=1+2(3^7)/10
میخوام ببینم با دسنور یا تکنیک خاصی، حاصل جمله بالا چند میشود و حاصلش را در متغیر A بریزم؟
با تشکر
Printable View
با سلام
ببخشید من یک رشته مثل زیر دارم:
s=1+2(3^7)/10
میخوام ببینم با دسنور یا تکنیک خاصی، حاصل جمله بالا چند میشود و حاصلش را در متغیر A بریزم؟
با تشکر
اگه s یه متغیره میتونی منهای 48 کنی یا یه صفر ازش کم کنی تا از حالت رشته خارج بشه
کد:int a=s-48 ;// int a=s-'0';
الان دقیقا نمیدونم عملی جواب میده یا نه چون الان قابل تست نیست
در واقع میخوام ماشین حساب بسازم
( s یک متغیر رشته ای هست)
من اعداد و پرانتز تایپ میکنم و هر چی تایپ کردم تبدیل به رشته میکنم و میرزمش داخل s و در آخر این رشته رو با چیزی که شما گفتید حاصلش رو حساب میکنم
والا چی بگم من رشته الکترونیکم و خیلی زبان سی بلد نیستم و حتی 2 تا کتاب سی رو هم خوندم ولی حتی این چیز ساده ه ای که شما گفتید توی عمرم یکبار هم ندیدم!
متاسفانه بارها خواستم سی رو حرفه ای یاد بگیرم اما اکثر کتابهای بازار شبیه هم و یا خیلی ساده و یا خیلی سنگین و بدرد نخور.
من یک چیزی میخوام کاربردی باشه
ما این زبان سی رو در میکروکنترلرها استفاده میکنم!
الان دقیقا نمیدونم عملی جواب میده یا نه چون الان قابل تست نیست
در واقع میخوام ماشین حساب بسازم
( s یک متغیر رشته ای هست)
من اعداد و پرانتز تایپ میکنم و هر چی تایپ کردم تبدیل به رشته میکنم و میرزمش داخل s و در آخر این رشته رو با چیزی که شما گفتید حاصلش رو حساب میکنم
والا چی بگم من رشته الکترونیکم و خیلی زبان سی بلد نیستم و حتی 2 تا کتاب سی رو هم خوندم ولی حتی این چیز ساده ه ای که شما گفتید توی عمرم یکبار هم ندیدم!
متاسفانه بارها خواستم سی رو حرفه ای یاد بگیرم اما اکثر کتابهای بازار شبیه هم و یا خیلی ساده و یا خیلی سنگین و بدرد نخور.
من یک چیزی میخوام کاربردی باشه
ما این زبان سی رو در میکروکنترلرها استفاده میکنم!
شما اموزش زبان c اقای ابریشمی رو بخون خیلی روون و قابل فهم مفاهیم پایه ای c رو توضیح داده
ببخشید با این دستوری که شما گفتید مشکل من حله؟
توی c توان نداریم باید براش یه تابع بنویسی تا حاصلشو بدست بیاری قبل از پرانتز هم باید ضربدر بزاری
دوست عزیز برای همچین عباراتی شما دو تا راه دارینقل قول:
1-اینکه اینها رو به عبارات لهستانی تبدیل کنی و بعد جواب و از طریق پشته بدست بیاری(برای ایجادش کتابهای ساختمان داده باید بخونی)
2-راه قانونی تر اینکهع یک عدد lexical analyzer و پارسر -در واقع یه کامپایلر کوچیک-درست کنی( برای ایجادش کتابهای طراحی کامپایلر باید بخونی)
و اینطور که از پستهای شما پیداست انجام هیچ کدوم از اینا کار شما نیست(کتاب جناب ابریشمی رو هم بخونی نمی تونی اینا رو بنویسی لول) شما کلن یه ماشین حساب ساده درست کن و ماشین حساب پیشرفته رو بذار بعهده مهندسای کامپیوتر بدور از شوخی دارم می گم وقت با ارزشت و بذار رو رشته خودت لول
نقل قول:
استفاده از عبارات لهستانی و پشته کار شاخی نیست
کافیه که به کتاب های ساخنمان داده رجوع کنی
و خ راحت الگوریتم هاش رو کپی کنی
پایمده باشی
اگه قرار به کپی پیست کردن باشه که دیگه کتاب هم نمی خواد این همه کد تو نت هست در این مورد خودم هم فکر کنم کدش و نوشته بودم اینجا قرار داده بودم(و تا جایی که یادم میاد به این آسونیها هم که شما دارین می فرمایین نبود اصولا تو کلاس ما برای ساختمان داده فقط من رفته بودم دنبال کد نویسیهاش و برای من هم آسون نبود برم توش)نقل قول:
ایشون نگفت می خواد کپی پیست کنه اومد گفت تکنیک خاصش چیه لول ما هم گفتیم این راهش!
ببین دوست عزیز من بازم بهت می گم اینا مباحثی نیست که شما یکی دو روزه یاد بگیری وقت رشته تخصصی خودت و برای اینا نذار شما همون پشته رو می تونی کپی پیست کنی یا بدی یکی برات بنویسه دیگه تصمیم با خودت!
در مورد روش دوم هم من فقط یه ایده بهت میدم که قراره از کجا شروع کنی شاید یه روزی روزگاری خواستی از این روش هم بنویسی این روش اصلی و استاندارده
مثلا برای دریافت رشته as b*abb من برنامه زیر رو اینطور نوشتم که شما می تونی رشته های خودت و تعریف کنی!
این که نمودارشه
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اینم کدش ساده و خلاصه
و این هم یک عدد کامپایلر ساده برای پوست فیکس و اسمبل کردن عبارات ریاضی ساده از کتاب Design and impletation of compilers که من فقط print هاش و cout کردم وگرنه اصلا همون با c نوشته شده بودکد:#include<string>
using namespace std;
string analyse(string s);
int main()
{
string s;
while(1)
{
cout<<"Eneter you number:";
cin>>s;
cout<<analyse(s)<<endl;
}
return 0;
}
string analyse(string s)
{
int status=0;
for(int i=0;i<s.length();i++)
{
switch (status)
{
case 0:
if(s[i]=='a')
{
status=1;
break;
}
else
return "Error! Enter a new String!";
case 1:
if(s[i]=='s')
{
status=2;
break;
}
else
return "Error! Enter a new String!";
case 2:
if(s[i]=='b')
{
status=2;
break;
}
else if(s[i]=='a')
{
status=3;
break;
}
else
return "Error! Enter a new String!";
case 3:
if(s[i]=='b')
{
status=4;
break;
}
else
return "Error! Enter a new String!";
case 4:
if(s[i]=='b')
{
status=0;
return "The text eccepted!";
break;
}
else
return "Error! Enter a new String!";
}
}
return "Error! Enter a new String!";
}
کد:#include<iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MODE_POSTFIX 0
#define MODE_ASSEMBLY 1
char lookahead;
int pos;
int compile_mode;
char expression[21];
void error()
{
cout<<"Syntac error"<<endl;
}
void match(char t)
{
if(lookahead==t)
{
pos++;
lookahead=expression[pos];
}
else
error();
}
void digit()
{
switch(lookahead)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if(compile_mode==MODE_POSTFIX)
cout<<lookahead;
else
cout<<"\tPUSH \n"+lookahead;
match(lookahead);
break;
default:
error();
break;
}
}
void term()
{
digit();
while(expression!=NULL)
{
switch(lookahead)
{
case '*':
match('*');
digit();
if(compile_mode == MODE_POSTFIX)
cout<< "*" ;
else
cout<<"\tPOP B\n\tPOP A\n\tMUL A, B\n\tPUSH A\n";
break;
case '/':
match('/');
digit();
if(compile_mode == MODE_POSTFIX)
cout<<"/";
else
cout<<"\tPOP B\n\tPOP A\n\tDIV A,B\n\tPUSH A\n";
break;
default:
return;
}
}
}
void expr()
{
term();
while(1)
{
switch(lookahead)
{
case '+':
match('+');
term();
if(compile_mode == MODE_POSTFIX)
cout<< "+";
else
cout<<"\tPOP B\n\tPOP A\n\tADD A,B\n\tPUSH A\n";
break;
case '-':
match('-');
term();
if(compile_mode == MODE_POSTFIX)
cout<< '-';
else
cout<<"\tPOP B\n\tPOP A\n\tSUB A,B\n\tPUSH A\n";
break;
default :
return;
}
}
}
int main(int argc,char** argv)
{
cout<<"Please enter an infix-notated expression with single digits:\n\n\t";
cin>>expression;
cout<<"nCompiling to postfix-notated expression:\n\n\t";
compile_mode=MODE_POSTFIX;
pos=0;
lookahead=*expression;
expr();
cout<<"\n\nCompiling to assembly-notated machine code:\n\n";
compile_mode=MODE_ASSEMBLY;
pos=0;
lookahead=*expression;
expr();
return 0;
}