一个小的C语言问题

作者&投稿:冉爸 (若有异议请与网页底部的电邮联系)
#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
#define STACKINCREMENT 2 /* 存储空间分配增量 */
typedef struct SqStack
{
SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */
SElemType *top; /* 栈顶指针 */
int stacksize; /* 当前已分配的存储空间,以元素为单位 */
}SqStack; /* 顺序栈 */
Status InitStack(SqStack *S)
{ /* 构造一个空栈S */
(*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW); /* 存储分配失败 */
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
return OK;
}

Status GetTop(SqStack S,SElemType *e)
{ /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
if(S.top>S.base)
{
*e=*(S.top-1);
return OK;
}
else
return ERROR;
}
Status Push(SqStack *S,SElemType e)
{ /* 插入元素e为新的栈顶元素 */
if((*S).top-(*S).base==(*S).stacksize) /* 栈满 */
return ERROR;
*((*S).top)++=e;
return OK;
}
Status Pop(SqStack *S,SElemType *e)
{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
if((*S).top==(*S).base)
return ERROR;
*e=*--(*S).top;
return OK;
}

#include<stdio.h>
#include<stdlib.h> /* atoi() */
#include<math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
/* 表达式求值(范围为int类型,输入负数要用(0-正数)表示) */
typedef int SElemType; /* 栈元素类型为整型,改进算法3.4 */
#include"stack.h"

SElemType Precede(SElemType t1,SElemType t2)
{ /* 根据教科书表3.1,判断两符号的优先关系 */
SElemType f;
switch(t2)
{
case '+':
case '-':if(t1=='('||t1=='=')
f='<';
else
f='>';
break;
case '*':
case '/':if(t1=='*'||t1=='/'||t1==')')
f='>';
else
f='<';
break;
case '(':if(t1==')')
{
printf("ERROR1\n");
exit(ERROR);
}
else
f='<';
break;
//将此函数补充完整
//......
return f;
}
Status In(SElemType c)
{ /* 判断c是否为运算符 */
switch(c)
{
case'+':
case'-':
//将此函数补充完整
//......
}
}
SElemType Operate(SElemType a,SElemType theta,SElemType b)
{
SElemType c;
switch(theta)
{
case'+':c=a+b;
break;
//将此函数补充完整
//......
}
return c;
}
SElemType EvaluateExpression()
{ /* 算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈 */
SqStack OPTR,OPND;
SElemType a,b,d,x,theta;
char c; /* 存放由键盘接收的字符串 */
char z[6]; /* 存放整数字符串 */
int i;
InitStack(&OPTR); /* 初始化运算符栈 */
Push(&OPTR,'='); /* =是表达式结束标志 */
InitStack(&OPND); /* 初始化运算数栈 */
c=getchar();
GetTop(OPTR,&x);
while(c!='='||x!='=')
{
if(In(c)) /* 是7种运算符之一 */
switch(Precede(x,c))
{
case'<':Push(&OPTR,c); /* 栈顶元素优先权低 */
c=getchar();
break;
//将此函数补充完整
//......
}
else if(c>='0'&&c<='9') /* c是操作数 */
{
//将此函数补充完整
//......
}
else /* c是非法字符 */
{
printf("ERROR3\n");
exit(ERROR);
}
GetTop(OPTR,&x);
}
GetTop(OPND,&x);
return x;
}
void main()
{
printf("请输入算术表达式,负数要用(0-正数)表示,并以=结束\n");
printf("%d\n",EvaluateExpression());
}

煮的吧,再长能有10000字........什么程序啊...........
绝对不是刷空间 我哪个破空间我才懒得搭理 真为了那个题目 大将见谅了------------------------------------------------------
此地无银三百两哦

实验内容:
通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法。对算法3.4中调用的几个函数要给出其实现过程:
(1) 函数In(c):判断c是否为运算符;
(2) 函数Precede(t1,t2):判断运算符t1和t2的优先级;
(3) 函数Operate(a,theta,b):对a和b进行二元运算theta。
程序运行时,输入合法的算术表达式(中间值及最终结果要在0~9之间,可以包括加减乘除和括号),便可输出相应的计算结果。

/* stack.h 栈的顺序存储表示 */
#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
#define STACKINCREMENT 2 /* 存储空间分配增量 */
typedef struct SqStack
{
SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */
SElemType *top; /* 栈顶指针 */
int stacksize; /* 当前已分配的存储空间,以元素为单位 */
}SqStack; /* 顺序栈 */
Status InitStack(SqStack *S)
{ /* 构造一个空栈S */
(*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW); /* 存储分配失败 */
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
return OK;
}

Status GetTop(SqStack S,SElemType *e)
{ /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
if(S.top>S.base)
{
*e=*(S.top-1);
return OK;
}
else
return ERROR;
}
Status Push(SqStack *S,SElemType e)
{ /* 插入元素e为新的栈顶元素 */
if((*S).top-(*S).base==(*S).stacksize) /* 栈满 */
return ERROR;
*((*S).top)++=e;
return OK;
}
Status Pop(SqStack *S,SElemType *e)
{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
if((*S).top==(*S).base)
return ERROR;
*e=*--(*S).top;
return OK;
}

#include<stdio.h>
#include<stdlib.h> /* atoi() */
#include<math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
/* 表达式求值(范围为int类型,输入负数要用(0-正数)表示) */
typedef int SElemType; /* 栈元素类型为整型,改进算法3.4 */
#include"stack.h"

SElemType Precede(SElemType t1,SElemType t2)
{ /* 根据教科书表3.1,判断两符号的优先关系 */
SElemType f;
switch(t2)
{
case '+':
case '-':if(t1=='('||t1=='=')
f='<';
else
f='>';
break;
case '*':
case '/':if(t1=='*'||t1=='/'||t1==')')
f='>';
else
f='<';
break;
case '(':if(t1==')')
{
printf("ERROR1\n");
exit(ERROR);
}
else
f='<';
break;
//将此函数补充完整
//......
return f;
}
Status In(SElemType c)
{ /* 判断c是否为运算符 */
switch(c)
{
case'+':
case'-':
//将此函数补充完整
//......
}
}
SElemType Operate(SElemType a,SElemType theta,SElemType b)
{
SElemType c;
switch(theta)
{
case'+':c=a+b;
break;
//将此函数补充完整
//......
}
return c;
}
SElemType EvaluateExpression()
{ /* 算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈 */
SqStack OPTR,OPND;
SElemType a,b,d,x,theta;
char c; /* 存放由键盘接收的字符串 */
char z[6]; /* 存放整数字符串 */
int i;
InitStack(&OPTR); /* 初始化运算符栈 */
Push(&OPTR,'='); /* =是表达式结束标志 */
InitStack(&OPND); /* 初始化运算数栈 */
c=getchar();
GetTop(OPTR,&x);
while(c!='='||x!='=')
{
if(In(c)) /* 是7种运算符之一 */
switch(Precede(x,c))
{
case'<':Push(&OPTR,c); /* 栈顶元素优先权低 */
c=getchar();
break;
//将此函数补充完整
//......
}
else if(c>='0'&&c<='9') /* c是操作数 */
{
//将此函数补充完整
//......
}
else /* c是非法字符 */
{
printf("ERROR3\n");
exit(ERROR);
}
GetTop(OPTR,&x);
}
GetTop(OPND,&x);
return x;
}
void main()
{
printf("请输入算术表达式,负数要用(0-正数)表示,并以=结束\n");
printf("%d\n",EvaluateExpression());
}

C语言的一个小疑问~

static int mode;static double distance;static double fuel;int main(void){ int mode; printf("Enter 0 for metric mode, 1 for US mode: "); scanf("%d", &mode); while(mode>=0) { set_mode(mode); get_info(); show_info(); printf("Enter 0 for metric mode, 1 for US mode "); printf("(-1 to quit): "); scanf("%d", &mode); } printf("Done.
"); return 0;}void set_mode(int a){ if(a != METRIC &&a !=US) printf("Invalid mode specified. Mode 1(US)used.
");}两处定义的mode 一处是开头定义的静态的,2处定义的是局部的。这两个mode有问题,有局部mode时静态mode不起作用,scanf中的mode是局部的,没有给静态的mode赋值。还有
set_mode()中也没有给 静态mode 赋值

%2d表示读取2位以十进制数赋值给x,y是1取位
%2s表示读取一个长度为两个字符的字符串,中间的*表示将读取到的字符串忽略
比如输入123456,则x为12,y为5
/是除,会舍掉余数,如9/2=4

一个c语言的小问题 while(scanf("%d",&n))超时,而改成while(scanf("%d...
答:这个要从scanf函数的返回值说起。比如scanf("%d", &n);有如下情况:1. 当输入为一个整数时,读取到n,scanf返回值是1(表示成功读取了一个数),ok,继续执行 2. 当输入为EOF(通常切的题目有多组数据,会使用EOF表示输入结束),这时,没有读取输入到n,scanf返回值是-1,所以您的代码==1就...

几个C语言选择结构小问题,请高手指教
答:这段程序代码的功能是进行一个判断,首先对整型变量a赋值为100,之后进行判断,经过判断a并不满足if语句中的条件,所以执行else语句,在printf语句中,是将a<=100这个表达式的值(1)输出,所以本程序的运行结果是:1 注意:有回车换行 2.当a=1,b=2,c=3时,以下if语句执行后,a,b,c中的值分别...

萌新想问一下关于char补码的devC++中一个C语言的小问题?
答:图一中:char c = 127;printf("%d", c+1);在C语言中的整数常量是以整形int进行存储的,这里127和1就是这种情况;另外在运算过程中如果两个运算数不是同种类型,编译器会把精度较低的数转换为精度较高的数,所以c+1是char+int会转化为int+int即127+1=128结果也是int。图二中:c=c+1;c+1...

C语言,一个小问题,t=a; a=b; b=t;这个是a和b的交换,请问交换是后是什么...
答:交换后a和b的值就对调了,假设交换前a=10,b=5,由于满足a>b的条件进行a和b的交换,首先将t=a; //t=10,a=10,b=5 a=b; //t=10,a=5,b=5 b=t; //t=10,a=5,b=10 所以交换后a=5,b=10,即交换了a和b的值 整个程序实现的功能就是将输入的a,b,c按照从小到大的顺序...

C语言编写程序,几个小问题,答得好追加悬赏分。
答:include <stdio.h>int main(void){ int a,b,c; printf("Input 3 integers...\n"); scanf("%d%d%d",&a,&b,&c); if(a>b) a^=b,b^=a,a^=b; if(a>c) a^=c,c^=a,a^=c; if(b>c) b^=c,c^=b,b^=c; printf("%d %d %d\n",a,...

问几个C语言里很多人没注意过的问题
答:说实话要是这几个问题只要理解了C语言的人,怎么可能不明白。很多人没注意,说明他们还没学懂。当然我也不是在自夸,我也是初学者,可是我还是为楼上几位悲哀。1.你要知道程序在内存中的结构,有栈区、堆区、文字常量区、全局变量区、函数区,使用 char* a = "xxx";这样的语句初始化指针a,"...

关于c语言的一个小问题,小弟刚学c语言,希望大家帮忙解决
答:第一main 你写的mian 第二你的变量中不存在sball变量 应该为shall,这个图是我的运行结果,出现乱码那就需要你的编辑器支持汉字。

C语言新手 ,一个很小但是郁闷了一下午的 问题 。 谁能告诉我他错哪了...
答:楼主你好 你的代码从语法上看 没有错误 但是存在输入的错误 注意你的scanf函数中读入数据的间隔符写的是点号,那么你在输入数据的时候应该输入: 22,55 这样你就能得到正确的结果 如果楼主想使用空格间隔输入的两个整数 那么scanf函数就应该改为:scanf("%d%d",&a,&b)或scanf("%d %d",&a,&b)希望...

关于学C语言的一个小问题
答:用单引号扩住的意思是表明里面的内容是一个字符。比如说:'a' 表示的是字符a,而 a 表示的是变量a。char类型变量只能赋予1个字符,两个字符是不行的。

3个C语言小题目~~~
答:1、include "stdafx.h"int main(int argc, char* argv[]){ int n;printf("要输入的字符串长度为:\n");scanf("%d",&n);printf("输入字符串:\n");char* ch = new char[n];scanf("%s",ch);for(int i=0;i<n/2;i++){ char temp = ch[i];ch[i] = ch[n-1-i];ch[n...