PDA

View Full Version : سوال: کمک در اصلاح برنامه در زبان c



nasimt
یک شنبه 10 دی 1391, 14:28 عصر
سلام من یه برنامه نوشتم در مورد تبدیل عبارات پسوندی به پیشوندی اما وقتی توی turbo++اجراش می کنم بعد از اینکه عبارت پسوندی رو می گیره و خود متن the prefix expression is را می نویسه هیچ جواب و خروجی ای بهم نمی ده اگه می شه لطفا بهم بگین کجای برنامم ایراد داره که خروجی که می خوامو نمی گیرم
اینم از برنامه:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include<string.h>
#define max 100
void push(char);
char pop();
int *p;
int *tos;
int *bos;
char i;
void push(char)
{
if(p>bos)
{
*p=i;
p++;
}
char pop()
{
p--;
return *p;
}
int main()
char s[80],b[80],x,y;
int j;
tos =p;
bos=p+max-1;
printf(“\n enter postfix expression:”);
gets(s);
for(j=0;j<strlen(s);j++)
{
if(s[j]==’+’ ||s[j]==’-‘||s[j]==’*’||s[j]==’/’||s[j]==’^’)
{
y=pop();
x=pop();
strcat(&x,&y);
strcat(&s[j],&x);
push(s[j]);
}
else
{
push(s[j]);
}
b[80]=pop();
}
printf(“\n the prefix expression is:”);
puts(b);
getch();
}

mofid002006@gmail.com
یک شنبه 10 دی 1391, 15:04 عصر
خوب باید متن خطارو بذاری تا بشه گفت چیه
اما فعلا توی این کد اون چیزی که خیلی واضحه 2 تا خطاست که مربوط به علامت های { و } هست
1. توی خط 18 باید یه { دیگه بذاری چون تابع push بسته نشده
2. توی خط 24 باید آخر خط یه } بذاری

nasimt
یک شنبه 10 دی 1391, 15:44 عصر
ممنون از بالا توضیح می دم تابع push که یه واحد به بالای پشته که با متغیر p تعریفش کردم اضافه می کنه ، تابع pop یه واحد از بالای پشته کم می کنه و مقدار خونه ی p که محتوای خونه ی بالای پشته هست رو به تابع اصلی بر می گردونه ، توی تابع اصلیم اول رشته ی s رو که عبارت poxt fix توش قرار می گیره با طول 80 و رشته ی b رو که جواب یعنی عبارت prefix توش قرار می گیره رو همراه با y و x که دو تا خونه ی pop شده از پشته توش قرار می گیره رو تعریف کردم.j هم که متغیر کمکیه برای حلقه ،بعدشم که عبارت پسوندی رو می گیره و توی حلقه هم تا زمانی که به آخرین خوهنه ی رشته برسیم ، رشته رو می خونه و اگر + و - و ... باشه خوهنه ی بالای پشته رو pop می کنه و توی y می ریزه و دومی رو هم توی x و بعد y رو به x می چسبونه و x رو هم به خونه ی رشته که خونده که منظورم همون + و - و.. هست بعد دوباره عبارت رو توی پشته push می کنه و توی else اگه خونه ای از رشته رو که خونده بود - و+ و .. نبود اون رو توی پشته pushمی کنه و بعد از تموم شدن حلقه بالاترین خونه ی پشته رو که همون عبارت prefix می شه توی رشته ی b می ریزه و رشته ی b رو چاپ می کنه

mofid002006@gmail.com
یک شنبه 10 دی 1391, 17:11 عصر
متغیرهای tos , bos رو باید درست مقدار بدی
توی خط 28 و 29 وقتی که داری tos , bos رو مقدار میدی p اصلا مقداری نداره
وقتی که داری bos رو مقدار میدی باید به آخر پشته ت اشاره کنه

nasimt
یک شنبه 10 دی 1391, 17:25 عصر
هر مقداری که به p می دم اخطار می ده بهم می شه لطف کنید کد مقدار دهیشو واسم بزنید مثلا خودم یه بار این رو زدم:

int stack[100];
p = stack;


اما خطا داد بهم و عددم که می دم بهش خطا می ده

lexical_error
یک شنبه 10 دی 1391, 18:57 عصر
کدی که گذاشتین کد کامل برنامتون هست؟
برای تست کردن ورودی پیشنهاد میکنم که از تابع isalnum() استفاده کنید، این تابع کاراکتر میگیره و در صورتی که عدد یا حروف نباشد مقدار 0 برمیگردونه،برای تست کردن نوع عملگر هم میتونید یه تابع تعریف کنید و از ساختار switch استفاده کنید
مثل این


int value(char symb)
{
switch(symb)
{
case '(': return 1;
break;
case '*': return 5;
break;
case '/': return 5;
break;
case '+': return 3;
break;
case '-': return 3;
break;
case ')': return 0;
break;
}
}

اینطوری خوانایی برنامتون بیشتر میشه!
در مورد مقدار دادن به P هم باید ایندکس Stack رو نیز براش مشخص کنید.

mofid002006@gmail.com
یک شنبه 10 دی 1391, 19:55 عصر
int stack[100];
p = stack;


این کدتون درسته به شرطی که p هم یک اشاره گر به int باشه، یعنی :
int* p;

nasimt
یک شنبه 10 دی 1391, 20:35 عصر
الان برنامم دیگه خطا نداد اما وقتی ورودی- /AB*C+DEرو بهش می دم یه علامت فلش و یه صورتک که داره می خنده بهم می ده نمی دونم مشکل از کجای برنامست من اطلاعات کمی در مورد نوشتن پشته دارم این برنامه ایه که الان اجرا کردم:


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include<string.h>
#define max 100
int stack[100];
int *p;
void push(char);
char pop();
int *tos;
int *bos;
char i,s[80];
void push(char i)
{
If(p>=bos)
{
printf(“\n stack is full”);
getch();
return 0;
}
*p=i;
p++;
}
char pop()
{
p--;
if(tos<0)
{
Printf(“\n stack is empty”);
Return 0;
}
return *p;
}
int main()
{
char b[80],x[80],y[80];
int j;
p=stack;
tos =p;
bos=p+max-1;
printf(“\n enter postfix expression:”);
gets(s);
for(j=0;j<strlen(s);j++)
{
if(s[j]==’+’ ||s[j]==’-‘||s[j]==’*’||s[j]==’/’||s[j]==’^’)
{
y[80]=pop();
x[80]=pop();
strcat(x,y);
strcat(&s[j],x);
push(s[j]);
}
else
{
push(s[j]);
}
b[80]=pop();
}
printf(“\n the prefix expression is:”);
puts(b);
getch();
}

lexical_error
یک شنبه 10 دی 1391, 20:49 عصر
دوست عزیز نوشتن این برنامه یکم پیچیدست،منطقی که به کار میبرین باید کاملا درست و کلی باشه !
این کد تبدیل میانوندی به پسوندی هست،از این کد ایده بگیرین و کد خودتون رو بنویسین
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>
#define SIZE 100

typedef struct
{
char element[SIZE];
int top;
}stack;

void push(stack *p,char element)
{
if(!full(p))
{
p->top++;
p->element[p->top]=element;
}
else
{
printf("Stack is full");
exit(0);
getch();
}
}

int full(stack *p)
{
if(p->top<SIZE-1)
return(0);
else
return(1);
}

char pop(stack *p)
{
char el;
if(!empty(p))
{
el=p->element[p->top];
p->top--;
return(el);
}
getch();
exit(0);
}

int empty(stack *p)
{
if(p->top<0)
return(1);
else
return(0);
}

int value(char symb)
{
switch(symb)
{
case '(': return 1;
break;
case '*': return 5;
break;
case '/': return 5;
break;
case '+': return 3;
break;
case '-': return 3;
break;
case ')': return 0;
break;
}
}


int prcd(char symb1,char symb2)
{
int v1,v2;
v1=value(symb1);
v2=value(symb2);
if(v1==1&&v2==0)
return 5;
else if(v1>=v2)
return 0;
else
return 1;

}

void postfix(char in[],char po[],stack *s)
{
int n,j=0,i;
char symb1,symb2;
n=strlen(in);
for(i=0;i<n;i++)
{
if(isalpha(in[i]))
{
po[j]=in[i];
j++;
}
else
{
if(!empty(s)&&in[i]!='(')
{
symb1=pop(s);
symb2=in[i];
while(prcd(symb1,symb2)==0)
{
if(symb1!='('&&symb1!=')')
{
po[j]=symb1;
j++;
}
if(empty(s))
{
push(s,symb2);
break;
}
symb1=pop(s);
}
if(prcd(symb1,symb2)==1)
{
push(s,symb1);
push(s,symb2);
}
else if(prcd(symb1,symb2)==5)
{
continue;
}
}
else
{
push(s,in[i]);
}
}
}
while(!empty(s))
{
char m;
m=pop(s);
if(m!='('&&m!=')')
{
po[j]=m;
j++;
}
}

/*else
{
push(s,in[i]);
// j++;
} */



po[j]='\0';
}

void main()
{
stack s;
char in[SIZE],po[SIZE];
clrscr();
s.top=-1;
printf("Enter the infix notation\n");
scanf("%s",in);
postfix(in,po,&s);
printf("The postfix notation is %s",po);
getch();
}

mofid002006@gmail.com
سه شنبه 12 دی 1391, 00:31 صبح
nasimt (http://barnamenevis.org/member.php?u=250002) توی کد شما تابع push نوشته شده مشکل داره