数学表达式计算(c语言实现)

数学表达式计算(c语言实现)
数学表达式计算(c语言实现)

一、设计思想

计算算术表达式可以用两种方法实现:

1.中缀转后缀算法

此算法分两步实现:先将算术表达式转换为后缀表达式,然后对后缀表达式进行计算。具体实现方法如下:

(1)中缀转后缀

需要建一个操作符栈op和一个字符数组exp,op栈存放操作符,字符数组用来存放转换以后的后缀表达式。首先,得到用户输入的中缀表达式,将其存入str数组中。

对str数组逐个扫描,如果是数字或小数点,则直接存入exp数组中,当扫描完数值后,在后面加一个#作为分隔符。

如果是操作符,并且栈为空直接入栈,如果栈不为空,与栈顶操作符比较优先等级,若比栈顶优先级高,入栈;如果比栈顶优先级低或相等,出栈将其操作符存到exp数组中,直到栈顶元素优先等级低于扫描的操作符,则此操作符入栈;如果是左括号,直接入栈,如果是右括号,出栈存入exp数组,直到遇到左括号,左括号丢掉。然后继续扫描下一个字符,直到遇到str中的结束符号\0,扫描结束。结束后看op栈是否为空,若不为空,继续出栈存入exp数组中,直到栈为空。到此在exp数组最后加结束字符\0。

我们就得到了后缀表达式。

(2)后缀表达式计算

此时需要一个数值栈od来存放数值。对exp数组进行逐个扫描,当遇到数字或小数点时,截取数值子串将其转换成double类型的小数,存入od栈中。当遇到操作符,从栈中取出两个数,进行计算后再放入栈中。继续扫描,知道扫描结束,此时值栈中的数值就是计算的结果,取出返回计算结果。

2.两个栈实现算法

此算法需要两个栈,一个值栈od,一个操作符栈op。将用户输入的数学表达式存入str数组中,对其数组进行逐个扫描。

当遇到数字或小数点,截取数值子串,将其转换成double类型的数值存入od栈中;

当遇到左括号,直接入op栈;遇到右括号,op栈出栈,再从值栈od中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到操作符栈栈顶为左括号,将左括号丢掉。

如果遇到操作符,若op栈为空,直接入栈;若栈不为空,与栈顶元素比较优先等级,若比栈顶操作符优先等级高,直接入op栈,如果低于或等于栈顶优先等级,op栈出栈,再从值栈中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到栈顶优先等级低于扫描的操作符等级,将此操作符入op栈。继续扫描直到遇到str中的结束字符\0,扫描结束。此时看操作符栈是否为空,若不为空,出栈,再从值栈中取出两个数值进行计算,将其结果存入值栈,一直进行此操作,直到操作符栈为空。此时把值栈中的数值取出,即为所得的最终计算结果。

二、算法流程图

第一种算法:中缀转后缀算法

其主函数流程图为:

得到用户输入的中

缀表达式

调用calculate 函数计算表达式

返回计算结果

调用trans 函数得到后缀表达

图1 主函数算法流程图

中缀转后缀算法流程图如下:

取得字符进行判断

直接放入exp 数组中并在其后加入#分隔

与栈顶比较优先等级

如果是操作符

入操作符栈

比栈顶优先级高

出栈存入exp 数组中

不高于栈顶优先级

判断是哪个括号

如果是括号

直接入操作符

如果是左括号

如果是右括号

取出栈顶元素

若栈顶元素不为(

放入exp 数组中

判断是操作符还是括号

如果是操作符或括号

图2 中缀转后缀算法流程图

计算后缀表达式流程图如下:

得到后缀表达式

判断是否为操作符

从值栈取出两个数值,计算结果并存入值栈中

如果为操作符

截取子串并将其转化成double 类型,存入值

栈中

如果是数字或小数点取出最终值栈中的数值,作为返

回值

图3 后缀表达式计算流程图

第二种算法:两个栈算法

其主函数流程图为:

得到用户输入的中

缀表达式

调用calculate 函数计算表达式

返回计算结果

图4 主函数算法流程图

直接计算数学表达式流程图如下:

符号栈是否为空

得到存放中缀表达式的数组str

依次取出数组中的每个字符

判断字符类型

截取子串并将其转化成double 类型,并将其存入值栈中

如果是数字或小数点

如果是操作符或是括号

判断是操作符还是括号

判断是哪个括号

如果是括号

直接入操作符

如果是左括号

取出栈顶元素

如果是右括号栈顶元素是否为(

取出值栈的两个数

值,计算结果后存入值栈中

pop 出左括号

不是与栈顶比较优先级

如果是操作符

入操作符栈

取出值栈的两个数值,计算结果后存入值栈中

不高于栈顶优先级取出值栈中的数

值作为返回

取出值栈的两个数值,计算结果后存入值栈中

为空栈非空

图5 直接计算表达式流程图

三、源代码

下面给出的是用中缀转后缀算法实现的程序的源代码:

#include #include #include #include

#define MAXSIZE 100 //定义宏,数组最大长度为100

//函数实现中缀转后缀,将存储数学表达式的数组str传参进来,exp存储后缀表达式void trans(char str[],char exp[])

{

struct

{

char data[MAXSIZE];//用来存放操作符

int top;//数组下标

}op;//用结构体创建操作符栈

char ch;

int i=0,j=0,tempi=0;

op.top=-1;//给操作符栈初始化,令下标为-1

while(ch!='\0')

{

ch=str[i]; //取str数组的第i个元素赋值给ch

if((ch>='0'&& ch<='9') || ch=='.')//对数值操作

{

tempi=i;//若ch为数字或小数点,将其下标值赋给临时下标tempi

//依次向后扫描str数组,若一直为数字,跳入while循环

while((ch>='0' && ch<= '9') || ch == '.')

{

tempi++;

exp[j]=ch;//将数字存入exp数组中

j++;

ch=str[tempi];//取str数组中下标为tempi的元素赋给ch

}

exp[j]='#';j++;//用#做分隔符,将数值分隔开

i=tempi;//跳出循环,将此时的tempi赋给i,继续向后扫描

}

//对操作符操作

else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%' || ch == '(' || ch == ')')

{

int level(char op);//声明level函数

if(ch=='(')//如果为(,直接进栈

{

op.top++;

op.data[op.top]=ch;//进栈操作

}

else if(ch==')')

{

//如果为),一直出栈直到遇到(

while(level(op.data[op.top])!=-1)//若栈顶元素不为(,进入while循环

{

exp[j]=op.data[op.top];//操作符出栈,存入exp数组中

op.top--;

j++;

if(op.top==-1)break;//如果栈为空,跳出循环

}

op.top--;//左括号pop出来

}

else if(op.top==-1)//如果栈为空,直接进栈

{

op.top++;

op.data[op.top]=ch;//进栈操作

}

//如果所扫描的操作符优先等级比栈顶元素高,直接进栈

else if(level(ch)>level(op.data[op.top]))

{

op.top++;

op.data[op.top]=ch;//进栈操作

}

else

{

//如果所扫描的操作符优先等级没有栈顶元素高,

//一直出栈直到比栈顶元素优先级高

while(level(ch)<=level(op.data[op.top]))

{

exp[j]=op.data[op.top];//出栈存入exp数组中

op.top--;

j++;

if(op.top==-1)break;//如果栈为空,跳出循环

}

op.top++;

op.data[op.top]=ch;//比栈顶元素优先级高,入栈

}

i++;//str下标加1,向后扫描

}

}

while(op.top!=-1)//扫描结束后如果操作符栈不为空,出栈直至为空

{

exp[j]=op.data[op.top];//出栈存入exp数组中

op.top--;

j++;

}

exp[j]='\0';//赋\0结束exp字符数组

}

int level(char op)//判断操作符优先等级

{

if(op == '+' || op == '-')//若为+、-,等级为1

return 1;

else if(op == '*' || op == '/' || op == '%')

return 2; //若为*、/、%,等级为2

else if(op == '(')

return -1 ; //若为(,等级为-1

else

return -3; //其他等级为-3;

}

double calvalue(double od1,double od2,char tempop)//计算

{

switch(tempop){

case '+':

return od1 + od2; //计算加法

case '-':

return od1 - od2;//计算减法

case '*':

return od1 * od2;//计算乘法

case '/':

return od1 / od2;//计算除法

case '%':

return fmod(od1,od2);//求余

}

return 0;

}

double calculate(char exp[])//计算后缀表达式

{

struct //用结构体创建值栈

{

double data[MAXSIZE]; //存储数值

int top;

}od;

double d; //声明d变量存储数值

double od1,od2; //存储值栈依次pop出来的操作数

char ch;

char tempch[20]; //声明临时数组存储子串

int j=0,t;

int length=strlen(exp);//计算exp数组的长度

od.top=-1; //初始化值栈,令下标为-1

while(j

{

ch=exp[j];//提取exp中第j个元素

if(ch!='+' && ch!='-' && ch!= '*' && ch!='/' && ch!='%')

{

//如果为数字或小数点

t=0;

while((ch>='0' && ch<='9') ||ch=='.')

{

tempch[t]=ch;t++;//依次存放到临时数组中

j++;ch=exp[j];

}

tempch[t]='\0';//结束tempch数组

d=atof(tempch);//将子串转化成double类型的数

od.top++;

od.data[od.top]=d;//入值栈

}

else //若为操作符,从值栈中pop出两个数计算

{

od2=od.data[od.top];od.top--;//先出栈的赋给od2

od1=od.data[od.top]; //后出栈的赋给od1

od.data[od.top]=calvalue(od1,od2,ch); //计算出结果后再入栈}

j++;

}

return od.data[od.top];//将结束后值栈中的数pop出来,即为计算结果

}

main()

{

char str[MAXSIZE],exps[MAXSIZE]; //定义两个数组

printf("请输入算术表达式:\n");

gets(str); //从控制台输入算数表达式

printf("表达式为:%s\n",str);

trans(str,exps); //调用trans函数,得到后缀表达式

printf("后缀表达式:%s\n",exps);

printf("结果为:%lf\n", calculate(exps)); //调用calculate函数,计算结果}

下面给出的是用两个栈算法实现的程序的源代码:

#include

#include

#include

#include

#define MAXSIZE 100 //定义宏,数组最大长度为100

double calculate(char str[])

{

struct //用结构体创建操作符栈

{

char data[MAXSIZE];//用来存放操作符

}op;

struct //用结构体创建值栈

{

double data[MAXSIZE];//用来存放操作数

int top;

}od;

char ch;

char tempch[20];//声明临时数组存储子串

int j=0,t;

double d;

double od1,od2;//存储值栈依次pop出来的操作数

char tempop;

int length=strlen(str);//计算str数组的长度

op.top=-1;//初始化操作符栈,令下标为-1

od.top=-1;//初始化值栈

while(j

{

ch=str[j];

if((ch>='0' && ch<='9') ||ch=='.')//若为数值或小数点

{

d=0;

t=0;

while((ch>='0' && ch<='9') ||ch=='.')//截取子串

{

tempch[t]=ch;t++;//赋值给临时数组

j++;ch=str[j];

}

tempch[t]='\0';

d=atof(tempch);//将子串转化成double类型的数

od.top++;

od.data[od.top]=d;//入值栈

}

//对操作符操作

else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%' || ch == '(' || ch == ')') {

if(ch=='(')//如果为(,直接进栈

{

op.top++;

op.data[op.top]=ch;//进栈操作

}

else if(ch==')')//如果为),一直出栈直到遇到(

{

int level(char op);//声明level函数

while(level(op.data[op.top])!=-1)//若栈顶元素不为(,进入while循环

{

//声明calvalue函数

double calvalue(double od1,double od2,char tempop);

od2=od.data[od.top];od.top--;

od1=od.data[od.top];

tempop=op.data[op.top];op.top--;

od.data[od.top]=calvalue(od1,od2,tempop);//计算出结果后入值栈

if(op.top==-1)break;//如果操作符栈为空,跳出循环

}

op.top--;//左括号pop出来

}

else if(op.top==-1)//如果栈为空,直接进栈

{

op.top++;

op.data[op.top]=ch;//进栈操作

}

//如果所扫描的操作符优先等级比栈顶元素高,直接进栈

else if(level(ch)>level(op.data[op.top]))

{

op.top++;

op.data[op.top]=ch;//进栈操作

}

else

{

//如果所扫描的操作符优先等级没有栈顶元素高,

//一直出栈直到比栈顶元素优先级高

while(level(ch)<=level(op.data[op.top]))

{

od2=od.data[od.top];od.top--;

od1=od.data[od.top];

tempop=op.data[op.top];op.top--;

od.data[od.top]=calvalue(od1,od2,tempop);//计算结果后入值栈

if(op.top==-1)break;//如果栈为空,跳出循环

}

op.top++;

op.data[op.top]=ch;//比栈顶元素优先级高,入操作符栈

}

j++;//str下标加1,向后扫描

}

}

while(op.top!=-1)//扫描结束后如果操作符栈不为空,出栈直至为空

{

od2=od.data[od.top];od.top--;

od1=od.data[od.top];

tempop=op.data[op.top];op.top--;

od.data[od.top]=calvalue(od1,od2,tempop);//计算结果后入值栈}

return od.data[od.top];//将结束后值栈中的数pop出来,即为计算结果}

int level(char op)//判断操作符优先等级

{

if(op == '+' || op == '-')//若为+、-,等级为1

return 1;

else if(op == '*' || op == '/' || op == '%')

return 2; //若为*、/、%,等级为2

else if(op == '(')

return -1 ; //若为(,等级为-1

else

return -3; //其他等级为-3;

}

double calvalue(double od1,double od2,char tempop)//计算

{

switch(tempop){

case '+':

return od1 + od2;//计算加法

case '-':

return od1 - od2;//计算减法

case '*':

return od1 * od2;//计算乘法

case '/':

return od1 / od2;//计算除法

case '%':

return fmod(od1,od2);//求余

}

return 0;

}

void main()

{

char str[MAXSIZE];//定义str数组存放数学表达式

printf("输入算术表达式:\n");

gets(str); //从控制台输入算数表达式

printf("结果是:%lf\n",calculate(str));//调用calculate函数,计算结果}

四、运行结果

图6 中缀转后缀算法运行结果

图7 两个栈算法运行结果

五、遇到的问题及解决

编程的前期工作很重要,需要明确的理清思路,而编写运行的过程中更是会出现很多问题,有因粗心造成的拼写错误,有语法错误,也有逻辑错误。

在整个编程过程我主要遇到了如下几个大的问题,其内容与解决方法如下所列:

将字符表示的数字转化为浮点数

Java中有现成的截取子串的方法可以用,而我的c语言基础比较薄弱,所学知识也不全面。刚开始的思路是先将出现数字的子串计数,得到一共有多少个数字,然后再从子串开始处扫描,依次乘以它的位权,在百位就乘以10的2次方,依次类推。经过很长时间的思考,终于写出了此解决方法,可是却忽略了小数点的存在。又开始用此方

法试图解决存在小数点的问题,想了好久也没有解决方法。无奈之下求助于网络,看有没有什么更好的解决办法,一经查询知道了stdlib.h库中有atof的函数可以将字符串类型的数字转换为浮点型。于是我用一个while循环将数值子串截取下来存到一个临时数组中,将其成功的转换成浮点数,小数点的情况也解决了。

●打印后缀表达式时出现“喊烫”情况

情况如下图:

图8 “喊烫”出错情况

编写完中缀转后缀的trans函数后,想打印后缀表达式检查是否正确时出现了问题,打印出来的全是“烫”。刚开始觉得很奇怪,存的都是数字或操作符,怎么会出现汉字呢?仔细检查程序,发现逻辑没有出错,但为什么打印不出正确结果很是不解。通过和同学讨论,上网查询才知道,如果字符串没有结束符号\0就会“喊烫”。再经过检查发现还真是没有给字符串加结束字符。于是在循环的结束给exp[j]='\0';解决了问题,得到了正确的结果。

●程序运行时会中止

编写完程序后,编译没有错误,但运行总是会中止。

刚开始的问题是只打印出中缀表达式,光标停在下一行不动了。也不是死循环,也没有出现语法错误。说明程序进行到某一阶段出现问题不走了。于是我把循环中可以打印出来帮助我分析程序的值都打印出来,包括循环有没有正常执行,有没有进栈,出栈。

就这样一点一点分析后,发现自己在循环嵌套中出现了一点逻辑问题,导致没有进行应有的判断,所以没有出正确结果。发现问题后及时改正,程序就正常运行了。

六、心得体会

因为C语言是大一时学的,当时就学了些基础的理论知识,上机的练习很少,敲的也是一些简单的分析素数,比大比小的程序。由于有一年多没有碰过C语言,遗忘了不少。通过这次的编程作业,把C语言的知识又重新温习了一遍。再通过和java语言的比较,大致理解了两种编程思想的不同。在这次的练习中也深刻的体会到了思维严谨,认真的态度十分重要。所以在以后的学习道路中,要养成良好的编程习惯,思考问题要全面、编写时要仔细认真,不出拼写错误。只有养成良好的编程习惯,在以后的工作中才可以更好的胜任职位,写出安全、可靠、稳定的软件,服务于大众。

还有一些深刻的体会就是算法很重要,所以学好数据结构,算法等课程,无疑是打好了地基,在以后各个编程的解决中都可以起到至关重要的作用。

最新数学表达式计算(c语言实现)演示教学

一、设计思想 计算算术表达式可以用两种方法实现: 1.中缀转后缀算法 此算法分两步实现:先将算术表达式转换为后缀表达式,然后对后缀表达式进行计算。具体实现方法如下: (1)中缀转后缀 需要建一个操作符栈op和一个字符数组exp,op栈存放操作符,字符数组用来存放转换以后的后缀表达式。首先,得到用户输入的中缀表达式,将其存入str数组中。 对str数组逐个扫描,如果是数字或小数点,则直接存入exp数组中,当扫描完数值后,在后面加一个#作为分隔符。 如果是操作符,并且栈为空直接入栈,如果栈不为空,与栈顶操作符比较优先等级,若比栈顶优先级高,入栈;如果比栈顶优先级低或相等,出栈将其操作符存到exp数组中,直到栈顶元素优先等级低于扫描的操作符,则此操作符入栈;如果是左括号,直接入栈,如果是右括号,出栈存入exp数组,直到遇到左括号,左括号丢掉。然后继续扫描下一个字符,直到遇到str中的结束符号\0,扫描结束。结束后看op栈是否为空,若不为空,继续出栈存入exp数组中,直到栈为空。到此在exp数组最后加结束字符\0。 我们就得到了后缀表达式。 (2)后缀表达式计算 此时需要一个数值栈od来存放数值。对exp数组进行逐个扫描,当遇到数字或小数点时,截取数值子串将其转换成double类型的小数,存入od栈中。当遇到操作符,从栈中取出两个数,进行计算后再放入栈中。继续扫描,知道扫描结束,此时值栈中的数值就是计算的结果,取出返回计算结果。 2.两个栈实现算法 此算法需要两个栈,一个值栈od,一个操作符栈op。将用户输入的数学表达式存入str数组中,对其数组进行逐个扫描。 当遇到数字或小数点,截取数值子串,将其转换成double类型的数值存入od栈中; 当遇到左括号,直接入op栈;遇到右括号,op栈出栈,再从值栈od中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到操作符栈栈顶为左括号,将左括号丢掉。 如果遇到操作符,若op栈为空,直接入栈;若栈不为空,与栈顶元素比较优先等级,若比栈顶操作符优先等级高,直接入op栈,如果低于或等于栈顶优先等级,op栈出栈,再从值栈中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到栈顶优先等级低于扫描的操作符等级,将此操作符入op栈。继续扫描直到遇到str中的结束字符\0,扫描结束。此时看操作符栈是否为空,若不为空,出栈,再从值栈中取出两个数值进行计算,将其结果存入值栈,一直进行此操作,直到操作符栈为空。此时把值栈中的数值取出,即为所得的最终计算结果。 二、算法流程图 第一种算法:中缀转后缀算法

二级C语言-运算符与表达式

二级C语言-运算符与表达式 (总分:60.00,做题时间:90分钟) 一、{{B}}选择题{{/B}}(总题数:38,分数:38.00) 1.设变量已正确定义并赋值,以下合法的C语言赋值语句是______。 ? A.x=y==5 ? B.x=n%2.5 ? C.x+n=i ? D.x=5=4+1 (分数:1.00) A. √ B. C. D. 解析:[解析] 赋值运算符左侧的操作数必须是一个变量,而不能是表达式或者常量,选项C和D错误。“%”运算符两侧都应当是整型数据,选项B错误。 2.在x值处于-2~2、4~8时值为“真”,否则为“假”的表达式是______。 ? A.(2>x>-2)||(4>x>8) ? B.!(((x<-2)||(x>2))&&((x<=4)||(x>8))) ? C.(x<2)&&(x>=-2)&&(x>4)&&(x<8) ? D.(x>-2)&&(x>4)||(x<8)&&(x<2) (分数:1.00) A. B. √ C. D. 解析:[解析] 本题是考查关系运算和逻辑运算的混合运算。要给出此题的正确答案,首先需要了解数学上的区间在C语言中的表示方法,如x在[a, b]区间,其含义是x既大于等于a又小于等于b,相应的C语言表达式是x>=a&&x<=b。本例中给出了两个区间,一个数只要属于其中一个区间即可,这是“逻辑或”的关系。在选项A中,区间的描述不正确。选项B把“!”去掉,剩下的表达式描述的是原题中给定的两个区间之外的部分,加上“!”否定正好是题中的两个区间的部分,是正确的。选项C是恒假的,因为它的含义是x同时处于两个不同的区间内。选项D所表达的也不是题中的区间。 3.sizeof(double)是______。 ? A.一种函数调用 ? B.一个整型表达式 ? C.一个双精度表达式 ? D.一个不合法的表达式 (分数:1.00)

(完整word版)C语言运算符与表达式的练习题答案

C语言运算符与表达式的练习题 单项选择题 (1)以下选项中,正确的 C 语言整型常量是(D)。 A. 32L B. 510000 C. -1.00 D. 567 (2)以下选项中,(D)是不正确的 C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" (3)字符串的结束标志是(C)。 A. 0 B. '0' C. '\0' D. "0" (4)算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为(B)。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运算、赋值运算 C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 (5)逻辑运算符中,运算优先级按从高到低依次为(D)。 A. && ! || B. || && ! C. && || ! D. ! && || (6)表达式!x||a==b 等效于(D)。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) (7)设整型变量 m,n,a,b,c,d 均为1,执行 (m=a>b)&&(n=c>d)后, m,n 的值是(A)。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 *(8)设有语句 int a=3;,则执行了语句 a+=a-=a*=a; 后,变量 a 的值是(B)。 A. 3 B. 0 C. 9 D. -12 (9)在以下一组运算符中,优先级最低的运算符是(D)。 A. * B. != C. + D. = (10)设整型变量 i 值为2,表达式(++i)+(++i)+(++i)的结果是(B,上机13)。 A. 6 B. 12 C. 15 D. 表达式出错 (11)若已定义 x 和 y为double 类型,则表达式的值是(D)。

C语言中条件运算符的语法为

条件运算符的语法为: (条件表达式)?(条件为真时的表达式):(条件为假时的表达式) 例如: x=ay?"greater than":x==y?"equal to":"less than" 它等价于: (x>y)?"greater than":((x==y)?"equal to":"less than") 当x>y时,值为"greater than",x==y时,值为"equal to",否则,值为"less than"。条件运算符的嵌套可读性不够好。 在一个条件运算符的表达式中,如果后面两个表达式的值类型相同,均为左值,则该条件运算符表达式的值为左值表达式。例如: int x=5; long a,b; (x?a:b)=1;//ok:因为a和b都是左值 (x?x:a)=2;//error:x和a不同类型。编译器将其解释为(1ong)x和a (x==271:a)=3;//error:1非左值 "(x?a:b)=1"表示当x为0时,b=1,否则a=1。这里的括号是必须的,否则将被看作x?a:(b=1)。"(x?x:a)=2”中,尽管x是左值,a也是左值,但x与a不同类型,条件运算符要对其进行操作数的隐式转换,使之成为相同的类型。任何被转换的变量都不是左值。 ->在C中,条件运算符是不能作左值的,所以"(x?a:b)=1;"将通不过编译。 getchar 函数名: getchar 功能: 从stdio流中读字符 用法: int getchar(void); 注解:

C语言数据类型和运算符及表达式复习题

数据类型、运算符和表达式复习题.选择题 1. 以下不合法的用户标识符是: ( ) a) f2_G3 b) If c) 4d d) _8 2. 以下选项中合法的用户标识符是: ( ) a) long b) _2Test c) 3Dmax d) A.dat 3. 以下可用作用户标识符的是: ( ) a) 12_a b) signed c) t-o d) _if 4. 以下不是关键字的标识符是: ( ) a) continue b) char c) If d) default 5. C 语言提供的合法的关键字是: ( ) a) swicth b) cher c) Case d) void 6. 以下选项中不合法的int 整型常数是( ) a) 32768 b) -56 c) 03 d) 0xAF 7. 以下合法的长整型常量是( ) a) 2L b) 49627 c) d) 213& 8. 以下正确的实型常量是( ) a) 1.2E b) . c) 1.2e0.6 d) 8 9. 以下选项中合法的实型常数是( ) a) 5E2.0 b) E-3 c) .2E0 d) 1.3E 10. 以下合法的八进制数是( ) a) 0135 b) 068 c) 013.54 d) o7

11. 以下合法的十六进制数是( ) a) 0x b) 0x4de c) 0x1h d) ox77 12. 以下选项中非法的数值常量是( ) a) 019 b) 0L c) 0xff d) 1e1 13. 若变量已正确定 以下合法的赋值表达式是( ) 义, a) a=1/b=2 b) ++(a+b) c) a=a/(b=5) d) y=int(a)+b 14. 若变量已正确定 以下非法的表达式是( ) 义, a) a/=b+c b) a%(4.0) c) a=1/2*(x=y=20,x*3) d) a=b=c 15. 设x为int 类型,其值为11,则表达式( x++*1/3 )的值是: a) 3 b) 4 c) 11 d) 12 16.设a,b 均为double 型,且 a=5.5;b=2.5; 则表达式 (int)a+b/b 的值是( ) a) 6. b) 6 c) 5. d) 6. 17.若a为int型,且其值为3,则执行完表达式: a+=a-=a*a 后,a 的值是( ) a) -3 b) 9 c) -12 d) 6 18.设k 和x 均为int 型变量,且k=7 ;x=12;则能使值为 3 的表达式是( )

C语言中的22个数学函数

C语言的22个数学函数 在使用C语言数学函数时候,应该在该源文件中使用以下命令行: #include 或#include "math.h",这里的<>跟""分别表示:前者表示系统到存放C库函数头文件所在的目录寻找需要包含的文件,这是标准方式;后者表示系统先在拥护当前目录中寻找要包含的文件,若找不到,再按前者方式查找。为节省时间,在使用自己编写的文件时使用的是“”,自己编写的文件一般是在当前目录下。 22个数学函数中只有abs的数据类型是:”整型“,”int“。 log10、logE中的10与E是在log的左下角位置。其余求弧度函数需要看清楚是不是指数。排列方式如下:函数名:函数功能参数介绍,返回值,说明。函数原型。 1.abs: 求整型x的绝对值,返回计算结果。 int abs(int x); 2.acos:计算COS-1(x)的值,返回计算结果,x应在-1到1范围内。 doubleacos(double x); 3.asin: 计算SIN-1(x)的值,返回计算结果,x应在-1到1范围内。 doubleasin(double x); 4.atan: 计算TAN-1(x)的值,返回计算结果。double atan(double x); 5.atan2: 计算TAN-1/(x/y)的值,返回计算结果。 double atan2(double x,double y); 6.cos: 计算COS(x)的值,返回计算结果,x的单位为弧度。 double cos(double x); 7.cosh: 计算x的双曲余弦COSH(x)的值,返回计算结果。 double cosh(double x); 8.exp: 求e x的值,返回计算结果。 double exp(double x); 9.fabs: 求x的绝对值,返回计算结果。 duoblefabs(fouble x); 10.floor: 求出不大于x的最大整数,返回该整数的双精度实数。 double floor(double x); 11.fmod: 求整除x/y的余数,返回该余数的双精度。 doublefmod(double x,double y);

C语言程序设计实验报告实验数据类型运算符和表达式

凯里学院C 语言程序设计实验报告 ×××××专业××年级××班,学号××××××姓名××成绩 合作者实验日期年月日 指导教师评阅日期年月日 实验二数据类型、运算符和表达式 一、实验目的: (1)掌握C 语言数据类型,熟悉如何定义一个整型、字符型、实型变量、以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。 (2)学会使用C 的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(――)运算符的使用。 (3)掌握C 语言的输入和输出函数的使用 (4)进一步熟悉C 程序的编辑、编译、连接和运行的过程,学会使用stepbystep 功能。 (5)认真阅读教材数据类型,算术运算符和表达式,赋值运算符和表达式部分内容。 二、实验内容: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; 装 订 线 装 订 线

printf("%c%c\n",c1,c2); } (2)按习题3.7的要求编程序并上机运行 该题的要求是: 要将“China”译成密码,密码规律是:用原来字母后面的第4个字母代替原来的字母。 例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre"。 请编一程序,用赋初值的方法使。cl,c2,c3,c4,c5五个变量的值分别为‘C’、‘h’、‘i’、‘n’、‘a’,经过运算,使cl,c2,c3,c4,c5分别变为‘G’、‘l’、‘m’、‘r’、‘e’,并输出。 三、实验步骤: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; printf("%c%c\n",c1,c2); } ①运行此程序。 程序结果为:

c语言上机试题1(数学计算)

1整型、实型 1.1实型四舍五入 请编一个函数fun,函数的功能是使实型数保留2位小数,并对第三位进行四舍五入(规定实型数为正数)。例如:实型数为1234.567, 则函数返回1234.57;实型数为1234.564, 则函数返回1234.56。注意: 部分源程序存在文件PROG1.C文件中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 #include int NONO(void); float fun ( float h ) { } int main(void) { float a; printf ("Enter a: "); scanf ( "%f", &a ); printf ( "The original data is : " ); printf ( "%f \n\n", a ); printf ( "The result : %f\n", fun ( a ) ); NONO( ); return 1; } int NONO(void) {/* 请在此函数内打开文件,输入测试数据,调用fun 函数,输出数据,关闭文件。*/ int i ; float a ; FILE *rf, *wf ; rf = fopen("./05/in.dat","r") ; wf = fopen("./05/out.dat","w") ; for(i = 0 ; i < 20 ; i++) { fscanf(rf, "%f", &a) ; fprintf(wf, "%f\n", fun(a)) ; } fclose(rf) ; fclose(wf) ; return 1; }

C语言运算符与表达式的练习题

C语言运算符与表达式的练习题 (作业写到纸质作业本上,在规定时间内交给助教批阅,不要 再网上提交) 一、单项选择题 (1) 以下选项中,正确的C 语言整型常量是。 A. 32L B. 510000 C. -1.00 D. 567 (2) 以下选项中,是不正确的C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" (3) 在C 语言中,字符型数据在计算机内存中,以字符 的形式存储。 A. 原码 B. 反码 C. ASCII 码 D. BCD码 (4) 字符串的结束标志是。 A. 0 B. '0' C. '\0' D. "0" (5) 算术运算符、赋值运算符和关系运算符的运算优先级按 从高到低依次为。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运 算、赋值运算

C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 (6) 逻辑运算符中,运算优先级按从高到低依次为。 A. &&,!,|| B. ||,&&,! C. &&,||,! D. !,&&,|| (7) 表达式!x||a==b 等效于。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) (8) 设整型变量m,n,a,b,c,d 均为1,执行(m=a>b)&&(n=c>d)后, m,n 的值是。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 (9) int b=0,x=1;执行语句if(x++) b=x+1; 后,x,b 的值依次为。 A. 2,3 B. 2,0 C. 3,0 D. 3,2 (10) 设有语句int a=3;,则执行了语句a+=a-=a*=a; 后,变量 a 的值是。 A. 3 B. 0 C. 9 D. -12 (11) 在以下一组运算符中,优先级最低的运算符是。 A. * B. != C. + D. =

逻辑运算符和表达式(c语言)

南京高等职业技术学校 课堂教学设计 授课时间:2014年11月6日第11周星期四教学目标教学准备 授课教师课时课程通过本节课的学习,学生能够: 1.清晰地说出各种逻辑运算符; 2.正确运算出逻辑表达式的值,并 通过程序验证结果; 重点教案□√ 马丽娟 1 C语言多媒体课件□√班级授课地点课题教学讲义□ 512212 机房4.2逻辑运算符与逻辑表达 式 1.逻辑表达式的求值运算; 2.逻辑表达式的求值优化。 学生工作页□ 课堂特殊要求(指教师、学生的课前准备活动等) 教师:安装Win-TC程序难点 教具□√ 逻辑表达式的求值优化授课形式 理论讲授课 教学环节时间分配教师活动学生活动教学方法媒体手段导入新课 5 提出问题,并举例说明听讲、思考、回答讲授法PPT 新课讲授20 讲授、分析听讲、讨论并记录讲授法PPT 巩固练习15 布置任务、巡视、答疑思考、编程并回答问题练习法Win-TC 课堂小结 3 归纳、总结听讲、回答问题讲授法PPT 布置作业 2 布置作业记录讲授法PPT 板书设计 §4.2 逻辑运算符与逻辑表达式 ?逻辑运算符:&&、||、! ?逻辑表达式的值:非0即1 ?逻辑运算的求值优化工作任务/教学情境设置 无课后作业 书面作业:P52 随堂练习 课后反思

教案纸 教学内容 4.2 逻辑运算符与逻辑表达式 一、复习导入(5min) 1. 复习:请学生说出关系运算符有哪些? 请学生回答关系运算表达式的值? 教师进行补充。 2.导入新课: 1、学生参加技能大赛培训的条件? ?扎实的专业知识与较高的实践能力 教师强调与的关系 2、参加技能大赛集训而停课的条件? ?移动互联或智能家居 教师强调或的关系 3、学生回答引入禁烟区的条件? ?没有吸烟非 教师强调非的关系 二、新课讲授(20min) 逻辑运算符 1.教师根据逻辑关系给出三种逻辑运算符的表示形式: &&、||、! 2.教师利用具体的表达式关系分析各种逻辑运算符的作用: 逻辑与相当于英语中的and; 逻辑或相当于英语中的or; 逻辑非相当于英语中的no; 3.教师根据具体的逻辑关系引出逻辑表达式的概念及表示形式: 表达式1&&表达式2 a&&b 表达式1||表达式2 a || b !表达式!a

C语言数据类型与表达式习题及答案

第一章数据类型,运算符与表达式 一.选择题 1.不合法的常量是A。 A)‘/2’B) “”C)‘’D)“483” 2. B 是C语言提供的合法的数据类型关键字。 A)Float B)signed C)integer D)Char 3.在以下各组标识符中,合法的标识符是(1)A,(2) C ,(3) D 。 (1)A)B01 B)table_1 C)0_t D)k% Int t*.1 W10 point (2)A)Fast_ B)void C)pbl D) Fast+Big abs fabs beep (3)A)xy_ B)longdouble C)*p D)CHAR 变量1 signed history Flaut 4. 不属于合法的C语言长整型常量的是 C 。 A)5876273 B)0L C)2E10 D)(long)5876273 7.下面选项中,均是合法浮点数的是 B 。 A)+1e+1 B)-0.60 C)123e D)-e3 5e-9.4 12e-4 1.2e-.4 .8e-4 03e2 -8e5 +2e-1 5.e-0 8.在C语言中,要求参加运算的数必须是整数的运算符是 C 。 A)/ B)* C)% D) = 9.在C语言中,字符型数据在内存中以 D 形式存放。 A)原码B)BCD码C)反码D)ASCII码10.下列语句中,符合语法的赋值语句是 C 。 A)a=7+b+c=a+7;B)a=7+b++=a+7; C)a=7+b,b++,a+7;D)a=7+b = c=a+7; 11. B 是非法的C语言转义字符。 A)‘\b’B)‘\0xf’C)‘\037’D)‘\’’12.对于语句:f=(3.0,4.0,5.0),(2.0,1.0,0.0);的判断中, B 是正确的。 A)语法错误B)f为5.0 C)f为0.0 D)f为2.0 13.与代数式x y u v ? ? 不等价的C语言表达式是A。 A)x*y/u*v B)x*y/u/v C)x*y/(u*v) D)x/(u*v)*y 14.在C语言中,数字029是一个 D 。 A)八进制数B)十六进制数C)十进制数D)非法数 16.对于char cx=?\039?;语句,正确的是A。 A)不合法B)cx的值是?\03? C)cx的值为四个字符D)cx的值为三个字符 17.若int k=7,x=12;则能使值为3的表达式是 D 。 A)x%=(k%=5) B)x%=(k-k%5) C)x%=k-k%5 D)(x%=k)-(k%=5) 18.为了计算s=10!(即10的阶乘),则s变量应定义为 C 。 A)int B)unsigned C)long D)以上三种类型均可

c语言中求绝对值的数学函数

1、在C语言中,求绝对值的数学函数是( A )。 A、fabs() B、exp() C、pow() D、sqrt() 2、C语言可以使用printf函数实现输出,该函数在头文件( A )中定义。 A、stdio.h B、lib.h C、math.h D、printf.h 3、以下关于变量定义错误的是(A )。 A、char for; B、float USS; C、double int_; D、int _int; 4、在C语言中,求平方根的数学函数是( B )。 A、exp() B、sqrt() C、pow() D、fabs() 5、在C语言中,用printf函数输出float型数据时,可以使用格式控制符( B )。 A、%d B、%f C、%c D、%lf 6、以下说法正确的是( B )。 A、do-while语句构成的循环必须用break语句才能退出 B、do-while语句构成的循环,当循环条件为假时结束循环 C、do-while语句构成的循环,当循环条件为真时结束循环 D、不能使用do-while语句构成的循环 7、执行语句for(i=1;i<=10;i++) continue;后,i值为( C )。 A、9 B、无穷 C、11 D、10 8、C语言程序的基本控制结构是( B )。 A、循环结构

B、顺序、分支、循环 C、分支结构 D、顺序结构 9、float x ; 该语句将变量x定义为(B )类型。 A、双精度实型 B、单精度实型 C、字符型 D、整型 10、C 语言可以使用getchar()函数实现输入,该函数在系统头文件( D )中定义。 A、string.h B、用户自定义函数 C、math.h D、stdio.h 11、设x、y、z都是整型变量,x、y的初值都是5,执行z=(++x)+(y--)+1后,x、y、z三变量的值按顺序是( D )。 A、6,5,11 B、5,5,11 C、6,4,11 D、6,4,12 12、C语言中,三条边a、b、c能构成三角形的逻辑表达式是( D )。 A、a+b>c B、a>b>c C、a-bb D、a+b>c &&a+c>b &&b+c>a 13、下面有关for循环的正确描述是( D )。 A、for循环的循环体不能为空语句 B、for循环是先执行循环体语句,后判定表达式 C、在for循环中,不能用break语句跳出循环体 D、for循环体语句中,可以包含多条语句,但要用花括号括起来 14、使用系统提供的输出函数printf()时,实现换行功能的字符是(D )。 A、'/n' B、'\b' C、'\r' D、'\n' 15、从键盘输入一个整数给变量get,下列正确的语句是( B )。 A、printf("%d",&get); B、scanf("%d",&get); C、scanf("%d",get) ; D、printf("%d",get); 16、变量a、b分别声明为int型和double型,a的初值为5,如果b获得a的一半值,可使用哪条语句( C )。 A、b=a/2; B、b=sqrt(a); C、b=a/2.0;

C语言题库第2章 数据类型运算符和表达式√

第二章数据类型运算符和表达式 一、单项选择 1.若有定义语句:int k1=10,k2=20;,执行表达式(k1=k1>k2)&&(k2=k2>k1)后,k1和k2的值分别为( B ) 2.下面四个选项中,均是不合法的用户标识符的选项是( B )。 3.判断字符型变量c1是否为数字字符的正确表达式为( A ) 4.在C语言中,要求运算数必须是整型的运算符是( A )

5.下面四个选项中,均是合法的用户标识符的选项是(A)。 6.假设所有变量均为整型,则表达式(a=2,b=5,b++,a+b)的值是(B)。 7.若x,i,j和k都是int型变量,则计算表达式x=(i=4,j=16,k=32)后,x的值为(B)。

8.表达式18/4*sqrt(4.0)/8值的数据类型为(B)。 9.若a是数值类型,则逻辑表达式(a==1)||(a!=1)的值是( D ) 10.判断字符型变量c1是否为小写字母的正确表达式为(B)。

11.在C语言中,char型数据在内存中的存储形式是(C)。 12.以下选项中关于C语言常量的叙述错误的是:( D ) 13.下面正确的字符常量是(B)

14.C语言中的标识符只能由字母、数字和下划线三种字符组成,且第一个字符( D) 15.以下选项中,能表示逻辑值"假"的是( B ) 16.设变量a是整型,f是实型,i是双精度型,则表达式10+'a'+i*f值的数据类型为(C)

17.以下选项中非法的字符常量是( B ) 18.以下关于C语言数据类型使用的叙述中错误的是(B ) 19.设:int a=1,b=2,c=3,d=4,m=2,n=2;执行(m=a>b) && (n=c>d)后n的值为(C)。

C语言运算符大全资料

C语言运算符大全 C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符:算术、关系与逻辑、位操作。另外,C还有一些特殊的运算符,用于完成一些特殊的任务。 2.6.1算术运算符 表2-5列出了C语言中允许的算术运算符。在C语言中,运算符“+”、“-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。当“/”被用于整数或字符时,结果取整。例如,在整数除法中,10/3=3。 一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。模运算符“%”在C语言中也同它在其它语言中的用法相同。切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。 最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。 2.6.2自增和自减 C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符,++和--。运算符“++”是操作数加1,而“--”是操作数减1,换句话说:x=x+1;同++x;x=x-1;同--x; 自增和自减运算符可用在操作数之前,也可放在其后,例如:x=x+1;可写成++x;或x++;但在表达式中这两种用法是有区别的。自增或自减运算符在操作数之前,C语言在引用操作数之前就先执行加1或减1操作;运算符在操作数之后,C语言就先引用操作数的值,而后再进行加1或减1操作。请看下例: x=10; ;y=++x; 此时,y=11。如果程序改为: x=10;y=x++; 则y=10。在这两种情况下,x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码 要快得多,所以尽可能采用加1或减1运算符是一种好的选择。 。下面是算术运算符的优先级: :最高++、- -- -(一元减) *、/、%最低+、-编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计算顺序。C语言 处理括号的方法与几乎所有的计算机语言相同:强迫某个运算或某组运算的优先级升高。 2.6.3关系和逻辑运算符 关系运算符中的“关系”二字指的是一个值与另一个值之间的关系,逻辑运算符中的“逻辑”二字指的是连接关系的方式。因为关系和逻辑运算符常在一起使用,所以将它们放在一起讨论。关系和逻辑运算符概念中的关键是True(真)和Flase(假)。C语言中,非0为True,0为Flase。使用关系或逻辑运算符的表达式对Flase和Ture分别返回值0或1(见表2-6)。

C语言程序设计实验报告实验数据类型运算符和表达式

凯里学院C 语言程序设计实验报告 ×××××专业××年级××班,学号××××××姓名××成绩 合作者实验日期年月日 指导教师评阅日期年月日 实验二数据类型、运算符和表达式 一、实验目的: (1)掌握C 语言数据类型,熟悉如何定义一个整型、字符型、实型变量、以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。 (2)学会使用C 的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(――)运算符的使用。 (3)掌握C 语言的输入和输出函数的使用 (4)进一步熟悉C 程序的编辑、编译、连接和运行的过程,学会使用stepbystep 功能。 (5)认真阅读教材数据类型,算术运算符和表达式,赋值运算符和表达式部分内容。 二、实验内容: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; printf("%c%c\n",c1,c2); } (2)按习题3.7的要求编程序并上机运行 该题的要求是: 要将“China ”译成密码,密码规律是:用原来字母后面的第4个字母代替原来的字母。 例如,字母“A ”后面第4个字母是“E ”,用“E ”代替“A ”。因此,“China ”应译为“Glmre"。 请编一程序,用赋初值的方法使。cl ,c2,c3,c4,c5五个变量的值分别为‘C ’、‘h ’、‘i ’、‘n ’、‘a ’,经过运算,使cl ,c2,c3,c4,c5分别变为‘G ’、‘l ’、‘m ’、‘r ’、‘e ’,并输出。 三、实验步骤: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; 装 订 线 装 订 线

C语言程序设计实验报告实验数据类型运算符和表达式

C语言程序设计实验报告实验数据类型运算符和表 达式 This model paper was revised by the Standardization Office on December 10, 2020

凯里学院C 语言程序设计实验报告 ×××××专业××年级××班,学号××××××姓名××成绩 合作者实验日期年月日 指导教师评阅日期年月日 实验二数据类型、运算符和表达式 一、实验目的: (1)掌握C 语言数据类型,熟悉如何定义一个整型、字符型、实型变量、以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。 (2)学会使用C 的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(――)运算符的使用。 (3)掌握C 语言的输入和输出函数的使用 (4)进一步熟悉C 程序的编辑、编译、连接和运行的过程,学会使用stepbystep 功能。 (5)认真阅读教材数据类型,算术运算符和表达式,赋值运算符和表达式部分内容。 二、实验内容: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; printf("%c%c\n",c1,c2); } (2)按习题3.7的要求编程序并上机运行 该题的要求是: 要将“China ”译成密码,密码规律是:用原来字母后面的第4个字母代替原来的字母。 例如,字母“A ”后面第4个字母是“E ”,用“E ”代替“A ”。因此,“China ”应译为“Glmre"。 请编一程序,用赋初值的方法使。cl ,c2,c3,c4,c5五个变量的值分别为‘C ’、‘h ’、‘i ’、‘n ’、‘a ’,经过运算,使cl ,c2,c3,c4,c5分别变为‘G ’、‘l ’、‘m ’、‘r ’、‘e ’,并输出。 三、实验步骤: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; 装 订 线 装 订 线

C语言程序设计实验报告实验数据类型运算符和表达式

C语言程序设计实验报告实验数据类型运算符 和表达式 标准化工作室编码[XX968T-XX89628-XJ668-XT689N]

凯里学院C 语言程序设计实验报告 ×××××专业××年级××班,学号××××××姓名××成绩 合作者实验日期年月日 指导教师评阅日期年月日 实验二数据类型、运算符和表达式 一、实验目的: (1)掌握C 语言数据类型,熟悉如何定义一个整型、字符型、实型变量、以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。 (2)学会使用C 的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(――)运算符的使用。 (3)掌握C 语言的输入和输出函数的使用 (4)进一步熟悉C 程序的编辑、编译、连接和运行的过程,学会使用stepbystep 功能。 (5)认真阅读教材数据类型,算术运算符和表达式,赋值运算符和表达式部分内容。 二、实验内容: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; printf("%c%c\n",c1,c2); } (2)按习题3.7的要求编程序并上机运行 该题的要求是: 要将“China ”译成密码,密码规律是:用原来字母后面的第4个字母代替原来的字母。 例如,字母“A ”后面第4个字母是“E ”,用“E ”代替“A ”。因此,“China ”应译为“Glmre"。 请编一程序,用赋初值的方法使。cl ,c2,c3,c4,c5五个变量的值分别为‘C ’、‘h ’、‘i ’、‘n ’、‘a ’,经过运算,使cl ,c2,c3,c4,c5分别变为‘G ’、‘l ’、‘m ’、‘r ’、‘e ’,并输出。 三、实验步骤: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; 装 订 线 装 订 线

C语言全部的运算符

整理自网络 C语言运算符 C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符:算术、关系与逻辑、位操作。另外,C还有一些特殊的运算符,用于完成一些特殊的任务。 2.6.1算术运算符 表2-5列出了C语言中允许的算术运算符。在C语言中,运算符“+”、“-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。当“/”被用于整数或字符时,结果取整。例如,在整数除法中,10/3=3。 一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。模运算符“%”在C语言中也同它在其它语言中的用法相同。切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。

最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。 2.6.2自增和自减 C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符,++和--。运算符“++”是操作数加1,而“--”是操作数减1,换句话说:x=x+1;同++x;x=x-1;同--x; 自增和自减运算符可用在操作数之前,也可放在其后,例如:x=x+1;可写成++x;或x++;但在表达式中这两种用法是有区别的。自增或自减运算符在操作数之前,C语言在引用操作数之前就先执行加1或减1操作;运算符在操作数之后,C语言就先引用操作数的值,而后再进行加1或减1操作。请看下例: x=10; ;y=++x; 此时,y=11。如果程序改为: x=10;y=x++; 则y=10。在这两种情况下,x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码 要快得多,所以尽可能采用加1或减1运算符是一种好的选择。 。下面是算术运算符的优先级: :最高++、- -- -(一元减) *、/、%最低+、-编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计

C语言程序:求常用圆形体的体积

求常用圆形体的体积 程序描述: 设计一个常用圆形体体积的计算器,采用命令方式输入1、2、3.分别选择计算球体、圆柱体、圆锥体的体积,并输入函数所需的相应参数。 样例输入: 1 2 样例输出: 1-计算球体体积 2-计算圆柱体积 3-计算圆锥体积 其他-退出程序运行 请输入计算命令:1 请输入求的半径:2 球体积为:33.51 出题人: 我们一起的痕迹 程序代码 #include #include #include #define PI 3.141592654

void cal(int sel); int main(void) { int sel; while(1){ printf("1-计算球体体积\n"); printf("2-计算圆柱体积\n"); printf("3-计算圆锥体积\n"); printf("其他-退出程序运行\n"); printf("请输入计算命令:"); scanf("%d",&sel); if(sel<1||sel>3) break; else cal(sel); } return 0; } void cal(int sel) { double vol_ball(void); double vol_cylind(void); double vol_cone(void); switch(sel){ case 1: printf("球体积为:%.2f\n",vol_ball()); break; case 2: printf("圆柱体积为:%.2f\n",vol_cylind()); break; case 3: printf("圆锥体积为:%.2f\n",vol_cone()); break; } } double vol_ball() { double r; printf("请输入球的半径:"); scanf("%lf",&r); return (4.0/3.0*PI*r*r*r); } double vol_cylind() {

c语言运算符优先级

c语言运算符优先级 Turbo C的运算符非常丰富, 主要分为三大类: 算术运算符, 关系运算符与 逻辑运算符, 按位运算符。除此之外, 还有一些用于完成特殊任务的运算符。下 面分别进行介绍。 5.1 算术运算符 Turbo C的算术运算符如下: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 操作符作用 ──────────────────────────── + 加, 一目取正 - 减, 一目取负 * 乘 / 除 % 取模 -- 减1 ++ 加1 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 一、一目和二目操作 一目操作是指对一个操作数进行操作。例如: -a是对a进行一目负操作。 二目操作(或多目操作)是指两个操作数(或多个操作数)进行操作。 在Turbo C中加、减、乘、除、取模的运算与其它高级语言相同。需要注意 的是除法和取模运算。 例如: 15/2 是15除以2商的整数部分7 15%2 是15除以2的余数部分1 对于取模运算符"%", 不能用于浮点数。 另外, 由于Turbo C中字符型数会自动地转换成整型数, 因此字符型数也可 以参加二目运算。 例如: main() { char m, n; /*定义字符型变量*/ m='c'; /*给m赋小写字母'c'*/ n=m+'A'-'a'; /*将c中的小写字母变成大写字母'B'后赋给n*/ ... } 上例中m='c'即m=98, 由于字母A和a的ASCII码值分别为65和97。这样可以将

小写字母变成大写字母, 反之, 如果要将大写字母变成小写字母, 则用c+ 'a' -'A'进行计算。 二、增量运算 在Turbo C中有两个很有用的运算符, 在其它高级语言中通常没有。这两个 运算符就是增1和减1运算符"++"和"--", 运算符"++"是操作数加1, 而"--" 则是 操作数减1。 例如: x=x+1 可写成x++, 或++x x=x-1 可写成x--, 或--x x++(x--)与++x(--x)在上例中没有什么区别, 但x=m++和x=++m却有很大差别。 x=m++ 表示将m的值赋给x后, m加1。 x=++m 表示m先加1后, 再将新值赋给x。 三、赋值语句中的数据类型转换 类型转换是指不同类型的变量混用时的类型改变。 在赋值语句中, 类型转换规则是: 等号右边的值转换为等号左边变量所属的类型。 例如: main() { int i, j; /*定义整型变量*/ float f, g=2.58; /*定义浮点型变量*/ f=i*j; /*i与j的乘积是整型数, 被转换成为浮点数赋给f*/ i=g; /*g中的浮点型数转换成为整型数赋给i*/ ... } 由于Turbo C按上述数据类型转换规则, 因此在作除法运算时应特别注意。 例如: main() { float f; int i=15; f=i/2; } 上面程序经运行后, f=7并不等于准确值7.5。正确的程序应该是: main() { float f; int i=15;

相关文档
最新文档